@mblaney/holster 2.2.0 → 2.2.2

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/dist/holster.js CHANGED
@@ -1,4 +1,4 @@
1
- var Ge={is:t=>{if(t instanceof Array)return!1;if(typeof t=="number")return!isNaN(t);if(typeof t=="string"){let e=parseFloat(t);return!isNaN(e)&&isFinite(e)}return!1}},se={is:t=>{if(!t||typeof t!="object")return!1;let n=Object.prototype.toString.call(t).match(/^\[object (\w+)\]$/);return t.constructor===Object||n!==null&&n[1]==="Object"},map:(t,e,n)=>{let r=Object.keys(t);for(let s=0;s<r.length;s++){let i=r[s],d=e(t[i],i,n);if(typeof d<"u")return d}},put:(t,e,n)=>{let r=t||{};return r[e]=n,r},del:(t,e)=>{if(t)return t[e]=null,delete t[e],t}},ft=(t,e,n)=>{if(n.id){n.id=!1;return}if(e==="#"&&typeof t=="string"){n.id=t;return}n.id=!1},ee={is:t=>{if(t&&typeof t=="object"&&"#"in t&&!("_"in t)&&se.is(t)){let e={id:""};if(se.map(t,ft,e),e.id)return e.id}return!1},ify:t=>se.put({},"#",t)},ke="_holster_user_signature",B="_holster_user_public_key",be=(t,e,n,r,s)=>{let i=s||Date.now(),d={},c={_:{"#":t,">":d}};for(let[l,p]of Object.entries(e))l!=="_"&&l!==B&&l!==ke&&(c[l]=p,d[l]=i);return n&&r&&s&&(c._.s||(c._.s={}),c._.s[s.toString()]=n,c[B]=r,d[B]=s),{[t]:c}},me=(t,e)=>{if(typeof e>"u")return t===null;if(typeof t>"u")return!0;if(typeof t=="string")return t===e;if(Array.isArray(t))return t.includes(e);if(!se.is(t)||!e)return!1;if("*"in t){let s=t["*"];return e.slice(0,s.length)===s}let n=">"in t?t[">"]:void 0,r="<"in t?t["<"]:void 0;return n&&r?e>=n&&e<=r:n?e>=n:r?e<=r:!1},Z={random:t=>{let e="",n="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",r=t||24;for(let s=0;s<r;s++)e+=n.charAt(Math.floor(Math.random()*n.length));return e}};var dt=()=>{let e={store:{},expiry:null,check:n=>e.store[n]?e.track(n):!1,track:n=>(e.store[n]=Date.now(),e.expiry||(e.expiry=setTimeout(()=>{let r=Date.now();Object.keys(e.store).forEach(s=>{r-e.store[s]>9e3&&delete e.store[s]}),e.expiry=null},9e3),e.expiry.unref&&e.expiry.unref()),n)};return e},et=dt;var gt=(t,e,n)=>{if(!t||typeof t!="object")throw new TypeError("lex must be an object");if(!e||typeof e!="object")throw new TypeError("graph must be an object");let r=t["#"];if(!r||typeof r!="string")throw new TypeError("soul must be a string");if(!e[r])return;let i={_:{"#":r,">":{}}},d={};if(typeof t["."]=="string"){let c=t["."];if(typeof e[r][c]>"u")return;i[c]=e[r][c],i._[">"][c]=e[r]._[">"][c];let l=e[r]._[">"][c],p=e[r]._.s;if(p&&p[l]&&(d[l.toString()]=p[l]),B&&typeof e[r][B]<"u"){i[B]=e[r][B],i._[">"][B]=e[r]._[">"][B];let u=e[r]._[">"][B],E=e[r]._.s;E&&E[u]&&(d[u.toString()]=E[u])}}else{if(!n)return;for(let c of Object.keys(e[r]))if(c===B||me(t["."],c)){i[c]=e[r][c],i._[">"][c]=e[r]._[">"][c];let l=e[r]._[">"][c],p=e[r]._.s;p&&p[l]&&(d[l.toString()]=p[l])}}return Object.keys(d).length>0&&(i._.s=d),{[r]:i}},He=gt;typeof btoa>"u"&&(globalThis.btoa=t=>Buffer.from(t,"binary").toString("base64"),globalThis.atob=t=>Buffer.from(t,"base64").toString("binary"));var De=class t extends Array{toString(e,n,r){let s=e||"utf8",i=n||0,d=r?Math.min(Math.max(r,i),this.length):this.length;if(s==="hex"){let c=new Uint8Array(this.slice(i,d));return Array.from(c,l=>l.toString(16).padStart(2,"0")).join("")}if(s==="utf8")return Array.from({length:d-i},(c,l)=>{let p=this[l+i];return p===void 0||p<0||p>1114111?"\uFFFD":String.fromCharCode(p)}).join("");if(s==="base64"){let c=Array.from({length:d-i},(l,p)=>{let u=this[p+i];return u===void 0||u<0||u>255?"\uFFFD":String.fromCharCode(u)}).join("");return btoa(c)}return this.toString("utf8",i,d)}static from(e){let n=Array.from(e);return new t(...n)}},we=De;var Le={MAX_BUFFER_SIZE:10*1024*1024,MAX_STRING_LENGTH:1024*1024},Pe=function(...e){return console.warn("new SafeBuffer() is deprecated, please use SafeBuffer.from()"),we.from([])};Pe.prototype=Object.create(Array.prototype);var Ie=(t,e)=>{if(t.length>Le.MAX_STRING_LENGTH)throw new RangeError(`String too large: ${t.length} > ${Le.MAX_STRING_LENGTH}`)},ge=(t,e="buffer operation")=>{if(t>Le.MAX_BUFFER_SIZE)throw new RangeError(`Buffer size too large for ${e}: ${t} > ${Le.MAX_BUFFER_SIZE}`)},pt=t=>{Ie(t,"hex");let e=t.replace(/\s/g,"").toLowerCase();if(!/^[0-9a-f]*$/.test(e))throw new TypeError("Invalid hex string: contains non-hex characters");if(e.length%2!==0)throw new TypeError("Invalid hex string: must have even length");if(e.length===0)return new Uint8Array(0);ge(e.length/2,"hex parsing");let n=new Uint8Array(e.length/2);for(let r=0;r<e.length;r+=2){let s=e.substr(r,2);n[r/2]=parseInt(s,16)}return n},tt=t=>{Ie(t,"utf8");try{let n=new TextEncoder().encode(t);return ge(n.length,"UTF-8 encoding"),n}catch(e){throw new TypeError(`Failed to encode UTF-8 string: ${e.message}`)}},ht=t=>{Ie(t,"binary"),ge(t.length,"binary encoding");let e=new Uint8Array(t.length);for(let n=0;n<t.length;n++){let r=t.charCodeAt(n);if(r>255)throw new TypeError(`Invalid binary string: character at position ${n} exceeds byte range (${r} > 255)`);e[n]=r}return e},yt=t=>{Ie(t,"base64");let e=t.replace(/\s/g,"");if(!/^[A-Za-z0-9+/]*={0,2}$/.test(e))throw new TypeError("Invalid base64 string: contains invalid characters");try{let n=atob(e);ge(n.length,"base64 decoding");let r=new Uint8Array(n.length);for(let s=0;s<n.length;s++)r[s]=n.charCodeAt(s);return r}catch(n){throw new TypeError(`Failed to decode base64 string: ${n.message}`)}},nt=t=>{if(t instanceof ArrayBuffer)return ge(t.byteLength,"ArrayBuffer processing"),new Uint8Array(t);if(ArrayBuffer.isView(t))return ge(t.byteLength,"TypedArray processing"),new Uint8Array(t.buffer,t.byteOffset,t.byteLength);if(Array.isArray(t)){ge(t.length,"Array processing");for(let e=0;e<t.length;e++){let n=t[e];if(typeof n!="number"||n<0||n>255||!Number.isInteger(n))throw new TypeError(`Invalid byte value at index ${e}: ${n} (must be integer 0-255)`)}return new Uint8Array(t)}if(typeof t=="object"&&t!==null&&"byteLength"in t&&typeof t.byteLength=="number")return ge(t.byteLength,"ArrayBuffer-like processing"),new Uint8Array(t);if(typeof t=="object"&&t!==null&&"length"in t&&typeof t.length=="number"){let e=t;ge(e.length,"array-like processing");let n=Array.from(e);for(let r=0;r<n.length;r++){let s=n[r];if(typeof s!="number"||s<0||s>255||!Number.isInteger(s))throw new TypeError(`Invalid byte value at index ${r}: ${s} (must be integer 0-255)`)}return new Uint8Array(n)}throw new TypeError("Unsupported input type: "+typeof t)};Object.assign(Pe,{from(...t){if(t.length===0)throw new TypeError("SafeBuffer.from() requires at least one argument");let n=t[0];if(n==null)throw new TypeError("First argument must not be null or undefined");let r;if(typeof n=="string"){let s=(t[1]||"utf8").toLowerCase();switch(s){case"hex":r=pt(n);break;case"utf8":case"utf-8":r=tt(n);break;case"binary":case"latin1":r=ht(n);break;case"base64":r=yt(n);break;case"ascii":Ie(n,"ascii");for(let i=0;i<n.length;i++)if(n.charCodeAt(i)>127)throw new TypeError(`Invalid ASCII character at position ${i}: ${n.charCodeAt(i)} > 127`);r=tt(n);break;default:throw new TypeError("Unknown encoding: "+s)}}else r=nt(n);if(!r||r.length===0)return we.from(new Uint8Array(0));try{return we.from(r)}catch(s){throw new Error(`Failed to create SafeBuffer: ${s.message}`)}},alloc(t,e=0){if(typeof t!="number"||!Number.isInteger(t)||t<0)throw new TypeError("Length must be a non-negative integer");ge(t,"buffer allocation");let n;if(typeof e=="number"){if(e<0||e>255||!Number.isInteger(e))throw new TypeError("Fill value must be an integer between 0 and 255");n=e}else if(typeof e=="string"){if(e.length!==1)throw new TypeError("Fill string must be exactly one character");if(n=e.charCodeAt(0),n>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(t);return n!==0&&r.fill(n),we.from(r)}catch(r){throw new Error(`Failed to allocate buffer: ${r.message}`)}},concat(t){if(!Array.isArray(t))throw new TypeError("First argument must be an array");if(t.length===0)return we.from(new Uint8Array(0));let e=0,n=[];for(let r=0;r<t.length;r++){let s=t[r];if(!s)throw new TypeError(`Array element at index ${r} is null or undefined`);let i;try{i=nt(s)}catch(d){throw new TypeError(`Invalid array element at index ${r}: ${d.message}`)}e+=i.length,ge(e,"buffer concatenation"),n.push(i)}try{let r=new Uint8Array(e),s=0;for(let i of n)r.set(i,s),s+=i.length;return we.from(r)}catch(r){throw new Error(`Failed to concatenate buffers: ${r.message}`)}},isBuffer(t){return t instanceof we||t!==null&&typeof t=="object"&&t.constructor===Pe},byteLength(t,e="utf8"){if(typeof t!="string")throw new TypeError("First argument must be a string");switch(e.toLowerCase()){case"utf8":case"utf-8":return new TextEncoder().encode(t).length;case"ascii":case"binary":case"latin1":return t.length;case"base64":{let n=t.replace(/\s/g,"");return Math.floor(n.length*3/4)-(n.match(/=/g)||[]).length}case"hex":return Math.floor(t.replace(/\s/g,"").length/2);default:throw new TypeError("Unknown encoding: "+e)}}});Pe.prototype.toString=function(t="utf8",e=0,n=this.length){if(typeof t!="string")throw new TypeError("Encoding must be a string");if(typeof e!="number"||!Number.isInteger(e)||e<0)throw new TypeError("Start must be a non-negative integer");if(typeof n!="number"||!Number.isInteger(n)||n<e)throw new TypeError("End must be an integer >= start");try{return we.prototype.toString.call(this,t,e,n)}catch(r){throw new Error(`Failed to convert buffer to string: ${r.message}`)}};var ce=Pe;var mt=typeof process<"u"&&process.versions?.node!=null,rt=mt?(await import("node:crypto")).webcrypto:globalThis.crypto,X=rt.subtle,Ve=t=>typeof t=="string"?t:JSON.stringify(t),Ce=t=>{try{return JSON.parse(t)}catch{return t}},$e=t=>{let e=new Uint8Array(t),n=rt.getRandomValues(e);return ce.from(n)},xe=(t,e)=>{let[n,r]=t.split(".");return{kty:"EC",crv:"P-256",x:n,y:r,d:e,ext:!0,key_ops:e?["sign"]:["verify"]}},Ae=async t=>{let e=await X.digest({name:"SHA-256"},new TextEncoder().encode(Ve(t)));return ce.from(new Uint8Array(e))},Be=async(t,e)=>{let n=t+e.toString("utf8"),r=await Ae(n),s=wt(r);return await X.importKey("jwk",s,{name:"AES-GCM"},!1,["encrypt","decrypt"])},wt=t=>({kty:"oct",k:t.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,""),ext:!1,alg:"A256GCM"});var vt={pair:async t=>{let e=await X.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]).then(async s=>{let i=await X.exportKey("jwk",s.publicKey);return{priv:(await X.exportKey("jwk",s.privateKey)).d,pub:i.x+"."+i.y}}),n=await X.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveKey"]).then(async s=>{let i=await X.exportKey("jwk",s.publicKey);return{epriv:(await X.exportKey("jwk",s.privateKey)).d,epub:i.x+"."+i.y}}),r={pub:e.pub,priv:e.priv,epub:n.epub,epriv:n.epriv};return t&&t(r),r},encrypt:async(t,e,n)=>{if(!e||!e.epriv)return n&&n(null),null;let r={s:$e(9),iv:$e(15)},s=await Be(e.epriv,r.s).then(d=>X.encrypt({name:"AES-GCM",iv:new Uint8Array(r.iv)},d,new TextEncoder().encode(Ve(t)))),i={ct:ce.from(s,"binary").toString("base64"),iv:r.iv.toString("base64"),s:r.s.toString("base64")};return n&&n(i),i},decrypt:async(t,e,n)=>{if(!t||!t.ct||!t.iv||!t.s||!e||!e.epriv)return n&&n(null),null;let r={ct:ce.from(t.ct,"base64"),iv:ce.from(t.iv,"base64"),s:ce.from(t.s,"base64")};try{let s=await Be(e.epriv,r.s).then(d=>X.decrypt({name:"AES-GCM",iv:new Uint8Array(r.iv),tagLength:128},d,new Uint8Array(r.ct))),i=Ce(new TextDecoder("utf8").decode(s));return n&&n(i),i}catch{return n&&n(null),null}},verify:async(t,e,n)=>{if(!e||!e.pub)return n&&n(null),null;let r=typeof t=="string"?Ce(t):t,s=await X.importKey("jwk",xe(e.pub),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]),i={};if(typeof r.m=="string")i=r.m;else for(let p of Object.keys(r.m).sort())p!=="_"&&p!==B&&p!==ke&&(i[p]=r.m[p]);let d=await Ae(i),c=new Uint8Array(ce.from(r.s,"base64")),l={name:"ECDSA",hash:{name:"SHA-256"}};if(await X.verify(l,s,c,new Uint8Array(d))){let p=Ce(r.m);return n&&n(p),p}return n&&n(null),null},sign:async(t,e,n)=>{if(!e||!e.pub||!e.priv)return n&&n(null),null;let r={};if(typeof t=="string")r=t;else{let p=Ce(t);for(let u of Object.keys(p).sort())u!=="_"&&u!==B&&u!==ke&&(r[u]=p[u])}let s=await Ae(r),i=xe(e.pub,e.priv),d={name:"ECDSA",namedCurve:"P-256"},c=await X.importKey("jwk",i,d,!1,["sign"]).then(p=>X.sign({name:"ECDSA",hash:{name:"SHA-256"}},p,new Uint8Array(s))),l={m:r,s:ce.from(c,"binary").toString("base64")};return n&&n(l),l},signTimestamp:async(t,e,n)=>{if(!e||!e.pub||!e.priv)return n&&n(null),null;let r=t.toString(),s=await Ae(r),i=xe(e.pub,e.priv),d={name:"ECDSA",namedCurve:"P-256"},c=await X.importKey("jwk",i,d,!1,["sign"]).then(p=>X.sign({name:"ECDSA",hash:{name:"SHA-256"}},p,new Uint8Array(s))),l=ce.from(c,"binary").toString("base64");return n&&n(l),l},verifyTimestamp:async(t,e,n,r)=>{if(!n||!t||!e)return r&&r(!1),!1;try{let s=t.toString(),i=await Ae(s),d=await X.importKey("jwk",xe(n),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]),c=new Uint8Array(ce.from(e,"base64")),l={name:"ECDSA",hash:{name:"SHA-256"}},p=await X.verify(l,d,c,new Uint8Array(i));return r&&r(p),p}catch(s){return console.log(`error verifying timestamp signature: ${s.message}`),r&&r(!1),!1}},work:async(t,e,n)=>{let r=n,s=e;typeof e=="function"&&(r=e,s=void 0),typeof s>"u"&&(s=$e(9));let i=await X.importKey("raw",new TextEncoder().encode(Ve(t)),{name:"PBKDF2"},!1,["deriveBits"]),d={name:"PBKDF2",iterations:1e5,salt:new TextEncoder().encode(s),hash:{name:"SHA-256"}},c=await X.deriveBits(d,i,512),l={epriv:ce.from(c,"binary").toString("base64")};return r&&r(l),l},secret:async(t,e,n)=>{if(!t||!t.epub||!e||!e.epub||!e.epriv)return n&&n(null),null;let r={name:"ECDH",namedCurve:"P-256"},s=xe(t.epub),i=await X.importKey("jwk",s,r,!0,[]),d=xe(e.epub,e.epriv);delete d.key_ops;let c=await X.importKey("jwk",d,r,!1,["deriveBits"]).then(async l=>{let p=await X.deriveBits({public:i,name:"ECDH",namedCurve:"P-256"},l,256),u=await X.importKey("raw",new Uint8Array(p),{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]);return X.exportKey("jwk",u).then(({k:E})=>E)});return n&&n({epriv:c}),{epriv:c}}},ue=vt;var kt=1e4,Ke=(t,e,n,r,s=!1)=>{if(t<e)return{historical:!0};if(t>e)return{incoming:!0};if(s&&n!==r)return{historical:!0};let i=typeof n!="string"?JSON.stringify(n)||"":n,d=typeof r!="string"?JSON.stringify(r)||"":r;return i===d?{state:!0}:i<d?{current:!0}:{incoming:!0}};Ke.mix=async(t,e,n,r,s,i=kt)=>{if(!t||typeof t!="object")throw new TypeError("change must be an object");if(!e||typeof e!="object")throw new TypeError("graph must be an object");if(!s||typeof s!="object")throw new TypeError("listen must be an object");let d=Date.now(),c={},l={},p=[],u=new Map,E=new Map,g=0;for(let f of Object.keys(t)){let S=t[f];if(!S||!S._)continue;let x=!1,G=!1,N=r,a=S[B];if(S._.s&&a&&(N=!0),f.length>1&&f[0]==="~")if(f[1]==="@")G=!0,N=!1;else{if(a&&f!=="~"+a){console.log(`error public key does not match for soul: ${f}`);continue}N=!0}if(N){if(!a||!S._)continue;let o=new Set,h=new Set,A=Object.entries(S._[">"]||{});for(let[w,b]of Object.entries(S._.s||{})){let v=Number(w);if(!isNaN(v)&&v>0){let k=A.filter(([,_])=>Number(_)===v);if(k.length>0&&k.every(([_])=>{let V=e[f]&&e[f]._[">"]?e[f]._[">"][_]:0;return V!==void 0&&V>v}))continue;if(await ue.verifyTimestamp(v,b,a)){o.add(v);for(let[_,V]of A)Number(V)===v&&h.add(_)}}}if(h.size===0)continue;u.set(f,h),E.set(f,o)}for(let o of Object.keys(S)){if(o==="_"||u.has(f)&&!u.get(f).has(o))continue;let h=S[o],A=(S._&&S._[">"]?S._[">"][o]:0)||0,w=e[f]?e[f][o]:void 0,b=e[f]&&e[f]._[">"][o]||0;if(G&&o!==ee.is(h)){console.log(`error alias ${G}: ${o} !== ${ee.is(h)}`);continue}let v=A-d;if(v>0){if(v>864e5)continue;if((g===0||v<g)&&(g=v),!l[f]){let k={},C={};l[f]={_:{"#":f,">":k,s:C}}}l[f][o]=h,l[f]._[">"][o]=A,S._.s&&S._.s[A]&&(l[f]._.s[A]=S._.s[A])}else{let k=E.has(f)&&E.get(f).has(A);if(Ke(A,b,h,w??null,k).incoming){if(!c[f]){let j={},_={};c[f]={_:{"#":f,">":j,s:_}}}if(!e[f]){let j={},_={};e[f]={_:{"#":f,">":j,s:_}}}e[f][o]=c[f][o]=h,e[f]._[">"][o]=c[f]._[">"][o]=A,S._.s&&S._.s[A]&&(e[f]._.s[A]=c[f]._.s[A]=S._.s[A]),s[f]&&s[f].filter(j=>me(j["."],o)).forEach(j=>p.push(j.cb)),x=!0}}}x&&s[f]&&s[f].filter(o=>me(o["."])).forEach(o=>p.push(o.cb))}let y=Object.keys(e);return y.length>i&&y.map(x=>{let G=e[x]._&&e[x]._[">"],N=G?Math.max(...Object.values(G)):0;return{soul:x,maxState:N}}).sort((x,G)=>x.maxState-G.maxState).slice(0,y.length-i).forEach(({soul:x})=>{delete e[x],n&&n.delete(x)}),{now:c,defer:l,wait:g,listeners:p}};var Je=Ke;var he="",Re="",st=t=>typeof t=="object"&&t!==null&&!Array.isArray(t),it=()=>{let t=(e,n,r)=>{if(r||(t[he]||(t[he]={}),r=t[he]),!e)return r;let s=0,i={},d=e[s],c=e.length-1,l=typeof n>"u",p=r[d];for(;!p&&s<c;)d+=e[++s],p=r[d];if(p)if(s===c){if(l)return typeof p[Re]>"u"?p[he]:p[Re];p[Re]=n}else{!p[he]&&!l&&(p[he]={});let u=p[he];if(st(u))return t(e.slice(++s),n,u)}else{if(l)return se.map(r,(y,f)=>{let S=0,x="";for(;f[S]===e[S];)x+=f[S],S++;if(x)return S<=c?void 0:(i[f.slice(S)]=y,y)})?i:void 0;let u=null,E="";for(let g of Object.keys(r)){let y=0,f="";for(;g[y]===e[y];)f+=g[y],y++;f.length>E.length&&(u=g,E=f)}if(u){let g=r[u],y=E.length,f={[u.slice(y)]:g,[e.slice(y)]:{[Re]:n}};r[E]={[he]:f},delete r[u]}else r[d]||(r[d]={}),r[d][Re]=n}};return t};it.map=function t(e,n,r,s=[]){let i=e[he]||e,d=Object.keys(i).sort();for(let c=0;c<d.length;c++){let l=d[c],p=i[l];if(!p)continue;let u=p[Re];if(typeof u<"u"){let g=n(u,s.join("")+l,l,s);if(typeof g<"u")return g}else r&&n(void 0,s.join(""),l,s);let E=p[he];if(st(E)){s.push(l);let g=t(E,n,r,s);if(typeof g<"u")return g;s.pop()}}};var fe=it;var ze="",Ue="",ie="",Ee=t=>{let e=new Map,n=null,r=0,s=1e4,i=new Map,d=0,c=3e4,l=.8,p=.9,u={log:t.log||console.log,batch:t.batch||100,write:t.write||1,size:t.size||1024*1024,memoryLimit:t.memoryLimit||500,cache:t.cache!==void 0?t.cache:!0,store:t.store};if(!u.store)throw new Error("Radisk needs `store` interface with `{get: fn, put: fn, list: fn}`");if(!u.store.get)throw new Error("Radisk needs `store.get` interface with `(file, cb)`");if(!u.store.put)throw new Error("Radisk needs `store.put` interface with `(file, data, cb)`");if(!u.store.list)throw new Error("Radisk needs a streaming `store.list` interface with `(cb)`");let E=u.store,g=()=>{if(typeof process>"u"||!process.memoryUsage)return;let f=Date.now();if(f-d<c)return;d=f;let x=process.memoryUsage().heapUsed,G=u.memoryLimit*1024*1024,N=x/G;if(N>p){let a=e.size;console.log(`[RADISK-MEMORY] High memory usage: ${Math.round(N*100)}% of heap limit. Clearing ${a} cached files.`),e.clear(),global.gc&&global.gc(),d=f+c}else N>l&&console.log(`[RADISK-MEMORY] Memory warning: ${Math.round(N*100)}% of heap limit used. Cache size: ${e.size} files.`)},y=(f,S,x)=>{if(typeof f=="string"){if(typeof S=="function"){let G=S,N=y.batch(f);if(typeof N<"u")return G(void 0,N);if(y.thrash.at){let o=y.thrash.at(f);if(typeof o<"u")return G(void 0,o)}if(i.has(f)){i.get(f).push(G);return}i.set(f,[G]);let a=setTimeout(()=>{let o=i.get(f);o&&(u.log(`radisk read hang detected for key: ${f}`),i.delete(f),o.forEach(h=>h(null,null)))},3e4);return y.read(f,(o,h)=>{clearTimeout(a);let A=i.get(f)||[];i.delete(f),A.forEach(w=>w(o,h))})}if(y.batch(f,S),g(),x&&y.batch.acks.push(x),++y.batch.ed>=u.batch)return y.thrash();clearTimeout(y.batch.timeout),y.batch.timeout=setTimeout(y.thrash,u.write)}};return y.batch=fe(),y.batch.acks=[],y.batch.ed=0,y.thrash=()=>{if(y.thrash.ing){y.thrash.more=!0;return}clearTimeout(y.batch.timeout),y.thrash.more=!1,y.thrash.ing=!0;let f=y.thrash.at=y.batch;y.batch=fe(),y.batch.acks=[],y.batch.ed=0,y.save(f,S=>{S&&u.log(S),f.acks.forEach(x=>x(S)),y.thrash.at=void 0,y.thrash.ing=!1,y.thrash.more&&y.thrash()})},y.save=(f,S)=>{let x={find:(G,N)=>{if(N<(x.start||""))return;x.start=N;let a=[];return E.list(o=>{if(o){a.push(o);return}a.sort(),x.lex(a)}),!0},lex:G=>{if(!x.start)return;let N=null;for(let a of G){if(a>x.start){x.mix(N||"!",x.start,a);return}N=a}x.mix(N||"!",x.start,void 0)},mix:(G,N,a)=>{if(x.start=void 0,e.has(G)){let o=e.get(G);fe.map(f,(h,A)=>{if(!(A<N)){if(a&&a<A)return x.start=A,!0;o(A,h)}}),y.write(G,o,x.next)}else y.parse(G,(o,h)=>{if(o)return S(o);fe.map(f,(A,w)=>{if(!(w<N)){if(a&&a<w)return x.start=w,!0;h(w,A)}}),u.cache&&e.set(G,h),y.write(G,h,x.next)})},next:G=>{if(G)return S(G);if(x.start){fe.map(f,x.find);return}S(G)},start:void 0};fe.map(f,x.find)},y.write=(f,S,x)=>{let G=1,N=null,a=h=>{h&&!N&&(N=h),!(--G>0)&&x(N)},o={text:"",limit:"",done:!1,count:0,sub:void 0,halfKey:"",halfOffset:0,each:(h,A,w,b)=>{if(o.done)return;o.count++;let v=typeof h>"u"?"":"="+Ee.encode(h),k=Ee.encode(b.length)+"#"+Ee.encode(w)+v+`
2
- `,C=b.length===0||b.length===1&&w.includes(Ue);if(!o.halfKey&&o.count>1&&o.text.length>u.size/2&&C){let j=b.join("")+w,_=j.indexOf(Ue);o.halfKey=_===-1?j:j.substring(0,_),o.halfOffset=o.text.length}if(o.count>1&&o.text.length+k.length>u.size&&C){let j=b.join("")+w,_=j.indexOf(Ue);if(o.limit=o.halfKey||(_===-1?j:j.substring(0,_)),o.limit!==f){o.halfKey&&(o.text=o.text.substring(0,o.halfOffset)),o.done=!0,o.sub=fe(),fe.map(S,o.slice),G++,y.write(o.limit,o.sub,a);return}}o.text+=k},slice:(h,A)=>{A<o.limit||o.sub(A,h)}};fe.map(S,o.each,!0),E.put(f,o.text,h=>{o.done&&(e.delete(f),n=null),a(h)})},y.read=(f,S)=>{let x=f.indexOf(Ue),G=x===-1?f:f.substring(0,x),N=h=>{let A=0,w=h.length-1,b=null;for(;A<=w;){let v=A+w>>1,k=h[v];k<=G?(b=k,A=v+1):w=v-1}return b},a=h=>{if(!h){S("no file found",void 0);return}if(u.cache&&e.has(h))return S(void 0,e.get(h)(f));y.parse(h,(A,w)=>{A&&u.log(A),w&&u.cache&&!e.has(h)&&(e.set(h,w),g()),S(A,w?w(f):void 0)})},o=Date.now();if(u.cache&&n&&o-r<s)a(N(n));else{let h=[];E.list(A=>{if(A){h.push(A);return}h.sort(),u.cache&&(n=h,r=o),a(N(h))})}},y.parse=(f,S)=>{let x={disk:fe(),read:(G,N)=>{if(G)return S(G);if(!N)return S(null,x.disk);let a=[],o="",h=x.split(N);for(;h;){let A,w,b=h[1],v=typeof b=="number"?b:typeof b=="string"?parseInt(b,10):0;if(h=x.split(h[2])||"",h[0]==="#"){let k=h[1];A=typeof k=="string"?k:String(k),v<a.length&&(a.length=v),v<=a.length&&(a[v]=A,a.length=v+1),o=a.join("")}h=x.split(h[2])||"",h[0]!==`
3
- `&&(h[0]==="="&&(w=h[1]),typeof A<"u"&&typeof w<"u"&&x.disk(o,w),h=x.split(h[2]))}S(null,x.disk)},split:G=>{if(!G)return;let N=G.indexOf(ie);if(N===-1)return;let a=G.slice(0,N),o={};return[a,Ee.decode(G.slice(N),o),G.slice(N+o.i)]}};E.get(f,x.read)},y};Ee.encode=t=>{let e="",n="",r;if(Array.isArray(t)&&(t.length===2||t.length===3)?(e=ze+t[1],t.length===3&&t[2]&&(n=ze+t[2]),r=t[0]):r=t,typeof r=="string"){let i=0,d,c=ie;for(;d=r[i++];)d===ie&&(c+=ie);return c+'"'+r+e+n+ie}let s=ee.is(r);if(s)return ie+"#"+s+e+n+ie;if(Ge.is(r))return ie+"+"+(r||0)+e+n+ie;if(r===!0)return ie+"+"+e+n+ie;if(r===!1)return ie+"-"+e+n+ie;if(r===null)return ie+" "+e+n+ie};Ee.decode=(t,e)=>{let n=-1,r=0,s,i,d=-1,c=-1;if(t[0]!==ie)return;for(;s=t[++n];)if(i){if(d===-1&&(d=n),s===ie&&--r<=0){c=n;break}}else s===ie?r++:i=s||"true";let l=d!==-1?t.slice(d,c!==-1?c:n):"";e&&(e.i=n+1);let p=l.split(ze),u=p[0],E=p[1],g=p[2];if(E){let y=parseFloat(E);if(g){if(i==='"')return[u,y,g];if(i==="#")return[ee.ify(u),y,g];if(i==="+")return u.length===0?[!0,y,g]:[parseFloat(u),y,g];if(i==="-")return[!1,y,g];if(i===" ")return[null,y,g]}else{if(i==='"')return[u,y];if(i==="#")return[ee.ify(u),y];if(i==="+")return u.length===0?[!0,y]:[parseFloat(u),y];if(i==="-")return[!1,y];if(i===" ")return[null,y]}}else{if(i==='"')return l;if(i==="#")return ee.ify(l);if(i==="+")return l.length===0?!0:parseFloat(l);if(i==="-")return!1;if(i===" ")return null}};var ot=Ee;var at=typeof process<"u"&&process.versions?.node!=null,ve=at?await import("node:fs"):void 0,qe="",We="",Xe=We+"+0"+We+"#"+We+'"root'+We,St=t=>{let e=t.file;if(at)return ve.existsSync(e)||ve.mkdirSync(e),ve.existsSync(e+"/!")||ve.writeFileSync(e+"/!",Xe),{get:(n,r)=>{ve.readFile(e+"/"+n,(s,i)=>{if(s){if(s.code==="ENOENT"){r();return}console.log("fs.readFile error:",s)}let d=i?i.toString():void 0;r(s,d)})},put:(n,r,s)=>{let i=n+"."+Z.random(9)+".tmp";ve.writeFile(i,r,d=>{if(d){console.log("fs.writeFile error:",d),s(d);return}ve.rename(i,e+"/"+n,s)})},list:n=>{ve.readdir(e,(r,s)=>{if(r){console.log("fs.readdir error:",r),n();return}s&&s.forEach(n),n()})}};if(t.indexedDB){let n,r=new Promise((s,i)=>{let d=indexedDB.open(e,1);d.onupgradeneeded=c=>{c.target.result.createObjectStore(e)},d.onerror=c=>{console.log(c),i(c)},d.onsuccess=()=>{if(n=d.result,n){let l=n.transaction([e],"readonly").objectStore(e).getKey("!");l.onerror=()=>{console.log(`error getting key ${e}/!`),i(l.error)},l.onsuccess=()=>{if(l.result)s();else{let u=n.transaction([e],"readwrite").objectStore(e).put(Xe,"!");u.onerror=()=>{console.log(`error putting root on ${e}/!`),i(u.error)},u.onsuccess=()=>{s()}}}}else console.log("error indexedDB not available"),i(new Error("indexedDB not available"))}});return{get:(s,i)=>{let d=(c,l)=>{let u=n.transaction([e],"readonly").objectStore(e).get(c);u.onerror=()=>{console.log(`error getting ${e}/${c}`),l(u.error)},u.onsuccess=()=>{l(null,u.result)}};r.then(()=>{d(s,i)}).catch(c=>{i(c)})},put:(s,i,d)=>{let c=(l,p,u)=>{let g=n.transaction([e],"readwrite").objectStore(e).put(p,l);g.onerror=()=>{console.log(`error putting data on ${e}/${l}`),u(g.error)},g.onsuccess=()=>{u(null)}};r.then(()=>{c(s,i,d)}).catch(l=>{d(l)})},list:s=>{let i=d=>{let l=n.transaction([e],"readonly").objectStore(e).getAllKeys();l.onerror=()=>{console.log("error getting keys for",e),d()},l.onsuccess=()=>{l.result.forEach(d),d()}};r.then(()=>{i(s)}).catch(d=>{console.log("error indexedDB not available:",d),s()})}}}return{get:(n,r)=>{r(null,Xe)},put:(n,r,s)=>{s(null)},list:n=>{n("!"),n()}}},xt=t=>{let e=t||{};e.file=String(e.file||"radata"),e.store||(e.store=St(e));let n=ot(e);return{get:(r,s)=>{if(!r||!se.is(r)){s("lex required");return}if(!r["#"]){s("soul required in lex");return}let i=r["#"],d=typeof r["."]=="string"?r["."]:"",c,l={},p=(f,S)=>{S!==B&&!me(r["."],S)||(c||(c={_:{"#":i,">":{}}}),c[S]=f[0],c._[">"][S]=f[1],f.length===3&&f[2]&&(l[f[1].toString()]=f[2]))},u=d!==""&&d!==B,E=u?2:1,g=null,y=f=>{if(f&&!g&&(g=f),--E>0)return;let S={[i]:c};c&&Object.keys(l).length>0&&(c._.s=l),s(g,S)};n(i+qe+d,(f,S)=>{se.is(S)?(fe.map(S,p),c||p(S,d)):S&&p(S,d),y(f)}),u&&n(i+qe+B,(f,S)=>{S&&!se.is(S)&&p(S,B),y(f)})},put:(r,s)=>{if(!r){s("graph required");return}let i=0,d=!1,c=l=>{if(i--,!d){if(l){d=!0,s(l);return}i===0&&(d=!0,s(null))}};Object.keys(r).forEach(l=>{let p=r[l];Object.keys(p).forEach(u=>{if(u==="_")return;i++;let E=p[u],g=p._[">"][u],y=p._.s&&p._.s[g],f=y?[E,g,y]:[E,g];n(l+qe+u,f,c)})})}}};var ut=xt;var Te=typeof process<"u"&&process.versions?.node!=null,Me=Te?await import("ws"):void 0,Ze=Te?await import("node:fs"):void 0;typeof globalThis.WebSocket>"u"&&Me&&(globalThis.WebSocket=Me.WebSocket);var Et=t=>{let e=new Map,n=1500,r=6e4,s=10,i=null;return t||(i=setInterval(()=>{let c=Date.now();for(let[l,p]of Array.from(e.entries()))c-p.lastCleanup>r&&(p.requests=[],p.lastCleanup=c),p.requests=p.requests.filter(u=>c-u<r),c-p.lastCleanup>r*10&&(p.throttleCount=0)},r/4)),{getDelay:c=>{let l=Date.now(),p=e.get(c)||{requests:[],lastCleanup:l,throttleCount:0};if(p.requests=p.requests.filter(u=>l-u<r),p.requests.length>=n){let u=Math.min(...p.requests),E=r-(l-u);return p.throttleCount=(p.throttleCount||0)+1,e.set(c,p),Math.max(0,E)}return p.requests.push(l),e.set(c,p),0},getRemainingRequests:c=>{let l=e.get(c);if(!l)return n;let p=Date.now(),u=l.requests.filter(E=>p-E<r);return Math.max(0,n-u.length)},getThrottleCount:c=>{let l=e.get(c);return l&&l.throttleCount||0},shouldDisconnect:c=>{let l=e.get(c);return l?l.throttleCount>=s:!1},destroy:()=>{i&&(clearInterval(i),i=null),e.clear()}}},At=(t,e=1024*1024)=>{try{if(typeof t=="string"&&t.length>e)throw new Error("Message too large");return{success:!0,data:JSON.parse(t.toString())}}catch(n){return{success:!1,error:n.message}}},Rt=(t,e=1024*1024)=>typeof t=="string"&&t.length>e?{valid:!1,error:"Message too large"}:Buffer.isBuffer&&Buffer.isBuffer(t)&&t.length>e?{valid:!1,error:"Message too large"}:{valid:!0},Tt=(t=1e3)=>{let e=new Set;return{add:n=>{if(e.size>=t)return!1;e.add(n);let r=n.close.bind(n);return n.close=(...s)=>(e.delete(n),r(...s)),!0},remove:n=>{e.delete(n)},count:()=>e.size,isFull:()=>e.size>=t}},Qe=(t=5)=>{let e=0;return{shouldRetry:()=>e<t,getDelay:()=>Math.min(1e3*Math.pow(2,e),3e4),increment:()=>{e++},reset:()=>{e=0}}},_t=t=>{let e=t||{},n=et(),r=ut(e),s={},i={},d={},c=new Set,l=new Set,p=new Map,u=1e4,E=new Map,g=new Map,y=async m=>s[m]?!0:new Promise(R=>{r.get({"#":m},(O,T)=>{R(!O&&!!T&&!!T[m])})}),f=Te&&globalThis.WebSocket!==Me?.WebSocket,S=Et(f),x=Tt(e.maxConnections||1e3),N=(typeof e.defaultLimit=="number"?e.defaultLimit:1)*1048576,a=new Map,o=new Map,h=null,A=m=>{Ze.readFile(`${e.file}/../.user_storage.json`,"utf8",(R,O)=>{if(R){m&&m();return}try{let T=JSON.parse(O);a.clear();for(let[P,I]of Object.entries(T))typeof I=="number"&&a.set(P,I)}catch{}m&&m()})},w=()=>{if(h)return;let m=setTimeout(()=>{h=null;let R={};for(let[O,T]of a)R[O]=T;Ze.writeFile(`${e.file}/../.user_storage.json`,JSON.stringify(R),O=>{O&&console.warn("saveUserStorage error:",O)})},5e3);m.unref&&m.unref(),h=m},b=m=>{Ze.readFile(`${e.file}/../.user_limit.json`,"utf8",(R,O)=>{if(R){m&&m();return}try{let T=JSON.parse(O);o.clear();for(let[P,I]of Object.entries(T))typeof I=="number"&&o.set(P,I*1048576)}catch{}m&&m()})},v=m=>m<1024?`${m} B`:m<1048576?`${(m/1024).toFixed(1)} KB`:m<1073741824?`${(m/1048576).toFixed(1)} MB`:`${(m/1073741824).toFixed(1)} GB`,k=()=>{let m=a.size,R=N===0?"unlisted users blocked":v(N);console.log(`[HOLSTER] Per-user storage limits enabled (${m} user${m!==1?"s":""}, default: ${R})`);let O=[...a.entries()].sort(([,P],[,I])=>I-P),T=P=>{let I=a.get(P)??0,L=o.get(P)??N,M=L===0?"blocked":v(L);console.log(` ${P.slice(0,16)}... used: ${v(I)} / limit: ${M}`)};m<=5?O.forEach(([P])=>T(P)):(console.log(" Top 5 by storage used:"),O.slice(0,5).forEach(([P])=>T(P))),console.log("Run npx holster-user-storage to view full keys and all users")},C=async(m,R,O)=>{let T=B;for(let P of Object.keys(m)){let I=m[P];if(I[T]===void 0)continue;let L=await new Promise(U=>{V({"#":P},U,R,{put:!0})});if(L.err)return O&&O(L.err),!1;let M=L.put&&L.put[P];if(!(!M||M[T]===void 0||M[T]===I[T]))return O&&O(`error in wire check public key does not match for soul: ${P}`),!1}return!0},j=(m,R)=>{let O=He(m.get,s);O?R(JSON.stringify({"#":n.track(Z.random(9)),"@":m["#"],put:O})):r.get(m.get,(T,P)=>{R(JSON.stringify({"#":n.track(Z.random(9)),"@":m["#"],put:P,err:T}))})},_=async(m,R)=>{let O={};if(e.userLimit)for(let[I,L]of Object.entries(m.put))L&&L[B]&&s[I]&&(O[I]=JSON.stringify(s[I]).length);if(!await C(m.put,R))return;let T=await Je.mix(m.put,s,l,e.secure||!1,d,e.maxGraphSize);if(Object.keys(T.now).length===0){Object.keys(T.defer).length!==0&&setTimeout(()=>_({put:T.defer,"#":m["#"]},R),T.wait);return}let P=I=>{I&&console.warn("store.put",I),R(JSON.stringify({"#":n.track(Z.random(9)),"@":m["#"],err:I})),T.listeners.forEach(L=>L())};if(!e.userLimit)r.put(T.now,P);else{let I={};for(let[L,M]of Object.entries(T.now)){let U=M[B];if(!U){I[L]=M;continue}let D=o.get(U)??N,$=a.get(U)??0,J=O[L]??0,ne=s[L]?JSON.stringify(s[L]).length:0,Y=Math.max(0,$-J+ne);Y>$&&Y>D||(I[L]=M,a.set(U,Y),w())}Object.keys(I).length>0?r.put(I,P):P(null)}Object.keys(T.defer).length!==0&&setTimeout(()=>_({put:T.defer,"#":m["#"]},R),T.wait)},V=(m,R,O,T)=>{if(!R)return;let P=T||{},I=P.fast||!m["."]&&l.has(m["#"]),L=He(m,s,I),M=Z.random(9),U=JSON.stringify({"#":n.track(M),get:m});if(L){if(!Te)if(!m["."]||typeof m["."]=="string"){let D=m["#"]+(m["."]?"."+m["."]:""),$=Date.now(),J=p.get(D);if(!J||$-J>u){p.set(D,$);let ne=O(U);if(ne&&ne.err){R({err:ne.err});return}}}else{let D=O(U);if(D&&D.err){R({err:D.err});return}}R({put:L});return}r.get(m,(D,$)=>{if($){for(let[re,pe]of Object.entries($))if(pe){if(!s[re]){s[re]={...pe};continue}for(let[ye,_e]of Object.entries(pe)){if(ye==="_")continue;let Ye=s[re];if(typeof Ye[ye]<"u")continue;Ye[ye]=_e;let Oe=pe._;if(Oe?.[">"]&&typeof Oe[">"][ye]<"u"){let je=Oe[">"][ye],Ne=s[re]._;Ne[">"][ye]=je,Oe.s?.[je]&&(Ne.s||(Ne.s={}),Ne.s[je]=Oe.s[je])}}}!m["."]&&$[m["#"]]&&l.add(m["#"]);let ne=$[m["#"]];if(ne&&Object.keys(ne).some(re=>re!=="_"&&me(m["."],re))){if(!Te&&m["."]!==B)if(!m["."]||typeof m["."]=="string"){let re=m["#"]+(m["."]?"."+m["."]:""),pe=Date.now(),ye=p.get(re);if(!ye||pe-ye>u){p.set(re,pe);let _e=O(U);if(_e&&_e.err){R({err:_e.err});return}}}else{let re=O(U);if(re&&re.err){R({err:re.err});return}}R(D?{put:$,err:D}:{put:$});return}}if(D&&console.log(D),P&&P.put){let ne=m["#"],Y={[ne]:null};typeof m["."]=="string"&&(Y[ne]={[m["."]]:null}),R({put:Y});return}i[M]=R,E.set(M,m),c.add(m["#"]);let J=O(U);if(J&&J.err){R({err:J.err}),delete i[M],E.delete(M);return}})},H=m=>({get:(R,O,T)=>{R&&typeof R["."]=="number"&&(R={...R,".":String(R["."])}),R&&R["#"]&&c.add(R["#"]),V(R,O,m,T)},put:async(R,O)=>{let T={};if(e.userLimit)for(let[L,M]of Object.entries(R))M&&M[B]&&s[L]&&(T[L]=JSON.stringify(s[L]).length);if(!await C(R,m,O))return;let P=await Je.mix(R,s,l,e.secure||!1,d,e.maxGraphSize);if(Object.keys(P.now).length===0){O&&O(null);return}for(let L of Object.keys(P.now))l.add(L);if(e.userLimit)for(let[L,M]of Object.entries(P.now)){let U=M[B];if(!U)continue;let D=o.get(U)??N,$=a.get(U)??0,J=T[L]??0,ne=s[L]?JSON.stringify(s[L]).length:0,Y=Math.max(0,$-J+ne);if(Y>$&&Y>D){O&&O("storage limit exceeded");return}a.set(U,Y),w()}for(let[L,M]of Object.entries(P.now))if(M&&typeof M=="object")for(let[U,D]of Object.entries(M)){let $=ee.is(D);$&&c.add($)}r.put(P.now,L=>{O&&O(L),P.listeners.forEach(M=>M())});let I=m(JSON.stringify({"#":n.track(Z.random(9)),put:R}));if(I&&I.err){O&&O(I.err);return}},on:(R,O,T,P)=>{R&&typeof R["."]=="number"&&(R={...R,".":String(R["."])});let I=R&&R["#"];!I||!O||(d[I]?d[I].push({".":R["."],cb:O}):d[I]=[{".":R["."],cb:O}],T&&V(R,O,m,P))},off:(R,O)=>{let T=R&&R["#"];if(!(!T||!d[T]))if(O){let P=d[T].find(I=>I.cb===O);P&&d[T].splice(d[T].indexOf(P),1)}else delete d[T]}});if(Te&&(e.wss||e.server||e.port!=null)){let m=e.wss,R=()=>m.clients?.()||[];if(!m){let T=e.server?{server:e.server}:{port:e.port};m=new Me.WebSocketServer(T),R=()=>Array.from(m.clients||[])}let O=(T,P)=>{let L=JSON.parse(T)["#"];if(L&&E.has(L)){let M=E.get(L);E.delete(L),setTimeout(()=>{let U=i[L];if(U){let D=M["#"],$={[D]:null};typeof M["."]=="string"&&($[D]={[M["."]]:null}),U({put:$}),delete i[L]}},f?100:1e4)}R().forEach(M=>{let U=M;if(U&&U.readyState===WebSocket.OPEN)U.send(T,{binary:P});else if(U){let D=U._retryHandler||Qe();if(U._retryHandler=D,D.shouldRetry()){let $=D.getDelay();D.increment(),setTimeout(()=>{U&&U.readyState===WebSocket.OPEN&&(D.reset(),U.send(T,{binary:P}))},$)}}})};return e.userLimit&&(A(()=>b(()=>k())),setInterval(b,6e4).unref()),m.on("connection",T=>{if(!x.add(T)){console.log("Connection limit reached, rejecting connection"),T.close(1013,"Connection limit reached - try again later");return}let P=Z.random(9);console.log(`New WebSocket client connected: ${P}`),T.on?.("error",(...I)=>{let L=I[0];console.log("WebSocket error:",L),x.remove(T)}),T.on?.("close",()=>{console.log(`WebSocket client disconnected: ${P}`),x.remove(T)}),T.on?.("message",(...I)=>{let L=I[0],M=I[1],U=Rt(L,e.maxMessageSize);if(!U.valid){console.warn(`Invalid message: ${U.error}`),T.send(JSON.stringify({error:U.error}));return}let D=At(L,e.maxMessageSize);if(!D.success){console.warn(`JSON parse error: ${D.error}`),T.send(JSON.stringify({error:"Invalid JSON"}));return}let $=D.data;if(!$["#"]||n.check($["#"]))return;let J=S.getDelay(P);if(J>0){let Y=S.getThrottleCount(P);if(console.log(`Client ${P}: rate limit exceeded, delay would be ${J}ms, dropping message (throttle count: ${Y})`),S.shouldDisconnect(P)){console.log(`Client ${P}: Disconnecting after ${Y} throttle violations`),T.close(1008,"Rate limit violations");return}T.send(JSON.stringify({"#":n.track(Z.random(9)),"@":$["#"],err:`Rate limit exceeded. Slow down requests. Wait ${Math.ceil(J/1e3)}s`,throttle:J}));return}let ne=async()=>{n.track($["#"]),$.get&&j($,O),$.put&&await _($,O),O(L.toString(),M);let Y=$["@"],re=i[Y];re&&(delete $["#"],delete $["@"],re($),delete i[Y])};J>0?setTimeout(ne,J):ne()})}),H(O)}let F=[],W=!1,Q=0,K=[],z=[],te=null,le=e.maxQueueLength||1e4,de=(m,R,O=f?100:1e4)=>setTimeout(()=>{g.delete(m),E.delete(m);let T=i[m];if(T){let P=R["#"],I={[P]:null};typeof R["."]=="string"&&(I[P]={[R["."]]:null}),T({put:I}),delete i[m]}},O),q=()=>{if(K.length===0){te=null;return}let m=Date.now();if(W&&m<Q){te=setTimeout(q,Math.min(1e3,Q-m));return}W&&m>=Q&&(console.log("Throttle period ended, resuming queue processing"),W=!1,Q=0);let R=K[0],O=oe(R),T=JSON.parse(R),P=T["#"],I=!O&&!!T.get&&!E.has(P);if(O||I?K.shift():!O&&T.put&&(K.shift(),z.push(R)),P&&E.has(P)){let L=E.get(P);O?(g.has(P)&&(clearTimeout(g.get(P)),g.delete(P)),de(P,L)):g.has(P)||g.set(P,de(P,L,0))}K.length>0?te=setTimeout(q,50):te=null},oe=m=>{let R=!1;return F.forEach(O=>{let T=O;if(T&&T.readyState===WebSocket.OPEN)T.send(m),R=!0;else if(T){let P=T._retryHandler||Qe();if(T._retryHandler=P,P.shouldRetry()){let I=P.getDelay();P.increment(),setTimeout(()=>{O&&O.readyState===WebSocket.OPEN&&(P.reset(),O.send(m))},I)}}}),R},ae=m=>{if(K.length>=le)return{err:`Message queue exceeded maximum length (${le}). Update query logic to request less data.`};K.push(m),te||(te=setTimeout(q,50))};return(!(e.peers instanceof Array)||e.peers.length===0)&&(e.peers=[`ws://localhost:${e.port||8765}`]),e.peers.forEach(m=>{let R=()=>{let O=new WebSocket(m);F.push(O);let T=Qe();O.onclose=()=>{if(O&&F.indexOf(O)!==-1&&F.splice(F.indexOf(O),1),O=null,T.shouldRetry()){let P=f?50:T.getDelay();T.increment();let I=setTimeout(R,P);I.unref&&I.unref()}},O.onopen=()=>{T.reset(),z.length>0&&(K=z.concat(K),z=[],te||(te=setTimeout(q,50)))},O.onerror=P=>{console.log(P)},O.onmessage=async P=>{let I=JSON.parse(P.data);if(!I["#"]||n.check(I["#"]))return;if(I.throttle&&I.err){console.log(`Server throttling: ${I.err}`),W=!0,Q=Date.now()+I.throttle;return}if(n.track(I["#"]),I.get&&j(I,ae),I.put){let U=new Map;for(let[J,ne]of Object.entries(I.put)){let Y=await y(J);if(U.set(J,Y),!(!Y&&!c.has(J)||!ne||typeof ne!="object"))for(let[,re]of Object.entries(ne)){let pe=ee.is(re);pe&&c.add(pe)}}let D={},$=[];for(let[J,ne]of Object.entries(I.put)){let Y=U.get(J);c.has(J)&&(Y=!0,$.push(J)),Y&&(D[J]=ne)}if(Object.keys(D).length>0){let J={put:D,"#":I["#"]};await _(J,ae)}$.forEach(J=>c.delete(J))}let L=I["@"],M=i[L];M&&(delete I["#"],delete I["@"],M(I),delete i[L])}};R()}),H(ae)},Fe=_t;var Ot=(t,e)=>{e||(e=Fe(t));let n=[],r=!1,s=!1,i=0,d=(l,p,u,E)=>{let g=x=>{i++,d(x,p,u,E)},y=x=>{n=[],i=0,s=!1,E(x)},f=()=>{if(n.length===0){y("Wrong username or password");return}let x=n.shift();e.get({"#":x,".":["auth","pub","epub"]},async G=>{if(G.err){y(`error getting ${x}: ${G.err}`);return}let N=G.put&&G.put[x];if(!N||!N.auth)return f();let a=JSON.parse(N.auth),o=await ue.work(p,a.salt),h=await ue.decrypt(a.enc,o);if(!h)return f();if(c.is={username:l,pub:N.pub,epub:N.epub,priv:h.priv,epriv:h.epriv},u!==""){let A=Z.random(64),w=await ue.work(u,A),b=await ue.encrypt(h,w),v={auth:JSON.stringify({enc:b,salt:A})},k=Date.now(),C=await ue.signTimestamp(k,c.is),j=be(x,v,C,N.pub,k);e.put(j,_=>{y(_?`error putting ${JSON.stringify(v)} on ${x}: ${_}`:null)});return}y(null)})};if(i>9){y("Wrong username or password");return}let S="~@"+l;e.get({"#":S},async x=>{if(x.err){y(`error getting ${S}: ${x.err}`);return}let G=x.put&&x.put[S];if(!G)return g(l);delete G._,n=Object.keys(G),f()})},c={is:null,create:(l,p,u)=>{let E=y=>{u?u(y):y&&console.log(y)};if(r){E("User is already being created");return}if(l===""){E("Please provide a username");return}if(p===""){E("Please provide a password");return}r=!0;let g="~@"+l;e.get({"#":g},async y=>{if(y.err){r=!1,E(`error getting ${g}: ${y.err}`);return}if(y.put&&y.put[g]){r=!1,E("Username already exists");return}let f=Z.random(64),S=await ue.work(p,f),x=await ue.pair(),G={priv:x.priv,epriv:x.epriv},N=await ue.encrypt(G,S),a={username:l,pub:x.pub,epub:x.epub,auth:JSON.stringify({enc:N,salt:f})},o="~"+x.pub,h=Date.now(),A=await ue.signTimestamp(h,x),w=be(o,a,A,x.pub,h);e.put(w,b=>{if(r=!1,b){E(`error putting ${JSON.stringify(a)} on ${o}: ${b}`);return}let v={[o]:{"#":o}};e.put(be(g,v),k=>{if(k){E(`error putting ${JSON.stringify(v)} on ${g}: ${k}`);return}u&&u(null)})})})},auth:(l,p,u)=>{let E=g=>{u?u(g):g&&console.log(g)};if(s){E("User is already authenticating");return}if(c.is=null,l===""){E("Please provide a username");return}if(p===""){E("Please provide a password");return}s=!0,d(l,p,"",E)},change:(l,p,u,E)=>{let g=y=>{E?E(y):y&&console.log(y)};if(s){g("User is already authenticating");return}if(c.is=null,l===""){g("Please provide a username");return}if(p===""){g("Please provide a password");return}if(u===""){g("Please provide a new password");return}s=!0,d(l,p,u,g)},store:(l=!1)=>{if(!c.is){console.log("Please authenticate before calling store");return}if(l){typeof globalThis.localStorage<"u"&&globalThis.localStorage.setItem("user.is",JSON.stringify(c.is)),typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.removeItem("user.is");return}typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.setItem("user.is",JSON.stringify(c.is)),typeof globalThis.localStorage<"u"&&globalThis.localStorage.removeItem("user.is")},recall:()=>{if(typeof globalThis.localStorage<"u"){let l=globalThis.localStorage.getItem("user.is");if(l){c.is=JSON.parse(l);return}}if(typeof globalThis.sessionStorage<"u"){let l=globalThis.sessionStorage.getItem("user.is");l&&(c.is=JSON.parse(l))}},leave:()=>{c.is=null,typeof globalThis.localStorage<"u"&&globalThis.localStorage.removeItem("user.is"),typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.removeItem("user.is")},delete:(l,p,u)=>{let E=g=>{u?u(g):g&&console.log(g)};if(s){E("User is already authenticating");return}if(l===""){E("Please provide a username");return}if(p===""){E("Please provide a password");return}s=!0,d(l,p,"",async g=>{if(g){E(g);return}let y={username:null,pub:null,epub:null,auth:null},f=Date.now(),S=await ue.signTimestamp(f,c.is),x="~"+c.is.pub,G=be(x,y,S,c.is.pub,f);e.put(G,N=>{if(N){E(`error putting null on ${x}: ${N}`);return}c.is=null,u&&u(null)})})}};return c},lt=Ot;function ct(t,e,n,r){let s={...r};delete s.nested;let i=new Map,d=null,c=()=>e(d===null?null:{...d}),l=u=>{if(u===null||typeof u!="object"){d=u,c();return}(!d||typeof d!="object")&&(d={});let E=u;for(let[g,y]of Object.entries(E))if(g!=="_"&&(d[g]=y,y!==null&&typeof y=="object"&&!i.has(g))){let f=t().next(g),S=x=>{x===null?(delete d[g],i.delete(g)):d[g]=x,c()};i.set(g,{api:f,handler:S}),f.on(S,!1,s)}for(let g of[...i.keys()])if(!(g in E)){let y=i.get(g);y.api.off(y.handler),i.delete(g),delete d[g]}c()},p=t();return p.on(l,n,s),()=>{p.off(l);for(let{api:u,handler:E}of i.values())u.off(E);i.clear()}}var Pt=t=>{let e;typeof t=="string"?e={peers:[t]}:t instanceof Array?e={peers:t}:se.is(t)?e=t:e={};let n=Fe(e),r=lt(e,n),s=new Map,i=new Map,d=new Map,c=new Map,l=E=>E===null||E===!0||E===!1||typeof E=="string"||!!ee.is(E)||Ge.is(E),p=E=>{if(l(E))return!0;if(se.is(E)){let y=[];for(let[f,S]of Object.entries(E)){if(f==="_")return"error underscore cannot be used as a property name";if(se.is(S)||l(S)){y.push(f);continue}return typeof S>"u"?`error undefined ${f} cannot be converted to a graph`:`error ${JSON.stringify({[f]:S})} cannot be converted to a graph`}if(y.length!==0)return y}return`error ${JSON.stringify(E)} cannot be converted to a graph`},u=E=>{let g=E,y=(a,o,h,A)=>{n.get(se.put(a,"#",o),async w=>{if(w.err&&console.log(w.err),w.put&&w.put[o]){delete w.put[o]._,delete w.put[o][B],delete w.put[o][ke];let b=w.put[o];await Promise.all(Object.keys(b).map(async v=>{let k=ee.is(b[v]);if(!k)return;let C=async(j=0)=>{let _=await new Promise(V=>{let H=Z.random(),F=i.get(g);i.set(H,{chain:[{item:null,soul:k}],user:F?F.user:null}),u(H).next(null,V,A)});return _!==null||j>=5?_:(await new Promise(V=>setTimeout(V,50)),C(j+1))};b[v]=await C()})),h(w.put[o])}else h(null)},A)},f=async(a,o,h,A)=>{if(h){let w=Date.now(),b=await ue.signTimestamp(w,h);return be(a,o,b,h.pub,w)}return e.secure?(A||(A=console.log),A(`error putting data on ${a}: user required in secure mode`),null):be(a,o)},S=a=>o=>{let h=i.get(a);h&&typeof h.cb<"u"?setTimeout(()=>h.cb(o),1):o&&console.log("error no callback for data",o,"ctx",h),h&&!h.on&&i.delete(a)},x=(a,o,h,A,w,b,v=!0)=>{let k=null,C=()=>{if(!i.has(g)){n.off({"#":a,".":o},C),k&&clearTimeout(k);return}n.get({"#":a,".":o},j=>{let _=j.put&&j.put[a],V=ee.is(_&&_[o]);if(!V){!v&&_&&_._&&typeof _[o]<"u"&&(k&&clearTimeout(k),n.off({"#":a,".":o},C),b(_[o]));return}k&&clearTimeout(k),n.off({"#":a,".":o},C),h.chain[A].soul=V,i.set(g,{...h}),v?u(g).on(w.on,b,w._get,w._opt):u(g).next(null,w.get,b,w._opt)},{...w._opt,secure:(typeof h.user=="boolean"?h.user:!!h.user)||e.secure})};n.on({"#":a,".":o},C,!1,w._opt),v||(k=setTimeout(()=>{n.off({"#":a,".":o},C),b&&b(null)},31e3))},G=(a,o,h,A,w)=>{let b=c.get(a),v=b&&b.get(o);if(v){v.then(H=>w(void 0,H),H=>w(H));return}let k=Z.random();h[o]=ee.ify(k);let C,j,_=new Promise((H,F)=>{C=H,j=F});_.catch(()=>{}),b||(b=new Map,c.set(a,b)),b.set(o,_);let V=()=>{b.delete(o),b.size===0&&c.delete(a)};(async()=>{let H=await f(a,h,A,w);if(H===null){V(),j(new Error("secure mode"));return}n.put(H,F=>{if(V(),F){let W=`error putting ${o} on ${a}: ${F}`;j(W),w(W);return}C(k),w(void 0,k)})})()},N=(a,o)=>{if(!a)return console.log("error resolve request parameter required"),!1;let h=typeof a.get<"u",A=typeof a.put<"u",w=typeof a.on<"u",b=typeof a.off<"u",v=!1,k=i.get(g);if(!k)return{item:null,soul:null};for(let C=1;C<k.chain.length;C++)if(k.chain[C].soul===null){v=!0;break}if(v){let C=1;for(;C<k.chain.length&&k.chain[C].soul!==null;)C++;let{item:j,soul:_}=k.chain[C-1];return n.get({"#":_,".":j},async V=>{if(V.err){console.log(`error getting ${j} on ${_}: ${V.err}`),o&&o(null);return}let H=V.put&&V.put[_];if(H&&typeof H[j]<"u"){let F=ee.is(H[j]);F?(k.chain[C].soul=F,i.set(g,{...k}),h?u(g).next(null,a.get,o,a._opt):A?u(g).put(a.put,o):w?u(g).on(a.on,o,a._get,a._opt):b&&u(g).off(o)):h?o(H[j]):A?G(_,j,H,k.user,(W,Q)=>{if(W){o(W);return}k.chain[C].soul=Q,u(g).put(a.put,o)}):w?(x(_,j,k,C,a,o),a._get&&o(null)):b&&o&&o(null)}else if(A)H||(H={}),G(_,j,H,k.user,(F,W)=>{if(F){o(F);return}k.chain[C].soul=W,u(g).put(a.put,o)});else if(w)x(_,j,k,C,a,o),a._get&&o(null);else if(h&&H){let F=H._?.[">"];F&&Object.keys(F).length>0&&typeof F[j]>"u"?o&&o(null):x(_,j,k,C,a,o,!1)}else o&&o(null)},{...a._opt,secure:(typeof k.user=="boolean"?k.user:!!k.user)||e.secure}),!1}return h&&k.chain[k.chain.length-1].item!==null?(k.chain.push({item:null,soul:null}),u(g).next(null,a.get,o,a._opt),!1):k.chain[k.chain.length-1]};return{get:function(a,o,h,A){let w,b,v;if(typeof o=="function"?(v=h,b=o,w=null):(w=o,b=h,v=A),a===null||a===""||a==="_")return console.log("error please provide a key"),b&&b(null),this;if(w&&typeof b!="function")return console.log("error lex requires a callback function"),this;if(g=Z.random(),i.set(g,{chain:[{item:String(a),soul:"root"}],cb:b}),!b)return u(g);let k=S(g),C=N({get:w,_opt:v},k);return C&&y(w,C.soul,k,v),this},next:function(a,o,h,A){let w,b,v;typeof o=="function"?(v=h,b=o,w=null):(w=o,b=h,v=A);let k=V=>H=>{b?b(H):S(V)(H)};if(!g)return console.log("error please provide a key using get(key)"),b&&b(null),this;let C=k(g);if(a===""||a==="_")return C(null),this;if(w&&typeof b!="function")return console.log("error lex requires a callback function"),this;let j=i.get(g);if(!j)return this;if(b&&typeof j.cb>"u"&&(j.cb=b,b=void 0),a!==null&&j.chain.push({item:String(a),soul:null}),!j.cb)return u(g);let _=N({get:w,_opt:v},C);return _&&y(w,_.soul,C,v),this},put:function(a,o,h){let A=!1,w;typeof o=="function"?(w=o,A=!1):(A=o||!1,w=h);let b=F=>W=>{w?w(W):S(F)(W)};if(!g){w&&w("error please provide a key using get(key)");return}let v=i.get(g);if(!v)return;!v.cb&&w&&(v.cb=w,w=void 0),A&&(a={[Z.random()]:a});let k=b(g),C=p(a);if(typeof C=="string"){k(C);return}let j=N({put:a,_opt:{put:!0}},k);if(!j)return;let{item:_,soul:V}=j;if(!V)return;if(C===!0){n.get({"#":V,".":_},async F=>{if(F.err){k(`error getting ${V}: ${F.err}`);return}let W=F.put&&F.put[V],Q=W&&W[_],K=ee.is(Q);if(!K){W||(W={}),W[_]=a;let z=await f(V,W,v.user,k);if(z===null)return;n.put(z,k);return}n.get({"#":K},async z=>{if(z.err){k(`error getting ${K}: ${z.err}`);return}if(!z.put||!z.put[K]){k(`error ${K} not found`);return}for(let le of Object.keys(z.put[K])){if(le==="_"||le===B||le===ke)continue;let de=await new Promise(q=>{let oe=Z.random(),ae=[{item:le,soul:K}];i.set(oe,{chain:ae,user:v.user}),u(oe).put(null,q)});if(de){k(de);return}}W||(W={}),W[_]=a;let te=await f(V,W,v.user,k);te!==null&&n.put(te,k)})},{secure:(typeof v.user=="boolean"?v.user:!!v.user)||e.secure,put:!0});return}let H=(F=0)=>{n.get({"#":V,".":_},async W=>{if(W.err){k(`error getting ${V}.${_}: ${W.err}`);return}let Q=W.put&&W.put[V],K=Q&&Q[_];if(!K&&F<5)return await new Promise(q=>setTimeout(q,50)),H(F+1);let z=ee.is(K);if(!z){Q||(Q={}),G(V,_,Q,v.user,q=>{if(q){k(q);return}let oe=Z.random(),ae=[{item:_,soul:V}];i.set(oe,{chain:ae,user:v.user,cb:v.cb}),u(oe).put(a)});return}let te=[];for(let q of C){let oe=await new Promise(ae=>{if(se.is(a[q])&&!ee.is(a[q])){let m=Z.random(),R=[{item:q,soul:z}];i.set(m,{chain:R,user:v.user}),u(m).put(a[q],ae)}else te.push(q),ae(null)});if(oe){k(oe);return}}if(te.length===0){k(null);return}let le={};te.forEach(q=>{le[q]=a[q]});let de=await f(z,le,v.user,k);de!==null&&n.put(de,k)},{secure:(typeof v.user=="boolean"?v.user:!!v.user)||e.secure,put:!0})};H()},on:function(a,o,h,A){let w,b,v;if(typeof a=="function"?(v=h,h=o,b=a,w=null):(w=a,b=typeof o=="function"?o:void 0,v=A),typeof b!="function"){console.log("error on() requires a callback function");return}if(!g){console.log("error please provide a key using get(key)"),b(null);return}let k=N({on:w,_get:h,_opt:v},b);if(!k)return;let{item:C,soul:j}=k;if(!j)return;let _=i.get(g);if(v&&v.nested){let K=()=>{let z=Z.random();return i.set(z,{chain:[{item:C,soul:j}],user:_?_.user:null}),u(z)};d.set(b,ct(K,b,h,v));return}i.set(g,{chain:[{item:C,soul:j}],on:!0,user:_?_.user:null});let V=0,H=5,F=1e3,W=null;s.set(b,()=>{i.has(g)&&(clearTimeout(W),W=null,n.get({"#":j,".":C},K=>{let z=K.put&&K.put[j],te=z&&z[C],le=ee.is(te);if(le){let de=async(q=0)=>{let oe=await new Promise(ae=>{let m=Z.random();i.set(m,{chain:[{item:null,soul:le}],user:_?_.user:null}),u(m).next(null,ae,q===0?se.put(v,"fast",!0):v)});oe!==null||q>=5?(V=0,b(oe)):(await new Promise(ae=>setTimeout(ae,50)),de(q+1))};de()}else if(!!z)V=0,b(te!==void 0?te:null);else if(V<H){let q={...v,secure:_&&(typeof _.user=="boolean"?_.user:!!_.user)||e.secure},oe=()=>{let ae=Math.min(F*Math.pow(2,V),3e4);V++,W=setTimeout(()=>{n.get({"#":j,".":C},m=>{let R=m.put&&m.put[j];if(R){V=0,W=null;let O=R[C];b(O!==void 0?O:null)}else V<H?oe():(W=null,b(null))},q)},ae)};oe()}else b(null)},{...v,secure:_&&(typeof _.user=="boolean"?_.user:!!_.user)||e.secure}))});let Q=w?se.put(w,"#",j):{"#":j,".":C};Q["."]!=null&&typeof Q["."]=="number"&&(Q={...Q,".":String(Q["."])}),n.on(Q,s.get(b),!1,v),n.get({"#":j,".":C},K=>{if(K.err){console.log(`error getting ${j}.${C}: ${K.err}`);return}let z=K.put&&K.put[j]&&K.put[j][C],te=ee.is(z);te&&(n.off(Q,s.get(b)),n.on({"#":te,".":null},s.get(b),!1,v)),h&&s.get(b)()},{...v,secure:_&&(typeof _.user=="boolean"?_.user:!!_.user)||e.secure})},off:function(a){if(!g){console.log("error please provide a key using get(key)"),a&&a(null);return}if(a&&d.has(a)){d.get(a)(),d.delete(a);return}let o=N({off:!0},a);if(!o)return;let{item:h,soul:A}=o;A&&(n.off({"#":A},s.get(a)),n.get({"#":A,".":h},w=>{if(w.err){s.delete(a),i.delete(g);return}let b=w.put&&w.put[A]&&w.put[A][h],v=ee.is(b);v&&n.off({"#":v},s.get(a)),s.delete(a),i.delete(g)}))},user:()=>(r.get||(Object.assign(r,u()),r.get=function(a,o,h,A){let w,b,v;typeof o=="function"?(v=h,b=o,w=null):(w=o,b=h,v=A);let k=null,C=null;if(r.is&&(k=r.is.pub),typeof a=="string"?C=a:a instanceof Array&&(a.length===2&&a[0]&&a[1]?(k=a[0],C=a[1]):a.length===1&&a[0]&&(C=a[0])),!k)return console.log("error please log in or provide a public key"),b&&b(null),this;if(C===null||C===""||C==="_")return console.log("error please provide a key"),b&&b(null),this;if(w&&!b)return console.log("error lex requires a callback function"),this;g=Z.random();let j=[{item:String(C),soul:"~"+k}];if(i.set(g,{chain:j,user:r.is,cb:b}),!b)return u(g);let _=S(g),V=N({get:w,_opt:v},_);return V&&y(w,V.soul,_,v),this}),r),wire:n,SEA:ue}};return u()},ln=Pt;export{ln as default};
1
+ var Ge={is:t=>{if(t instanceof Array)return!1;if(typeof t=="number")return!isNaN(t);if(typeof t=="string"){let e=parseFloat(t);return!isNaN(e)&&isFinite(e)}return!1}},ie={is:t=>{if(!t||typeof t!="object")return!1;let n=Object.prototype.toString.call(t).match(/^\[object (\w+)\]$/);return t.constructor===Object||n!==null&&n[1]==="Object"},map:(t,e,n)=>{let r=Object.keys(t);for(let s=0;s<r.length;s++){let o=r[s],d=e(t[o],o,n);if(typeof d<"u")return d}},put:(t,e,n)=>{let r=t||{};return r[e]=n,r},del:(t,e)=>{if(t)return t[e]=null,delete t[e],t}},ft=(t,e,n)=>{if(n.id){n.id=!1;return}if(e==="#"&&typeof t=="string"){n.id=t;return}n.id=!1},Y={is:t=>{if(t&&typeof t=="object"&&"#"in t&&!("_"in t)&&ie.is(t)){let e={id:""};if(ie.map(t,ft,e),e.id)return e.id}return!1},ify:t=>ie.put({},"#",t)},ke="_holster_user_signature",J="_holster_user_public_key",be=(t,e,n,r,s)=>{let o=s||Date.now(),d={},c={_:{"#":t,">":d}};for(let[l,g]of Object.entries(e))l!=="_"&&l!==J&&l!==ke&&(c[l]=g,d[l]=o);return n&&r&&s&&(c._.s||(c._.s={}),c._.s[s.toString()]=n,c[J]=r,d[J]=s),{[t]:c}},me=(t,e)=>{if(typeof e>"u")return t===null;if(typeof t>"u")return!0;if(typeof t=="string")return t===e;if(Array.isArray(t))return t.includes(e);if(!ie.is(t)||!e)return!1;if("*"in t){let s=t["*"];return e.slice(0,s.length)===s}let n=">"in t?t[">"]:void 0,r="<"in t?t["<"]:void 0;return n&&r?e>=n&&e<=r:n?e>=n:r?e<=r:!1},ee={random:t=>{let e="",n="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",r=t||24;for(let s=0;s<r;s++)e+=n.charAt(Math.floor(Math.random()*n.length));return e}};var dt=()=>{let e={store:{},expiry:null,check:n=>e.store[n]?e.track(n):!1,track:n=>(e.store[n]=Date.now(),e.expiry||(e.expiry=setTimeout(()=>{let r=Date.now();Object.keys(e.store).forEach(s=>{r-e.store[s]>9e3&&delete e.store[s]}),e.expiry=null},9e3),e.expiry.unref&&e.expiry.unref()),n)};return e},et=dt;var gt=(t,e,n)=>{if(!t||typeof t!="object")throw new TypeError("lex must be an object");if(!e||typeof e!="object")throw new TypeError("graph must be an object");let r=t["#"];if(!r||typeof r!="string")throw new TypeError("soul must be a string");if(!e[r])return;let o={_:{"#":r,">":{}}},d={};if(typeof t["."]=="string"){let c=t["."];if(typeof e[r][c]>"u")return;o[c]=e[r][c],o._[">"][c]=e[r]._[">"][c];let l=e[r]._[">"][c],g=e[r]._.s;if(g&&g[l]&&(d[l.toString()]=g[l]),J&&typeof e[r][J]<"u"){o[J]=e[r][J],o._[">"][J]=e[r]._[">"][J];let p=e[r]._[">"][J],k=e[r]._.s;k&&k[p]&&(d[p.toString()]=k[p])}}else{if(!n)return;for(let c of Object.keys(e[r]))if(c===J||me(t["."],c)){o[c]=e[r][c],o._[">"][c]=e[r]._[">"][c];let l=e[r]._[">"][c],g=e[r]._.s;g&&g[l]&&(d[l.toString()]=g[l])}}return Object.keys(d).length>0&&(o._.s=d),{[r]:o}},He=gt;typeof btoa>"u"&&(globalThis.btoa=t=>Buffer.from(t,"binary").toString("base64"),globalThis.atob=t=>Buffer.from(t,"base64").toString("binary"));var De=class t extends Array{toString(e,n,r){let s=e||"utf8",o=n||0,d=r?Math.min(Math.max(r,o),this.length):this.length;if(s==="hex"){let c=new Uint8Array(this.slice(o,d));return Array.from(c,l=>l.toString(16).padStart(2,"0")).join("")}if(s==="utf8")return Array.from({length:d-o},(c,l)=>{let g=this[l+o];return g===void 0||g<0||g>1114111?"\uFFFD":String.fromCharCode(g)}).join("");if(s==="base64"){let c=Array.from({length:d-o},(l,g)=>{let p=this[g+o];return p===void 0||p<0||p>255?"\uFFFD":String.fromCharCode(p)}).join("");return btoa(c)}return this.toString("utf8",o,d)}static from(e){let n=Array.from(e);return new t(...n)}},we=De;var Ve={MAX_BUFFER_SIZE:10*1024*1024,MAX_STRING_LENGTH:1024*1024},Pe=function(...e){return console.warn("new SafeBuffer() is deprecated, please use SafeBuffer.from()"),we.from([])};Pe.prototype=Object.create(Array.prototype);var Ie=(t,e)=>{if(t.length>Ve.MAX_STRING_LENGTH)throw new RangeError(`String too large: ${t.length} > ${Ve.MAX_STRING_LENGTH}`)},ge=(t,e="buffer operation")=>{if(t>Ve.MAX_BUFFER_SIZE)throw new RangeError(`Buffer size too large for ${e}: ${t} > ${Ve.MAX_BUFFER_SIZE}`)},pt=t=>{Ie(t,"hex");let e=t.replace(/\s/g,"").toLowerCase();if(!/^[0-9a-f]*$/.test(e))throw new TypeError("Invalid hex string: contains non-hex characters");if(e.length%2!==0)throw new TypeError("Invalid hex string: must have even length");if(e.length===0)return new Uint8Array(0);ge(e.length/2,"hex parsing");let n=new Uint8Array(e.length/2);for(let r=0;r<e.length;r+=2){let s=e.substr(r,2);n[r/2]=parseInt(s,16)}return n},tt=t=>{Ie(t,"utf8");try{let n=new TextEncoder().encode(t);return ge(n.length,"UTF-8 encoding"),n}catch(e){throw new TypeError(`Failed to encode UTF-8 string: ${e.message}`)}},ht=t=>{Ie(t,"binary"),ge(t.length,"binary encoding");let e=new Uint8Array(t.length);for(let n=0;n<t.length;n++){let r=t.charCodeAt(n);if(r>255)throw new TypeError(`Invalid binary string: character at position ${n} exceeds byte range (${r} > 255)`);e[n]=r}return e},yt=t=>{Ie(t,"base64");let e=t.replace(/\s/g,"");if(!/^[A-Za-z0-9+/]*={0,2}$/.test(e))throw new TypeError("Invalid base64 string: contains invalid characters");try{let n=atob(e);ge(n.length,"base64 decoding");let r=new Uint8Array(n.length);for(let s=0;s<n.length;s++)r[s]=n.charCodeAt(s);return r}catch(n){throw new TypeError(`Failed to decode base64 string: ${n.message}`)}},nt=t=>{if(t instanceof ArrayBuffer)return ge(t.byteLength,"ArrayBuffer processing"),new Uint8Array(t);if(ArrayBuffer.isView(t))return ge(t.byteLength,"TypedArray processing"),new Uint8Array(t.buffer,t.byteOffset,t.byteLength);if(Array.isArray(t)){ge(t.length,"Array processing");for(let e=0;e<t.length;e++){let n=t[e];if(typeof n!="number"||n<0||n>255||!Number.isInteger(n))throw new TypeError(`Invalid byte value at index ${e}: ${n} (must be integer 0-255)`)}return new Uint8Array(t)}if(typeof t=="object"&&t!==null&&"byteLength"in t&&typeof t.byteLength=="number")return ge(t.byteLength,"ArrayBuffer-like processing"),new Uint8Array(t);if(typeof t=="object"&&t!==null&&"length"in t&&typeof t.length=="number"){let e=t;ge(e.length,"array-like processing");let n=Array.from(e);for(let r=0;r<n.length;r++){let s=n[r];if(typeof s!="number"||s<0||s>255||!Number.isInteger(s))throw new TypeError(`Invalid byte value at index ${r}: ${s} (must be integer 0-255)`)}return new Uint8Array(n)}throw new TypeError("Unsupported input type: "+typeof t)};Object.assign(Pe,{from(...t){if(t.length===0)throw new TypeError("SafeBuffer.from() requires at least one argument");let n=t[0];if(n==null)throw new TypeError("First argument must not be null or undefined");let r;if(typeof n=="string"){let s=(t[1]||"utf8").toLowerCase();switch(s){case"hex":r=pt(n);break;case"utf8":case"utf-8":r=tt(n);break;case"binary":case"latin1":r=ht(n);break;case"base64":r=yt(n);break;case"ascii":Ie(n,"ascii");for(let o=0;o<n.length;o++)if(n.charCodeAt(o)>127)throw new TypeError(`Invalid ASCII character at position ${o}: ${n.charCodeAt(o)} > 127`);r=tt(n);break;default:throw new TypeError("Unknown encoding: "+s)}}else r=nt(n);if(!r||r.length===0)return we.from(new Uint8Array(0));try{return we.from(r)}catch(s){throw new Error(`Failed to create SafeBuffer: ${s.message}`)}},alloc(t,e=0){if(typeof t!="number"||!Number.isInteger(t)||t<0)throw new TypeError("Length must be a non-negative integer");ge(t,"buffer allocation");let n;if(typeof e=="number"){if(e<0||e>255||!Number.isInteger(e))throw new TypeError("Fill value must be an integer between 0 and 255");n=e}else if(typeof e=="string"){if(e.length!==1)throw new TypeError("Fill string must be exactly one character");if(n=e.charCodeAt(0),n>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(t);return n!==0&&r.fill(n),we.from(r)}catch(r){throw new Error(`Failed to allocate buffer: ${r.message}`)}},concat(t){if(!Array.isArray(t))throw new TypeError("First argument must be an array");if(t.length===0)return we.from(new Uint8Array(0));let e=0,n=[];for(let r=0;r<t.length;r++){let s=t[r];if(!s)throw new TypeError(`Array element at index ${r} is null or undefined`);let o;try{o=nt(s)}catch(d){throw new TypeError(`Invalid array element at index ${r}: ${d.message}`)}e+=o.length,ge(e,"buffer concatenation"),n.push(o)}try{let r=new Uint8Array(e),s=0;for(let o of n)r.set(o,s),s+=o.length;return we.from(r)}catch(r){throw new Error(`Failed to concatenate buffers: ${r.message}`)}},isBuffer(t){return t instanceof we||t!==null&&typeof t=="object"&&t.constructor===Pe},byteLength(t,e="utf8"){if(typeof t!="string")throw new TypeError("First argument must be a string");switch(e.toLowerCase()){case"utf8":case"utf-8":return new TextEncoder().encode(t).length;case"ascii":case"binary":case"latin1":return t.length;case"base64":{let n=t.replace(/\s/g,"");return Math.floor(n.length*3/4)-(n.match(/=/g)||[]).length}case"hex":return Math.floor(t.replace(/\s/g,"").length/2);default:throw new TypeError("Unknown encoding: "+e)}}});Pe.prototype.toString=function(t="utf8",e=0,n=this.length){if(typeof t!="string")throw new TypeError("Encoding must be a string");if(typeof e!="number"||!Number.isInteger(e)||e<0)throw new TypeError("Start must be a non-negative integer");if(typeof n!="number"||!Number.isInteger(n)||n<e)throw new TypeError("End must be an integer >= start");try{return we.prototype.toString.call(this,t,e,n)}catch(r){throw new Error(`Failed to convert buffer to string: ${r.message}`)}};var fe=Pe;var mt=typeof process<"u"&&process.versions?.node!=null,rt=mt?(await import("node:crypto")).webcrypto:globalThis.crypto,Z=rt.subtle,Le=t=>typeof t=="string"?t:JSON.stringify(t),Ce=t=>{try{return JSON.parse(t)}catch{return t}},$e=t=>{let e=new Uint8Array(t),n=rt.getRandomValues(e);return fe.from(n)},xe=(t,e)=>{let[n,r]=t.split(".");return{kty:"EC",crv:"P-256",x:n,y:r,d:e,ext:!0,key_ops:e?["sign"]:["verify"]}},Re=async t=>{let e=await Z.digest({name:"SHA-256"},new TextEncoder().encode(Le(t)));return fe.from(new Uint8Array(e))},Be=async(t,e)=>{let n=t+e.toString("utf8"),r=await Re(n),s=wt(r);return await Z.importKey("jwk",s,{name:"AES-GCM"},!1,["encrypt","decrypt"])},wt=t=>({kty:"oct",k:t.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,""),ext:!1,alg:"A256GCM"});var vt={pair:async t=>{let e=await Z.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]).then(async s=>{let o=await Z.exportKey("jwk",s.publicKey);return{priv:(await Z.exportKey("jwk",s.privateKey)).d,pub:o.x+"."+o.y}}),n=await Z.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveKey"]).then(async s=>{let o=await Z.exportKey("jwk",s.publicKey);return{epriv:(await Z.exportKey("jwk",s.privateKey)).d,epub:o.x+"."+o.y}}),r={pub:e.pub,priv:e.priv,epub:n.epub,epriv:n.epriv};return t&&t(r),r},encrypt:async(t,e,n)=>{if(!e||!e.epriv)return n&&n(null),null;let r={s:$e(9),iv:$e(15)},s=await Be(e.epriv,r.s).then(d=>Z.encrypt({name:"AES-GCM",iv:new Uint8Array(r.iv)},d,new TextEncoder().encode(Le(t)))),o={ct:fe.from(s,"binary").toString("base64"),iv:r.iv.toString("base64"),s:r.s.toString("base64")};return n&&n(o),o},decrypt:async(t,e,n)=>{if(!t||!t.ct||!t.iv||!t.s||!e||!e.epriv)return n&&n(null),null;let r={ct:fe.from(t.ct,"base64"),iv:fe.from(t.iv,"base64"),s:fe.from(t.s,"base64")};try{let s=await Be(e.epriv,r.s).then(d=>Z.decrypt({name:"AES-GCM",iv:new Uint8Array(r.iv),tagLength:128},d,new Uint8Array(r.ct))),o=Ce(new TextDecoder("utf8").decode(s));return n&&n(o),o}catch{return n&&n(null),null}},verify:async(t,e,n)=>{if(!e||!e.pub)return n&&n(null),null;let r=typeof t=="string"?Ce(t):t,s=await Z.importKey("jwk",xe(e.pub),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]),o={};if(typeof r.m=="string")o=r.m;else for(let g of Object.keys(r.m).sort())g!=="_"&&g!==J&&g!==ke&&(o[g]=r.m[g]);let d=await Re(o),c=new Uint8Array(fe.from(r.s,"base64")),l={name:"ECDSA",hash:{name:"SHA-256"}};if(await Z.verify(l,s,c,new Uint8Array(d))){let g=Ce(r.m);return n&&n(g),g}return n&&n(null),null},sign:async(t,e,n)=>{if(!e||!e.pub||!e.priv)return n&&n(null),null;let r={};if(typeof t=="string")r=t;else{let g=Ce(t);for(let p of Object.keys(g).sort())p!=="_"&&p!==J&&p!==ke&&(r[p]=g[p])}let s=await Re(r),o=xe(e.pub,e.priv),d={name:"ECDSA",namedCurve:"P-256"},c=await Z.importKey("jwk",o,d,!1,["sign"]).then(g=>Z.sign({name:"ECDSA",hash:{name:"SHA-256"}},g,new Uint8Array(s))),l={m:r,s:fe.from(c,"binary").toString("base64")};return n&&n(l),l},signTimestamp:async(t,e,n)=>{if(!e||!e.pub||!e.priv)return n&&n(null),null;let r=t.toString(),s=await Re(r),o=xe(e.pub,e.priv),d={name:"ECDSA",namedCurve:"P-256"},c=await Z.importKey("jwk",o,d,!1,["sign"]).then(g=>Z.sign({name:"ECDSA",hash:{name:"SHA-256"}},g,new Uint8Array(s))),l=fe.from(c,"binary").toString("base64");return n&&n(l),l},verifyTimestamp:async(t,e,n,r)=>{if(!n||!t||!e)return r&&r(!1),!1;try{let s=t.toString(),o=await Re(s),d=await Z.importKey("jwk",xe(n),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]),c=new Uint8Array(fe.from(e,"base64")),l={name:"ECDSA",hash:{name:"SHA-256"}},g=await Z.verify(l,d,c,new Uint8Array(o));return r&&r(g),g}catch(s){return console.log(`error verifying timestamp signature: ${s.message}`),r&&r(!1),!1}},work:async(t,e,n)=>{let r=n,s=e;typeof e=="function"&&(r=e,s=void 0),typeof s>"u"&&(s=$e(9));let o=await Z.importKey("raw",new TextEncoder().encode(Le(t)),{name:"PBKDF2"},!1,["deriveBits"]),d={name:"PBKDF2",iterations:1e5,salt:new TextEncoder().encode(s),hash:{name:"SHA-256"}},c=await Z.deriveBits(d,o,512),l={epriv:fe.from(c,"binary").toString("base64")};return r&&r(l),l},secret:async(t,e,n)=>{if(!t||!t.epub||!e||!e.epub||!e.epriv)return n&&n(null),null;let r={name:"ECDH",namedCurve:"P-256"},s=xe(t.epub),o=await Z.importKey("jwk",s,r,!0,[]),d=xe(e.epub,e.epriv);delete d.key_ops;let c=await Z.importKey("jwk",d,r,!1,["deriveBits"]).then(async l=>{let g=await Z.deriveBits({public:o,name:"ECDH",namedCurve:"P-256"},l,256),p=await Z.importKey("raw",new Uint8Array(g),{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]);return Z.exportKey("jwk",p).then(({k})=>k)});return n&&n({epriv:c}),{epriv:c}}},ce=vt;var kt=1e4,Ke=(t,e,n,r,s=!1)=>{if(t<e)return{historical:!0};if(t>e)return{incoming:!0};if(s&&n!==r)return{historical:!0};let o=typeof n!="string"?JSON.stringify(n)||"":n,d=typeof r!="string"?JSON.stringify(r)||"":r;return o===d?{state:!0}:o<d?{current:!0}:{incoming:!0}};Ke.mix=async(t,e,n,r,s,o=kt)=>{if(!t||typeof t!="object")throw new TypeError("change must be an object");if(!e||typeof e!="object")throw new TypeError("graph must be an object");if(!s||typeof s!="object")throw new TypeError("listen must be an object");let d=Date.now(),c={},l={},g=[],p=new Map,k=new Map,m=0;for(let f of Object.keys(t)){let v=t[f];if(!v||!v._)continue;let w=!1,j=!1,N=r,V=v[J];if(v._.s&&V&&(N=!0),f.length>1&&f[0]==="~")if(f[1]==="@")j=!0,N=!1;else{if(V&&f!=="~"+V){console.log(`error public key does not match for soul: ${f}`);continue}N=!0}if(N){if(!V||!v._)continue;let i=new Set,a=new Set,b=Object.entries(v._[">"]||{});for(let[I,S]of Object.entries(v._.s||{})){let y=Number(I);if(!isNaN(y)&&y>0){let x=b.filter(([,C])=>Number(C)===y);if(x.length>0&&x.every(([C])=>{let G=e[f]&&e[f]._[">"]?e[f]._[">"][C]:0;return G!==void 0&&G>y}))continue;if(await ce.verifyTimestamp(y,S,V)){i.add(y);for(let[C,G]of b)Number(G)===y&&a.add(C)}}}if(a.size===0)continue;p.set(f,a),k.set(f,i)}for(let i of Object.keys(v)){if(i==="_"||p.has(f)&&!p.get(f).has(i))continue;let a=v[i],b=(v._&&v._[">"]?v._[">"][i]:0)||0,I=e[f]?e[f][i]:void 0,S=e[f]&&e[f]._[">"][i]||0;if(j&&i!==Y.is(a)){console.log(`error alias ${j}: ${i} !== ${Y.is(a)}`);continue}let y=b-d;if(y>0){if(y>864e5)continue;if((m===0||y<m)&&(m=y),!l[f]){let x={},A={};l[f]={_:{"#":f,">":x,s:A}}}l[f][i]=a,l[f]._[">"][i]=b,v._.s&&v._.s[b]&&(l[f]._.s[b]=v._.s[b])}else{let x=k.has(f)&&k.get(f).has(b);if(Ke(b,S,a,I??null,x).incoming){if(!c[f]){let T={},C={};c[f]={_:{"#":f,">":T,s:C}}}if(!e[f]){let T={},C={};e[f]={_:{"#":f,">":T,s:C}}}e[f][i]=c[f][i]=a,e[f]._[">"][i]=c[f]._[">"][i]=b,v._.s&&v._.s[b]&&(e[f]._.s[b]=c[f]._.s[b]=v._.s[b]),s[f]&&s[f].filter(T=>me(T["."],i)).forEach(T=>g.push(T.cb)),w=!0}}}w&&s[f]&&s[f].filter(i=>me(i["."])).forEach(i=>g.push(i.cb))}let u=Object.keys(e);return u.length>o&&u.map(w=>{let j=e[w]._&&e[w]._[">"],N=j?Math.max(...Object.values(j)):0;return{soul:w,maxState:N}}).sort((w,j)=>w.maxState-j.maxState).slice(0,u.length-o).forEach(({soul:w})=>{delete e[w],n&&n.delete(w)}),{now:c,defer:l,wait:m,listeners:g}};var Je=Ke;var he="",Ae="",st=t=>typeof t=="object"&&t!==null&&!Array.isArray(t),it=()=>{let t=(e,n,r)=>{if(r||(t[he]||(t[he]={}),r=t[he]),!e)return r;let s=0,o={},d=e[s],c=e.length-1,l=typeof n>"u",g=r[d];for(;!g&&s<c;)d+=e[++s],g=r[d];if(g)if(s===c){if(l)return typeof g[Ae]>"u"?g[he]:g[Ae];g[Ae]=n}else{!g[he]&&!l&&(g[he]={});let p=g[he];if(st(p))return t(e.slice(++s),n,p)}else{if(l)return ie.map(r,(u,f)=>{let v=0,w="";for(;f[v]===e[v];)w+=f[v],v++;if(w)return v<=c?void 0:(o[f.slice(v)]=u,u)})?o:void 0;let p=null,k="";for(let m of Object.keys(r)){let u=0,f="";for(;m[u]===e[u];)f+=m[u],u++;f.length>k.length&&(p=m,k=f)}if(p){let m=r[p],u=k.length,f={[p.slice(u)]:m,[e.slice(u)]:{[Ae]:n}};r[k]={[he]:f},delete r[p]}else r[d]||(r[d]={}),r[d][Ae]=n}};return t};it.map=function t(e,n,r,s=[]){let o=e[he]||e,d=Object.keys(o).sort();for(let c=0;c<d.length;c++){let l=d[c],g=o[l];if(!g)continue;let p=g[Ae];if(typeof p<"u"){let m=n(p,s.join("")+l,l,s);if(typeof m<"u")return m}else r&&n(void 0,s.join(""),l,s);let k=g[he];if(st(k)){s.push(l);let m=t(k,n,r,s);if(typeof m<"u")return m;s.pop()}}};var de=it;var ze="",Me="",oe="",Ee=t=>{let e=new Map,n=null,r=0,s=1e4,o=new Map,d=0,c=3e4,l=.8,g=.9,p={log:t.log||console.log,batch:t.batch||100,write:t.write||1,size:t.size||1024*1024,memoryLimit:t.memoryLimit||500,cache:t.cache!==void 0?t.cache:!0,store:t.store};if(!p.store)throw new Error("Radisk needs `store` interface with `{get: fn, put: fn, list: fn}`");if(!p.store.get)throw new Error("Radisk needs `store.get` interface with `(file, cb)`");if(!p.store.put)throw new Error("Radisk needs `store.put` interface with `(file, data, cb)`");if(!p.store.list)throw new Error("Radisk needs a streaming `store.list` interface with `(cb)`");let k=p.store,m=()=>{if(typeof process>"u"||!process.memoryUsage)return;let f=Date.now();if(f-d<c)return;d=f;let w=process.memoryUsage().heapUsed,j=p.memoryLimit*1024*1024,N=w/j;if(N>g){let V=e.size;console.log(`[RADISK-MEMORY] High memory usage: ${Math.round(N*100)}% of heap limit. Clearing ${V} cached files.`),e.clear(),global.gc&&global.gc(),d=f+c}else N>l&&console.log(`[RADISK-MEMORY] Memory warning: ${Math.round(N*100)}% of heap limit used. Cache size: ${e.size} files.`)},u=(f,v,w)=>{if(typeof f=="string"){if(typeof v=="function"){let j=v,N=u.batch(f);if(typeof N<"u")return j(void 0,N);if(u.thrash.at){let i=u.thrash.at(f);if(typeof i<"u")return j(void 0,i)}if(o.has(f)){o.get(f).push(j);return}o.set(f,[j]);let V=setTimeout(()=>{let i=o.get(f);i&&(p.log(`radisk read hang detected for key: ${f}`),o.delete(f),i.forEach(a=>a(null,null)))},3e4);return u.read(f,(i,a)=>{clearTimeout(V);let b=o.get(f)||[];o.delete(f),b.forEach(I=>I(i,a))})}if(u.batch(f,v),m(),w&&u.batch.acks.push(w),++u.batch.ed>=p.batch)return u.thrash();clearTimeout(u.batch.timeout),u.batch.timeout=setTimeout(u.thrash,p.write)}};return u.batch=de(),u.batch.acks=[],u.batch.ed=0,u.thrash=()=>{if(u.thrash.ing){u.thrash.more=!0;return}clearTimeout(u.batch.timeout),u.thrash.more=!1,u.thrash.ing=!0;let f=u.thrash.at=u.batch;u.batch=de(),u.batch.acks=[],u.batch.ed=0,u.save(f,v=>{v&&p.log(v),f.acks.forEach(w=>w(v)),u.thrash.at=void 0,u.thrash.ing=!1,u.thrash.more&&u.thrash()})},u.save=(f,v)=>{let w={find:(j,N)=>{if(N<(w.start||""))return;w.start=N;let V=[];return k.list(i=>{if(i){V.push(i);return}V.sort(),w.lex(V)}),!0},lex:j=>{if(!w.start)return;let N=null;for(let V of j){if(V>w.start){w.mix(N||"!",w.start,V);return}N=V}w.mix(N||"!",w.start,void 0)},mix:(j,N,V)=>{if(w.start=void 0,e.has(j)){let i=e.get(j);de.map(f,(a,b)=>{if(!(b<N)){if(V&&V<b)return w.start=b,!0;i(b,a)}}),u.write(j,i,w.next)}else u.parse(j,(i,a)=>{if(i)return v(i);de.map(f,(b,I)=>{if(!(I<N)){if(V&&V<I)return w.start=I,!0;a(I,b)}}),p.cache&&e.set(j,a),u.write(j,a,w.next)})},next:j=>{if(j)return v(j);if(w.start){de.map(f,w.find);return}v(j)},start:void 0};de.map(f,w.find)},u.write=(f,v,w)=>{let j=1,N=null,V=a=>{a&&!N&&(N=a),!(--j>0)&&w(N)},i={text:"",limit:"",done:!1,count:0,sub:void 0,halfKey:"",halfOffset:0,each:(a,b,I,S)=>{if(i.done)return;i.count++;let y=typeof a>"u"?"":"="+Ee.encode(a),x=Ee.encode(S.length)+"#"+Ee.encode(I)+y+`
2
+ `,A=S.length===0||S.length===1&&I.includes(Me);if(!i.halfKey&&i.count>1&&i.text.length>p.size/2&&A){let T=S.join("")+I,C=T.indexOf(Me);i.halfKey=C===-1?T:T.substring(0,C),i.halfOffset=i.text.length}if(i.count>1&&i.text.length+x.length>p.size&&A){let T=S.join("")+I,C=T.indexOf(Me);if(i.limit=i.halfKey||(C===-1?T:T.substring(0,C)),i.limit!==f){i.halfKey&&(i.text=i.text.substring(0,i.halfOffset)),i.done=!0,i.sub=de(),de.map(v,i.slice),j++,u.write(i.limit,i.sub,V);return}}i.text+=x},slice:(a,b)=>{b<i.limit||i.sub(b,a)}};de.map(v,i.each,!0),k.put(f,i.text,a=>{i.done&&(e.delete(f),n=null),V(a)})},u.read=(f,v)=>{let w=f.indexOf(Me),j=w===-1?f:f.substring(0,w),N=a=>{let b=0,I=a.length-1,S=null;for(;b<=I;){let y=b+I>>1,x=a[y];x<=j?(S=x,b=y+1):I=y-1}return S},V=a=>{if(!a){v("no file found",void 0);return}if(p.cache&&e.has(a))return v(void 0,e.get(a)(f));u.parse(a,(b,I)=>{b&&p.log(b),I&&p.cache&&!e.has(a)&&(e.set(a,I),m()),v(b,I?I(f):void 0)})},i=Date.now();if(p.cache&&n&&i-r<s)V(N(n));else{let a=[];k.list(b=>{if(b){a.push(b);return}a.sort(),p.cache&&(n=a,r=i),V(N(a))})}},u.parse=(f,v)=>{let w={disk:de(),read:(j,N)=>{if(j)return v(j);if(!N)return v(null,w.disk);let V=[],i="",a=w.split(N);for(;a;){let b,I,S=a[1],y=typeof S=="number"?S:typeof S=="string"?parseInt(S,10):0;if(a=w.split(a[2])||"",a[0]==="#"){let x=a[1];b=typeof x=="string"?x:String(x),y<V.length&&(V.length=y),y<=V.length&&(V[y]=b,V.length=y+1),i=V.join("")}a=w.split(a[2])||"",a[0]!==`
3
+ `&&(a[0]==="="&&(I=a[1]),typeof b<"u"&&typeof I<"u"&&w.disk(i,I),a=w.split(a[2]))}v(null,w.disk)},split:j=>{if(!j)return;let N=j.indexOf(oe);if(N===-1)return;let V=j.slice(0,N),i={};return[V,Ee.decode(j.slice(N),i),j.slice(N+i.i)]}};k.get(f,w.read)},u};Ee.encode=t=>{let e="",n="",r;if(Array.isArray(t)&&(t.length===2||t.length===3)?(e=ze+t[1],t.length===3&&t[2]&&(n=ze+t[2]),r=t[0]):r=t,typeof r=="string"){let o=0,d,c=oe;for(;d=r[o++];)d===oe&&(c+=oe);return c+'"'+r+e+n+oe}let s=Y.is(r);if(s)return oe+"#"+s+e+n+oe;if(Ge.is(r))return oe+"+"+(r||0)+e+n+oe;if(r===!0)return oe+"+"+e+n+oe;if(r===!1)return oe+"-"+e+n+oe;if(r===null)return oe+" "+e+n+oe};Ee.decode=(t,e)=>{let n=-1,r=0,s,o,d=-1,c=-1;if(t[0]!==oe)return;for(;s=t[++n];)if(o){if(d===-1&&(d=n),s===oe&&--r<=0){c=n;break}}else s===oe?r++:o=s||"true";let l=d!==-1?t.slice(d,c!==-1?c:n):"";e&&(e.i=n+1);let g=l.split(ze),p=g[0],k=g[1],m=g[2];if(k){let u=parseFloat(k);if(m){if(o==='"')return[p,u,m];if(o==="#")return[Y.ify(p),u,m];if(o==="+")return p.length===0?[!0,u,m]:[parseFloat(p),u,m];if(o==="-")return[!1,u,m];if(o===" ")return[null,u,m]}else{if(o==='"')return[p,u];if(o==="#")return[Y.ify(p),u];if(o==="+")return p.length===0?[!0,u]:[parseFloat(p),u];if(o==="-")return[!1,u];if(o===" ")return[null,u]}}else{if(o==='"')return l;if(o==="#")return Y.ify(l);if(o==="+")return l.length===0?!0:parseFloat(l);if(o==="-")return!1;if(o===" ")return null}};var ot=Ee;var at=typeof process<"u"&&process.versions?.node!=null,ve=at?await import("node:fs"):void 0,qe="",Ue="",Xe=Ue+"+0"+Ue+"#"+Ue+'"root'+Ue,St=t=>{let e=t.file;if(at)return ve.existsSync(e)||ve.mkdirSync(e),ve.existsSync(e+"/!")||ve.writeFileSync(e+"/!",Xe),{get:(n,r)=>{ve.readFile(e+"/"+n,(s,o)=>{if(s){if(s.code==="ENOENT"){r();return}console.log("fs.readFile error:",s)}let d=o?o.toString():void 0;r(s,d)})},put:(n,r,s)=>{let o=n+"."+ee.random(9)+".tmp";ve.writeFile(o,r,d=>{if(d){console.log("fs.writeFile error:",d),s(d);return}ve.rename(o,e+"/"+n,s)})},list:n=>{ve.readdir(e,(r,s)=>{if(r){console.log("fs.readdir error:",r),n();return}s&&s.forEach(n),n()})}};if(t.indexedDB){let n,r=new Promise((s,o)=>{let d=indexedDB.open(e,1);d.onupgradeneeded=c=>{c.target.result.createObjectStore(e)},d.onerror=c=>{console.log(c),o(c)},d.onsuccess=()=>{if(n=d.result,n){let l=n.transaction([e],"readonly").objectStore(e).getKey("!");l.onerror=()=>{console.log(`error getting key ${e}/!`),o(l.error)},l.onsuccess=()=>{if(l.result)s();else{let p=n.transaction([e],"readwrite").objectStore(e).put(Xe,"!");p.onerror=()=>{console.log(`error putting root on ${e}/!`),o(p.error)},p.onsuccess=()=>{s()}}}}else console.log("error indexedDB not available"),o(new Error("indexedDB not available"))}});return{get:(s,o)=>{let d=(c,l)=>{let p=n.transaction([e],"readonly").objectStore(e).get(c);p.onerror=()=>{console.log(`error getting ${e}/${c}`),l(p.error)},p.onsuccess=()=>{l(null,p.result)}};r.then(()=>{d(s,o)}).catch(c=>{o(c)})},put:(s,o,d)=>{let c=(l,g,p)=>{let m=n.transaction([e],"readwrite").objectStore(e).put(g,l);m.onerror=()=>{console.log(`error putting data on ${e}/${l}`),p(m.error)},m.onsuccess=()=>{p(null)}};r.then(()=>{c(s,o,d)}).catch(l=>{d(l)})},list:s=>{let o=d=>{let l=n.transaction([e],"readonly").objectStore(e).getAllKeys();l.onerror=()=>{console.log("error getting keys for",e),d()},l.onsuccess=()=>{l.result.forEach(d),d()}};r.then(()=>{o(s)}).catch(d=>{console.log("error indexedDB not available:",d),s()})}}}return{get:(n,r)=>{r(null,Xe)},put:(n,r,s)=>{s(null)},list:n=>{n("!"),n()}}},xt=t=>{let e=t||{};e.file=String(e.file||"radata"),e.store||(e.store=St(e));let n=ot(e);return{get:(r,s)=>{if(!r||!ie.is(r)){s("lex required");return}if(!r["#"]){s("soul required in lex");return}let o=r["#"],d=typeof r["."]=="string"?r["."]:"",c,l={},g=(f,v)=>{v!==J&&!me(r["."],v)||(c||(c={_:{"#":o,">":{}}}),c[v]=f[0],c._[">"][v]=f[1],f.length===3&&f[2]&&(l[f[1].toString()]=f[2]))},p=d!==""&&d!==J,k=p?2:1,m=null,u=f=>{if(f&&!m&&(m=f),--k>0)return;let v={[o]:c};c&&Object.keys(l).length>0&&(c._.s=l),s(m,v)};n(o+qe+d,(f,v)=>{ie.is(v)?(de.map(v,g),c||g(v,d)):v&&g(v,d),u(f)}),p&&n(o+qe+J,(f,v)=>{v&&!ie.is(v)&&g(v,J),u(f)})},put:(r,s)=>{if(!r){s("graph required");return}let o=0,d=!1,c=l=>{if(o--,!d){if(l){d=!0,s(l);return}o===0&&(d=!0,s(null))}};Object.keys(r).forEach(l=>{let g=r[l];Object.keys(g).forEach(p=>{if(p==="_")return;o++;let k=g[p],m=g._[">"][p],u=g._.s&&g._.s[m],f=u?[k,m,u]:[k,m];n(l+qe+p,f,c)})})}}};var ut=xt;var Te=typeof process<"u"&&process.versions?.node!=null,We=Te?await import("ws"):void 0,Ze=Te?await import("node:fs"):void 0;typeof globalThis.WebSocket>"u"&&We&&(globalThis.WebSocket=We.WebSocket);var Et=t=>{let e=new Map,n=1500,r=6e4,s=10,o=null;return t||(o=setInterval(()=>{let c=Date.now();for(let[l,g]of Array.from(e.entries()))c-g.lastCleanup>r&&(g.requests=[],g.lastCleanup=c),g.requests=g.requests.filter(p=>c-p<r),c-g.lastCleanup>r*10&&(g.throttleCount=0)},r/4)),{getDelay:c=>{let l=Date.now(),g=e.get(c)||{requests:[],lastCleanup:l,throttleCount:0};if(g.requests=g.requests.filter(p=>l-p<r),g.requests.length>=n){let p=Math.min(...g.requests),k=r-(l-p);return g.throttleCount=(g.throttleCount||0)+1,e.set(c,g),Math.max(0,k)}return g.requests.push(l),e.set(c,g),0},getRemainingRequests:c=>{let l=e.get(c);if(!l)return n;let g=Date.now(),p=l.requests.filter(k=>g-k<r);return Math.max(0,n-p.length)},getThrottleCount:c=>{let l=e.get(c);return l&&l.throttleCount||0},shouldDisconnect:c=>{let l=e.get(c);return l?l.throttleCount>=s:!1},destroy:()=>{o&&(clearInterval(o),o=null),e.clear()}}},Rt=(t,e=1024*1024)=>{try{if(typeof t=="string"&&t.length>e)throw new Error("Message too large");return{success:!0,data:JSON.parse(t.toString())}}catch(n){return{success:!1,error:n.message}}},At=(t,e=1024*1024)=>typeof t=="string"&&t.length>e?{valid:!1,error:"Message too large"}:Buffer.isBuffer&&Buffer.isBuffer(t)&&t.length>e?{valid:!1,error:"Message too large"}:{valid:!0},Tt=(t=1e3)=>{let e=new Set;return{add:n=>{if(e.size>=t)return!1;e.add(n);let r=n.close.bind(n);return n.close=(...s)=>(e.delete(n),r(...s)),!0},remove:n=>{e.delete(n)},count:()=>e.size,isFull:()=>e.size>=t}},Qe=(t=5)=>{let e=0;return{shouldRetry:()=>e<t,getDelay:()=>Math.min(1e3*Math.pow(2,e),3e4),increment:()=>{e++},reset:()=>{e=0}}},_t=t=>{let e=t||{},n=et(),r=ut(e),s={},o={},d={},c=new Set,l=new Set,g=new Map,p=1e4,k=new Map,m=new Map,u=async h=>s[h]?!0:new Promise(E=>{r.get({"#":h},(_,R)=>{E(!_&&!!R&&!!R[h])})}),f=Te&&globalThis.WebSocket!==We?.WebSocket,v=Et(f),w=Tt(e.maxConnections||1e3),N=(typeof e.defaultLimit=="number"?e.defaultLimit:1)*1048576,V=new Map,i=new Map,a=null,b=h=>{Ze.readFile(`${e.file}/../.user_storage.json`,"utf8",(E,_)=>{if(E){h&&h();return}try{let R=JSON.parse(_);V.clear();for(let[O,P]of Object.entries(R))typeof P=="number"&&V.set(O,P)}catch{}h&&h()})},I=()=>{if(a)return;let h=setTimeout(()=>{a=null;let E={};for(let[_,R]of V)E[_]=R;Ze.writeFile(`${e.file}/../.user_storage.json`,JSON.stringify(E),_=>{_&&console.warn("saveUserStorage error:",_)})},5e3);h.unref&&h.unref(),a=h},S=h=>{Ze.readFile(`${e.file}/../.user_limit.json`,"utf8",(E,_)=>{if(E){h&&h();return}try{let R=JSON.parse(_);i.clear();for(let[O,P]of Object.entries(R))typeof P=="number"&&i.set(O,P*1048576)}catch{}h&&h()})},y=h=>h<1024?`${h} B`:h<1048576?`${(h/1024).toFixed(1)} KB`:h<1073741824?`${(h/1048576).toFixed(1)} MB`:`${(h/1073741824).toFixed(1)} GB`,x=()=>{let h=V.size,E=N===0?"unlisted users blocked":y(N);console.log(`[HOLSTER] Per-user storage limits enabled (${h} user${h!==1?"s":""}, default: ${E})`);let _=[...V.entries()].sort(([,O],[,P])=>P-O),R=O=>{let P=V.get(O)??0,L=i.get(O)??N,W=L===0?"blocked":y(L);console.log(` ${O.slice(0,16)}... used: ${y(P)} / limit: ${W}`)};h<=5?_.forEach(([O])=>R(O)):(console.log(" Top 5 by storage used:"),_.slice(0,5).forEach(([O])=>R(O))),console.log("Run npx holster-user-storage to view full keys and all users")},A=async(h,E,_)=>{let R=J;for(let O of Object.keys(h)){let P=h[O];if(P[R]===void 0)continue;let L=await new Promise(U=>{G({"#":O},U,E,{put:!0})});if(L.err)return _&&_(L.err),!1;let W=L.put&&L.put[O];if(!(!W||W[R]===void 0||W[R]===P[R]))return _&&_(`error in wire check public key does not match for soul: ${O}`),!1}return!0},T=(h,E)=>{let _=He(h.get,s);_?E(JSON.stringify({"#":n.track(ee.random(9)),"@":h["#"],put:_})):r.get(h.get,(R,O)=>{E(JSON.stringify({"#":n.track(ee.random(9)),"@":h["#"],put:O,err:R}))})},C=async(h,E)=>{let _={};if(e.userLimit)for(let[P,L]of Object.entries(h.put))L&&L[J]&&s[P]&&(_[P]=JSON.stringify(s[P]).length);if(!await A(h.put,E))return;let R=await Je.mix(h.put,s,l,e.secure||!1,d,e.maxGraphSize);if(Object.keys(R.now).length===0){Object.keys(R.defer).length!==0&&setTimeout(()=>C({put:R.defer,"#":h["#"]},E),R.wait);return}let O=P=>{P&&console.warn("store.put",P),E(JSON.stringify({"#":n.track(ee.random(9)),"@":h["#"],err:P})),R.listeners.forEach(L=>L())};if(!e.userLimit)r.put(R.now,O);else{let P={};for(let[L,W]of Object.entries(R.now)){let U=W[J];if(!U){P[L]=W;continue}let H=i.get(U)??N,M=V.get(U)??0,z=_[L]??0,te=s[L]?JSON.stringify(s[L]).length:0,Q=Math.max(0,M-z+te);Q>M&&Q>H||(P[L]=W,V.set(U,Q),I())}Object.keys(P).length>0?r.put(P,O):O(null)}Object.keys(R.defer).length!==0&&setTimeout(()=>C({put:R.defer,"#":h["#"]},E),R.wait)},G=(h,E,_,R)=>{if(!E)return;let O=R||{},P=O.fast||!h["."]&&l.has(h["#"]),L=He(h,s,P),W=ee.random(9),U=JSON.stringify({"#":n.track(W),get:h});if(L){if(!Te)if(!h["."]||typeof h["."]=="string"){let H=h["#"]+(h["."]?"."+h["."]:""),M=Date.now(),z=g.get(H);if(!z||M-z>p){g.set(H,M);let te=_(U);if(te&&te.err){E({err:te.err});return}}}else{let H=_(U);if(H&&H.err){E({err:H.err});return}}E({put:L});return}r.get(h,(H,M)=>{if(M){for(let[se,pe]of Object.entries(M))if(pe){if(!s[se]){s[se]={...pe};continue}for(let[ye,_e]of Object.entries(pe)){if(ye==="_")continue;let Ye=s[se];if(typeof Ye[ye]<"u")continue;Ye[ye]=_e;let Oe=pe._;if(Oe?.[">"]&&typeof Oe[">"][ye]<"u"){let je=Oe[">"][ye],Ne=s[se]._;Ne[">"][ye]=je,Oe.s?.[je]&&(Ne.s||(Ne.s={}),Ne.s[je]=Oe.s[je])}}}!h["."]&&M[h["#"]]&&l.add(h["#"]);let te=M[h["#"]];if(te&&Object.keys(te).some(se=>se!=="_"&&me(h["."],se))){if(!Te&&h["."]!==J)if(!h["."]||typeof h["."]=="string"){let se=h["#"]+(h["."]?"."+h["."]:""),pe=Date.now(),ye=g.get(se);if(!ye||pe-ye>p){g.set(se,pe);let _e=_(U);if(_e&&_e.err){E({err:_e.err});return}}}else{let se=_(U);if(se&&se.err){E({err:se.err});return}}E(H?{put:M,err:H}:{put:M});return}}if(H&&console.log(H),O&&O.put){let te=h["#"],Q={[te]:null};typeof h["."]=="string"&&(Q[te]={[h["."]]:null}),E({put:Q});return}o[W]=E,k.set(W,h),c.add(h["#"]);let z=_(U);if(z&&z.err){E({err:z.err}),delete o[W],k.delete(W);return}})},K=h=>({get:(E,_,R)=>{E&&typeof E["."]=="number"&&(E={...E,".":String(E["."])}),E&&E["#"]&&c.add(E["#"]),G(E,_,h,R)},put:async(E,_)=>{let R={};if(e.userLimit)for(let[L,W]of Object.entries(E))W&&W[J]&&s[L]&&(R[L]=JSON.stringify(s[L]).length);if(!await A(E,h,_))return;let O=await Je.mix(E,s,l,e.secure||!1,d,e.maxGraphSize);if(Object.keys(O.now).length===0){_&&_(null);return}for(let L of Object.keys(O.now))l.add(L);if(e.userLimit)for(let[L,W]of Object.entries(O.now)){let U=W[J];if(!U)continue;let H=i.get(U)??N,M=V.get(U)??0,z=R[L]??0,te=s[L]?JSON.stringify(s[L]).length:0,Q=Math.max(0,M-z+te);if(Q>M&&Q>H){_&&_("storage limit exceeded");return}V.set(U,Q),I()}for(let[L,W]of Object.entries(O.now))if(W&&typeof W=="object")for(let[U,H]of Object.entries(W)){let M=Y.is(H);M&&c.add(M)}r.put(O.now,L=>{_&&_(L),O.listeners.forEach(W=>W())});let P=h(JSON.stringify({"#":n.track(ee.random(9)),put:E}));if(P&&P.err){_&&_(P.err);return}},on:(E,_,R,O)=>{E&&typeof E["."]=="number"&&(E={...E,".":String(E["."])});let P=E&&E["#"];!P||!_||(d[P]?d[P].push({".":E["."],cb:_}):d[P]=[{".":E["."],cb:_}],R&&G(E,_,h,O))},off:(E,_)=>{let R=E&&E["#"];if(!(!R||!d[R]))if(_){let O=d[R].find(P=>P.cb===_);O&&d[R].splice(d[R].indexOf(O),1)}else delete d[R]}});if(Te&&(e.wss||e.server||e.port!=null)){let h=e.wss,E=()=>h.clients?.()||[];if(!h){let R=e.server?{server:e.server}:{port:e.port};h=new We.WebSocketServer(R),E=()=>Array.from(h.clients||[])}let _=(R,O)=>{let L=JSON.parse(R)["#"];if(L&&k.has(L)){let W=k.get(L);k.delete(L),setTimeout(()=>{let U=o[L];if(U){let H=W["#"],M={[H]:null};typeof W["."]=="string"&&(M[H]={[W["."]]:null}),U({put:M}),delete o[L]}},f?100:1e4)}E().forEach(W=>{let U=W;if(U&&U.readyState===WebSocket.OPEN)U.send(R,{binary:O});else if(U){let H=U._retryHandler||Qe();if(U._retryHandler=H,H.shouldRetry()){let M=H.getDelay();H.increment(),setTimeout(()=>{U&&U.readyState===WebSocket.OPEN&&(H.reset(),U.send(R,{binary:O}))},M)}}})};return e.userLimit&&(b(()=>S(()=>x())),setInterval(S,6e4).unref()),h.on("connection",R=>{if(!w.add(R)){console.log("Connection limit reached, rejecting connection"),R.close(1013,"Connection limit reached - try again later");return}let O=ee.random(9);console.log(`New WebSocket client connected: ${O}`),R.on?.("error",(...P)=>{let L=P[0];console.log("WebSocket error:",L),w.remove(R)}),R.on?.("close",()=>{console.log(`WebSocket client disconnected: ${O}`),w.remove(R)}),R.on?.("message",(...P)=>{let L=P[0],W=P[1],U=At(L,e.maxMessageSize);if(!U.valid){console.warn(`Invalid message: ${U.error}`),R.send(JSON.stringify({error:U.error}));return}let H=Rt(L,e.maxMessageSize);if(!H.success){console.warn(`JSON parse error: ${H.error}`),R.send(JSON.stringify({error:"Invalid JSON"}));return}let M=H.data;if(!M["#"]||n.check(M["#"]))return;let z=v.getDelay(O);if(z>0){let Q=v.getThrottleCount(O);if(console.log(`Client ${O}: rate limit exceeded, delay would be ${z}ms, dropping message (throttle count: ${Q})`),v.shouldDisconnect(O)){console.log(`Client ${O}: Disconnecting after ${Q} throttle violations`),R.close(1008,"Rate limit violations");return}R.send(JSON.stringify({"#":n.track(ee.random(9)),"@":M["#"],err:`Rate limit exceeded. Slow down requests. Wait ${Math.ceil(z/1e3)}s`,throttle:z}));return}let te=async()=>{n.track(M["#"]),M.get&&T(M,_),M.put&&await C(M,_),_(L.toString(),W);let Q=M["@"],se=o[Q];se&&(delete M["#"],delete M["@"],se(M),delete o[Q])};z>0?setTimeout(te,z):te()})}),K(_)}let D=[],F=!1,$=0,q=[],X=[],B=null,ne=e.maxQueueLength||1e4,ae=(h,E,_=f?100:1e4)=>setTimeout(()=>{m.delete(h),k.delete(h);let R=o[h];if(R){let O=E["#"],P={[O]:null};typeof E["."]=="string"&&(P[O]={[E["."]]:null}),R({put:P}),delete o[h]}},_),le=()=>{if(q.length===0){B=null;return}let h=Date.now();if(F&&h<$){B=setTimeout(le,Math.min(1e3,$-h));return}F&&h>=$&&(console.log("Throttle period ended, resuming queue processing"),F=!1,$=0);let E=q[0],_=re(E),R=JSON.parse(E),O=R["#"],P=!_&&!!R.get&&!k.has(O);if(_||P?q.shift():!_&&R.put&&(q.shift(),X.push(E)),O&&k.has(O)){let L=k.get(O);_?(m.has(O)&&(clearTimeout(m.get(O)),m.delete(O)),ae(O,L)):m.has(O)||m.set(O,ae(O,L,0))}q.length>0?B=setTimeout(le,50):B=null},re=h=>{let E=!1;return D.forEach(_=>{let R=_;if(R&&R.readyState===WebSocket.OPEN)R.send(h),E=!0;else if(R){let O=R._retryHandler||Qe();if(R._retryHandler=O,O.shouldRetry()){let P=O.getDelay();O.increment(),setTimeout(()=>{_&&_.readyState===WebSocket.OPEN&&(O.reset(),_.send(h))},P)}}}),E},ue=h=>{let E=e.maxMessageSize||1048576;if(h.length>E)return{err:`Message too large (${h.length} > ${E} bytes). Reduce the size of the data being saved.`};if(q.length>=ne)return{err:`Message queue exceeded maximum length (${ne}). Update query logic to request less data.`};q.push(h),B||(B=setTimeout(le,50))};return(!(e.peers instanceof Array)||e.peers.length===0)&&(e.peers=[`ws://localhost:${e.port||8765}`]),e.peers.forEach(h=>{let E=()=>{let _=new WebSocket(h);D.push(_);let R=Qe();_.onclose=()=>{if(_&&D.indexOf(_)!==-1&&D.splice(D.indexOf(_),1),_=null,R.shouldRetry()){let O=f?50:R.getDelay();R.increment();let P=setTimeout(E,O);P.unref&&P.unref()}},_.onopen=()=>{R.reset(),X.length>0&&(q=X.concat(q),X=[],B||(B=setTimeout(le,50)))},_.onerror=O=>{console.log(O)},_.onmessage=async O=>{let P=JSON.parse(O.data);if(!P["#"]||n.check(P["#"]))return;if(P.throttle&&P.err){console.log(`Server throttling: ${P.err}`),F=!0,$=Date.now()+P.throttle;return}if(n.track(P["#"]),P.get&&T(P,ue),P.put){let U=new Map;for(let[z,te]of Object.entries(P.put)){let Q=await u(z);if(U.set(z,Q),!(!Q&&!c.has(z)||!te||typeof te!="object"))for(let[,se]of Object.entries(te)){let pe=Y.is(se);pe&&c.add(pe)}}let H={},M=[];for(let[z,te]of Object.entries(P.put)){let Q=U.get(z);c.has(z)&&(Q=!0,M.push(z)),Q&&(H[z]=te)}if(Object.keys(H).length>0){let z={put:H,"#":P["#"]};await C(z,ue)}M.forEach(z=>c.delete(z))}let L=P["@"],W=o[L];W&&(delete P["#"],delete P["@"],W(P),delete o[L])}};E()}),K(ue)},Fe=_t;var Ot=(t,e)=>{e||(e=Fe(t));let n=[],r=!1,s=!1,o=0,d=(l,g,p,k)=>{let m=w=>{o++,d(w,g,p,k)},u=w=>{n=[],o=0,s=!1,k(w)},f=()=>{if(n.length===0){u("Wrong username or password");return}let w=n.shift();e.get({"#":w,".":["auth","pub","epub"]},async j=>{if(j.err){u(`error getting ${w}: ${j.err}`);return}let N=j.put&&j.put[w];if(!N||!N.auth)return f();let V=JSON.parse(N.auth),i=await ce.work(g,V.salt),a=await ce.decrypt(V.enc,i);if(!a)return f();if(c.is={username:l,pub:N.pub,epub:N.epub,priv:a.priv,epriv:a.epriv},p!==""){let b=ee.random(64),I=await ce.work(p,b),S=await ce.encrypt(a,I),y={auth:JSON.stringify({enc:S,salt:b})},x=Date.now(),A=await ce.signTimestamp(x,c.is),T=be(w,y,A,N.pub,x);e.put(T,C=>{u(C?`error putting ${JSON.stringify(y)} on ${w}: ${C}`:null)});return}u(null)})};if(o>9){u("Wrong username or password");return}let v="~@"+l;e.get({"#":v},async w=>{if(w.err){u(`error getting ${v}: ${w.err}`);return}let j=w.put&&w.put[v];if(!j)return m(l);delete j._,n=Object.keys(j),f()})},c={is:null,create:(l,g,p)=>{let k=u=>{p?p(u):u&&console.log(u)};if(r){k("User is already being created");return}if(l===""){k("Please provide a username");return}if(g===""){k("Please provide a password");return}r=!0;let m="~@"+l;e.get({"#":m},async u=>{if(u.err){r=!1,k(`error getting ${m}: ${u.err}`);return}if(u.put&&u.put[m]){r=!1,k("Username already exists");return}let f=ee.random(64),v=await ce.work(g,f),w=await ce.pair(),j={priv:w.priv,epriv:w.epriv},N=await ce.encrypt(j,v),V={username:l,pub:w.pub,epub:w.epub,auth:JSON.stringify({enc:N,salt:f})},i="~"+w.pub,a=Date.now(),b=await ce.signTimestamp(a,w),I=be(i,V,b,w.pub,a);e.put(I,S=>{if(r=!1,S){k(`error putting ${JSON.stringify(V)} on ${i}: ${S}`);return}let y={[i]:{"#":i}};e.put(be(m,y),x=>{if(x){k(`error putting ${JSON.stringify(y)} on ${m}: ${x}`);return}p&&p(null)})})})},auth:(l,g,p)=>{let k=m=>{p?p(m):m&&console.log(m)};if(s){k("User is already authenticating");return}if(c.is=null,l===""){k("Please provide a username");return}if(g===""){k("Please provide a password");return}s=!0,d(l,g,"",k)},change:(l,g,p,k)=>{let m=u=>{k?k(u):u&&console.log(u)};if(s){m("User is already authenticating");return}if(c.is=null,l===""){m("Please provide a username");return}if(g===""){m("Please provide a password");return}if(p===""){m("Please provide a new password");return}s=!0,d(l,g,p,m)},store:(l=!1)=>{if(!c.is){console.log("Please authenticate before calling store");return}if(l){typeof globalThis.localStorage<"u"&&globalThis.localStorage.setItem("user.is",JSON.stringify(c.is)),typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.removeItem("user.is");return}typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.setItem("user.is",JSON.stringify(c.is)),typeof globalThis.localStorage<"u"&&globalThis.localStorage.removeItem("user.is")},recall:()=>{if(typeof globalThis.localStorage<"u"){let l=globalThis.localStorage.getItem("user.is");if(l){c.is=JSON.parse(l);return}}if(typeof globalThis.sessionStorage<"u"){let l=globalThis.sessionStorage.getItem("user.is");l&&(c.is=JSON.parse(l))}},leave:()=>{c.is=null,typeof globalThis.localStorage<"u"&&globalThis.localStorage.removeItem("user.is"),typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.removeItem("user.is")},delete:(l,g,p)=>{let k=m=>{p?p(m):m&&console.log(m)};if(s){k("User is already authenticating");return}if(l===""){k("Please provide a username");return}if(g===""){k("Please provide a password");return}s=!0,d(l,g,"",async m=>{if(m){k(m);return}let u={username:null,pub:null,epub:null,auth:null},f=Date.now(),v=await ce.signTimestamp(f,c.is),w="~"+c.is.pub,j=be(w,u,v,c.is.pub,f);e.put(j,N=>{if(N){k(`error putting null on ${w}: ${N}`);return}c.is=null,p&&p(null)})})}};return c},lt=Ot;function ct(t,e,n,r){let s={...r};delete s.nested;let o=new Map,d=null,c=()=>e(d===null?null:{...d}),l=p=>{if(p===null||typeof p!="object"){d=p,c();return}(!d||typeof d!="object")&&(d={});let k=p;for(let[m,u]of Object.entries(k))if(m!=="_"&&(d[m]=u,u!==null&&typeof u=="object"&&!o.has(m))){let f=t().next(m),v=w=>{w===null?(delete d[m],o.delete(m)):d[m]=w,c()};o.set(m,{api:f,handler:v}),f.on(v,!1,s)}for(let m of[...o.keys()])if(!(m in k)){let u=o.get(m);u.api.off(u.handler),o.delete(m),delete d[m]}c()},g=t();return g.on(l,n,s),()=>{g.off(l);for(let{api:p,handler:k}of o.values())p.off(k);o.clear()}}var Pt=t=>{let e;typeof t=="string"?e={peers:[t]}:t instanceof Array?e={peers:t}:ie.is(t)?e=t:e={};let n=Fe(e),r=lt(e,n),s=new Map,o=new Map,d=new Map,c=new Map,l=m=>m===null||m===!0||m===!1||typeof m=="string"||!!Y.is(m)||Ge.is(m),g=m=>{if(l(m))return!0;if(ie.is(m)){let f=[];for(let[v,w]of Object.entries(m)){if(v==="_")return"error underscore cannot be used as a property name";if(ie.is(w)||l(w)){f.push(v);continue}return typeof w>"u"?`error undefined ${v} cannot be converted to a graph`:`error ${JSON.stringify({[v]:w})} cannot be converted to a graph`}if(f.length!==0)return f}return`error ${JSON.stringify(m)} cannot be converted to a graph`},p=async(m,u,f,v=0)=>{let w=await new Promise(j=>{let N=ee.random();o.set(N,{chain:[{item:null,soul:m}],user:u}),k(N).next(null,j,v===0?ie.put(f,"fast",!0):f)});return w!==null||v>=5?w:(await new Promise(j=>setTimeout(j,50)),p(m,u,f,v+1))},k=m=>{let u=m,f=(i,a,b,I)=>{n.get(ie.put(i,"#",a),async S=>{if(S.err&&console.log(S.err),S.put&&S.put[a]){delete S.put[a]._,delete S.put[a][J],delete S.put[a][ke];let y=S.put[a];await Promise.all(Object.keys(y).map(async x=>{let A=Y.is(y[x]);if(!A)return;let T=o.get(u);y[x]=await p(A,T?T.user:null,I)})),b(S.put[a])}else b(null)},I)},v=async(i,a,b,I)=>{if(b){let S=Date.now(),y=await ce.signTimestamp(S,b);return be(i,a,y,b.pub,S)}return e.secure?(I||(I=console.log),I(`error putting data on ${i}: user required in secure mode`),null):be(i,a)},w=i=>a=>{let b=o.get(i);b&&typeof b.cb<"u"?setTimeout(()=>b.cb(a),1):a&&console.log("error no callback for data",a,"ctx",b),b&&!b.on&&o.delete(i)},j=(i,a,b,I,S,y,x=!0)=>{let A=null,T=()=>{if(!o.has(u)){n.off({"#":i,".":a},T),A&&clearTimeout(A);return}n.get({"#":i,".":a},C=>{let G=C.put&&C.put[i],K=Y.is(G&&G[a]);if(!K){!x&&G&&G._&&typeof G[a]<"u"&&(A&&clearTimeout(A),n.off({"#":i,".":a},T),y(G[a]));return}A&&clearTimeout(A),n.off({"#":i,".":a},T),b.chain[I].soul=K,o.set(u,{...b}),x?k(u).on(S.on,y,S._get,S._opt):k(u).next(null,S.get,y,S._opt)},{...S._opt,secure:(typeof b.user=="boolean"?b.user:!!b.user)||e.secure})};n.on({"#":i,".":a},T,!0,S._opt),x||(A=setTimeout(()=>{n.off({"#":i,".":a},T),y&&y(null)},31e3))},N=(i,a,b,I,S)=>{let y=c.get(i),x=y&&y.get(a);if(x){x.then(D=>S(void 0,D),D=>S(D));return}let A=ee.random();b[a]=Y.ify(A);let T,C,G=new Promise((D,F)=>{T=D,C=F});G.catch(()=>{}),y||(y=new Map,c.set(i,y)),y.set(a,G);let K=()=>{y.delete(a),y.size===0&&c.delete(i)};(async()=>{let D=await v(i,b,I,S);if(D===null){K(),C(new Error("secure mode"));return}n.put(D,F=>{if(K(),F){let $=`error putting ${a} on ${i}: ${F}`;C($),S($);return}T(A),S(void 0,A)})})()},V=(i,a)=>{if(!i)return console.log("error resolve request parameter required"),!1;let b=typeof i.get<"u",I=typeof i.put<"u",S=typeof i.on<"u",y=typeof i.off<"u",x=!1,A=o.get(u);if(!A)return{item:null,soul:null};for(let T=1;T<A.chain.length;T++)if(A.chain[T].soul===null){x=!0;break}if(x){let T=1;for(;T<A.chain.length&&A.chain[T].soul!==null;)T++;let{item:C,soul:G}=A.chain[T-1];return n.get({"#":G,".":C},async K=>{if(K.err){console.log(`error getting ${C} on ${G}: ${K.err}`),a&&a(null);return}let D=K.put&&K.put[G];if(D&&typeof D[C]<"u"){let F=Y.is(D[C]);F?(A.chain[T].soul=F,o.set(u,{...A}),b?k(u).next(null,i.get,a,i._opt):I?k(u).put(i.put,a):S?k(u).on(i.on,a,i._get,i._opt):y&&k(u).off(a)):b?a(D[C]):I?N(G,C,D,A.user,($,q)=>{if($){a($);return}A.chain[T].soul=q,k(u).put(i.put,a)}):S?(j(G,C,A,T,i,a),i._get&&a(null)):y&&a&&a(null)}else if(I)D||(D={}),N(G,C,D,A.user,(F,$)=>{if(F){a(F);return}A.chain[T].soul=$,k(u).put(i.put,a)});else if(S)j(G,C,A,T,i,a),i._get&&a(null);else if(b&&D){let F=D._?.[">"];F&&Object.keys(F).length>0&&typeof F[C]>"u"?a&&a(null):j(G,C,A,T,i,a,!1)}else a&&a(null)},{...i._opt,secure:(typeof A.user=="boolean"?A.user:!!A.user)||e.secure}),!1}return b&&A.chain[A.chain.length-1].item!==null?(A.chain.push({item:null,soul:null}),k(u).next(null,i.get,a,i._opt),!1):A.chain[A.chain.length-1]};return{get:function(i,a,b,I){let S,y,x;if(typeof a=="function"?(x=b,y=a,S=null):(S=a,y=b,x=I),i===null||i===""||i==="_")return console.log("error please provide a key"),y&&y(null),this;if(S&&typeof y!="function")return console.log("error lex requires a callback function"),this;if(u=ee.random(),o.set(u,{chain:[{item:String(i),soul:"root"}],cb:y}),!y)return k(u);let A=w(u),T=V({get:S,_opt:x},A);return T&&f(S,T.soul,A,x),this},next:function(i,a,b,I){let S,y,x;typeof a=="function"?(x=b,y=a,S=null):(S=a,y=b,x=I);let A=K=>D=>{y?y(D):w(K)(D)};if(!u)return console.log("error please provide a key using get(key)"),y&&y(null),this;let T=A(u);if(i===""||i==="_")return T(null),this;if(S&&typeof y!="function")return console.log("error lex requires a callback function"),this;let C=o.get(u);if(!C)return this;if(y&&typeof C.cb>"u"&&(C.cb=y,y=void 0),i!==null&&C.chain.push({item:String(i),soul:null}),!C.cb)return k(u);let G=V({get:S,_opt:x},T);return G&&f(S,G.soul,T,x),this},put:function(i,a,b){let I=!1,S;typeof a=="function"?(S=a,I=!1):(I=a||!1,S=b);let y=F=>$=>{S?S($):w(F)($)};if(!u){S&&S("error please provide a key using get(key)");return}let x=o.get(u);if(!x)return;!x.cb&&S&&(x.cb=S,S=void 0),I&&(i={[ee.random()]:i});let A=y(u),T=g(i);if(typeof T=="string"){A(T);return}let C=V({put:i,_opt:{put:!0}},A);if(!C)return;let{item:G,soul:K}=C;if(!K)return;if(T===!0){n.get({"#":K,".":G},async F=>{if(F.err){A(`error getting ${K}: ${F.err}`);return}let $=F.put&&F.put[K],q=$&&$[G],X=Y.is(q);if(!X){$||($={}),$[G]=i;let B=await v(K,$,x.user,A);if(B===null)return;n.put(B,A);return}n.get({"#":X},async B=>{if(B.err){A(`error getting ${X}: ${B.err}`);return}if(!B.put||!B.put[X]){A(`error ${X} not found`);return}for(let ae of Object.keys(B.put[X])){if(ae==="_"||ae===J||ae===ke)continue;let le=await new Promise(re=>{let ue=ee.random(),h=[{item:ae,soul:X}];o.set(ue,{chain:h,user:x.user}),k(ue).put(null,re)});if(le){A(le);return}}$||($={}),$[G]=i;let ne=await v(K,$,x.user,A);ne!==null&&n.put(ne,A)})},{secure:(typeof x.user=="boolean"?x.user:!!x.user)||e.secure,put:!0});return}let D=(F=0)=>{n.get({"#":K,".":G},async $=>{if($.err){A(`error getting ${K}.${G}: ${$.err}`);return}let q=$.put&&$.put[K],X=q&&q[G];if(!X&&F<5)return await new Promise(re=>setTimeout(re,50)),D(F+1);let B=Y.is(X);if(!B){q||(q={}),N(K,G,q,x.user,re=>{if(re){A(re);return}let ue=ee.random(),h=[{item:G,soul:K}];o.set(ue,{chain:h,user:x.user,cb:x.cb}),k(ue).put(i)});return}let ne=[];for(let re of T){let ue=await new Promise(h=>{if(ie.is(i[re])&&!Y.is(i[re])){let E=ee.random(),_=[{item:re,soul:B}];o.set(E,{chain:_,user:x.user}),k(E).put(i[re],h)}else ne.push(re),h(null)});if(ue){A(ue);return}}if(ne.length===0){A(null);return}let ae={};ne.forEach(re=>{ae[re]=i[re]});let le=await v(B,ae,x.user,A);le!==null&&n.put(le,A)},{secure:(typeof x.user=="boolean"?x.user:!!x.user)||e.secure,put:!0})};D()},on:function(i,a,b,I){let S,y,x;if(typeof i=="function"?(x=b,b=a,y=i,S=null):(S=i,y=typeof a=="function"?a:void 0,x=I),typeof y!="function"){console.log("error on() requires a callback function");return}if(!u){console.log("error please provide a key using get(key)"),y(null);return}let A=V({on:S,_get:b,_opt:x},y);if(!A)return;let{item:T,soul:C}=A;if(!C)return;let G=o.get(u);if(x&&x.nested){let X=()=>{let B=ee.random();return o.set(B,{chain:[{item:T,soul:C}],user:G?G.user:null}),k(B)};d.set(y,ct(X,y,b,x));return}o.set(u,{chain:[{item:T,soul:C}],on:!0,user:G?G.user:null});let K=5,D=1e3,F=null,$=C;s.set(y,()=>{if(!o.has(u))return;clearTimeout(F),F=null;let X=(B,ne,ae)=>{let le=Y.is(ae);if(le){$!==le&&(n.off({"#":$},s.get(y)),n.on({"#":le,".":null},s.get(y),!1,x),$=le),p(le,G?G.user:null,x).then(ue=>{F=null,y(ue)});return}if(ae!=null){F=null,y(ae);return}if(B>=K){F=null,y(ae!==void 0?ae:null);return}let re=ne?50:Math.min(D*Math.pow(2,B),3e4);F=setTimeout(()=>{n.get({"#":C,".":T},ue=>{let h=ue.put&&ue.put[C];X(B+1,h,h&&h[T])},{...x,secure:G&&(typeof G.user=="boolean"?G.user:!!G.user)||e.secure})},re)};n.get({"#":C,".":T},B=>{let ne=B.put&&B.put[C];X(0,ne,ne&&ne[T])},{...x,secure:G&&(typeof G.user=="boolean"?G.user:!!G.user)||e.secure})});let q=S?ie.put(S,"#",C):{"#":C,".":T};q["."]!=null&&typeof q["."]=="number"&&(q={...q,".":String(q["."])}),n.on(q,s.get(y),!1,x),n.get({"#":C,".":T},X=>{if(X.err){console.log(`error getting ${C}.${T}: ${X.err}`);return}let B=X.put&&X.put[C]&&X.put[C][T],ne=Y.is(B);ne&&$!==ne&&(n.off({"#":$},s.get(y)),n.on({"#":ne,".":null},s.get(y),!1,x),$=ne),b&&s.get(y)()},{...x,secure:G&&(typeof G.user=="boolean"?G.user:!!G.user)||e.secure})},off:function(i){if(!u){console.log("error please provide a key using get(key)"),i&&i(null);return}if(i&&d.has(i)){d.get(i)(),d.delete(i);return}let a=V({off:!0},i);if(!a)return;let{item:b,soul:I}=a;I&&(n.off({"#":I},s.get(i)),n.get({"#":I,".":b},S=>{if(S.err){s.delete(i),o.delete(u);return}let y=S.put&&S.put[I]&&S.put[I][b],x=Y.is(y);x&&n.off({"#":x},s.get(i)),s.delete(i),o.delete(u)}))},user:()=>(r.get||(Object.assign(r,k()),r.get=function(i,a,b,I){let S,y,x;typeof a=="function"?(x=b,y=a,S=null):(S=a,y=b,x=I);let A=null,T=null;if(r.is&&(A=r.is.pub),typeof i=="string"?T=i:i instanceof Array&&(i.length===2&&i[0]&&i[1]?(A=i[0],T=i[1]):i.length===1&&i[0]&&(T=i[0])),!A)return console.log("error please log in or provide a public key"),y&&y(null),this;if(T===null||T===""||T==="_")return console.log("error please provide a key"),y&&y(null),this;if(S&&!y)return console.log("error lex requires a callback function"),this;u=ee.random();let C=[{item:String(T),soul:"~"+A}];if(o.set(u,{chain:C,user:r.is,cb:y}),!y)return k(u);let G=w(u),K=V({get:S,_opt:x},G);return K&&f(S,K.soul,G,x),this}),r),wire:n,SEA:ce}};return k()},ln=Pt;export{ln as default};
4
4
  //# sourceMappingURL=holster.js.map