const e = require("hypercore-id-encoding"),
t = require("b4a")
function n({ start: e, length: t, content: n, preview: r }) {
return (r?.file && (r.file = d(r.file)), { range: { start: e, length: t }, url: n, preview: r })
}
function r(t) {
if (!t) return null
const { id: n, key: r, blob: i } = t
return { id: n, key: n ? e.decode(n) : r, blob: i }
}
function i(t) {
if (!t) return null
const { id: n, key: r, path: i, version: l, size: d } = t
return { id: n, key: n ? e.decode(n) : r, path: i, version: l, size: d }
}
function l(e) {
return e
? {
...e,
inlined: e.inlined ? t.from(e.inlined, "base64") : null,
externalBlob: r(e.externalBlob),
externalDrive: i(e.externalDrive),
}
: {}
}
function d(e) {
return e && (e.pointer || e.preview)
? (e.metadata?.userdata && (e.metadata.userdata = t.from(e.metadata.userdata, "base64")),
{ ...e, pointer: l(e.pointer), preview: a(e.preview) })
: null
}
function a(e) {
return e ? { small: d(e.small), medium: d(e.medium), large: d(e.large) } : null
}
function o(t, r) {
const i =
r.mentions?.map((t) => ({
range: { start: t.start, length: t.length },
memberKey: e.decode(t.memberId),
})) || null,
l =
r.translations?.map((e) => ({
range: { start: e.start, length: e.length },
language: e.language,
text: e.text,
})) || null,
a = {
httpLink: r?.httpLinks?.map(n),
pearLink: r?.pearLinks?.map(n),
mention: i,
translation: l,
bold: r.bold || [],
italic: r.italic || [],
code: r.code || [],
emoji: r?.emoji?.map(({ start: e, length: t, content: n }) => ({
range: { start: e, length: t },
content: n,
})),
codeBlock: r.codeBlock || [],
strike: r.strike || [],
},
o = {
callStarted: !0 === r?.callStarted,
callHangup: !0 === r?.callHangup,
callMissed: !0 === r?.callMissed,
locationShared: r?.locationShared,
}
let s = null
r.replyTo && (s = g(r.replyTo))
const c = !0 === r.forwarded,
u = []
for (const e of r?.files || []) {
const t = d(e)
t && u.push(t)
}
return { text: t, replyTo: s, forwarded: c, display: a, files: u, event: o }
}
function s({ gt: t, gte: n, lt: r, lte: i, limit: l, reverse: d } = {}) {
return {
limit: l,
reverse: d,
gt: t ? { key: e.decode(t) } : null,
gte: n ? { key: e.decode(n) } : null,
lt: r ? { key: e.decode(r) } : null,
lte: i ? { key: e.decode(i) } : null,
}
}
function c(e, t) {
const n = { ...t },
r = n.prefix || 0
return (
Number.isInteger(n.gt) && (n.gt = { id: { thread: r, index: t.gt } }),
Number.isInteger(n.gte) && (n.gte = { id: { thread: r, index: t.gte } }),
Number.isInteger(n.lt) && (n.lt = { id: { thread: r, index: t.lt } }),
Number.isInteger(n.lte) && (n.lte = { id: { thread: r, index: t.lte } }),
n.gt || n.gte || (n.gte = { id: { thread: r } }),
n.lt || n.lte || (n.lte = { id: { thread: r } }),
n
)
}
function u(
{ reverse: e = !0, limit: t = 50, gt: n, gte: r, lt: i, lte: l, type: d } = {
reverse: !0,
limit: 50,
},
) {
const a = { reverse: e, limit: t }
return (
Number.isInteger(n) && (a.gt = d ? { id: n, type: d } : { id: n }),
Number.isInteger(r) && (a.gte = d ? { id: r, type: d } : { id: r }),
Number.isInteger(i) && (a.lt = d ? { id: i, type: d } : { id: i }),
Number.isInteger(l) && (a.lte = d ? { id: l, type: d } : { id: l }),
d &&
(e && !a.lte && (a.lte = { type: d }),
e || a.gte || (a.gte = { type: d }),
a.lte && !a.gte && (a.gte = { type: d }),
a.gte && !a.lte && (a.lte = { type: d })),
a
)
}
function g(t) {
return { key: e.decode(t.deviceId), seq: t.seq }
}
function p(e) {
return e ? { ...e, avatar: a(e.avatar), blindPeers: y(e.blindPeers) } : null
}
function m(e) {
return e ? { disableReadReceipts: !0 === e.disableReadReceipts } : null
}
function y(t) {
return t && Array.isArray(t) ? t.map((t) => e.decode(t)) : []
}
function b({ memberId: t, blindWriters: n, displayName: r, avatar: i }) {
return { memberKey: e.decode(t), blindWriters: f(n), displayName: r, avatar: a(i) }
}
function f(t) {
return t && Array.isArray(t)
? t.map((t) => ({ publicKey: e.decode(t.publicKey), blindingKey: e.decode(t.blindingKey) }))
: []
}
module.exports = {
decodeContactInfo: b,
decodeChatRangeOptions: c,
decodeKeyRangeOptions: s,
decodeChatMessage: o,
decodeImageFile: a,
decodeFile: d,
decodeMessageId: g,
decodeConfig: p,
decodeUserSettings: m,
decodeFileRangeOptions: u,
}