@mblaney/holster 1.0.14 → 1.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/holster.js CHANGED
@@ -1,4 +1,4 @@
1
- var ue={is:e=>{if(e instanceof Array)return!1;if(typeof e=="number")return!isNaN(e);if(typeof e=="string"){let t=parseFloat(e);return!isNaN(t)&&isFinite(t)}return!1}},L={is:e=>{if(!e||typeof e!="object")return!1;let r=Object.prototype.toString.call(e).match(/^\[object (\w+)\]$/);return e.constructor===Object||r&&r[1]==="Object"},map:(e,t,r)=>{var n=Object.keys(e);for(let o=0;o<n.length;o++){let f=t(e[n[o]],n[o],r);if(typeof f<"u")return f}},put:(e,t,r)=>(e||(e={}),e[t]=r,e),del:(e,t)=>{if(e)return e[t]=null,delete e[t],e}},Ue=(e,t,r)=>{if(r.id){r.id=!1;return}if(t==="#"&&typeof e=="string"){r.id=e;return}r.id=!1},M={is:e=>{if(e&&e["#"]&&!e._&&L.is(e)){let t={};if(L.map(e,Ue,t),t.id)return t.id}return!1},ify:e=>L.put({},"#",e)},q="_holster_user_signature",B="_holster_user_public_key",X=(e,t,r,n)=>{let o=Date.now(),f={[e]:{_:{"#":e,">":{}}}};for(let[h,m]of Object.entries(t))h!=="_"&&h!==B&&h!==q&&(f[e][h]=m,f[e]._[">"][h]=o);return r&&n&&(f[e][q]=r,f[e]._[">"][q]=o,f[e][B]=n,f[e]._[">"][B]=o),f},V=(e,t)=>{if(typeof t>"u")return e===null;if(typeof e>"u")return!0;if(typeof e=="string")return e===t;if(!L.is(e)||!t)return!1;let r=e["*"];if(r)return t.slice(0,r.length)===r;let n=e[">"],o=e["<"];return n&&o?t>=n&&t<=o:n?t>=n:o?t<=o:!1},N={random:e=>{var t="";let r="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";e||(e=24);for(let n=0;n<e;n++)t+=r.charAt(Math.floor(Math.random()*r.length));return t}};var He=e=>{e||(e=9e3);let t={store:{}};return t.check=r=>t.store[r]?t.track(r):!1,t.track=r=>(t.store[r]=Date.now(),t.expiry||(t.expiry=setTimeout(()=>{if(t.expiry)return;let n=Date.now();Object.keys(t.store).forEach(o=>{n-t.store[o]>e&&delete t.store[o]}),t.expiry=null},e)),r),t},Ee=He;var Pe=(e,t)=>{if(!e||typeof e!="object")throw new TypeError("lex must be an object");if(!t||typeof t!="object")throw new TypeError("graph must be an object");let r=e["#"];if(!r||typeof r!="string")throw new TypeError("soul must be a string");if(!t[r])return;let n={_:{"#":r,">":{}}};if(typeof e["."]=="string"){let o=e["."];if(typeof t[r][o]>"u")return;n[o]=t[r][o],n._[">"][o]=t[r]._[">"][o]}else for(let o of Object.keys(t[r]))V(e["."],o)&&(n[o]=t[r][o],n._[">"][o]=t[r]._[">"][o]);return{[r]:n}},he=Pe;typeof btoa>"u"&&(globalThis.btoa=e=>Buffer.from(e,"binary").toString("base64"),globalThis.atob=e=>Buffer.from(e,"base64").toString("binary"));function le(){}Object.assign(le,{from:Array.from});le.prototype=Object.create(Array.prototype);le.prototype.toString=function(e,t,r){if(e||(e="utf8"),t||(t=0),r=r?Math.min(Math.max(r,t),this.length):this.length,e==="hex"){let n=new Uint8Array(this.slice(t,r));return Array.from(n,o=>o.toString(16).padStart(2,"0")).join("")}if(e==="utf8")return Array.from({length:r-t},(n,o)=>{let f=this[o+t];return f<0||f>1114111?"\uFFFD":String.fromCharCode(f)}).join("");if(e==="base64"){let n=Array.from({length:r-t},(o,f)=>{let h=this[f+t];return h<0||h>255?"\uFFFD":String.fromCharCode(h)}).join("");return btoa(n)}};var Q=le;var ae={MAX_BUFFER_SIZE:10*1024*1024,MAX_STRING_LENGTH:1024*1024};function Y(...e){return console.warn("new SafeBuffer() is deprecated, please use SafeBuffer.from()"),Y.from(...e)}Y.prototype=Object.create(Array.prototype);var ne=(e,t)=>{if(typeof e!="string")throw new TypeError("Input must be a string for encoding: "+t);if(e.length>ae.MAX_STRING_LENGTH)throw new RangeError(`String too large: ${e.length} > ${ae.MAX_STRING_LENGTH}`)},W=(e,t="buffer operation")=>{if(e>ae.MAX_BUFFER_SIZE)throw new RangeError(`Buffer size too large for ${t}: ${e} > ${ae.MAX_BUFFER_SIZE}`)},Be=e=>{ne(e,"hex");let t=e.replace(/\s/g,"").toLowerCase();if(!/^[0-9a-f]*$/.test(t))throw new TypeError("Invalid hex string: contains non-hex characters");if(t.length%2!==0)throw new TypeError("Invalid hex string: must have even length");if(t.length===0)return new Uint8Array(0);W(t.length/2,"hex parsing");let r=new Uint8Array(t.length/2);for(let n=0;n<t.length;n+=2){let o=t.substr(n,2);r[n/2]=parseInt(o,16)}return r},Te=e=>{ne(e,"utf8");try{let r=new TextEncoder().encode(e);return W(r.length,"UTF-8 encoding"),r}catch(t){throw new TypeError("Failed to encode UTF-8 string: "+t.message)}},Fe=e=>{ne(e,"binary"),W(e.length,"binary encoding");let t=new Uint8Array(e.length);for(let r=0;r<e.length;r++){let n=e.charCodeAt(r);if(n>255)throw new TypeError(`Invalid binary string: character at position ${r} exceeds byte range (${n} > 255)`);t[r]=n}return t},Ke=e=>{ne(e,"base64");let t=e.replace(/\s/g,"");if(!/^[A-Za-z0-9+/]*={0,2}$/.test(t))throw new TypeError("Invalid base64 string: contains invalid characters");try{let r=atob(t);W(r.length,"base64 decoding");let n=new Uint8Array(r.length);for(let o=0;o<r.length;o++)n[o]=r.charCodeAt(o);return n}catch(r){throw new TypeError("Failed to decode base64 string: "+r.message)}},ke=e=>{let t;if(e instanceof ArrayBuffer)W(e.byteLength,"ArrayBuffer processing"),t=new Uint8Array(e);else if(ArrayBuffer.isView(e))W(e.byteLength||e.length,"TypedArray processing"),t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);else if(Array.isArray(e)){W(e.length,"Array processing");for(let r=0;r<e.length;r++){let n=e[r];if(typeof n!="number"||n<0||n>255||!Number.isInteger(n))throw new TypeError(`Invalid byte value at index ${r}: ${n} (must be integer 0-255)`)}t=new Uint8Array(e)}else if(typeof e=="object"&&e!==null&&typeof e.length=="number"){W(e.length,"array-like processing");let r=Array.from(e);for(let n=0;n<r.length;n++){let o=r[n];if(typeof o!="number"||o<0||o>255||!Number.isInteger(o))throw new TypeError(`Invalid byte value at index ${n}: ${o} (must be integer 0-255)`)}t=new Uint8Array(r)}else throw new TypeError("Unsupported input type: "+typeof e);return t};Object.assign(Y,{from(){if(arguments.length===0)throw new TypeError("SafeBuffer.from() requires at least one argument");let t=arguments[0];if(t==null)throw new TypeError("First argument must not be null or undefined");let r;if(typeof t=="string"){let n=(arguments[1]||"utf8").toLowerCase();switch(n){case"hex":r=Be(t);break;case"utf8":case"utf-8":r=Te(t);break;case"binary":case"latin1":r=Fe(t);break;case"base64":r=Ke(t);break;case"ascii":ne(t,"ascii");for(let o=0;o<t.length;o++)if(t.charCodeAt(o)>127)throw new TypeError(`Invalid ASCII character at position ${o}: ${t.charCodeAt(o)} > 127`);r=Te(t);break;default:throw new TypeError("Unknown encoding: "+n)}}else r=ke(t);if(!r||r.length===0)return Q.from(new Uint8Array(0));try{return Q.from(r)}catch(n){throw new Error("Failed to create SafeBuffer: "+n.message)}},alloc(e,t=0){if(typeof e!="number"||!Number.isInteger(e)||e<0)throw new TypeError("Length must be a non-negative integer");if(W(e,"buffer allocation"),typeof t=="number"){if(t<0||t>255||!Number.isInteger(t))throw new TypeError("Fill value must be an integer between 0 and 255")}else if(typeof t=="string"){if(t.length!==1)throw new TypeError("Fill string must be exactly one character");if(t=t.charCodeAt(0),t>255)throw new TypeError("Fill character code must be <= 255")}else throw new TypeError("Fill must be a number or single character string");try{let r=new Uint8Array(e);return t!==0&&r.fill(t),Q.from(r)}catch(r){throw new Error("Failed to allocate buffer: "+r.message)}},concat(e){if(!Array.isArray(e))throw new TypeError("First argument must be an array");if(e.length===0)return Q.from(new Uint8Array(0));let t=0,r=[];for(let n=0;n<e.length;n++){let o=e[n];if(!o)throw new TypeError(`Array element at index ${n} is null or undefined`);let f;try{f=ke(o)}catch(h){throw new TypeError(`Invalid array element at index ${n}: ${h.message}`)}t+=f.length,W(t,"buffer concatenation"),r.push(f)}try{let n=new Uint8Array(t),o=0;for(let f of r)n.set(f,o),o+=f.length;return Q.from(n)}catch(n){throw new Error("Failed to concatenate buffers: "+n.message)}},isBuffer(e){return e instanceof Q||e&&typeof e=="object"&&e.constructor===Y},byteLength(e,t="utf8"){if(typeof e!="string")throw new TypeError("First argument must be a string");switch(t.toLowerCase()){case"utf8":case"utf-8":return new TextEncoder().encode(e).length;case"ascii":case"binary":case"latin1":return e.length;case"base64":let r=e.replace(/\s/g,"");return Math.floor(r.length*3/4)-(r.match(/=/g)||[]).length;case"hex":return Math.floor(e.replace(/\s/g,"").length/2);default:throw new TypeError("Unknown encoding: "+t)}}});Y.prototype.from=Y.from;Y.prototype.toString=function(e="utf8",t=0,r=this.length){if(typeof e!="string")throw new TypeError("Encoding must be a string");if(typeof t!="number"||!Number.isInteger(t)||t<0)throw new TypeError("Start must be a non-negative integer");if(typeof r!="number"||!Number.isInteger(r)||r<t)throw new TypeError("End must be an integer >= start");try{return Q.prototype.toString.call(this,e,t,r)}catch(n){throw new Error("Failed to convert buffer to string: "+n.message)}};var F=Y;var qe=typeof document>"u",$e=qe?(await import("node:crypto")).webcrypto:globalThis.crypto,D=$e.subtle,fe=e=>typeof e=="string"?e:JSON.stringify(e),oe=e=>{try{return JSON.parse(e)}catch{return e}},ce=e=>{let t=new Uint8Array(F.alloc(e));return F.from($e.getRandomValues(t))},ie=(e,t)=>{let[r,n]=e.split(".");return{kty:"EC",crv:"P-256",x:r,y:n,d:t,ext:!0,key_ops:t?["sign"]:["verify"]}},ge=async e=>{let t=await D.digest({name:"SHA-256"},new TextEncoder().encode(fe(e)));return F.from(t)},ye=async(e,t)=>{let r=e+t.toString("utf8"),n=F.from(await ge(r),"binary"),o=Je(n);return await D.importKey("jwk",o,{name:"AES-GCM"},!1,["encrypt","decrypt"])},Je=e=>({kty:"oct",k:e.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/\=/g,""),ext:!1,alg:"A256GCM"});var Ge={pair:async e=>{let t=await D.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]).then(async o=>{let f=await D.exportKey("jwk",o.publicKey);return{priv:(await D.exportKey("jwk",o.privateKey)).d,pub:f.x+"."+f.y}}),r=await D.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveKey"]).then(async o=>{let f=await D.exportKey("jwk",o.publicKey);return{epriv:(await D.exportKey("jwk",o.privateKey)).d,epub:f.x+"."+f.y}}),n={pub:t.pub,priv:t.priv,epub:r.epub,epriv:r.epriv};return e&&e(n),n},encrypt:async(e,t,r)=>{if(!t||!t.epriv)return r&&r(null),null;let n={s:ce(9),iv:ce(15)},o=await ye(t.epriv,n.s).then(h=>D.encrypt({name:"AES-GCM",iv:new Uint8Array(n.iv)},h,new TextEncoder().encode(fe(e)))),f={ct:F.from(o,"binary").toString("base64"),iv:n.iv.toString("base64"),s:n.s.toString("base64")};return r&&r(f),f},decrypt:async(e,t,r)=>{if(!e||!e.ct||!e.iv||!e.s||!t||!t.epriv)return r&&r(null),null;let n={ct:F.from(e.ct,"base64"),iv:F.from(e.iv,"base64"),s:F.from(e.s,"base64")};try{let o=await ye(t.epriv,n.s).then(h=>D.decrypt({name:"AES-GCM",iv:new Uint8Array(n.iv),tagLength:128},h,new Uint8Array(n.ct))),f=oe(new TextDecoder("utf8").decode(o));return r&&r(f),f}catch{return r&&r(null),null}},verify:async(e,t,r)=>{if(!t||!t.pub)return r&&r(null),null;let n=oe(e),o=await D.importKey("jwk",ie(t.pub),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]),f={};if(typeof n.m=="string")f=n.m;else for(let l of Object.keys(n.m).sort())l!=="_"&&l!=B&&l!=q&&(f[l]=n.m[l]);let h=await ge(f),m=new Uint8Array(F.from(n.s,"base64")),a={name:"ECDSA",hash:{name:"SHA-256"}};if(await D.verify(a,o,m,new Uint8Array(h))){let l=oe(n.m);return r&&r(l),l}return r&&r(null),null},sign:async(e,t,r)=>{if(!t||!t.pub||!t.priv)return r&&r(null),null;let n={};if(typeof e=="string")n=e;else{let l=oe(e);for(let d of Object.keys(l).sort())d!=="_"&&d!=B&&d!=q&&(n[d]=l[d])}let o=await ge(n),f=ie(t.pub,t.priv),h={name:"ECDSA",namedCurve:"P-256"},m=await D.importKey("jwk",f,h,!1,["sign"]).then(l=>D.sign({name:"ECDSA",hash:{name:"SHA-256"}},l,new Uint8Array(o))),a={m:n,s:F.from(m,"binary").toString("base64")};return r&&r(a),a},work:async(e,t,r)=>{typeof t=="function"&&(r=t,t=void 0),typeof t>"u"&&(t=ce(9));let n=await D.importKey("raw",new TextEncoder().encode(fe(e)),{name:"PBKDF2"},!1,["deriveBits"]),o={name:"PBKDF2",iterations:1e5,salt:new TextEncoder().encode(t),hash:{name:"SHA-256"}},f=await D.deriveBits(o,n,512),h={epriv:F.from(f,"binary").toString("base64")};return r&&r(h),h},secret:async(e,t,r)=>{if(!e||!e.epub||!t||!t.epub||!t.epriv)return r&&r(null),null;let n={name:"ECDH",namedCurve:"P-256"},o=ie(e.epub),f=await D.importKey("jwk",o,n,!0,[]),h=ie(t.epub,t.epriv,!1);delete h.key_ops;let m=await D.importKey("jwk",h,n,!1,["deriveBits"]).then(async a=>{let l=await D.deriveBits({public:f,name:"ECDH",namedCurve:"P-256"},a,256),d=await D.importKey("raw",new Uint8Array(l),{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]);return D.exportKey("jwk",d).then(({k:b})=>b)});return r&&r({epriv:m}),{epriv:m}}},H=Ge;var xe=100,Ce=1e4,me=(e,t,r,n)=>e<t?{historical:!0}:e>t?{incoming:!0}:(typeof r!="string"&&(r=JSON.stringify(r)||""),typeof n!="string"&&(n=JSON.stringify(n)||""),r===n?{state:!0}:r<n?{current:!0}:{incoming:!0});me.mix=async(e,t,r,n)=>{if(!e||typeof e!="object")throw new TypeError("change must be an object");if(!t||typeof t!="object")throw new TypeError("graph must be an object");if(!n||typeof n!="object")throw new TypeError("listen must be an object");let o=Date.now(),f={},h={},m=0;for(let l of Object.keys(e)){let d=e[l],b=!1,x=!1,i=0,u=r;if(!d||!d._)continue;let g=d[q],c=d[B];if(g&&c&&(u=!0),l.length>1&&l[0]==="~")if(l[1]==="@")x=!0,u=!1;else{if(c&&l!="~"+c){console.log(`error public key does not match for soul: ${l}`);continue}u=!0}if(!(u&&(!g||!c||!await H.verify({m:d,s:g},{pub:c})))){for(let s of Object.keys(d)){if(s==="_")continue;let p=d[s],k=d._&&d._[">"]?d._[">"][s]:0,y=(t[l]||{})[s],w=(t[l]||{_:{">":{}}})._[">"][s]||0;if(x&&s!==M.is(p)){console.log(`error alias ${x}: ${s} !== ${M.is(p)}`);continue}let A=k-o;if(A>0){if(A>864e5)continue;(m===0||A<m)&&(m=i=A),h[l]||(h[l]={_:{"#":l,">":{}}}),h[l][s]=p,h[l]._[">"][s]=k}else me(k,w,p,y).incoming&&(f[l]||(f[l]={_:{"#":l,">":{}}}),t[l]||(t[l]={_:{"#":l,">":{}}}),t[l][s]=f[l][s]=p,t[l]._[">"][s]=f[l]._[">"][s]=k,n[l]&&setTimeout(()=>{n[l]&&n[l].filter(S=>V(S["."],s)).forEach(S=>S.cb())},xe),b=!0)}u&&i!==0&&f[l]&&(Object.assign(h[l],f[l]),delete f[l]),b&&n[l]&&setTimeout(()=>{n[l]&&n[l].filter(s=>V(s["."])).forEach(s=>s.cb())},xe)}}let a=Object.keys(t);return a.length>Ce&&a.map(b=>{let x=t[b]._&&t[b]._[">"],i=x?Math.max(...Object.values(x)):0;return{soul:b,maxState:i}}).sort((b,x)=>b.maxState-x.maxState).slice(0,a.length-Ce).forEach(({soul:b})=>delete t[b]),{now:f,defer:h,wait:m}};var we=me;var J="",re="",Ae=()=>{let e=(t,r,n)=>{if(n||(e[J]||(e[J]={}),n=e[J]),!t)return n;let o=0,f={},h=t[o],m=t.length-1,a=typeof r>"u",l=n[h];for(;!l&&o<m;)h+=t[++o],l=n[h];if(l)if(o===m){if(a)return typeof l[re]>"u"?l[J]:l[re];l[re]=r}else return!l[J]&&!a&&(l[J]={}),e(t.slice(++o),r,l[J]);else if(L.map(n,(b,x)=>{let i=0,u="";for(;x[i]===t[i];)u+=x[i++];if(u){if(a)return i<=m?void 0:(f[x.slice(i)]=b,b);let g={[x.slice(i)]:b,[t.slice(i)]:{[re]:r}};return n[u]={[J]:g},delete n[x],!0}})){if(a)return f}else{if(a)return;n[h]||(n[h]={}),n[h][re]=r}};return e};Ae.map=function e(t,r,n,o){o||(o=[]);var f=t[J]||t,h=Object.keys(f).sort(),m;for(let a=0;a<h.length;a++){let l=h[a],d=f[l],b=d[re];if(typeof b<"u"){if(b=r(b,o.join("")+l,l,o),typeof b<"u")return b}else n&&r(m,o.join(""),l,o);if(d[J]){if(o.push(l),b=e(d[J],r,n,o),typeof b<"u")return b;o.pop()}}};var K=Ae;var Oe="",je="",U="",te=e=>{var t;let r=new Map,n=null,o=0,f=1e4,h=new Map,m=0,a=3e4,l=.8,d=.9;if(e||(e={}),e.log||(e.log=console.log),e.batch||(e.batch=100),e.write||(e.write=1),e.size||(e.size=1024*1024),e.memoryLimit||(e.memoryLimit=500),typeof e.cache>"u"&&(e.cache=!0),!e.store){e.log("Radisk needs `store` interface with `{get: fn, put: fn, list: fn}`");return}if(!e.store.get){e.log("Radisk needs `store.get` interface with `(file, cb)`");return}if(!e.store.put){e.log("Radisk needs `store.put` interface with `(file, data, cb)`");return}if(!e.store.list){e.log("Radisk needs a streaming `store.list` interface with `(cb)`");return}let b=(u,g,c,s)=>{let p=Date.now()-g;p>1e3&&console.log(`[RADISK-SLOW] ${u}: ${p}ms for ${c}${s?` (${s} bytes)`:""}`)},x=()=>{let u=Date.now();if(u-m<a)return;m=u;let g=process.memoryUsage(),c=g.heapUsed,s=g.heapTotal,p=e.memoryLimit*1024*1024,k=c/p;if(k>d){let y=r.size;console.log(`[RADISK-MEMORY] High memory usage: ${Math.round(k*100)}% of heap limit. Clearing ${y} cached files.`),r.clear(),global.gc&&global.gc(),m=u+a}else k>l&&console.log(`[RADISK-MEMORY] Memory warning: ${Math.round(k*100)}% of heap limit used. Cache size: ${r.size} files.`)},i=(u,g,c)=>{if(u=""+u,typeof g=="function"){if(c=g,g=i.batch(u),typeof g<"u"||i.thrash.at&&(g=i.thrash.at(u),typeof g<"u"))return c(t,g);if(h.has(u)){h.get(u).push(c);return}h.set(u,[c]);let s=Date.now();return i.read(u,(p,k)=>{b("read",s,u);let y=h.get(u)||[];h.delete(u),y.forEach(w=>w(p,k))})}if(i.batch(u,g),x(),c&&i.batch.acks.push(c),++i.batch.ed>=e.batch)return i.thrash();clearTimeout(i.batch.timeout),i.batch.timeout=setTimeout(i.thrash,e.write)};return i.batch=K(),i.batch.acks=[],i.batch.ed=0,i.thrash=()=>{if(i.thrash.ing)return i.thrash.more=!0;let u=Date.now();clearTimeout(i.batch.timeout),i.thrash.more=!1,i.thrash.ing=!0;var g=i.thrash.at=i.batch;i.batch=null,i.batch=K(),i.batch.acks=[],i.batch.ed=0;let c=0;i.save(g,s=>{++c>1||(b("thrash",u,`batch-${g.ed}`),s&&e.log(s),g.acks.forEach(p=>p(s)),i.thrash.at=null,i.thrash.ing=!1,i.thrash.more&&i.thrash())})},i.save=(u,g)=>{let c={find:(s,p)=>{if(!(p<c.start))return c.start=p,e.store.list(c.lex),!0},lex:s=>{!s||s>c.start?(c.end=s,c.start&&c.mix(c.file||"!",c.start,c.end)):c.file=s},mix:(s,p,k)=>{if(c.start=c.end=c.file=t,r.has(s)){let y=r.get(s);K.map(u,(w,A)=>{if(!(A<p)){if(k&&k<A){c.start=A;return}y(A,w)}}),i.write(s,y,c.next)}else i.parse(s,(y,w)=>{if(y)return g(y);K.map(u,(A,j)=>{if(!(j<p)){if(k&&k<j){c.start=j;return}w(j,A)}}),i.write(s,w,c.next)})},next:s=>{if(s)return g(s);if(c.start)return K.map(u,c.find);g(s)}};K.map(u,c.find)},i.write=(u,g,c)=>{let s={text:"",limit:"",done:!1,count:0,each:(k,y,w,A)=>{if(s.done)return;s.count++,k=typeof k>"u"?"":"="+te.encode(k);let j=te.encode(A.length)+"#"+te.encode(w)+k+`
1
+ var ue={is:e=>{if(e instanceof Array)return!1;if(typeof e=="number")return!isNaN(e);if(typeof e=="string"){let t=parseFloat(e);return!isNaN(t)&&isFinite(t)}return!1}},L={is:e=>{if(!e||typeof e!="object")return!1;let r=Object.prototype.toString.call(e).match(/^\[object (\w+)\]$/);return e.constructor===Object||r&&r[1]==="Object"},map:(e,t,r)=>{var n=Object.keys(e);for(let o=0;o<n.length;o++){let f=t(e[n[o]],n[o],r);if(typeof f<"u")return f}},put:(e,t,r)=>(e||(e={}),e[t]=r,e),del:(e,t)=>{if(e)return e[t]=null,delete e[t],e}},Ue=(e,t,r)=>{if(r.id){r.id=!1;return}if(t==="#"&&typeof e=="string"){r.id=e;return}r.id=!1},M={is:e=>{if(e&&e["#"]&&!e._&&L.is(e)){let t={};if(L.map(e,Ue,t),t.id)return t.id}return!1},ify:e=>L.put({},"#",e)},q="_holster_user_signature",B="_holster_user_public_key",X=(e,t,r,n)=>{let o=Date.now(),f={[e]:{_:{"#":e,">":{}}}};for(let[h,m]of Object.entries(t))h!=="_"&&h!==B&&h!==q&&(f[e][h]=m,f[e]._[">"][h]=o);return r&&n&&(f[e][q]=r,f[e]._[">"][q]=o,f[e][B]=n,f[e]._[">"][B]=o),f},V=(e,t)=>{if(typeof t>"u")return e===null;if(typeof e>"u")return!0;if(typeof e=="string")return e===t;if(!L.is(e)||!t)return!1;let r=e["*"];if(r)return t.slice(0,r.length)===r;let n=e[">"],o=e["<"];return n&&o?t>=n&&t<=o:n?t>=n:o?t<=o:!1},N={random:e=>{var t="";let r="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";e||(e=24);for(let n=0;n<e;n++)t+=r.charAt(Math.floor(Math.random()*r.length));return t}};var He=e=>{e||(e=9e3);let t={store:{}};return t.check=r=>t.store[r]?t.track(r):!1,t.track=r=>(t.store[r]=Date.now(),t.expiry||(t.expiry=setTimeout(()=>{if(t.expiry)return;let n=Date.now();Object.keys(t.store).forEach(o=>{n-t.store[o]>e&&delete t.store[o]}),t.expiry=null},e)),r),t},Ee=He;var Pe=(e,t)=>{if(!e||typeof e!="object")throw new TypeError("lex must be an object");if(!t||typeof t!="object")throw new TypeError("graph must be an object");let r=e["#"];if(!r||typeof r!="string")throw new TypeError("soul must be a string");if(!t[r])return;let n={_:{"#":r,">":{}}};if(typeof e["."]=="string"){let o=e["."];if(typeof t[r][o]>"u")return;n[o]=t[r][o],n._[">"][o]=t[r]._[">"][o]}else for(let o of Object.keys(t[r]))V(e["."],o)&&(n[o]=t[r][o],n._[">"][o]=t[r]._[">"][o]);return{[r]:n}},he=Pe;typeof btoa>"u"&&(globalThis.btoa=e=>Buffer.from(e,"binary").toString("base64"),globalThis.atob=e=>Buffer.from(e,"base64").toString("binary"));function le(){}Object.assign(le,{from:Array.from});le.prototype=Object.create(Array.prototype);le.prototype.toString=function(e,t,r){if(e||(e="utf8"),t||(t=0),r=r?Math.min(Math.max(r,t),this.length):this.length,e==="hex"){let n=new Uint8Array(this.slice(t,r));return Array.from(n,o=>o.toString(16).padStart(2,"0")).join("")}if(e==="utf8")return Array.from({length:r-t},(n,o)=>{let f=this[o+t];return f<0||f>1114111?"\uFFFD":String.fromCharCode(f)}).join("");if(e==="base64"){let n=Array.from({length:r-t},(o,f)=>{let h=this[f+t];return h<0||h>255?"\uFFFD":String.fromCharCode(h)}).join("");return btoa(n)}};var Q=le;var ae={MAX_BUFFER_SIZE:10*1024*1024,MAX_STRING_LENGTH:1024*1024};function Y(...e){return console.warn("new SafeBuffer() is deprecated, please use SafeBuffer.from()"),Y.from(...e)}Y.prototype=Object.create(Array.prototype);var ne=(e,t)=>{if(typeof e!="string")throw new TypeError("Input must be a string for encoding: "+t);if(e.length>ae.MAX_STRING_LENGTH)throw new RangeError(`String too large: ${e.length} > ${ae.MAX_STRING_LENGTH}`)},W=(e,t="buffer operation")=>{if(e>ae.MAX_BUFFER_SIZE)throw new RangeError(`Buffer size too large for ${t}: ${e} > ${ae.MAX_BUFFER_SIZE}`)},Be=e=>{ne(e,"hex");let t=e.replace(/\s/g,"").toLowerCase();if(!/^[0-9a-f]*$/.test(t))throw new TypeError("Invalid hex string: contains non-hex characters");if(t.length%2!==0)throw new TypeError("Invalid hex string: must have even length");if(t.length===0)return new Uint8Array(0);W(t.length/2,"hex parsing");let r=new Uint8Array(t.length/2);for(let n=0;n<t.length;n+=2){let o=t.substr(n,2);r[n/2]=parseInt(o,16)}return r},Te=e=>{ne(e,"utf8");try{let r=new TextEncoder().encode(e);return W(r.length,"UTF-8 encoding"),r}catch(t){throw new TypeError("Failed to encode UTF-8 string: "+t.message)}},Fe=e=>{ne(e,"binary"),W(e.length,"binary encoding");let t=new Uint8Array(e.length);for(let r=0;r<e.length;r++){let n=e.charCodeAt(r);if(n>255)throw new TypeError(`Invalid binary string: character at position ${r} exceeds byte range (${n} > 255)`);t[r]=n}return t},Ke=e=>{ne(e,"base64");let t=e.replace(/\s/g,"");if(!/^[A-Za-z0-9+/]*={0,2}$/.test(t))throw new TypeError("Invalid base64 string: contains invalid characters");try{let r=atob(t);W(r.length,"base64 decoding");let n=new Uint8Array(r.length);for(let o=0;o<r.length;o++)n[o]=r.charCodeAt(o);return n}catch(r){throw new TypeError("Failed to decode base64 string: "+r.message)}},ke=e=>{let t;if(e instanceof ArrayBuffer)W(e.byteLength,"ArrayBuffer processing"),t=new Uint8Array(e);else if(ArrayBuffer.isView(e))W(e.byteLength||e.length,"TypedArray processing"),t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);else if(Array.isArray(e)){W(e.length,"Array processing");for(let r=0;r<e.length;r++){let n=e[r];if(typeof n!="number"||n<0||n>255||!Number.isInteger(n))throw new TypeError(`Invalid byte value at index ${r}: ${n} (must be integer 0-255)`)}t=new Uint8Array(e)}else if(typeof e=="object"&&e!==null&&typeof e.length=="number"){W(e.length,"array-like processing");let r=Array.from(e);for(let n=0;n<r.length;n++){let o=r[n];if(typeof o!="number"||o<0||o>255||!Number.isInteger(o))throw new TypeError(`Invalid byte value at index ${n}: ${o} (must be integer 0-255)`)}t=new Uint8Array(r)}else throw new TypeError("Unsupported input type: "+typeof e);return t};Object.assign(Y,{from(){if(arguments.length===0)throw new TypeError("SafeBuffer.from() requires at least one argument");let t=arguments[0];if(t==null)throw new TypeError("First argument must not be null or undefined");let r;if(typeof t=="string"){let n=(arguments[1]||"utf8").toLowerCase();switch(n){case"hex":r=Be(t);break;case"utf8":case"utf-8":r=Te(t);break;case"binary":case"latin1":r=Fe(t);break;case"base64":r=Ke(t);break;case"ascii":ne(t,"ascii");for(let o=0;o<t.length;o++)if(t.charCodeAt(o)>127)throw new TypeError(`Invalid ASCII character at position ${o}: ${t.charCodeAt(o)} > 127`);r=Te(t);break;default:throw new TypeError("Unknown encoding: "+n)}}else r=ke(t);if(!r||r.length===0)return Q.from(new Uint8Array(0));try{return Q.from(r)}catch(n){throw new Error("Failed to create SafeBuffer: "+n.message)}},alloc(e,t=0){if(typeof e!="number"||!Number.isInteger(e)||e<0)throw new TypeError("Length must be a non-negative integer");if(W(e,"buffer allocation"),typeof t=="number"){if(t<0||t>255||!Number.isInteger(t))throw new TypeError("Fill value must be an integer between 0 and 255")}else if(typeof t=="string"){if(t.length!==1)throw new TypeError("Fill string must be exactly one character");if(t=t.charCodeAt(0),t>255)throw new TypeError("Fill character code must be <= 255")}else throw new TypeError("Fill must be a number or single character string");try{let r=new Uint8Array(e);return t!==0&&r.fill(t),Q.from(r)}catch(r){throw new Error("Failed to allocate buffer: "+r.message)}},concat(e){if(!Array.isArray(e))throw new TypeError("First argument must be an array");if(e.length===0)return Q.from(new Uint8Array(0));let t=0,r=[];for(let n=0;n<e.length;n++){let o=e[n];if(!o)throw new TypeError(`Array element at index ${n} is null or undefined`);let f;try{f=ke(o)}catch(h){throw new TypeError(`Invalid array element at index ${n}: ${h.message}`)}t+=f.length,W(t,"buffer concatenation"),r.push(f)}try{let n=new Uint8Array(t),o=0;for(let f of r)n.set(f,o),o+=f.length;return Q.from(n)}catch(n){throw new Error("Failed to concatenate buffers: "+n.message)}},isBuffer(e){return e instanceof Q||e&&typeof e=="object"&&e.constructor===Y},byteLength(e,t="utf8"){if(typeof e!="string")throw new TypeError("First argument must be a string");switch(t.toLowerCase()){case"utf8":case"utf-8":return new TextEncoder().encode(e).length;case"ascii":case"binary":case"latin1":return e.length;case"base64":let r=e.replace(/\s/g,"");return Math.floor(r.length*3/4)-(r.match(/=/g)||[]).length;case"hex":return Math.floor(e.replace(/\s/g,"").length/2);default:throw new TypeError("Unknown encoding: "+t)}}});Y.prototype.from=Y.from;Y.prototype.toString=function(e="utf8",t=0,r=this.length){if(typeof e!="string")throw new TypeError("Encoding must be a string");if(typeof t!="number"||!Number.isInteger(t)||t<0)throw new TypeError("Start must be a non-negative integer");if(typeof r!="number"||!Number.isInteger(r)||r<t)throw new TypeError("End must be an integer >= start");try{return Q.prototype.toString.call(this,e,t,r)}catch(n){throw new Error("Failed to convert buffer to string: "+n.message)}};var F=Y;var qe=typeof document>"u",$e=qe?(await import("node:crypto")).webcrypto:globalThis.crypto,D=$e.subtle,fe=e=>typeof e=="string"?e:JSON.stringify(e),oe=e=>{try{return JSON.parse(e)}catch{return e}},ce=e=>{let t=new Uint8Array(F.alloc(e));return F.from($e.getRandomValues(t))},ie=(e,t)=>{let[r,n]=e.split(".");return{kty:"EC",crv:"P-256",x:r,y:n,d:t,ext:!0,key_ops:t?["sign"]:["verify"]}},ge=async e=>{let t=await D.digest({name:"SHA-256"},new TextEncoder().encode(fe(e)));return F.from(t)},ye=async(e,t)=>{let r=e+t.toString("utf8"),n=F.from(await ge(r),"binary"),o=Je(n);return await D.importKey("jwk",o,{name:"AES-GCM"},!1,["encrypt","decrypt"])},Je=e=>({kty:"oct",k:e.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/\=/g,""),ext:!1,alg:"A256GCM"});var Ge={pair:async e=>{let t=await D.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]).then(async o=>{let f=await D.exportKey("jwk",o.publicKey);return{priv:(await D.exportKey("jwk",o.privateKey)).d,pub:f.x+"."+f.y}}),r=await D.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveKey"]).then(async o=>{let f=await D.exportKey("jwk",o.publicKey);return{epriv:(await D.exportKey("jwk",o.privateKey)).d,epub:f.x+"."+f.y}}),n={pub:t.pub,priv:t.priv,epub:r.epub,epriv:r.epriv};return e&&e(n),n},encrypt:async(e,t,r)=>{if(!t||!t.epriv)return r&&r(null),null;let n={s:ce(9),iv:ce(15)},o=await ye(t.epriv,n.s).then(h=>D.encrypt({name:"AES-GCM",iv:new Uint8Array(n.iv)},h,new TextEncoder().encode(fe(e)))),f={ct:F.from(o,"binary").toString("base64"),iv:n.iv.toString("base64"),s:n.s.toString("base64")};return r&&r(f),f},decrypt:async(e,t,r)=>{if(!e||!e.ct||!e.iv||!e.s||!t||!t.epriv)return r&&r(null),null;let n={ct:F.from(e.ct,"base64"),iv:F.from(e.iv,"base64"),s:F.from(e.s,"base64")};try{let o=await ye(t.epriv,n.s).then(h=>D.decrypt({name:"AES-GCM",iv:new Uint8Array(n.iv),tagLength:128},h,new Uint8Array(n.ct))),f=oe(new TextDecoder("utf8").decode(o));return r&&r(f),f}catch{return r&&r(null),null}},verify:async(e,t,r)=>{if(!t||!t.pub)return r&&r(null),null;let n=oe(e),o=await D.importKey("jwk",ie(t.pub),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]),f={};if(typeof n.m=="string")f=n.m;else for(let l of Object.keys(n.m).sort())l!=="_"&&l!=B&&l!=q&&(f[l]=n.m[l]);let h=await ge(f),m=new Uint8Array(F.from(n.s,"base64")),a={name:"ECDSA",hash:{name:"SHA-256"}};if(await D.verify(a,o,m,new Uint8Array(h))){let l=oe(n.m);return r&&r(l),l}return r&&r(null),null},sign:async(e,t,r)=>{if(!t||!t.pub||!t.priv)return r&&r(null),null;let n={};if(typeof e=="string")n=e;else{let l=oe(e);for(let d of Object.keys(l).sort())d!=="_"&&d!=B&&d!=q&&(n[d]=l[d])}let o=await ge(n),f=ie(t.pub,t.priv),h={name:"ECDSA",namedCurve:"P-256"},m=await D.importKey("jwk",f,h,!1,["sign"]).then(l=>D.sign({name:"ECDSA",hash:{name:"SHA-256"}},l,new Uint8Array(o))),a={m:n,s:F.from(m,"binary").toString("base64")};return r&&r(a),a},work:async(e,t,r)=>{typeof t=="function"&&(r=t,t=void 0),typeof t>"u"&&(t=ce(9));let n=await D.importKey("raw",new TextEncoder().encode(fe(e)),{name:"PBKDF2"},!1,["deriveBits"]),o={name:"PBKDF2",iterations:1e5,salt:new TextEncoder().encode(t),hash:{name:"SHA-256"}},f=await D.deriveBits(o,n,512),h={epriv:F.from(f,"binary").toString("base64")};return r&&r(h),h},secret:async(e,t,r)=>{if(!e||!e.epub||!t||!t.epub||!t.epriv)return r&&r(null),null;let n={name:"ECDH",namedCurve:"P-256"},o=ie(e.epub),f=await D.importKey("jwk",o,n,!0,[]),h=ie(t.epub,t.epriv,!1);delete h.key_ops;let m=await D.importKey("jwk",h,n,!1,["deriveBits"]).then(async a=>{let l=await D.deriveBits({public:f,name:"ECDH",namedCurve:"P-256"},a,256),d=await D.importKey("raw",new Uint8Array(l),{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]);return D.exportKey("jwk",d).then(({k:b})=>b)});return r&&r({epriv:m}),{epriv:m}}},H=Ge;var xe=100,Ce=1e4,me=(e,t,r,n)=>e<t?{historical:!0}:e>t?{incoming:!0}:(typeof r!="string"&&(r=JSON.stringify(r)||""),typeof n!="string"&&(n=JSON.stringify(n)||""),r===n?{state:!0}:r<n?{current:!0}:{incoming:!0});me.mix=async(e,t,r,n)=>{if(!e||typeof e!="object")throw new TypeError("change must be an object");if(!t||typeof t!="object")throw new TypeError("graph must be an object");if(!n||typeof n!="object")throw new TypeError("listen must be an object");let o=Date.now(),f={},h={},m=0;for(let l of Object.keys(e)){let d=e[l],b=!1,x=!1,i=0,u=r;if(!d||!d._)continue;let g=d[q],c=d[B];if(g&&c&&(u=!0),l.length>1&&l[0]==="~")if(l[1]==="@")x=!0,u=!1;else{if(c&&l!="~"+c){console.log(`error public key does not match for soul: ${l}`);continue}u=!0}if(!(u&&(!g||!c||!await H.verify({m:d,s:g},{pub:c})))){for(let s of Object.keys(d)){if(s==="_")continue;let p=d[s],k=d._&&d._[">"]?d._[">"][s]:0,y=(t[l]||{})[s],w=(t[l]||{_:{">":{}}})._[">"][s]||0;if(x&&s!==M.is(p)){console.log(`error alias ${x}: ${s} !== ${M.is(p)}`);continue}let A=k-o;if(A>0){if(A>864e5)continue;(m===0||A<m)&&(m=i=A),h[l]||(h[l]={_:{"#":l,">":{}}}),h[l][s]=p,h[l]._[">"][s]=k}else me(k,w,p,y).incoming&&(f[l]||(f[l]={_:{"#":l,">":{}}}),t[l]||(t[l]={_:{"#":l,">":{}}}),t[l][s]=f[l][s]=p,t[l]._[">"][s]=f[l]._[">"][s]=k,n[l]&&setTimeout(()=>{n[l]&&n[l].filter(S=>V(S["."],s)).forEach(S=>S.cb())},xe),b=!0)}u&&i!==0&&f[l]&&(Object.assign(h[l],f[l]),delete f[l]),b&&n[l]&&setTimeout(()=>{n[l]&&n[l].filter(s=>V(s["."])).forEach(s=>s.cb())},xe)}}let a=Object.keys(t);return a.length>Ce&&a.map(b=>{let x=t[b]._&&t[b]._[">"],i=x?Math.max(...Object.values(x)):0;return{soul:b,maxState:i}}).sort((b,x)=>b.maxState-x.maxState).slice(0,a.length-Ce).forEach(({soul:b})=>delete t[b]),{now:f,defer:h,wait:m}};var we=me;var J="",re="",Ae=()=>{let e=(t,r,n)=>{if(n||(e[J]||(e[J]={}),n=e[J]),!t)return n;let o=0,f={},h=t[o],m=t.length-1,a=typeof r>"u",l=n[h];for(;!l&&o<m;)h+=t[++o],l=n[h];if(l)if(o===m){if(a)return typeof l[re]>"u"?l[J]:l[re];l[re]=r}else return!l[J]&&!a&&(l[J]={}),e(t.slice(++o),r,l[J]);else if(L.map(n,(b,x)=>{let i=0,u="";for(;x[i]===t[i];)u+=x[i++];if(u){if(a)return i<=m?void 0:(f[x.slice(i)]=b,b);let g={[x.slice(i)]:b,[t.slice(i)]:{[re]:r}};return n[u]={[J]:g},delete n[x],!0}})){if(a)return f}else{if(a)return;n[h]||(n[h]={}),n[h][re]=r}};return e};Ae.map=function e(t,r,n,o){o||(o=[]);var f=t[J]||t,h=Object.keys(f).sort(),m;for(let a=0;a<h.length;a++){let l=h[a],d=f[l],b=d[re];if(typeof b<"u"){if(b=r(b,o.join("")+l,l,o),typeof b<"u")return b}else n&&r(m,o.join(""),l,o);if(d[J]){if(o.push(l),b=e(d[J],r,n,o),typeof b<"u")return b;o.pop()}}};var K=Ae;var Oe="",je="",U="",te=e=>{var t;let r=new Map,n=null,o=0,f=1e4,h=new Map,m=0,a=3e4,l=.8,d=.9;if(e||(e={}),e.log||(e.log=console.log),e.batch||(e.batch=100),e.write||(e.write=1),e.size||(e.size=1024*1024),e.memoryLimit||(e.memoryLimit=500),typeof e.cache>"u"&&(e.cache=!0),!e.store){e.log("Radisk needs `store` interface with `{get: fn, put: fn, list: fn}`");return}if(!e.store.get){e.log("Radisk needs `store.get` interface with `(file, cb)`");return}if(!e.store.put){e.log("Radisk needs `store.put` interface with `(file, data, cb)`");return}if(!e.store.list){e.log("Radisk needs a streaming `store.list` interface with `(cb)`");return}let b=(u,g,c,s)=>{let p=Date.now()-g;p>1e3&&console.log(`[RADISK-SLOW] ${u}: ${p}ms for ${c}${s?` (${s} bytes)`:""}`)},x=()=>{if(typeof process>"u"||!process.memoryUsage)return;let u=Date.now();if(u-m<a)return;m=u;let g=process.memoryUsage(),c=g.heapUsed,s=g.heapTotal,p=e.memoryLimit*1024*1024,k=c/p;if(k>d){let y=r.size;console.log(`[RADISK-MEMORY] High memory usage: ${Math.round(k*100)}% of heap limit. Clearing ${y} cached files.`),r.clear(),global.gc&&global.gc(),m=u+a}else k>l&&console.log(`[RADISK-MEMORY] Memory warning: ${Math.round(k*100)}% of heap limit used. Cache size: ${r.size} files.`)},i=(u,g,c)=>{if(u=""+u,typeof g=="function"){if(c=g,g=i.batch(u),typeof g<"u"||i.thrash.at&&(g=i.thrash.at(u),typeof g<"u"))return c(t,g);if(h.has(u)){h.get(u).push(c);return}h.set(u,[c]);let s=Date.now();return i.read(u,(p,k)=>{b("read",s,u);let y=h.get(u)||[];h.delete(u),y.forEach(w=>w(p,k))})}if(i.batch(u,g),x(),c&&i.batch.acks.push(c),++i.batch.ed>=e.batch)return i.thrash();clearTimeout(i.batch.timeout),i.batch.timeout=setTimeout(i.thrash,e.write)};return i.batch=K(),i.batch.acks=[],i.batch.ed=0,i.thrash=()=>{if(i.thrash.ing)return i.thrash.more=!0;let u=Date.now();clearTimeout(i.batch.timeout),i.thrash.more=!1,i.thrash.ing=!0;var g=i.thrash.at=i.batch;i.batch=null,i.batch=K(),i.batch.acks=[],i.batch.ed=0;let c=0;i.save(g,s=>{++c>1||(b("thrash",u,`batch-${g.ed}`),s&&e.log(s),g.acks.forEach(p=>p(s)),i.thrash.at=null,i.thrash.ing=!1,i.thrash.more&&i.thrash())})},i.save=(u,g)=>{let c={find:(s,p)=>{if(!(p<c.start))return c.start=p,e.store.list(c.lex),!0},lex:s=>{!s||s>c.start?(c.end=s,c.start&&c.mix(c.file||"!",c.start,c.end)):c.file=s},mix:(s,p,k)=>{if(c.start=c.end=c.file=t,r.has(s)){let y=r.get(s);K.map(u,(w,A)=>{if(!(A<p)){if(k&&k<A){c.start=A;return}y(A,w)}}),i.write(s,y,c.next)}else i.parse(s,(y,w)=>{if(y)return g(y);K.map(u,(A,j)=>{if(!(j<p)){if(k&&k<j){c.start=j;return}w(j,A)}}),i.write(s,w,c.next)})},next:s=>{if(s)return g(s);if(c.start)return K.map(u,c.find);g(s)}};K.map(u,c.find)},i.write=(u,g,c)=>{let s={text:"",limit:"",done:!1,count:0,each:(k,y,w,A)=>{if(s.done)return;s.count++,k=typeof k>"u"?"":"="+te.encode(k);let j=te.encode(A.length)+"#"+te.encode(w)+k+`
2
2
  `;if(s.count>1&&A.length===0&&s.text.length+j.length>e.size){let S=w.indexOf(je);if(s.limit=S===-1?w:w.substring(0,S),s.limit!==u){s.done=!0,s.sub=K(),K.map(g,s.slice),i.write(s.limit,s.sub,c);return}}s.text+=j},slice:(k,y)=>{y<s.limit||s.sub(y,k)}};K.map(g,s.each,!0);let p=Date.now();e.store.put(u,s.text,k=>{b("file-write",p,u,s.text.length),c(k)})},i.read=(u,g)=>{let c=u.indexOf(je),s=c===-1?u:u.substring(0,c),p={lex:y=>{if(!y){if(!p.file){g("no file found",t);return}if(e.cache&&r.has(p.file)){let w=r.get(p.file);return p.value=w(u),g(t,p.value)}i.parse(p.file,p.it);return}y>s||y<p.file||(p.file=y)},it:(y,w)=>{y&&e.log(y),w&&(e.cache&&(r.set(p.file,w),x()),p.value=w(u)),g(y,p.value)}},k=Date.now();if(e.cache&&n&&k-o<f)n.forEach(y=>p.lex(y)),p.lex();else{let y=[],w=p.lex;p.lex=A=>(A&&y.push(A),w(A)),e.store.list(A=>{p.lex(A),!A&&e.cache&&(n=y,o=k)})}},i.parse=(u,g)=>{let c={disk:K(),read:(s,p)=>{if(s)return g(s);if(!p)return g(t,c.disk);let k=[],y="",w=c.split(p);for(;w;){let A,j,S=w[1];w=c.split(w[2])||"",w[0]==="#"&&(A=w[1],S<k.length&&(k.length=S),S<=k.length&&(k[S]=A,k.length=S+1),y=k.join("")),w=c.split(w[2])||"",w[0]!==`
