@mblaney/holster 2.1.3 → 2.1.4
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/README.md +22 -9
- package/build/holster.js +3 -3
- package/build/holster.js.map +3 -3
- package/dist/holster.js +3 -3
- package/dist/holster.js.map +3 -3
- package/package.json +1 -1
- package/src/holster.js +83 -34
- package/src/radisk.js +82 -23
- package/src/radix.js +52 -22
- package/src/store.js +1 -0
- package/src/wire.js +29 -6
- package/ts/src/holster.ts +96 -48
- package/ts/src/radisk.ts +73 -18
- package/ts/src/radix.ts +58 -28
- package/ts/src/store.ts +1 -0
- package/ts/src/wire.ts +34 -6
package/README.md
CHANGED
|
@@ -3,17 +3,20 @@ Node.js, Deno, Bun or the browser. Built with ES modules, it features
|
|
|
3
3
|
end-to-end encryption, conflict resolution and cross-platform compatibility.
|
|
4
4
|
|
|
5
5
|
✨ Real-time sync across all connected devices\
|
|
6
|
-
🔐 Built-in encryption
|
|
7
|
-
|
|
8
|
-
🌐 Universal compatibility - works everywhere JavaScript runs
|
|
6
|
+
🔐 Built-in encryption and user authentication\
|
|
7
|
+
📴 Local-first with offline support
|
|
9
8
|
|
|
10
|
-
|
|
9
|
+
Holster stores data locally by default - IndexedDB in the browser, and the
|
|
10
|
+
filesystem in Node.js, Deno or Bun - so reads and writes keep working without
|
|
11
|
+
a network connection. Writes made while offline are queued and automatically
|
|
12
|
+
sent once a connection to the network is available.
|
|
11
13
|
|
|
12
|
-
A build version of Holster is also provided using
|
|
14
|
+
A build version of Holster is also provided in the npm package using
|
|
13
15
|
[esbuild](https://esbuild.github.io), to run in production.
|
|
14
16
|
|
|
15
|
-
Check out the [
|
|
16
|
-
to get started using the API,
|
|
17
|
+
Check out the [GitHub Wiki](https://github.com/mblaney/holster/wiki) for how
|
|
18
|
+
to get started using the API, or visit
|
|
19
|
+
[holster.haza.website](https://holster.haza.website) for examples.
|
|
17
20
|
|
|
18
21
|
### Quick Start
|
|
19
22
|
|
|
@@ -49,7 +52,7 @@ memory and storage options with larger values than the defaults, which are
|
|
|
49
52
|
conservative to support browser use. See [Holster options](https://github.com/mblaney/holster/wiki/Holster-API#holster-options) for more details. To run this
|
|
50
53
|
with node:
|
|
51
54
|
|
|
52
|
-
- `npm install`
|
|
55
|
+
- `npm install @mblaney/holster`
|
|
53
56
|
- `node relay.js`
|
|
54
57
|
|
|
55
58
|
For production you can start with pm2:
|
|
@@ -60,7 +63,17 @@ For production you can start with pm2:
|
|
|
60
63
|
- `pm2 start relay.js`
|
|
61
64
|
- `pm2 save`
|
|
62
65
|
|
|
63
|
-
To allow connections via a web server see
|
|
66
|
+
To allow connections via a web server and to enable secure WebSockets see
|
|
67
|
+
[examples/apache.md](examples/apache.md).
|
|
68
|
+
|
|
69
|
+
Clients then connect by passing the relay's address as a peer:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
import Holster from "@mblaney/holster/src/holster.js"
|
|
73
|
+
Holster("wss://your-relay-host")
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
If no peer is given, Holster defaults to `ws://localhost:8765`.
|
|
64
77
|
|
|
65
78
|
### Related packages
|
|
66
79
|
|
package/build/holster.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var Ae={is:e=>{if(e instanceof Array)return!1;if(typeof e=="number")return!isNaN(e);if(typeof e=="string"){let t=parseFloat(e);return!isNaN(t)&&isFinite(t)}return!1}},Z={is:e=>{if(!e||typeof e!="object")return!1;let r=Object.prototype.toString.call(e).match(/^\[object (\w+)\]$/);return e.constructor===Object||r&&r[1]==="Object"},map:(e,t,r)=>{var n=Object.keys(e);for(let s=0;s<n.length;s++){let f=t(e[n[s]],n[s],r);if(typeof f<"u")return f}},put:(e,t,r)=>(e||(e={}),e[t]=r,e),del:(e,t)=>{if(e)return e[t]=null,delete e[t],e}},st=(e,t,r)=>{if(r.id){r.id=!1;return}if(t==="#"&&typeof e=="string"){r.id=e;return}r.id=!1},W={is:e=>{if(e&&e["#"]&&!e._&&Z.is(e)){let t={};if(Z.map(e,st,t),t.id)return t.id}return!1},ify:e=>Z.put({},"#",e)},he="_holster_user_signature",K="_holster_user_public_key",ce=(e,t,r,n,s)=>{let f={[e]:{_:{"#":e,">":{}}}};for(let[d,a]of Object.entries(t))d!=="_"&&d!==K&&d!==he&&(f[e][d]=a,f[e]._[">"][d]=s||Date.now());return r&&n&&s&&(f[e]._.s={[s]:r},f[e][K]=n,f[e]._[">"][K]=s),f},ae=(e,t)=>{if(typeof t>"u")return e===null;if(typeof e>"u")return!0;if(typeof e=="string")return e===t;if(Array.isArray(e))return e.includes(t);if(!Z.is(e)||!t)return!1;let r=e["*"];if(r)return t.slice(0,r.length)===r;let n=e[">"],s=e["<"];return n&&s?t>=n&&t<=s:n?t>=n:s?t<=s:!1},z={random:e=>{var t="";let r="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";e||(e=24);for(let n=0;n<e;n++)t+=r.charAt(Math.floor(Math.random()*r.length));return t}};var ot=()=>{let t={store:{}};return t.check=r=>t.store[r]?t.track(r):!1,t.track=r=>(t.store[r]=Date.now(),t.expiry||(t.expiry=setTimeout(()=>{let n=Date.now();Object.keys(t.store).forEach(s=>{n-t.store[s]>9e3&&delete t.store[s]}),t.expiry=null},9e3),t.expiry.unref&&t.expiry.unref()),r),t},qe=ot;var it=(e,t,r)=>{if(!e||typeof e!="object")throw new TypeError("lex must be an object");if(!t||typeof t!="object")throw new TypeError("graph must be an object");let n=e["#"];if(!n||typeof n!="string")throw new TypeError("soul must be a string");if(!t[n])return;let s={_:{"#":n,">":{}}},f={};if(typeof e["."]=="string"){let d=e["."];if(typeof t[n][d]>"u")return;s[d]=t[n][d],s._[">"][d]=t[n]._[">"][d];let a=t[n]._[">"][d];if(t[n]._.s&&t[n]._.s[a]&&(f[a]=t[n]._.s[a]),K&&typeof t[n][K]<"u"){s[K]=t[n][K],s._[">"][K]=t[n]._[">"][K];let l=t[n]._[">"][K];t[n]._.s&&t[n]._.s[l]&&(f[l]=t[n]._.s[l])}}else{if(!r)return;let d=!1;for(let a of Object.keys(t[n]))if(a!=="_"&&(a===K||ae(e["."],a))){s[a]=t[n][a],s._[">"][a]=t[n]._[">"][a];let l=t[n]._[">"][a];t[n]._.s&&t[n]._.s[l]&&(f[l]=t[n]._.s[l]),d=!0}if(!d)return}return Object.keys(f).length>0&&(s._.s=f),{[n]:s}},Ie=it;typeof btoa>"u"&&(globalThis.btoa=e=>Buffer.from(e,"binary").toString("base64"),globalThis.atob=e=>Buffer.from(e,"base64").toString("binary"));function Oe(){}Object.assign(Oe,{from:Array.from});Oe.prototype=Object.create(Array.prototype);Oe.prototype.toString=function(e,t,r){if(e||(e="utf8"),t||(t=0),r=r?Math.min(Math.max(r,t),this.length):this.length,e==="hex"){let n=new Uint8Array(this.slice(t,r));return Array.from(n,s=>s.toString(16).padStart(2,"0")).join("")}if(e==="utf8")return Array.from({length:r-t},(n,s)=>{let f=this[s+t];return f<0||f>1114111?"\uFFFD":String.fromCharCode(f)}).join("");if(e==="base64"){let n=Array.from({length:r-t},(s,f)=>{let d=this[f+t];return d<0||d>255?"\uFFFD":String.fromCharCode(d)}).join("");return btoa(n)}};var ge=Oe;var $e={MAX_BUFFER_SIZE:10*1024*1024,MAX_STRING_LENGTH:1024*1024};function de(...e){return console.warn("new SafeBuffer() is deprecated, please use SafeBuffer.from()"),de.from(...e)}de.prototype=Object.create(Array.prototype);var _e=(e,t)=>{if(typeof e!="string")throw new TypeError("Input must be a string for encoding: "+t);if(e.length>$e.MAX_STRING_LENGTH)throw new RangeError(`String too large: ${e.length} > ${$e.MAX_STRING_LENGTH}`)},ue=(e,t="buffer operation")=>{if(e>$e.MAX_BUFFER_SIZE)throw new RangeError(`Buffer size too large for ${t}: ${e} > ${$e.MAX_BUFFER_SIZE}`)},ut=e=>{_e(e,"hex");let t=e.replace(/\s/g,"").toLowerCase();if(!/^[0-9a-f]*$/.test(t))throw new TypeError("Invalid hex string: contains non-hex characters");if(t.length%2!==0)throw new TypeError("Invalid hex string: must have even length");if(t.length===0)return new Uint8Array(0);ue(t.length/2,"hex parsing");let r=new Uint8Array(t.length/2);for(let n=0;n<t.length;n+=2){let s=t.substr(n,2);r[n/2]=parseInt(s,16)}return r},Xe=e=>{_e(e,"utf8");try{let r=new TextEncoder().encode(e);return ue(r.length,"UTF-8 encoding"),r}catch(t){throw new TypeError("Failed to encode UTF-8 string: "+t.message)}},lt=e=>{_e(e,"binary"),ue(e.length,"binary encoding");let t=new Uint8Array(e.length);for(let r=0;r<e.length;r++){let n=e.charCodeAt(r);if(n>255)throw new TypeError(`Invalid binary string: character at position ${r} exceeds byte range (${n} > 255)`);t[r]=n}return t},ft=e=>{_e(e,"base64");let t=e.replace(/\s/g,"");if(!/^[A-Za-z0-9+/]*={0,2}$/.test(t))throw new TypeError("Invalid base64 string: contains invalid characters");try{let r=atob(t);ue(r.length,"base64 decoding");let n=new Uint8Array(r.length);for(let s=0;s<r.length;s++)n[s]=r.charCodeAt(s);return n}catch(r){throw new TypeError("Failed to decode base64 string: "+r.message)}},Qe=e=>{let t;if(e instanceof ArrayBuffer)ue(e.byteLength,"ArrayBuffer processing"),t=new Uint8Array(e);else if(ArrayBuffer.isView(e))ue(e.byteLength||e.length,"TypedArray processing"),t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);else if(Array.isArray(e)){ue(e.length,"Array processing");for(let r=0;r<e.length;r++){let n=e[r];if(typeof n!="number"||n<0||n>255||!Number.isInteger(n))throw new TypeError(`Invalid byte value at index ${r}: ${n} (must be integer 0-255)`)}t=new Uint8Array(e)}else if(typeof e=="object"&&e!==null&&typeof e.byteLength=="number")ue(e.byteLength,"ArrayBuffer-like processing"),t=new Uint8Array(e);else if(typeof e=="object"&&e!==null&&typeof e.length=="number"){ue(e.length,"array-like processing");let r=Array.from(e);for(let n=0;n<r.length;n++){let s=r[n];if(typeof s!="number"||s<0||s>255||!Number.isInteger(s))throw new TypeError(`Invalid byte value at index ${n}: ${s} (must be integer 0-255)`)}t=new Uint8Array(r)}else throw new TypeError("Unsupported input type: "+typeof e);return t};Object.assign(de,{from(){if(arguments.length===0)throw new TypeError("SafeBuffer.from() requires at least one argument");let t=arguments[0];if(t==null)throw new TypeError("First argument must not be null or undefined");let r;if(typeof t=="string"){let n=(arguments[1]||"utf8").toLowerCase();switch(n){case"hex":r=ut(t);break;case"utf8":case"utf-8":r=Xe(t);break;case"binary":case"latin1":r=lt(t);break;case"base64":r=ft(t);break;case"ascii":_e(t,"ascii");for(let s=0;s<t.length;s++)if(t.charCodeAt(s)>127)throw new TypeError(`Invalid ASCII character at position ${s}: ${t.charCodeAt(s)} > 127`);r=Xe(t);break;default:throw new TypeError("Unknown encoding: "+n)}}else r=Qe(t);if(!r||r.length===0)return ge.from(new Uint8Array(0));try{return ge.from(r)}catch(n){throw new Error("Failed to create SafeBuffer: "+n.message)}},alloc(e,t=0){if(typeof e!="number"||!Number.isInteger(e)||e<0)throw new TypeError("Length must be a non-negative integer");if(ue(e,"buffer allocation"),typeof t=="number"){if(t<0||t>255||!Number.isInteger(t))throw new TypeError("Fill value must be an integer between 0 and 255")}else if(typeof t=="string"){if(t.length!==1)throw new TypeError("Fill string must be exactly one character");if(t=t.charCodeAt(0),t>255)throw new TypeError("Fill character code must be <= 255")}else throw new TypeError("Fill must be a number or single character string");try{let r=new Uint8Array(e);return t!==0&&r.fill(t),ge.from(r)}catch(r){throw new Error("Failed to allocate buffer: "+r.message)}},concat(e){if(!Array.isArray(e))throw new TypeError("First argument must be an array");if(e.length===0)return ge.from(new Uint8Array(0));let t=0,r=[];for(let n=0;n<e.length;n++){let s=e[n];if(!s)throw new TypeError(`Array element at index ${n} is null or undefined`);let f;try{f=Qe(s)}catch(d){throw new TypeError(`Invalid array element at index ${n}: ${d.message}`)}t+=f.length,ue(t,"buffer concatenation"),r.push(f)}try{let n=new Uint8Array(t),s=0;for(let f of r)n.set(f,s),s+=f.length;return ge.from(n)}catch(n){throw new Error("Failed to concatenate buffers: "+n.message)}},isBuffer(e){return e instanceof ge||e&&typeof e=="object"&&e.constructor===de},byteLength(e,t="utf8"){if(typeof e!="string")throw new TypeError("First argument must be a string");switch(t.toLowerCase()){case"utf8":case"utf-8":return new TextEncoder().encode(e).length;case"ascii":case"binary":case"latin1":return e.length;case"base64":let r=e.replace(/\s/g,"");return Math.floor(r.length*3/4)-(r.match(/=/g)||[]).length;case"hex":return Math.floor(e.replace(/\s/g,"").length/2);default:throw new TypeError("Unknown encoding: "+t)}}});de.prototype.from=de.from;de.prototype.toString=function(e="utf8",t=0,r=this.length){if(typeof e!="string")throw new TypeError("Encoding must be a string");if(typeof t!="number"||!Number.isInteger(t)||t<0)throw new TypeError("Start must be a non-negative integer");if(typeof r!="number"||!Number.isInteger(r)||r<t)throw new TypeError("End must be an integer >= start");try{return ge.prototype.toString.call(this,e,t,r)}catch(n){throw new Error("Failed to convert buffer to string: "+n.message)}};var ne=de;var at=typeof process<"u"&&process.versions?.node!=null,Ze=at?(await import("node:crypto")).webcrypto:globalThis.crypto,J=Ze.subtle,Ce=e=>typeof e=="string"?e:JSON.stringify(e),ke=e=>{try{return JSON.parse(e)}catch{return e}},xe=e=>{let t=new Uint8Array(ne.alloc(e));return ne.from(Ze.getRandomValues(t))},me=(e,t)=>{let[r,n]=e.split(".");return{kty:"EC",crv:"P-256",x:r,y:n,d:t,ext:!0,key_ops:t?["sign"]:["verify"]}},be=async e=>{let t=await J.digest({name:"SHA-256"},new TextEncoder().encode(Ce(e)));return ne.from(t)},De=async(e,t)=>{let r=e+t.toString("utf8"),n=ne.from(await be(r),"binary"),s=ct(n);return await J.importKey("jwk",s,{name:"AES-GCM"},!1,["encrypt","decrypt"])},ct=e=>({kty:"oct",k:e.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/\=/g,""),ext:!1,alg:"A256GCM"});var dt={pair:async e=>{let t=await J.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]).then(async s=>{let f=await J.exportKey("jwk",s.publicKey);return{priv:(await J.exportKey("jwk",s.privateKey)).d,pub:f.x+"."+f.y}}),r=await J.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveKey"]).then(async s=>{let f=await J.exportKey("jwk",s.publicKey);return{epriv:(await J.exportKey("jwk",s.privateKey)).d,epub:f.x+"."+f.y}}),n={pub:t.pub,priv:t.priv,epub:r.epub,epriv:r.epriv};return e&&e(n),n},encrypt:async(e,t,r)=>{if(!t||!t.epriv)return r&&r(null),null;let n={s:xe(9),iv:xe(15)},s=await De(t.epriv,n.s).then(d=>J.encrypt({name:"AES-GCM",iv:new Uint8Array(n.iv)},d,new TextEncoder().encode(Ce(e)))),f={ct:ne.from(s,"binary").toString("base64"),iv:n.iv.toString("base64"),s:n.s.toString("base64")};return r&&r(f),f},decrypt:async(e,t,r)=>{if(!e||!e.ct||!e.iv||!e.s||!t||!t.epriv)return r&&r(null),null;let n={ct:ne.from(e.ct,"base64"),iv:ne.from(e.iv,"base64"),s:ne.from(e.s,"base64")};try{let s=await De(t.epriv,n.s).then(d=>J.decrypt({name:"AES-GCM",iv:new Uint8Array(n.iv),tagLength:128},d,new Uint8Array(n.ct))),f=ke(new TextDecoder("utf8").decode(s));return r&&r(f),f}catch{return r&&r(null),null}},verify:async(e,t,r)=>{if(!t||!t.pub)return r&&r(null),null;let n=ke(e),s=await J.importKey("jwk",me(t.pub),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]),f={};if(typeof n.m=="string")f=n.m;else for(let y of Object.keys(n.m).sort())y!=="_"&&y!==K&&y!==he&&(f[y]=n.m[y]);let d=await be(f),a=new Uint8Array(ne.from(n.s,"base64")),l={name:"ECDSA",hash:{name:"SHA-256"}};if(await J.verify(l,s,a,new Uint8Array(d))){let y=ke(n.m);return r&&r(y),y}return r&&r(null),null},sign:async(e,t,r)=>{if(!t||!t.pub||!t.priv)return r&&r(null),null;let n={};if(typeof e=="string")n=e;else{let y=ke(e);for(let S of Object.keys(y).sort())S!=="_"&&S!==K&&S!==he&&(n[S]=y[S])}let s=await be(n),f=me(t.pub,t.priv),d={name:"ECDSA",namedCurve:"P-256"},a=await J.importKey("jwk",f,d,!1,["sign"]).then(y=>J.sign({name:"ECDSA",hash:{name:"SHA-256"}},y,new Uint8Array(s))),l={m:n,s:ne.from(a,"binary").toString("base64")};return r&&r(l),l},signTimestamp:async(e,t,r)=>{if(!t||!t.pub||!t.priv)return r&&r(null),null;let n=e.toString(),s=await be(n),f=me(t.pub,t.priv),d={name:"ECDSA",namedCurve:"P-256"},a=await J.importKey("jwk",f,d,!1,["sign"]).then(y=>J.sign({name:"ECDSA",hash:{name:"SHA-256"}},y,new Uint8Array(s))),l=ne.from(a,"binary").toString("base64");return r&&r(l),l},verifyTimestamp:async(e,t,r,n)=>{if(!r||!e||!t)return n&&n(!1),!1;try{let s=e.toString(),f=await be(s),d=await J.importKey("jwk",me(r),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]),a=new Uint8Array(ne.from(t,"base64")),l={name:"ECDSA",hash:{name:"SHA-256"}},y=await J.verify(l,d,a,new Uint8Array(f));return n&&n(y),y}catch(s){return console.log(`error verifying timestamp signature: ${s.message}`),n&&n(!1),!1}},work:async(e,t,r)=>{typeof t=="function"&&(r=t,t=void 0),typeof t>"u"&&(t=xe(9));let n=await J.importKey("raw",new TextEncoder().encode(Ce(e)),{name:"PBKDF2"},!1,["deriveBits"]),s={name:"PBKDF2",iterations:1e5,salt:new TextEncoder().encode(t),hash:{name:"SHA-256"}},f=await J.deriveBits(s,n,512),d={epriv:ne.from(f,"binary").toString("base64")};return r&&r(d),d},secret:async(e,t,r)=>{if(!e||!e.epub||!t||!t.epub||!t.epriv)return r&&r(null),null;let n={name:"ECDH",namedCurve:"P-256"},s=me(e.epub),f=await J.importKey("jwk",s,n,!0,[]),d=me(t.epub,t.epriv,!1);delete d.key_ops;let a=await J.importKey("jwk",d,n,!1,["deriveBits"]).then(async l=>{let y=await J.deriveBits({public:f,name:"ECDH",namedCurve:"P-256"},l,256),S=await J.importKey("raw",new Uint8Array(y),{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]);return J.exportKey("jwk",S).then(({k:v})=>v)});return r&&r({epriv:a}),{epriv:a}}},te=dt;var pt=1e4,Ke=(e,t,r,n,s=!1)=>e<t?{historical:!0}:e>t?{incoming:!0}:s&&r!==n?{historical:!0}:(typeof r!="string"&&(r=JSON.stringify(r)||""),typeof n!="string"&&(n=JSON.stringify(n)||""),r===n?{state:!0}:r<n?{current:!0}:{incoming:!0});Ke.mix=async(e,t,r,n,s,f=pt)=>{if(!e||typeof e!="object")throw new TypeError("change must be an object");if(!t||typeof t!="object")throw new TypeError("graph must be an object");if(!s||typeof s!="object")throw new TypeError("listen must be an object");let d=Date.now(),a={},l={},y=[],S=new Map,v=new Map,p=0;for(let o of Object.keys(e)){let i=e[o],u=!1,w=!1,c=0,h=n;if(!i||!i._)continue;let T=i[K];if(i._.s&&T&&(h=!0),o.length>1&&o[0]==="~")if(o[1]==="@")w=!0,h=!1;else{if(T&&o!="~"+T){console.log(`error public key does not match for soul: ${o}`);continue}h=!0}if(h){if(!T||!i._)continue;let g=new Set,E=new Set,$=Object.entries(i._[">"]||{});for(let[C,M]of Object.entries(i._.s||{})){let x=Number(C);if(!isNaN(x)&&x>0){let R=$.filter(([,Y])=>Number(Y)===x);if(R.length>0&&R.every(([Y])=>(t[o]&&t[o]._[">"]?t[o]._[">"][Y]:0)>x))continue;if(await te.verifyTimestamp(x,M,T)){g.add(x);for(let[Y,X]of $)Number(X)===x&&E.add(Y)}}}if(E.size===0)continue;S.set(o,E),v.set(o,g)}for(let g of Object.keys(i)){if(g==="_"||S.has(o)&&!S.get(o).has(g))continue;let E=i[g],$=i._&&i._[">"]?i._[">"][g]:0,C=(t[o]||{})[g],M=(t[o]||{_:{">":{}}})._[">"][g]||0;if(w&&g!==W.is(E)){console.log(`error alias ${w}: ${g} !== ${W.is(E)}`);continue}let x=$-d;if(x>0){if(x>864e5)continue;(p===0||x<p)&&(p=c=x),l[o]||(l[o]={_:{"#":o,">":{},s:{}}}),l[o][g]=E,l[o]._[">"][g]=$,i._.s&&i._.s[$]&&(l[o]._.s[$]=i._.s[$])}else{let R=v.has(o)&&v.get(o).has($);Ke($,M,E,C,R).incoming&&(a[o]||(a[o]={_:{"#":o,">":{},s:{}}}),t[o]||(t[o]={_:{"#":o,">":{},s:{}}}),t[o][g]=a[o][g]=E,t[o]._[">"][g]=a[o]._[">"][g]=$,i._.s&&i._.s[$]&&(t[o]._.s[$]=a[o]._.s[$]=i._.s[$]),s[o]&&s[o].filter(B=>ae(B["."],g)).forEach(B=>y.push(B.cb)),u=!0)}}u&&s[o]&&s[o].filter(g=>ae(g["."])).forEach(g=>y.push(g.cb))}let m=Object.keys(t);return m.length>f&&m.map(u=>{let w=t[u]._&&t[u]._[">"],c=w?Math.max(...Object.values(w)):0;return{soul:u,maxState:c}}).sort((u,w)=>u.maxState-w.maxState).slice(0,m.length-f).forEach(({soul:u})=>{delete t[u],r&&r.delete(u)}),{now:a,defer:l,wait:p,listeners:y}};var Le=Ke;var le="",Se="",Ye=()=>{let e=(t,r,n)=>{if(n||(e[le]||(e[le]={}),n=e[le]),!t)return n;let s=0,f={},d=t[s],a=t.length-1,l=typeof r>"u",y=n[d];for(;!y&&s<a;)d+=t[++s],y=n[d];if(y)if(s===a){if(l)return typeof y[Se]>"u"?y[le]:y[Se];y[Se]=r}else return!y[le]&&!l&&(y[le]={}),e(t.slice(++s),r,y[le]);else if(Z.map(n,(v,p)=>{let m=0,o="";for(;p[m]===t[m];)o+=p[m++];if(o){if(l)return m<=a?void 0:(f[p.slice(m)]=v,v);let i={[p.slice(m)]:v,[t.slice(m)]:{[Se]:r}};return n[o]={[le]:i},delete n[p],!0}})){if(l)return f}else{if(l)return;n[d]||(n[d]={}),n[d][Se]=r}};return e};Ye.map=function e(t,r,n,s){s||(s=[]);var f=t[le]||t,d=Object.keys(f).sort(),a;for(let l=0;l<d.length;l++){let y=d[l],S=f[y],v=S[Se];if(typeof v<"u"){if(v=r(v,s.join("")+y,y,s),typeof v<"u")return v}else n&&r(a,s.join(""),y,s);if(S[le]){if(s.push(y),v=e(S[le],r,n,s),typeof v<"u")return v;s.pop()}}};var se=Ye;var Be="",Ne="",V="",we=e=>{var t;let r=new Map,n=null,s=0,f=1e4,d=new Map,a=0,l=3e4,y=.8,S=.9;if(e||(e={}),e.log||(e.log=console.log),e.batch||(e.batch=100),e.write||(e.write=1),e.size||(e.size=1024*1024),e.memoryLimit||(e.memoryLimit=500),typeof e.cache>"u"&&(e.cache=!0),!e.store){e.log("Radisk needs `store` interface with `{get: fn, put: fn, list: fn}`");return}if(!e.store.get){e.log("Radisk needs `store.get` interface with `(file, cb)`");return}if(!e.store.put){e.log("Radisk needs `store.put` interface with `(file, data, cb)`");return}if(!e.store.list){e.log("Radisk needs a streaming `store.list` interface with `(cb)`");return}let v=()=>{if(typeof process>"u"||!process.memoryUsage)return;let m=Date.now();if(m-a<l)return;a=m;let o=process.memoryUsage(),i=o.heapUsed,u=o.heapTotal,w=e.memoryLimit*1024*1024,c=i/w;if(c>S){let h=r.size;console.log(`[RADISK-MEMORY] High memory usage: ${Math.round(c*100)}% of heap limit. Clearing ${h} cached files.`),r.clear(),global.gc&&global.gc(),a=m+l}else c>y&&console.log(`[RADISK-MEMORY] Memory warning: ${Math.round(c*100)}% of heap limit used. Cache size: ${r.size} files.`)},p=(m,o,i)=>{if(m=""+m,typeof o=="function"){if(i=o,o=p.batch(m),typeof o<"u"||p.thrash.at&&(o=p.thrash.at(m),typeof o<"u"))return i(t,o);if(d.has(m)){d.get(m).push(i);return}d.set(m,[i]);let u=setTimeout(()=>{let w=d.get(m);w&&(e.log(`radisk read hang detected for key: ${m}`),d.delete(m),w.forEach(c=>c(null,null)))},3e4);return p.read(m,(w,c)=>{clearTimeout(u);let h=d.get(m)||[];d.delete(m),h.forEach(T=>T(w,c))})}if(p.batch(m,o),v(),i&&p.batch.acks.push(i),++p.batch.ed>=e.batch)return p.thrash();clearTimeout(p.batch.timeout),p.batch.timeout=setTimeout(p.thrash,e.write)};return p.batch=se(),p.batch.acks=[],p.batch.ed=0,p.thrash=()=>{if(p.thrash.ing)return p.thrash.more=!0;clearTimeout(p.batch.timeout),p.thrash.more=!1,p.thrash.ing=!0;var m=p.thrash.at=p.batch;p.batch=null,p.batch=se(),p.batch.acks=[],p.batch.ed=0;let o=0;p.save(m,i=>{++o>1||(i&&e.log(i),m.acks.forEach(u=>u(i)),p.thrash.at=null,p.thrash.ing=!1,p.thrash.more&&p.thrash())})},p.save=(m,o)=>{let i={find:(u,w)=>{if(!(w<i.start))return i.start=w,e.store.list(i.lex),!0},lex:u=>{!u||u>i.start?(i.end=u,i.start&&i.mix(i.file||"!",i.start,i.end)):i.file=u},mix:(u,w,c)=>{if(i.start=i.end=i.file=t,r.has(u)){let h=r.get(u);se.map(m,(T,g)=>{if(!(g<w)){if(c&&c<g){i.start=g;return}h(g,T)}}),p.write(u,h,i.next)}else p.parse(u,(h,T)=>{if(h)return o(h);se.map(m,(g,E)=>{if(!(E<w)){if(c&&c<E){i.start=E;return}T(E,g)}}),p.write(u,T,i.next)})},next:u=>{if(u)return o(u);if(i.start)return se.map(m,i.find);o(u)}};se.map(m,i.find)},p.write=(m,o,i)=>{let u={text:"",limit:"",done:!1,count:0,halfKey:"",halfOffset:0,each:(w,c,h,T)=>{if(u.done)return;u.count++,w=typeof w>"u"?"":"="+we.encode(w);let g=we.encode(T.length)+"#"+we.encode(h)+w+`
|
|
2
|
-
`,
|
|
3
|
-
`&&(T[0]==="="&&(E=T[1]),typeof g<"u"&&typeof E<"u"&&i.disk(h,E),T=i.split(T[2]))}o(t,i.disk)},split:u=>{if(!u)return;let w=u.indexOf(V);if(w===-1)return;let c=u.slice(0,w),h={};return[c,we.decode(u.slice(w),h),u.slice(w+h.i)]}};e.store.get(m,i.read)},p};we.encode=e=>{let t="",r="";if(e instanceof Array&&(e.length===2||e.length===3)&&(t=Be+e[1],e.length===3&&e[2]&&(r=Be+e[2]),e=e[0]),typeof e=="string"){let s=0,f=null,d=V;for(;f=e[s++];)f===V&&(d+=V);return d+'"'+e+t+r+V}let n=W.is(e);if(n)return V+"#"+n+t+r+V;if(Ae.is(e))return V+"+"+(e||0)+t+r+V;if(e===!0)return V+"+"+t+r+V;if(e===!1)return V+"-"+t+r+V;if(e===null)return V+" "+t+r+V};we.decode=(e,t)=>{var r=-1,n=0,s=null,f=null,d=-1,a=-1;if(e[0]!==V)return;for(;s=e[++r];)if(f){if(d===-1&&(d=r),s===V&&--n<=0){a=r;break}}else s===V?n++:f=s||!0;let l=d!==-1?e.slice(d,a!==-1?a:r):"";t&&(t.i=r+1);let y=l.split(Be),S=y[0],v=y[1],p=y[2];if(v)if(v=parseFloat(v),p){if(f==='"')return[S,v,p];if(f==="#")return[W.ify(S),v,p];if(f==="+")return S.length===0?[!0,v,p]:[parseFloat(S),v,p];if(f==="-")return[!1,v,p];if(f===" ")return[null,v,p]}else{if(f==='"')return[S,v];if(f==="#")return[W.ify(S),v];if(f==="+")return S.length===0?[!0,v]:[parseFloat(S),v];if(f==="-")return[!1,v];if(f===" ")return[null,v]}else{if(f==='"')return l;if(f==="#")return W.ify(l);if(f==="+")return l.length===0?!0:parseFloat(l);if(f==="-")return!1;if(f===" ")return null}};var Ve=we;var et=typeof process<"u"&&process.versions?.node!=null,pe=et?await import("node:fs"):void 0,Fe="",Me="",He=Me+"+0"+Me+"#"+Me+'"root'+Me,ht=e=>{let t=e.file;if(et)return pe.existsSync(t)||pe.mkdirSync(t),pe.existsSync(t+"/!")||pe.writeFileSync(t+"/!",He),{get:(r,n)=>{pe.readFile(t+"/"+r,(s,f)=>{if(s){if(s.code==="ENOENT"){n();return}console.log("fs.readFile error:",s)}f&&(f=f.toString()),n(s,f)})},put:(r,n,s)=>{var f=r+"."+z.random(9)+".tmp";pe.writeFile(f,n,d=>{if(d){console.log("fs.writeFile error:",d),s(d);return}pe.rename(f,t+"/"+r,s)})},list:r=>{pe.readdir(t,(n,s)=>{if(n){console.log("fs.readdir error:",n),r();return}s.forEach(r),r()})}};if(e.indexedDB){let r,n=new Promise((s,f)=>{let d=indexedDB.open(t,1);d.onupgradeneeded=a=>{a.target.result.createObjectStore(t)},d.onerror=a=>{console.log(a),f(a)},d.onsuccess=()=>{if(r=d.result,r){let l=r.transaction([t],"readonly").objectStore(t).getKey("!");l.onerror=()=>{console.log(`error getting key ${t}/!`),f(l.error)},l.onsuccess=()=>{if(l.result)s();else{let S=r.transaction([t],"readwrite").objectStore(t).put(He,"!");S.onerror=()=>{console.log(`error putting root on ${t}/!`),f(S.error)},S.onsuccess=()=>{s()}}}}else console.log("error indexedDB not available"),f(new Error("indexedDB not available"))}});return{get:(s,f)=>{let d=(a,l)=>{let S=r.transaction([t],"readonly").objectStore(t).get(a);S.onerror=()=>{console.log(`error getting ${t}/${a}`),l(S.error)},S.onsuccess=()=>{l(null,S.result)}};n.then(()=>{d(s,f)}).catch(a=>{f(a)})},put:(s,f,d)=>{let a=(l,y,S)=>{let p=r.transaction([t],"readwrite").objectStore(t).put(y,l);p.onerror=()=>{console.log(`error putting data on ${t}/${l}`),S(p.error)},p.onsuccess=()=>{S(null)}};n.then(()=>{a(s,f,d)}).catch(l=>{d(l)})},list:s=>{let f=d=>{let l=r.transaction([t],"readonly").objectStore(t).getAllKeys();l.onerror=()=>{console.log("error getting keys for",t),d()},l.onsuccess=()=>{l.result.forEach(d),d()}};n.then(()=>{f(s)}).catch(d=>{console.log("error indexedDB not available:",d),s()})}}}return{get:(r,n)=>{n(null,He)},put:(r,n,s)=>{s(null)},list:r=>{r("!"),r()}}},yt=e=>{Z.is(e)||(e={}),e.file=String(e.file||"radata"),e.store||(e.store=ht(e));let t=Ve(e);return{get:(r,n)=>{if(!r||!Z.is(r)){n("lex required");return}if(!r["#"]){n("soul required in lex");return}var s=r["#"],f=typeof r["."]=="string"?r["."]:"",d,a={};let l=(m,o)=>{o!==K&&!ae(r["."],o)||(d||(d={_:{"#":s,">":{}}}),d[o]=m[0],d._[">"][o]=m[1],m.length===3&&m[2]&&(a[m[1]]=m[2]))},y=f!==""&&f!==K,S=y?2:1,v=null,p=m=>{if(m&&!v&&(v=m),--S>0)return;let o={[s]:d};d&&Object.keys(a).length>0&&(d._.s=a),n(v,o)};t(s+Fe+f,(m,o)=>{Z.is(o)?(se.map(o,l),d||l(o,f)):o&&l(o,f),p(m)}),y&&t(s+Fe+K,(m,o)=>{o&&!Z.is(o)&&l(o,K),p(m)})},put:(r,n)=>{if(!r){n("graph required");return}let s=0,f=!1,d=a=>{if(s--,!f){if(a){f=!0,n(a);return}s===0&&(f=!0,n(null))}};Object.keys(r).forEach(a=>{var l=r[a];Object.keys(l).forEach(y=>{if(y==="_")return;s++;let S=l[y],v=l._[">"][y],p=l._.s&&l._.s[v],m=p?[S,v,p]:[S,v];t(a+Fe+y,m,d)})})}}},tt=yt;var ve=typeof process<"u"&&process.versions?.node!=null,We=ve?await import("ws"):void 0,Je=ve?await import("node:fs"):void 0;typeof globalThis.WebSocket>"u"&&(globalThis.WebSocket=We?.WebSocket);var mt=e=>{let t=new Map,r=1500,n=6e4,s=10,f=null;return e||(f=setInterval(()=>{let a=Date.now();for(let[l,y]of t.entries())a-y.lastCleanup>n&&(y.requests=[],y.lastCleanup=a),y.requests=y.requests.filter(S=>a-S<n),a-y.lastCleanup>n*10&&(y.throttleCount=0)},n/4)),{getDelay:a=>{let l=Date.now(),y=t.get(a)||{requests:[],lastCleanup:l,throttleCount:0};if(y.requests=y.requests.filter(S=>l-S<n),y.requests.length>=r){let S=Math.min(...y.requests),v=n-(l-S);return y.throttleCount=(y.throttleCount||0)+1,t.set(a,y),Math.max(0,v)}return y.requests.push(l),t.set(a,y),0},getRemainingRequests:a=>{let l=t.get(a);if(!l)return r;let y=Date.now(),S=l.requests.filter(v=>y-v<n);return Math.max(0,r-S.length)},getThrottleCount:a=>{let l=t.get(a);return l&&l.throttleCount||0},shouldDisconnect:a=>{let l=t.get(a);return l?l.throttleCount>=s:!1},destroy:()=>{f&&(clearInterval(f),f=null),t.clear()}}},wt=(e,t=1024*1024)=>{try{if(typeof e=="string"&&e.length>t)throw new Error("Message too large");return{success:!0,data:JSON.parse(e)}}catch(r){return{success:!1,error:r.message}}},bt=(e,t=1024*1024)=>typeof e=="string"&&e.length>t?{valid:!1,error:"Message too large"}:Buffer.isBuffer(e)&&e.length>t?{valid:!1,error:"Message too large"}:{valid:!0},St=(e=1e3)=>{let t=new Set;return{add:r=>{if(t.size>=e)return!1;t.add(r);let n=r.close;return r.close=(...s)=>(t.delete(r),n.apply(r,s)),!0},remove:r=>{t.delete(r)},count:()=>t.size,isFull:()=>t.size>=e}},Ge=(e=5)=>{let t=0;return{shouldRetry:()=>t<e,getDelay:()=>Math.min(1e3*Math.pow(2,t),3e4),increment:()=>t++,reset:()=>t=0}},vt=e=>{let t=qe(),r=tt(e),n={},s={},f={},d=new Set,a=new Set,l=new Map,y=1e4,S=new Map,v=new Map,p=async b=>n[b]?!0:new Promise(j=>{r.get({"#":b},(k,_)=>{j(!k&&_&&_[b])})}),m=ve&&globalThis.WebSocket!==We?.WebSocket,o=mt(m),i=St(e.maxConnections||1e3),w=(typeof e.defaultLimit=="number"?e.defaultLimit:1)*1048576,c=new Map,h=new Map,T=null,g=b=>{Je.readFile(`${e.file}/../.user_storage.json`,"utf8",(j,k)=>{if(j){b&&b();return}try{let _=JSON.parse(k);c.clear();for(let[A,O]of Object.entries(_))typeof O=="number"&&c.set(A,O)}catch{}b&&b()})},E=()=>{if(T)return;let b=setTimeout(()=>{T=null;let j={};for(let[k,_]of c)j[k]=_;Je.writeFile(`${e.file}/../.user_storage.json`,JSON.stringify(j),k=>{k&&console.warn("saveUserStorage error:",k)})},5e3);b.unref&&b.unref(),T=b},$=b=>{Je.readFile(`${e.file}/../.user_limit.json`,"utf8",(j,k)=>{if(j){b&&b();return}try{let _=JSON.parse(k);h.clear();for(let[A,O]of Object.entries(_))typeof O=="number"&&h.set(A,O*1048576)}catch{}b&&b()})},C=b=>b<1024?`${b} B`:b<1048576?`${(b/1024).toFixed(1)} KB`:b<1073741824?`${(b/1048576).toFixed(1)} MB`:`${(b/1073741824).toFixed(1)} GB`,M=()=>{let b=c.size,j=w===0?"unlisted users blocked":C(w);console.log(`[HOLSTER] Per-user storage limits enabled (${b} user${b!==1?"s":""}, default: ${j})`);let k=[...c.entries()].sort(([,A],[,O])=>O-A),_=A=>{let O=c.get(A)??0,N=h.get(A)??w,P=N===0?"blocked":C(N);console.log(` ${A.slice(0,16)}... used: ${C(O)} / limit: ${P}`)};b<=5?k.forEach(([A])=>_(A)):(console.log(" Top 5 by storage used:"),k.slice(0,5).forEach(([A])=>_(A))),console.log("Run npx holster-user-storage to view full keys and all users")},x=async(b,j,k)=>{let _=K;for(let A of Object.keys(b)){let O=b[A];if(O[_]===void 0)continue;let N=await new Promise(P=>{B({"#":A,".":_},P,j,{put:!0})});if(N.err)return k&&k(N.err),!1;if(!(!N.put||!N.put[A]||N.put[A][_]===O[_]))return k&&k(`error in wire check public key does not match for soul: ${A}`),!1}return!0},R=(b,j)=>{let k=Ie(b.get,n);k?j(JSON.stringify({"#":t.track(z.random(9)),"@":b["#"],put:k})):r.get(b.get,(_,A)=>{j(JSON.stringify({"#":t.track(z.random(9)),"@":b["#"],put:A,err:_}))})},D=async(b,j)=>{let k={};if(e.userLimit)for(let[O,N]of Object.entries(b.put))N&&N[K]&&n[O]&&(k[O]=JSON.stringify(n[O]).length);let _=await Le.mix(b.put,n,d,e.secure,f,e.maxGraphSize);if(Object.keys(_.now).length===0){Object.keys(_.defer).length!==0&&setTimeout(()=>D({put:_.defer,"#":b["#"]},j),_.wait);return}if(!await x(_.now,j))return;let A=O=>{O&&console.warn("store.put",O),j(JSON.stringify({"#":t.track(z.random(9)),"@":b["#"],err:O})),_.listeners.forEach(N=>N())};if(!e.userLimit)r.put(_.now,A);else{let O={};for(let[N,P]of Object.entries(_.now)){let U=P[K];if(!U){O[N]=P;continue}let I=h.get(U)??w;if((c.get(U)??0)>=I)continue;O[N]=P;let F=k[N]??0,L=n[N]?JSON.stringify(n[N]).length:0;c.set(U,Math.max(0,(c.get(U)??0)-F+L)),E()}Object.keys(O).length>0?r.put(O,A):A(null)}Object.keys(_.defer).length!==0&&setTimeout(()=>D({put:_.defer,"#":b["#"]},j),_.wait)},B=(b,j,k,_)=>{if(!j)return;Z.is(_)||(_={});let A=_.fast||!b["."]&&d.has(b["#"]),O=Ie(b,n,A),N=z.random(9),P=JSON.stringify({"#":t.track(N),get:b});if(O){if(!ve)if(!b["."]||typeof b["."]=="string"){let U=b["#"]+(b["."]?"."+b["."]:""),I=Date.now(),F=l.get(U);if(!F||I-F>y){l.set(U,I);let L=k(P);if(L&&L.err){j({err:L.err});return}}}else{let U=k(P);if(U&&U.err){j({err:U.err});return}}j({put:O});return}r.get(b,(U,I)=>{if(I){for(let[H,re]of Object.entries(I))if(re){if(!n[H]){n[H]={...re};continue}for(let[ie,Te]of Object.entries(re))if(ie!=="_"&&!(typeof n[H][ie]<"u")&&(n[H][ie]=Te,re._&&re._[">"]&&typeof re._[">"][ie]<"u")){let je=re._[">"][ie];n[H]._[">"][ie]=je,re._.s&&re._.s[je]&&(n[H]._.s||(n[H]._.s={}),n[H]._.s[je]=re._.s[je])}}!b["."]&&I[b["#"]]&&d.add(b["#"]);let L=I[b["#"]];if(L&&Object.keys(L).some(H=>H!=="_"&&ae(b["."],H))){if(!ve&&b["."]!==K)if(!b["."]||typeof b["."]=="string"){let H=b["#"]+(b["."]?"."+b["."]:""),re=Date.now(),ie=l.get(H);if(!ie||re-ie>y){l.set(H,re);let Te=k(P);if(Te&&Te.err){j({err:Te.err});return}}}else{let H=k(P);if(H&&H.err){j({err:H.err});return}}j(U?{put:I,err:U}:{put:I});return}}if(U&&console.log(U),_&&_.put){let L=b["#"],ee={[L]:null};typeof b["."]=="string"&&(ee[L]={[b["."]]:null}),j({put:ee});return}s[N]=j,S.set(N,b),a.add(b["#"]);let F=k(P);if(F&&F.err){j({err:F.err}),delete s[N],S.delete(N);return}})},Y=b=>({get:(j,k,_)=>{j&&typeof j["."]=="number"&&(j={...j,".":String(j["."])}),j&&j["#"]&&a.add(j["#"]),B(j,k,b,_)},put:async(j,k)=>{let _={};if(e.userLimit)for(let[N,P]of Object.entries(j))P&&P[K]&&n[N]&&(_[N]=JSON.stringify(n[N]).length);let A=await Le.mix(j,n,d,e.secure,f,e.maxGraphSize);if(Object.keys(A.now).length===0){k&&k(null);return}if(!await x(A.now,b,k))return;if(e.userLimit)for(let[N,P]of Object.entries(A.now)){let U=P[K];if(!U)continue;let I=h.get(U)??w,F=c.get(U)??0;if(F>=I){k&&k("storage limit exceeded");return}let L=_[N]??0,ee=n[N]?JSON.stringify(n[N]).length:0;c.set(U,Math.max(0,F-L+ee)),E()}for(let[N,P]of Object.entries(A.now))if(P&&typeof P=="object")for(let[U,I]of Object.entries(P)){let F=W.is(I);F&&a.add(F)}r.put(A.now,N=>{k&&k(N),A.listeners.forEach(P=>P())});let O=b(JSON.stringify({"#":t.track(z.random(9)),put:j}));if(O&&O.err){k&&k(O.err);return}},on:(j,k,_,A)=>{j&&typeof j["."]=="number"&&(j={...j,".":String(j["."])});let O=j&&j["#"];!O||!k||(f[O]?f[O].push({".":j["."],cb:k}):f[O]=[{".":j["."],cb:k}],_&&B(j,k,b,A))},off:(j,k)=>{let _=j&&j["#"];if(!(!_||!f[_]))if(k){let A=f[_].find(O=>O.cb===k);A&&f[_].splice(f[_].indexOf(A),1)}else delete f[_]}});if(ve&&(e.wss||e.server||e.port!=null)){let b=e.wss,j=()=>b.clients();if(!b){let _=e.server?{server:e.server}:{port:e.port};b=new We.WebSocketServer(_),j=()=>b.clients}let k=(_,A)=>{let N=JSON.parse(_)["#"];if(N&&S.has(N)){let P=S.get(N);S.delete(N),setTimeout(()=>{let U=s[N];if(U){let I=P["#"],F={[I]:null};typeof P["."]=="string"&&(F[I]={[P["."]]:null}),U({put:F}),delete s[N]}},m?100:1e4)}j().forEach(P=>{if(P&&P.readyState===WebSocket.OPEN)P.send(_,{binary:A});else{let U=P._retryHandler||Ge();if(P._retryHandler=U,U.shouldRetry()){let I=U.getDelay();U.increment(),setTimeout(()=>{P&&P.readyState===WebSocket.OPEN&&(U.reset(),P.send(_,{binary:A}))},I)}}})};return e.userLimit&&(g(()=>$(()=>M())),setInterval($,6e4).unref()),b.on("connection",_=>{if(!i.add(_)){console.log("Connection limit reached, rejecting connection"),_.close(1013,"Connection limit reached - try again later");return}let A=z.random(9);console.log(`New WebSocket client connected: ${A}`),_.on("error",O=>{console.log("WebSocket error:",O),i.remove(_)}),_.on("close",()=>{console.log(`WebSocket client disconnected: ${A}`),i.remove(_)}),_.on("message",(O,N)=>{let P=bt(O,e.maxMessageSize);if(!P.valid){console.warn(`Invalid message: ${P.error}`),_.send(JSON.stringify({error:P.error}));return}let U=wt(O,e.maxMessageSize);if(!U.success){console.warn(`JSON parse error: ${U.error}`),_.send(JSON.stringify({error:"Invalid JSON"}));return}let I=U.data;if(t.check(I["#"]))return;let F=o.getDelay(A);if(F>0){let ee=o.getThrottleCount(A);if(console.log(`Client ${A}: rate limit exceeded, delay would be ${F}ms, dropping message (throttle count: ${ee})`),o.shouldDisconnect(A)){console.log(`Client ${A}: Disconnecting after ${ee} throttle violations`),_.close(1008,"Rate limit violations");return}_.send(JSON.stringify({"#":t.track(z.random(9)),"@":I["#"],err:`Rate limit exceeded. Slow down requests. Wait ${Math.ceil(F/1e3)}s`,throttle:F}));return}let L=async()=>{t.track(I["#"]),I.get&&R(I,k),I.put&&await D(I,k),k(O,N);let ee=I["@"],H=s[ee];H&&(delete I["#"],delete I["@"],H(I),delete s[ee])};F>0?setTimeout(L,F):L()})}),Y(k)}let X=[],G=!1,Q=0,q=[],oe=[],fe=null,Re=e.maxQueueLength||1e4,ze=(b,j,k=m?100:1e4)=>setTimeout(()=>{v.delete(b),S.delete(b);let _=s[b];if(_){let A=j["#"],O={[A]:null};typeof j["."]=="string"&&(O[A]={[j["."]]:null}),_({put:O}),delete s[b]}},k),Ee=()=>{if(q.length===0){fe=null;return}let b=Date.now();if(G&&b<Q){fe=setTimeout(Ee,Math.min(1e3,Q-b));return}G&&b>=Q&&(console.log("Throttle period ended, resuming queue processing"),G=!1,Q=0);let j=q[0],k=nt(j),_=JSON.parse(j),A=_["#"],O=!k&&_.get&&!S.has(A);if(k||O?q.shift():!k&&_.put&&(q.shift(),oe.push(j)),A&&S.has(A)){let N=S.get(A);k?(v.has(A)&&(clearTimeout(v.get(A)),v.delete(A)),ze(A,N)):v.has(A)||v.set(A,ze(A,N,0))}q.length>0?fe=setTimeout(Ee,50):fe=null},nt=b=>{let j=!1;return X.forEach(k=>{if(k&&k.readyState===WebSocket.OPEN)k.send(b),j=!0;else{let _=k._retryHandler||Ge();if(k._retryHandler=_,_.shouldRetry()){let A=_.getDelay();_.increment(),setTimeout(()=>{k&&k.readyState===WebSocket.OPEN&&(_.reset(),k.send(b))},A)}}}),j},Ue=b=>{if(q.length>=Re)return{err:`Message queue exceeded maximum length (${Re}). Update query logic to request less data.`,queueLength:q.length,maxQueueLength:Re};q.push(b),fe||(fe=setTimeout(Ee,50))};return(!(e.peers instanceof Array)||e.peers.length===0)&&(e.peers=[`ws://localhost:${e.port||8765}`]),e.peers.forEach(b=>{let j=()=>{let k=new WebSocket(b);X.push(k);let _=Ge();k.onclose=A=>{if(X.indexOf(k)!==-1&&X.splice(X.indexOf(k),1),k=null,_.shouldRetry()){let O=m?50:_.getDelay();_.increment();let N=setTimeout(j,O);N.unref&&N.unref()}},k.onopen=()=>{_.reset(),oe.length>0&&(q=oe.concat(q),oe=[],fe||(fe=setTimeout(Ee,50)))},k.onerror=A=>{console.log(A)},k.onmessage=async A=>{let O=JSON.parse(A.data);if(t.check(O["#"]))return;if(O.throttle&&O.err){console.log(`Server throttling: ${O.err}`),G=!0,Q=Date.now()+O.throttle;return}if(t.track(O["#"]),O.get&&R(O,Ue),O.put){let U=new Map;for(let[L,ee]of Object.entries(O.put)){let H=await p(L);if(U.set(L,H),!(!H&&!a.has(L)||!ee||typeof ee!="object"))for(let[,re]of Object.entries(ee)){let ie=W.is(re);ie&&a.add(ie)}}let I={},F=[];for(let[L,ee]of Object.entries(O.put)){let H=U.get(L);a.has(L)&&(H=!0,F.push(L)),H&&(I[L]=ee)}if(Object.keys(I).length>0){let L={put:I,"#":O["#"]};await D(L,Ue)}F.forEach(L=>a.delete(L))}let N=O["@"],P=s[N];P&&(delete O["#"],delete O["@"],P(O),delete s[N])}};j()}),Y(Ue)},Pe=vt;var Tt=(e,t)=>{t||(t=Pe(e));let r=[],n=!1,s=!1,f=0,d=(l,y,S,v)=>{let p=u=>{f++,d(u,y,S,v)},m=u=>{r=[],f=0,s=!1,v(u)},o=()=>{if(r.length===0){m("Wrong username or password");return}let u=r.shift();t.get({"#":u,".":["auth","pub","epub"]},async w=>{if(w.err){m(`error getting ${u}: ${w.err}`);return}let c=w.put&&w.put[u];if(!c||!c.auth)return o();let h=JSON.parse(c.auth),T=await te.work(y,h.salt),g=await te.decrypt(h.enc,T);if(!g)return o();if(a.is={username:l,pub:c.pub,epub:c.epub,priv:g.priv,epriv:g.epriv},S!==""){let E=z.random(64),$=await te.work(S,E),C=await te.encrypt(g,$),M={auth:JSON.stringify({enc:C,salt:E})},x=Date.now(),R=await te.signTimestamp(x,a.is),D=ce(u,M,R,c.pub,x);t.put(D,B=>{m(B?`error putting ${M} on ${u}: ${B}`:null)});return}m(null)})};if(f>9){m("Wrong username or password");return}let i="~@"+l;t.get({"#":i},async u=>{if(u.err){m(`error getting ${i}: ${u.err}`);return}let w=u.put&&u.put[i];if(!w)return p(l);delete u.put[i]._,r=Object.keys(w),o()})},a={create:(l,y,S)=>{let v=m=>{S?S(m):console.log(m)};if(n){v("User is already being created");return}if(l===""){v("Please provide a username");return}if(y===""){v("Please provide a password");return}n=!0;let p="~@"+l;t.get({"#":p},async m=>{if(m.err){n=!1,v(`error getting ${p}: ${m.err}`);return}if(m.put&&m.put[p]){n=!1,v("Username already exists");return}let o=z.random(64),i=await te.work(y,o),u=await te.pair(),w={priv:u.priv,epriv:u.epriv},c=await te.encrypt(w,i),h={username:l,pub:u.pub,epub:u.epub,auth:JSON.stringify({enc:c,salt:o})},T="~"+u.pub,g=Date.now(),E=await te.signTimestamp(g,u),$=ce(T,h,E,u.pub,g);t.put($,C=>{if(n=!1,C){v(`error putting ${h} on ${T}: ${C}`);return}let M={[T]:{"#":T}};t.put(ce(p,M),x=>{if(x){v(`error putting ${M} on ${p}: ${x}`);return}S&&S(null)})})})},auth:(l,y,S)=>{let v=p=>{S?S(p):p&&console.log(p)};if(s){v("User is already authenticating");return}if(a.is=null,l===""){v("Please provide a username");return}if(y===""){v("Please provide a password");return}s=!0,d(l,y,"",v)},change:(l,y,S,v)=>{let p=m=>{v?v(m):m&&console.log(m)};if(s){p("User is already authenticating");return}if(a.is=null,l===""){p("Please provide a username");return}if(y===""){p("Please provide a password");return}if(S===""){p("Please provide a new password");return}s=!0,d(l,y,S,p)},store:l=>{if(!a.is){console.log("Please authenticate before calling store");return}if(l){typeof globalThis.localStorage<"u"&&globalThis.localStorage.setItem("user.is",JSON.stringify(a.is)),typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.removeItem("user.is");return}typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.setItem("user.is",JSON.stringify(a.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){a.is=JSON.parse(l);return}}if(typeof globalThis.sessionStorage<"u"){let l=globalThis.sessionStorage.getItem("user.is");l&&(a.is=JSON.parse(l))}},leave:()=>{a.is=null,typeof globalThis.localStorage<"u"&&globalThis.localStorage.removeItem("user.is"),typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.removeItem("user.is")},delete:(l,y,S)=>{let v=p=>{S?S(p):console.log(p)};if(s){v("User is already authenticating");return}if(l===""){v("Please provide a username");return}if(y===""){v("Please provide a password");return}s=!0,d(l,y,"",async p=>{if(p){v(p);return}let m={username:null,pub:null,epub:null,auth:null},o=Date.now(),i=await te.signTimestamp(o,a.is),u="~"+a.is.pub,w=ce(u,m,i,a.is.pub,o);t.put(w,c=>{if(c){v(`error putting null on ${u}: ${c}`);return}a.is=null,S&&S(null)})})}};return a},rt=Tt;var _t=e=>{typeof e=="string"?e={peers:[e]}:e instanceof Array?e={peers:e}:Z.is(e)||(e={});let t=Pe(e),r=rt(e,t),n=new Map,s=new Map,f=l=>l===null||l===!0||l===!1||typeof l=="string"||W.is(l)||Ae.is(l),d=l=>{if(f(l))return!0;if(Z.is(l)){let S=[];for(let[v,p]of Object.entries(l)){if(v==="_")return"error underscore cannot be used as a property name";if(Z.is(p)||f(p)){S.push(v);continue}return typeof p>"u"?`error undefined ${v} cannot be converted to a graph`:`error ${JSON.stringify({[v]:p})} cannot be converted to a graph`}if(S.length!==0)return S}return`error ${JSON.stringify(l)} cannot be converted to a graph`},a=l=>{let y=(o,i,u,w)=>{t.get(Z.put(o,"#",i),async c=>{c.err&&console.log(c.err),c.put&&c.put[i]?(delete c.put[i]._,delete c.put[i][K],delete c.put[i][he],await Promise.all(Object.keys(c.put[i]).map(async h=>{let T=W.is(c.put[i][h]);if(!T)return;let g=async(E=0)=>{let $=await new Promise(C=>{let M=z.random(),x=s.get(l);s.set(M,{chain:[{item:null,soul:T}],user:x?x.user:null}),a(M).next(null,C,w)});return $!==null||E>=5?$:(await new Promise(C=>setTimeout(C,50)),g(E+1))};c.put[i][h]=await g()})),u(c.put[i])):u(null)},w)},S=async(o,i,u,w)=>{if(u){let c=Date.now(),h=await te.signTimestamp(c,u);return ce(o,i,h,u.pub,c)}return e.secure?(w||(w=console.log),w(`error putting data on ${o}: user required in secure mode`),null):ce(o,i)},v=o=>i=>{let u=s.get(o);u&&typeof u.cb<"u"?setTimeout(()=>u.cb(i),1):i&&console.log("error no callback for data",i,"ctx",u),u&&!u.on&&s.delete(o)},p=(o,i,u,w,c,h,T=!0)=>{let g=null,E=()=>{if(!s.has(l)){t.off({"#":o,".":i},E),g&&clearTimeout(g);return}t.get({"#":o,".":i},$=>{let C=$.put&&$.put[o],M=W.is(C&&C[i]);if(!M){!T&&C&&C._&&typeof C[i]<"u"&&(g&&clearTimeout(g),t.off({"#":o,".":i},E),h(C[i]));return}g&&clearTimeout(g),t.off({"#":o,".":i},E),u.chain[w].soul=M,s.set(l,{...u}),T?a(l).on(c.on,h,c._get,c._opt):a(l).next(null,c.get,h,c._opt)},{...c._opt,secure:!!(u.user||e.secure)})};t.on({"#":o,".":i},E,!1,c._opt),T||(g=setTimeout(()=>{t.off({"#":o,".":i},E),h&&h(null)},31e3))},m=(o,i)=>{if(!o){console.log("error resolve request parameter required");return}let u=typeof o.get<"u",w=typeof o.put<"u",c=typeof o.on<"u",h=typeof o.off<"u",T=!1,g=s.get(l);if(!g)return{item:null,soul:null};for(var E=1;E<g.chain.length;E++)if(g.chain[E].soul===null){T=!0;break}if(T){let{item:$,soul:C}=g.chain[E-1];return t.get({"#":C,".":$},async M=>{if(M.err){console.log(`error getting ${$} on ${C}: ${M.err}`),i&&i(null);return}let x=M.put&&M.put[C];if(x&&typeof x[$]<"u"){let R=W.is(x[$]);if(R)g.chain[E].soul=R,s.set(l,{...g}),u?a(l).next(null,o.get,i,o._opt):w?a(l).put(o.put,i):c?a(l).on(o.on,i,o._get,o._opt):h&&a(l).off(i);else if(u)i(x[$]);else if(w){R=z.random(),x[$]=W.ify(R);let D=await S(C,x,g.user,i);if(D===null)return;t.put(D,B=>{if(B){i(`error putting ${$} on ${C}: ${B}`);return}g.chain[E].soul=R,a(l).put(o.put,i)})}else c?(p(C,$,g,E,o,i),o._get&&i(null)):h&&i&&i(null)}else if(w){let R=z.random();x||(x={}),x[$]=W.ify(R);let D=await S(C,x,g.user,i);if(D===null)return;t.put(D,B=>{if(B){i(`error putting ${$} on ${C}: ${B}`);return}g.chain[E].soul=R,a(l).put(o.put,i)})}else if(c)p(C,$,g,E,o,i),o._get&&i(null);else if(u&&x){let R=x._&&x._[">"];R&&Object.keys(R).length>0&&typeof R[$]>"u"?i&&i(null):p(C,$,g,E,o,i,!1)}else i&&i(null)},{...o._opt,secure:!!(g.user||e.secure)}),!1}return u&&g.chain[g.chain.length-1].item!==null?(g.chain.push({item:null,soul:null}),a(l).next(null,o.get,i,o._opt),!1):g.chain[g.chain.length-1]};return{get:(o,i,u,w)=>{if(typeof i=="function"&&(w=u,u=i,i=null),o===null||o===""||o==="_"){console.log("error please provide a key"),u&&u(null);return}if(i&&typeof u!="function"){console.log("error lex requires a callback function");return}if(l=z.random(),s.set(l,{chain:[{item:String(o),soul:"root"}],cb:u}),!u)return a(l);let c=v(l),{soul:h}=m({get:i,_opt:w},c);h&&y(i,h,c,w)},next:(o,i,u,w)=>{let c=E=>$=>{u?u($):v(E)($)};if(typeof i=="function"&&(w=u,u=i,i=null),!l){console.log("error please provide a key using get(key)"),u&&u(null);return}let h=c(l);if(o===""||o==="_"){h(null);return}if(i&&typeof u!="function"){console.log("error lex requires a callback function");return}let T=s.get(l);if(!T)return;if(u&&typeof T.cb>"u"&&(T.cb=u,u=null),o!==null&&T.chain.push({item:String(o),soul:null}),!T.cb)return a(l);let{soul:g}=m({get:i,_opt:w},h);g&&y(i,g,h,w)},put:(o,i,u)=>{typeof i=="function"&&(u=i,i=!1);let w=C=>M=>{u?u(M):v(C)(M)};if(!l){u&&u("error please provide a key using get(key)");return}let c=s.get(l);if(!c)return;!c.cb&&u&&(c.cb=u,u=null),i&&(o={[z.random()]:o});let h=w(l),T=d(o);if(typeof T=="string"){h(T);return}let{item:g,soul:E}=m({put:o,_opt:{put:!0}},h);if(!E)return;if(T===!0){t.get({"#":E,".":g},async C=>{if(C.err){h(`error getting ${E}: ${C.err}`);return}let M=C.put&&C.put[E],x=M&&M[g],R=W.is(x);if(!R){M||(M={}),M[g]=o;let D=await S(E,M,c.user,h);if(D===null)return;t.put(D,h);return}t.get({"#":R},async D=>{if(D.err){h(`error getting ${R}: ${D.err}`);return}if(!D.put||!D.put[R]){h(`error ${R} not found`);return}for(let Y of Object.keys(D.put[R])){if(Y==="_"||Y===K||Y===he)continue;let X=await new Promise(G=>{let Q=z.random(),q=[{item:Y,soul:R}];s.set(Q,{chain:q,user:c.user}),a(Q).put(null,G)});if(X){h(X);return}}M||(M={}),M[g]=o;let B=await S(E,M,c.user,h);B!==null&&t.put(B,h)})},{secure:!!(c.user||e.secure),put:!0});return}let $=(C=0)=>{t.get({"#":E,".":g},async M=>{if(M.err){h(`error getting ${E}.${g}: ${M.err}`);return}let x=M.put&&M.put[E],R=x&&x[g];if(!R&&C<5)return await new Promise(G=>setTimeout(G,50)),$(C+1);let D=W.is(R);if(!D){x||(x={}),x[g]=W.ify(z.random());let G=await S(E,x,c.user,h);if(G===null)return;t.put(G,Q=>{if(Q)h(`error putting ${g} on ${E}: ${Q}`);else{let q=z.random(),oe=[{item:g,soul:E}];s.set(q,{chain:oe,user:c.user,cb:c.cb}),a(q).put(o)}});return}let B=[];for(let G of T){let Q=await new Promise(q=>{if(Z.is(o[G])&&!W.is(o[G])){let oe=z.random(),fe=[{item:G,soul:D}];s.set(oe,{chain:fe,user:c.user}),a(oe).put(o[G],q)}else B.push(G),q(null)});if(Q){h(Q,l);return}}if(B.length===0){h(null);return}let Y={};B.forEach(G=>{Y[G]=o[G]});let X=await S(D,Y,c.user,h);X!==null&&t.put(X,h)},{secure:!!(c.user||e.secure),put:!0})};$()},on:(o,i,u,w)=>{if(typeof o=="function"&&(w=u,u=i,i=o,o=null),typeof i!="function"){console.log("error on() requires a callback function");return}if(!l){console.log("error please provide a key using get(key)"),i(null);return}let{item:c,soul:h}=m({on:o,_get:u,_opt:w},i);if(!h)return;let T=s.get(l);s.set(l,{chain:[{item:c,soul:h}],on:!0,user:T?T.user:null});let g=0,E=5,$=1e3,C=null;n.set(i,()=>{s.has(l)&&(clearTimeout(C),C=null,t.get({"#":h,".":c},x=>{let R=x.put&&x.put[h],D=R&&R[c],B=W.is(D);if(B){let Y=async(X=0)=>{let G=await new Promise(Q=>{let q=z.random();s.set(q,{chain:[{item:null,soul:B}],user:T?T.user:null}),a(q).next(null,Q,X===0?Z.put(w,"fast",!0):w)});G!==null||X>=5?(g=0,i(G)):(await new Promise(Q=>setTimeout(Q,50)),Y(X+1))};Y()}else if(!!R)g=0,i(D!==void 0?D:null);else if(g<E){let X=()=>{let G=Math.min($*Math.pow(2,g),3e4);g++,C=setTimeout(()=>{t.get({"#":h,".":c},Q=>{let q=Q.put&&Q.put[h];if(q){g=0,C=null;let oe=q[c];i(oe!==void 0?oe:null)}else g<E?X():(C=null,i(null))},{...w,secure:!!(T.user||e.secure)})},G)};X()}else i(null)},{...w,secure:!!(T.user||e.secure)}))});let M;o?(M=Z.put(o,"#",h),M["."]!=null&&typeof M["."]=="number"&&(M={...M,".":String(M["."])})):M={"#":h,".":c},t.on(M,n.get(i),!1,w),t.get({"#":h,".":c},x=>{if(x.err){console.log(`error getting ${h}.${c}: ${x.err}`);return}let R=x.put&&x.put[h]&&x.put[h][c],D=W.is(R);D&&(t.off(M,n.get(i)),t.on({"#":D,".":null},n.get(i),!1,w)),u&&n.get(i)()},{...w,secure:!!(T.user||e.secure)})},off:o=>{if(!l){console.log("error please provide a key using get(key)"),o&&o(null);return}let{item:i,soul:u}=m({off:!0},o);u&&(t.off({"#":u},n.get(o)),t.get({"#":u,".":i},w=>{if(w.err){n.delete(o),s.delete(l);return}let c=w.put&&w.put[u]&&w.put[u][i],h=W.is(c);h&&t.off({"#":h},n.get(o)),n.delete(o),s.delete(l)}))},user:()=>(r.get||(Object.assign(r,a()),r.get=(o,i,u,w)=>{typeof i=="function"&&(w=u,u=i,i=null);let c=null,h=null;if(r.is&&(c=r.is.pub),typeof o=="string"?h=o:o instanceof Array&&(o.length===2?(c=o[0],h=o[1]):o.length===1&&(h=o[0])),!c){console.log("error please log in or provide a public key"),u&&u(null);return}if(h===null||h===""||h==="_"){console.log("error please provide a key"),u&&u(null);return}if(i&&!u){console.log("error lex requires a callback function");return}l=z.random();let T=[{item:String(h),soul:"~"+c}];if(s.set(l,{chain:T,user:r.is,cb:u}),!u)return a(l);let g=v(l),{soul:E}=m({get:i,_opt:w},g);E&&y(i,E,g,w)}),r),wire:t,SEA:te}};return a()},rr=_t;export{rr as default};
|
|
1
|
+
var Ce={is:e=>{if(e instanceof Array)return!1;if(typeof e=="number")return!isNaN(e);if(typeof e=="string"){let t=parseFloat(e);return!isNaN(t)&&isFinite(t)}return!1}},Q={is:e=>{if(!e||typeof e!="object")return!1;let r=Object.prototype.toString.call(e).match(/^\[object (\w+)\]$/);return e.constructor===Object||r&&r[1]==="Object"},map:(e,t,r)=>{var n=Object.keys(e);for(let s=0;s<n.length;s++){let l=t(e[n[s]],n[s],r);if(typeof l<"u")return l}},put:(e,t,r)=>(e||(e={}),e[t]=r,e),del:(e,t)=>{if(e)return e[t]=null,delete e[t],e}},st=(e,t,r)=>{if(r.id){r.id=!1;return}if(t==="#"&&typeof e=="string"){r.id=e;return}r.id=!1},z={is:e=>{if(e&&e["#"]&&!e._&&Q.is(e)){let t={};if(Q.map(e,st,t),t.id)return t.id}return!1},ify:e=>Q.put({},"#",e)},ye="_holster_user_signature",B="_holster_user_public_key",ge=(e,t,r,n,s)=>{let l={[e]:{_:{"#":e,">":{}}}};for(let[h,p]of Object.entries(t))h!=="_"&&h!==B&&h!==ye&&(l[e][h]=p,l[e]._[">"][h]=s||Date.now());return r&&n&&s&&(l[e]._.s={[s]:r},l[e][B]=n,l[e]._[">"][B]=s),l},ce=(e,t)=>{if(typeof t>"u")return e===null;if(typeof e>"u")return!0;if(typeof e=="string")return e===t;if(Array.isArray(e))return e.includes(t);if(!Q.is(e)||!t)return!1;let r=e["*"];if(r)return t.slice(0,r.length)===r;let n=e[">"],s=e["<"];return n&&s?t>=n&&t<=s:n?t>=n:s?t<=s:!1},q={random:e=>{var t="";let r="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";e||(e=24);for(let n=0;n<e;n++)t+=r.charAt(Math.floor(Math.random()*r.length));return t}};var ot=()=>{let t={store:{}};return t.check=r=>t.store[r]?t.track(r):!1,t.track=r=>(t.store[r]=Date.now(),t.expiry||(t.expiry=setTimeout(()=>{let n=Date.now();Object.keys(t.store).forEach(s=>{n-t.store[s]>9e3&&delete t.store[s]}),t.expiry=null},9e3),t.expiry.unref&&t.expiry.unref()),r),t},qe=ot;var it=(e,t,r)=>{if(!e||typeof e!="object")throw new TypeError("lex must be an object");if(!t||typeof t!="object")throw new TypeError("graph must be an object");let n=e["#"];if(!n||typeof n!="string")throw new TypeError("soul must be a string");if(!t[n])return;let s={_:{"#":n,">":{}}},l={};if(typeof e["."]=="string"){let h=e["."];if(typeof t[n][h]>"u")return;s[h]=t[n][h],s._[">"][h]=t[n]._[">"][h];let p=t[n]._[">"][h];if(t[n]._.s&&t[n]._.s[p]&&(l[p]=t[n]._.s[p]),B&&typeof t[n][B]<"u"){s[B]=t[n][B],s._[">"][B]=t[n]._[">"][B];let a=t[n]._[">"][B];t[n]._.s&&t[n]._.s[a]&&(l[a]=t[n]._.s[a])}}else{if(!r)return;let h=!1;for(let p of Object.keys(t[n]))if(p!=="_"&&(p===B||ce(e["."],p))){s[p]=t[n][p],s._[">"][p]=t[n]._[">"][p];let a=t[n]._[">"][p];t[n]._.s&&t[n]._.s[a]&&(l[a]=t[n]._.s[a]),h=!0}if(!h)return}return Object.keys(l).length>0&&(s._.s=l),{[n]:s}},Ie=it;typeof btoa>"u"&&(globalThis.btoa=e=>Buffer.from(e,"binary").toString("base64"),globalThis.atob=e=>Buffer.from(e,"base64").toString("binary"));function $e(){}Object.assign($e,{from:Array.from});$e.prototype=Object.create(Array.prototype);$e.prototype.toString=function(e,t,r){if(e||(e="utf8"),t||(t=0),r=r?Math.min(Math.max(r,t),this.length):this.length,e==="hex"){let n=new Uint8Array(this.slice(t,r));return Array.from(n,s=>s.toString(16).padStart(2,"0")).join("")}if(e==="utf8")return Array.from({length:r-t},(n,s)=>{let l=this[s+t];return l<0||l>1114111?"\uFFFD":String.fromCharCode(l)}).join("");if(e==="base64"){let n=Array.from({length:r-t},(s,l)=>{let h=this[l+t];return h<0||h>255?"\uFFFD":String.fromCharCode(h)}).join("");return btoa(n)}};var de=$e;var xe={MAX_BUFFER_SIZE:10*1024*1024,MAX_STRING_LENGTH:1024*1024};function he(...e){return console.warn("new SafeBuffer() is deprecated, please use SafeBuffer.from()"),he.from(...e)}he.prototype=Object.create(Array.prototype);var Ee=(e,t)=>{if(typeof e!="string")throw new TypeError("Input must be a string for encoding: "+t);if(e.length>xe.MAX_STRING_LENGTH)throw new RangeError(`String too large: ${e.length} > ${xe.MAX_STRING_LENGTH}`)},le=(e,t="buffer operation")=>{if(e>xe.MAX_BUFFER_SIZE)throw new RangeError(`Buffer size too large for ${t}: ${e} > ${xe.MAX_BUFFER_SIZE}`)},ut=e=>{Ee(e,"hex");let t=e.replace(/\s/g,"").toLowerCase();if(!/^[0-9a-f]*$/.test(t))throw new TypeError("Invalid hex string: contains non-hex characters");if(t.length%2!==0)throw new TypeError("Invalid hex string: must have even length");if(t.length===0)return new Uint8Array(0);le(t.length/2,"hex parsing");let r=new Uint8Array(t.length/2);for(let n=0;n<t.length;n+=2){let s=t.substr(n,2);r[n/2]=parseInt(s,16)}return r},Xe=e=>{Ee(e,"utf8");try{let r=new TextEncoder().encode(e);return le(r.length,"UTF-8 encoding"),r}catch(t){throw new TypeError("Failed to encode UTF-8 string: "+t.message)}},lt=e=>{Ee(e,"binary"),le(e.length,"binary encoding");let t=new Uint8Array(e.length);for(let r=0;r<e.length;r++){let n=e.charCodeAt(r);if(n>255)throw new TypeError(`Invalid binary string: character at position ${r} exceeds byte range (${n} > 255)`);t[r]=n}return t},ft=e=>{Ee(e,"base64");let t=e.replace(/\s/g,"");if(!/^[A-Za-z0-9+/]*={0,2}$/.test(t))throw new TypeError("Invalid base64 string: contains invalid characters");try{let r=atob(t);le(r.length,"base64 decoding");let n=new Uint8Array(r.length);for(let s=0;s<r.length;s++)n[s]=r.charCodeAt(s);return n}catch(r){throw new TypeError("Failed to decode base64 string: "+r.message)}},Qe=e=>{let t;if(e instanceof ArrayBuffer)le(e.byteLength,"ArrayBuffer processing"),t=new Uint8Array(e);else if(ArrayBuffer.isView(e))le(e.byteLength||e.length,"TypedArray processing"),t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);else if(Array.isArray(e)){le(e.length,"Array processing");for(let r=0;r<e.length;r++){let n=e[r];if(typeof n!="number"||n<0||n>255||!Number.isInteger(n))throw new TypeError(`Invalid byte value at index ${r}: ${n} (must be integer 0-255)`)}t=new Uint8Array(e)}else if(typeof e=="object"&&e!==null&&typeof e.byteLength=="number")le(e.byteLength,"ArrayBuffer-like processing"),t=new Uint8Array(e);else if(typeof e=="object"&&e!==null&&typeof e.length=="number"){le(e.length,"array-like processing");let r=Array.from(e);for(let n=0;n<r.length;n++){let s=r[n];if(typeof s!="number"||s<0||s>255||!Number.isInteger(s))throw new TypeError(`Invalid byte value at index ${n}: ${s} (must be integer 0-255)`)}t=new Uint8Array(r)}else throw new TypeError("Unsupported input type: "+typeof e);return t};Object.assign(he,{from(){if(arguments.length===0)throw new TypeError("SafeBuffer.from() requires at least one argument");let t=arguments[0];if(t==null)throw new TypeError("First argument must not be null or undefined");let r;if(typeof t=="string"){let n=(arguments[1]||"utf8").toLowerCase();switch(n){case"hex":r=ut(t);break;case"utf8":case"utf-8":r=Xe(t);break;case"binary":case"latin1":r=lt(t);break;case"base64":r=ft(t);break;case"ascii":Ee(t,"ascii");for(let s=0;s<t.length;s++)if(t.charCodeAt(s)>127)throw new TypeError(`Invalid ASCII character at position ${s}: ${t.charCodeAt(s)} > 127`);r=Xe(t);break;default:throw new TypeError("Unknown encoding: "+n)}}else r=Qe(t);if(!r||r.length===0)return de.from(new Uint8Array(0));try{return de.from(r)}catch(n){throw new Error("Failed to create SafeBuffer: "+n.message)}},alloc(e,t=0){if(typeof e!="number"||!Number.isInteger(e)||e<0)throw new TypeError("Length must be a non-negative integer");if(le(e,"buffer allocation"),typeof t=="number"){if(t<0||t>255||!Number.isInteger(t))throw new TypeError("Fill value must be an integer between 0 and 255")}else if(typeof t=="string"){if(t.length!==1)throw new TypeError("Fill string must be exactly one character");if(t=t.charCodeAt(0),t>255)throw new TypeError("Fill character code must be <= 255")}else throw new TypeError("Fill must be a number or single character string");try{let r=new Uint8Array(e);return t!==0&&r.fill(t),de.from(r)}catch(r){throw new Error("Failed to allocate buffer: "+r.message)}},concat(e){if(!Array.isArray(e))throw new TypeError("First argument must be an array");if(e.length===0)return de.from(new Uint8Array(0));let t=0,r=[];for(let n=0;n<e.length;n++){let s=e[n];if(!s)throw new TypeError(`Array element at index ${n} is null or undefined`);let l;try{l=Qe(s)}catch(h){throw new TypeError(`Invalid array element at index ${n}: ${h.message}`)}t+=l.length,le(t,"buffer concatenation"),r.push(l)}try{let n=new Uint8Array(t),s=0;for(let l of r)n.set(l,s),s+=l.length;return de.from(n)}catch(n){throw new Error("Failed to concatenate buffers: "+n.message)}},isBuffer(e){return e instanceof de||e&&typeof e=="object"&&e.constructor===he},byteLength(e,t="utf8"){if(typeof e!="string")throw new TypeError("First argument must be a string");switch(t.toLowerCase()){case"utf8":case"utf-8":return new TextEncoder().encode(e).length;case"ascii":case"binary":case"latin1":return e.length;case"base64":let r=e.replace(/\s/g,"");return Math.floor(r.length*3/4)-(r.match(/=/g)||[]).length;case"hex":return Math.floor(e.replace(/\s/g,"").length/2);default:throw new TypeError("Unknown encoding: "+t)}}});he.prototype.from=he.from;he.prototype.toString=function(e="utf8",t=0,r=this.length){if(typeof e!="string")throw new TypeError("Encoding must be a string");if(typeof t!="number"||!Number.isInteger(t)||t<0)throw new TypeError("Start must be a non-negative integer");if(typeof r!="number"||!Number.isInteger(r)||r<t)throw new TypeError("End must be an integer >= start");try{return de.prototype.toString.call(this,e,t,r)}catch(n){throw new Error("Failed to convert buffer to string: "+n.message)}};var oe=he;var at=typeof process<"u"&&process.versions?.node!=null,Ze=at?(await import("node:crypto")).webcrypto:globalThis.crypto,W=Ze.subtle,Me=e=>typeof e=="string"?e:JSON.stringify(e),ke=e=>{try{return JSON.parse(e)}catch{return e}},Ne=e=>{let t=new Uint8Array(oe.alloc(e));return oe.from(Ze.getRandomValues(t))},we=(e,t)=>{let[r,n]=e.split(".");return{kty:"EC",crv:"P-256",x:r,y:n,d:t,ext:!0,key_ops:t?["sign"]:["verify"]}},Se=async e=>{let t=await W.digest({name:"SHA-256"},new TextEncoder().encode(Me(e)));return oe.from(t)},De=async(e,t)=>{let r=e+t.toString("utf8"),n=oe.from(await Se(r),"binary"),s=ct(n);return await W.importKey("jwk",s,{name:"AES-GCM"},!1,["encrypt","decrypt"])},ct=e=>({kty:"oct",k:e.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/\=/g,""),ext:!1,alg:"A256GCM"});var dt={pair:async e=>{let t=await W.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]).then(async s=>{let l=await W.exportKey("jwk",s.publicKey);return{priv:(await W.exportKey("jwk",s.privateKey)).d,pub:l.x+"."+l.y}}),r=await W.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveKey"]).then(async s=>{let l=await W.exportKey("jwk",s.publicKey);return{epriv:(await W.exportKey("jwk",s.privateKey)).d,epub:l.x+"."+l.y}}),n={pub:t.pub,priv:t.priv,epub:r.epub,epriv:r.epriv};return e&&e(n),n},encrypt:async(e,t,r)=>{if(!t||!t.epriv)return r&&r(null),null;let n={s:Ne(9),iv:Ne(15)},s=await De(t.epriv,n.s).then(h=>W.encrypt({name:"AES-GCM",iv:new Uint8Array(n.iv)},h,new TextEncoder().encode(Me(e)))),l={ct:oe.from(s,"binary").toString("base64"),iv:n.iv.toString("base64"),s:n.s.toString("base64")};return r&&r(l),l},decrypt:async(e,t,r)=>{if(!e||!e.ct||!e.iv||!e.s||!t||!t.epriv)return r&&r(null),null;let n={ct:oe.from(e.ct,"base64"),iv:oe.from(e.iv,"base64"),s:oe.from(e.s,"base64")};try{let s=await De(t.epriv,n.s).then(h=>W.decrypt({name:"AES-GCM",iv:new Uint8Array(n.iv),tagLength:128},h,new Uint8Array(n.ct))),l=ke(new TextDecoder("utf8").decode(s));return r&&r(l),l}catch{return r&&r(null),null}},verify:async(e,t,r)=>{if(!t||!t.pub)return r&&r(null),null;let n=ke(e),s=await W.importKey("jwk",we(t.pub),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]),l={};if(typeof n.m=="string")l=n.m;else for(let u of Object.keys(n.m).sort())u!=="_"&&u!==B&&u!==ye&&(l[u]=n.m[u]);let h=await Se(l),p=new Uint8Array(oe.from(n.s,"base64")),a={name:"ECDSA",hash:{name:"SHA-256"}};if(await W.verify(a,s,p,new Uint8Array(h))){let u=ke(n.m);return r&&r(u),u}return r&&r(null),null},sign:async(e,t,r)=>{if(!t||!t.pub||!t.priv)return r&&r(null),null;let n={};if(typeof e=="string")n=e;else{let u=ke(e);for(let v of Object.keys(u).sort())v!=="_"&&v!==B&&v!==ye&&(n[v]=u[v])}let s=await Se(n),l=we(t.pub,t.priv),h={name:"ECDSA",namedCurve:"P-256"},p=await W.importKey("jwk",l,h,!1,["sign"]).then(u=>W.sign({name:"ECDSA",hash:{name:"SHA-256"}},u,new Uint8Array(s))),a={m:n,s:oe.from(p,"binary").toString("base64")};return r&&r(a),a},signTimestamp:async(e,t,r)=>{if(!t||!t.pub||!t.priv)return r&&r(null),null;let n=e.toString(),s=await Se(n),l=we(t.pub,t.priv),h={name:"ECDSA",namedCurve:"P-256"},p=await W.importKey("jwk",l,h,!1,["sign"]).then(u=>W.sign({name:"ECDSA",hash:{name:"SHA-256"}},u,new Uint8Array(s))),a=oe.from(p,"binary").toString("base64");return r&&r(a),a},verifyTimestamp:async(e,t,r,n)=>{if(!r||!e||!t)return n&&n(!1),!1;try{let s=e.toString(),l=await Se(s),h=await W.importKey("jwk",we(r),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]),p=new Uint8Array(oe.from(t,"base64")),a={name:"ECDSA",hash:{name:"SHA-256"}},u=await W.verify(a,h,p,new Uint8Array(l));return n&&n(u),u}catch(s){return console.log(`error verifying timestamp signature: ${s.message}`),n&&n(!1),!1}},work:async(e,t,r)=>{typeof t=="function"&&(r=t,t=void 0),typeof t>"u"&&(t=Ne(9));let n=await W.importKey("raw",new TextEncoder().encode(Me(e)),{name:"PBKDF2"},!1,["deriveBits"]),s={name:"PBKDF2",iterations:1e5,salt:new TextEncoder().encode(t),hash:{name:"SHA-256"}},l=await W.deriveBits(s,n,512),h={epriv:oe.from(l,"binary").toString("base64")};return r&&r(h),h},secret:async(e,t,r)=>{if(!e||!e.epub||!t||!t.epub||!t.epriv)return r&&r(null),null;let n={name:"ECDH",namedCurve:"P-256"},s=we(e.epub),l=await W.importKey("jwk",s,n,!0,[]),h=we(t.epub,t.epriv,!1);delete h.key_ops;let p=await W.importKey("jwk",h,n,!1,["deriveBits"]).then(async a=>{let u=await W.deriveBits({public:l,name:"ECDH",namedCurve:"P-256"},a,256),v=await W.importKey("raw",new Uint8Array(u),{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]);return W.exportKey("jwk",v).then(({k:T})=>T)});return r&&r({epriv:p}),{epriv:p}}},ne=dt;var ht=1e4,Le=(e,t,r,n,s=!1)=>e<t?{historical:!0}:e>t?{incoming:!0}:s&&r!==n?{historical:!0}:(typeof r!="string"&&(r=JSON.stringify(r)||""),typeof n!="string"&&(n=JSON.stringify(n)||""),r===n?{state:!0}:r<n?{current:!0}:{incoming:!0});Le.mix=async(e,t,r,n,s,l=ht)=>{if(!e||typeof e!="object")throw new TypeError("change must be an object");if(!t||typeof t!="object")throw new TypeError("graph must be an object");if(!s||typeof s!="object")throw new TypeError("listen must be an object");let h=Date.now(),p={},a={},u=[],v=new Map,T=new Map,m=0;for(let d of Object.keys(e)){let _=e[d],o=!1,i=!1,f=0,y=n;if(!_||!_._)continue;let c=_[B];if(_._.s&&c&&(y=!0),d.length>1&&d[0]==="~")if(d[1]==="@")i=!0,y=!1;else{if(c&&d!="~"+c){console.log(`error public key does not match for soul: ${d}`);continue}y=!0}if(y){if(!c||!_._)continue;let g=new Set,O=new Set,S=Object.entries(_._[">"]||{});for(let[x,K]of Object.entries(_._.s||{})){let $=Number(x);if(!isNaN($)&&$>0){let M=S.filter(([,D])=>Number(D)===$);if(M.length>0&&M.every(([D])=>(t[d]&&t[d]._[">"]?t[d]._[">"][D]:0)>$))continue;if(await ne.verifyTimestamp($,K,c)){g.add($);for(let[D,Z]of S)Number(Z)===$&&O.add(D)}}}if(O.size===0)continue;v.set(d,O),T.set(d,g)}for(let g of Object.keys(_)){if(g==="_"||v.has(d)&&!v.get(d).has(g))continue;let O=_[g],S=_._&&_._[">"]?_._[">"][g]:0,x=(t[d]||{})[g],K=(t[d]||{_:{">":{}}})._[">"][g]||0;if(i&&g!==z.is(O)){console.log(`error alias ${i}: ${g} !== ${z.is(O)}`);continue}let $=S-h;if($>0){if($>864e5)continue;(m===0||$<m)&&(m=f=$),a[d]||(a[d]={_:{"#":d,">":{},s:{}}}),a[d][g]=O,a[d]._[">"][g]=S,_._.s&&_._.s[S]&&(a[d]._.s[S]=_._.s[S])}else{let M=T.has(d)&&T.get(d).has(S);Le(S,K,O,x,M).incoming&&(p[d]||(p[d]={_:{"#":d,">":{},s:{}}}),t[d]||(t[d]={_:{"#":d,">":{},s:{}}}),t[d][g]=p[d][g]=O,t[d]._[">"][g]=p[d]._[">"][g]=S,_._.s&&_._.s[S]&&(t[d]._.s[S]=p[d]._.s[S]=_._.s[S]),s[d]&&s[d].filter(U=>ce(U["."],g)).forEach(U=>u.push(U.cb)),o=!0)}}o&&s[d]&&s[d].filter(g=>ce(g["."])).forEach(g=>u.push(g.cb))}let w=Object.keys(t);return w.length>l&&w.map(o=>{let i=t[o]._&&t[o]._[">"],f=i?Math.max(...Object.values(i)):0;return{soul:o,maxState:f}}).sort((o,i)=>o.maxState-i.maxState).slice(0,w.length-l).forEach(({soul:o})=>{delete t[o],r&&r.delete(o)}),{now:p,defer:a,wait:m,listeners:u}};var Be=Le;var fe="",ve="",Ve=()=>{let e=(t,r,n)=>{if(n||(e[fe]||(e[fe]={}),n=e[fe]),!t)return n;let s=0,l={},h=t[s],p=t.length-1,a=typeof r>"u",u=n[h];for(;!u&&s<p;)h+=t[++s],u=n[h];if(u)if(s===p){if(a)return typeof u[ve]>"u"?u[fe]:u[ve];u[ve]=r}else return!u[fe]&&!a&&(u[fe]={}),e(t.slice(++s),r,u[fe]);else{if(a)return Q.map(n,(w,d)=>{let _=0,o="";for(;d[_]===t[_];)o+=d[_++];if(o)return _<=p?void 0:(l[d.slice(_)]=w,w)})?l:void 0;let v=null,T="";for(let m of Object.keys(n)){let w=0,d="";for(;m[w]===t[w];)d+=m[w++];d.length>T.length&&(v=m,T=d)}if(v){let m=n[v],w=T.length,d={[v.slice(w)]:m,[t.slice(w)]:{[ve]:r}};n[T]={[fe]:d},delete n[v]}else n[h]||(n[h]={}),n[h][ve]=r}};return e};Ve.map=function e(t,r,n,s){s||(s=[]);var l=t[fe]||t,h=Object.keys(l).sort(),p;for(let a=0;a<h.length;a++){let u=h[a],v=l[u],T=v[ve];if(typeof T<"u"){if(T=r(T,s.join("")+u,u,s),typeof T<"u")return T}else n&&r(p,s.join(""),u,s);if(v[fe]){if(s.push(u),T=e(v[fe],r,n,s),typeof T<"u")return T;s.pop()}}};var ie=Ve;var Fe="",Pe="",ee="",be=e=>{var t;let r=new Map,n=null,s=0,l=1e4,h=new Map,p=0,a=3e4,u=.8,v=.9;if(e||(e={}),e.log||(e.log=console.log),e.batch||(e.batch=100),e.write||(e.write=1),e.size||(e.size=1024*1024),e.memoryLimit||(e.memoryLimit=500),typeof e.cache>"u"&&(e.cache=!0),!e.store){e.log("Radisk needs `store` interface with `{get: fn, put: fn, list: fn}`");return}if(!e.store.get){e.log("Radisk needs `store.get` interface with `(file, cb)`");return}if(!e.store.put){e.log("Radisk needs `store.put` interface with `(file, data, cb)`");return}if(!e.store.list){e.log("Radisk needs a streaming `store.list` interface with `(cb)`");return}let T=()=>{if(typeof process>"u"||!process.memoryUsage)return;let w=Date.now();if(w-p<a)return;p=w;let d=process.memoryUsage(),_=d.heapUsed,o=d.heapTotal,i=e.memoryLimit*1024*1024,f=_/i;if(f>v){let y=r.size;console.log(`[RADISK-MEMORY] High memory usage: ${Math.round(f*100)}% of heap limit. Clearing ${y} cached files.`),r.clear(),global.gc&&global.gc(),p=w+a}else f>u&&console.log(`[RADISK-MEMORY] Memory warning: ${Math.round(f*100)}% of heap limit used. Cache size: ${r.size} files.`)},m=(w,d,_)=>{if(w=""+w,typeof d=="function"){if(_=d,d=m.batch(w),typeof d<"u"||m.thrash.at&&(d=m.thrash.at(w),typeof d<"u"))return _(t,d);if(h.has(w)){h.get(w).push(_);return}h.set(w,[_]);let o=setTimeout(()=>{let i=h.get(w);i&&(e.log(`radisk read hang detected for key: ${w}`),h.delete(w),i.forEach(f=>f(null,null)))},3e4);return m.read(w,(i,f)=>{clearTimeout(o);let y=h.get(w)||[];h.delete(w),y.forEach(c=>c(i,f))})}if(m.batch(w,d),T(),_&&m.batch.acks.push(_),++m.batch.ed>=e.batch)return m.thrash();clearTimeout(m.batch.timeout),m.batch.timeout=setTimeout(m.thrash,e.write)};return m.batch=ie(),m.batch.acks=[],m.batch.ed=0,m.thrash=()=>{if(m.thrash.ing)return m.thrash.more=!0;clearTimeout(m.batch.timeout),m.thrash.more=!1,m.thrash.ing=!0;var w=m.thrash.at=m.batch;m.batch=null,m.batch=ie(),m.batch.acks=[],m.batch.ed=0,m.save(w,d=>{d&&e.log(d),w.acks.forEach(_=>_(d)),m.thrash.at=null,m.thrash.ing=!1,m.thrash.more&&m.thrash()})},m.save=(w,d)=>{let _={find:(o,i)=>{if(i<_.start)return;_.start=i;let f=[];return e.store.list(y=>{if(y){f.push(y);return}f.sort(),_.lex(f)}),!0},lex:o=>{if(!_.start)return;let i=null;for(let f of o){if(f>_.start){_.mix(i||"!",_.start,f);return}i=f}_.mix(i||"!",_.start,t)},mix:(o,i,f)=>{if(_.start=t,r.has(o)){let y=r.get(o);ie.map(w,(c,g)=>{if(!(g<i)){if(f&&f<g)return _.start=g,!0;y(g,c)}}),m.write(o,y,_.next)}else m.parse(o,(y,c)=>{if(y)return d(y);ie.map(w,(g,O)=>{if(!(O<i)){if(f&&f<O)return _.start=O,!0;c(O,g)}}),e.cache&&r.set(o,c),m.write(o,c,_.next)})},next:o=>{if(o)return d(o);if(_.start)return ie.map(w,_.find);d(o)}};ie.map(w,_.find)},m.write=(w,d,_)=>{let o=1,i=null,f=c=>{c&&!i&&(i=c),!(--o>0)&&_(i)},y={text:"",limit:"",done:!1,count:0,halfKey:"",halfOffset:0,each:(c,g,O,S)=>{if(y.done)return;y.count++,c=typeof c>"u"?"":"="+be.encode(c);let x=be.encode(S.length)+"#"+be.encode(O)+c+`
|
|
2
|
+
`,K=S.length===0||S.length===1&&O.includes(Pe);if(!y.halfKey&&y.count>1&&y.text.length>e.size/2&&K){let $=S.join("")+O,M=$.indexOf(Pe);y.halfKey=M===-1?$:$.substring(0,M),y.halfOffset=y.text.length}if(y.count>1&&y.text.length+x.length>e.size&&K){let $=S.join("")+O,M=$.indexOf(Pe);if(y.limit=y.halfKey||(M===-1?$:$.substring(0,M)),y.limit!==w){y.halfKey&&(y.text=y.text.substring(0,y.halfOffset)),y.done=!0,y.sub=ie(),ie.map(d,y.slice),o++,m.write(y.limit,y.sub,f);return}}y.text+=x},slice:(c,g)=>{g<y.limit||y.sub(g,c)}};ie.map(d,y.each,!0),e.store.put(w,y.text,c=>{y.done&&(r.delete(w),n=null),f(c)})},m.read=(w,d)=>{let _=w.indexOf(Pe),o=_===-1?w:w.substring(0,_),i=c=>{let g=0,O=c.length-1,S=null;for(;g<=O;){let x=g+O>>1;c[x]<=o?(S=c[x],g=x+1):O=x-1}return S},f=c=>{if(!c){d("no file found",t);return}if(e.cache&&r.has(c))return d(t,r.get(c)(w));m.parse(c,(g,O)=>{g&&e.log(g),O&&e.cache&&!r.has(c)&&(r.set(c,O),T()),d(g,O?O(w):t)})},y=Date.now();if(e.cache&&n&&y-s<l)f(i(n,o));else{let c=[];e.store.list(g=>{if(g){c.push(g);return}c.sort(),e.cache&&(n=c,s=y),f(i(c,o))})}},m.parse=(w,d)=>{let _={disk:ie(),read:(o,i)=>{if(o)return d(o);if(!i)return d(t,_.disk);let f=[],y="",c=_.split(i);for(;c;){let g,O,S=c[1];c=_.split(c[2])||"",c[0]==="#"&&(g=c[1],S<f.length&&(f.length=S),S<=f.length&&(f[S]=g,f.length=S+1),y=f.join("")),c=_.split(c[2])||"",c[0]!==`
|
|
3
|
+
`&&(c[0]==="="&&(O=c[1]),typeof g<"u"&&typeof O<"u"&&_.disk(y,O),c=_.split(c[2]))}d(t,_.disk)},split:o=>{if(!o)return;let i=o.indexOf(ee);if(i===-1)return;let f=o.slice(0,i),y={};return[f,be.decode(o.slice(i),y),o.slice(i+y.i)]}};e.store.get(w,_.read)},m};be.encode=e=>{let t="",r="";if(e instanceof Array&&(e.length===2||e.length===3)&&(t=Fe+e[1],e.length===3&&e[2]&&(r=Fe+e[2]),e=e[0]),typeof e=="string"){let s=0,l=null,h=ee;for(;l=e[s++];)l===ee&&(h+=ee);return h+'"'+e+t+r+ee}let n=z.is(e);if(n)return ee+"#"+n+t+r+ee;if(Ce.is(e))return ee+"+"+(e||0)+t+r+ee;if(e===!0)return ee+"+"+t+r+ee;if(e===!1)return ee+"-"+t+r+ee;if(e===null)return ee+" "+t+r+ee};be.decode=(e,t)=>{var r=-1,n=0,s=null,l=null,h=-1,p=-1;if(e[0]!==ee)return;for(;s=e[++r];)if(l){if(h===-1&&(h=r),s===ee&&--n<=0){p=r;break}}else s===ee?n++:l=s||!0;let a=h!==-1?e.slice(h,p!==-1?p:r):"";t&&(t.i=r+1);let u=a.split(Fe),v=u[0],T=u[1],m=u[2];if(T)if(T=parseFloat(T),m){if(l==='"')return[v,T,m];if(l==="#")return[z.ify(v),T,m];if(l==="+")return v.length===0?[!0,T,m]:[parseFloat(v),T,m];if(l==="-")return[!1,T,m];if(l===" ")return[null,T,m]}else{if(l==='"')return[v,T];if(l==="#")return[z.ify(v),T];if(l==="+")return v.length===0?[!0,T]:[parseFloat(v),T];if(l==="-")return[!1,T];if(l===" ")return[null,T]}else{if(l==='"')return a;if(l==="#")return z.ify(a);if(l==="+")return a.length===0?!0:parseFloat(a);if(l==="-")return!1;if(l===" ")return null}};var Ye=be;var et=typeof process<"u"&&process.versions?.node!=null,pe=et?await import("node:fs"):void 0,He="",Re="",Je=Re+"+0"+Re+"#"+Re+'"root'+Re,pt=e=>{let t=e.file;if(et)return pe.existsSync(t)||pe.mkdirSync(t),pe.existsSync(t+"/!")||pe.writeFileSync(t+"/!",Je),{get:(r,n)=>{pe.readFile(t+"/"+r,(s,l)=>{if(s){if(s.code==="ENOENT"){n();return}console.log("fs.readFile error:",s)}l&&(l=l.toString()),n(s,l)})},put:(r,n,s)=>{var l=r+"."+q.random(9)+".tmp";pe.writeFile(l,n,h=>{if(h){console.log("fs.writeFile error:",h),s(h);return}pe.rename(l,t+"/"+r,s)})},list:r=>{pe.readdir(t,(n,s)=>{if(n){console.log("fs.readdir error:",n),r();return}s.forEach(r),r()})}};if(e.indexedDB){let r,n=new Promise((s,l)=>{let h=indexedDB.open(t,1);h.onupgradeneeded=p=>{p.target.result.createObjectStore(t)},h.onerror=p=>{console.log(p),l(p)},h.onsuccess=()=>{if(r=h.result,r){let a=r.transaction([t],"readonly").objectStore(t).getKey("!");a.onerror=()=>{console.log(`error getting key ${t}/!`),l(a.error)},a.onsuccess=()=>{if(a.result)s();else{let v=r.transaction([t],"readwrite").objectStore(t).put(Je,"!");v.onerror=()=>{console.log(`error putting root on ${t}/!`),l(v.error)},v.onsuccess=()=>{s()}}}}else console.log("error indexedDB not available"),l(new Error("indexedDB not available"))}});return{get:(s,l)=>{let h=(p,a)=>{let v=r.transaction([t],"readonly").objectStore(t).get(p);v.onerror=()=>{console.log(`error getting ${t}/${p}`),a(v.error)},v.onsuccess=()=>{a(null,v.result)}};n.then(()=>{h(s,l)}).catch(p=>{l(p)})},put:(s,l,h)=>{let p=(a,u,v)=>{let m=r.transaction([t],"readwrite").objectStore(t).put(u,a);m.onerror=()=>{console.log(`error putting data on ${t}/${a}`),v(m.error)},m.onsuccess=()=>{v(null)}};n.then(()=>{p(s,l,h)}).catch(a=>{h(a)})},list:s=>{let l=h=>{let a=r.transaction([t],"readonly").objectStore(t).getAllKeys();a.onerror=()=>{console.log("error getting keys for",t),h()},a.onsuccess=()=>{a.result.forEach(h),h()}};n.then(()=>{l(s)}).catch(h=>{console.log("error indexedDB not available:",h),s()})}}}return{get:(r,n)=>{n(null,Je)},put:(r,n,s)=>{s(null)},list:r=>{r("!"),r()}}},yt=e=>{Q.is(e)||(e={}),e.file=String(e.file||"radata"),e.store||(e.store=pt(e));let t=Ye(e);return{get:(r,n)=>{if(!r||!Q.is(r)){n("lex required");return}if(!r["#"]){n("soul required in lex");return}var s=r["#"],l=typeof r["."]=="string"?r["."]:"",h,p={};let a=(w,d)=>{d!==B&&!ce(r["."],d)||(h||(h={_:{"#":s,">":{}}}),h[d]=w[0],h._[">"][d]=w[1],w.length===3&&w[2]&&(p[w[1]]=w[2]))},u=l!==""&&l!==B,v=u?2:1,T=null,m=w=>{if(w&&!T&&(T=w),--v>0)return;let d={[s]:h};h&&Object.keys(p).length>0&&(h._.s=p),n(T,d)};t(s+He+l,(w,d)=>{Q.is(d)?(ie.map(d,a),h||a(d,l)):d&&a(d,l),m(w)}),u&&t(s+He+B,(w,d)=>{d&&!Q.is(d)&&a(d,B),m(w)})},put:(r,n)=>{if(!r){n("graph required");return}let s=0,l=!1,h=p=>{if(s--,!l){if(p){l=!0,n(p);return}s===0&&(l=!0,n(null))}};Object.keys(r).forEach(p=>{var a=r[p];Object.keys(a).forEach(u=>{if(u==="_")return;s++;let v=a[u],T=a._[">"][u],m=a._.s&&a._.s[T],w=m?[v,T,m]:[v,T];t(p+He+u,w,h)})})}}};var tt=yt;var Te=typeof process<"u"&&process.versions?.node!=null,ze=Te?await import("ws"):void 0,Ge=Te?await import("node:fs"):void 0;typeof globalThis.WebSocket>"u"&&(globalThis.WebSocket=ze?.WebSocket);var mt=e=>{let t=new Map,r=1500,n=6e4,s=10,l=null;return e||(l=setInterval(()=>{let p=Date.now();for(let[a,u]of t.entries())p-u.lastCleanup>n&&(u.requests=[],u.lastCleanup=p),u.requests=u.requests.filter(v=>p-v<n),p-u.lastCleanup>n*10&&(u.throttleCount=0)},n/4)),{getDelay:p=>{let a=Date.now(),u=t.get(p)||{requests:[],lastCleanup:a,throttleCount:0};if(u.requests=u.requests.filter(v=>a-v<n),u.requests.length>=r){let v=Math.min(...u.requests),T=n-(a-v);return u.throttleCount=(u.throttleCount||0)+1,t.set(p,u),Math.max(0,T)}return u.requests.push(a),t.set(p,u),0},getRemainingRequests:p=>{let a=t.get(p);if(!a)return r;let u=Date.now(),v=a.requests.filter(T=>u-T<n);return Math.max(0,r-v.length)},getThrottleCount:p=>{let a=t.get(p);return a&&a.throttleCount||0},shouldDisconnect:p=>{let a=t.get(p);return a?a.throttleCount>=s:!1},destroy:()=>{l&&(clearInterval(l),l=null),t.clear()}}},wt=(e,t=1024*1024)=>{try{if(typeof e=="string"&&e.length>t)throw new Error("Message too large");return{success:!0,data:JSON.parse(e)}}catch(r){return{success:!1,error:r.message}}},bt=(e,t=1024*1024)=>typeof e=="string"&&e.length>t?{valid:!1,error:"Message too large"}:Buffer.isBuffer(e)&&e.length>t?{valid:!1,error:"Message too large"}:{valid:!0},St=(e=1e3)=>{let t=new Set;return{add:r=>{if(t.size>=e)return!1;t.add(r);let n=r.close;return r.close=(...s)=>(t.delete(r),n.apply(r,s)),!0},remove:r=>{t.delete(r)},count:()=>t.size,isFull:()=>t.size>=e}},We=(e=5)=>{let t=0;return{shouldRetry:()=>t<e,getDelay:()=>Math.min(1e3*Math.pow(2,t),3e4),increment:()=>t++,reset:()=>t=0}},vt=e=>{let t=qe(),r=tt(e),n={},s={},l={},h=new Set,p=new Set,a=new Map,u=1e4,v=new Map,T=new Map,m=async b=>n[b]?!0:new Promise(j=>{r.get({"#":b},(k,E)=>{j(!k&&E&&E[b])})}),w=Te&&globalThis.WebSocket!==ze?.WebSocket,d=mt(w),_=St(e.maxConnections||1e3),i=(typeof e.defaultLimit=="number"?e.defaultLimit:1)*1048576,f=new Map,y=new Map,c=null,g=b=>{Ge.readFile(`${e.file}/../.user_storage.json`,"utf8",(j,k)=>{if(j){b&&b();return}try{let E=JSON.parse(k);f.clear();for(let[A,C]of Object.entries(E))typeof C=="number"&&f.set(A,C)}catch{}b&&b()})},O=()=>{if(c)return;let b=setTimeout(()=>{c=null;let j={};for(let[k,E]of f)j[k]=E;Ge.writeFile(`${e.file}/../.user_storage.json`,JSON.stringify(j),k=>{k&&console.warn("saveUserStorage error:",k)})},5e3);b.unref&&b.unref(),c=b},S=b=>{Ge.readFile(`${e.file}/../.user_limit.json`,"utf8",(j,k)=>{if(j){b&&b();return}try{let E=JSON.parse(k);y.clear();for(let[A,C]of Object.entries(E))typeof C=="number"&&y.set(A,C*1048576)}catch{}b&&b()})},x=b=>b<1024?`${b} B`:b<1048576?`${(b/1024).toFixed(1)} KB`:b<1073741824?`${(b/1048576).toFixed(1)} MB`:`${(b/1073741824).toFixed(1)} GB`,K=()=>{let b=f.size,j=i===0?"unlisted users blocked":x(i);console.log(`[HOLSTER] Per-user storage limits enabled (${b} user${b!==1?"s":""}, default: ${j})`);let k=[...f.entries()].sort(([,A],[,C])=>C-A),E=A=>{let C=f.get(A)??0,N=y.get(A)??i,P=N===0?"blocked":x(N);console.log(` ${A.slice(0,16)}... used: ${x(C)} / limit: ${P}`)};b<=5?k.forEach(([A])=>E(A)):(console.log(" Top 5 by storage used:"),k.slice(0,5).forEach(([A])=>E(A))),console.log("Run npx holster-user-storage to view full keys and all users")},$=async(b,j,k)=>{let E=B;for(let A of Object.keys(b)){let C=b[A];if(C[E]===void 0)continue;let N=await new Promise(I=>{U({"#":A},I,j,{put:!0})});if(N.err)return k&&k(N.err),!1;let P=N.put&&N.put[A];if(!(!P||P[E]===void 0||P[E]===C[E]))return k&&k(`error in wire check public key does not match for soul: ${A}`),!1}return!0},M=(b,j)=>{let k=Ie(b.get,n);k?j(JSON.stringify({"#":t.track(q.random(9)),"@":b["#"],put:k})):r.get(b.get,(E,A)=>{j(JSON.stringify({"#":t.track(q.random(9)),"@":b["#"],put:A,err:E}))})},R=async(b,j)=>{let k={};if(e.userLimit)for(let[C,N]of Object.entries(b.put))N&&N[B]&&n[C]&&(k[C]=JSON.stringify(n[C]).length);if(!await $(b.put,j))return;let E=await Be.mix(b.put,n,h,e.secure,l,e.maxGraphSize);if(Object.keys(E.now).length===0){Object.keys(E.defer).length!==0&&setTimeout(()=>R({put:E.defer,"#":b["#"]},j),E.wait);return}let A=C=>{C&&console.warn("store.put",C),j(JSON.stringify({"#":t.track(q.random(9)),"@":b["#"],err:C})),E.listeners.forEach(N=>N())};if(!e.userLimit)r.put(E.now,A);else{let C={};for(let[N,P]of Object.entries(E.now)){let I=P[B];if(!I){C[N]=P;continue}let L=y.get(I)??i;if((f.get(I)??0)>=L)continue;C[N]=P;let J=k[N]??0,H=n[N]?JSON.stringify(n[N]).length:0;f.set(I,Math.max(0,(f.get(I)??0)-J+H)),O()}Object.keys(C).length>0?r.put(C,A):A(null)}Object.keys(E.defer).length!==0&&setTimeout(()=>R({put:E.defer,"#":b["#"]},j),E.wait)},U=(b,j,k,E)=>{if(!j)return;Q.is(E)||(E={});let A=E.fast||!b["."]&&h.has(b["#"]),C=Ie(b,n,A),N=q.random(9),P=JSON.stringify({"#":t.track(N),get:b});if(C){if(!Te)if(!b["."]||typeof b["."]=="string"){let I=b["#"]+(b["."]?"."+b["."]:""),L=Date.now(),J=a.get(I);if(!J||L-J>u){a.set(I,L);let H=k(P);if(H&&H.err){j({err:H.err});return}}}else{let I=k(P);if(I&&I.err){j({err:I.err});return}}j({put:C});return}r.get(b,(I,L)=>{if(L){for(let[G,se]of Object.entries(L))if(se){if(!n[G]){n[G]={...se};continue}for(let[ue,_e]of Object.entries(se))if(ue!=="_"&&!(typeof n[G][ue]<"u")&&(n[G][ue]=_e,se._&&se._[">"]&&typeof se._[">"][ue]<"u")){let Ae=se._[">"][ue];n[G]._[">"][ue]=Ae,se._.s&&se._.s[Ae]&&(n[G]._.s||(n[G]._.s={}),n[G]._.s[Ae]=se._.s[Ae])}}!b["."]&&L[b["#"]]&&h.add(b["#"]);let H=L[b["#"]];if(H&&Object.keys(H).some(G=>G!=="_"&&ce(b["."],G))){if(!Te&&b["."]!==B)if(!b["."]||typeof b["."]=="string"){let G=b["#"]+(b["."]?"."+b["."]:""),se=Date.now(),ue=a.get(G);if(!ue||se-ue>u){a.set(G,se);let _e=k(P);if(_e&&_e.err){j({err:_e.err});return}}}else{let G=k(P);if(G&&G.err){j({err:G.err});return}}j(I?{put:L,err:I}:{put:L});return}}if(I&&console.log(I),E&&E.put){let H=b["#"],te={[H]:null};typeof b["."]=="string"&&(te[H]={[b["."]]:null}),j({put:te});return}s[N]=j,v.set(N,b),p.add(b["#"]);let J=k(P);if(J&&J.err){j({err:J.err}),delete s[N],v.delete(N);return}})},D=b=>({get:(j,k,E)=>{j&&typeof j["."]=="number"&&(j={...j,".":String(j["."])}),j&&j["#"]&&p.add(j["#"]),U(j,k,b,E)},put:async(j,k)=>{let E={};if(e.userLimit)for(let[N,P]of Object.entries(j))P&&P[B]&&n[N]&&(E[N]=JSON.stringify(n[N]).length);if(!await $(j,b,k))return;let A=await Be.mix(j,n,h,e.secure,l,e.maxGraphSize);if(Object.keys(A.now).length===0){k&&k(null);return}for(let N of Object.keys(A.now))h.add(N);if(e.userLimit)for(let[N,P]of Object.entries(A.now)){let I=P[B];if(!I)continue;let L=y.get(I)??i,J=f.get(I)??0;if(J>=L){k&&k("storage limit exceeded");return}let H=E[N]??0,te=n[N]?JSON.stringify(n[N]).length:0;f.set(I,Math.max(0,J-H+te)),O()}for(let[N,P]of Object.entries(A.now))if(P&&typeof P=="object")for(let[I,L]of Object.entries(P)){let J=z.is(L);J&&p.add(J)}r.put(A.now,N=>{k&&k(N),A.listeners.forEach(P=>P())});let C=b(JSON.stringify({"#":t.track(q.random(9)),put:j}));if(C&&C.err){k&&k(C.err);return}},on:(j,k,E,A)=>{j&&typeof j["."]=="number"&&(j={...j,".":String(j["."])});let C=j&&j["#"];!C||!k||(l[C]?l[C].push({".":j["."],cb:k}):l[C]=[{".":j["."],cb:k}],E&&U(j,k,b,A))},off:(j,k)=>{let E=j&&j["#"];if(!(!E||!l[E]))if(k){let A=l[E].find(C=>C.cb===k);A&&l[E].splice(l[E].indexOf(A),1)}else delete l[E]}});if(Te&&(e.wss||e.server||e.port!=null)){let b=e.wss,j=()=>b.clients();if(!b){let E=e.server?{server:e.server}:{port:e.port};b=new ze.WebSocketServer(E),j=()=>b.clients}let k=(E,A)=>{let N=JSON.parse(E)["#"];if(N&&v.has(N)){let P=v.get(N);v.delete(N),setTimeout(()=>{let I=s[N];if(I){let L=P["#"],J={[L]:null};typeof P["."]=="string"&&(J[L]={[P["."]]:null}),I({put:J}),delete s[N]}},w?100:1e4)}j().forEach(P=>{if(P&&P.readyState===WebSocket.OPEN)P.send(E,{binary:A});else{let I=P._retryHandler||We();if(P._retryHandler=I,I.shouldRetry()){let L=I.getDelay();I.increment(),setTimeout(()=>{P&&P.readyState===WebSocket.OPEN&&(I.reset(),P.send(E,{binary:A}))},L)}}})};return e.userLimit&&(g(()=>S(()=>K())),setInterval(S,6e4).unref()),b.on("connection",E=>{if(!_.add(E)){console.log("Connection limit reached, rejecting connection"),E.close(1013,"Connection limit reached - try again later");return}let A=q.random(9);console.log(`New WebSocket client connected: ${A}`),E.on("error",C=>{console.log("WebSocket error:",C),_.remove(E)}),E.on("close",()=>{console.log(`WebSocket client disconnected: ${A}`),_.remove(E)}),E.on("message",(C,N)=>{let P=bt(C,e.maxMessageSize);if(!P.valid){console.warn(`Invalid message: ${P.error}`),E.send(JSON.stringify({error:P.error}));return}let I=wt(C,e.maxMessageSize);if(!I.success){console.warn(`JSON parse error: ${I.error}`),E.send(JSON.stringify({error:"Invalid JSON"}));return}let L=I.data;if(t.check(L["#"]))return;let J=d.getDelay(A);if(J>0){let te=d.getThrottleCount(A);if(console.log(`Client ${A}: rate limit exceeded, delay would be ${J}ms, dropping message (throttle count: ${te})`),d.shouldDisconnect(A)){console.log(`Client ${A}: Disconnecting after ${te} throttle violations`),E.close(1008,"Rate limit violations");return}E.send(JSON.stringify({"#":t.track(q.random(9)),"@":L["#"],err:`Rate limit exceeded. Slow down requests. Wait ${Math.ceil(J/1e3)}s`,throttle:J}));return}let H=async()=>{t.track(L["#"]),L.get&&M(L,k),L.put&&await R(L,k),k(C,N);let te=L["@"],G=s[te];G&&(delete L["#"],delete L["@"],G(L),delete s[te])};J>0?setTimeout(H,J):H()})}),D(k)}let Z=[],re=!1,Y=0,F=[],V=[],X=null,ae=e.maxQueueLength||1e4,je=(b,j,k=w?100:1e4)=>setTimeout(()=>{T.delete(b),v.delete(b);let E=s[b];if(E){let A=j["#"],C={[A]:null};typeof j["."]=="string"&&(C[A]={[j["."]]:null}),E({put:C}),delete s[b]}},k),Oe=()=>{if(F.length===0){X=null;return}let b=Date.now();if(re&&b<Y){X=setTimeout(Oe,Math.min(1e3,Y-b));return}re&&b>=Y&&(console.log("Throttle period ended, resuming queue processing"),re=!1,Y=0);let j=F[0],k=nt(j),E=JSON.parse(j),A=E["#"],C=!k&&E.get&&!v.has(A);if(k||C?F.shift():!k&&E.put&&(F.shift(),V.push(j)),A&&v.has(A)){let N=v.get(A);k?(T.has(A)&&(clearTimeout(T.get(A)),T.delete(A)),je(A,N)):T.has(A)||T.set(A,je(A,N,0))}F.length>0?X=setTimeout(Oe,50):X=null},nt=b=>{let j=!1;return Z.forEach(k=>{if(k&&k.readyState===WebSocket.OPEN)k.send(b),j=!0;else{let E=k._retryHandler||We();if(k._retryHandler=E,E.shouldRetry()){let A=E.getDelay();E.increment(),setTimeout(()=>{k&&k.readyState===WebSocket.OPEN&&(E.reset(),k.send(b))},A)}}}),j},Ue=b=>{if(F.length>=ae)return{err:`Message queue exceeded maximum length (${ae}). Update query logic to request less data.`,queueLength:F.length,maxQueueLength:ae};F.push(b),X||(X=setTimeout(Oe,50))};return(!(e.peers instanceof Array)||e.peers.length===0)&&(e.peers=[`ws://localhost:${e.port||8765}`]),e.peers.forEach(b=>{let j=()=>{let k=new WebSocket(b);Z.push(k);let E=We();k.onclose=A=>{if(Z.indexOf(k)!==-1&&Z.splice(Z.indexOf(k),1),k=null,E.shouldRetry()){let C=w?50:E.getDelay();E.increment();let N=setTimeout(j,C);N.unref&&N.unref()}},k.onopen=()=>{E.reset(),V.length>0&&(F=V.concat(F),V=[],X||(X=setTimeout(Oe,50)))},k.onerror=A=>{console.log(A)},k.onmessage=async A=>{let C=JSON.parse(A.data);if(t.check(C["#"]))return;if(C.throttle&&C.err){console.log(`Server throttling: ${C.err}`),re=!0,Y=Date.now()+C.throttle;return}if(t.track(C["#"]),C.get&&M(C,Ue),C.put){let I=new Map;for(let[H,te]of Object.entries(C.put)){let G=await m(H);if(I.set(H,G),!(!G&&!p.has(H)||!te||typeof te!="object"))for(let[,se]of Object.entries(te)){let ue=z.is(se);ue&&p.add(ue)}}let L={},J=[];for(let[H,te]of Object.entries(C.put)){let G=I.get(H);p.has(H)&&(G=!0,J.push(H)),G&&(L[H]=te)}if(Object.keys(L).length>0){let H={put:L,"#":C["#"]};await R(H,Ue)}J.forEach(H=>p.delete(H))}let N=C["@"],P=s[N];P&&(delete C["#"],delete C["@"],P(C),delete s[N])}};j()}),D(Ue)},Ke=vt;var Tt=(e,t)=>{t||(t=Ke(e));let r=[],n=!1,s=!1,l=0,h=(a,u,v,T)=>{let m=o=>{l++,h(o,u,v,T)},w=o=>{r=[],l=0,s=!1,T(o)},d=()=>{if(r.length===0){w("Wrong username or password");return}let o=r.shift();t.get({"#":o,".":["auth","pub","epub"]},async i=>{if(i.err){w(`error getting ${o}: ${i.err}`);return}let f=i.put&&i.put[o];if(!f||!f.auth)return d();let y=JSON.parse(f.auth),c=await ne.work(u,y.salt),g=await ne.decrypt(y.enc,c);if(!g)return d();if(p.is={username:a,pub:f.pub,epub:f.epub,priv:g.priv,epriv:g.epriv},v!==""){let O=q.random(64),S=await ne.work(v,O),x=await ne.encrypt(g,S),K={auth:JSON.stringify({enc:x,salt:O})},$=Date.now(),M=await ne.signTimestamp($,p.is),R=ge(o,K,M,f.pub,$);t.put(R,U=>{w(U?`error putting ${K} on ${o}: ${U}`:null)});return}w(null)})};if(l>9){w("Wrong username or password");return}let _="~@"+a;t.get({"#":_},async o=>{if(o.err){w(`error getting ${_}: ${o.err}`);return}let i=o.put&&o.put[_];if(!i)return m(a);delete o.put[_]._,r=Object.keys(i),d()})},p={create:(a,u,v)=>{let T=w=>{v?v(w):console.log(w)};if(n){T("User is already being created");return}if(a===""){T("Please provide a username");return}if(u===""){T("Please provide a password");return}n=!0;let m="~@"+a;t.get({"#":m},async w=>{if(w.err){n=!1,T(`error getting ${m}: ${w.err}`);return}if(w.put&&w.put[m]){n=!1,T("Username already exists");return}let d=q.random(64),_=await ne.work(u,d),o=await ne.pair(),i={priv:o.priv,epriv:o.epriv},f=await ne.encrypt(i,_),y={username:a,pub:o.pub,epub:o.epub,auth:JSON.stringify({enc:f,salt:d})},c="~"+o.pub,g=Date.now(),O=await ne.signTimestamp(g,o),S=ge(c,y,O,o.pub,g);t.put(S,x=>{if(n=!1,x){T(`error putting ${y} on ${c}: ${x}`);return}let K={[c]:{"#":c}};t.put(ge(m,K),$=>{if($){T(`error putting ${K} on ${m}: ${$}`);return}v&&v(null)})})})},auth:(a,u,v)=>{let T=m=>{v?v(m):m&&console.log(m)};if(s){T("User is already authenticating");return}if(p.is=null,a===""){T("Please provide a username");return}if(u===""){T("Please provide a password");return}s=!0,h(a,u,"",T)},change:(a,u,v,T)=>{let m=w=>{T?T(w):w&&console.log(w)};if(s){m("User is already authenticating");return}if(p.is=null,a===""){m("Please provide a username");return}if(u===""){m("Please provide a password");return}if(v===""){m("Please provide a new password");return}s=!0,h(a,u,v,m)},store:a=>{if(!p.is){console.log("Please authenticate before calling store");return}if(a){typeof globalThis.localStorage<"u"&&globalThis.localStorage.setItem("user.is",JSON.stringify(p.is)),typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.removeItem("user.is");return}typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.setItem("user.is",JSON.stringify(p.is)),typeof globalThis.localStorage<"u"&&globalThis.localStorage.removeItem("user.is")},recall:()=>{if(typeof globalThis.localStorage<"u"){let a=globalThis.localStorage.getItem("user.is");if(a){p.is=JSON.parse(a);return}}if(typeof globalThis.sessionStorage<"u"){let a=globalThis.sessionStorage.getItem("user.is");a&&(p.is=JSON.parse(a))}},leave:()=>{p.is=null,typeof globalThis.localStorage<"u"&&globalThis.localStorage.removeItem("user.is"),typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.removeItem("user.is")},delete:(a,u,v)=>{let T=m=>{v?v(m):console.log(m)};if(s){T("User is already authenticating");return}if(a===""){T("Please provide a username");return}if(u===""){T("Please provide a password");return}s=!0,h(a,u,"",async m=>{if(m){T(m);return}let w={username:null,pub:null,epub:null,auth:null},d=Date.now(),_=await ne.signTimestamp(d,p.is),o="~"+p.is.pub,i=ge(o,w,_,p.is.pub,d);t.put(i,f=>{if(f){T(`error putting null on ${o}: ${f}`);return}p.is=null,v&&v(null)})})}};return p},rt=Tt;var _t=e=>{typeof e=="string"?e={peers:[e]}:e instanceof Array?e={peers:e}:Q.is(e)||(e={});let t=Ke(e),r=rt(e,t),n=new Map,s=new Map,l=new Map,h=u=>u===null||u===!0||u===!1||typeof u=="string"||z.is(u)||Ce.is(u),p=u=>{if(h(u))return!0;if(Q.is(u)){let T=[];for(let[m,w]of Object.entries(u)){if(m==="_")return"error underscore cannot be used as a property name";if(Q.is(w)||h(w)){T.push(m);continue}return typeof w>"u"?`error undefined ${m} cannot be converted to a graph`:`error ${JSON.stringify({[m]:w})} cannot be converted to a graph`}if(T.length!==0)return T}return`error ${JSON.stringify(u)} cannot be converted to a graph`},a=u=>{let v=(o,i,f,y)=>{t.get(Q.put(o,"#",i),async c=>{c.err&&console.log(c.err),c.put&&c.put[i]?(delete c.put[i]._,delete c.put[i][B],delete c.put[i][ye],await Promise.all(Object.keys(c.put[i]).map(async g=>{let O=z.is(c.put[i][g]);if(!O)return;let S=async(x=0)=>{let K=await new Promise($=>{let M=q.random(),R=s.get(u);s.set(M,{chain:[{item:null,soul:O}],user:R?R.user:null}),a(M).next(null,$,y)});return K!==null||x>=5?K:(await new Promise($=>setTimeout($,50)),S(x+1))};c.put[i][g]=await S()})),f(c.put[i])):f(null)},y)},T=async(o,i,f,y)=>{if(f){let c=Date.now(),g=await ne.signTimestamp(c,f);return ge(o,i,g,f.pub,c)}return e.secure?(y||(y=console.log),y(`error putting data on ${o}: user required in secure mode`),null):ge(o,i)},m=o=>i=>{let f=s.get(o);f&&typeof f.cb<"u"?setTimeout(()=>f.cb(i),1):i&&console.log("error no callback for data",i,"ctx",f),f&&!f.on&&s.delete(o)},w=(o,i,f,y,c,g,O=!0)=>{let S=null,x=()=>{if(!s.has(u)){t.off({"#":o,".":i},x),S&&clearTimeout(S);return}t.get({"#":o,".":i},K=>{let $=K.put&&K.put[o],M=z.is($&&$[i]);if(!M){!O&&$&&$._&&typeof $[i]<"u"&&(S&&clearTimeout(S),t.off({"#":o,".":i},x),g($[i]));return}S&&clearTimeout(S),t.off({"#":o,".":i},x),f.chain[y].soul=M,s.set(u,{...f}),O?a(u).on(c.on,g,c._get,c._opt):a(u).next(null,c.get,g,c._opt)},{...c._opt,secure:!!(f.user||e.secure)})};t.on({"#":o,".":i},x,!1,c._opt),O||(S=setTimeout(()=>{t.off({"#":o,".":i},x),g&&g(null)},31e3))},d=(o,i,f,y,c)=>{let g=l.get(o),O=g&&g.get(i);if(O){O.then(R=>c(null,R),R=>c(R));return}let S=q.random();f[i]=z.ify(S);let x,K,$=new Promise((R,U)=>{x=R,K=U});$.catch(()=>{}),g||(g=new Map,l.set(o,g)),g.set(i,$);let M=()=>{g.delete(i),g.size===0&&l.delete(o)};(async()=>{let R=await T(o,f,y,c);if(R===null){M(),K(new Error("secure mode"));return}t.put(R,U=>{if(M(),U){let D=`error putting ${i} on ${o}: ${U}`;K(D),c(D);return}x(S),c(null,S)})})()},_=(o,i)=>{if(!o){console.log("error resolve request parameter required");return}let f=typeof o.get<"u",y=typeof o.put<"u",c=typeof o.on<"u",g=typeof o.off<"u",O=!1,S=s.get(u);if(!S)return{item:null,soul:null};for(var x=1;x<S.chain.length;x++)if(S.chain[x].soul===null){O=!0;break}if(O){let{item:K,soul:$}=S.chain[x-1];return t.get({"#":$,".":K},async M=>{if(M.err){console.log(`error getting ${K} on ${$}: ${M.err}`),i&&i(null);return}let R=M.put&&M.put[$];if(R&&typeof R[K]<"u"){let U=z.is(R[K]);U?(S.chain[x].soul=U,s.set(u,{...S}),f?a(u).next(null,o.get,i,o._opt):y?a(u).put(o.put,i):c?a(u).on(o.on,i,o._get,o._opt):g&&a(u).off(i)):f?i(R[K]):y?d($,K,R,S.user,(D,Z)=>{if(D){i(D);return}S.chain[x].soul=Z,a(u).put(o.put,i)}):c?(w($,K,S,x,o,i),o._get&&i(null)):g&&i&&i(null)}else if(y)d($,K,R||{},S.user,(U,D)=>{if(U){i(U);return}S.chain[x].soul=D,a(u).put(o.put,i)});else if(c)w($,K,S,x,o,i),o._get&&i(null);else if(f&&R){let U=R._&&R._[">"];U&&Object.keys(U).length>0&&typeof U[K]>"u"?i&&i(null):w($,K,S,x,o,i,!1)}else i&&i(null)},{...o._opt,secure:!!(S.user||e.secure)}),!1}return f&&S.chain[S.chain.length-1].item!==null?(S.chain.push({item:null,soul:null}),a(u).next(null,o.get,i,o._opt),!1):S.chain[S.chain.length-1]};return{get:(o,i,f,y)=>{if(typeof i=="function"&&(y=f,f=i,i=null),o===null||o===""||o==="_"){console.log("error please provide a key"),f&&f(null);return}if(i&&typeof f!="function"){console.log("error lex requires a callback function");return}if(u=q.random(),s.set(u,{chain:[{item:String(o),soul:"root"}],cb:f}),!f)return a(u);let c=m(u),{soul:g}=_({get:i,_opt:y},c);g&&v(i,g,c,y)},next:(o,i,f,y)=>{let c=x=>K=>{f?f(K):m(x)(K)};if(typeof i=="function"&&(y=f,f=i,i=null),!u){console.log("error please provide a key using get(key)"),f&&f(null);return}let g=c(u);if(o===""||o==="_"){g(null);return}if(i&&typeof f!="function"){console.log("error lex requires a callback function");return}let O=s.get(u);if(!O)return;if(f&&typeof O.cb>"u"&&(O.cb=f,f=null),o!==null&&O.chain.push({item:String(o),soul:null}),!O.cb)return a(u);let{soul:S}=_({get:i,_opt:y},g);S&&v(i,S,g,y)},put:(o,i,f)=>{typeof i=="function"&&(f=i,i=!1);let y=$=>M=>{f?f(M):m($)(M)};if(!u){f&&f("error please provide a key using get(key)");return}let c=s.get(u);if(!c)return;!c.cb&&f&&(c.cb=f,f=null),i&&(o={[q.random()]:o});let g=y(u),O=p(o);if(typeof O=="string"){g(O);return}let{item:S,soul:x}=_({put:o,_opt:{put:!0}},g);if(!x)return;if(O===!0){t.get({"#":x,".":S},async $=>{if($.err){g(`error getting ${x}: ${$.err}`);return}let M=$.put&&$.put[x],R=M&&M[S],U=z.is(R);if(!U){M||(M={}),M[S]=o;let D=await T(x,M,c.user,g);if(D===null)return;t.put(D,g);return}t.get({"#":U},async D=>{if(D.err){g(`error getting ${U}: ${D.err}`);return}if(!D.put||!D.put[U]){g(`error ${U} not found`);return}for(let re of Object.keys(D.put[U])){if(re==="_"||re===B||re===ye)continue;let Y=await new Promise(F=>{let V=q.random(),X=[{item:re,soul:U}];s.set(V,{chain:X,user:c.user}),a(V).put(null,F)});if(Y){g(Y);return}}M||(M={}),M[S]=o;let Z=await T(x,M,c.user,g);Z!==null&&t.put(Z,g)})},{secure:!!(c.user||e.secure),put:!0});return}let K=($=0)=>{t.get({"#":x,".":S},async M=>{if(M.err){g(`error getting ${x}.${S}: ${M.err}`);return}let R=M.put&&M.put[x],U=R&&R[S];if(!U&&$<5)return await new Promise(F=>setTimeout(F,50)),K($+1);let D=z.is(U);if(!D){d(x,S,R||{},c.user,F=>{if(F){g(F);return}let V=q.random(),X=[{item:S,soul:x}];s.set(V,{chain:X,user:c.user,cb:c.cb}),a(V).put(o)});return}let Z=[];for(let F of O){let V=await new Promise(X=>{if(Q.is(o[F])&&!z.is(o[F])){let ae=q.random(),je=[{item:F,soul:D}];s.set(ae,{chain:je,user:c.user}),a(ae).put(o[F],X)}else Z.push(F),X(null)});if(V){g(V,u);return}}if(Z.length===0){g(null);return}let re={};Z.forEach(F=>{re[F]=o[F]});let Y=await T(D,re,c.user,g);Y!==null&&t.put(Y,g)},{secure:!!(c.user||e.secure),put:!0})};K()},on:(o,i,f,y)=>{if(typeof o=="function"&&(y=f,f=i,i=o,o=null),typeof i!="function"){console.log("error on() requires a callback function");return}if(!u){console.log("error please provide a key using get(key)"),i(null);return}let{item:c,soul:g}=_({on:o,_get:f,_opt:y},i);if(!g)return;let O=s.get(u);s.set(u,{chain:[{item:c,soul:g}],on:!0,user:O?O.user:null});let S=0,x=5,K=1e3,$=null;n.set(i,()=>{s.has(u)&&(clearTimeout($),$=null,t.get({"#":g,".":c},R=>{let U=R.put&&R.put[g],D=U&&U[c],Z=z.is(D);if(Z){let re=async(Y=0)=>{let F=await new Promise(V=>{let X=q.random();s.set(X,{chain:[{item:null,soul:Z}],user:O?O.user:null}),a(X).next(null,V,Y===0?Q.put(y,"fast",!0):y)});F!==null||Y>=5?(S=0,i(F)):(await new Promise(V=>setTimeout(V,50)),re(Y+1))};re()}else if(!!U)S=0,i(D!==void 0?D:null);else if(S<x){let Y=()=>{let F=Math.min(K*Math.pow(2,S),3e4);S++,$=setTimeout(()=>{t.get({"#":g,".":c},V=>{let X=V.put&&V.put[g];if(X){S=0,$=null;let ae=X[c];i(ae!==void 0?ae:null)}else S<x?Y():($=null,i(null))},{...y,secure:!!(O.user||e.secure)})},F)};Y()}else i(null)},{...y,secure:!!(O.user||e.secure)}))});let M;o?(M=Q.put(o,"#",g),M["."]!=null&&typeof M["."]=="number"&&(M={...M,".":String(M["."])})):M={"#":g,".":c},t.on(M,n.get(i),!1,y),t.get({"#":g,".":c},R=>{if(R.err){console.log(`error getting ${g}.${c}: ${R.err}`);return}let U=R.put&&R.put[g]&&R.put[g][c],D=z.is(U);D&&(t.off(M,n.get(i)),t.on({"#":D,".":null},n.get(i),!1,y)),f&&n.get(i)()},{...y,secure:!!(O.user||e.secure)})},off:o=>{if(!u){console.log("error please provide a key using get(key)"),o&&o(null);return}let{item:i,soul:f}=_({off:!0},o);f&&(t.off({"#":f},n.get(o)),t.get({"#":f,".":i},y=>{if(y.err){n.delete(o),s.delete(u);return}let c=y.put&&y.put[f]&&y.put[f][i],g=z.is(c);g&&t.off({"#":g},n.get(o)),n.delete(o),s.delete(u)}))},user:()=>(r.get||(Object.assign(r,a()),r.get=(o,i,f,y)=>{typeof i=="function"&&(y=f,f=i,i=null);let c=null,g=null;if(r.is&&(c=r.is.pub),typeof o=="string"?g=o:o instanceof Array&&(o.length===2?(c=o[0],g=o[1]):o.length===1&&(g=o[0])),!c){console.log("error please log in or provide a public key"),f&&f(null);return}if(g===null||g===""||g==="_"){console.log("error please provide a key"),f&&f(null);return}if(i&&!f){console.log("error lex requires a callback function");return}u=q.random();let O=[{item:String(g),soul:"~"+c}];if(s.set(u,{chain:O,user:r.is,cb:f}),!f)return a(u);let S=m(u),{soul:x}=_({get:i,_opt:y},S);x&&v(i,x,S,y)}),r),wire:t,SEA:ne}};return a()},rr=_t;export{rr as default};
|
|
4
4
|
//# sourceMappingURL=holster.js.map
|