const e = require("b4a"),
t = require("sodium-native"),
r = require("hypercore-crypto"),
o = require("compact-encoding"),
n = require("hypercore/lib/fully-remote-proof"),
c = require("./encoding"),
[a] = r.namespace("keet/notications", 1),
s = 3951
function i(r) {
const o = e.allocUnsafe(t.crypto_aead_xchacha20poly1305_ietf_KEYBYTES)
return (t.crypto_generichash(o, e.concat([a, r])), o)
}
function y(r, o) {
const n = i(r),
c = e.allocUnsafe(o.byteLength + t.crypto_secretbox_MACBYTES + t.crypto_secretbox_NONCEBYTES),
a = c.subarray(0, t.crypto_secretbox_NONCEBYTES),
s = c.subarray(a.byteLength)
return (t.randombytes_buf(a), t.crypto_secretbox_easy(s, o, a, n), c)
}
function u(r, o) {
const n = i(r),
c = o.subarray(0, t.crypto_secretbox_NONCEBYTES),
a = o.subarray(c.byteLength),
s = e.allocUnsafe(a.byteLength - t.crypto_secretbox_MACBYTES)
return t.crypto_secretbox_open_easy(s, a, c, n) ? s : null
}
async function l(e, t, r, a, s, i) {
const u = await n.proof(e, { block: r, index: a })
return y(t, 0 === s ? u : o.encode(c.payload, { proof: u, attest: i }))
}
;((exports.send = async function (e, t, o = {}) {
const {
roomDiscoveryKey: n = r.discoveryKey(t),
length: c = e.length,
version: a = 0,
attest: i = null,
} = o
if (0 === c || c > e.length) return null
const y = c - 1,
u = e.state.storage.read(),
p = u.getBlock(y)
u.tryFlush()
const f = await p
let d = await l(e, t, f, y, a, i)
return (
d.byteLength > s && (d = await l(e, t, null, 0, a, i)),
{ version: a, roomDiscoveryKey: n, payload: d }
)
}),
(exports.encode = async function (e, t, r = {}) {
const n = await exports.send(e, t, r)
return n ? o.encode(c.notification, n) : null
}),
(exports.decode = function (e) {
const { version: t, roomDiscoveryKey: r, payload: n } = o.decode(c.notification, e)
return 0 !== t && 1 !== t ? null : { version: t, discoveryKey: r, proof: n }
}),
(exports.receive = async function (e, t, r, a = 0) {
const s = u(t, r)
if (!s) return null
if (0 === a) return await n.verify(e, s, { referrer: t })
const { proof: i, attest: y } = o.decode(c.payload, s)
return { result: await n.verify(e, i, { referrer: t }), attest: y }
}))