3
3
  `&&(w[0]==="="&&(j=w[1]),typeof A<"u"&&typeof j<"u"&&c.disk(y,j),w=c.split(w[2]))}g(t,c.disk)},split:s=>{if(!s)return;let p=s.indexOf(U);if(p===-1)return;let k=s.slice(0,p),y={};return[k,te.decode(s.slice(p),y),s.slice(p+y.i)]}};e.store.get(u,c.read)},i};te.encode=e=>{let t="";if(e instanceof Array&&e.length===2&&(t=Oe+e[1],e=e[0]),typeof e=="string"){let n=0,o=null,f=U;for(;o=e[n++];)o===U&&(f+=U);return f+'"'+e+t+U}let r=M.is(e);if(r)return U+"#"+r+t+U;if(ue.is(e))return U+"+"+(e||0)+t+U;if(e===!0)return U+"+"+t+U;if(e===!1)return U+"-"+t+U;if(e===null)return U+" "+t+U};te.decode=(e,t)=>{var r=-1,n=0,o=null,f=null,h=-1,m=-1;if(e[0]!==U)return;for(;o=e[++r];)if(f){if(h===-1&&(h=r),o===U&&--n<=0){m=r;break}}else o===U?n++:f=o||!0;let a=h!==-1?e.slice(h,m!==-1?m:r):"";t&&(t.i=r+1);let[l,d]=a.split(Oe);if(d){if(d=parseFloat(d),f==='"')return[l,d];if(f==="#")return[M.ify(l),d];if(f==="+")return l.length===0?[!0,d]:[parseFloat(l),d];if(f==="-")return[!1,d];if(f===" ")return[null,d]}else{if(f==='"')return a;if(f==="#")return M.ify(a);if(f==="+")return a.length===0?!0:parseFloat(a);if(f==="-")return!1;if(f===" ")return null}};var _e=te;var Ne=typeof document>"u",Z=Ne?await import("node:fs"):void 0,Ie="",pe="",be=pe+"+0"+pe+"#"+pe+'"root'+pe,ze=e=>{let t=e.file;if(Ne)return Z.existsSync(t)||Z.mkdirSync(t),Z.existsSync(t+"/!")||Z.writeFileSync(t+"/!",be),{get:(r,n)=>{Z.readFile(t+"/"+r,(o,f)=>{if(o){if(o.code==="ENOENT"){n();return}console.log("fs.readFile error:",o)}f&&(f=f.toString()),n(o,f)})},put:(r,n,o)=>{var f=r+"."+N.random(9)+".tmp";Z.writeFile(f,n,h=>{if(h){console.log("fs.writeFile error:",h),o(h);return}Z.rename(f,t+"/"+r,o)})},list:r=>{Z.readdir(t,(n,o)=>{if(n){console.log("fs.readdir error:",n),r();return}o.forEach(r),r()})}};if(e.indexedDB){let r,n=indexedDB.open(t,1);return n.onupgradeneeded=o=>{o.target.result.createObjectStore(t)},n.onerror=o=>{console.log(o)},n.onsuccess=()=>{if(r=n.result,r){let f=r.transaction([t],"readonly").objectStore(t).getKey("!");f.onerror=()=>{console.log(`error getting key ${t}/!`)},f.onsuccess=()=>{if(!f.result){let m=r.transaction([t],"readwrite").objectStore(t).put(be,"!");m.onerror=()=>{console.log(`error putting root on ${t}/!`)}}}}else console.log("error indexedDB not available")},{get:(o,f)=>{let h=(l,d)=>{let x=r.transaction([t],"readonly").objectStore(t).get(l);x.onerror=()=>{console.log(`error getting ${t}/${l}`)},x.onsuccess=()=>{d(null,x.result)}};if(r){h(o,f);return}let m=0,a=setInterval(()=>{if(r){clearInterval(a),h(o,f);return}m++>5&&(clearInterval(a),f("error indexedDB not available"))},1e3)},put:(o,f,h)=>{let m=(d,b,x)=>{let u=r.transaction([t],"readwrite").objectStore(t).put(b,d);u.onerror=()=>{console.log(`error putting data on ${t}/${d}`)},u.onsuccess=()=>{x(null)}};if(r){m(o,f,h);return}let a=0,l=setInterval(()=>{if(r){clearInterval(l),m(o,f,h);return}a++>5&&(clearInterval(l),h("error indexedDB not available"))},1e3)},list:o=>{let f=a=>{let d=r.transaction([t],"readonly").objectStore(t).getAllKeys();d.onerror=()=>console.log("error getting keys for",t),d.onsuccess=()=>{d.result.forEach(a),a()}};if(r){f(o);return}let h=0,m=setInterval(()=>{if(r){clearInterval(m),f(o);return}h++>5&&(clearInterval(m),console.log("error indexedDB not available"),o())},1e3)}}}return{get:(r,n)=>{n(null,be)},put:(r,n,o)=>{o(null)},list:r=>{r("!"),r()}}},Xe=e=>{L.is(e)||(e={}),e.file=String(e.file||"radata"),e.store||(e.store=ze(e));let t=_e(e);return{get:(r,n)=>{if(!r||!L.is(r)){n("lex required");return}if(!r["#"]){n("soul required in lex");return}var o=r["#"],f=typeof r["."]=="string"?r["."]:"",h;let m=(a,l)=>{V(r["."],l)&&(h||(h={_:{"#":o,">":{}}}),h[l]=a[0],h._[">"][l]=a[1])};t(o+Ie+f,(a,l)=>{let d;L.is(l)?(K.map(l,m),h||m(l,f),d={[o]:h}):l&&(m(l,f),d={[o]:h}),n(a,d)})},put:(r,n)=>{if(!r){n("graph required");return}let o=0,f=!1,h=m=>{if(o--,!f){if(m){f=!0,n(m);return}o===0&&(f=!0,n(null))}};Object.keys(r).forEach(m=>{var a=r[m];Object.keys(a).forEach(l=>{if(l==="_")return;o++;let d=a[l],b=a._[">"][l];t(m+Ie+l,[d,b],h)})})}}},Re=Xe;var Me=typeof document>"u",De=Me?await import("ws"):void 0;typeof globalThis.WebSocket>"u"&&(globalThis.WebSocket=De?.WebSocket);var Qe=e=>{let t=new Map,r=e.maxRequestsPerMinute||100,n=e.rateLimitWindow||6e4,o=e.disconnectThreshold||10,f=e.wss&&e.wss.constructor.name==="Server",h=null;return f||(h=setInterval(()=>{let a=Date.now();for(let[l,d]of t.entries())a-d.lastCleanup>n&&(d.requests=[],d.lastCleanup=a),d.requests=d.requests.filter(b=>a-b<n),a-d.lastCleanup>n*10&&(d.throttleCount=0)},n/4)),{getDelay:a=>{let l=Date.now(),d=t.get(a)||{requests:[],lastCleanup:l,throttleCount:0};if(d.requests=d.requests.filter(b=>l-b<n),d.requests.length>=r){let b=Math.min(...d.requests),x=n-(l-b);return d.throttleCount=(d.throttleCount||0)+1,t.set(a,d),Math.max(0,x)}return d.requests.push(l),t.set(a,d),0},getRemainingRequests:a=>{let l=t.get(a);if(!l)return r;let d=Date.now(),b=l.requests.filter(x=>d-x<n);return Math.max(0,r-b.length)},getThrottleCount:a=>{let l=t.get(a);return l&&l.throttleCount||0},shouldDisconnect:a=>{let l=t.get(a);return l?l.throttleCount>=o:!1},destroy:()=>{h&&(clearInterval(h),h=null),t.clear()}}},Ye=(e,t=1024*1024)=>{try{if(typeof e=="string"&&e.length>t)throw new Error("Message too large");return{success:!0,data:JSON.parse(e)}}catch(r){return{success:!1,error:r.message}}},Ze=(e,t=1024*1024)=>typeof e=="string"&&e.length>t?{valid:!1,error:"Message too large"}:Buffer.isBuffer(e)&&e.length>t?{valid:!1,error:"Message too large"}:{valid:!0},Ve=(e=1e3)=>{let t=new Set;return{add:r=>{if(t.size>=e)return!1;t.add(r);let n=r.close;return r.close=(...o)=>(t.delete(r),n.apply(r,o)),!0},remove:r=>{t.delete(r)},count:()=>t.size,isFull:()=>t.size>=e}},Se=(e=5)=>{let t=0;return{shouldRetry:()=>t<e,getDelay:()=>Math.min(1e3*Math.pow(2,t),3e4),increment:()=>t++,reset:()=>t=0}},et=e=>{let t=Ee(e.maxAge),r=Re(e),n={},o={},f={},h=new Set,m=async S=>n[S]?!0:new Promise(T=>{r.get({"#":S},(v,E)=>{T(!v&&E&&E[S])})}),a=Qe(e),l=Ve(e.maxConnections||1e3),d=async(S,T,v)=>{for(let E of Object.keys(S)){let C=await new Promise(O=>{i({"#":E},O,T)});if(C.err)return v&&v(C.err),!1;let $=S[E],_=B;if(!(!C.put||!C.put[E]||C.put[E][_]===$[_]))return v&&v(`error in wire check public key does not match for soul: ${E}`),!1}return!0},b=(S,T)=>{let v=he(S.get,n);v?T(JSON.stringify({"#":t.track(N.random(9)),"@":S["#"],put:v})):r.get(S.get,(E,C)=>{T(JSON.stringify({"#":t.track(N.random(9)),"@":S["#"],put:C,err:E}))})},x=async(S,T)=>{let v=await we.mix(S.put,n,e.secure,f);if(Object.keys(v.now).length){if(!await d(v.now,T))return;r.put(v.now,E=>{T(JSON.stringify({"#":t.track(N.random(9)),"@":S["#"],err:E}))})}Object.keys(v.defer).length&&setTimeout(()=>x({put:v.defer},T),v.wait)},i=(S,T,v,E)=>{if(!T)return;L.is(E)||(E={});let C=he(S,n),$=N.random(9),_=JSON.stringify({"#":t.track($),get:e.secure?{"#":S["#"]}:S});if(C){let O=v(_);if(O&&O.err){T({err:O.err});return}T({put:C});return}r.get(S,(O,P)=>{if(P){let R=v(_);if(R&&R.err){T({err:R.err});return}T({put:P,err:O});return}O&&console.log(O),o[$]=T;let I=v(_);if(I&&I.err){T({err:I.err}),delete o[$];return}setTimeout(()=>{let R=o[$];if(R){let G=S["#"],z={[G]:null};typeof S["."]=="string"&&(z[G]={[S["."]]:null}),R({put:z}),delete o[$]}},E.wait||100)})},u=S=>({get:(T,v,E)=>{T&&T["#"]&&h.add(T["#"]),i(T,v,S,E)},put:async(T,v)=>{let E=await we.mix(T,n,e.secure,f);if(Object.keys(E.now).length===0){v(null);return}if(!await d(E.now,S,v))return;for(let[_,O]of Object.entries(E.now))if(O&&typeof O=="object")for(let[P,I]of Object.entries(O)){let R=M.is(I);R&&h.add(R)}r.put(E.now,v);let $=S(JSON.stringify({"#":t.track(N.random(9)),put:T}));if($&&$.err){v&&v($.err);return}},on:(T,v,E,C)=>{let $=T&&T["#"];!$||!v||(f[$]?f[$].push({".":T["."],cb:v}):f[$]=[{".":T["."],cb:v}],E&&i(T,v,S,C))},off:(T,v)=>{let E=T&&T["#"];if(!(!E||!f[E]))if(v){let C=f[E].find($=>$.cb===v);C&&f[E].splice(f[E].indexOf(C),1)}else delete f[E]}});if(Me){let S=e.wss,T=()=>S.clients();if(!S){let E=e.server?{server:e.server}:{port:e.port||8765};S=new De.WebSocketServer(E),T=()=>S.clients}let v=(E,C)=>{T().forEach($=>{if($&&$.readyState===WebSocket.OPEN)$.send(E,{binary:C});else{let _=$._retryHandler||Se();if($._retryHandler=_,_.shouldRetry()){let O=_.getDelay();_.increment(),setTimeout(()=>{$&&$.readyState===WebSocket.OPEN&&(_.reset(),$.send(E,{binary:C}))},O)}}})};return S.on("connection",E=>{if(!l.add(E)){console.log("Connection limit reached, rejecting connection"),E.close(1013,"Connection limit reached - try again later");return}let C=N.random(9);console.log(`[HOLSTER-CONNECT] New WebSocket client connected: ${C}`),E.on("error",$=>{console.log("WebSocket error:",$),l.remove(E)}),E.on("close",()=>{console.log(`[HOLSTER-DISCONNECT] WebSocket client disconnected: ${C}`),l.remove(E)}),E.on("message",($,_)=>{let O=Ze($,e.maxMessageSize);if(!O.valid){console.warn(`Invalid message: ${O.error}`),E.send(JSON.stringify({error:O.error}));return}let P=Ye($,e.maxMessageSize);if(!P.success){console.warn(`JSON parse error: ${P.error}`),E.send(JSON.stringify({error:"Invalid JSON"}));return}let I=P.data;if(t.check(I["#"]))return;let R=a.getDelay(C);if(R>0){let z=a.getThrottleCount(C);if(console.log(`[HOLSTER-THROTTLE] Client ${C}: rate limit exceeded, delay would be ${R}ms, dropping message (throttle count: ${z})`),a.shouldDisconnect(C)){console.log(`[HOLSTER-DISCONNECT] Client ${C}: Disconnecting bad actor after ${z} throttle violations`),E.close(1008,"Rate limit violations - bad actor");return}E.send(JSON.stringify({"#":t.track(N.random(9)),"@":I["#"],err:`Rate limit exceeded. Slow down requests. Wait ${Math.ceil(R/1e3)}s`,throttle:R}));return}let G=()=>{t.track(I["#"]),I.get&&b(I,v),I.put&&x(I,v),v($,_);let z=I["@"],se=o[z];se&&(delete I["#"],delete I["@"],se(I),delete o[z])};R>0?setTimeout(G,R):G()})}),u(v)}let g=[],c=!1,s=0,p=[],k=null,y=e.maxQueueLength||1e3,w=()=>{if(p.length===0){k=null;return}let S=Date.now();if(c&&S<s){k=setTimeout(w,Math.min(1e3,s-S));return}c&&S>=s&&(console.log("[CLIENT-THROTTLED] Throttle period ended, resuming queue processing"),c=!1,s=0);let T=p.shift();A(T),p.length>0?k=setTimeout(w,100):k=null},A=S=>{g.forEach(T=>{if(T&&T.readyState===WebSocket.OPEN)T.send(S);else{let v=T._retryHandler||Se();if(T._retryHandler=v,v.shouldRetry()){let E=v.getDelay();v.increment(),setTimeout(()=>{T&&T.readyState===WebSocket.OPEN&&(v.reset(),T.send(S))},E)}}})},j=S=>{if(c||p.length>0){if(p.length>=y)return{err:`Message queue exceeded maximum length (${y}). Update query logic to request less data.`,queueLength:p.length,maxQueueLength:y};p.push(S),console.log(`Queuing message (queue length: ${p.length}/${y})`),k||(k=setTimeout(w,100));return}A(S)};return e.peers instanceof Array||(e.peers=[`ws://localhost:${e.port||8765}`]),e.peers.forEach(S=>{let T=()=>{let v=new WebSocket(S);g.push(v);let E=Se();v.onclose=C=>{if(g.indexOf(v)!==-1&&g.splice(g.indexOf(v),1),v=null,E.shouldRetry()){let $=E.getDelay();E.increment(),setTimeout(T,$)}},v.onopen=()=>{E.reset()},v.onerror=C=>{console.log(C)},v.onmessage=async C=>{let $=JSON.parse(C.data);if(t.check($["#"]))return;if($.throttle&&$.err){console.log(`[CLIENT-THROTTLED] Server throttling: ${$.err}`),c=!0,s=Date.now()+$.throttle;return}if(t.track($["#"]),$.get&&b($,j),$.put){let P={};for(let[I,R]of Object.entries($.put)){let G=!1;if(await m(I)&&(G=!0,R&&typeof R=="object"))for(let[z,se]of Object.entries(R)){let ve=M.is(se);ve&&h.add(ve)}h.has(I)&&(G=!0,h.delete(I)),G&&(P[I]=R)}Object.keys(P).length>0&&x({put:P},j)}j(C.data);let _=$["@"],O=o[_];O&&(delete $["#"],delete $["@"],O($),delete o[_])}};T()}),u(j)},de=et;var tt=(e,t)=>{t||(t=de(e));let r=[],n=!1,o=!1,f=0,h=(a,l,d,b)=>{let x=c=>{f++,h(c,l,d,b)},i=c=>{r=[],f=0,o=!1,b(c)},u=()=>{if(r.length===0){i("Wrong username or password");return}let c=r.shift();t.get({"#":c},async s=>{if(s.err){i(`error getting ${c}: ${s.err}`);return}let p=s.put&&s.put[c];if(!p||!p.auth)return u();let k=JSON.parse(p.auth),y=await H.work(l,k.salt),w=await H.decrypt(k.enc,y);if(!w)return u();if(m.is={username:a,pub:p.pub,epub:p.epub,priv:w.priv,epriv:w.epriv},d!==""){let A=N.random(64),j=await H.work(d,A),S=await H.encrypt(w,j),T={username:a,pub:p.pub,epub:p.epub,auth:JSON.stringify({enc:S,salt:A})},v=await H.sign(T,m.is),E=X(c,v.m,v.s,p.pub);t.put(E,C=>{i(C?`error putting ${T} on ${c}: ${C}`:null)});return}return i(null)},{wait:1e3})};if(f>9){i("Wrong username or password");return}let g="~@"+a;t.get({"#":g},async c=>{if(c.err){i(`error getting ${g}: ${c.err}`);return}let s=c.put&&c.put[g];if(!s)return x(a);delete c.put[g]._,r=Object.keys(s),u()},{wait:1e3})},m={create:(a,l,d)=>{let b=i=>{d?d(i):console.log(i)};if(n){b("User is already being created");return}if(a===""){b("Please provide a username");return}if(l===""){b("Please provide a password");return}n=!0;let x="~@"+a;t.get({"#":x},async i=>{if(i.err){n=!1,b(`error getting ${x}: ${i.err}`);return}if(i.put&&i.put[x]){n=!1,b("Username already exists");return}let u=N.random(64),g=await H.work(l,u),c=await H.pair(),s={priv:c.priv,epriv:c.epriv},p=await H.encrypt(s,g),k={username:a,pub:c.pub,epub:c.epub,auth:JSON.stringify({enc:p,salt:u})},y="~"+c.pub,w=await H.sign(k,c),A=X(y,w.m,w.s,c.pub);t.put(A,j=>{if(n=!1,j){b(`error putting ${k} on ${y}: ${j}`);return}let S={[y]:{"#":y}};t.put(X(x,S),T=>{if(T){b(`error putting ${S} on ${x}: ${T}`);return}d&&d(null)})})},{wait:1e3})},auth:(a,l,d)=>{let b=x=>{d?d(x):x&&console.log(x)};if(o){b("User is already authenticating");return}if(m.is=null,a===""){b("Please provide a username");return}if(l===""){b("Please provide a password");return}o=!0,h(a,l,"",b)},change:(a,l,d,b)=>{let x=i=>{b?b(i):i&&console.log(i)};if(o){x("User is already authenticating");return}if(m.is=null,a===""){x("Please provide a username");return}if(l===""){x("Please provide a password");return}if(d===""){x("Please provide a new password");return}o=!0,h(a,l,d,x)},store:a=>{if(!m.is){console.log("Please authenticate before calling store");return}if(a){typeof globalThis.localStorage<"u"&&globalThis.localStorage.setItem("user.is",JSON.stringify(m.is)),typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.removeItem("user.is");return}typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.setItem("user.is",JSON.stringify(m.is)),typeof globalThis.localStorage<"u"&&globalThis.localStorage.removeItem("user.is")},recall:()=>{if(typeof globalThis.localStorage<"u"){let a=globalThis.localStorage.getItem("user.is");if(a){m.is=JSON.parse(a);return}}if(typeof globalThis.sessionStorage<"u"){let a=globalThis.sessionStorage.getItem("user.is");a&&(m.is=JSON.parse(a))}},leave:()=>{m.is=null,typeof globalThis.localStorage<"u"&&globalThis.localStorage.removeItem("user.is"),typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.removeItem("user.is")},delete:(a,l,d)=>{let b=x=>{d?d(x):console.log(x)};if(o){b("User is already authenticating");return}if(a===""){b("Please provide a username");return}if(l===""){b("Please provide a password");return}o=!0,h(a,l,"",async x=>{if(x){b(x);return}let i={username:null,pub:null,epub:null,auth:null},u=await H.sign(i,m.is),g="~"+m.is.pub,c=X(g,u.m,u.s,m.is.pub);t.put(c,s=>{if(s){b(`error putting null on ${g}: ${s}`);return}m.is=null,d&&d(null)})})}};return m},Le=tt;var rt=e=>{typeof e=="string"?e={peers:[e]}:e instanceof Array?e={peers:e}:L.is(e)||(e={});let t=de(e),r=Le(null,t),n=new Map,o=new Map,f=a=>a===null||a===!0||a===!1||typeof a=="string"||M.is(a)||ue.is(a),h=a=>{if(f(a))return!0;if(L.is(a)){let d=[];for(let[b,x]of Object.entries(a)){if(b==="_")return"error underscore cannot be used as a property name";if(L.is(x)||f(x)){d.push(b);continue}return typeof x>"u"?`error undefined ${b} cannot be converted to a graph`:`error ${JSON.stringify({[b]:x})} cannot be converted to a graph`}if(d.length!==0)return d}return`error ${JSON.stringify(a)} cannot be converted to a graph`},m=a=>{let l=(i,u,g,c)=>{t.get(L.put(i,"#",u),async s=>{if(s.err&&console.log(s.err),s.put&&s.put[u]){delete s.put[u]._,delete s.put[u][B],delete s.put[u][q];for(let p of Object.keys(s.put[u])){let k=M.is(s.put[u][p]);if(k){let y=await new Promise(w=>{let A=N.random();o.set(A,{chain:[{item:null,soul:k}]}),m(A).next(null,w,c)});s.put[u][p]=y}}g(s.put[u])}else g(null)},c)},d=async(i,u,g,c)=>{if(g){let s=await H.sign(u,g);return X(i,s.m,s.s,g.pub)}return e.secure?(c||(c=console.log),c(`error putting data on ${i}: user required in secure mode`),null):X(i,u)},b=i=>u=>{let g=o.get(i);g&&typeof g.cb<"u"?setTimeout(()=>g.cb(u),1):u&&console.log("error no callback for data",u,"ctx",g),g&&!g.on&&o.delete(i)},x=(i,u)=>{if(!i){console.log("error resolve request parameter required");return}let g=typeof i.get<"u",c=typeof i.put<"u",s=typeof i.on<"u",p=typeof i.off<"u",k=!1,y=o.get(a);for(var w=1;w<y.chain.length;w++)if(y.chain[w].soul===null){k=!0;break}if(k){let{item:A,soul:j}=y.chain[w-1],S=y.user||e.secure?{"#":j}:{"#":j,".":A};return t.get(S,async T=>{if(T.err){y.user||e.secure?console.log(`error getting ${j}: ${T.err}`):console.log(`error getting ${A} on ${j}: ${T.err}`),u&&u(null);return}let v=T.put&&T.put[j];if(v&&typeof v[A]<"u"){let E=M.is(v[A]);if(E)y.chain[w].soul=E,o.set(a,{...y}),g?m(a).next(null,i.get,u,i._opt):c?m(a).put(i.put,u):s?m(a).on(i.on,u,i._get,i._opt):p&&m(a).off(u);else if(g)u(v[A]);else if(c){E=N.random(),v[A]=M.ify(E);let C=await d(j,v,y.user,u);if(C===null)return;t.put(C,$=>{if($){u(`error putting ${A} on ${j}: ${$}`);return}y.chain[w].soul=E,m(a).put(i.put,u)})}else(s||p&&u)&&u(null)}else if(c){let E=N.random();v||(v={}),v[A]=M.ify(E);let C=await d(j,v,y.user,u);if(C===null)return;t.put(C,$=>{if($){u(`error putting ${A} on ${j}: ${$}`);return}y.chain[w].soul=E,m(a).put(i.put,u)})}else u&&u(null)},i._opt),!1}return g&&y.chain[y.chain.length-1].item!==null?(y.chain.push({item:null,soul:null}),m(a).next(null,i.get,u,i._opt),!1):y.chain[y.chain.length-1]};return{get:(i,u,g,c)=>{if(typeof u=="function"&&(c=g,g=u,u=null),i===null||i===""||i==="_"){console.log("error please provide a key"),g&&g(null);return}if(u&&typeof g!="function"){console.log("error lex requires a callback function");return}if(a=N.random(),o.set(a,{chain:[{item:i,soul:"root"}],cb:g}),!g)return m(a);let s=b(a),{soul:p}=x({get:u,_opt:c},s);p&&l(u,p,s,c)},next:(i,u,g,c)=>{let s=w=>A=>{g?g(A):b(w)(A)};if(typeof u=="function"&&(c=g,g=u,u=null),!a){console.log("error please provide a key using get(key)"),g&&g(null);return}let p=s(a);if(i===""||i==="_"){p(null);return}if(u&&typeof g!="function"){console.log("error lex requires a callback function");return}let k=o.get(a);if(!k)return;if(g&&typeof k.cb>"u"&&(k.cb=g,g=null),i!==null&&k.chain.push({item:i,soul:null}),!k.cb)return m(a);let{soul:y}=x({get:u,_opt:c},p);y&&l(u,y,p,c)},put:(i,u,g)=>{typeof u=="function"&&(g=u,u=!1);let c=j=>S=>{g?g(S):b(j)(S)};if(!a){g&&g("error please provide a key using get(key)");return}let s=o.get(a);if(!s)return;if(!s.cb){if(!g)return;s.cb=g,g=null}u&&(i={[N.random()]:i});let p=c(a),k=h(i);if(typeof k=="string"){p(k);return}let{item:y,soul:w}=x({put:i},p);if(!w)return;if(k===!0){let j=s.user||e.secure?{"#":w}:{"#":w,".":y};t.get(j,async S=>{if(S.err){p(`error getting ${w}: ${S.err}`);return}let T=S.put&&S.put[w],v=T&&T[y],E=M.is(v);if(!E){T||(T={}),T[y]=i;let C=await d(w,T,s.user,p);if(C===null)return;t.put(C,p);return}t.get({"#":E},async C=>{if(C.err){p(`error getting ${E}: ${C.err}`);return}if(!C.put||!C.put[E]){p(`error ${E} not found`);return}for(let _ of Object.keys(C.put[E])){if(_==="_"||_===B||_===q)continue;let O=await new Promise(P=>{let I=N.random(),R=[{item:_,soul:E}];o.set(I,{chain:R,user:s.user}),m(I).put(null,P)});if(O){p(O);return}}T||(T={}),T[y]=i;let $=await d(w,T,s.user,p);$!==null&&t.put($,p)})});return}let A=s.user||e.secure?{"#":w}:{"#":w,".":y};t.get(A,async j=>{if(j.err){p(`error getting ${w}.${y}: ${j.err}`);return}let S=j.put&&j.put[w],T=S&&S[y],v=M.is(T);if(!v){S||(S={}),S[y]=M.ify(N.random());let C=await d(w,S,s.user,p);if(C===null)return;t.put(C,$=>{if($)p(`error putting ${y} on ${w}: ${$}`);else{let _=N.random(),O=[{item:y,soul:w}];o.set(_,{chain:O,user:s.user,cb:s.cb}),m(_).put(i)}});return}let E=[];for(let C of k){let $=await new Promise(_=>{if(L.is(i[C])&&!M.is(i[C])){let O=N.random(),P=[{item:C,soul:v}];o.set(O,{chain:P,user:s.user}),m(O).put(i[C],_)}else E.push(C),_(null)});if($){p($,a);return}}if(E.length===0){p(null);return}t.get({"#":v},async C=>{if(C.err){p(`error getting ${v}: ${C.err}`);return}let $=C.put&&C.put[v];$||($={}),E.forEach(O=>{$[O]=i[O]});let _=await d(v,$,s.user,p);_!==null&&t.put(_,p)})})},on:(i,u,g,c)=>{if(typeof i=="function"&&(c=g,g=u,u=i,i=null),typeof u!="function"){console.log("error on() requires a callback function");return}if(!a){console.log("error please provide a key using get(key)"),u(null);return}let{item:s,soul:p}=x({on:i,_get:g,_opt:c},u);p&&(o.set(a,{chain:[{item:s,soul:p}],on:!0}),n.set(u,()=>m(a).next(null,u,c)),t.get({"#":p,".":s},k=>{if(k.err){console.log(`error getting ${p}.${s}: ${k.err}`);return}let y=k.put&&k.put[p]&&k.put[p][s],w=M.is(y);w?i?i=L.put(i,"#",w):i={"#":w,".":null}:i?i=L.put(i,"#",p):i={"#":p,".":s},t.on(i,n.get(u),g,c)},c))},off:i=>{if(!a){console.log("error please provide a key using get(key)"),i&&i(null);return}let{item:u,soul:g}=x({off:!0},i);g&&t.get({"#":g,".":u},c=>{if(c.err){console.log(`error getting ${g}.${u}: ${c.err}`);return}let s=c.put&&c.put[g]&&c.put[g][u],p=M.is(s);p?t.off({"#":p},n.get(i)):t.off({"#":g},n.get(i)),n.delete(i),o.delete(a)})},user:()=>(r.get||(Object.assign(r,m()),r.get=(i,u,g,c)=>{typeof u=="function"&&(c=g,g=u,u=null);let s=null,p=null;if(r.is&&(s=r.is.pub),typeof i=="string"?p=i:i instanceof Array&&(i.length===2?(s=i[0],p=i[1]):i.length===1&&(p=i[0])),!s){console.log("error please log in or provide a public key"),g&&g(null);return}if(p===null||p===""||p==="_"){console.log("error please provide a key"),g&&g(null);return}if(u&&!g){console.log("error lex requires a callback function");return}a=N.random();let k=[{item:p,soul:"~"+s}];if(o.set(a,{chain:k,user:r.is,cb:g}),!g)return m(a);let y=b(a),{soul:w}=x({get:u,_opt:c},y);w&&l(u,w,y,c)}),r),wire:t,SEA:H}};return m()},It=rt;export{It as default};
