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=Math.floor(5865/4);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}async function u(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,l=e.state.storage.read(),p=l.getBlock(y);l.tryFlush();const f=await p;let d=await u(e,t,f,y,a,i);return d.byteLength>s&&(d=await u(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(r,a,s,y=0){const u=function(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}(a,s);if(!u)return null;if(0===y)return await n.verify(r,u,{referrer:a});const{proof:l,attest:p}=o.decode(c.payload,u);return{result:await n.verify(r,l,{referrer:a}),attest:p}};