OverviewFilesCommitsIssuesDocsReleasesPeers

keet-deobfuscated / @holepunchto / keet-push / lib / notifications.js

65 lines · javascript ref:
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 }
  }))