4
4
  //# sourceMappingURL=holster.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/utils.js", "../src/dup.js", "../src/get.js", "../src/array.js", "../src/buffer.js", "../src/sea-utils.js", "../src/sea.js", "../src/ham.js", "../src/radix.js", "../src/radisk.js", "../src/store.js", "../src/wire.js", "../src/user.js", "../src/holster.js"],
4
- "sourcesContent": ["export const num = {\n is: n => {\n if (n instanceof Array) return false\n\n if (typeof n === \"number\") return !isNaN(n)\n\n if (typeof n === \"string\") {\n const parsed = parseFloat(n)\n return !isNaN(parsed) && isFinite(parsed)\n }\n\n return false\n },\n}\n\nexport const obj = {\n is: o => {\n if (!o || typeof o !== \"object\") return false\n\n const toString = Object.prototype.toString.call(o)\n const match = toString.match(/^\\[object (\\w+)\\]$/)\n return o.constructor === Object || (match && match[1] === \"Object\")\n },\n map: (list, cb, o) => {\n var keys = Object.keys(list)\n for (let i = 0; i < keys.length; i++) {\n let result = cb(list[keys[i]], keys[i], o)\n if (typeof result !== \"undefined\") return result\n }\n },\n put: (o, key, value) => {\n if (!o) o = {}\n o[key] = value\n return o\n },\n del: (o, key) => {\n if (!o) return\n\n o[key] = null\n delete o[key]\n return o\n },\n}\n\nconst map_soul = (soul, key, o) => {\n // If id is already defined AND we're still looping through the object,\n // then it is considered invalid.\n if (o.id) {\n o.id = false\n return\n }\n\n if (key === \"#\" && typeof soul === \"string\") {\n o.id = soul\n return\n }\n\n // If there exists anything else on the object that isn't the soul,\n // then it is considered invalid.\n o.id = false\n}\n\n// Check if an object is a soul relation, ie {'#': 'UUID'}\nexport const rel = {\n is: value => {\n if (value && value[\"#\"] && !value._ && obj.is(value)) {\n let o = {}\n obj.map(value, map_soul, o)\n if (o.id) return o.id\n }\n\n return false\n },\n // Convert a soul into a relation and return it.\n ify: soul => obj.put({}, \"#\", soul),\n}\n\nexport const userSignature = \"_holster_user_signature\"\nexport const userPublicKey = \"_holster_user_public_key\"\n\n// graph converts objects to graph format with updated states,\n// with optional meta data to verify signed data.\nexport const graph = (soul, data, sig, pub) => {\n const timestamp = Date.now()\n const g = {[soul]: {_: {\"#\": soul, \">\": {}}}}\n\n for (const [key, value] of Object.entries(data)) {\n if (key !== \"_\" && key !== userPublicKey && key !== userSignature) {\n g[soul][key] = value\n g[soul]._[\">\"][key] = timestamp\n }\n }\n // If a signature and public key are provided they also need to be stored on\n // the node to ensure that future updates are only possible with the same\n // public key. The signature is requried because later get requests will\n // broadcast the data as a put, which other devices will need to verify.\n if (sig && pub) {\n g[soul][userSignature] = sig\n g[soul]._[\">\"][userSignature] = timestamp\n g[soul][userPublicKey] = pub\n g[soul]._[\">\"][userPublicKey] = timestamp\n }\n return g\n}\n\nexport const match = (lex, key) => {\n // Null is used to match listeners on souls, which don't provide a key.\n if (typeof key === \"undefined\") return lex === null\n\n if (typeof lex === \"undefined\") return true\n\n if (typeof lex === \"string\") return lex === key\n\n if (!obj.is(lex) || !key) return false\n\n const prefix = lex[\"*\"]\n if (prefix) return key.slice(0, prefix.length) === prefix\n\n const gt = lex[\">\"]\n const lt = lex[\"<\"]\n if (gt && lt) return key >= gt && key <= lt\n\n if (gt) return key >= gt\n\n if (lt) return key <= lt\n\n return false\n}\n\nexport const text = {\n random: length => {\n var s = \"\"\n const c = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\n if (!length) length = 24\n for (let i = 0; i < length; i++) {\n s += c.charAt(Math.floor(Math.random() * c.length))\n }\n return s\n },\n}\n", "const Dup = maxAge => {\n // Allow maxAge to be passed in as tests wait on the setTimeout.\n if (!maxAge) maxAge = 9000\n const dup = {store: {}}\n dup.check = id => (dup.store[id] ? dup.track(id) : false)\n dup.track = id => {\n // Keep the liveliness of the message up while it is being received.\n dup.store[id] = Date.now()\n if (!dup.expiry) {\n dup.expiry = setTimeout(() => {\n if (dup.expiry) return\n\n const now = Date.now()\n Object.keys(dup.store).forEach(id => {\n if (now - dup.store[id] > maxAge) delete dup.store[id]\n })\n dup.expiry = null\n }, maxAge)\n }\n return id\n }\n return dup\n}\n\nexport default Dup\n", "import {match} from \"./utils.js\"\n\nconst Get = (lex, graph) => {\n if (!lex || typeof lex !== \"object\") {\n throw new TypeError(\"lex must be an object\")\n }\n if (!graph || typeof graph !== \"object\") {\n throw new TypeError(\"graph must be an object\")\n }\n\n const soul = lex[\"#\"]\n if (!soul || typeof soul !== \"string\") {\n throw new TypeError(\"soul must be a string\")\n }\n\n if (!graph[soul]) return\n\n const node = {_: {\"#\": soul, \">\": {}}}\n\n if (typeof lex[\".\"] === \"string\") {\n const key = lex[\".\"]\n if (typeof graph[soul][key] === \"undefined\") return\n\n node[key] = graph[soul][key]\n node._[\">\"][key] = graph[soul]._[\">\"][key]\n } else {\n for (const key of Object.keys(graph[soul])) {\n if (match(lex[\".\"], key)) {\n node[key] = graph[soul][key]\n node._[\">\"][key] = graph[soul]._[\">\"][key]\n }\n }\n }\n return {[soul]: node}\n}\n\nexport default Get\n", "if (typeof btoa === \"undefined\") {\n globalThis.btoa = data => Buffer.from(data, \"binary\").toString(\"base64\")\n globalThis.atob = data => Buffer.from(data, \"base64\").toString(\"binary\")\n}\n\n// This is Array extended to have .toString([\"utf8\"|\"hex\"|\"base64\"])\nfunction SeaArray() {}\nObject.assign(SeaArray, {from: Array.from})\nSeaArray.prototype = Object.create(Array.prototype)\n\nSeaArray.prototype.toString = function (enc, start, end) {\n if (!enc) enc = \"utf8\"\n if (!start) start = 0\n\n end = end ? Math.min(Math.max(end, start), this.length) : this.length\n\n if (enc === \"hex\") {\n const buf = new Uint8Array(this.slice(start, end))\n return Array.from(buf, byte => byte.toString(16).padStart(2, \"0\")).join(\"\")\n }\n\n if (enc === \"utf8\") {\n return Array.from({length: end - start}, (_, i) => {\n const charCode = this[i + start]\n // Use unicode replacement character for invalid character codes.\n if (charCode < 0 || charCode > 0x10ffff) {\n return String.fromCharCode(0xfffd)\n }\n return String.fromCharCode(charCode)\n }).join(\"\")\n }\n\n if (enc === \"base64\") {\n const utf8String = Array.from({length: end - start}, (_, i) => {\n const charCode = this[i + start]\n if (charCode < 0 || charCode > 255) {\n return String.fromCharCode(0xfffd)\n }\n return String.fromCharCode(charCode)\n }).join(\"\")\n return btoa(utf8String)\n }\n}\n\nexport default SeaArray\n", "import SeaArray from \"./array.js\"\n\n// Security constants\nconst SECURITY_LIMITS = {\n MAX_BUFFER_SIZE: 10 * 1024 * 1024, // 10MB limit\n MAX_STRING_LENGTH: 1024 * 1024, // 1MB string limit\n}\n\n// Secure Buffer implementation for SEA.js\n// Compatible with NodeJS safe-buffer but with enhanced security\nfunction SafeBuffer(...props) {\n console.warn(\"new SafeBuffer() is deprecated, please use SafeBuffer.from()\")\n return SafeBuffer.from(...props)\n}\n\nSafeBuffer.prototype = Object.create(Array.prototype)\n\n// Input validation helpers\nconst validateStringInput = (input, encoding) => {\n if (typeof input !== \"string\") {\n throw new TypeError(\"Input must be a string for encoding: \" + encoding)\n }\n\n if (input.length > SECURITY_LIMITS.MAX_STRING_LENGTH) {\n throw new RangeError(\n `String too large: ${input.length} > ${SECURITY_LIMITS.MAX_STRING_LENGTH}`,\n )\n }\n}\n\nconst validateBufferSize = (size, operation = \"buffer operation\") => {\n if (size > SECURITY_LIMITS.MAX_BUFFER_SIZE) {\n throw new RangeError(\n `Buffer size too large for ${operation}: ${size} > ${SECURITY_LIMITS.MAX_BUFFER_SIZE}`,\n )\n }\n}\n\n// Secure hex parsing\nconst parseHexString = hexString => {\n validateStringInput(hexString, \"hex\")\n\n // Remove any whitespace and convert to lowercase\n const cleanHex = hexString.replace(/\\s/g, \"\").toLowerCase()\n\n // Validate hex format: only 0-9, a-f characters\n if (!/^[0-9a-f]*$/.test(cleanHex)) {\n throw new TypeError(\"Invalid hex string: contains non-hex characters\")\n }\n\n // Must be even length\n if (cleanHex.length % 2 !== 0) {\n throw new TypeError(\"Invalid hex string: must have even length\")\n }\n\n if (cleanHex.length === 0) {\n return new Uint8Array(0)\n }\n\n validateBufferSize(cleanHex.length / 2, \"hex parsing\")\n\n const bytes = new Uint8Array(cleanHex.length / 2)\n for (let i = 0; i < cleanHex.length; i += 2) {\n const hexByte = cleanHex.substr(i, 2)\n bytes[i / 2] = parseInt(hexByte, 16)\n }\n return bytes\n}\n\nconst encodeUtf8String = str => {\n validateStringInput(str, \"utf8\")\n\n try {\n // Use standard TextEncoder for proper UTF-8 encoding\n const encoder = new TextEncoder()\n const bytes = encoder.encode(str)\n\n validateBufferSize(bytes.length, \"UTF-8 encoding\")\n return bytes\n } catch (err) {\n throw new TypeError(\"Failed to encode UTF-8 string: \" + err.message)\n }\n}\n\nconst encodeBinaryString = str => {\n validateStringInput(str, \"binary\")\n\n validateBufferSize(str.length, \"binary encoding\")\n\n const bytes = new Uint8Array(str.length)\n for (let i = 0; i < str.length; i++) {\n const charCode = str.charCodeAt(i)\n\n // Binary strings should only contain bytes (0-255)\n if (charCode > 255) {\n throw new TypeError(\n `Invalid binary string: character at position ${i} exceeds byte range (${charCode} > 255)`,\n )\n }\n\n bytes[i] = charCode\n }\n return bytes\n}\n\n// Secure base64 decoding\nconst parseBase64String = base64String => {\n validateStringInput(base64String, \"base64\")\n\n // Remove any whitespace\n const cleanBase64 = base64String.replace(/\\s/g, \"\")\n\n // Validate base64 format\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(cleanBase64)) {\n throw new TypeError(\"Invalid base64 string: contains invalid characters\")\n }\n\n try {\n const decodedString = atob(cleanBase64)\n validateBufferSize(decodedString.length, \"base64 decoding\")\n\n const bytes = new Uint8Array(decodedString.length)\n for (let i = 0; i < decodedString.length; i++) {\n bytes[i] = decodedString.charCodeAt(i)\n }\n\n return bytes\n } catch (err) {\n throw new TypeError(\"Failed to decode base64 string: \" + err.message)\n }\n}\n\n// Secure array-like input processing\nconst processArrayLikeInput = input => {\n let bytes\n\n if (input instanceof ArrayBuffer) {\n validateBufferSize(input.byteLength, \"ArrayBuffer processing\")\n bytes = new Uint8Array(input)\n } else if (ArrayBuffer.isView(input)) {\n validateBufferSize(\n input.byteLength || input.length,\n \"TypedArray processing\",\n )\n bytes = new Uint8Array(input.buffer, input.byteOffset, input.byteLength)\n } else if (Array.isArray(input)) {\n validateBufferSize(input.length, \"Array processing\")\n\n // Validate all array elements are valid byte values\n for (let i = 0; i < input.length; i++) {\n const val = input[i]\n if (\n typeof val !== \"number\" ||\n val < 0 ||\n val > 255 ||\n !Number.isInteger(val)\n ) {\n throw new TypeError(\n `Invalid byte value at index ${i}: ${val} (must be integer 0-255)`,\n )\n }\n }\n\n bytes = new Uint8Array(input)\n } else if (\n typeof input === \"object\" &&\n input !== null &&\n typeof input.length === \"number\"\n ) {\n // Handle array-like objects\n validateBufferSize(input.length, \"array-like processing\")\n\n const arr = Array.from(input)\n for (let i = 0; i < arr.length; i++) {\n const val = arr[i]\n if (\n typeof val !== \"number\" ||\n val < 0 ||\n val > 255 ||\n !Number.isInteger(val)\n ) {\n throw new TypeError(\n `Invalid byte value at index ${i}: ${val} (must be integer 0-255)`,\n )\n }\n }\n\n bytes = new Uint8Array(arr)\n } else {\n throw new TypeError(\"Unsupported input type: \" + typeof input)\n }\n\n return bytes\n}\n\nObject.assign(SafeBuffer, {\n from() {\n const argCount = arguments.length\n\n if (argCount === 0) {\n throw new TypeError(\"SafeBuffer.from() requires at least one argument\")\n }\n\n const input = arguments[0]\n\n if (input === null || input === undefined) {\n throw new TypeError(\"First argument must not be null or undefined\")\n }\n\n let bytes\n\n if (typeof input === \"string\") {\n const encoding = (arguments[1] || \"utf8\").toLowerCase()\n\n switch (encoding) {\n case \"hex\":\n bytes = parseHexString(input)\n break\n\n case \"utf8\":\n case \"utf-8\":\n bytes = encodeUtf8String(input)\n break\n\n case \"binary\":\n case \"latin1\":\n bytes = encodeBinaryString(input)\n break\n\n case \"base64\":\n bytes = parseBase64String(input)\n break\n\n case \"ascii\":\n // ASCII is subset of UTF-8, but validate range\n validateStringInput(input, \"ascii\")\n for (let i = 0; i < input.length; i++) {\n if (input.charCodeAt(i) > 127) {\n throw new TypeError(\n `Invalid ASCII character at position ${i}: ${input.charCodeAt(i)} > 127`,\n )\n }\n }\n bytes = encodeUtf8String(input) // Safe since ASCII is UTF-8 subset\n break\n\n default:\n throw new TypeError(\"Unknown encoding: \" + encoding)\n }\n } else {\n bytes = processArrayLikeInput(input)\n }\n\n if (!bytes || bytes.length === 0) {\n return SeaArray.from(new Uint8Array(0))\n }\n\n try {\n return SeaArray.from(bytes)\n } catch (err) {\n throw new Error(\"Failed to create SafeBuffer: \" + err.message)\n }\n },\n\n alloc(length, fill = 0) {\n if (typeof length !== \"number\" || !Number.isInteger(length) || length < 0) {\n throw new TypeError(\"Length must be a non-negative integer\")\n }\n\n validateBufferSize(length, \"buffer allocation\")\n\n // Validate fill value\n if (typeof fill === \"number\") {\n if (fill < 0 || fill > 255 || !Number.isInteger(fill)) {\n throw new TypeError(\"Fill value must be an integer between 0 and 255\")\n }\n } else if (typeof fill === \"string\") {\n if (fill.length !== 1) {\n throw new TypeError(\"Fill string must be exactly one character\")\n }\n fill = fill.charCodeAt(0)\n if (fill > 255) {\n throw new TypeError(\"Fill character code must be <= 255\")\n }\n } else {\n throw new TypeError(\"Fill must be a number or single character string\")\n }\n\n try {\n const buffer = new Uint8Array(length)\n if (fill !== 0) {\n buffer.fill(fill)\n }\n return SeaArray.from(buffer)\n } catch (err) {\n throw new Error(\"Failed to allocate buffer: \" + err.message)\n }\n },\n\n concat(arr) {\n if (!Array.isArray(arr)) {\n throw new TypeError(\"First argument must be an array\")\n }\n\n if (arr.length === 0) {\n return SeaArray.from(new Uint8Array(0))\n }\n\n // Validate all array elements and calculate total size\n let totalLength = 0\n const validatedBuffers = []\n\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i]\n\n if (!item) {\n throw new TypeError(`Array element at index ${i} is null or undefined`)\n }\n\n let bytes\n try {\n bytes = processArrayLikeInput(item)\n } catch (err) {\n throw new TypeError(\n `Invalid array element at index ${i}: ${err.message}`,\n )\n }\n\n totalLength += bytes.length\n validateBufferSize(totalLength, \"buffer concatenation\")\n\n validatedBuffers.push(bytes)\n }\n\n try {\n const result = new Uint8Array(totalLength)\n let offset = 0\n\n for (const buffer of validatedBuffers) {\n result.set(buffer, offset)\n offset += buffer.length\n }\n\n return SeaArray.from(result)\n } catch (err) {\n throw new Error(\"Failed to concatenate buffers: \" + err.message)\n }\n },\n\n // Helper method to check if object is SafeBuffer\n isBuffer(obj) {\n return (\n obj instanceof SeaArray ||\n (obj && typeof obj === \"object\" && obj.constructor === SafeBuffer)\n )\n },\n\n // Get byte length of string in specific encoding\n byteLength(string, encoding = \"utf8\") {\n if (typeof string !== \"string\") {\n throw new TypeError(\"First argument must be a string\")\n }\n\n switch (encoding.toLowerCase()) {\n case \"utf8\":\n case \"utf-8\":\n return new TextEncoder().encode(string).length\n\n case \"ascii\":\n case \"binary\":\n case \"latin1\":\n return string.length\n\n case \"base64\":\n const clean = string.replace(/\\s/g, \"\")\n return (\n Math.floor((clean.length * 3) / 4) - (clean.match(/=/g) || []).length\n )\n\n case \"hex\":\n return Math.floor(string.replace(/\\s/g, \"\").length / 2)\n\n default:\n throw new TypeError(\"Unknown encoding: \" + encoding)\n }\n },\n})\n\nSafeBuffer.prototype.from = SafeBuffer.from\nSafeBuffer.prototype.toString = function (\n encoding = \"utf8\",\n start = 0,\n end = this.length,\n) {\n // Input validation\n if (typeof encoding !== \"string\") {\n throw new TypeError(\"Encoding must be a string\")\n }\n\n if (typeof start !== \"number\" || !Number.isInteger(start) || start < 0) {\n throw new TypeError(\"Start must be a non-negative integer\")\n }\n\n if (typeof end !== \"number\" || !Number.isInteger(end) || end < start) {\n throw new TypeError(\"End must be an integer >= start\")\n }\n\n // Delegate to SeaArray with validation\n try {\n return SeaArray.prototype.toString.call(this, encoding, start, end)\n } catch (err) {\n throw new Error(\"Failed to convert buffer to string: \" + err.message)\n }\n}\n\nexport default SafeBuffer\n", "import SafeBuffer from \"./buffer.js\"\n\nconst isNode = typeof document === \"undefined\"\nconst crypto = isNode\n ? (await import(/*webpackIgnore: true*/ \"node:crypto\")).webcrypto\n : globalThis.crypto\nexport const subtle = crypto.subtle\n\nexport const stringify = data => {\n return typeof data === \"string\" ? data : JSON.stringify(data)\n}\n\nexport const parse = text => {\n try {\n return JSON.parse(text)\n } catch {\n return text\n }\n}\n\nexport const random = length => {\n const array = new Uint8Array(SafeBuffer.alloc(length))\n return SafeBuffer.from(crypto.getRandomValues(array))\n}\n\nexport const jwk = (pub, priv) => {\n const [x, y] = pub.split(\".\")\n const ops = priv ? [\"sign\"] : [\"verify\"]\n return {\n kty: \"EC\",\n crv: \"P-256\",\n x: x,\n y: y,\n d: priv,\n ext: true,\n key_ops: ops,\n }\n}\n\nexport const sha256 = async data => {\n const hash = await subtle.digest(\n {name: \"SHA-256\"},\n new TextEncoder().encode(stringify(data)),\n )\n return SafeBuffer.from(hash)\n}\n\nexport const aeskey = async (key, salt) => {\n const combined = key + salt.toString(\"utf8\")\n const hash = SafeBuffer.from(await sha256(combined), \"binary\")\n const jwk = keyToJwk(hash)\n return await subtle.importKey(\"jwk\", jwk, {name: \"AES-GCM\"}, false, [\n \"encrypt\",\n \"decrypt\",\n ])\n}\n\nconst keyToJwk = key => {\n const k = key\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/\\=/g, \"\")\n return {kty: \"oct\", k: k, ext: false, alg: \"A256GCM\"}\n}\n", "import {userPublicKey, userSignature} from \"./utils.js\"\nimport * as utils from \"./sea-utils.js\"\nimport SafeBuffer from \"./buffer.js\"\n\n// Security, Encryption, and Authorization: SEA.js from GunDB.\nconst SEA = {\n pair: async cb => {\n // ECDSA keys for signing/verifying.\n const ecdsa = await utils.subtle\n .generateKey({name: \"ECDSA\", namedCurve: \"P-256\"}, true, [\n \"sign\",\n \"verify\",\n ])\n .then(async keys => {\n const pub = await utils.subtle.exportKey(\"jwk\", keys.publicKey)\n return {\n priv: (await utils.subtle.exportKey(\"jwk\", keys.privateKey)).d,\n pub: pub.x + \".\" + pub.y,\n }\n })\n\n // ECDH keys for encryption/decryption.\n const ecdh = await utils.subtle\n .generateKey({name: \"ECDH\", namedCurve: \"P-256\"}, true, [\"deriveKey\"])\n .then(async keys => {\n const pub = await utils.subtle.exportKey(\"jwk\", keys.publicKey)\n return {\n epriv: (await utils.subtle.exportKey(\"jwk\", keys.privateKey)).d,\n epub: pub.x + \".\" + pub.y,\n }\n })\n\n const pair = {\n pub: ecdsa.pub,\n priv: ecdsa.priv,\n epub: ecdh.epub,\n epriv: ecdh.epriv,\n }\n if (cb) cb(pair)\n return pair\n },\n encrypt: async (data, pair, cb) => {\n if (!pair || !pair.epriv) {\n if (cb) cb(null)\n return null\n }\n\n const rand = {s: utils.random(9), iv: utils.random(15)}\n const ct = await utils.aeskey(pair.epriv, rand.s).then(aes => {\n return utils.subtle.encrypt(\n {\n name: \"AES-GCM\",\n iv: new Uint8Array(rand.iv),\n },\n aes,\n new TextEncoder().encode(utils.stringify(data)),\n )\n })\n const enc = {\n ct: SafeBuffer.from(ct, \"binary\").toString(\"base64\"),\n iv: rand.iv.toString(\"base64\"),\n s: rand.s.toString(\"base64\"),\n }\n if (cb) cb(enc)\n return enc\n },\n decrypt: async (enc, pair, cb) => {\n if (!enc || !enc.ct || !enc.iv || !enc.s || !pair || !pair.epriv) {\n if (cb) cb(null)\n return null\n }\n\n const data = {\n ct: SafeBuffer.from(enc.ct, \"base64\"),\n iv: SafeBuffer.from(enc.iv, \"base64\"),\n s: SafeBuffer.from(enc.s, \"base64\"),\n }\n try {\n const ct = await utils.aeskey(pair.epriv, data.s).then(aes => {\n return utils.subtle.decrypt(\n {\n name: \"AES-GCM\",\n iv: new Uint8Array(data.iv),\n tagLength: 128,\n },\n aes,\n new Uint8Array(data.ct),\n )\n })\n const dec = utils.parse(new TextDecoder(\"utf8\").decode(ct))\n if (cb) cb(dec)\n return dec\n } catch (err) {\n // An error will be thrown if the wrong key is used.\n if (cb) cb(null)\n return null\n }\n },\n verify: async (data, pair, cb) => {\n if (!pair || !pair.pub) {\n if (cb) cb(null)\n return null\n }\n\n const signed = utils.parse(data)\n const key = await utils.subtle.importKey(\n \"jwk\",\n utils.jwk(pair.pub),\n {name: \"ECDSA\", namedCurve: \"P-256\"},\n false,\n [\"verify\"],\n )\n\n let msg = {}\n if (typeof signed.m === \"string\") {\n msg = signed.m\n } else {\n // Allow data to be passed in with graph meta data,\n // (which should not be part of signature, so not verified).\n for (const k of Object.keys(signed.m).sort()) {\n if (k !== \"_\" && k != userPublicKey && k != userSignature) {\n msg[k] = signed.m[k]\n }\n }\n }\n const hash = await utils.sha256(msg)\n const sig = new Uint8Array(SafeBuffer.from(signed.s, \"base64\"))\n const alg = {name: \"ECDSA\", hash: {name: \"SHA-256\"}}\n if (await utils.subtle.verify(alg, key, sig, new Uint8Array(hash))) {\n const verified = utils.parse(signed.m)\n if (cb) cb(verified)\n return verified\n }\n\n if (cb) cb(null)\n return null\n },\n sign: async (data, pair, cb) => {\n if (!pair || !pair.pub || !pair.priv) {\n if (cb) cb(null)\n return null\n }\n\n let msg = {}\n if (typeof data === \"string\") {\n msg = data\n } else {\n const check = utils.parse(data)\n for (const k of Object.keys(check).sort()) {\n if (k !== \"_\" && k != userPublicKey && k != userSignature) {\n msg[k] = check[k]\n }\n }\n }\n const hash = await utils.sha256(msg)\n const jwk = utils.jwk(pair.pub, pair.priv)\n const alg = {name: \"ECDSA\", namedCurve: \"P-256\"}\n const sig = await utils.subtle\n .importKey(\"jwk\", jwk, alg, false, [\"sign\"])\n .then(key =>\n utils.subtle.sign(\n {name: \"ECDSA\", hash: {name: \"SHA-256\"}},\n key,\n new Uint8Array(hash),\n ),\n )\n const signed = {\n m: msg,\n s: SafeBuffer.from(sig, \"binary\").toString(\"base64\"),\n }\n\n if (cb) cb(signed)\n return signed\n },\n work: async (data, salt, cb) => {\n if (typeof salt === \"function\") {\n cb = salt\n salt = undefined\n }\n if (typeof salt === \"undefined\") salt = utils.random(9)\n\n const key = await utils.subtle.importKey(\n \"raw\",\n new TextEncoder().encode(utils.stringify(data)),\n {name: \"PBKDF2\"},\n false,\n [\"deriveBits\"],\n )\n const alg = {\n name: \"PBKDF2\",\n iterations: 100000,\n salt: new TextEncoder().encode(salt),\n hash: {name: \"SHA-256\"},\n }\n const work = await utils.subtle.deriveBits(alg, key, 512)\n // Use \"pair\" format so that work can be used as epriv by decrypt.\n const pair = {epriv: SafeBuffer.from(work, \"binary\").toString(\"base64\")}\n if (cb) cb(pair)\n return pair\n },\n secret: async (to, from, cb) => {\n if (!to || !to.epub || !from || !from.epub || !from.epriv) {\n if (cb) cb(null)\n return null\n }\n\n const alg = {name: \"ECDH\", namedCurve: \"P-256\"}\n const pub = utils.jwk(to.epub)\n const pubKey = await utils.subtle.importKey(\"jwk\", pub, alg, true, [])\n const priv = utils.jwk(from.epub, from.epriv, false)\n // utils.jwk provides default key_ops but it shouldn't be used here.\n delete priv.key_ops\n const derived = await utils.subtle\n .importKey(\"jwk\", priv, alg, false, [\"deriveBits\"])\n .then(async key => {\n const derivedBits = await utils.subtle.deriveBits(\n {public: pubKey, name: \"ECDH\", namedCurve: \"P-256\"},\n key,\n 256,\n )\n const derivedKey = await utils.subtle.importKey(\n \"raw\",\n new Uint8Array(derivedBits),\n {name: \"AES-GCM\", length: 256},\n true,\n [\"encrypt\", \"decrypt\"],\n )\n return utils.subtle.exportKey(\"jwk\", derivedKey).then(({k}) => k)\n })\n // Use \"pair\" format so that secret can be used as epriv by encrypt.\n if (cb) cb({epriv: derived})\n return {epriv: derived}\n },\n}\n\nexport default SEA\n", "import * as utils from \"./utils.js\"\nimport SEA from \"./sea.js\"\n\nconst LISTENER_DELAY = 100\n// Maximum number of souls to keep in memory\nconst MAX_GRAPH_SIZE = 10000\n\n// state and value are the incoming changes.\n// currentState and currentValue are the current graph data.\nconst Ham = (state, currentState, value, currentValue) => {\n if (state < currentState) return {historical: true}\n\n if (state > currentState) return {incoming: true}\n\n // state is equal to currentState, lexically compare to resolve conflict.\n if (typeof value !== \"string\") {\n value = JSON.stringify(value) || \"\"\n }\n if (typeof currentValue !== \"string\") {\n currentValue = JSON.stringify(currentValue) || \"\"\n }\n // No update required.\n if (value === currentValue) return {state: true}\n\n // Keep the current value.\n if (value < currentValue) return {current: true}\n\n // Otherwise update using the incoming value.\n return {incoming: true}\n}\n\nHam.mix = async (change, graph, secure, listen) => {\n if (!change || typeof change !== \"object\") {\n throw new TypeError(\"change must be an object\")\n }\n if (!graph || typeof graph !== \"object\") {\n throw new TypeError(\"graph must be an object\")\n }\n if (!listen || typeof listen !== \"object\") {\n throw new TypeError(\"listen must be an object\")\n }\n\n const machine = Date.now()\n const now = {}\n const defer = {}\n let wait = 0\n\n for (const soul of Object.keys(change)) {\n const node = change[soul]\n let updated = false\n let alias = false\n let nodeWait = 0\n let verify = secure\n\n if (!node || !node._) continue\n\n const sig = node[utils.userSignature]\n const pub = node[utils.userPublicKey]\n // If a signature and public key are provided then always verify.\n if (sig && pub) verify = true\n\n // Special case if soul starts with \"~\". Node must be system data ie,\n // ~@alias or ~publickey. For aliases, key and value must be a self\n // identifying rel. For public keys, data needs to be signed and verified.\n // (This is also true for any data when the secure flag is used.)\n if (soul.length > 1 && soul[0] === \"~\") {\n if (soul[1] === \"@\") {\n alias = true\n verify = false\n } else {\n if (pub && soul != \"~\" + pub) {\n console.log(`error public key does not match for soul: ${soul}`)\n continue\n }\n\n verify = true\n }\n }\n if (verify) {\n // Partial nodes can be read from disk, which are ignored. This could be\n // a missing signature or public key, or missing properties on the node\n // which means verify won't work either.\n if (!sig || !pub || !(await SEA.verify({m: node, s: sig}, {pub: pub}))) {\n continue\n }\n }\n\n for (const key of Object.keys(node)) {\n if (key === \"_\") continue\n\n const value = node[key]\n const state = node._ && node._[\">\"] ? node._[\">\"][key] : 0\n const currentValue = (graph[soul] || {})[key]\n const currentState = (graph[soul] || {_: {\">\": {}}})._[\">\"][key] || 0\n\n if (alias && key !== utils.rel.is(value)) {\n console.log(`error alias ${alias}: ${key} !== ${utils.rel.is(value)}`)\n continue\n }\n\n // Defer the update if ahead of machine time.\n const skew = state - machine\n if (skew > 0) {\n // Ignore update if ahead by more than 24 hours.\n if (skew > 86400000) continue\n\n // Wait the shortest difference before trying the updates again.\n if (wait === 0 || skew < wait) wait = nodeWait = skew\n if (!defer[soul]) {\n defer[soul] = {_: {\"#\": soul, \">\": {}}}\n }\n defer[soul][key] = value\n defer[soul]._[\">\"][key] = state\n } else {\n const result = Ham(state, currentState, value, currentValue)\n if (result.incoming) {\n if (!now[soul]) {\n now[soul] = {_: {\"#\": soul, \">\": {}}}\n }\n if (!graph[soul]) {\n graph[soul] = {_: {\"#\": soul, \">\": {}}}\n }\n graph[soul][key] = now[soul][key] = value\n graph[soul]._[\">\"][key] = now[soul]._[\">\"][key] = state\n // Call event listeners for update on key, mix is called before\n // put has finished so wait for what could be multiple nested\n // updates on a node.\n if (listen[soul]) {\n setTimeout(() => {\n if (listen[soul]) {\n listen[soul]\n .filter(l => utils.match(l[\".\"], key))\n .forEach(l => l.cb())\n }\n }, LISTENER_DELAY)\n }\n updated = true\n }\n }\n }\n\n if (verify && nodeWait !== 0 && now[soul]) {\n // Secure updates can't be split, so move now to deferred as well.\n Object.assign(defer[soul], now[soul])\n delete now[soul]\n }\n // Call event listeners for update on soul.\n if (updated && listen[soul]) {\n setTimeout(() => {\n if (listen[soul]) {\n listen[soul].filter(l => utils.match(l[\".\"])).forEach(l => l.cb())\n }\n }, LISTENER_DELAY)\n }\n }\n\n const souls = Object.keys(graph)\n if (souls.length > MAX_GRAPH_SIZE) {\n // Sort by oldest state timestamp and remove oldest entries\n const soulsByAge = souls\n .map(soul => {\n const states = graph[soul]._ && graph[soul]._[\">\"]\n const maxState = states ? Math.max(...Object.values(states)) : 0\n return {soul, maxState}\n })\n .sort((a, b) => a.maxState - b.maxState)\n const remove = soulsByAge.slice(0, souls.length - MAX_GRAPH_SIZE)\n remove.forEach(({soul}) => delete graph[soul])\n }\n\n return {now: now, defer: defer, wait: wait}\n}\n\nexport default Ham\n", "import * as utils from \"./utils.js\"\n\n// ASCII character for group separator.\nconst group = String.fromCharCode(29)\n// ASCII character for record separator.\nconst record = String.fromCharCode(30)\n\nconst Radix = () => {\n const radix = (keys, value, tree) => {\n if (!tree) {\n if (!radix[group]) radix[group] = {}\n tree = radix[group]\n }\n if (!keys) return tree\n\n let i = 0\n let tmp = {}\n let key = keys[i]\n const max = keys.length - 1\n const noValue = typeof value === \"undefined\"\n // Find a matching value using the shortest string from keys.\n let found = tree[key]\n while (!found && i < max) {\n key += keys[++i]\n found = tree[key]\n }\n\n if (!found) {\n // If not found from the provided keys try matching with an existing key.\n const result = utils.obj.map(tree, (hasValue, hasKey) => {\n let j = 0\n let matchingKey = \"\"\n while (hasKey[j] === keys[j]) {\n matchingKey += hasKey[j++]\n }\n if (matchingKey) {\n if (noValue) {\n // matchingKey has to be as long as the original keys when reading.\n if (j <= max) return\n\n tmp[hasKey.slice(j)] = hasValue\n return hasValue\n }\n\n let replace = {\n [hasKey.slice(j)]: hasValue,\n [keys.slice(j)]: {[record]: value},\n }\n tree[matchingKey] = {[group]: replace}\n delete tree[hasKey]\n return true\n }\n })\n if (!result) {\n if (noValue) return\n\n if (!tree[key]) tree[key] = {}\n tree[key][record] = value\n } else if (noValue) {\n return tmp\n }\n } else if (i === max) {\n // If no value use the key provided to return a whole group or record.\n if (noValue) {\n // If an individual record isn't found then return the whole group.\n return typeof found[record] === \"undefined\"\n ? found[group]\n : found[record]\n }\n // Otherwise create a new record at the provided key for value.\n found[record] = value\n } else {\n // Found at a shorter key, try again.\n if (!found[group] && !noValue) found[group] = {}\n return radix(keys.slice(++i), value, found[group])\n }\n }\n return radix\n}\n\nRadix.map = function map(radix, cb, opt, pre) {\n if (!pre) pre = []\n var tree = radix[group] || radix\n var keys = Object.keys(tree).sort()\n var u\n\n for (let i = 0; i < keys.length; i++) {\n let key = keys[i]\n let found = tree[key]\n let tmp = found[record]\n if (typeof tmp !== \"undefined\") {\n tmp = cb(tmp, pre.join(\"\") + key, key, pre)\n if (typeof tmp !== \"undefined\") return tmp\n } else if (opt) {\n cb(u, pre.join(\"\"), key, pre)\n }\n if (found[group]) {\n pre.push(key)\n tmp = map(found[group], cb, opt, pre)\n if (typeof tmp !== \"undefined\") return tmp\n pre.pop()\n }\n }\n}\n\nexport default Radix\n", "import Radix from \"./radix.js\"\nimport * as utils from \"./utils.js\"\n\n// ASCII character for end of text\nconst etx = String.fromCharCode(3)\n// ASCII character for enquiry\nconst enq = String.fromCharCode(5)\n// ASCII character for unit separator\nconst unit = String.fromCharCode(31)\n\n// Radisk provides access to a radix tree that is stored in the provided\n// opt.store interface\nconst Radisk = opt => {\n var u\n\n // Multi-file cache for all parsed radix trees\n const cache = new Map()\n // File listing cache to avoid repeated directory scans\n let fileListCache = null\n let fileListCacheTime = 0\n const FILE_LIST_CACHE_TTL = 10000 // 10 seconds\n // Pending reads queue to avoid duplicate reads for the same key\n const pendingReads = new Map()\n\n // Memory monitoring and cleanup\n let lastMemoryCheck = 0\n const MEMORY_CHECK_INTERVAL = 30000 // Check every 30 seconds\n const HEAP_WARNING_THRESHOLD = 0.8 // Warn at 80% of max heap size\n const HEAP_CLEANUP_THRESHOLD = 0.9 // Clean cache at 90% of max heap size\n\n if (!opt) opt = {}\n if (!opt.log) opt.log = console.log\n if (!opt.batch) opt.batch = 100 // Balanced batch size for performance\n if (!opt.write) opt.write = 1 // Wait time before write in milliseconds\n if (!opt.size) opt.size = 1024 * 1024 // File size on disk, default 1MB\n if (!opt.memoryLimit) opt.memoryLimit = 500 // Memory limit in MB\n if (typeof opt.cache === \"undefined\") opt.cache = true\n\n if (!opt.store) {\n opt.log(\n \"Radisk needs `store` interface with `{get: fn, put: fn, list: fn}`\",\n )\n return\n }\n if (!opt.store.get) {\n opt.log(\"Radisk needs `store.get` interface with `(file, cb)`\")\n return\n }\n if (!opt.store.put) {\n opt.log(\"Radisk needs `store.put` interface with `(file, data, cb)`\")\n return\n }\n if (!opt.store.list) {\n opt.log(\"Radisk needs a streaming `store.list` interface with `(cb)`\")\n return\n }\n\n // Performance logging\n const perfLog = (operation, startTime, key, size) => {\n const duration = Date.now() - startTime\n if (duration > 1000) {\n console.log(\n `[RADISK-SLOW] ${operation}: ${duration}ms for ${key}${size ? ` (${size} bytes)` : \"\"}`,\n )\n }\n }\n\n // Memory monitoring and cache cleanup\n const checkMemoryUsage = () => {\n const now = Date.now()\n if (now - lastMemoryCheck < MEMORY_CHECK_INTERVAL) return\n lastMemoryCheck = now\n\n const memUsage = process.memoryUsage()\n const heapUsed = memUsage.heapUsed\n const heapTotal = memUsage.heapTotal\n const maxHeapSize = opt.memoryLimit * 1024 * 1024\n const heapUsageRatio = heapUsed / maxHeapSize\n\n if (heapUsageRatio > HEAP_CLEANUP_THRESHOLD) {\n const cacheSize = cache.size\n console.log(\n `[RADISK-MEMORY] High memory usage: ${Math.round(heapUsageRatio * 100)}% of heap limit. Clearing ${cacheSize} cached files.`,\n )\n cache.clear()\n // Force garbage collection if available\n if (global.gc) {\n global.gc()\n }\n // Reset timer to avoid immediate re-check until GC has time to work\n lastMemoryCheck = now + MEMORY_CHECK_INTERVAL\n } else if (heapUsageRatio > HEAP_WARNING_THRESHOLD) {\n console.log(\n `[RADISK-MEMORY] Memory warning: ${Math.round(heapUsageRatio * 100)}% of heap limit used. Cache size: ${cache.size} files.`,\n )\n }\n }\n\n // Any and all storage adapters should:\n // 1. Because writing to disk takes time, we should batch data to disk.\n // This improves performance, and reduces potential disk corruption.\n // 2. If a batch exceeds a certain number of writes, we should immediately\n // write to disk when physically possible. This caps total performance,\n // but reduces potential loss.\n const radisk = (key, value, cb) => {\n key = \"\" + key\n\n // If no value is provided then the second parameter is the callback\n // function. Read value from memory or disk and call callback with it.\n if (typeof value === \"function\") {\n cb = value\n value = radisk.batch(key)\n if (typeof value !== \"undefined\") {\n return cb(u, value)\n }\n\n if (radisk.thrash.at) {\n value = radisk.thrash.at(key)\n if (typeof value !== \"undefined\") {\n return cb(u, value)\n }\n }\n\n // Check if there's already a pending read for this key\n if (pendingReads.has(key)) {\n // Add callback to existing pending read\n pendingReads.get(key).push(cb)\n return\n }\n\n // Start new read and create callback queue\n pendingReads.set(key, [cb])\n\n const readStart = Date.now()\n return radisk.read(key, (err, result) => {\n perfLog(\"read\", readStart, key)\n // Execute all pending callbacks for this key\n const callbacks = pendingReads.get(key) || []\n pendingReads.delete(key)\n callbacks.forEach(callback => callback(err, result))\n })\n }\n\n // Otherwise store the value provided.\n radisk.batch(key, value)\n // Check memory usage after writing to in-memory radix tree\n checkMemoryUsage()\n if (cb) {\n radisk.batch.acks.push(cb)\n }\n // Don't wait if we have batched too many.\n if (++radisk.batch.ed >= opt.batch) {\n return radisk.thrash()\n }\n\n // Otherwise wait for more updates before writing.\n clearTimeout(radisk.batch.timeout)\n radisk.batch.timeout = setTimeout(radisk.thrash, opt.write)\n }\n\n radisk.batch = Radix()\n radisk.batch.acks = []\n radisk.batch.ed = 0\n\n radisk.thrash = () => {\n if (radisk.thrash.ing) {\n return (radisk.thrash.more = true)\n }\n\n const thrashStart = Date.now()\n clearTimeout(radisk.batch.timeout)\n radisk.thrash.more = false\n radisk.thrash.ing = true\n var batch = (radisk.thrash.at = radisk.batch)\n radisk.batch = null\n radisk.batch = Radix()\n radisk.batch.acks = []\n radisk.batch.ed = 0\n let i = 0\n radisk.save(batch, err => {\n // This is to ignore multiple callbacks from radisk.save calling\n // radisk.write? It looks like multiple callbacks will be made if a\n // file needs to be split.\n if (++i > 1) return\n\n perfLog(\"thrash\", thrashStart, `batch-${batch.ed}`)\n if (err) opt.log(err)\n batch.acks.forEach(cb => cb(err))\n radisk.thrash.at = null\n radisk.thrash.ing = false\n if (radisk.thrash.more) radisk.thrash()\n })\n }\n\n // 1. Find the first radix item in memory\n // 2. Use that as the starting index in the directory of files\n // 3. Find the first file that is lexically larger than it\n // 4. Read the previous file into memory\n // 5. Scan through in memory radix for all values lexically less than limit\n // 6. Merge and write all of those to the in-memory file and back to disk\n radisk.save = (rad, cb) => {\n const save = {\n find: (tree, key) => {\n // This is false for any key until save.start is set to an initial key.\n if (key < save.start) return\n\n save.start = key\n opt.store.list(save.lex)\n return true\n },\n lex: file => {\n if (!file || file > save.start) {\n save.end = file\n // ! is used as the first file name as it's the first printable\n // character, so always matches as lexically less than any node.\n // Also save.start can be set to undefined by a previous call to\n // save.mix, so don't continue in this case.\n if (save.start) save.mix(save.file || \"!\", save.start, save.end)\n } else {\n save.file = file\n }\n },\n mix: (file, start, end) => {\n save.start = save.end = save.file = u\n // Use cache if available, otherwise parse from disk\n if (cache.has(file)) {\n const disk = cache.get(file)\n Radix.map(rad, (value, key) => {\n if (key < start) return\n\n if (end && end < key) {\n save.start = key\n return\n }\n\n disk(key, value)\n })\n radisk.write(file, disk, save.next)\n } else {\n radisk.parse(file, (err, disk) => {\n if (err) return cb(err)\n\n Radix.map(rad, (value, key) => {\n if (key < start) return\n\n if (end && end < key) {\n save.start = key\n return\n }\n\n disk(key, value)\n })\n radisk.write(file, disk, save.next)\n })\n }\n },\n next: err => {\n if (err) return cb(err)\n\n if (save.start) return Radix.map(rad, save.find)\n\n cb(err)\n },\n }\n Radix.map(rad, save.find)\n }\n\n radisk.write = (file, rad, cb) => {\n const write = {\n text: \"\",\n limit: \"\",\n done: false,\n count: 0,\n each: (value, key, k, pre) => {\n // each is called for all keys, but stop adding to write.text when\n // write.slice is called, then the current contents of write.text\n // will be written to file.\n if (write.done) return\n\n write.count++\n value = typeof value === \"undefined\" ? \"\" : \"=\" + Radisk.encode(value)\n const enc =\n Radisk.encode(pre.length) + \"#\" + Radisk.encode(k) + value + \"\\n\"\n // Cannot split the file if only have one entry to write. Also don't\n // start a split if in the middle of writing a node (pre > 0).\n if (\n write.count > 1 &&\n pre.length === 0 &&\n write.text.length + enc.length > opt.size\n ) {\n const end = k.indexOf(enq)\n write.limit = end === -1 ? k : k.substring(0, end)\n // Cannot split if they key is the same as the current file name.\n if (write.limit !== file) {\n write.done = true\n write.sub = Radix()\n Radix.map(rad, write.slice)\n radisk.write(write.limit, write.sub, cb)\n return\n }\n }\n\n write.text += enc\n },\n slice: (value, key) => {\n if (key < write.limit) return\n\n write.sub(key, value)\n },\n }\n Radix.map(rad, write.each, true)\n // There is always accumulated write.text to store once write.each has\n // finished.\n const writeStart = Date.now()\n opt.store.put(file, write.text, err => {\n perfLog(\"file-write\", writeStart, file, write.text.length)\n cb(err)\n })\n }\n\n radisk.read = (key, cb) => {\n // Only the soul of the key is compared to filenames (see radisk.write).\n const end = key.indexOf(enq)\n const soul = end === -1 ? key : key.substring(0, end)\n\n const read = {\n lex: file => {\n // store.list should call lex without a file last, which means all file\n // names were compared to soul, so the current read.file is ok to use.\n if (!file) {\n if (!read.file) {\n cb(\"no file found\", u)\n return\n }\n\n // Check multi-file cache first\n if (opt.cache && cache.has(read.file)) {\n const cachedRadix = cache.get(read.file)\n read.value = cachedRadix(key)\n // Return cached result (defined or undefined) since in-memory\n // radix tree is authoritative\n return cb(u, read.value)\n }\n\n radisk.parse(read.file, read.it)\n return\n }\n\n // Want the filename closest to soul.\n if (file > soul || file < read.file) return\n\n read.file = file\n },\n it: (err, disk) => {\n if (err) opt.log(err)\n if (disk) {\n if (opt.cache) {\n cache.set(read.file, disk)\n checkMemoryUsage() // Check memory usage after adding to cache\n }\n read.value = disk(key)\n }\n cb(err, read.value)\n },\n }\n const now = Date.now()\n if (\n opt.cache &&\n fileListCache &&\n now - fileListCacheTime < FILE_LIST_CACHE_TTL\n ) {\n // Use cached file list\n fileListCache.forEach(file => read.lex(file))\n read.lex() // Signal end of list\n } else {\n // Refresh cache\n const files = []\n const originalLex = read.lex\n read.lex = file => {\n if (file) files.push(file)\n return originalLex(file)\n }\n\n opt.store.list(file => {\n read.lex(file)\n if (!file && opt.cache) {\n // End of list - cache the results\n fileListCache = files\n fileListCacheTime = now\n }\n })\n }\n }\n\n // Let us start by assuming we are the only process that is\n // changing the directory or bucket. Not because we do not want\n // to be multi-process/machine, but because we want to experiment\n // with how much performance and scale we can get out of only one.\n // Then we can work on the harder problem of being multi-process.\n radisk.parse = (file, cb) => {\n const parse = {\n disk: Radix(),\n read: (err, data) => {\n if (err) return cb(err)\n\n if (!data) return cb(u, parse.disk)\n\n let pre = []\n let preString = \"\"\n // Work though data by splitting into 3 values. The first value says\n // if the second value is one of: the radix level for a key, the key\n // iteself, or a value. The third is the rest of the data to work with.\n let tmp = parse.split(data)\n while (tmp) {\n let key\n let value\n let i = tmp[1]\n tmp = parse.split(tmp[2]) || \"\"\n if (tmp[0] === \"#\") {\n key = tmp[1]\n // Optimize prefix building - avoid repeated joins\n if (i < pre.length) {\n pre.length = i\n }\n if (i <= pre.length) {\n pre[i] = key\n pre.length = i + 1\n }\n // Only rebuild preString when prefix changes\n preString = pre.join(\"\")\n }\n tmp = parse.split(tmp[2]) || \"\"\n if (tmp[0] === \"\\n\") continue\n\n if (tmp[0] === \"=\") value = tmp[1]\n if (typeof key !== \"undefined\" && typeof value !== \"undefined\") {\n parse.disk(preString, value)\n }\n tmp = parse.split(tmp[2])\n }\n cb(u, parse.disk)\n },\n split: data => {\n if (!data) return\n\n const i = data.indexOf(unit)\n if (i === -1) return\n\n const a = data.slice(0, i)\n let o = {}\n return [a, Radisk.decode(data.slice(i), o), data.slice(i + o.i)]\n },\n }\n opt.store.get(file, parse.read)\n }\n\n return radisk\n}\n\nRadisk.encode = data => {\n // A key should be passed in as a string to encode, a value can optionally be\n // an array of 2 items to include the value's state, as is done by store.js.\n let state = \"\"\n if (data instanceof Array && data.length === 2) {\n state = etx + data[1]\n data = data[0]\n }\n\n if (typeof data === \"string\") {\n let i = 0\n let current = null\n let text = unit\n while ((current = data[i++])) {\n if (current === unit) text += unit\n }\n return text + '\"' + data + state + unit\n }\n\n const rel = utils.rel.is(data)\n if (rel) return unit + \"#\" + rel + state + unit\n\n if (utils.num.is(data)) return unit + \"+\" + (data || 0) + state + unit\n\n if (data === true) return unit + \"+\" + state + unit\n\n if (data === false) return unit + \"-\" + state + unit\n\n if (data === null) return unit + \" \" + state + unit\n}\n\nRadisk.decode = (data, obj) => {\n var i = -1\n var n = 0\n var current = null\n var previous = null\n var textStart = -1\n var textEnd = -1\n if (data[0] !== unit) return\n\n // Find a control character previous to the text we want, skipping\n // consecutive unit separator characters at the beginning of the data.\n while ((current = data[++i])) {\n if (previous) {\n if (textStart === -1) textStart = i\n if (current === unit) {\n if (--n <= 0) {\n textEnd = i\n break\n }\n }\n } else if (current === unit) {\n n++\n } else {\n previous = current || true\n }\n }\n\n const text =\n textStart !== -1 ? data.slice(textStart, textEnd !== -1 ? textEnd : i) : \"\"\n\n if (obj) obj.i = i + 1\n\n let [value, state] = text.split(etx)\n if (!state) {\n if (previous === '\"') return text\n\n if (previous === \"#\") return utils.rel.ify(text)\n\n if (previous === \"+\") {\n if (text.length === 0) return true\n\n return parseFloat(text)\n }\n\n if (previous === \"-\") return false\n\n if (previous === \" \") return null\n } else {\n state = parseFloat(state)\n // If state was found then return an array.\n if (previous === '\"') return [value, state]\n\n if (previous === \"#\") return [utils.rel.ify(value), state]\n\n if (previous === \"+\") {\n if (value.length === 0) return [true, state]\n\n return [parseFloat(value), state]\n }\n\n if (previous === \"-\") return [false, state]\n\n if (previous === \" \") return [null, state]\n }\n}\n\nexport default Radisk\n", "import Radisk from \"./radisk.js\"\nimport Radix from \"./radix.js\"\nimport * as utils from \"./utils.js\"\n\nconst isNode = typeof document === \"undefined\"\nconst fs = isNode ? await import(/*webpackIgnore: true*/ \"node:fs\") : undefined\n\n// ASCII character for enquiry.\nconst enq = String.fromCharCode(5)\n// ASCII character for unit separator.\nconst unit = String.fromCharCode(31)\n// On-disk root node format.\nconst root = unit + \"+0\" + unit + \"#\" + unit + '\"root' + unit\n\nconst fileSystem = opt => {\n const dir = opt.file\n\n if (isNode) {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir)\n if (!fs.existsSync(dir + \"/!\")) fs.writeFileSync(dir + \"/!\", root)\n\n return {\n get: (file, cb) => {\n fs.readFile(dir + \"/\" + file, (err, data) => {\n if (err) {\n if (err.code === \"ENOENT\") {\n cb()\n return\n }\n\n console.log(\"fs.readFile error:\", err)\n }\n if (data) data = data.toString()\n cb(err, data)\n })\n },\n put: (file, data, cb) => {\n // Don't put tmp files under dir so that they're not listed.\n var tmp = file + \".\" + utils.text.random(9) + \".tmp\"\n fs.writeFile(tmp, data, err => {\n if (err) {\n console.log(\"fs.writeFile error:\", err)\n cb(err)\n return\n }\n\n fs.rename(tmp, dir + \"/\" + file, cb)\n })\n },\n list: cb => {\n fs.readdir(dir, (err, files) => {\n if (err) {\n console.log(\"fs.readdir error:\", err)\n cb()\n return\n }\n\n files.forEach(cb)\n cb()\n })\n },\n }\n }\n\n if (opt.indexedDB) {\n let db\n const o = indexedDB.open(dir, 1)\n o.onupgradeneeded = event => {\n event.target.result.createObjectStore(dir)\n }\n o.onerror = event => {\n console.log(event)\n }\n o.onsuccess = () => {\n db = o.result\n // Create the root node if it doesn't exist.\n if (db) {\n const tx = db.transaction([dir], \"readonly\")\n const req = tx.objectStore(dir).getKey(\"!\")\n req.onerror = () => {\n console.log(`error getting key ${dir}/!`)\n }\n req.onsuccess = () => {\n if (!req.result) {\n const tx = db.transaction([dir], \"readwrite\")\n const req = tx.objectStore(dir).put(root, \"!\")\n req.onerror = () => {\n console.log(`error putting root on ${dir}/!`)\n }\n }\n }\n } else {\n console.log(\"error indexedDB not available\")\n }\n }\n\n return {\n get: (file, cb) => {\n const _get = (file, cb) => {\n const tx = db.transaction([dir], \"readonly\")\n const req = tx.objectStore(dir).get(file)\n req.onerror = () => {\n console.log(`error getting ${dir}/${file}`)\n }\n req.onsuccess = () => {\n cb(null, req.result)\n }\n }\n if (db) {\n _get(file, cb)\n return\n }\n\n let retry = 0\n const interval = setInterval(() => {\n if (db) {\n clearInterval(interval)\n _get(file, cb)\n return\n }\n\n if (retry++ > 5) {\n clearInterval(interval)\n cb(\"error indexedDB not available\")\n }\n }, 1000)\n },\n put: (file, data, cb) => {\n const _put = (file, data, cb) => {\n const tx = db.transaction([dir], \"readwrite\")\n const req = tx.objectStore(dir).put(data, file)\n req.onerror = () => {\n console.log(`error putting data on ${dir}/${file}`)\n }\n req.onsuccess = () => {\n cb(null)\n }\n }\n if (db) {\n _put(file, data, cb)\n return\n }\n\n let retry = 0\n const interval = setInterval(() => {\n if (db) {\n clearInterval(interval)\n _put(file, data, cb)\n return\n }\n\n if (retry++ > 5) {\n clearInterval(interval)\n cb(\"error indexedDB not available\")\n }\n }, 1000)\n },\n list: cb => {\n const _list = cb => {\n const tx = db.transaction([dir], \"readonly\")\n const req = tx.objectStore(dir).getAllKeys()\n req.onerror = () => console.log(\"error getting keys for\", dir)\n req.onsuccess = () => {\n req.result.forEach(cb)\n cb()\n }\n }\n if (db) {\n _list(cb)\n return\n }\n\n let retry = 0\n const interval = setInterval(() => {\n if (db) {\n clearInterval(interval)\n _list(cb)\n return\n }\n\n if (retry++ > 5) {\n clearInterval(interval)\n console.log(\"error indexedDB not available\")\n cb()\n }\n }, 1000)\n },\n }\n }\n\n // No browser storage.\n return {\n get: (file, cb) => {\n cb(null, root)\n },\n put: (file, data, cb) => {\n cb(null)\n },\n list: cb => {\n cb(\"!\")\n cb()\n },\n }\n}\n\n// Store provides get and put methods that can access radisk.\nconst Store = opt => {\n if (!utils.obj.is(opt)) opt = {}\n opt.file = String(opt.file || \"radata\")\n if (!opt.store) opt.store = fileSystem(opt)\n const radisk = Radisk(opt)\n\n return {\n get: (lex, cb) => {\n if (!lex || !utils.obj.is(lex)) {\n cb(\"lex required\")\n return\n }\n if (!lex[\"#\"]) {\n cb(\"soul required in lex\")\n return\n }\n\n var soul = lex[\"#\"]\n var key = typeof lex[\".\"] === \"string\" ? lex[\".\"] : \"\"\n var node\n const each = (value, key) => {\n if (!utils.match(lex[\".\"], key)) return\n\n if (!node) node = {_: {\"#\": soul, \">\": {}}}\n node[key] = value[0]\n node._[\">\"][key] = value[1]\n }\n\n radisk(soul + enq + key, (err, value) => {\n let graph\n if (utils.obj.is(value)) {\n Radix.map(value, each)\n if (!node) each(value, key)\n graph = {[soul]: node}\n } else if (value) {\n each(value, key)\n graph = {[soul]: node}\n }\n cb(err, graph)\n })\n },\n put: (graph, cb) => {\n if (!graph) {\n cb(\"graph required\")\n return\n }\n\n let count = 0\n let finished = false\n const ack = err => {\n count--\n if (finished) return\n\n if (err) {\n finished = true\n cb(err)\n return\n }\n\n if (count === 0) {\n finished = true\n cb(null)\n }\n }\n\n Object.keys(graph).forEach(soul => {\n var node = graph[soul]\n Object.keys(node).forEach(key => {\n if (key === \"_\") return\n\n count++\n let value = node[key]\n let state = node._[\">\"][key]\n radisk(soul + enq + key, [value, state], ack)\n })\n })\n },\n }\n}\n\nexport default Store\n", "import Dup from \"./dup.js\"\nimport Get from \"./get.js\"\nimport Ham from \"./ham.js\"\nimport Store from \"./store.js\"\nimport * as utils from \"./utils.js\"\n\nconst isNode = typeof document === \"undefined\"\n\nconst wsModule = isNode ? await import(\"ws\") : undefined\n\nif (typeof globalThis.WebSocket === \"undefined\") {\n globalThis.WebSocket = wsModule?.WebSocket\n}\n\n// Rate limiting with throttling\nconst createRateLimiter = opt => {\n const clients = new Map()\n const maxRequests = opt.maxRequestsPerMinute || 100\n const windowMs = opt.rateLimitWindow || 60000\n const disconnectThreshold = opt.disconnectThreshold || 10\n // Check if test environment (mock-socket usage)\n const isTestEnv = opt.wss && opt.wss.constructor.name === \"Server\"\n let cleanupInterval = null\n\n const cleanup = () => {\n const now = Date.now()\n for (const [clientId, data] of clients.entries()) {\n if (now - data.lastCleanup > windowMs) {\n data.requests = []\n data.lastCleanup = now\n }\n data.requests = data.requests.filter(time => now - time < windowMs)\n // Reset throttle counts periodically\n if (now - data.lastCleanup > windowMs * 10) {\n data.throttleCount = 0\n }\n }\n }\n\n if (!isTestEnv) {\n cleanupInterval = setInterval(cleanup, windowMs / 4)\n }\n\n return {\n getDelay: clientId => {\n const now = Date.now()\n const client = clients.get(clientId) || {\n requests: [],\n lastCleanup: now,\n throttleCount: 0,\n }\n\n // Filter old requests\n client.requests = client.requests.filter(time => now - time < windowMs)\n\n if (client.requests.length >= maxRequests) {\n // Calculate delay based on oldest request that will expire\n const oldestRequest = Math.min(...client.requests)\n const delay = windowMs - (now - oldestRequest)\n // Increment throttle count and update client data\n client.throttleCount = (client.throttleCount || 0) + 1\n clients.set(clientId, client)\n return Math.max(0, delay)\n }\n\n // No delay needed, track this request\n client.requests.push(now)\n clients.set(clientId, client)\n return 0\n },\n\n getRemainingRequests: clientId => {\n const client = clients.get(clientId)\n if (!client) return maxRequests\n\n const now = Date.now()\n const validRequests = client.requests.filter(\n time => now - time < windowMs,\n )\n return Math.max(0, maxRequests - validRequests.length)\n },\n\n getThrottleCount: clientId => {\n const client = clients.get(clientId)\n return client ? client.throttleCount || 0 : 0\n },\n\n shouldDisconnect: clientId => {\n const client = clients.get(clientId)\n if (!client) return false\n return client.throttleCount >= disconnectThreshold\n },\n\n destroy: () => {\n if (cleanupInterval) {\n clearInterval(cleanupInterval)\n cleanupInterval = null\n }\n clients.clear()\n },\n }\n}\n\n// Safe JSON parser with size limit\nconst safeJSONParse = (data, maxSize = 1024 * 1024) => {\n try {\n if (typeof data === \"string\" && data.length > maxSize) {\n throw new Error(\"Message too large\")\n }\n return {success: true, data: JSON.parse(data)}\n } catch (error) {\n return {success: false, error: error.message}\n }\n}\n\n// Message size validator\nconst validateMessage = (data, maxSize = 1024 * 1024) => {\n // 1MB default\n if (typeof data === \"string\" && data.length > maxSize) {\n return {valid: false, error: \"Message too large\"}\n }\n if (Buffer.isBuffer(data) && data.length > maxSize) {\n return {valid: false, error: \"Message too large\"}\n }\n return {valid: true}\n}\n\n// Connection manager to limit concurrent connections\nconst createConnectionManager = (maxConnections = 1000) => {\n const connections = new Set()\n\n return {\n add: ws => {\n if (connections.size >= maxConnections) {\n return false\n }\n connections.add(ws)\n\n // Clean up on close\n const originalClose = ws.close\n ws.close = (...args) => {\n connections.delete(ws)\n return originalClose.apply(ws, args)\n }\n\n return true\n },\n\n remove: ws => {\n connections.delete(ws)\n },\n\n count: () => connections.size,\n\n isFull: () => connections.size >= maxConnections,\n }\n}\n\n// Enhanced retry mechanism with exponential backoff\nconst createRetryHandler = (maxRetries = 5) => {\n let retryCount = 0\n\n return {\n shouldRetry: () => retryCount < maxRetries,\n getDelay: () => Math.min(1000 * Math.pow(2, retryCount), 30000), // Max 30s\n increment: () => retryCount++,\n reset: () => (retryCount = 0),\n }\n}\n\n// Wire starts a websocket client or server and returns get and put methods\n// for access to the wire spec and storage.\nconst Wire = opt => {\n const dup = Dup(opt.maxAge)\n const store = Store(opt)\n const graph = {}\n const queue = {}\n const listen = {}\n\n // Track references we want but don't have yet\n const pendingReferences = new Set()\n\n // Helper to check if we have a soul in memory or storage\n const hasSoul = async soul => {\n if (graph[soul]) return true\n return new Promise(resolve => {\n store.get({\"#\": soul}, (err, data) => {\n resolve(!err && data && data[soul])\n })\n })\n }\n\n // Initialize rate limiting and connection management\n const rateLimiter = createRateLimiter(opt)\n const connectionManager = createConnectionManager(opt.maxConnections || 1000)\n\n // The check function is required because user data must provide a public key\n // so that it can be verified. The public key might verify the provided\n // signature but not actually match the user under which the data is being\n // stored. To avoid this, the current data on a soul needs to be checked to\n // make sure the stored public key matches the one provided with the update.\n const check = async (data, send, cb) => {\n for (const soul of Object.keys(data)) {\n const msg = await new Promise(res => {\n getWithCallback({\"#\": soul}, res, send)\n })\n if (msg.err) {\n if (cb) cb(msg.err)\n return false\n }\n\n const node = data[soul]\n const key = utils.userPublicKey\n // If there is no current node then the data is ok to write without\n // matching public keys, as the provided soul also needs a rel on the\n // parent node which then also requires checking. Otherwise publc keys\n // need to match for existing data.\n if (!msg.put || !msg.put[soul] || msg.put[soul][key] === node[key]) {\n continue\n }\n\n // If a soul exists but does not have a public key, then one should not be\n // added because the node is not user data. The above check fails in this\n // case if a public key is provided. Note that this is only an error case\n // if called via the API, which is when a callback is provided here.\n // (The wire spec can fetch and put data on the wire without a signature\n // or public key and this can be ignored.)\n if (cb) {\n cb(`error in wire check public key does not match for soul: ${soul}`)\n }\n return false\n }\n\n return true\n }\n\n const get = (msg, send) => {\n const ack = Get(msg.get, graph)\n if (ack) {\n send(\n JSON.stringify({\n \"#\": dup.track(utils.text.random(9)),\n \"@\": msg[\"#\"],\n put: ack,\n }),\n )\n } else {\n store.get(msg.get, (err, ack) => {\n send(\n JSON.stringify({\n \"#\": dup.track(utils.text.random(9)),\n \"@\": msg[\"#\"],\n put: ack,\n err: err,\n }),\n )\n })\n }\n }\n\n const put = async (msg, send) => {\n // Store updates returned from Ham.mix and defer updates if required.\n const update = await Ham.mix(msg.put, graph, opt.secure, listen)\n if (Object.keys(update.now).length) {\n if (!(await check(update.now, send))) return\n\n store.put(update.now, err => {\n send(\n JSON.stringify({\n \"#\": dup.track(utils.text.random(9)),\n \"@\": msg[\"#\"],\n err: err,\n }),\n )\n })\n }\n if (Object.keys(update.defer).length) {\n setTimeout(() => put({put: update.defer}, send), update.wait)\n }\n }\n\n const getWithCallback = (lex, cb, send, _opt) => {\n if (!cb) return\n\n if (!utils.obj.is(_opt)) _opt = {}\n\n const ack = Get(lex, graph)\n const track = utils.text.random(9)\n // Request the whole node in secure mode for verification.\n const request = JSON.stringify({\n \"#\": dup.track(track),\n get: opt.secure ? {\"#\": lex[\"#\"]} : lex,\n })\n\n if (ack) {\n // Also send request on the wire to check for updates.\n const sendResult = send(request)\n if (sendResult && sendResult.err) {\n cb({err: sendResult.err})\n return\n }\n cb({put: ack})\n return\n }\n\n store.get(lex, (err, ack) => {\n if (ack) {\n // Also send request on the wire to check for updates.\n const sendResult = send(request)\n if (sendResult && sendResult.err) {\n cb({err: sendResult.err})\n return\n }\n cb({put: ack, err: err})\n return\n }\n\n if (err) console.log(err)\n\n queue[track] = cb\n const sendResult = send(request)\n if (sendResult && sendResult.err) {\n cb({err: sendResult.err})\n delete queue[track]\n return\n }\n\n // Respond to callback with null if no response.\n setTimeout(() => {\n const cb = queue[track]\n if (cb) {\n const id = lex[\"#\"]\n const ack = {[id]: null}\n if (typeof lex[\".\"] === \"string\") ack[id] = {[lex[\".\"]]: null}\n cb({put: ack})\n delete queue[track]\n }\n }, _opt.wait || 100)\n })\n }\n\n const api = send => {\n return {\n get: (lex, cb, _opt) => {\n // Mark requested soul as something we want to store\n if (lex && lex[\"#\"]) {\n pendingReferences.add(lex[\"#\"])\n }\n getWithCallback(lex, cb, send, _opt)\n },\n put: async (data, cb) => {\n // Deferred updates are only stored using wire spec, they're ignored\n // here using the api. This is ok because correct timestamps should be\n // used whereas wire spec needs to handle clock skew for updates\n // across the network.\n const update = await Ham.mix(data, graph, opt.secure, listen)\n const none = Object.keys(update.now).length === 0\n if (none) {\n // Nothing to do.\n cb(null)\n return\n }\n\n if (!(await check(update.now, send, cb))) return\n\n // Seed pendingReferences with any new references from API calls\n for (const [soul, node] of Object.entries(update.now)) {\n if (node && typeof node === \"object\") {\n for (const [key, value] of Object.entries(node)) {\n const soulId = utils.rel.is(value)\n if (soulId) {\n // Add referenced soul to pending list\n pendingReferences.add(soulId)\n }\n }\n }\n }\n\n store.put(update.now, cb)\n // Also put data on the wire spec.\n const sendResult = send(\n JSON.stringify({\n \"#\": dup.track(utils.text.random(9)),\n put: data,\n }),\n )\n // Handle queue overflow error\n if (sendResult && sendResult.err) {\n if (cb) cb(sendResult.err)\n return\n }\n },\n on: (lex, cb, _get, _opt) => {\n const soul = lex && lex[\"#\"]\n if (!soul || !cb) return\n\n if (listen[soul]) {\n listen[soul].push({\".\": lex[\".\"], cb: cb})\n } else {\n listen[soul] = [{\".\": lex[\".\"], cb: cb}]\n }\n if (_get) getWithCallback(lex, cb, send, _opt)\n },\n off: (lex, cb) => {\n const soul = lex && lex[\"#\"]\n if (!soul || !listen[soul]) return\n\n if (cb) {\n const found = listen[soul].find(l => l.cb === cb)\n if (found) {\n listen[soul].splice(listen[soul].indexOf(found), 1)\n }\n } else {\n // Remove all callbacks when none provided.\n delete listen[soul]\n }\n },\n }\n }\n\n if (isNode) {\n let wss = opt.wss\n // Node's websocket server provides clients as an array, whereas\n // mock-sockets provides clients as a function that returns an array.\n let clients = () => wss.clients()\n if (!wss) {\n const config = opt.server\n ? {server: opt.server}\n : {port: opt.port || 8765}\n wss = new wsModule.WebSocketServer(config)\n clients = () => wss.clients\n }\n\n const send = (data, isBinary) => {\n clients().forEach(client => {\n if (client && client.readyState === WebSocket.OPEN) {\n client.send(data, {binary: isBinary})\n } else {\n const retryHandler = client._retryHandler || createRetryHandler()\n client._retryHandler = retryHandler\n\n if (retryHandler.shouldRetry()) {\n const delay = retryHandler.getDelay()\n retryHandler.increment()\n\n setTimeout(() => {\n if (client && client.readyState === WebSocket.OPEN) {\n retryHandler.reset()\n client.send(data, {binary: isBinary})\n }\n }, delay)\n }\n }\n })\n }\n wss.on(\"connection\", ws => {\n // Check connection limit\n if (!connectionManager.add(ws)) {\n console.log(\"Connection limit reached, rejecting connection\")\n ws.close(1013, \"Connection limit reached - try again later\")\n return\n }\n\n // Generate unique client ID for rate limiting\n const clientId = utils.text.random(9)\n console.log(\n `[HOLSTER-CONNECT] New WebSocket client connected: ${clientId}`,\n )\n\n ws.on(\"error\", error => {\n console.log(\"WebSocket error:\", error)\n connectionManager.remove(ws)\n })\n\n ws.on(\"close\", () => {\n console.log(\n `[HOLSTER-DISCONNECT] WebSocket client disconnected: ${clientId}`,\n )\n connectionManager.remove(ws)\n })\n\n ws.on(\"message\", (data, isBinary) => {\n // Validate message size\n const validation = validateMessage(data, opt.maxMessageSize)\n if (!validation.valid) {\n console.warn(`Invalid message: ${validation.error}`)\n ws.send(JSON.stringify({error: validation.error}))\n return\n }\n\n // Safe JSON parsing\n const parseResult = safeJSONParse(data, opt.maxMessageSize)\n if (!parseResult.success) {\n console.warn(`JSON parse error: ${parseResult.error}`)\n ws.send(JSON.stringify({error: \"Invalid JSON\"}))\n return\n }\n\n const msg = parseResult.data\n if (dup.check(msg[\"#\"])) return\n\n // Check rate limit and get delay\n const delay = rateLimiter.getDelay(clientId)\n // Log rate limiting activity and enforce stricter limits\n if (delay > 0) {\n const throttleCount = rateLimiter.getThrottleCount(clientId)\n console.log(\n `[HOLSTER-THROTTLE] Client ${clientId}: rate limit exceeded, delay would be ${delay}ms, dropping message (throttle count: ${throttleCount})`,\n )\n // Check if we should disconnect the bad actor\n if (rateLimiter.shouldDisconnect(clientId)) {\n console.log(\n `[HOLSTER-DISCONNECT] Client ${clientId}: Disconnecting bad actor after ${throttleCount} throttle violations`,\n )\n ws.close(1008, \"Rate limit violations - bad actor\")\n return\n }\n\n // Send throttle warning back to client instead of processing\n ws.send(\n JSON.stringify({\n \"#\": dup.track(utils.text.random(9)),\n \"@\": msg[\"#\"],\n err: `Rate limit exceeded. Slow down requests. Wait ${Math.ceil(delay / 1000)}s`,\n throttle: delay,\n }),\n )\n return\n }\n\n const processMessage = () => {\n dup.track(msg[\"#\"])\n\n if (msg.get) get(msg, send)\n if (msg.put) put(msg, send)\n send(data, isBinary)\n\n const id = msg[\"@\"]\n const cb = queue[id]\n if (cb) {\n delete msg[\"#\"]\n delete msg[\"@\"]\n cb(msg)\n\n delete queue[id]\n }\n }\n\n if (delay > 0) {\n // Throttle the client by delaying message processing\n setTimeout(processMessage, delay)\n } else {\n // Process immediately\n processMessage()\n }\n })\n })\n return api(send)\n }\n\n // Browser logic.\n const peers = []\n // Client-side throttling state\n let clientThrottled = false\n let throttleUntil = 0\n let messageQueue = []\n let queueProcessor = null\n const maxQueueLength = opt.maxQueueLength || 1000\n\n const processQueue = () => {\n if (messageQueue.length === 0) {\n queueProcessor = null\n return\n }\n\n const now = Date.now()\n if (clientThrottled && now < throttleUntil) {\n // Still throttled, schedule next queue check\n queueProcessor = setTimeout(\n processQueue,\n Math.min(1000, throttleUntil - now),\n )\n return\n }\n\n // Throttle period ended, resume processing\n if (clientThrottled && now >= throttleUntil) {\n console.log(\n `[CLIENT-THROTTLED] Throttle period ended, resuming queue processing`,\n )\n clientThrottled = false\n throttleUntil = 0\n }\n\n // Process next message in queue\n const data = messageQueue.shift()\n sendToPeers(data)\n\n // Schedule processing of next message if queue not empty\n if (messageQueue.length > 0) {\n // Add small delay between messages to avoid immediate re-throttling\n queueProcessor = setTimeout(processQueue, 100)\n } else {\n queueProcessor = null\n }\n }\n\n const sendToPeers = data => {\n peers.forEach(peer => {\n if (peer && peer.readyState === WebSocket.OPEN) {\n peer.send(data)\n } else {\n const retryHandler = peer._retryHandler || createRetryHandler()\n peer._retryHandler = retryHandler\n\n if (retryHandler.shouldRetry()) {\n const delay = retryHandler.getDelay()\n retryHandler.increment()\n\n setTimeout(() => {\n if (peer && peer.readyState === WebSocket.OPEN) {\n retryHandler.reset()\n peer.send(data)\n }\n }, delay)\n }\n }\n })\n }\n\n const send = data => {\n // Check if client is throttled or queue is active\n if (clientThrottled || messageQueue.length > 0) {\n if (messageQueue.length >= maxQueueLength) {\n return {\n err: `Message queue exceeded maximum length (${maxQueueLength}). Update query logic to request less data.`,\n queueLength: messageQueue.length,\n maxQueueLength: maxQueueLength,\n }\n }\n\n // Add message to queue instead of sending immediately\n messageQueue.push(data)\n console.log(\n `Queuing message (queue length: ${messageQueue.length}/${maxQueueLength})`,\n )\n // Start queue processor if not already running\n if (!queueProcessor) {\n queueProcessor = setTimeout(processQueue, 100)\n }\n return\n }\n\n // Normal case - send immediately\n sendToPeers(data)\n }\n if (!(opt.peers instanceof Array)) {\n opt.peers = [`ws://localhost:${opt.port || 8765}`]\n }\n opt.peers.forEach(peer => {\n const start = () => {\n let ws = new WebSocket(peer)\n peers.push(ws)\n const retryHandler = createRetryHandler()\n\n ws.onclose = c => {\n if (peers.indexOf(ws) !== -1) {\n peers.splice(peers.indexOf(ws), 1)\n }\n ws = null\n\n if (retryHandler.shouldRetry()) {\n const delay = retryHandler.getDelay()\n retryHandler.increment()\n setTimeout(start, delay)\n }\n }\n\n ws.onopen = () => {\n retryHandler.reset()\n }\n\n ws.onerror = e => {\n console.log(e)\n }\n ws.onmessage = async m => {\n const msg = JSON.parse(m.data)\n if (dup.check(msg[\"#\"])) return\n\n // Handle throttle messages from server\n if (msg.throttle && msg.err) {\n console.log(`[CLIENT-THROTTLED] Server throttling: ${msg.err}`)\n clientThrottled = true\n throttleUntil = Date.now() + msg.throttle\n return\n }\n\n dup.track(msg[\"#\"])\n if (msg.get) get(msg, send)\n if (msg.put) {\n // Handle selective storage for client WebSocket messages\n const filteredPut = {}\n for (const [soul, node] of Object.entries(msg.put)) {\n let shouldStore = false\n // Case 1: We already have this soul - always update\n if (await hasSoul(soul)) {\n shouldStore = true\n // Check if this update adds new references\n if (node && typeof node === \"object\") {\n for (const [key, value] of Object.entries(node)) {\n const soulId = utils.rel.is(value)\n if (soulId) {\n // Add referenced soul to pending list\n pendingReferences.add(soulId)\n }\n }\n }\n }\n // Case 2: This soul was referenced by something we have\n if (pendingReferences.has(soul)) {\n shouldStore = true\n pendingReferences.delete(soul) // Got it, remove from pending\n }\n if (shouldStore) {\n filteredPut[soul] = node\n }\n }\n // Store filtered data if any\n if (Object.keys(filteredPut).length > 0) {\n // Create filtered message for Ham.mix\n const filteredMsg = {put: filteredPut}\n put(filteredMsg, send)\n }\n }\n send(m.data)\n\n const id = msg[\"@\"]\n const cb = queue[id]\n if (cb) {\n delete msg[\"#\"]\n delete msg[\"@\"]\n cb(msg)\n\n delete queue[id]\n }\n }\n }\n start()\n })\n\n return api(send)\n}\n\nexport default Wire\n", "import * as utils from \"./utils.js\"\nimport Wire from \"./wire.js\"\nimport SEA from \"./sea.js\"\n\nconst User = (opt, wire) => {\n if (!wire) wire = Wire(opt)\n let pubs = []\n let creating = false\n let authing = false\n let retries = 0\n\n const auth = (username, password, newPassword, ack) => {\n const retry = username => {\n retries++\n auth(username, password, newPassword, ack)\n }\n const done = err => {\n pubs = []\n retries = 0\n authing = false\n ack(err)\n }\n const next = () => {\n if (pubs.length === 0) {\n done(\"Wrong username or password\")\n return\n }\n\n const pub = pubs.shift()\n wire.get(\n {\"#\": pub},\n async msg => {\n if (msg.err) {\n done(`error getting ${pub}: ${msg.err}`)\n return\n }\n\n const data = msg.put && msg.put[pub]\n if (!data || !data.auth) return next()\n\n const auth = JSON.parse(data.auth)\n const work = await SEA.work(password, auth.salt)\n const dec = await SEA.decrypt(auth.enc, work)\n if (!dec) return next()\n\n user.is = {\n username: username,\n pub: data.pub,\n epub: data.epub,\n priv: dec.priv,\n epriv: dec.epriv,\n }\n if (newPassword !== \"\") {\n // Encrypt private key using new password and a new salt.\n const salt = utils.text.random(64)\n const work = await SEA.work(newPassword, salt)\n const enc = await SEA.encrypt(dec, work)\n // Put all fields so that verification applies to the whole node.\n const update = {\n username: username,\n pub: data.pub,\n epub: data.epub,\n auth: JSON.stringify({enc: enc, salt: salt}),\n }\n const signed = await SEA.sign(update, user.is)\n const graph = utils.graph(pub, signed.m, signed.s, data.pub)\n wire.put(graph, err => {\n if (err) {\n done(`error putting ${update} on ${pub}: ${err}`)\n } else {\n done(null)\n }\n })\n return\n }\n\n return done(null)\n },\n {wait: 1000},\n )\n }\n\n if (retries > 9) {\n done(\"Wrong username or password\")\n return\n }\n\n const soul = \"~@\" + username\n wire.get(\n {\"#\": soul},\n async msg => {\n if (msg.err) {\n done(`error getting ${soul}: ${msg.err}`)\n return\n }\n\n const data = msg.put && msg.put[soul]\n if (!data) return retry(username)\n\n delete msg.put[soul]._\n // Usernames aren't guaranteed to be unique, so store the list and then\n // try each of them until one is successful with the given password.\n pubs = Object.keys(data)\n next()\n },\n {wait: 1000},\n )\n }\n\n const user = {\n create: (username, password, cb) => {\n const ack = err => {\n if (cb) cb(err)\n else console.log(err)\n }\n\n if (creating) {\n ack(\"User is already being created\")\n return\n }\n\n if (username === \"\") {\n ack(\"Please provide a username\")\n return\n }\n\n if (password === \"\") {\n ack(\"Please provide a password\")\n return\n }\n\n creating = true\n\n const soul = \"~@\" + username\n wire.get(\n {\"#\": soul},\n async msg => {\n if (msg.err) {\n creating = false\n ack(`error getting ${soul}: ${msg.err}`)\n return\n }\n\n if (msg.put && msg.put[soul]) {\n creating = false\n ack(\"Username already exists\")\n return\n }\n\n const salt = utils.text.random(64)\n const work = await SEA.work(password, salt)\n const pair = await SEA.pair()\n const priv = {priv: pair.priv, epriv: pair.epriv}\n const enc = await SEA.encrypt(priv, work)\n const data = {\n username: username,\n pub: pair.pub,\n epub: pair.epub,\n auth: JSON.stringify({enc: enc, salt: salt}),\n }\n\n const pub = \"~\" + pair.pub\n const signed = await SEA.sign(data, pair)\n const graph = utils.graph(pub, signed.m, signed.s, pair.pub)\n wire.put(graph, err => {\n creating = false\n if (err) {\n ack(`error putting ${data} on ${pub}: ${err}`)\n return\n }\n\n const rel = {[pub]: {\"#\": pub}}\n wire.put(utils.graph(soul, rel), err => {\n if (err) {\n ack(`error putting ${rel} on ${soul}: ${err}`)\n return\n }\n\n // Return null on success.\n if (cb) cb(null)\n })\n })\n },\n {wait: 1000},\n )\n },\n auth: (username, password, cb) => {\n const ack = err => {\n if (cb) cb(err)\n else if (err) console.log(err)\n }\n\n if (authing) {\n ack(\"User is already authenticating\")\n return\n }\n\n user.is = null\n\n if (username === \"\") {\n ack(\"Please provide a username\")\n return\n }\n\n if (password === \"\") {\n ack(\"Please provide a password\")\n return\n }\n\n authing = true\n auth(username, password, \"\", ack)\n },\n change: (username, password, newPassword, cb) => {\n const ack = err => {\n if (cb) cb(err)\n else if (err) console.log(err)\n }\n\n if (authing) {\n ack(\"User is already authenticating\")\n return\n }\n\n user.is = null\n\n if (username === \"\") {\n ack(\"Please provide a username\")\n return\n }\n\n if (password === \"\") {\n ack(\"Please provide a password\")\n return\n }\n\n if (newPassword === \"\") {\n ack(\"Please provide a new password\")\n return\n }\n\n authing = true\n auth(username, password, newPassword, ack)\n },\n store: localStorage => {\n if (!user.is) {\n console.log(\"Please authenticate before calling store\")\n return\n }\n\n if (localStorage) {\n if (typeof globalThis.localStorage !== \"undefined\") {\n globalThis.localStorage.setItem(\"user.is\", JSON.stringify(user.is))\n }\n if (typeof globalThis.sessionStorage !== \"undefined\") {\n globalThis.sessionStorage.removeItem(\"user.is\")\n }\n return\n }\n\n if (typeof globalThis.sessionStorage !== \"undefined\") {\n globalThis.sessionStorage.setItem(\"user.is\", JSON.stringify(user.is))\n }\n if (typeof globalThis.localStorage !== \"undefined\") {\n globalThis.localStorage.removeItem(\"user.is\")\n }\n },\n recall: () => {\n if (typeof globalThis.localStorage !== \"undefined\") {\n const is = globalThis.localStorage.getItem(\"user.is\")\n if (is) {\n user.is = JSON.parse(is)\n return\n }\n }\n\n if (typeof globalThis.sessionStorage !== \"undefined\") {\n const is = globalThis.sessionStorage.getItem(\"user.is\")\n if (is) {\n user.is = JSON.parse(is)\n }\n }\n },\n leave: () => {\n user.is = null\n if (typeof globalThis.localStorage !== \"undefined\") {\n globalThis.localStorage.removeItem(\"user.is\")\n }\n if (typeof globalThis.sessionStorage !== \"undefined\") {\n globalThis.sessionStorage.removeItem(\"user.is\")\n }\n },\n delete: (username, password, cb) => {\n const ack = err => {\n if (cb) cb(err)\n else console.log(err)\n }\n\n if (authing) {\n ack(\"User is already authenticating\")\n return\n }\n\n if (username === \"\") {\n ack(\"Please provide a username\")\n return\n }\n\n if (password === \"\") {\n ack(\"Please provide a password\")\n return\n }\n\n authing = true\n auth(username, password, \"\", async err => {\n if (err) {\n ack(err)\n return\n }\n\n const data = {username: null, pub: null, epub: null, auth: null}\n const signed = await SEA.sign(data, user.is)\n const pub = \"~\" + user.is.pub\n const graph = utils.graph(pub, signed.m, signed.s, user.is.pub)\n wire.put(graph, err => {\n if (err) {\n ack(`error putting null on ${pub}: ${err}`)\n return\n }\n\n user.is = null\n // Return null on success. Note currently not updating ~@username,\n // not sure if allowing username re-user is a good idea anyway?\n if (cb) cb(null)\n })\n })\n },\n }\n return user\n}\n\nexport default User\n", "import * as utils from \"./utils.js\"\nimport Wire from \"./wire.js\"\nimport User from \"./user.js\"\nimport SEA from \"./sea.js\"\n\nconst Holster = opt => {\n if (typeof opt === \"string\") opt = {peers: [opt]}\n else if (opt instanceof Array) opt = {peers: opt}\n else if (!utils.obj.is(opt)) opt = {}\n\n const wire = Wire(opt)\n const user = User(null, wire)\n // Map callbacks since the user's callback is not passed to wire.on.\n const map = new Map()\n // Allow concurrent calls to the api by storing each context.\n const allctx = new Map()\n\n const ok = data => {\n return (\n data === null ||\n data === true ||\n data === false ||\n typeof data === \"string\" ||\n utils.rel.is(data) ||\n utils.num.is(data)\n )\n }\n\n // check returns true if data is ok to add to a graph, an error string if\n // the data can't be converted, and the keys on the data object otherwise.\n const check = data => {\n if (ok(data)) return true\n\n if (utils.obj.is(data)) {\n const keys = []\n for (const [key, value] of Object.entries(data)) {\n if (key === \"_\") {\n return \"error underscore cannot be used as a property name\"\n }\n if (utils.obj.is(value) || ok(value)) {\n keys.push(key)\n continue\n }\n if (typeof value === \"undefined\") {\n return `error undefined ${key} cannot be converted to a graph`\n }\n const error = JSON.stringify({[key]: value})\n return `error ${error} cannot be converted to a graph`\n }\n if (keys.length !== 0) return keys\n }\n const error = JSON.stringify(data)\n return `error ${error} cannot be converted to a graph`\n }\n\n const api = ctxid => {\n const get = (lex, soul, ack, _opt) => {\n wire.get(\n utils.obj.put(lex, \"#\", soul),\n async msg => {\n if (msg.err) console.log(msg.err)\n if (msg.put && msg.put[soul]) {\n delete msg.put[soul]._\n delete msg.put[soul][utils.userPublicKey]\n delete msg.put[soul][utils.userSignature]\n // Resolve any rels on the node before returning to the user.\n for (const key of Object.keys(msg.put[soul])) {\n const id = utils.rel.is(msg.put[soul][key])\n if (id) {\n const data = await new Promise(res => {\n const _ctxid = utils.text.random()\n allctx.set(_ctxid, {chain: [{item: null, soul: id}]})\n api(_ctxid).next(null, res, _opt)\n })\n msg.put[soul][key] = data\n }\n }\n ack(msg.put[soul])\n } else {\n // No data callback.\n ack(null)\n }\n },\n _opt,\n )\n }\n\n const graph = async (soul, data, userctx, cb) => {\n if (userctx) {\n const signed = await SEA.sign(data, userctx)\n return utils.graph(soul, signed.m, signed.s, userctx.pub)\n }\n\n if (opt.secure) {\n if (!cb) cb = console.log\n cb(`error putting data on ${soul}: user required in secure mode`)\n return null\n }\n\n return utils.graph(soul, data)\n }\n\n // done takes a context id and returns a new callback function so that the\n // callback is not overwritten by simultaneous requests.\n const done = ctxid => {\n return data => {\n const ctx = allctx.get(ctxid)\n if (ctx && typeof ctx.cb !== \"undefined\") {\n // Use a timeout so that the context can be removed before data is\n // returned to the callback (allows nested get calls).\n setTimeout(() => ctx.cb(data), 1)\n } else if (data) {\n console.log(\"error no callback for data\", data, \"ctx\", ctx)\n }\n // A context updated by \"on\" should only be removed by \"off\".\n if (ctx && !ctx.on) allctx.delete(ctxid)\n }\n }\n\n const resolve = (request, cb) => {\n if (!request) {\n console.log(\"error resolve request parameter required\")\n return\n }\n\n const get = typeof request.get !== \"undefined\"\n const put = typeof request.put !== \"undefined\"\n const on = typeof request.on !== \"undefined\"\n const off = typeof request.off !== \"undefined\"\n\n let found = false\n const ctx = allctx.get(ctxid)\n for (var i = 1; i < ctx.chain.length; i++) {\n if (ctx.chain[i].soul !== null) continue\n\n found = true\n break\n }\n\n if (found) {\n // Found a soul that needs resolving, need the previous context\n // (ie the parent node) to find a soul relation for it.\n const {item, soul} = ctx.chain[i - 1]\n // If this is a user context or using secure mode then need to get the\n // whole node for verification.\n const lex =\n ctx.user || opt.secure ? {\"#\": soul} : {\"#\": soul, \".\": item}\n wire.get(\n lex,\n async msg => {\n if (msg.err) {\n if (ctx.user || opt.secure) {\n console.log(`error getting ${soul}: ${msg.err}`)\n } else {\n console.log(`error getting ${item} on ${soul}: ${msg.err}`)\n }\n if (cb) cb(null)\n return\n }\n\n let node = msg.put && msg.put[soul]\n if (node && typeof node[item] !== \"undefined\") {\n let id = utils.rel.is(node[item])\n if (id) {\n ctx.chain[i].soul = id\n allctx.set(ctxid, {...ctx})\n // Call api again using the updated context.\n if (get) {\n api(ctxid).next(null, request.get, cb, request._opt)\n } else if (put) {\n api(ctxid).put(request.put, cb)\n } else if (on) {\n api(ctxid).on(request.on, cb, request._get, request._opt)\n } else if (off) {\n api(ctxid).off(cb)\n }\n } else if (get) {\n // Request was not for a node, return property on current soul.\n cb(node[item])\n } else if (put) {\n // Request was chained before put, so rel doesn't exist yet.\n id = utils.text.random()\n node[item] = utils.rel.ify(id)\n const g = await graph(soul, node, ctx.user, cb)\n if (g === null) return\n\n wire.put(g, err => {\n if (err) {\n cb(`error putting ${item} on ${soul}: ${err}`)\n return\n }\n\n ctx.chain[i].soul = id\n api(ctxid).put(request.put, cb)\n })\n } else if (on) {\n // Allow listening to a node that doesn't exist.\n cb(null)\n } else if (off) {\n // Allow stop listening to a node that doesn't exist.\n if (cb) cb(null)\n }\n } else if (put) {\n // Request was chained before put, so rel doesn't exist yet.\n const id = utils.text.random()\n if (!node) node = {}\n node[item] = utils.rel.ify(id)\n const g = await graph(soul, node, ctx.user, cb)\n if (g === null) return\n\n wire.put(g, err => {\n if (err) {\n cb(`error putting ${item} on ${soul}: ${err}`)\n return\n }\n\n ctx.chain[i].soul = id\n api(ctxid).put(request.put, cb)\n })\n } else {\n // Allow querying a node that doesn't exist.\n if (cb) cb(null)\n }\n },\n request._opt,\n )\n // Callback has been passed to next soul lookup or called above, so\n // return false as the calling code should not continue.\n return false\n }\n\n if (get && ctx.chain[ctx.chain.length - 1].item !== null) {\n // The context has been resolved but it does not include the requested\n // node, which requires one more lookup.\n ctx.chain.push({item: null, soul: null})\n api(ctxid).next(null, request.get, cb, request._opt)\n return false\n }\n\n // Return the last context, ie the soul required by the calling code.\n return ctx.chain[ctx.chain.length - 1]\n }\n\n return {\n get: (key, lex, cb, _opt) => {\n if (typeof lex === \"function\") {\n _opt = cb\n cb = lex\n lex = null\n }\n if (key === null || key === \"\" || key === \"_\") {\n console.log(\"error please provide a key\")\n if (cb) cb(null)\n return\n }\n\n // lex requires a callback as it's not included in the chain below.\n if (lex && typeof cb !== \"function\") {\n console.log(\"error lex requires a callback function\")\n return\n }\n\n // Top level keys are added to a root node so their values don't need\n // to be objects.\n ctxid = utils.text.random()\n allctx.set(ctxid, {chain: [{item: key, soul: \"root\"}], cb: cb})\n if (!cb) return api(ctxid)\n\n const _done = done(ctxid)\n // When there's a callback need to resolve the context first.\n const {soul} = resolve({get: lex, _opt: _opt}, _done)\n if (soul) get(lex, soul, _done, _opt)\n },\n next: (key, lex, cb, _opt) => {\n // ack needs to work the same as done, pass it the context id and then\n // return a new function for the actual callback.\n const ack = ctxid => {\n return data => {\n if (cb) {\n cb(data)\n } else {\n done(ctxid)(data)\n }\n }\n }\n if (typeof lex === \"function\") {\n _opt = cb\n cb = lex\n lex = null\n }\n if (!ctxid) {\n console.log(\"error please provide a key using get(key)\")\n if (cb) cb(null)\n return\n }\n\n const _ack = ack(ctxid)\n if (key === \"\" || key === \"_\") {\n _ack(null)\n return\n }\n\n // lex requires a callback as it's not included in the chain below.\n if (lex && typeof cb !== \"function\") {\n console.log(\"error lex requires a callback function\")\n return\n }\n\n const ctx = allctx.get(ctxid)\n // ctx already removed by another chained callback is ok?\n if (!ctx) return\n\n if (cb && typeof ctx.cb === \"undefined\") {\n // This (and ack) allows nested objects to set their own callbacks.\n ctx.cb = cb\n cb = null\n }\n\n // Push the key to the context as it needs a soul lookup.\n // (null is used to call the api with updated context)\n if (key !== null) ctx.chain.push({item: key, soul: null})\n if (!ctx.cb) return api(ctxid)\n\n // When there's a callback need to resolve the context first.\n const {soul} = resolve({get: lex, _opt: _opt}, _ack)\n if (soul) get(lex, soul, _ack, _opt)\n },\n put: (data, set, cb) => {\n if (typeof set === \"function\") {\n cb = set\n set = false\n }\n const ack = ctxid => {\n return data => {\n if (cb) {\n cb(data)\n } else {\n done(ctxid)(data)\n }\n }\n }\n if (!ctxid) {\n if (cb) cb(\"error please provide a key using get(key)\")\n return\n }\n\n const ctx = allctx.get(ctxid)\n // ctx already removed by another chained callback is ok?\n if (!ctx) return\n\n if (!ctx.cb) {\n if (!cb) return\n\n // This (and ack) allows nested objects to set their own callbacks.\n ctx.cb = cb\n cb = null\n }\n if (set) data = {[utils.text.random()]: data}\n\n const _ack = ack(ctxid)\n const result = check(data)\n if (typeof result === \"string\") {\n // All strings returned from check are errors, cannot continue.\n _ack(result)\n return\n }\n\n // Resolve the current context before putting data. (Note that set is\n // not passed to resolve because it's already been applied above.)\n const {item, soul} = resolve({put: data}, _ack)\n if (!soul) return\n\n if (result === true) {\n // When result is true data is a property to put on the current soul.\n // Need to check if item is a rel and also set the node to null. (This\n // applies for any update from a rel to a property, not just null.)\n // If using secure mode need to get the whole node for verification.\n const lex =\n ctx.user || opt.secure ? {\"#\": soul} : {\"#\": soul, \".\": item}\n wire.get(lex, async msg => {\n if (msg.err) {\n _ack(`error getting ${soul}: ${msg.err}`)\n return\n }\n\n let node = msg.put && msg.put[soul]\n const current = node && node[item]\n const id = utils.rel.is(current)\n if (!id) {\n // Not a rel, can just put the data.\n if (!node) node = {}\n node[item] = data\n const g = await graph(soul, node, ctx.user, _ack)\n if (g === null) return\n\n wire.put(g, _ack)\n return\n }\n\n wire.get({\"#\": id}, async msg => {\n if (msg.err) {\n _ack(`error getting ${id}: ${msg.err}`)\n return\n }\n\n if (!msg.put || !msg.put[id]) {\n _ack(`error ${id} not found`)\n return\n }\n\n // null each of the properties on the node before putting data.\n for (const key of Object.keys(msg.put[id])) {\n if (\n key === \"_\" ||\n key === utils.userPublicKey ||\n key === utils.userSignature\n ) {\n continue\n }\n\n const err = await new Promise(res => {\n const _ctxid = utils.text.random()\n const chain = [{item: key, soul: id}]\n allctx.set(_ctxid, {chain: chain, user: ctx.user})\n api(_ctxid).put(null, res)\n })\n if (err) {\n _ack(err)\n return\n }\n }\n if (!node) node = {}\n node[item] = data\n const g = await graph(soul, node, ctx.user, _ack)\n if (g === null) return\n\n wire.put(g, _ack)\n })\n })\n return\n }\n\n // Otherwise put the data using the keys returned in result.\n // Need to check if a rel has already been added on the current node.\n // If using secure mode need to get the whole node for verification.\n const lex =\n ctx.user || opt.secure ? {\"#\": soul} : {\"#\": soul, \".\": item}\n wire.get(lex, async msg => {\n if (msg.err) {\n _ack(`error getting ${soul}.${item}: ${msg.err}`)\n return\n }\n\n let node = msg.put && msg.put[soul]\n const current = node && node[item]\n const id = utils.rel.is(current)\n if (!id) {\n // The current rel doesn't exist, so add it first.\n if (!node) node = {}\n node[item] = utils.rel.ify(utils.text.random())\n const g = await graph(soul, node, ctx.user, _ack)\n if (g === null) return\n\n wire.put(g, err => {\n if (err) {\n _ack(`error putting ${item} on ${soul}: ${err}`)\n } else {\n const _ctxid = utils.text.random()\n const chain = [{item: item, soul: soul}]\n // Pass on the previous context's callback and user flag here.\n allctx.set(_ctxid, {chain: chain, user: ctx.user, cb: ctx.cb})\n api(_ctxid).put(data)\n }\n })\n return\n }\n\n const update = []\n for (const key of result) {\n const err = await new Promise(res => {\n if (utils.obj.is(data[key]) && !utils.rel.is(data[key])) {\n // Use the current rel as the context for nested objects.\n const _ctxid = utils.text.random()\n const chain = [{item: key, soul: id}]\n allctx.set(_ctxid, {chain: chain, user: ctx.user})\n api(_ctxid).put(data[key], res)\n } else {\n // Group the rest of the updates for put below.\n update.push(key)\n res(null)\n }\n })\n if (err) {\n _ack(err, ctxid)\n return\n }\n }\n\n if (update.length === 0) {\n _ack(null)\n return\n }\n\n // The nested objects created above will also have rels on the parent\n // object, so fetch the node so the rest of the updates can be added.\n wire.get({\"#\": id}, async msg => {\n if (msg.err) {\n _ack(`error getting ${id}: ${msg.err}`)\n return\n }\n\n let node = msg.put && msg.put[id]\n if (!node) node = {}\n update.forEach(key => {\n node[key] = data[key]\n })\n const g = await graph(id, node, ctx.user, _ack)\n if (g === null) return\n\n wire.put(g, _ack)\n })\n })\n },\n on: (lex, cb, _get, _opt) => {\n if (typeof lex === \"function\") {\n _opt = _get\n _get = cb\n cb = lex\n lex = null\n }\n if (typeof cb !== \"function\") {\n console.log(\"error on() requires a callback function\")\n return\n }\n\n if (!ctxid) {\n console.log(\"error please provide a key using get(key)\")\n cb(null)\n return\n }\n\n // Resolve the current context before adding event listener.\n const {item, soul} = resolve({on: lex, _get: _get, _opt: _opt}, cb)\n if (!soul) return\n\n // Flag that this context is set from on and shouldn't be removed.\n allctx.set(ctxid, {chain: [{item: item, soul: soul}], on: true})\n // Map the user's callback because it can also be passed to off,\n // so need a reference to it to compare them.\n map.set(cb, () => api(ctxid).next(null, cb, _opt))\n // Check if item is a rel and add event listener for the node.\n wire.get(\n {\"#\": soul, \".\": item},\n msg => {\n if (msg.err) {\n console.log(`error getting ${soul}.${item}: ${msg.err}`)\n return\n }\n\n const current = msg.put && msg.put[soul] && msg.put[soul][item]\n const id = utils.rel.is(current)\n if (id) {\n if (lex) lex = utils.obj.put(lex, \"#\", id)\n else lex = {\"#\": id, \".\": null}\n } else {\n if (lex) lex = utils.obj.put(lex, \"#\", soul)\n else lex = {\"#\": soul, \".\": item}\n }\n wire.on(lex, map.get(cb), _get, _opt)\n },\n _opt,\n )\n },\n off: cb => {\n if (!ctxid) {\n console.log(\"error please provide a key using get(key)\")\n if (cb) cb(null)\n return\n }\n\n // Resolve the current context before removing event listener.\n const {item, soul} = resolve({off: true}, cb)\n if (!soul) return\n\n // Check if item is a rel and remove event listener for the node.\n wire.get({\"#\": soul, \".\": item}, msg => {\n if (msg.err) {\n console.log(`error getting ${soul}.${item}: ${msg.err}`)\n return\n }\n\n const current = msg.put && msg.put[soul] && msg.put[soul][item]\n const id = utils.rel.is(current)\n if (id) wire.off({\"#\": id}, map.get(cb))\n else wire.off({\"#\": soul}, map.get(cb))\n map.delete(cb)\n allctx.delete(ctxid)\n })\n },\n user: () => {\n if (!user.get) {\n // Return the combined Holster and User APIs.\n Object.assign(user, api())\n // Need to provide a user specific get() function to know if user\n // context should be checked.\n user.get = (keys, lex, cb, _opt) => {\n if (typeof lex === \"function\") {\n _opt = cb\n cb = lex\n lex = null\n }\n\n let pub = null\n let key = null\n if (user.is) pub = user.is.pub\n if (typeof keys === \"string\") {\n key = keys\n } else if (keys instanceof Array) {\n if (keys.length === 2) {\n pub = keys[0]\n key = keys[1]\n } else if (keys.length === 1) {\n key = keys[0]\n }\n }\n if (!pub) {\n console.log(\"error please log in or provide a public key\")\n if (cb) cb(null)\n return\n }\n\n if (key === null || key === \"\" || key === \"_\") {\n console.log(\"error please provide a key\")\n if (cb) cb(null)\n return\n }\n\n // lex requires a callback as it's not included in the chain below.\n if (lex && !cb) {\n console.log(\"error lex requires a callback function\")\n return\n }\n\n ctxid = utils.text.random()\n const chain = [{item: key, soul: \"~\" + pub}]\n allctx.set(ctxid, {chain: chain, user: user.is, cb: cb})\n if (!cb) return api(ctxid)\n\n // When there's a callback need to resolve the context first.\n const _done = done(ctxid)\n const {soul} = resolve({get: lex, _opt: _opt}, _done)\n if (soul) get(lex, soul, _done, _opt)\n }\n }\n return user\n },\n // Allow the wire spec to be used via holster.\n wire: wire,\n // Allow SEA functions to be used via holster.\n SEA: SEA,\n }\n }\n return api()\n}\n\nexport default Holster\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["export const num = {\n is: n => {\n if (n instanceof Array) return false\n\n if (typeof n === \"number\") return !isNaN(n)\n\n if (typeof n === \"string\") {\n const parsed = parseFloat(n)\n return !isNaN(parsed) && isFinite(parsed)\n }\n\n return false\n },\n}\n\nexport const obj = {\n is: o => {\n if (!o || typeof o !== \"object\") return false\n\n const toString = Object.prototype.toString.call(o)\n const match = toString.match(/^\\[object (\\w+)\\]$/)\n return o.constructor === Object || (match && match[1] === \"Object\")\n },\n map: (list, cb, o) => {\n var keys = Object.keys(list)\n for (let i = 0; i < keys.length; i++) {\n let result = cb(list[keys[i]], keys[i], o)\n if (typeof result !== \"undefined\") return result\n }\n },\n put: (o, key, value) => {\n if (!o) o = {}\n o[key] = value\n return o\n },\n del: (o, key) => {\n if (!o) return\n\n o[key] = null\n delete o[key]\n return o\n },\n}\n\nconst map_soul = (soul, key, o) => {\n // If id is already defined AND we're still looping through the object,\n // then it is considered invalid.\n if (o.id) {\n o.id = false\n return\n }\n\n if (key === \"#\" && typeof soul === \"string\") {\n o.id = soul\n return\n }\n\n // If there exists anything else on the object that isn't the soul,\n // then it is considered invalid.\n o.id = false\n}\n\n// Check if an object is a soul relation, ie {'#': 'UUID'}\nexport const rel = {\n is: value => {\n if (value && value[\"#\"] && !value._ && obj.is(value)) {\n let o = {}\n obj.map(value, map_soul, o)\n if (o.id) return o.id\n }\n\n return false\n },\n // Convert a soul into a relation and return it.\n ify: soul => obj.put({}, \"#\", soul),\n}\n\nexport const userSignature = \"_holster_user_signature\"\nexport const userPublicKey = \"_holster_user_public_key\"\n\n// graph converts objects to graph format with updated states,\n// with optional meta data to verify signed data.\nexport const graph = (soul, data, sig, pub) => {\n const timestamp = Date.now()\n const g = {[soul]: {_: {\"#\": soul, \">\": {}}}}\n\n for (const [key, value] of Object.entries(data)) {\n if (key !== \"_\" && key !== userPublicKey && key !== userSignature) {\n g[soul][key] = value\n g[soul]._[\">\"][key] = timestamp\n }\n }\n // If a signature and public key are provided they also need to be stored on\n // the node to ensure that future updates are only possible with the same\n // public key. The signature is requried because later get requests will\n // broadcast the data as a put, which other devices will need to verify.\n if (sig && pub) {\n g[soul][userSignature] = sig\n g[soul]._[\">\"][userSignature] = timestamp\n g[soul][userPublicKey] = pub\n g[soul]._[\">\"][userPublicKey] = timestamp\n }\n return g\n}\n\nexport const match = (lex, key) => {\n // Null is used to match listeners on souls, which don't provide a key.\n if (typeof key === \"undefined\") return lex === null\n\n if (typeof lex === \"undefined\") return true\n\n if (typeof lex === \"string\") return lex === key\n\n if (!obj.is(lex) || !key) return false\n\n const prefix = lex[\"*\"]\n if (prefix) return key.slice(0, prefix.length) === prefix\n\n const gt = lex[\">\"]\n const lt = lex[\"<\"]\n if (gt && lt) return key >= gt && key <= lt\n\n if (gt) return key >= gt\n\n if (lt) return key <= lt\n\n return false\n}\n\nexport const text = {\n random: length => {\n var s = \"\"\n const c = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"\n if (!length) length = 24\n for (let i = 0; i < length; i++) {\n s += c.charAt(Math.floor(Math.random() * c.length))\n }\n return s\n },\n}\n", "const Dup = maxAge => {\n // Allow maxAge to be passed in as tests wait on the setTimeout.\n if (!maxAge) maxAge = 9000\n const dup = {store: {}}\n dup.check = id => (dup.store[id] ? dup.track(id) : false)\n dup.track = id => {\n // Keep the liveliness of the message up while it is being received.\n dup.store[id] = Date.now()\n if (!dup.expiry) {\n dup.expiry = setTimeout(() => {\n if (dup.expiry) return\n\n const now = Date.now()\n Object.keys(dup.store).forEach(id => {\n if (now - dup.store[id] > maxAge) delete dup.store[id]\n })\n dup.expiry = null\n }, maxAge)\n }\n return id\n }\n return dup\n}\n\nexport default Dup\n", "import {match} from \"./utils.js\"\n\nconst Get = (lex, graph) => {\n if (!lex || typeof lex !== \"object\") {\n throw new TypeError(\"lex must be an object\")\n }\n if (!graph || typeof graph !== \"object\") {\n throw new TypeError(\"graph must be an object\")\n }\n\n const soul = lex[\"#\"]\n if (!soul || typeof soul !== \"string\") {\n throw new TypeError(\"soul must be a string\")\n }\n\n if (!graph[soul]) return\n\n const node = {_: {\"#\": soul, \">\": {}}}\n\n if (typeof lex[\".\"] === \"string\") {\n const key = lex[\".\"]\n if (typeof graph[soul][key] === \"undefined\") return\n\n node[key] = graph[soul][key]\n node._[\">\"][key] = graph[soul]._[\">\"][key]\n } else {\n for (const key of Object.keys(graph[soul])) {\n if (match(lex[\".\"], key)) {\n node[key] = graph[soul][key]\n node._[\">\"][key] = graph[soul]._[\">\"][key]\n }\n }\n }\n return {[soul]: node}\n}\n\nexport default Get\n", "if (typeof btoa === \"undefined\") {\n globalThis.btoa = data => Buffer.from(data, \"binary\").toString(\"base64\")\n globalThis.atob = data => Buffer.from(data, \"base64\").toString(\"binary\")\n}\n\n// This is Array extended to have .toString([\"utf8\"|\"hex\"|\"base64\"])\nfunction SeaArray() {}\nObject.assign(SeaArray, {from: Array.from})\nSeaArray.prototype = Object.create(Array.prototype)\n\nSeaArray.prototype.toString = function (enc, start, end) {\n if (!enc) enc = \"utf8\"\n if (!start) start = 0\n\n end = end ? Math.min(Math.max(end, start), this.length) : this.length\n\n if (enc === \"hex\") {\n const buf = new Uint8Array(this.slice(start, end))\n return Array.from(buf, byte => byte.toString(16).padStart(2, \"0\")).join(\"\")\n }\n\n if (enc === \"utf8\") {\n return Array.from({length: end - start}, (_, i) => {\n const charCode = this[i + start]\n // Use unicode replacement character for invalid character codes.\n if (charCode < 0 || charCode > 0x10ffff) {\n return String.fromCharCode(0xfffd)\n }\n return String.fromCharCode(charCode)\n }).join(\"\")\n }\n\n if (enc === \"base64\") {\n const utf8String = Array.from({length: end - start}, (_, i) => {\n const charCode = this[i + start]\n if (charCode < 0 || charCode > 255) {\n return String.fromCharCode(0xfffd)\n }\n return String.fromCharCode(charCode)\n }).join(\"\")\n return btoa(utf8String)\n }\n}\n\nexport default SeaArray\n", "import SeaArray from \"./array.js\"\n\n// Security constants\nconst SECURITY_LIMITS = {\n MAX_BUFFER_SIZE: 10 * 1024 * 1024, // 10MB limit\n MAX_STRING_LENGTH: 1024 * 1024, // 1MB string limit\n}\n\n// Secure Buffer implementation for SEA.js\n// Compatible with NodeJS safe-buffer but with enhanced security\nfunction SafeBuffer(...props) {\n console.warn(\"new SafeBuffer() is deprecated, please use SafeBuffer.from()\")\n return SafeBuffer.from(...props)\n}\n\nSafeBuffer.prototype = Object.create(Array.prototype)\n\n// Input validation helpers\nconst validateStringInput = (input, encoding) => {\n if (typeof input !== \"string\") {\n throw new TypeError(\"Input must be a string for encoding: \" + encoding)\n }\n\n if (input.length > SECURITY_LIMITS.MAX_STRING_LENGTH) {\n throw new RangeError(\n `String too large: ${input.length} > ${SECURITY_LIMITS.MAX_STRING_LENGTH}`,\n )\n }\n}\n\nconst validateBufferSize = (size, operation = \"buffer operation\") => {\n if (size > SECURITY_LIMITS.MAX_BUFFER_SIZE) {\n throw new RangeError(\n `Buffer size too large for ${operation}: ${size} > ${SECURITY_LIMITS.MAX_BUFFER_SIZE}`,\n )\n }\n}\n\n// Secure hex parsing\nconst parseHexString = hexString => {\n validateStringInput(hexString, \"hex\")\n\n // Remove any whitespace and convert to lowercase\n const cleanHex = hexString.replace(/\\s/g, \"\").toLowerCase()\n\n // Validate hex format: only 0-9, a-f characters\n if (!/^[0-9a-f]*$/.test(cleanHex)) {\n throw new TypeError(\"Invalid hex string: contains non-hex characters\")\n }\n\n // Must be even length\n if (cleanHex.length % 2 !== 0) {\n throw new TypeError(\"Invalid hex string: must have even length\")\n }\n\n if (cleanHex.length === 0) {\n return new Uint8Array(0)\n }\n\n validateBufferSize(cleanHex.length / 2, \"hex parsing\")\n\n const bytes = new Uint8Array(cleanHex.length / 2)\n for (let i = 0; i < cleanHex.length; i += 2) {\n const hexByte = cleanHex.substr(i, 2)\n bytes[i / 2] = parseInt(hexByte, 16)\n }\n return bytes\n}\n\nconst encodeUtf8String = str => {\n validateStringInput(str, \"utf8\")\n\n try {\n // Use standard TextEncoder for proper UTF-8 encoding\n const encoder = new TextEncoder()\n const bytes = encoder.encode(str)\n\n validateBufferSize(bytes.length, \"UTF-8 encoding\")\n return bytes\n } catch (err) {\n throw new TypeError(\"Failed to encode UTF-8 string: \" + err.message)\n }\n}\n\nconst encodeBinaryString = str => {\n validateStringInput(str, \"binary\")\n\n validateBufferSize(str.length, \"binary encoding\")\n\n const bytes = new Uint8Array(str.length)\n for (let i = 0; i < str.length; i++) {\n const charCode = str.charCodeAt(i)\n\n // Binary strings should only contain bytes (0-255)\n if (charCode > 255) {\n throw new TypeError(\n `Invalid binary string: character at position ${i} exceeds byte range (${charCode} > 255)`,\n )\n }\n\n bytes[i] = charCode\n }\n return bytes\n}\n\n// Secure base64 decoding\nconst parseBase64String = base64String => {\n validateStringInput(base64String, \"base64\")\n\n // Remove any whitespace\n const cleanBase64 = base64String.replace(/\\s/g, \"\")\n\n // Validate base64 format\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(cleanBase64)) {\n throw new TypeError(\"Invalid base64 string: contains invalid characters\")\n }\n\n try {\n const decodedString = atob(cleanBase64)\n validateBufferSize(decodedString.length, \"base64 decoding\")\n\n const bytes = new Uint8Array(decodedString.length)\n for (let i = 0; i < decodedString.length; i++) {\n bytes[i] = decodedString.charCodeAt(i)\n }\n\n return bytes\n } catch (err) {\n throw new TypeError(\"Failed to decode base64 string: \" + err.message)\n }\n}\n\n// Secure array-like input processing\nconst processArrayLikeInput = input => {\n let bytes\n\n if (input instanceof ArrayBuffer) {\n validateBufferSize(input.byteLength, \"ArrayBuffer processing\")\n bytes = new Uint8Array(input)\n } else if (ArrayBuffer.isView(input)) {\n validateBufferSize(\n input.byteLength || input.length,\n \"TypedArray processing\",\n )\n bytes = new Uint8Array(input.buffer, input.byteOffset, input.byteLength)\n } else if (Array.isArray(input)) {\n validateBufferSize(input.length, \"Array processing\")\n\n // Validate all array elements are valid byte values\n for (let i = 0; i < input.length; i++) {\n const val = input[i]\n if (\n typeof val !== \"number\" ||\n val < 0 ||\n val > 255 ||\n !Number.isInteger(val)\n ) {\n throw new TypeError(\n `Invalid byte value at index ${i}: ${val} (must be integer 0-255)`,\n )\n }\n }\n\n bytes = new Uint8Array(input)\n } else if (\n typeof input === \"object\" &&\n input !== null &&\n typeof input.length === \"number\"\n ) {\n // Handle array-like objects\n validateBufferSize(input.length, \"array-like processing\")\n\n const arr = Array.from(input)\n for (let i = 0; i < arr.length; i++) {\n const val = arr[i]\n if (\n typeof val !== \"number\" ||\n val < 0 ||\n val > 255 ||\n !Number.isInteger(val)\n ) {\n throw new TypeError(\n `Invalid byte value at index ${i}: ${val} (must be integer 0-255)`,\n )\n }\n }\n\n bytes = new Uint8Array(arr)\n } else {\n throw new TypeError(\"Unsupported input type: \" + typeof input)\n }\n\n return bytes\n}\n\nObject.assign(SafeBuffer, {\n from() {\n const argCount = arguments.length\n\n if (argCount === 0) {\n throw new TypeError(\"SafeBuffer.from() requires at least one argument\")\n }\n\n const input = arguments[0]\n\n if (input === null || input === undefined) {\n throw new TypeError(\"First argument must not be null or undefined\")\n }\n\n let bytes\n\n if (typeof input === \"string\") {\n const encoding = (arguments[1] || \"utf8\").toLowerCase()\n\n switch (encoding) {\n case \"hex\":\n bytes = parseHexString(input)\n break\n\n case \"utf8\":\n case \"utf-8\":\n bytes = encodeUtf8String(input)\n break\n\n case \"binary\":\n case \"latin1\":\n bytes = encodeBinaryString(input)\n break\n\n case \"base64\":\n bytes = parseBase64String(input)\n break\n\n case \"ascii\":\n // ASCII is subset of UTF-8, but validate range\n validateStringInput(input, \"ascii\")\n for (let i = 0; i < input.length; i++) {\n if (input.charCodeAt(i) > 127) {\n throw new TypeError(\n `Invalid ASCII character at position ${i}: ${input.charCodeAt(i)} > 127`,\n )\n }\n }\n bytes = encodeUtf8String(input) // Safe since ASCII is UTF-8 subset\n break\n\n default:\n throw new TypeError(\"Unknown encoding: \" + encoding)\n }\n } else {\n bytes = processArrayLikeInput(input)\n }\n\n if (!bytes || bytes.length === 0) {\n return SeaArray.from(new Uint8Array(0))\n }\n\n try {\n return SeaArray.from(bytes)\n } catch (err) {\n throw new Error(\"Failed to create SafeBuffer: \" + err.message)\n }\n },\n\n alloc(length, fill = 0) {\n if (typeof length !== \"number\" || !Number.isInteger(length) || length < 0) {\n throw new TypeError(\"Length must be a non-negative integer\")\n }\n\n validateBufferSize(length, \"buffer allocation\")\n\n // Validate fill value\n if (typeof fill === \"number\") {\n if (fill < 0 || fill > 255 || !Number.isInteger(fill)) {\n throw new TypeError(\"Fill value must be an integer between 0 and 255\")\n }\n } else if (typeof fill === \"string\") {\n if (fill.length !== 1) {\n throw new TypeError(\"Fill string must be exactly one character\")\n }\n fill = fill.charCodeAt(0)\n if (fill > 255) {\n throw new TypeError(\"Fill character code must be <= 255\")\n }\n } else {\n throw new TypeError(\"Fill must be a number or single character string\")\n }\n\n try {\n const buffer = new Uint8Array(length)\n if (fill !== 0) {\n buffer.fill(fill)\n }\n return SeaArray.from(buffer)\n } catch (err) {\n throw new Error(\"Failed to allocate buffer: \" + err.message)\n }\n },\n\n concat(arr) {\n if (!Array.isArray(arr)) {\n throw new TypeError(\"First argument must be an array\")\n }\n\n if (arr.length === 0) {\n return SeaArray.from(new Uint8Array(0))\n }\n\n // Validate all array elements and calculate total size\n let totalLength = 0\n const validatedBuffers = []\n\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i]\n\n if (!item) {\n throw new TypeError(`Array element at index ${i} is null or undefined`)\n }\n\n let bytes\n try {\n bytes = processArrayLikeInput(item)\n } catch (err) {\n throw new TypeError(\n `Invalid array element at index ${i}: ${err.message}`,\n )\n }\n\n totalLength += bytes.length\n validateBufferSize(totalLength, \"buffer concatenation\")\n\n validatedBuffers.push(bytes)\n }\n\n try {\n const result = new Uint8Array(totalLength)\n let offset = 0\n\n for (const buffer of validatedBuffers) {\n result.set(buffer, offset)\n offset += buffer.length\n }\n\n return SeaArray.from(result)\n } catch (err) {\n throw new Error(\"Failed to concatenate buffers: \" + err.message)\n }\n },\n\n // Helper method to check if object is SafeBuffer\n isBuffer(obj) {\n return (\n obj instanceof SeaArray ||\n (obj && typeof obj === \"object\" && obj.constructor === SafeBuffer)\n )\n },\n\n // Get byte length of string in specific encoding\n byteLength(string, encoding = \"utf8\") {\n if (typeof string !== \"string\") {\n throw new TypeError(\"First argument must be a string\")\n }\n\n switch (encoding.toLowerCase()) {\n case \"utf8\":\n case \"utf-8\":\n return new TextEncoder().encode(string).length\n\n case \"ascii\":\n case \"binary\":\n case \"latin1\":\n return string.length\n\n case \"base64\":\n const clean = string.replace(/\\s/g, \"\")\n return (\n Math.floor((clean.length * 3) / 4) - (clean.match(/=/g) || []).length\n )\n\n case \"hex\":\n return Math.floor(string.replace(/\\s/g, \"\").length / 2)\n\n default:\n throw new TypeError(\"Unknown encoding: \" + encoding)\n }\n },\n})\n\nSafeBuffer.prototype.from = SafeBuffer.from\nSafeBuffer.prototype.toString = function (\n encoding = \"utf8\",\n start = 0,\n end = this.length,\n) {\n // Input validation\n if (typeof encoding !== \"string\") {\n throw new TypeError(\"Encoding must be a string\")\n }\n\n if (typeof start !== \"number\" || !Number.isInteger(start) || start < 0) {\n throw new TypeError(\"Start must be a non-negative integer\")\n }\n\n if (typeof end !== \"number\" || !Number.isInteger(end) || end < start) {\n throw new TypeError(\"End must be an integer >= start\")\n }\n\n // Delegate to SeaArray with validation\n try {\n return SeaArray.prototype.toString.call(this, encoding, start, end)\n } catch (err) {\n throw new Error(\"Failed to convert buffer to string: \" + err.message)\n }\n}\n\nexport default SafeBuffer\n", "import SafeBuffer from \"./buffer.js\"\n\nconst isNode = typeof document === \"undefined\"\nconst crypto = isNode\n ? (await import(/*webpackIgnore: true*/ \"node:crypto\")).webcrypto\n : globalThis.crypto\nexport const subtle = crypto.subtle\n\nexport const stringify = data => {\n return typeof data === \"string\" ? data : JSON.stringify(data)\n}\n\nexport const parse = text => {\n try {\n return JSON.parse(text)\n } catch {\n return text\n }\n}\n\nexport const random = length => {\n const array = new Uint8Array(SafeBuffer.alloc(length))\n return SafeBuffer.from(crypto.getRandomValues(array))\n}\n\nexport const jwk = (pub, priv) => {\n const [x, y] = pub.split(\".\")\n const ops = priv ? [\"sign\"] : [\"verify\"]\n return {\n kty: \"EC\",\n crv: \"P-256\",\n x: x,\n y: y,\n d: priv,\n ext: true,\n key_ops: ops,\n }\n}\n\nexport const sha256 = async data => {\n const hash = await subtle.digest(\n {name: \"SHA-256\"},\n new TextEncoder().encode(stringify(data)),\n )\n return SafeBuffer.from(hash)\n}\n\nexport const aeskey = async (key, salt) => {\n const combined = key + salt.toString(\"utf8\")\n const hash = SafeBuffer.from(await sha256(combined), \"binary\")\n const jwk = keyToJwk(hash)\n return await subtle.importKey(\"jwk\", jwk, {name: \"AES-GCM\"}, false, [\n \"encrypt\",\n \"decrypt\",\n ])\n}\n\nconst keyToJwk = key => {\n const k = key\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/\\=/g, \"\")\n return {kty: \"oct\", k: k, ext: false, alg: \"A256GCM\"}\n}\n", "import {userPublicKey, userSignature} from \"./utils.js\"\nimport * as utils from \"./sea-utils.js\"\nimport SafeBuffer from \"./buffer.js\"\n\n// Security, Encryption, and Authorization: SEA.js from GunDB.\nconst SEA = {\n pair: async cb => {\n // ECDSA keys for signing/verifying.\n const ecdsa = await utils.subtle\n .generateKey({name: \"ECDSA\", namedCurve: \"P-256\"}, true, [\n \"sign\",\n \"verify\",\n ])\n .then(async keys => {\n const pub = await utils.subtle.exportKey(\"jwk\", keys.publicKey)\n return {\n priv: (await utils.subtle.exportKey(\"jwk\", keys.privateKey)).d,\n pub: pub.x + \".\" + pub.y,\n }\n })\n\n // ECDH keys for encryption/decryption.\n const ecdh = await utils.subtle\n .generateKey({name: \"ECDH\", namedCurve: \"P-256\"}, true, [\"deriveKey\"])\n .then(async keys => {\n const pub = await utils.subtle.exportKey(\"jwk\", keys.publicKey)\n return {\n epriv: (await utils.subtle.exportKey(\"jwk\", keys.privateKey)).d,\n epub: pub.x + \".\" + pub.y,\n }\n })\n\n const pair = {\n pub: ecdsa.pub,\n priv: ecdsa.priv,\n epub: ecdh.epub,\n epriv: ecdh.epriv,\n }\n if (cb) cb(pair)\n return pair\n },\n encrypt: async (data, pair, cb) => {\n if (!pair || !pair.epriv) {\n if (cb) cb(null)\n return null\n }\n\n const rand = {s: utils.random(9), iv: utils.random(15)}\n const ct = await utils.aeskey(pair.epriv, rand.s).then(aes => {\n return utils.subtle.encrypt(\n {\n name: \"AES-GCM\",\n iv: new Uint8Array(rand.iv),\n },\n aes,\n new TextEncoder().encode(utils.stringify(data)),\n )\n })\n const enc = {\n ct: SafeBuffer.from(ct, \"binary\").toString(\"base64\"),\n iv: rand.iv.toString(\"base64\"),\n s: rand.s.toString(\"base64\"),\n }\n if (cb) cb(enc)\n return enc\n },\n decrypt: async (enc, pair, cb) => {\n if (!enc || !enc.ct || !enc.iv || !enc.s || !pair || !pair.epriv) {\n if (cb) cb(null)\n return null\n }\n\n const data = {\n ct: SafeBuffer.from(enc.ct, \"base64\"),\n iv: SafeBuffer.from(enc.iv, \"base64\"),\n s: SafeBuffer.from(enc.s, \"base64\"),\n }\n try {\n const ct = await utils.aeskey(pair.epriv, data.s).then(aes => {\n return utils.subtle.decrypt(\n {\n name: \"AES-GCM\",\n iv: new Uint8Array(data.iv),\n tagLength: 128,\n },\n aes,\n new Uint8Array(data.ct),\n )\n })\n const dec = utils.parse(new TextDecoder(\"utf8\").decode(ct))\n if (cb) cb(dec)\n return dec\n } catch (err) {\n // An error will be thrown if the wrong key is used.\n if (cb) cb(null)\n return null\n }\n },\n verify: async (data, pair, cb) => {\n if (!pair || !pair.pub) {\n if (cb) cb(null)\n return null\n }\n\n const signed = utils.parse(data)\n const key = await utils.subtle.importKey(\n \"jwk\",\n utils.jwk(pair.pub),\n {name: \"ECDSA\", namedCurve: \"P-256\"},\n false,\n [\"verify\"],\n )\n\n let msg = {}\n if (typeof signed.m === \"string\") {\n msg = signed.m\n } else {\n // Allow data to be passed in with graph meta data,\n // (which should not be part of signature, so not verified).\n for (const k of Object.keys(signed.m).sort()) {\n if (k !== \"_\" && k != userPublicKey && k != userSignature) {\n msg[k] = signed.m[k]\n }\n }\n }\n const hash = await utils.sha256(msg)\n const sig = new Uint8Array(SafeBuffer.from(signed.s, \"base64\"))\n const alg = {name: \"ECDSA\", hash: {name: \"SHA-256\"}}\n if (await utils.subtle.verify(alg, key, sig, new Uint8Array(hash))) {\n const verified = utils.parse(signed.m)\n if (cb) cb(verified)\n return verified\n }\n\n if (cb) cb(null)\n return null\n },\n sign: async (data, pair, cb) => {\n if (!pair || !pair.pub || !pair.priv) {\n if (cb) cb(null)\n return null\n }\n\n let msg = {}\n if (typeof data === \"string\") {\n msg = data\n } else {\n const check = utils.parse(data)\n for (const k of Object.keys(check).sort()) {\n if (k !== \"_\" && k != userPublicKey && k != userSignature) {\n msg[k] = check[k]\n }\n }\n }\n const hash = await utils.sha256(msg)\n const jwk = utils.jwk(pair.pub, pair.priv)\n const alg = {name: \"ECDSA\", namedCurve: \"P-256\"}\n const sig = await utils.subtle\n .importKey(\"jwk\", jwk, alg, false, [\"sign\"])\n .then(key =>\n utils.subtle.sign(\n {name: \"ECDSA\", hash: {name: \"SHA-256\"}},\n key,\n new Uint8Array(hash),\n ),\n )\n const signed = {\n m: msg,\n s: SafeBuffer.from(sig, \"binary\").toString(\"base64\"),\n }\n\n if (cb) cb(signed)\n return signed\n },\n work: async (data, salt, cb) => {\n if (typeof salt === \"function\") {\n cb = salt\n salt = undefined\n }\n if (typeof salt === \"undefined\") salt = utils.random(9)\n\n const key = await utils.subtle.importKey(\n \"raw\",\n new TextEncoder().encode(utils.stringify(data)),\n {name: \"PBKDF2\"},\n false,\n [\"deriveBits\"],\n )\n const alg = {\n name: \"PBKDF2\",\n iterations: 100000,\n salt: new TextEncoder().encode(salt),\n hash: {name: \"SHA-256\"},\n }\n const work = await utils.subtle.deriveBits(alg, key, 512)\n // Use \"pair\" format so that work can be used as epriv by decrypt.\n const pair = {epriv: SafeBuffer.from(work, \"binary\").toString(\"base64\")}\n if (cb) cb(pair)\n return pair\n },\n secret: async (to, from, cb) => {\n if (!to || !to.epub || !from || !from.epub || !from.epriv) {\n if (cb) cb(null)\n return null\n }\n\n const alg = {name: \"ECDH\", namedCurve: \"P-256\"}\n const pub = utils.jwk(to.epub)\n const pubKey = await utils.subtle.importKey(\"jwk\", pub, alg, true, [])\n const priv = utils.jwk(from.epub, from.epriv, false)\n // utils.jwk provides default key_ops but it shouldn't be used here.\n delete priv.key_ops\n const derived = await utils.subtle\n .importKey(\"jwk\", priv, alg, false, [\"deriveBits\"])\n .then(async key => {\n const derivedBits = await utils.subtle.deriveBits(\n {public: pubKey, name: \"ECDH\", namedCurve: \"P-256\"},\n key,\n 256,\n )\n const derivedKey = await utils.subtle.importKey(\n \"raw\",\n new Uint8Array(derivedBits),\n {name: \"AES-GCM\", length: 256},\n true,\n [\"encrypt\", \"decrypt\"],\n )\n return utils.subtle.exportKey(\"jwk\", derivedKey).then(({k}) => k)\n })\n // Use \"pair\" format so that secret can be used as epriv by encrypt.\n if (cb) cb({epriv: derived})\n return {epriv: derived}\n },\n}\n\nexport default SEA\n", "import * as utils from \"./utils.js\"\nimport SEA from \"./sea.js\"\n\nconst LISTENER_DELAY = 100\n// Maximum number of souls to keep in memory\nconst MAX_GRAPH_SIZE = 10000\n\n// state and value are the incoming changes.\n// currentState and currentValue are the current graph data.\nconst Ham = (state, currentState, value, currentValue) => {\n if (state < currentState) return {historical: true}\n\n if (state > currentState) return {incoming: true}\n\n // state is equal to currentState, lexically compare to resolve conflict.\n if (typeof value !== \"string\") {\n value = JSON.stringify(value) || \"\"\n }\n if (typeof currentValue !== \"string\") {\n currentValue = JSON.stringify(currentValue) || \"\"\n }\n // No update required.\n if (value === currentValue) return {state: true}\n\n // Keep the current value.\n if (value < currentValue) return {current: true}\n\n // Otherwise update using the incoming value.\n return {incoming: true}\n}\n\nHam.mix = async (change, graph, secure, listen) => {\n if (!change || typeof change !== \"object\") {\n throw new TypeError(\"change must be an object\")\n }\n if (!graph || typeof graph !== \"object\") {\n throw new TypeError(\"graph must be an object\")\n }\n if (!listen || typeof listen !== \"object\") {\n throw new TypeError(\"listen must be an object\")\n }\n\n const machine = Date.now()\n const now = {}\n const defer = {}\n let wait = 0\n\n for (const soul of Object.keys(change)) {\n const node = change[soul]\n let updated = false\n let alias = false\n let nodeWait = 0\n let verify = secure\n\n if (!node || !node._) continue\n\n const sig = node[utils.userSignature]\n const pub = node[utils.userPublicKey]\n // If a signature and public key are provided then always verify.\n if (sig && pub) verify = true\n\n // Special case if soul starts with \"~\". Node must be system data ie,\n // ~@alias or ~publickey. For aliases, key and value must be a self\n // identifying rel. For public keys, data needs to be signed and verified.\n // (This is also true for any data when the secure flag is used.)\n if (soul.length > 1 && soul[0] === \"~\") {\n if (soul[1] === \"@\") {\n alias = true\n verify = false\n } else {\n if (pub && soul != \"~\" + pub) {\n console.log(`error public key does not match for soul: ${soul}`)\n continue\n }\n\n verify = true\n }\n }\n if (verify) {\n // Partial nodes can be read from disk, which are ignored. This could be\n // a missing signature or public key, or missing properties on the node\n // which means verify won't work either.\n if (!sig || !pub || !(await SEA.verify({m: node, s: sig}, {pub: pub}))) {\n continue\n }\n }\n\n for (const key of Object.keys(node)) {\n if (key === \"_\") continue\n\n const value = node[key]\n const state = node._ && node._[\">\"] ? node._[\">\"][key] : 0\n const currentValue = (graph[soul] || {})[key]\n const currentState = (graph[soul] || {_: {\">\": {}}})._[\">\"][key] || 0\n\n if (alias && key !== utils.rel.is(value)) {\n console.log(`error alias ${alias}: ${key} !== ${utils.rel.is(value)}`)\n continue\n }\n\n // Defer the update if ahead of machine time.\n const skew = state - machine\n if (skew > 0) {\n // Ignore update if ahead by more than 24 hours.\n if (skew > 86400000) continue\n\n // Wait the shortest difference before trying the updates again.\n if (wait === 0 || skew < wait) wait = nodeWait = skew\n if (!defer[soul]) {\n defer[soul] = {_: {\"#\": soul, \">\": {}}}\n }\n defer[soul][key] = value\n defer[soul]._[\">\"][key] = state\n } else {\n const result = Ham(state, currentState, value, currentValue)\n if (result.incoming) {\n if (!now[soul]) {\n now[soul] = {_: {\"#\": soul, \">\": {}}}\n }\n if (!graph[soul]) {\n graph[soul] = {_: {\"#\": soul, \">\": {}}}\n }\n graph[soul][key] = now[soul][key] = value\n graph[soul]._[\">\"][key] = now[soul]._[\">\"][key] = state\n // Call event listeners for update on key, mix is called before\n // put has finished so wait for what could be multiple nested\n // updates on a node.\n if (listen[soul]) {\n setTimeout(() => {\n if (listen[soul]) {\n listen[soul]\n .filter(l => utils.match(l[\".\"], key))\n .forEach(l => l.cb())\n }\n }, LISTENER_DELAY)\n }\n updated = true\n }\n }\n }\n\n if (verify && nodeWait !== 0 && now[soul]) {\n // Secure updates can't be split, so move now to deferred as well.\n Object.assign(defer[soul], now[soul])\n delete now[soul]\n }\n // Call event listeners for update on soul.\n if (updated && listen[soul]) {\n setTimeout(() => {\n if (listen[soul]) {\n listen[soul].filter(l => utils.match(l[\".\"])).forEach(l => l.cb())\n }\n }, LISTENER_DELAY)\n }\n }\n\n const souls = Object.keys(graph)\n if (souls.length > MAX_GRAPH_SIZE) {\n // Sort by oldest state timestamp and remove oldest entries\n const soulsByAge = souls\n .map(soul => {\n const states = graph[soul]._ && graph[soul]._[\">\"]\n const maxState = states ? Math.max(...Object.values(states)) : 0\n return {soul, maxState}\n })\n .sort((a, b) => a.maxState - b.maxState)\n const remove = soulsByAge.slice(0, souls.length - MAX_GRAPH_SIZE)\n remove.forEach(({soul}) => delete graph[soul])\n }\n\n return {now: now, defer: defer, wait: wait}\n}\n\nexport default Ham\n", "import * as utils from \"./utils.js\"\n\n// ASCII character for group separator.\nconst group = String.fromCharCode(29)\n// ASCII character for record separator.\nconst record = String.fromCharCode(30)\n\nconst Radix = () => {\n const radix = (keys, value, tree) => {\n if (!tree) {\n if (!radix[group]) radix[group] = {}\n tree = radix[group]\n }\n if (!keys) return tree\n\n let i = 0\n let tmp = {}\n let key = keys[i]\n const max = keys.length - 1\n const noValue = typeof value === \"undefined\"\n // Find a matching value using the shortest string from keys.\n let found = tree[key]\n while (!found && i < max) {\n key += keys[++i]\n found = tree[key]\n }\n\n if (!found) {\n // If not found from the provided keys try matching with an existing key.\n const result = utils.obj.map(tree, (hasValue, hasKey) => {\n let j = 0\n let matchingKey = \"\"\n while (hasKey[j] === keys[j]) {\n matchingKey += hasKey[j++]\n }\n if (matchingKey) {\n if (noValue) {\n // matchingKey has to be as long as the original keys when reading.\n if (j <= max) return\n\n tmp[hasKey.slice(j)] = hasValue\n return hasValue\n }\n\n let replace = {\n [hasKey.slice(j)]: hasValue,\n [keys.slice(j)]: {[record]: value},\n }\n tree[matchingKey] = {[group]: replace}\n delete tree[hasKey]\n return true\n }\n })\n if (!result) {\n if (noValue) return\n\n if (!tree[key]) tree[key] = {}\n tree[key][record] = value\n } else if (noValue) {\n return tmp\n }\n } else if (i === max) {\n // If no value use the key provided to return a whole group or record.\n if (noValue) {\n // If an individual record isn't found then return the whole group.\n return typeof found[record] === \"undefined\"\n ? found[group]\n : found[record]\n }\n // Otherwise create a new record at the provided key for value.\n found[record] = value\n } else {\n // Found at a shorter key, try again.\n if (!found[group] && !noValue) found[group] = {}\n return radix(keys.slice(++i), value, found[group])\n }\n }\n return radix\n}\n\nRadix.map = function map(radix, cb, opt, pre) {\n if (!pre) pre = []\n var tree = radix[group] || radix\n var keys = Object.keys(tree).sort()\n var u\n\n for (let i = 0; i < keys.length; i++) {\n let key = keys[i]\n let found = tree[key]\n let tmp = found[record]\n if (typeof tmp !== \"undefined\") {\n tmp = cb(tmp, pre.join(\"\") + key, key, pre)\n if (typeof tmp !== \"undefined\") return tmp\n } else if (opt) {\n cb(u, pre.join(\"\"), key, pre)\n }\n if (found[group]) {\n pre.push(key)\n tmp = map(found[group], cb, opt, pre)\n if (typeof tmp !== \"undefined\") return tmp\n pre.pop()\n }\n }\n}\n\nexport default Radix\n", "import Radix from \"./radix.js\"\nimport * as utils from \"./utils.js\"\n\n// ASCII character for end of text\nconst etx = String.fromCharCode(3)\n// ASCII character for enquiry\nconst enq = String.fromCharCode(5)\n// ASCII character for unit separator\nconst unit = String.fromCharCode(31)\n\n// Radisk provides access to a radix tree that is stored in the provided\n// opt.store interface\nconst Radisk = opt => {\n var u\n\n // Multi-file cache for all parsed radix trees\n const cache = new Map()\n // File listing cache to avoid repeated directory scans\n let fileListCache = null\n let fileListCacheTime = 0\n const FILE_LIST_CACHE_TTL = 10000 // 10 seconds\n // Pending reads queue to avoid duplicate reads for the same key\n const pendingReads = new Map()\n\n // Memory monitoring and cleanup\n let lastMemoryCheck = 0\n const MEMORY_CHECK_INTERVAL = 30000 // Check every 30 seconds\n const HEAP_WARNING_THRESHOLD = 0.8 // Warn at 80% of max heap size\n const HEAP_CLEANUP_THRESHOLD = 0.9 // Clean cache at 90% of max heap size\n\n if (!opt) opt = {}\n if (!opt.log) opt.log = console.log\n if (!opt.batch) opt.batch = 100 // Balanced batch size for performance\n if (!opt.write) opt.write = 1 // Wait time before write in milliseconds\n if (!opt.size) opt.size = 1024 * 1024 // File size on disk, default 1MB\n if (!opt.memoryLimit) opt.memoryLimit = 500 // Memory limit in MB\n if (typeof opt.cache === \"undefined\") opt.cache = true\n\n if (!opt.store) {\n opt.log(\n \"Radisk needs `store` interface with `{get: fn, put: fn, list: fn}`\",\n )\n return\n }\n if (!opt.store.get) {\n opt.log(\"Radisk needs `store.get` interface with `(file, cb)`\")\n return\n }\n if (!opt.store.put) {\n opt.log(\"Radisk needs `store.put` interface with `(file, data, cb)`\")\n return\n }\n if (!opt.store.list) {\n opt.log(\"Radisk needs a streaming `store.list` interface with `(cb)`\")\n return\n }\n\n // Performance logging\n const perfLog = (operation, startTime, key, size) => {\n const duration = Date.now() - startTime\n if (duration > 1000) {\n console.log(\n `[RADISK-SLOW] ${operation}: ${duration}ms for ${key}${size ? ` (${size} bytes)` : \"\"}`,\n )\n }\n }\n\n // Memory monitoring and cache cleanup\n const checkMemoryUsage = () => {\n if (typeof process === \"undefined\" || !process.memoryUsage) return\n\n const now = Date.now()\n if (now - lastMemoryCheck < MEMORY_CHECK_INTERVAL) return\n lastMemoryCheck = now\n\n const memUsage = process.memoryUsage()\n const heapUsed = memUsage.heapUsed\n const heapTotal = memUsage.heapTotal\n const maxHeapSize = opt.memoryLimit * 1024 * 1024\n const heapUsageRatio = heapUsed / maxHeapSize\n\n if (heapUsageRatio > HEAP_CLEANUP_THRESHOLD) {\n const cacheSize = cache.size\n console.log(\n `[RADISK-MEMORY] High memory usage: ${Math.round(heapUsageRatio * 100)}% of heap limit. Clearing ${cacheSize} cached files.`,\n )\n cache.clear()\n // Force garbage collection if available\n if (global.gc) {\n global.gc()\n }\n // Reset timer to avoid immediate re-check until GC has time to work\n lastMemoryCheck = now + MEMORY_CHECK_INTERVAL\n } else if (heapUsageRatio > HEAP_WARNING_THRESHOLD) {\n console.log(\n `[RADISK-MEMORY] Memory warning: ${Math.round(heapUsageRatio * 100)}% of heap limit used. Cache size: ${cache.size} files.`,\n )\n }\n }\n\n // Any and all storage adapters should:\n // 1. Because writing to disk takes time, we should batch data to disk.\n // This improves performance, and reduces potential disk corruption.\n // 2. If a batch exceeds a certain number of writes, we should immediately\n // write to disk when physically possible. This caps total performance,\n // but reduces potential loss.\n const radisk = (key, value, cb) => {\n key = \"\" + key\n\n // If no value is provided then the second parameter is the callback\n // function. Read value from memory or disk and call callback with it.\n if (typeof value === \"function\") {\n cb = value\n value = radisk.batch(key)\n if (typeof value !== \"undefined\") {\n return cb(u, value)\n }\n\n if (radisk.thrash.at) {\n value = radisk.thrash.at(key)\n if (typeof value !== \"undefined\") {\n return cb(u, value)\n }\n }\n\n // Check if there's already a pending read for this key\n if (pendingReads.has(key)) {\n // Add callback to existing pending read\n pendingReads.get(key).push(cb)\n return\n }\n\n // Start new read and create callback queue\n pendingReads.set(key, [cb])\n\n const readStart = Date.now()\n return radisk.read(key, (err, result) => {\n perfLog(\"read\", readStart, key)\n // Execute all pending callbacks for this key\n const callbacks = pendingReads.get(key) || []\n pendingReads.delete(key)\n callbacks.forEach(callback => callback(err, result))\n })\n }\n\n // Otherwise store the value provided.\n radisk.batch(key, value)\n // Check memory usage after writing to in-memory radix tree\n checkMemoryUsage()\n if (cb) {\n radisk.batch.acks.push(cb)\n }\n // Don't wait if we have batched too many.\n if (++radisk.batch.ed >= opt.batch) {\n return radisk.thrash()\n }\n\n // Otherwise wait for more updates before writing.\n clearTimeout(radisk.batch.timeout)\n radisk.batch.timeout = setTimeout(radisk.thrash, opt.write)\n }\n\n radisk.batch = Radix()\n radisk.batch.acks = []\n radisk.batch.ed = 0\n\n radisk.thrash = () => {\n if (radisk.thrash.ing) {\n return (radisk.thrash.more = true)\n }\n\n const thrashStart = Date.now()\n clearTimeout(radisk.batch.timeout)\n radisk.thrash.more = false\n radisk.thrash.ing = true\n var batch = (radisk.thrash.at = radisk.batch)\n radisk.batch = null\n radisk.batch = Radix()\n radisk.batch.acks = []\n radisk.batch.ed = 0\n let i = 0\n radisk.save(batch, err => {\n // This is to ignore multiple callbacks from radisk.save calling\n // radisk.write? It looks like multiple callbacks will be made if a\n // file needs to be split.\n if (++i > 1) return\n\n perfLog(\"thrash\", thrashStart, `batch-${batch.ed}`)\n if (err) opt.log(err)\n batch.acks.forEach(cb => cb(err))\n radisk.thrash.at = null\n radisk.thrash.ing = false\n if (radisk.thrash.more) radisk.thrash()\n })\n }\n\n // 1. Find the first radix item in memory\n // 2. Use that as the starting index in the directory of files\n // 3. Find the first file that is lexically larger than it\n // 4. Read the previous file into memory\n // 5. Scan through in memory radix for all values lexically less than limit\n // 6. Merge and write all of those to the in-memory file and back to disk\n radisk.save = (rad, cb) => {\n const save = {\n find: (tree, key) => {\n // This is false for any key until save.start is set to an initial key.\n if (key < save.start) return\n\n save.start = key\n opt.store.list(save.lex)\n return true\n },\n lex: file => {\n if (!file || file > save.start) {\n save.end = file\n // ! is used as the first file name as it's the first printable\n // character, so always matches as lexically less than any node.\n // Also save.start can be set to undefined by a previous call to\n // save.mix, so don't continue in this case.\n if (save.start) save.mix(save.file || \"!\", save.start, save.end)\n } else {\n save.file = file\n }\n },\n mix: (file, start, end) => {\n save.start = save.end = save.file = u\n // Use cache if available, otherwise parse from disk\n if (cache.has(file)) {\n const disk = cache.get(file)\n Radix.map(rad, (value, key) => {\n if (key < start) return\n\n if (end && end < key) {\n save.start = key\n return\n }\n\n disk(key, value)\n })\n radisk.write(file, disk, save.next)\n } else {\n radisk.parse(file, (err, disk) => {\n if (err) return cb(err)\n\n Radix.map(rad, (value, key) => {\n if (key < start) return\n\n if (end && end < key) {\n save.start = key\n return\n }\n\n disk(key, value)\n })\n radisk.write(file, disk, save.next)\n })\n }\n },\n next: err => {\n if (err) return cb(err)\n\n if (save.start) return Radix.map(rad, save.find)\n\n cb(err)\n },\n }\n Radix.map(rad, save.find)\n }\n\n radisk.write = (file, rad, cb) => {\n const write = {\n text: \"\",\n limit: \"\",\n done: false,\n count: 0,\n each: (value, key, k, pre) => {\n // each is called for all keys, but stop adding to write.text when\n // write.slice is called, then the current contents of write.text\n // will be written to file.\n if (write.done) return\n\n write.count++\n value = typeof value === \"undefined\" ? \"\" : \"=\" + Radisk.encode(value)\n const enc =\n Radisk.encode(pre.length) + \"#\" + Radisk.encode(k) + value + \"\\n\"\n // Cannot split the file if only have one entry to write. Also don't\n // start a split if in the middle of writing a node (pre > 0).\n if (\n write.count > 1 &&\n pre.length === 0 &&\n write.text.length + enc.length > opt.size\n ) {\n const end = k.indexOf(enq)\n write.limit = end === -1 ? k : k.substring(0, end)\n // Cannot split if they key is the same as the current file name.\n if (write.limit !== file) {\n write.done = true\n write.sub = Radix()\n Radix.map(rad, write.slice)\n radisk.write(write.limit, write.sub, cb)\n return\n }\n }\n\n write.text += enc\n },\n slice: (value, key) => {\n if (key < write.limit) return\n\n write.sub(key, value)\n },\n }\n Radix.map(rad, write.each, true)\n // There is always accumulated write.text to store once write.each has\n // finished.\n const writeStart = Date.now()\n opt.store.put(file, write.text, err => {\n perfLog(\"file-write\", writeStart, file, write.text.length)\n cb(err)\n })\n }\n\n radisk.read = (key, cb) => {\n // Only the soul of the key is compared to filenames (see radisk.write).\n const end = key.indexOf(enq)\n const soul = end === -1 ? key : key.substring(0, end)\n\n const read = {\n lex: file => {\n // store.list should call lex without a file last, which means all file\n // names were compared to soul, so the current read.file is ok to use.\n if (!file) {\n if (!read.file) {\n cb(\"no file found\", u)\n return\n }\n\n // Check multi-file cache first\n if (opt.cache && cache.has(read.file)) {\n const cachedRadix = cache.get(read.file)\n read.value = cachedRadix(key)\n // Return cached result (defined or undefined) since in-memory\n // radix tree is authoritative\n return cb(u, read.value)\n }\n\n radisk.parse(read.file, read.it)\n return\n }\n\n // Want the filename closest to soul.\n if (file > soul || file < read.file) return\n\n read.file = file\n },\n it: (err, disk) => {\n if (err) opt.log(err)\n if (disk) {\n if (opt.cache) {\n cache.set(read.file, disk)\n checkMemoryUsage() // Check memory usage after adding to cache\n }\n read.value = disk(key)\n }\n cb(err, read.value)\n },\n }\n const now = Date.now()\n if (\n opt.cache &&\n fileListCache &&\n now - fileListCacheTime < FILE_LIST_CACHE_TTL\n ) {\n // Use cached file list\n fileListCache.forEach(file => read.lex(file))\n read.lex() // Signal end of list\n } else {\n // Refresh cache\n const files = []\n const originalLex = read.lex\n read.lex = file => {\n if (file) files.push(file)\n return originalLex(file)\n }\n\n opt.store.list(file => {\n read.lex(file)\n if (!file && opt.cache) {\n // End of list - cache the results\n fileListCache = files\n fileListCacheTime = now\n }\n })\n }\n }\n\n // Let us start by assuming we are the only process that is\n // changing the directory or bucket. Not because we do not want\n // to be multi-process/machine, but because we want to experiment\n // with how much performance and scale we can get out of only one.\n // Then we can work on the harder problem of being multi-process.\n radisk.parse = (file, cb) => {\n const parse = {\n disk: Radix(),\n read: (err, data) => {\n if (err) return cb(err)\n\n if (!data) return cb(u, parse.disk)\n\n let pre = []\n let preString = \"\"\n // Work though data by splitting into 3 values. The first value says\n // if the second value is one of: the radix level for a key, the key\n // iteself, or a value. The third is the rest of the data to work with.\n let tmp = parse.split(data)\n while (tmp) {\n let key\n let value\n let i = tmp[1]\n tmp = parse.split(tmp[2]) || \"\"\n if (tmp[0] === \"#\") {\n key = tmp[1]\n // Optimize prefix building - avoid repeated joins\n if (i < pre.length) {\n pre.length = i\n }\n if (i <= pre.length) {\n pre[i] = key\n pre.length = i + 1\n }\n // Only rebuild preString when prefix changes\n preString = pre.join(\"\")\n }\n tmp = parse.split(tmp[2]) || \"\"\n if (tmp[0] === \"\\n\") continue\n\n if (tmp[0] === \"=\") value = tmp[1]\n if (typeof key !== \"undefined\" && typeof value !== \"undefined\") {\n parse.disk(preString, value)\n }\n tmp = parse.split(tmp[2])\n }\n cb(u, parse.disk)\n },\n split: data => {\n if (!data) return\n\n const i = data.indexOf(unit)\n if (i === -1) return\n\n const a = data.slice(0, i)\n let o = {}\n return [a, Radisk.decode(data.slice(i), o), data.slice(i + o.i)]\n },\n }\n opt.store.get(file, parse.read)\n }\n\n return radisk\n}\n\nRadisk.encode = data => {\n // A key should be passed in as a string to encode, a value can optionally be\n // an array of 2 items to include the value's state, as is done by store.js.\n let state = \"\"\n if (data instanceof Array && data.length === 2) {\n state = etx + data[1]\n data = data[0]\n }\n\n if (typeof data === \"string\") {\n let i = 0\n let current = null\n let text = unit\n while ((current = data[i++])) {\n if (current === unit) text += unit\n }\n return text + '\"' + data + state + unit\n }\n\n const rel = utils.rel.is(data)\n if (rel) return unit + \"#\" + rel + state + unit\n\n if (utils.num.is(data)) return unit + \"+\" + (data || 0) + state + unit\n\n if (data === true) return unit + \"+\" + state + unit\n\n if (data === false) return unit + \"-\" + state + unit\n\n if (data === null) return unit + \" \" + state + unit\n}\n\nRadisk.decode = (data, obj) => {\n var i = -1\n var n = 0\n var current = null\n var previous = null\n var textStart = -1\n var textEnd = -1\n if (data[0] !== unit) return\n\n // Find a control character previous to the text we want, skipping\n // consecutive unit separator characters at the beginning of the data.\n while ((current = data[++i])) {\n if (previous) {\n if (textStart === -1) textStart = i\n if (current === unit) {\n if (--n <= 0) {\n textEnd = i\n break\n }\n }\n } else if (current === unit) {\n n++\n } else {\n previous = current || true\n }\n }\n\n const text =\n textStart !== -1 ? data.slice(textStart, textEnd !== -1 ? textEnd : i) : \"\"\n\n if (obj) obj.i = i + 1\n\n let [value, state] = text.split(etx)\n if (!state) {\n if (previous === '\"') return text\n\n if (previous === \"#\") return utils.rel.ify(text)\n\n if (previous === \"+\") {\n if (text.length === 0) return true\n\n return parseFloat(text)\n }\n\n if (previous === \"-\") return false\n\n if (previous === \" \") return null\n } else {\n state = parseFloat(state)\n // If state was found then return an array.\n if (previous === '\"') return [value, state]\n\n if (previous === \"#\") return [utils.rel.ify(value), state]\n\n if (previous === \"+\") {\n if (value.length === 0) return [true, state]\n\n return [parseFloat(value), state]\n }\n\n if (previous === \"-\") return [false, state]\n\n if (previous === \" \") return [null, state]\n }\n}\n\nexport default Radisk\n", "import Radisk from \"./radisk.js\"\nimport Radix from \"./radix.js\"\nimport * as utils from \"./utils.js\"\n\nconst isNode = typeof document === \"undefined\"\nconst fs = isNode ? await import(/*webpackIgnore: true*/ \"node:fs\") : undefined\n\n// ASCII character for enquiry.\nconst enq = String.fromCharCode(5)\n// ASCII character for unit separator.\nconst unit = String.fromCharCode(31)\n// On-disk root node format.\nconst root = unit + \"+0\" + unit + \"#\" + unit + '\"root' + unit\n\nconst fileSystem = opt => {\n const dir = opt.file\n\n if (isNode) {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir)\n if (!fs.existsSync(dir + \"/!\")) fs.writeFileSync(dir + \"/!\", root)\n\n return {\n get: (file, cb) => {\n fs.readFile(dir + \"/\" + file, (err, data) => {\n if (err) {\n if (err.code === \"ENOENT\") {\n cb()\n return\n }\n\n console.log(\"fs.readFile error:\", err)\n }\n if (data) data = data.toString()\n cb(err, data)\n })\n },\n put: (file, data, cb) => {\n // Don't put tmp files under dir so that they're not listed.\n var tmp = file + \".\" + utils.text.random(9) + \".tmp\"\n fs.writeFile(tmp, data, err => {\n if (err) {\n console.log(\"fs.writeFile error:\", err)\n cb(err)\n return\n }\n\n fs.rename(tmp, dir + \"/\" + file, cb)\n })\n },\n list: cb => {\n fs.readdir(dir, (err, files) => {\n if (err) {\n console.log(\"fs.readdir error:\", err)\n cb()\n return\n }\n\n files.forEach(cb)\n cb()\n })\n },\n }\n }\n\n if (opt.indexedDB) {\n let db\n const o = indexedDB.open(dir, 1)\n o.onupgradeneeded = event => {\n event.target.result.createObjectStore(dir)\n }\n o.onerror = event => {\n console.log(event)\n }\n o.onsuccess = () => {\n db = o.result\n // Create the root node if it doesn't exist.\n if (db) {\n const tx = db.transaction([dir], \"readonly\")\n const req = tx.objectStore(dir).getKey(\"!\")\n req.onerror = () => {\n console.log(`error getting key ${dir}/!`)\n }\n req.onsuccess = () => {\n if (!req.result) {\n const tx = db.transaction([dir], \"readwrite\")\n const req = tx.objectStore(dir).put(root, \"!\")\n req.onerror = () => {\n console.log(`error putting root on ${dir}/!`)\n }\n }\n }\n } else {\n console.log(\"error indexedDB not available\")\n }\n }\n\n return {\n get: (file, cb) => {\n const _get = (file, cb) => {\n const tx = db.transaction([dir], \"readonly\")\n const req = tx.objectStore(dir).get(file)\n req.onerror = () => {\n console.log(`error getting ${dir}/${file}`)\n }\n req.onsuccess = () => {\n cb(null, req.result)\n }\n }\n if (db) {\n _get(file, cb)\n return\n }\n\n let retry = 0\n const interval = setInterval(() => {\n if (db) {\n clearInterval(interval)\n _get(file, cb)\n return\n }\n\n if (retry++ > 5) {\n clearInterval(interval)\n cb(\"error indexedDB not available\")\n }\n }, 1000)\n },\n put: (file, data, cb) => {\n const _put = (file, data, cb) => {\n const tx = db.transaction([dir], \"readwrite\")\n const req = tx.objectStore(dir).put(data, file)\n req.onerror = () => {\n console.log(`error putting data on ${dir}/${file}`)\n }\n req.onsuccess = () => {\n cb(null)\n }\n }\n if (db) {\n _put(file, data, cb)\n return\n }\n\n let retry = 0\n const interval = setInterval(() => {\n if (db) {\n clearInterval(interval)\n _put(file, data, cb)\n return\n }\n\n if (retry++ > 5) {\n clearInterval(interval)\n cb(\"error indexedDB not available\")\n }\n }, 1000)\n },\n list: cb => {\n const _list = cb => {\n const tx = db.transaction([dir], \"readonly\")\n const req = tx.objectStore(dir).getAllKeys()\n req.onerror = () => console.log(\"error getting keys for\", dir)\n req.onsuccess = () => {\n req.result.forEach(cb)\n cb()\n }\n }\n if (db) {\n _list(cb)\n return\n }\n\n let retry = 0\n const interval = setInterval(() => {\n if (db) {\n clearInterval(interval)\n _list(cb)\n return\n }\n\n if (retry++ > 5) {\n clearInterval(interval)\n console.log(\"error indexedDB not available\")\n cb()\n }\n }, 1000)\n },\n }\n }\n\n // No browser storage.\n return {\n get: (file, cb) => {\n cb(null, root)\n },\n put: (file, data, cb) => {\n cb(null)\n },\n list: cb => {\n cb(\"!\")\n cb()\n },\n }\n}\n\n// Store provides get and put methods that can access radisk.\nconst Store = opt => {\n if (!utils.obj.is(opt)) opt = {}\n opt.file = String(opt.file || \"radata\")\n if (!opt.store) opt.store = fileSystem(opt)\n const radisk = Radisk(opt)\n\n return {\n get: (lex, cb) => {\n if (!lex || !utils.obj.is(lex)) {\n cb(\"lex required\")\n return\n }\n if (!lex[\"#\"]) {\n cb(\"soul required in lex\")\n return\n }\n\n var soul = lex[\"#\"]\n var key = typeof lex[\".\"] === \"string\" ? lex[\".\"] : \"\"\n var node\n const each = (value, key) => {\n if (!utils.match(lex[\".\"], key)) return\n\n if (!node) node = {_: {\"#\": soul, \">\": {}}}\n node[key] = value[0]\n node._[\">\"][key] = value[1]\n }\n\n radisk(soul + enq + key, (err, value) => {\n let graph\n if (utils.obj.is(value)) {\n Radix.map(value, each)\n if (!node) each(value, key)\n graph = {[soul]: node}\n } else if (value) {\n each(value, key)\n graph = {[soul]: node}\n }\n cb(err, graph)\n })\n },\n put: (graph, cb) => {\n if (!graph) {\n cb(\"graph required\")\n return\n }\n\n let count = 0\n let finished = false\n const ack = err => {\n count--\n if (finished) return\n\n if (err) {\n finished = true\n cb(err)\n return\n }\n\n if (count === 0) {\n finished = true\n cb(null)\n }\n }\n\n Object.keys(graph).forEach(soul => {\n var node = graph[soul]\n Object.keys(node).forEach(key => {\n if (key === \"_\") return\n\n count++\n let value = node[key]\n let state = node._[\">\"][key]\n radisk(soul + enq + key, [value, state], ack)\n })\n })\n },\n }\n}\n\nexport default Store\n", "import Dup from \"./dup.js\"\nimport Get from \"./get.js\"\nimport Ham from \"./ham.js\"\nimport Store from \"./store.js\"\nimport * as utils from \"./utils.js\"\n\nconst isNode = typeof document === \"undefined\"\n\nconst wsModule = isNode ? await import(\"ws\") : undefined\n\nif (typeof globalThis.WebSocket === \"undefined\") {\n globalThis.WebSocket = wsModule?.WebSocket\n}\n\n// Rate limiting with throttling\nconst createRateLimiter = opt => {\n const clients = new Map()\n const maxRequests = opt.maxRequestsPerMinute || 100\n const windowMs = opt.rateLimitWindow || 60000\n const disconnectThreshold = opt.disconnectThreshold || 10\n // Check if test environment (mock-socket usage)\n const isTestEnv = opt.wss && opt.wss.constructor.name === \"Server\"\n let cleanupInterval = null\n\n const cleanup = () => {\n const now = Date.now()\n for (const [clientId, data] of clients.entries()) {\n if (now - data.lastCleanup > windowMs) {\n data.requests = []\n data.lastCleanup = now\n }\n data.requests = data.requests.filter(time => now - time < windowMs)\n // Reset throttle counts periodically\n if (now - data.lastCleanup > windowMs * 10) {\n data.throttleCount = 0\n }\n }\n }\n\n if (!isTestEnv) {\n cleanupInterval = setInterval(cleanup, windowMs / 4)\n }\n\n return {\n getDelay: clientId => {\n const now = Date.now()\n const client = clients.get(clientId) || {\n requests: [],\n lastCleanup: now,\n throttleCount: 0,\n }\n\n // Filter old requests\n client.requests = client.requests.filter(time => now - time < windowMs)\n\n if (client.requests.length >= maxRequests) {\n // Calculate delay based on oldest request that will expire\n const oldestRequest = Math.min(...client.requests)\n const delay = windowMs - (now - oldestRequest)\n // Increment throttle count and update client data\n client.throttleCount = (client.throttleCount || 0) + 1\n clients.set(clientId, client)\n return Math.max(0, delay)\n }\n\n // No delay needed, track this request\n client.requests.push(now)\n clients.set(clientId, client)\n return 0\n },\n\n getRemainingRequests: clientId => {\n const client = clients.get(clientId)\n if (!client) return maxRequests\n\n const now = Date.now()\n const validRequests = client.requests.filter(\n time => now - time < windowMs,\n )\n return Math.max(0, maxRequests - validRequests.length)\n },\n\n getThrottleCount: clientId => {\n const client = clients.get(clientId)\n return client ? client.throttleCount || 0 : 0\n },\n\n shouldDisconnect: clientId => {\n const client = clients.get(clientId)\n if (!client) return false\n return client.throttleCount >= disconnectThreshold\n },\n\n destroy: () => {\n if (cleanupInterval) {\n clearInterval(cleanupInterval)\n cleanupInterval = null\n }\n clients.clear()\n },\n }\n}\n\n// Safe JSON parser with size limit\nconst safeJSONParse = (data, maxSize = 1024 * 1024) => {\n try {\n if (typeof data === \"string\" && data.length > maxSize) {\n throw new Error(\"Message too large\")\n }\n return {success: true, data: JSON.parse(data)}\n } catch (error) {\n return {success: false, error: error.message}\n }\n}\n\n// Message size validator\nconst validateMessage = (data, maxSize = 1024 * 1024) => {\n // 1MB default\n if (typeof data === \"string\" && data.length > maxSize) {\n return {valid: false, error: \"Message too large\"}\n }\n if (Buffer.isBuffer(data) && data.length > maxSize) {\n return {valid: false, error: \"Message too large\"}\n }\n return {valid: true}\n}\n\n// Connection manager to limit concurrent connections\nconst createConnectionManager = (maxConnections = 1000) => {\n const connections = new Set()\n\n return {\n add: ws => {\n if (connections.size >= maxConnections) {\n return false\n }\n connections.add(ws)\n\n // Clean up on close\n const originalClose = ws.close\n ws.close = (...args) => {\n connections.delete(ws)\n return originalClose.apply(ws, args)\n }\n\n return true\n },\n\n remove: ws => {\n connections.delete(ws)\n },\n\n count: () => connections.size,\n\n isFull: () => connections.size >= maxConnections,\n }\n}\n\n// Enhanced retry mechanism with exponential backoff\nconst createRetryHandler = (maxRetries = 5) => {\n let retryCount = 0\n\n return {\n shouldRetry: () => retryCount < maxRetries,\n getDelay: () => Math.min(1000 * Math.pow(2, retryCount), 30000), // Max 30s\n increment: () => retryCount++,\n reset: () => (retryCount = 0),\n }\n}\n\n// Wire starts a websocket client or server and returns get and put methods\n// for access to the wire spec and storage.\nconst Wire = opt => {\n const dup = Dup(opt.maxAge)\n const store = Store(opt)\n const graph = {}\n const queue = {}\n const listen = {}\n\n // Track references we want but don't have yet\n const pendingReferences = new Set()\n\n // Helper to check if we have a soul in memory or storage\n const hasSoul = async soul => {\n if (graph[soul]) return true\n return new Promise(resolve => {\n store.get({\"#\": soul}, (err, data) => {\n resolve(!err && data && data[soul])\n })\n })\n }\n\n // Initialize rate limiting and connection management\n const rateLimiter = createRateLimiter(opt)\n const connectionManager = createConnectionManager(opt.maxConnections || 1000)\n\n // The check function is required because user data must provide a public key\n // so that it can be verified. The public key might verify the provided\n // signature but not actually match the user under which the data is being\n // stored. To avoid this, the current data on a soul needs to be checked to\n // make sure the stored public key matches the one provided with the update.\n const check = async (data, send, cb) => {\n for (const soul of Object.keys(data)) {\n const msg = await new Promise(res => {\n getWithCallback({\"#\": soul}, res, send)\n })\n if (msg.err) {\n if (cb) cb(msg.err)\n return false\n }\n\n const node = data[soul]\n const key = utils.userPublicKey\n // If there is no current node then the data is ok to write without\n // matching public keys, as the provided soul also needs a rel on the\n // parent node which then also requires checking. Otherwise publc keys\n // need to match for existing data.\n if (!msg.put || !msg.put[soul] || msg.put[soul][key] === node[key]) {\n continue\n }\n\n // If a soul exists but does not have a public key, then one should not be\n // added because the node is not user data. The above check fails in this\n // case if a public key is provided. Note that this is only an error case\n // if called via the API, which is when a callback is provided here.\n // (The wire spec can fetch and put data on the wire without a signature\n // or public key and this can be ignored.)\n if (cb) {\n cb(`error in wire check public key does not match for soul: ${soul}`)\n }\n return false\n }\n\n return true\n }\n\n const get = (msg, send) => {\n const ack = Get(msg.get, graph)\n if (ack) {\n send(\n JSON.stringify({\n \"#\": dup.track(utils.text.random(9)),\n \"@\": msg[\"#\"],\n put: ack,\n }),\n )\n } else {\n store.get(msg.get, (err, ack) => {\n send(\n JSON.stringify({\n \"#\": dup.track(utils.text.random(9)),\n \"@\": msg[\"#\"],\n put: ack,\n err: err,\n }),\n )\n })\n }\n }\n\n const put = async (msg, send) => {\n // Store updates returned from Ham.mix and defer updates if required.\n const update = await Ham.mix(msg.put, graph, opt.secure, listen)\n if (Object.keys(update.now).length) {\n if (!(await check(update.now, send))) return\n\n store.put(update.now, err => {\n send(\n JSON.stringify({\n \"#\": dup.track(utils.text.random(9)),\n \"@\": msg[\"#\"],\n err: err,\n }),\n )\n })\n }\n if (Object.keys(update.defer).length) {\n setTimeout(() => put({put: update.defer}, send), update.wait)\n }\n }\n\n const getWithCallback = (lex, cb, send, _opt) => {\n if (!cb) return\n\n if (!utils.obj.is(_opt)) _opt = {}\n\n const ack = Get(lex, graph)\n const track = utils.text.random(9)\n // Request the whole node in secure mode for verification.\n const request = JSON.stringify({\n \"#\": dup.track(track),\n get: opt.secure ? {\"#\": lex[\"#\"]} : lex,\n })\n\n if (ack) {\n // Also send request on the wire to check for updates.\n const sendResult = send(request)\n if (sendResult && sendResult.err) {\n cb({err: sendResult.err})\n return\n }\n cb({put: ack})\n return\n }\n\n store.get(lex, (err, ack) => {\n if (ack) {\n // Also send request on the wire to check for updates.\n const sendResult = send(request)\n if (sendResult && sendResult.err) {\n cb({err: sendResult.err})\n return\n }\n cb({put: ack, err: err})\n return\n }\n\n if (err) console.log(err)\n\n queue[track] = cb\n const sendResult = send(request)\n if (sendResult && sendResult.err) {\n cb({err: sendResult.err})\n delete queue[track]\n return\n }\n\n // Respond to callback with null if no response.\n setTimeout(() => {\n const cb = queue[track]\n if (cb) {\n const id = lex[\"#\"]\n const ack = {[id]: null}\n if (typeof lex[\".\"] === \"string\") ack[id] = {[lex[\".\"]]: null}\n cb({put: ack})\n delete queue[track]\n }\n }, _opt.wait || 100)\n })\n }\n\n const api = send => {\n return {\n get: (lex, cb, _opt) => {\n // Mark requested soul as something we want to store\n if (lex && lex[\"#\"]) {\n pendingReferences.add(lex[\"#\"])\n }\n getWithCallback(lex, cb, send, _opt)\n },\n put: async (data, cb) => {\n // Deferred updates are only stored using wire spec, they're ignored\n // here using the api. This is ok because correct timestamps should be\n // used whereas wire spec needs to handle clock skew for updates\n // across the network.\n const update = await Ham.mix(data, graph, opt.secure, listen)\n const none = Object.keys(update.now).length === 0\n if (none) {\n // Nothing to do.\n cb(null)\n return\n }\n\n if (!(await check(update.now, send, cb))) return\n\n // Seed pendingReferences with any new references from API calls\n for (const [soul, node] of Object.entries(update.now)) {\n if (node && typeof node === \"object\") {\n for (const [key, value] of Object.entries(node)) {\n const soulId = utils.rel.is(value)\n if (soulId) {\n // Add referenced soul to pending list\n pendingReferences.add(soulId)\n }\n }\n }\n }\n\n store.put(update.now, cb)\n // Also put data on the wire spec.\n const sendResult = send(\n JSON.stringify({\n \"#\": dup.track(utils.text.random(9)),\n put: data,\n }),\n )\n // Handle queue overflow error\n if (sendResult && sendResult.err) {\n if (cb) cb(sendResult.err)\n return\n }\n },\n on: (lex, cb, _get, _opt) => {\n const soul = lex && lex[\"#\"]\n if (!soul || !cb) return\n\n if (listen[soul]) {\n listen[soul].push({\".\": lex[\".\"], cb: cb})\n } else {\n listen[soul] = [{\".\": lex[\".\"], cb: cb}]\n }\n if (_get) getWithCallback(lex, cb, send, _opt)\n },\n off: (lex, cb) => {\n const soul = lex && lex[\"#\"]\n if (!soul || !listen[soul]) return\n\n if (cb) {\n const found = listen[soul].find(l => l.cb === cb)\n if (found) {\n listen[soul].splice(listen[soul].indexOf(found), 1)\n }\n } else {\n // Remove all callbacks when none provided.\n delete listen[soul]\n }\n },\n }\n }\n\n if (isNode) {\n let wss = opt.wss\n // Node's websocket server provides clients as an array, whereas\n // mock-sockets provides clients as a function that returns an array.\n let clients = () => wss.clients()\n if (!wss) {\n const config = opt.server\n ? {server: opt.server}\n : {port: opt.port || 8765}\n wss = new wsModule.WebSocketServer(config)\n clients = () => wss.clients\n }\n\n const send = (data, isBinary) => {\n clients().forEach(client => {\n if (client && client.readyState === WebSocket.OPEN) {\n client.send(data, {binary: isBinary})\n } else {\n const retryHandler = client._retryHandler || createRetryHandler()\n client._retryHandler = retryHandler\n\n if (retryHandler.shouldRetry()) {\n const delay = retryHandler.getDelay()\n retryHandler.increment()\n\n setTimeout(() => {\n if (client && client.readyState === WebSocket.OPEN) {\n retryHandler.reset()\n client.send(data, {binary: isBinary})\n }\n }, delay)\n }\n }\n })\n }\n wss.on(\"connection\", ws => {\n // Check connection limit\n if (!connectionManager.add(ws)) {\n console.log(\"Connection limit reached, rejecting connection\")\n ws.close(1013, \"Connection limit reached - try again later\")\n return\n }\n\n // Generate unique client ID for rate limiting\n const clientId = utils.text.random(9)\n console.log(\n `[HOLSTER-CONNECT] New WebSocket client connected: ${clientId}`,\n )\n\n ws.on(\"error\", error => {\n console.log(\"WebSocket error:\", error)\n connectionManager.remove(ws)\n })\n\n ws.on(\"close\", () => {\n console.log(\n `[HOLSTER-DISCONNECT] WebSocket client disconnected: ${clientId}`,\n )\n connectionManager.remove(ws)\n })\n\n ws.on(\"message\", (data, isBinary) => {\n // Validate message size\n const validation = validateMessage(data, opt.maxMessageSize)\n if (!validation.valid) {\n console.warn(`Invalid message: ${validation.error}`)\n ws.send(JSON.stringify({error: validation.error}))\n return\n }\n\n // Safe JSON parsing\n const parseResult = safeJSONParse(data, opt.maxMessageSize)\n if (!parseResult.success) {\n console.warn(`JSON parse error: ${parseResult.error}`)\n ws.send(JSON.stringify({error: \"Invalid JSON\"}))\n return\n }\n\n const msg = parseResult.data\n if (dup.check(msg[\"#\"])) return\n\n // Check rate limit and get delay\n const delay = rateLimiter.getDelay(clientId)\n // Log rate limiting activity and enforce stricter limits\n if (delay > 0) {\n const throttleCount = rateLimiter.getThrottleCount(clientId)\n console.log(\n `[HOLSTER-THROTTLE] Client ${clientId}: rate limit exceeded, delay would be ${delay}ms, dropping message (throttle count: ${throttleCount})`,\n )\n // Check if we should disconnect the bad actor\n if (rateLimiter.shouldDisconnect(clientId)) {\n console.log(\n `[HOLSTER-DISCONNECT] Client ${clientId}: Disconnecting bad actor after ${throttleCount} throttle violations`,\n )\n ws.close(1008, \"Rate limit violations - bad actor\")\n return\n }\n\n // Send throttle warning back to client instead of processing\n ws.send(\n JSON.stringify({\n \"#\": dup.track(utils.text.random(9)),\n \"@\": msg[\"#\"],\n err: `Rate limit exceeded. Slow down requests. Wait ${Math.ceil(delay / 1000)}s`,\n throttle: delay,\n }),\n )\n return\n }\n\n const processMessage = () => {\n dup.track(msg[\"#\"])\n\n if (msg.get) get(msg, send)\n if (msg.put) put(msg, send)\n send(data, isBinary)\n\n const id = msg[\"@\"]\n const cb = queue[id]\n if (cb) {\n delete msg[\"#\"]\n delete msg[\"@\"]\n cb(msg)\n\n delete queue[id]\n }\n }\n\n if (delay > 0) {\n // Throttle the client by delaying message processing\n setTimeout(processMessage, delay)\n } else {\n // Process immediately\n processMessage()\n }\n })\n })\n return api(send)\n }\n\n // Browser logic.\n const peers = []\n // Client-side throttling state\n let clientThrottled = false\n let throttleUntil = 0\n let messageQueue = []\n let queueProcessor = null\n const maxQueueLength = opt.maxQueueLength || 1000\n\n const processQueue = () => {\n if (messageQueue.length === 0) {\n queueProcessor = null\n return\n }\n\n const now = Date.now()\n if (clientThrottled && now < throttleUntil) {\n // Still throttled, schedule next queue check\n queueProcessor = setTimeout(\n processQueue,\n Math.min(1000, throttleUntil - now),\n )\n return\n }\n\n // Throttle period ended, resume processing\n if (clientThrottled && now >= throttleUntil) {\n console.log(\n `[CLIENT-THROTTLED] Throttle period ended, resuming queue processing`,\n )\n clientThrottled = false\n throttleUntil = 0\n }\n\n // Process next message in queue\n const data = messageQueue.shift()\n sendToPeers(data)\n\n // Schedule processing of next message if queue not empty\n if (messageQueue.length > 0) {\n // Add small delay between messages to avoid immediate re-throttling\n queueProcessor = setTimeout(processQueue, 100)\n } else {\n queueProcessor = null\n }\n }\n\n const sendToPeers = data => {\n peers.forEach(peer => {\n if (peer && peer.readyState === WebSocket.OPEN) {\n peer.send(data)\n } else {\n const retryHandler = peer._retryHandler || createRetryHandler()\n peer._retryHandler = retryHandler\n\n if (retryHandler.shouldRetry()) {\n const delay = retryHandler.getDelay()\n retryHandler.increment()\n\n setTimeout(() => {\n if (peer && peer.readyState === WebSocket.OPEN) {\n retryHandler.reset()\n peer.send(data)\n }\n }, delay)\n }\n }\n })\n }\n\n const send = data => {\n // Check if client is throttled or queue is active\n if (clientThrottled || messageQueue.length > 0) {\n if (messageQueue.length >= maxQueueLength) {\n return {\n err: `Message queue exceeded maximum length (${maxQueueLength}). Update query logic to request less data.`,\n queueLength: messageQueue.length,\n maxQueueLength: maxQueueLength,\n }\n }\n\n // Add message to queue instead of sending immediately\n messageQueue.push(data)\n console.log(\n `Queuing message (queue length: ${messageQueue.length}/${maxQueueLength})`,\n )\n // Start queue processor if not already running\n if (!queueProcessor) {\n queueProcessor = setTimeout(processQueue, 100)\n }\n return\n }\n\n // Normal case - send immediately\n sendToPeers(data)\n }\n if (!(opt.peers instanceof Array)) {\n opt.peers = [`ws://localhost:${opt.port || 8765}`]\n }\n opt.peers.forEach(peer => {\n const start = () => {\n let ws = new WebSocket(peer)\n peers.push(ws)\n const retryHandler = createRetryHandler()\n\n ws.onclose = c => {\n if (peers.indexOf(ws) !== -1) {\n peers.splice(peers.indexOf(ws), 1)\n }\n ws = null\n\n if (retryHandler.shouldRetry()) {\n const delay = retryHandler.getDelay()\n retryHandler.increment()\n setTimeout(start, delay)\n }\n }\n\n ws.onopen = () => {\n retryHandler.reset()\n }\n\n ws.onerror = e => {\n console.log(e)\n }\n ws.onmessage = async m => {\n const msg = JSON.parse(m.data)\n if (dup.check(msg[\"#\"])) return\n\n // Handle throttle messages from server\n if (msg.throttle && msg.err) {\n console.log(`[CLIENT-THROTTLED] Server throttling: ${msg.err}`)\n clientThrottled = true\n throttleUntil = Date.now() + msg.throttle\n return\n }\n\n dup.track(msg[\"#\"])\n if (msg.get) get(msg, send)\n if (msg.put) {\n // Handle selective storage for client WebSocket messages\n const filteredPut = {}\n for (const [soul, node] of Object.entries(msg.put)) {\n let shouldStore = false\n // Case 1: We already have this soul - always update\n if (await hasSoul(soul)) {\n shouldStore = true\n // Check if this update adds new references\n if (node && typeof node === \"object\") {\n for (const [key, value] of Object.entries(node)) {\n const soulId = utils.rel.is(value)\n if (soulId) {\n // Add referenced soul to pending list\n pendingReferences.add(soulId)\n }\n }\n }\n }\n // Case 2: This soul was referenced by something we have\n if (pendingReferences.has(soul)) {\n shouldStore = true\n pendingReferences.delete(soul) // Got it, remove from pending\n }\n if (shouldStore) {\n filteredPut[soul] = node\n }\n }\n // Store filtered data if any\n if (Object.keys(filteredPut).length > 0) {\n // Create filtered message for Ham.mix\n const filteredMsg = {put: filteredPut}\n put(filteredMsg, send)\n }\n }\n send(m.data)\n\n const id = msg[\"@\"]\n const cb = queue[id]\n if (cb) {\n delete msg[\"#\"]\n delete msg[\"@\"]\n cb(msg)\n\n delete queue[id]\n }\n }\n }\n start()\n })\n\n return api(send)\n}\n\nexport default Wire\n", "import * as utils from \"./utils.js\"\nimport Wire from \"./wire.js\"\nimport SEA from \"./sea.js\"\n\nconst User = (opt, wire) => {\n if (!wire) wire = Wire(opt)\n let pubs = []\n let creating = false\n let authing = false\n let retries = 0\n\n const auth = (username, password, newPassword, ack) => {\n const retry = username => {\n retries++\n auth(username, password, newPassword, ack)\n }\n const done = err => {\n pubs = []\n retries = 0\n authing = false\n ack(err)\n }\n const next = () => {\n if (pubs.length === 0) {\n done(\"Wrong username or password\")\n return\n }\n\n const pub = pubs.shift()\n wire.get(\n {\"#\": pub},\n async msg => {\n if (msg.err) {\n done(`error getting ${pub}: ${msg.err}`)\n return\n }\n\n const data = msg.put && msg.put[pub]\n if (!data || !data.auth) return next()\n\n const auth = JSON.parse(data.auth)\n const work = await SEA.work(password, auth.salt)\n const dec = await SEA.decrypt(auth.enc, work)\n if (!dec) return next()\n\n user.is = {\n username: username,\n pub: data.pub,\n epub: data.epub,\n priv: dec.priv,\n epriv: dec.epriv,\n }\n if (newPassword !== \"\") {\n // Encrypt private key using new password and a new salt.\n const salt = utils.text.random(64)\n const work = await SEA.work(newPassword, salt)\n const enc = await SEA.encrypt(dec, work)\n // Put all fields so that verification applies to the whole node.\n const update = {\n username: username,\n pub: data.pub,\n epub: data.epub,\n auth: JSON.stringify({enc: enc, salt: salt}),\n }\n const signed = await SEA.sign(update, user.is)\n const graph = utils.graph(pub, signed.m, signed.s, data.pub)\n wire.put(graph, err => {\n if (err) {\n done(`error putting ${update} on ${pub}: ${err}`)\n } else {\n done(null)\n }\n })\n return\n }\n\n return done(null)\n },\n {wait: 1000},\n )\n }\n\n if (retries > 9) {\n done(\"Wrong username or password\")\n return\n }\n\n const soul = \"~@\" + username\n wire.get(\n {\"#\": soul},\n async msg => {\n if (msg.err) {\n done(`error getting ${soul}: ${msg.err}`)\n return\n }\n\n const data = msg.put && msg.put[soul]\n if (!data) return retry(username)\n\n delete msg.put[soul]._\n // Usernames aren't guaranteed to be unique, so store the list and then\n // try each of them until one is successful with the given password.\n pubs = Object.keys(data)\n next()\n },\n {wait: 1000},\n )\n }\n\n const user = {\n create: (username, password, cb) => {\n const ack = err => {\n if (cb) cb(err)\n else console.log(err)\n }\n\n if (creating) {\n ack(\"User is already being created\")\n return\n }\n\n if (username === \"\") {\n ack(\"Please provide a username\")\n return\n }\n\n if (password === \"\") {\n ack(\"Please provide a password\")\n return\n }\n\n creating = true\n\n const soul = \"~@\" + username\n wire.get(\n {\"#\": soul},\n async msg => {\n if (msg.err) {\n creating = false\n ack(`error getting ${soul}: ${msg.err}`)\n return\n }\n\n if (msg.put && msg.put[soul]) {\n creating = false\n ack(\"Username already exists\")\n return\n }\n\n const salt = utils.text.random(64)\n const work = await SEA.work(password, salt)\n const pair = await SEA.pair()\n const priv = {priv: pair.priv, epriv: pair.epriv}\n const enc = await SEA.encrypt(priv, work)\n const data = {\n username: username,\n pub: pair.pub,\n epub: pair.epub,\n auth: JSON.stringify({enc: enc, salt: salt}),\n }\n\n const pub = \"~\" + pair.pub\n const signed = await SEA.sign(data, pair)\n const graph = utils.graph(pub, signed.m, signed.s, pair.pub)\n wire.put(graph, err => {\n creating = false\n if (err) {\n ack(`error putting ${data} on ${pub}: ${err}`)\n return\n }\n\n const rel = {[pub]: {\"#\": pub}}\n wire.put(utils.graph(soul, rel), err => {\n if (err) {\n ack(`error putting ${rel} on ${soul}: ${err}`)\n return\n }\n\n // Return null on success.\n if (cb) cb(null)\n })\n })\n },\n {wait: 1000},\n )\n },\n auth: (username, password, cb) => {\n const ack = err => {\n if (cb) cb(err)\n else if (err) console.log(err)\n }\n\n if (authing) {\n ack(\"User is already authenticating\")\n return\n }\n\n user.is = null\n\n if (username === \"\") {\n ack(\"Please provide a username\")\n return\n }\n\n if (password === \"\") {\n ack(\"Please provide a password\")\n return\n }\n\n authing = true\n auth(username, password, \"\", ack)\n },\n change: (username, password, newPassword, cb) => {\n const ack = err => {\n if (cb) cb(err)\n else if (err) console.log(err)\n }\n\n if (authing) {\n ack(\"User is already authenticating\")\n return\n }\n\n user.is = null\n\n if (username === \"\") {\n ack(\"Please provide a username\")\n return\n }\n\n if (password === \"\") {\n ack(\"Please provide a password\")\n return\n }\n\n if (newPassword === \"\") {\n ack(\"Please provide a new password\")\n return\n }\n\n authing = true\n auth(username, password, newPassword, ack)\n },\n store: localStorage => {\n if (!user.is) {\n console.log(\"Please authenticate before calling store\")\n return\n }\n\n if (localStorage) {\n if (typeof globalThis.localStorage !== \"undefined\") {\n globalThis.localStorage.setItem(\"user.is\", JSON.stringify(user.is))\n }\n if (typeof globalThis.sessionStorage !== \"undefined\") {\n globalThis.sessionStorage.removeItem(\"user.is\")\n }\n return\n }\n\n if (typeof globalThis.sessionStorage !== \"undefined\") {\n globalThis.sessionStorage.setItem(\"user.is\", JSON.stringify(user.is))\n }\n if (typeof globalThis.localStorage !== \"undefined\") {\n globalThis.localStorage.removeItem(\"user.is\")\n }\n },\n recall: () => {\n if (typeof globalThis.localStorage !== \"undefined\") {\n const is = globalThis.localStorage.getItem(\"user.is\")\n if (is) {\n user.is = JSON.parse(is)\n return\n }\n }\n\n if (typeof globalThis.sessionStorage !== \"undefined\") {\n const is = globalThis.sessionStorage.getItem(\"user.is\")\n if (is) {\n user.is = JSON.parse(is)\n }\n }\n },\n leave: () => {\n user.is = null\n if (typeof globalThis.localStorage !== \"undefined\") {\n globalThis.localStorage.removeItem(\"user.is\")\n }\n if (typeof globalThis.sessionStorage !== \"undefined\") {\n globalThis.sessionStorage.removeItem(\"user.is\")\n }\n },\n delete: (username, password, cb) => {\n const ack = err => {\n if (cb) cb(err)\n else console.log(err)\n }\n\n if (authing) {\n ack(\"User is already authenticating\")\n return\n }\n\n if (username === \"\") {\n ack(\"Please provide a username\")\n return\n }\n\n if (password === \"\") {\n ack(\"Please provide a password\")\n return\n }\n\n authing = true\n auth(username, password, \"\", async err => {\n if (err) {\n ack(err)\n return\n }\n\n const data = {username: null, pub: null, epub: null, auth: null}\n const signed = await SEA.sign(data, user.is)\n const pub = \"~\" + user.is.pub\n const graph = utils.graph(pub, signed.m, signed.s, user.is.pub)\n wire.put(graph, err => {\n if (err) {\n ack(`error putting null on ${pub}: ${err}`)\n return\n }\n\n user.is = null\n // Return null on success. Note currently not updating ~@username,\n // not sure if allowing username re-user is a good idea anyway?\n if (cb) cb(null)\n })\n })\n },\n }\n return user\n}\n\nexport default User\n", "import * as utils from \"./utils.js\"\nimport Wire from \"./wire.js\"\nimport User from \"./user.js\"\nimport SEA from \"./sea.js\"\n\nconst Holster = opt => {\n if (typeof opt === \"string\") opt = {peers: [opt]}\n else if (opt instanceof Array) opt = {peers: opt}\n else if (!utils.obj.is(opt)) opt = {}\n\n const wire = Wire(opt)\n const user = User(null, wire)\n // Map callbacks since the user's callback is not passed to wire.on.\n const map = new Map()\n // Allow concurrent calls to the api by storing each context.\n const allctx = new Map()\n\n const ok = data => {\n return (\n data === null ||\n data === true ||\n data === false ||\n typeof data === \"string\" ||\n utils.rel.is(data) ||\n utils.num.is(data)\n )\n }\n\n // check returns true if data is ok to add to a graph, an error string if\n // the data can't be converted, and the keys on the data object otherwise.\n const check = data => {\n if (ok(data)) return true\n\n if (utils.obj.is(data)) {\n const keys = []\n for (const [key, value] of Object.entries(data)) {\n if (key === \"_\") {\n return \"error underscore cannot be used as a property name\"\n }\n if (utils.obj.is(value) || ok(value)) {\n keys.push(key)\n continue\n }\n if (typeof value === \"undefined\") {\n return `error undefined ${key} cannot be converted to a graph`\n }\n const error = JSON.stringify({[key]: value})\n return `error ${error} cannot be converted to a graph`\n }\n if (keys.length !== 0) return keys\n }\n const error = JSON.stringify(data)\n return `error ${error} cannot be converted to a graph`\n }\n\n const api = ctxid => {\n const get = (lex, soul, ack, _opt) => {\n wire.get(\n utils.obj.put(lex, \"#\", soul),\n async msg => {\n if (msg.err) console.log(msg.err)\n if (msg.put && msg.put[soul]) {\n delete msg.put[soul]._\n delete msg.put[soul][utils.userPublicKey]\n delete msg.put[soul][utils.userSignature]\n // Resolve any rels on the node before returning to the user.\n for (const key of Object.keys(msg.put[soul])) {\n const id = utils.rel.is(msg.put[soul][key])\n if (id) {\n const data = await new Promise(res => {\n const _ctxid = utils.text.random()\n allctx.set(_ctxid, {chain: [{item: null, soul: id}]})\n api(_ctxid).next(null, res, _opt)\n })\n msg.put[soul][key] = data\n }\n }\n ack(msg.put[soul])\n } else {\n // No data callback.\n ack(null)\n }\n },\n _opt,\n )\n }\n\n const graph = async (soul, data, userctx, cb) => {\n if (userctx) {\n const signed = await SEA.sign(data, userctx)\n return utils.graph(soul, signed.m, signed.s, userctx.pub)\n }\n\n if (opt.secure) {\n if (!cb) cb = console.log\n cb(`error putting data on ${soul}: user required in secure mode`)\n return null\n }\n\n return utils.graph(soul, data)\n }\n\n // done takes a context id and returns a new callback function so that the\n // callback is not overwritten by simultaneous requests.\n const done = ctxid => {\n return data => {\n const ctx = allctx.get(ctxid)\n if (ctx && typeof ctx.cb !== \"undefined\") {\n // Use a timeout so that the context can be removed before data is\n // returned to the callback (allows nested get calls).\n setTimeout(() => ctx.cb(data), 1)\n } else if (data) {\n console.log(\"error no callback for data\", data, \"ctx\", ctx)\n }\n // A context updated by \"on\" should only be removed by \"off\".\n if (ctx && !ctx.on) allctx.delete(ctxid)\n }\n }\n\n const resolve = (request, cb) => {\n if (!request) {\n console.log(\"error resolve request parameter required\")\n return\n }\n\n const get = typeof request.get !== \"undefined\"\n const put = typeof request.put !== \"undefined\"\n const on = typeof request.on !== \"undefined\"\n const off = typeof request.off !== \"undefined\"\n\n let found = false\n const ctx = allctx.get(ctxid)\n for (var i = 1; i < ctx.chain.length; i++) {\n if (ctx.chain[i].soul !== null) continue\n\n found = true\n break\n }\n\n if (found) {\n // Found a soul that needs resolving, need the previous context\n // (ie the parent node) to find a soul relation for it.\n const {item, soul} = ctx.chain[i - 1]\n // If this is a user context or using secure mode then need to get the\n // whole node for verification.\n const lex =\n ctx.user || opt.secure ? {\"#\": soul} : {\"#\": soul, \".\": item}\n wire.get(\n lex,\n async msg => {\n if (msg.err) {\n if (ctx.user || opt.secure) {\n console.log(`error getting ${soul}: ${msg.err}`)\n } else {\n console.log(`error getting ${item} on ${soul}: ${msg.err}`)\n }\n if (cb) cb(null)\n return\n }\n\n let node = msg.put && msg.put[soul]\n if (node && typeof node[item] !== \"undefined\") {\n let id = utils.rel.is(node[item])\n if (id) {\n ctx.chain[i].soul = id\n allctx.set(ctxid, {...ctx})\n // Call api again using the updated context.\n if (get) {\n api(ctxid).next(null, request.get, cb, request._opt)\n } else if (put) {\n api(ctxid).put(request.put, cb)\n } else if (on) {\n api(ctxid).on(request.on, cb, request._get, request._opt)\n } else if (off) {\n api(ctxid).off(cb)\n }\n } else if (get) {\n // Request was not for a node, return property on current soul.\n cb(node[item])\n } else if (put) {\n // Request was chained before put, so rel doesn't exist yet.\n id = utils.text.random()\n node[item] = utils.rel.ify(id)\n const g = await graph(soul, node, ctx.user, cb)\n if (g === null) return\n\n wire.put(g, err => {\n if (err) {\n cb(`error putting ${item} on ${soul}: ${err}`)\n return\n }\n\n ctx.chain[i].soul = id\n api(ctxid).put(request.put, cb)\n })\n } else if (on) {\n // Allow listening to a node that doesn't exist.\n cb(null)\n } else if (off) {\n // Allow stop listening to a node that doesn't exist.\n if (cb) cb(null)\n }\n } else if (put) {\n // Request was chained before put, so rel doesn't exist yet.\n const id = utils.text.random()\n if (!node) node = {}\n node[item] = utils.rel.ify(id)\n const g = await graph(soul, node, ctx.user, cb)\n if (g === null) return\n\n wire.put(g, err => {\n if (err) {\n cb(`error putting ${item} on ${soul}: ${err}`)\n return\n }\n\n ctx.chain[i].soul = id\n api(ctxid).put(request.put, cb)\n })\n } else {\n // Allow querying a node that doesn't exist.\n if (cb) cb(null)\n }\n },\n request._opt,\n )\n // Callback has been passed to next soul lookup or called above, so\n // return false as the calling code should not continue.\n return false\n }\n\n if (get && ctx.chain[ctx.chain.length - 1].item !== null) {\n // The context has been resolved but it does not include the requested\n // node, which requires one more lookup.\n ctx.chain.push({item: null, soul: null})\n api(ctxid).next(null, request.get, cb, request._opt)\n return false\n }\n\n // Return the last context, ie the soul required by the calling code.\n return ctx.chain[ctx.chain.length - 1]\n }\n\n return {\n get: (key, lex, cb, _opt) => {\n if (typeof lex === \"function\") {\n _opt = cb\n cb = lex\n lex = null\n }\n if (key === null || key === \"\" || key === \"_\") {\n console.log(\"error please provide a key\")\n if (cb) cb(null)\n return\n }\n\n // lex requires a callback as it's not included in the chain below.\n if (lex && typeof cb !== \"function\") {\n console.log(\"error lex requires a callback function\")\n return\n }\n\n // Top level keys are added to a root node so their values don't need\n // to be objects.\n ctxid = utils.text.random()\n allctx.set(ctxid, {chain: [{item: key, soul: \"root\"}], cb: cb})\n if (!cb) return api(ctxid)\n\n const _done = done(ctxid)\n // When there's a callback need to resolve the context first.\n const {soul} = resolve({get: lex, _opt: _opt}, _done)\n if (soul) get(lex, soul, _done, _opt)\n },\n next: (key, lex, cb, _opt) => {\n // ack needs to work the same as done, pass it the context id and then\n // return a new function for the actual callback.\n const ack = ctxid => {\n return data => {\n if (cb) {\n cb(data)\n } else {\n done(ctxid)(data)\n }\n }\n }\n if (typeof lex === \"function\") {\n _opt = cb\n cb = lex\n lex = null\n }\n if (!ctxid) {\n console.log(\"error please provide a key using get(key)\")\n if (cb) cb(null)\n return\n }\n\n const _ack = ack(ctxid)\n if (key === \"\" || key === \"_\") {\n _ack(null)\n return\n }\n\n // lex requires a callback as it's not included in the chain below.\n if (lex && typeof cb !== \"function\") {\n console.log(\"error lex requires a callback function\")\n return\n }\n\n const ctx = allctx.get(ctxid)\n // ctx already removed by another chained callback is ok?\n if (!ctx) return\n\n if (cb && typeof ctx.cb === \"undefined\") {\n // This (and ack) allows nested objects to set their own callbacks.\n ctx.cb = cb\n cb = null\n }\n\n // Push the key to the context as it needs a soul lookup.\n // (null is used to call the api with updated context)\n if (key !== null) ctx.chain.push({item: key, soul: null})\n if (!ctx.cb) return api(ctxid)\n\n // When there's a callback need to resolve the context first.\n const {soul} = resolve({get: lex, _opt: _opt}, _ack)\n if (soul) get(lex, soul, _ack, _opt)\n },\n put: (data, set, cb) => {\n if (typeof set === \"function\") {\n cb = set\n set = false\n }\n const ack = ctxid => {\n return data => {\n if (cb) {\n cb(data)\n } else {\n done(ctxid)(data)\n }\n }\n }\n if (!ctxid) {\n if (cb) cb(\"error please provide a key using get(key)\")\n return\n }\n\n const ctx = allctx.get(ctxid)\n // ctx already removed by another chained callback is ok?\n if (!ctx) return\n\n if (!ctx.cb) {\n if (!cb) return\n\n // This (and ack) allows nested objects to set their own callbacks.\n ctx.cb = cb\n cb = null\n }\n if (set) data = {[utils.text.random()]: data}\n\n const _ack = ack(ctxid)\n const result = check(data)\n if (typeof result === \"string\") {\n // All strings returned from check are errors, cannot continue.\n _ack(result)\n return\n }\n\n // Resolve the current context before putting data. (Note that set is\n // not passed to resolve because it's already been applied above.)\n const {item, soul} = resolve({put: data}, _ack)\n if (!soul) return\n\n if (result === true) {\n // When result is true data is a property to put on the current soul.\n // Need to check if item is a rel and also set the node to null. (This\n // applies for any update from a rel to a property, not just null.)\n // If using secure mode need to get the whole node for verification.\n const lex =\n ctx.user || opt.secure ? {\"#\": soul} : {\"#\": soul, \".\": item}\n wire.get(lex, async msg => {\n if (msg.err) {\n _ack(`error getting ${soul}: ${msg.err}`)\n return\n }\n\n let node = msg.put && msg.put[soul]\n const current = node && node[item]\n const id = utils.rel.is(current)\n if (!id) {\n // Not a rel, can just put the data.\n if (!node) node = {}\n node[item] = data\n const g = await graph(soul, node, ctx.user, _ack)\n if (g === null) return\n\n wire.put(g, _ack)\n return\n }\n\n wire.get({\"#\": id}, async msg => {\n if (msg.err) {\n _ack(`error getting ${id}: ${msg.err}`)\n return\n }\n\n if (!msg.put || !msg.put[id]) {\n _ack(`error ${id} not found`)\n return\n }\n\n // null each of the properties on the node before putting data.\n for (const key of Object.keys(msg.put[id])) {\n if (\n key === \"_\" ||\n key === utils.userPublicKey ||\n key === utils.userSignature\n ) {\n continue\n }\n\n const err = await new Promise(res => {\n const _ctxid = utils.text.random()\n const chain = [{item: key, soul: id}]\n allctx.set(_ctxid, {chain: chain, user: ctx.user})\n api(_ctxid).put(null, res)\n })\n if (err) {\n _ack(err)\n return\n }\n }\n if (!node) node = {}\n node[item] = data\n const g = await graph(soul, node, ctx.user, _ack)\n if (g === null) return\n\n wire.put(g, _ack)\n })\n })\n return\n }\n\n // Otherwise put the data using the keys returned in result.\n // Need to check if a rel has already been added on the current node.\n // If using secure mode need to get the whole node for verification.\n const lex =\n ctx.user || opt.secure ? {\"#\": soul} : {\"#\": soul, \".\": item}\n wire.get(lex, async msg => {\n if (msg.err) {\n _ack(`error getting ${soul}.${item}: ${msg.err}`)\n return\n }\n\n let node = msg.put && msg.put[soul]\n const current = node && node[item]\n const id = utils.rel.is(current)\n if (!id) {\n // The current rel doesn't exist, so add it first.\n if (!node) node = {}\n node[item] = utils.rel.ify(utils.text.random())\n const g = await graph(soul, node, ctx.user, _ack)\n if (g === null) return\n\n wire.put(g, err => {\n if (err) {\n _ack(`error putting ${item} on ${soul}: ${err}`)\n } else {\n const _ctxid = utils.text.random()\n const chain = [{item: item, soul: soul}]\n // Pass on the previous context's callback and user flag here.\n allctx.set(_ctxid, {chain: chain, user: ctx.user, cb: ctx.cb})\n api(_ctxid).put(data)\n }\n })\n return\n }\n\n const update = []\n for (const key of result) {\n const err = await new Promise(res => {\n if (utils.obj.is(data[key]) && !utils.rel.is(data[key])) {\n // Use the current rel as the context for nested objects.\n const _ctxid = utils.text.random()\n const chain = [{item: key, soul: id}]\n allctx.set(_ctxid, {chain: chain, user: ctx.user})\n api(_ctxid).put(data[key], res)\n } else {\n // Group the rest of the updates for put below.\n update.push(key)\n res(null)\n }\n })\n if (err) {\n _ack(err, ctxid)\n return\n }\n }\n\n if (update.length === 0) {\n _ack(null)\n return\n }\n\n // The nested objects created above will also have rels on the parent\n // object, so fetch the node so the rest of the updates can be added.\n wire.get({\"#\": id}, async msg => {\n if (msg.err) {\n _ack(`error getting ${id}: ${msg.err}`)\n return\n }\n\n let node = msg.put && msg.put[id]\n if (!node) node = {}\n update.forEach(key => {\n node[key] = data[key]\n })\n const g = await graph(id, node, ctx.user, _ack)\n if (g === null) return\n\n wire.put(g, _ack)\n })\n })\n },\n on: (lex, cb, _get, _opt) => {\n if (typeof lex === \"function\") {\n _opt = _get\n _get = cb\n cb = lex\n lex = null\n }\n if (typeof cb !== \"function\") {\n console.log(\"error on() requires a callback function\")\n return\n }\n\n if (!ctxid) {\n console.log(\"error please provide a key using get(key)\")\n cb(null)\n return\n }\n\n // Resolve the current context before adding event listener.\n const {item, soul} = resolve({on: lex, _get: _get, _opt: _opt}, cb)\n if (!soul) return\n\n // Flag that this context is set from on and shouldn't be removed.\n allctx.set(ctxid, {chain: [{item: item, soul: soul}], on: true})\n // Map the user's callback because it can also be passed to off,\n // so need a reference to it to compare them.\n map.set(cb, () => api(ctxid).next(null, cb, _opt))\n // Check if item is a rel and add event listener for the node.\n wire.get(\n {\"#\": soul, \".\": item},\n msg => {\n if (msg.err) {\n console.log(`error getting ${soul}.${item}: ${msg.err}`)\n return\n }\n\n const current = msg.put && msg.put[soul] && msg.put[soul][item]\n const id = utils.rel.is(current)\n if (id) {\n if (lex) lex = utils.obj.put(lex, \"#\", id)\n else lex = {\"#\": id, \".\": null}\n } else {\n if (lex) lex = utils.obj.put(lex, \"#\", soul)\n else lex = {\"#\": soul, \".\": item}\n }\n wire.on(lex, map.get(cb), _get, _opt)\n },\n _opt,\n )\n },\n off: cb => {\n if (!ctxid) {\n console.log(\"error please provide a key using get(key)\")\n if (cb) cb(null)\n return\n }\n\n // Resolve the current context before removing event listener.\n const {item, soul} = resolve({off: true}, cb)\n if (!soul) return\n\n // Check if item is a rel and remove event listener for the node.\n wire.get({\"#\": soul, \".\": item}, msg => {\n if (msg.err) {\n console.log(`error getting ${soul}.${item}: ${msg.err}`)\n return\n }\n\n const current = msg.put && msg.put[soul] && msg.put[soul][item]\n const id = utils.rel.is(current)\n if (id) wire.off({\"#\": id}, map.get(cb))\n else wire.off({\"#\": soul}, map.get(cb))\n map.delete(cb)\n allctx.delete(ctxid)\n })\n },\n user: () => {\n if (!user.get) {\n // Return the combined Holster and User APIs.\n Object.assign(user, api())\n // Need to provide a user specific get() function to know if user\n // context should be checked.\n user.get = (keys, lex, cb, _opt) => {\n if (typeof lex === \"function\") {\n _opt = cb\n cb = lex\n lex = null\n }\n\n let pub = null\n let key = null\n if (user.is) pub = user.is.pub\n if (typeof keys === \"string\") {\n key = keys\n } else if (keys instanceof Array) {\n if (keys.length === 2) {\n pub = keys[0]\n key = keys[1]\n } else if (keys.length === 1) {\n key = keys[0]\n }\n }\n if (!pub) {\n console.log(\"error please log in or provide a public key\")\n if (cb) cb(null)\n return\n }\n\n if (key === null || key === \"\" || key === \"_\") {\n console.log(\"error please provide a key\")\n if (cb) cb(null)\n return\n }\n\n // lex requires a callback as it's not included in the chain below.\n if (lex && !cb) {\n console.log(\"error lex requires a callback function\")\n return\n }\n\n ctxid = utils.text.random()\n const chain = [{item: key, soul: \"~\" + pub}]\n allctx.set(ctxid, {chain: chain, user: user.is, cb: cb})\n if (!cb) return api(ctxid)\n\n // When there's a callback need to resolve the context first.\n const _done = done(ctxid)\n const {soul} = resolve({get: lex, _opt: _opt}, _done)\n if (soul) get(lex, soul, _done, _opt)\n }\n }\n return user\n },\n // Allow the wire spec to be used via holster.\n wire: wire,\n // Allow SEA functions to be used via holster.\n SEA: SEA,\n }\n }\n return api()\n}\n\nexport default Holster\n"],
5
+ "mappings": "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",
6
6
  "names": ["num", "n", "parsed", "obj", "o", "match", "list", "cb", "keys", "i", "result", "key", "value", "map_soul", "soul", "rel", "userSignature", "userPublicKey", "graph", "data", "sig", "pub", "timestamp", "g", "lex", "prefix", "gt", "lt", "text", "length", "s", "c", "Dup", "maxAge", "dup", "id", "now", "dup_default", "Get", "lex", "graph", "soul", "node", "key", "match", "get_default", "data", "SeaArray", "enc", "start", "end", "buf", "byte", "_", "i", "charCode", "utf8String", "array_default", "SECURITY_LIMITS", "SafeBuffer", "props", "validateStringInput", "input", "encoding", "validateBufferSize", "size", "operation", "parseHexString", "hexString", "cleanHex", "bytes", "i", "hexByte", "encodeUtf8String", "str", "err", "encodeBinaryString", "charCode", "parseBase64String", "base64String", "cleanBase64", "decodedString", "processArrayLikeInput", "val", "arr", "array_default", "length", "fill", "buffer", "totalLength", "validatedBuffers", "item", "result", "offset", "obj", "string", "clean", "start", "end", "buffer_default", "isNode", "crypto", "subtle", "stringify", "data", "parse", "text", "random", "length", "array", "buffer_default", "jwk", "pub", "priv", "x", "y", "sha256", "hash", "aeskey", "key", "salt", "combined", "keyToJwk", "SEA", "cb", "ecdsa", "subtle", "keys", "pub", "ecdh", "pair", "data", "rand", "random", "ct", "aeskey", "aes", "stringify", "enc", "buffer_default", "dec", "parse", "signed", "key", "jwk", "msg", "k", "userPublicKey", "userSignature", "hash", "sha256", "sig", "alg", "verified", "check", "salt", "work", "to", "from", "pubKey", "priv", "derived", "derivedBits", "derivedKey", "sea_default", "LISTENER_DELAY", "MAX_GRAPH_SIZE", "Ham", "state", "currentState", "value", "currentValue", "change", "graph", "secure", "listen", "machine", "now", "defer", "wait", "soul", "node", "updated", "alias", "nodeWait", "verify", "sig", "userSignature", "pub", "userPublicKey", "sea_default", "key", "rel", "skew", "l", "match", "souls", "states", "maxState", "a", "b", "ham_default", "group", "record", "Radix", "radix", "keys", "value", "tree", "i", "tmp", "key", "max", "noValue", "found", "obj", "hasValue", "hasKey", "j", "matchingKey", "replace", "map", "cb", "opt", "pre", "u", "radix_default", "etx", "enq", "unit", "Radisk", "opt", "u", "cache", "fileListCache", "fileListCacheTime", "FILE_LIST_CACHE_TTL", "pendingReads", "lastMemoryCheck", "MEMORY_CHECK_INTERVAL", "HEAP_WARNING_THRESHOLD", "HEAP_CLEANUP_THRESHOLD", "perfLog", "operation", "startTime", "key", "size", "duration", "checkMemoryUsage", "now", "memUsage", "heapUsed", "heapTotal", "maxHeapSize", "heapUsageRatio", "cacheSize", "radisk", "value", "cb", "readStart", "err", "result", "callbacks", "callback", "radix_default", "thrashStart", "batch", "i", "rad", "save", "tree", "file", "start", "end", "disk", "write", "k", "pre", "enc", "writeStart", "soul", "read", "cachedRadix", "files", "originalLex", "parse", "data", "preString", "tmp", "a", "o", "state", "current", "text", "rel", "num", "obj", "previous", "textStart", "textEnd", "radisk_default", "isNode", "fs", "enq", "unit", "root", "fileSystem", "opt", "dir", "file", "cb", "err", "data", "tmp", "text", "files", "db", "o", "event", "req", "_get", "retry", "interval", "_put", "_list", "Store", "obj", "radisk", "radisk_default", "lex", "soul", "key", "node", "each", "value", "match", "graph", "radix_default", "count", "finished", "ack", "state", "store_default", "isNode", "wsModule", "createRateLimiter", "opt", "clients", "maxRequests", "windowMs", "disconnectThreshold", "isTestEnv", "cleanupInterval", "now", "clientId", "data", "time", "client", "oldestRequest", "delay", "validRequests", "safeJSONParse", "maxSize", "error", "validateMessage", "createConnectionManager", "maxConnections", "connections", "ws", "originalClose", "args", "createRetryHandler", "maxRetries", "retryCount", "Wire", "dup", "dup_default", "store", "store_default", "graph", "queue", "listen", "pendingReferences", "hasSoul", "soul", "resolve", "err", "rateLimiter", "connectionManager", "check", "send", "cb", "msg", "res", "getWithCallback", "node", "key", "userPublicKey", "get", "ack", "get_default", "text", "put", "update", "ham_default", "lex", "_opt", "obj", "track", "request", "sendResult", "id", "api", "value", "soulId", "rel", "_get", "found", "l", "wss", "config", "isBinary", "retryHandler", "validation", "parseResult", "throttleCount", "processMessage", "peers", "clientThrottled", "throttleUntil", "messageQueue", "queueProcessor", "maxQueueLength", "processQueue", "sendToPeers", "peer", "start", "c", "e", "m", "filteredPut", "shouldStore", "wire_default", "User", "opt", "wire", "wire_default", "pubs", "creating", "authing", "retries", "auth", "username", "password", "newPassword", "ack", "retry", "done", "err", "next", "pub", "msg", "data", "work", "sea_default", "dec", "user", "salt", "text", "enc", "update", "signed", "graph", "soul", "cb", "pair", "priv", "rel", "localStorage", "is", "user_default", "Holster", "opt", "obj", "wire", "wire_default", "user", "user_default", "map", "allctx", "ok", "data", "rel", "num", "check", "keys", "key", "value", "api", "ctxid", "get", "lex", "soul", "ack", "_opt", "msg", "userPublicKey", "userSignature", "id", "res", "_ctxid", "text", "graph", "userctx", "cb", "signed", "sea_default", "done", "ctx", "resolve", "request", "put", "on", "off", "found", "i", "item", "node", "g", "err", "_done", "_ack", "set", "result", "current", "chain", "update", "_get", "pub", "holster_default"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mblaney/holster",
3
- "version": "1.0.14",
3
+ "version": "1.0.15",
4
4
  "description": "Holster is a service that allows synchronising data between devices using Node, Deno, Bun or the browser.",
5
5
  "type": "module",
6
6
  "main": "index.js",
package/src/radisk.js CHANGED
@@ -67,6 +67,8 @@ const Radisk = opt => {
67
67
 
68
68
  // Memory monitoring and cache cleanup
69
69
  const checkMemoryUsage = () => {
70
+ if (typeof process === "undefined" || !process.memoryUsage) return
71
+
70
72
  const now = Date.now()
71
73
  if (now - lastMemoryCheck < MEMORY_CHECK_INTERVAL) return
72
74
  lastMemoryCheck = now