@mblaney/holster 1.0.6 → 1.0.8
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 +3 -1
- package/build/holster.js +3 -3
- package/build/holster.js.map +3 -3
- package/package.json +1 -1
- package/src/array.js +21 -10
- package/src/buffer.js +388 -55
- package/src/dup.js +2 -0
- package/src/get.js +11 -0
- package/src/ham.js +31 -5
- package/src/radisk.js +8 -5
- package/src/store.js +21 -7
- package/src/utils.js +23 -14
- package/src/wire.js +7 -1
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
Holster is a service
|
|
1
|
+
Holster is a service for synchronising data between devices using Node,
|
|
2
2
|
Deno, Bun or the browser.
|
|
3
3
|
|
|
4
|
+
Try it out at [holster.haza.website](https://holster.haza.website)!
|
|
5
|
+
|
|
4
6
|
It is a port of [GunDB](https://gun.eco), following
|
|
5
7
|
[Porting Gun](https://github.com/gundb/port) and is implemented as JavaScript
|
|
6
8
|
modules so that it can run in any environment. A build version of Holster is
|
package/build/holster.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var V={is:e=>!(e instanceof Array)&&(e-parseFloat(e)+1>=0||e===1/0||e===-1/0)},P={is:e=>e?e instanceof Object&&e.constructor===Object||Object.prototype.toString.call(e).match(/^\[object (\w+)\]$/)[1]==="Object":!1,map:(e,t,o)=>{var i=Object.keys(e);for(let r=0;r<i.length;r++){let u=t(e[i[r]],i[r],o);if(typeof u<"u")return u}},put:(e,t,o)=>(e||(e={}),e[t]=o,e),del:(e,t)=>{if(e)return e[t]=null,delete e[t],e}},Ae=(e,t,o)=>{if(o.id){o.id=!1;return}if(t==="#"&&typeof e=="string"){o.id=e;return}o.id=!1},N={is:e=>{if(e&&e["#"]&&!e._&&P.is(e)){let t={};if(P.map(e,Ae,t),t.id)return t.id}return!1},ify:e=>P.put({},"#",e)},W="_holster_user_signature",B="_holster_user_public_key",H=(e,t,o,i)=>{let r={[e]:{_:{"#":e,">":{}}}};for(let[u,f]of Object.entries(t))u!=="_"&&u!=B&&u!=W&&(r[e][u]=f,r[e]._[">"][u]=Date.now());return o&&i&&(r[e][W]=o,r[e]._[">"][W]=Date.now(),r[e][B]=i,r[e]._[">"][B]=Date.now()),r},q=(e,t)=>{if(typeof t>"u")return e===null;if(typeof e>"u")return!0;if(typeof e=="string")return e===t;if(!P.is(e)||!t)return!1;let o=e["*"];if(o)return t.slice(0,o.length)===o;let i=e[">"],r=e["<"];return i&&r?t>=i&&t<=r:i?t>=i:r?t<=r:!1},E={random:e=>{var t="";let o="0123456789ABCDEFGHIJKLMNOPQRSTUVWXZabcdefghijklmnopqrstuvwxyz";e||(e=24);for(let i=0;i<e;i++)t+=o.charAt(Math.floor(Math.random()*o.length));return t}};var _e=e=>{e||(e=9e3);let t={store:{}};return t.check=o=>t.store[o]?t.track(o):!1,t.track=o=>(t.store[o]=Date.now(),t.expiry||(t.expiry=setTimeout(()=>{let i=Date.now();Object.keys(t.store).forEach(r=>{i-t.store[r]>e&&delete t.store[r]}),t.expiry=null},e)),o),t},ge=_e;var xe=(e,t)=>{let o=e["#"];if(!t[o])return;let i={_:{"#":o,">":{}}};if(typeof e["."]=="string"){let r=e["."];if(typeof t[o][r]>"u")return;i[r]=t[o][r],i._[">"][r]=t[o]._[">"][r]}else for(let r of Object.keys(t[o]))q(e["."],r)&&(i[r]=t[o][r],i._[">"][r]=t[o]._[">"][r]);return{[o]:i}},ue=xe;typeof btoa>"u"&&(globalThis.btoa=e=>Buffer.from(e,"binary").toString("base64"),globalThis.atob=e=>Buffer.from(e,"base64").toString("binary"));function ee(){}Object.assign(ee,{from:Array.from});ee.prototype=Object.create(Array.prototype);ee.prototype.toString=function(e,t,o){e||(e="utf8"),t||(t=0);let i=this.length;if(e==="hex"){let r=new Uint8Array(this);return[...Array((o&&o+1||i)-t).keys()].map(u=>r[u+t].toString(16).padStart(2,"0")).join("")}if(e==="utf8")return Array.from({length:(o||i)-t},(r,u)=>String.fromCharCode(this[u+t])).join("");if(e==="base64")return btoa(this)};var R=ee;function L(...e){return console.warn("new SafeBuffer() is deprecated, please use SafeBuffer.from()"),L.from(...e)}L.prototype=Object.create(Array.prototype);Object.assign(L,{from(){if(!Object.keys(arguments).length||arguments[0]==null)throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.");let e=arguments[0],t;if(typeof e=="string"){let i=arguments[1]||"utf8";if(i==="hex"){let r=e.match(/([\da-fA-F]{2})/g).map(u=>parseInt(u,16));if(!r||!r.length)throw new TypeError("Invalid first argument for type 'hex'.");t=R.from(r)}else if(i==="utf8"||i==="binary"){let r=e.length,u=new Uint16Array(r);Array.from({length:r},(f,p)=>u[p]=e.charCodeAt(p)),t=R.from(u)}else if(i==="base64"){let r=atob(e),u=r.length,f=new Uint8Array(u);Array.from({length:u},(p,n)=>f[n]=r.charCodeAt(n)),t=R.from(f)}else console.info("SafeBuffer.from unknown encoding: "+i);return t}if(e.byteLength?e.byteLength:e.length){let i;return e instanceof ArrayBuffer&&(i=new Uint8Array(e)),R.from(i||e)}},alloc(e,t=0){return R.from(new Uint8Array(Array.from({length:e},()=>t)))},concat(e){if(!Array.isArray(e))throw new TypeError("First argument must be Array containing ArrayBuffer or Uint8Array instances.");return R.from(e.reduce((t,o)=>t.concat(Array.from(o)),[]))}});L.prototype.from=L.from;L.prototype.toString=R.prototype.toString;var J=L;var Ee=typeof document>"u",de=Ee?(await import("node:crypto")).webcrypto:globalThis.crypto,T=de.subtle,te=e=>typeof e=="string"?e:JSON.stringify(e),Z=e=>{try{return JSON.parse(e)}catch{return e}},re=e=>{let t=new Uint8Array(J.alloc(e));return J.from(de.getRandomValues(t))},Y=(e,t)=>{let[o,i]=e.split(".");return{kty:"EC",crv:"P-256",x:o,y:i,d:t,ext:!0,key_ops:t?["sign"]:["verify"]}},ne=async e=>{let t=await T.digest({name:"SHA-256"},new TextEncoder().encode(te(e)));return J.from(t)},le=async(e,t)=>{let o=e+t.toString("utf8"),i=J.from(await ne(o),"binary"),r=Te(i);return await T.importKey("jwk",r,{name:"AES-GCM"},!1,["encrypt","decrypt"])},Te=e=>({kty:"oct",k:e.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/\=/g,""),ext:!1,alg:"A256GCM"});var Pe={pair:async e=>{let t=await T.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]).then(async r=>{let u=await T.exportKey("jwk",r.publicKey);return{priv:(await T.exportKey("jwk",r.privateKey)).d,pub:u.x+"."+u.y}}),o=await T.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveKey"]).then(async r=>{let u=await T.exportKey("jwk",r.publicKey);return{epriv:(await T.exportKey("jwk",r.privateKey)).d,epub:u.x+"."+u.y}}),i={pub:t.pub,priv:t.priv,epub:o.epub,epriv:o.epriv};return e&&e(i),i},encrypt:async(e,t,o)=>{if(!t||!t.epriv)return o&&o(null),null;let i={s:re(9),iv:re(15)},r=await le(t.epriv,i.s).then(f=>T.encrypt({name:"AES-GCM",iv:new Uint8Array(i.iv)},f,new TextEncoder().encode(te(e)))),u={ct:J.from(r,"binary").toString("base64"),iv:i.iv.toString("base64"),s:i.s.toString("base64")};return o&&o(u),u},decrypt:async(e,t,o)=>{if(!e||!e.ct||!e.iv||!e.s||!t||!t.epriv)return o&&o(null),null;let i={ct:J.from(e.ct,"base64"),iv:J.from(e.iv,"base64"),s:J.from(e.s,"base64")};try{let r=await le(t.epriv,i.s).then(f=>T.decrypt({name:"AES-GCM",iv:new Uint8Array(i.iv),tagLength:128},f,new Uint8Array(i.ct))),u=Z(new TextDecoder("utf8").decode(r));return o&&o(u),u}catch{return o&&o(null),null}},verify:async(e,t,o)=>{if(!t||!t.pub)return o&&o(null),null;let i=Z(e),r=await T.importKey("jwk",Y(t.pub),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]),u={};if(typeof i.m=="string")u=i.m;else for(let g of Object.keys(i.m).sort())g!=="_"&&g!=B&&g!=W&&(u[g]=i.m[g]);let f=await ne(u),p=new Uint8Array(J.from(i.s,"base64")),n={name:"ECDSA",hash:{name:"SHA-256"}};if(await T.verify(n,r,p,new Uint8Array(f))){let g=Z(i.m);return o&&o(g),g}return o&&o(null),null},sign:async(e,t,o)=>{if(!t||!t.pub||!t.priv)return o&&o(null),null;let i={};if(typeof e=="string")i=e;else{let g=Z(e);for(let y of Object.keys(g).sort())y!=="_"&&y!=B&&y!=W&&(i[y]=g[y])}let r=await ne(i),u=Y(t.pub,t.priv),f={name:"ECDSA",namedCurve:"P-256"},p=await T.importKey("jwk",u,f,!1,["sign"]).then(g=>T.sign({name:"ECDSA",hash:{name:"SHA-256"}},g,new Uint8Array(r))),n={m:i,s:J.from(p,"binary").toString("base64")};return o&&o(n),n},work:async(e,t,o)=>{typeof t=="function"&&(o=t,t=void 0),typeof t>"u"&&(t=re(9));let i=await T.importKey("raw",new TextEncoder().encode(te(e)),{name:"PBKDF2"},!1,["deriveBits"]),r={name:"PBKDF2",iterations:1e5,salt:new TextEncoder().encode(t),hash:{name:"SHA-256"}},u=await T.deriveBits(r,i,512),f={epriv:J.from(u,"binary").toString("base64")};return o&&o(f),f},secret:async(e,t,o)=>{if(!e||!e.epub||!t||!t.epub||!t.epriv)return o&&o(null),null;let i={name:"ECDH",namedCurve:"P-256"},r=Y(e.epub),u=await T.importKey("jwk",r,i,!0,[]),f=Y(t.epub,t.epriv,!1);delete f.key_ops;let p=await T.importKey("jwk",f,i,!1,["deriveBits"]).then(async n=>{let g=await T.deriveBits({public:u,name:"ECDH",namedCurve:"P-256"},n,256),y=await T.importKey("raw",new Uint8Array(g),{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]);return T.exportKey("jwk",y).then(({k:m})=>m)});return o&&o({epriv:p}),{epriv:p}}},I=Pe;var fe=(e,t,o,i)=>e<t?{historical:!0}:e>t?{incoming:!0}:(typeof o!="string"&&(o=JSON.stringify(o)||""),typeof i!="string"&&(i=JSON.stringify(i)||""),o===i?{state:!0}:o<i?{current:!0}:{incoming:!0});fe.mix=async(e,t,o,i)=>{let r=Date.now(),u={},f={},p=0;for(let n of Object.keys(e)){let g=e[n],y=!1,m=!1,w=0,s=o;if(!g||!g._)continue;let l=g[W],a=g[B];if(l&&a&&(s=!0),n.length>1&&n[0]==="~")if(n[1]==="@")m=!0,s=!1;else{if(a&&n!="~"+a){console.log(`error public key does not match for soul: ${n}`);continue}s=!0}if(!(s&&(!l||!a||!await I.verify({m:g,s:l},{pub:a})))){for(let c of Object.keys(g)){if(c==="_")continue;let d=g[c],h=g._&&g._[">"]?g._[">"][c]:0,v=(t[n]||{})[c],b=(t[n]||{_:{">":{}}})._[">"][c]||0;if(m&&c!==N.is(d)){console.log(`error alias ${m}: ${c} !== ${N.is(d)}`);continue}let S=h-r;if(S>0){if(S>864e5)continue;(p===0||S<p)&&(p=w=S),f[n]||(f[n]={_:{"#":n,">":{}}}),f[n][c]=d,f[n]._[">"][c]=h}else fe(h,b,d,v).incoming&&(u[n]||(u[n]={_:{"#":n,">":{}}}),t[n]||(t[n]={_:{"#":n,">":{}}}),t[n][c]=u[n][c]=d,t[n]._[">"][c]=u[n]._[">"][c]=h,i[n]&&setTimeout(()=>{i[n]&&i[n].filter(j=>q(j["."],c)).forEach(j=>j.cb())},100),y=!0)}s&&w!==0&&u[n]&&(Object.assign(f[n],u[n]),delete u[n]),y&&i[n]&&setTimeout(()=>{i[n]&&i[n].filter(c=>q(c["."])).forEach(c=>c.cb())},100)}}return{now:u,defer:f,wait:p}};var ae=fe;var F="",X="",ye=()=>{let e=(t,o,i)=>{if(i||(e[F]||(e[F]={}),i=e[F]),!t)return i;let r=0,u={},f=t[r],p=t.length-1,n=typeof o>"u",g=i[f];for(;!g&&r<p;)f+=t[++r],g=i[f];if(g)if(r===p){if(n)return typeof g[X]>"u"?g[F]:g[X];g[X]=o}else return!g[F]&&!n&&(g[F]={}),e(t.slice(++r),o,g[F]);else if(P.map(i,(m,w)=>{let s=0,l="";for(;w[s]===t[s];)l+=w[s++];if(l){if(n)return s<=p?void 0:(u[w.slice(s)]=m,m);let a={[w.slice(s)]:m,[t.slice(s)]:{[X]:o}};return i[l]={[F]:a},delete i[w],!0}})){if(n)return u}else{if(n)return;i[f]||(i[f]={}),i[f][X]=o}};return e};ye.map=function e(t,o,i,r){r||(r=[]);var u=t[F]||t,f=Object.keys(u).sort(),p;for(let n=0;n<f.length;n++){let g=f[n],y=u[g],m=y[X];if(typeof m<"u"){if(m=o(m,r.join("")+g,g,r),typeof m<"u")return m}else i&&o(p,r.join(""),g,r);if(y[F]){if(r.push(g),m=e(y[F],o,i,r),typeof m<"u")return m;r.pop()}}};var U=ye;var me="",he="",K="",Q=e=>{var t,o=null;if(e||(e={}),e.log||(e.log=console.log),e.batch||(e.batch=10*1e3),e.write||(e.write=1),e.size||(e.size=1024*1024),!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 i=(r,u,f)=>{if(r=""+r,typeof u=="function")return f=u,u=i.batch(r),typeof u<"u"||i.thrash.at&&(u=i.thrash.at(r),typeof u<"u")?f(t,u):i.read(r,f);if(i.batch(r,u),f&&i.batch.acks.push(f),++i.batch.ed>=e.batch)return i.thrash();clearTimeout(i.batch.timeout),i.batch.timeout=setTimeout(i.thrash,e.write)};return i.batch=U(),i.batch.acks=[],i.batch.ed=0,i.thrash=()=>{if(i.thrash.ing)return i.thrash.more=!0;clearTimeout(i.batch.timeout),i.thrash.more=!1,i.thrash.ing=!0;var r=i.thrash.at=i.batch;i.batch=null,i.batch=U(),i.batch.acks=[],i.batch.ed=0;let u=0;i.save(r,f=>{++u>1||(f&&e.log(f),r.acks.forEach(p=>p(f)),i.thrash.at=null,i.thrash.ing=!1,i.thrash.more&&i.thrash())})},i.save=(r,u)=>{let f={find:(p,n)=>{if(!(n<f.start))return f.start=n,e.store.list(f.lex),!0},lex:p=>{!p||p>f.start?(f.end=p,f.start&&f.mix(f.file||"!",f.start,f.end)):f.file=p},mix:(p,n,g)=>{f.start=f.end=f.file=t,i.parse(p,(y,m)=>{if(y)return u(y);U.map(r,(w,s)=>{if(!(s<n)){if(g&&g<s){f.start=s;return}m(s,w)}}),i.write(p,m,f.next)})},next:p=>{if(p)return u(p);if(f.start)return U.map(r,f.find);u(p)}};U.map(r,f.find)},i.write=(r,u,f)=>{o=null;let p={text:"",limit:"",done:!1,count:0,each:(n,g,y,m)=>{if(p.done)return;p.count++,n=typeof n>"u"?"":"="+Q.encode(n);let w=Q.encode(m.length)+"#"+Q.encode(y)+n+`
|
|
2
|
-
`;if(p.count>1&&m.length===0&&p.text.length+w.length>e.size){let
|
|
3
|
-
`&&(y[0]==="="&&(w=y[1]),typeof m<"u"&&typeof w<"u"&&f.disk(g.join(""),w),y=f.split(y[2]))}u(t,f.disk)},split:p=>{if(!p)return;let n=-1,g="",y=null;for(;(y=p[++n])&&y!==K;)g+=y;let m={};if(y)return[g,Q.decode(p.slice(n),m),p.slice(n+m.i)]}};e.store.get(r,f.read)},i};Q.encode=e=>{let t="";if(e instanceof Array&&e.length===2&&(t=me+e[1],e=e[0]),typeof e=="string"){let i=0,r=null,u=K;for(;r=e[i++];)r===K&&(u+=K);return u+'"'+e+t+K}let o=N.is(e);if(o)return K+"#"+o+t+K;if(V.is(e))return K+"+"+(e||0)+t+K;if(e===!0)return K+"+"+t+K;if(e===!1)return K+"-"+t+K;if(e===null)return K+" "+t+K};Q.decode=(e,t)=>{var o="",i=-1,r=0,u=null,f=null;if(e[0]!==K)return;for(;u=e[++i];)if(f){if(u===K&&--r<=0)break;o+=u}else u===K?r++:f=u||!0;t&&(t.i=i+1);let[p,n]=o.split(me);if(n){if(n=parseFloat(n),f==='"')return[p,n];if(f==="#")return[N.ify(p),n];if(f==="+")return p.length===0?[!0,n]:[parseFloat(p),n];if(f==="-")return[!1,n];if(f===" ")return[null,n]}else{if(f==='"')return o;if(f==="#")return N.ify(o);if(f==="+")return o.length===0?!0:parseFloat(o);if(f==="-")return!1;if(f===" ")return null}};var we=Q;var ve=typeof document>"u",G=ve?await import("node:fs"):void 0,be="",ie="",ce=ie+"+0"+ie+"#"+ie+'"root'+ie,Ne=e=>{let t=e.file;if(ve)return G.existsSync(t)||G.mkdirSync(t),G.existsSync(t+"/!")||G.writeFileSync(t+"/!",ce),{get:(o,i)=>{G.readFile(t+"/"+o,(r,u)=>{if(r){if(r.code==="ENOENT"){i();return}console.log("fs.readFile error:",r)}u&&(u=u.toString()),i(r,u)})},put:(o,i,r)=>{var u=o+"."+E.random(9)+".tmp";G.writeFile(u,i,f=>{if(f){console.log("fs.writeFile error:",f),r(f);return}G.rename(u,t+"/"+o,r)})},list:o=>{G.readdir(t,(i,r)=>{r.forEach(o),o()})}};if(e.indexedDB){let o,i=indexedDB.open(t,1);return i.onupgradeneeded=r=>{r.target.result.createObjectStore(t)},i.onerror=r=>{console.log(r)},i.onsuccess=()=>{if(o=i.result,o){let u=o.transaction([t],"readonly").objectStore(t).getKey("!");u.onerror=()=>{console.log(`error getting key ${t}/!`)},u.onsuccess=()=>{if(!u.result){let p=o.transaction([t],"readwrite").objectStore(t).put(ce,"!");p.onerror=()=>{console.log(`error putting root on ${t}/!`)}}}}else console.log("error indexedDB not available")},{get:(r,u)=>{let f=(g,y)=>{let w=o.transaction([t],"readonly").objectStore(t).get(g);w.onerror=()=>{console.log(`error getting ${t}/${g}`)},w.onsuccess=()=>{y(null,w.result)}};if(o){f(r,u);return}let p=0,n=setInterval(()=>{if(o){clearInterval(n),f(r,u);return}p++>5&&(clearInterval(n),u("error indexedDB not available"))},1e3)},put:(r,u,f)=>{let p=(y,m,w)=>{let l=o.transaction([t],"readwrite").objectStore(t).put(m,y);l.onerror=()=>{console.log(`error putting data on ${t}/${y}`)},l.onsuccess=()=>{w(null)}};if(o){p(r,u,f);return}let n=0,g=setInterval(()=>{if(o){clearInterval(g),p(r,u,f);return}n++>5&&(clearInterval(g),f("error indexedDB not available"))},1e3)},list:r=>{let u=n=>{let y=o.transaction([t],"readonly").objectStore(t).getAllKeys();y.onerror=()=>console.log("error getting keys for",t),y.onsuccess=()=>{y.result.forEach(n),n()}};if(o){u(r);return}let f=0,p=setInterval(()=>{if(o){clearInterval(p),u(r);return}f++>5&&(clearInterval(p),console.log("error indexedDB not available"),r())},1e3)}}}return{get:(o,i)=>{i(null,ce)},put:(o,i,r)=>{r(null)},list:o=>{o("!"),o()}}},Ke=e=>{P.is(e)||(e={}),e.file=String(e.file||"radata"),e.store||(e.store=Ne(e));let t=we(e);return{get:(o,i)=>{if(!o){i("lex required");return}var r=o["#"],u=typeof o["."]=="string"?o["."]:"",f;let p=(n,g)=>{q(o["."],g)&&(f||(f={_:{"#":r,">":{}}}),f[g]=n[0],f._[">"][g]=n[1])};t(r+be+u,(n,g)=>{let y;P.is(g)?(U.map(g,p),f||p(g,u),y={[r]:f}):g&&(p(g,u),y={[r]:f}),i(n,y)})},put:(o,i)=>{if(!o){i("graph required");return}var r=0;let u=f=>{if(r--,!u.err){if(u.err=f,u.err){i(u.err);return}r===0&&i(null)}};Object.keys(o).forEach(f=>{var p=o[f];Object.keys(p).forEach(n=>{if(n==="_")return;r++;let g=p[n],y=p._[">"][n];t(f+be+n,[g,y],u)})})}}},Se=Ke;var ke=typeof document>"u",je=ke?await import("ws"):void 0;typeof globalThis.WebSocket>"u"&&(globalThis.WebSocket=je?.WebSocket);var Ie=e=>{let t=ge(e.maxAge),o=Se(e),i={},r={},u={},f=async(s,l,a)=>{for(let c of Object.keys(s)){let d=await new Promise(b=>{g({"#":c},b,l)});if(d.err)return a&&a(d.err),!1;let h=s[c],v=B;if(!(!d.put||!d.put[c]||d.put[c][v]===h[v]))return a&&a(`error in wire check public key does not match for soul: ${c}`),!1}return!0},p=(s,l)=>{let a=ue(s.get,i);a?l(JSON.stringify({"#":t.track(E.random(9)),"@":s["#"],put:a})):o.get(s.get,(c,d)=>{l(JSON.stringify({"#":t.track(E.random(9)),"@":s["#"],put:d,err:c}))})},n=async(s,l)=>{let a=await ae.mix(s.put,i,e.secure,u);if(Object.keys(a.now).length){if(!await f(a.now,l))return;o.put(a.now,c=>{l(JSON.stringify({"#":t.track(E.random(9)),"@":s["#"],err:c}))})}Object.keys(a.defer).length&&setTimeout(()=>n({put:a.defer},l),a.wait)},g=(s,l,a,c)=>{if(!l)return;P.is(c)||(c={});let d=ue(s,i),h=E.random(9),v=JSON.stringify({"#":t.track(h),get:e.secure?{"#":s["#"]}:s});if(d){a(v),l({put:d});return}o.get(s,(b,S)=>{if(S){a(v),l({put:S,err:b});return}b&&console.log(b),r[h]=l,a(v),setTimeout(()=>{let $=r[h];if($){let j=s["#"],O={[j]:null};typeof s["."]=="string"&&(O[j]={[s["."]]:null}),$({put:O}),delete r[h]}},c.wait||100)})},y=s=>({get:(l,a,c)=>{g(l,a,s,c)},put:async(l,a)=>{let c=await ae.mix(l,i,e.secure,u);Object.keys(c.now).length===0||!await f(c.now,s,a)||(o.put(c.now,a),s(JSON.stringify({"#":t.track(E.random(9)),put:l})))},on:(l,a,c,d)=>{let h=l&&l["#"];!h||!a||(u[h]?u[h].push({".":l["."],cb:a}):u[h]=[{".":l["."],cb:a}],c&&g(l,a,s,d))},off:(l,a)=>{let c=l&&l["#"];if(!(!c||!u[c]))if(a){let d=u[c].find(h=>h.cb===a);d&&u[c].splice(u[c].indexOf(d),1)}else delete u[c]}});if(ke){let s=e.wss,l=()=>s.clients();if(!s){let c=e.server?{server:e.server}:{port:e.port||8765};s=new je.WebSocketServer(c),l=()=>s.clients}let a=(c,d)=>{l().forEach(h=>{if(h&&h.readyState===WebSocket.OPEN)h.send(c,{binary:d});else{let v=0,b=setInterval(()=>{if(h&&h.readyState===WebSocket.OPEN){clearInterval(b),h.send(c,{binary:d});return}v++>5&&clearInterval(b)},1e3)}})};return s.on("connection",c=>{c.on("error",console.error),c.on("message",(d,h)=>{let v=JSON.parse(d);if(t.check(v["#"]))return;t.track(v["#"]),v.get&&p(v,a),v.put&&n(v,a),a(d,h);let b=v["@"],S=r[b];S&&(delete v["#"],delete v["@"],S(v),delete r[b])})}),y(a)}let m=[],w=s=>{m.forEach(l=>{if(l&&l.readyState===WebSocket.OPEN)l.send(s);else{let a=0,c=setInterval(()=>{if(l&&l.readyState===WebSocket.OPEN){clearInterval(c),l.send(s);return}a++>5&&clearInterval(c)},1e3)}})};return e.peers instanceof Array||(e.peers=[`ws://localhost:${e.port||8765}`]),e.peers.forEach(s=>{let l=()=>{let a=new WebSocket(s);m.push(a),a.onclose=c=>{m.indexOf(a)!==-1&&m.splice(m.indexOf(a),1),a=null,setTimeout(l,Math.floor(Math.random()*5e3))},a.onerror=c=>{console.error(c)},a.onmessage=c=>{let d=JSON.parse(c.data);if(t.check(d["#"]))return;t.track(d["#"]),d.get&&p(d,w),d.put&&n(d,w),w(c.data);let h=d["@"],v=r[h];v&&(delete d["#"],delete d["@"],v(d),delete r[h])}};l()}),y(w)},oe=Ie;var De=(e,t)=>{t||(t=oe(e));let o=[],i=!1,r=!1,u=0,f=(n,g,y,m)=>{let w=c=>{u++,f(c,g,y,m)},s=c=>{o=[],u=0,r=!1,m(c)},l=()=>{if(o.length===0){s("Wrong username or password");return}let c=o.shift();t.get({"#":c},async d=>{if(d.err){s(`error getting ${c}: ${d.err}`);return}let h=d.put&&d.put[c];if(!h||!h.auth)return l();let v=JSON.parse(h.auth),b=await I.work(g,v.salt),S=await I.decrypt(v.enc,b);if(!S)return l();if(p.is={username:n,pub:h.pub,epub:h.epub,priv:S.priv,epriv:S.epriv},y!==""){let $=E.random(64),j=await I.work(y,$),O=await I.encrypt(S,j),A={username:n,pub:h.pub,epub:h.epub,auth:JSON.stringify({enc:O,salt:$})},_=await I.sign(A,p.is),x=H(c,_.m,_.s,h.pub);t.put(x,k=>{s(k?`error putting ${A} on ${c}: ${k}`:null)});return}return s(null)},{wait:1e3})};if(u>9){s("Wrong username or password");return}let a="~@"+n;t.get({"#":a},async c=>{if(c.err){s(`error getting ${a}: ${c.err}`);return}let d=c.put&&c.put[a];if(!d)return w(n);delete c.put[a]._,o=Object.keys(d),l()},{wait:1e3})},p={create:(n,g,y)=>{let m=s=>{y?y(s):console.log(s)};if(i){m("User is already being created");return}if(n===""){m("Please provide a username");return}if(g===""){m("Please provide a password");return}i=!0;let w="~@"+n;t.get({"#":w},async s=>{if(s.err){i=!1,m(`error getting ${w}: ${s.err}`);return}if(s.put&&s.put[w]){i=!1,m("Username already exists");return}let l=E.random(64),a=await I.work(g,l),c=await I.pair(),d={priv:c.priv,epriv:c.epriv},h=await I.encrypt(d,a),v={username:n,pub:c.pub,epub:c.epub,auth:JSON.stringify({enc:h,salt:l})},b="~"+c.pub,S=await I.sign(v,c),$=H(b,S.m,S.s,c.pub);t.put($,j=>{if(i=!1,j){m(`error putting ${v} on ${b}: ${j}`);return}let O={[b]:{"#":b}};t.put(H(w,O),A=>{if(A){m(`error putting ${O} on ${w}: ${A}`);return}y&&y(null)})})},{wait:1e3})},auth:(n,g,y)=>{let m=w=>{y?y(w):w&&console.log(w)};if(r){m("User is already authenticating");return}if(p.is=null,n===""){m("Please provide a username");return}if(g===""){m("Please provide a password");return}r=!0,f(n,g,"",m)},change:(n,g,y,m)=>{let w=s=>{m?m(s):s&&console.log(s)};if(r){w("User is already authenticating");return}if(p.is=null,n===""){w("Please provide a username");return}if(g===""){w("Please provide a password");return}if(y===""){w("Please provide a new password");return}r=!0,f(n,g,y,w)},store:n=>{if(!p.is){console.log("Please authenticate before calling store");return}if(n){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 n=globalThis.localStorage.getItem("user.is");if(n){p.is=JSON.parse(n);return}}if(typeof globalThis.sessionStorage<"u"){let n=globalThis.sessionStorage.getItem("user.is");n&&(p.is=JSON.parse(n))}},leave:()=>{p.is=null,typeof globalThis.localStorage<"u"&&globalThis.localStorage.removeItem("user.is"),typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.removeItem("user.is")},delete:(n,g,y)=>{let m=w=>{y?y(w):console.log(w)};if(r){m("User is already authenticating");return}if(n===""){m("Please provide a username");return}if(g===""){m("Please provide a password");return}r=!0,f(n,g,"",async w=>{if(w){m(w);return}let s={username:null,pub:null,epub:null,auth:null},l=await I.sign(s,p.is),a="~"+p.is.pub,c=H(a,l.m,l.s,p.is.pub);t.put(c,d=>{if(d){m(`error putting null on ${a}: ${d}`);return}p.is=null,y&&y(null)})})}};return p},$e=De;var Be=e=>{typeof e=="string"?e={peers:[e]}:e instanceof Array?e={peers:e}:P.is(e)||(e={});let t=oe(e),o=$e(null,t),i=new Map,r=new Map,u=n=>n===null||n===!0||n===!1||typeof n=="string"||N.is(n)||V.is(n),f=n=>{if(u(n))return!0;if(P.is(n)){let y=[];for(let[m,w]of Object.entries(n)){if(m==="_")return"error underscore cannot be used as a property name";if(P.is(w)||u(w)){y.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(y.length!==0)return y}return`error ${JSON.stringify(n)} cannot be converted to a graph`},p=n=>{let g=(s,l,a,c)=>{t.get(P.put(s,"#",l),async d=>{if(d.err&&console.log(d.err),d.put&&d.put[l]){delete d.put[l]._,delete d.put[l][B],delete d.put[l][W];for(let h of Object.keys(d.put[l])){let v=N.is(d.put[l][h]);if(v){let b=await new Promise(S=>{let $=E.random();r.set($,{chain:[{item:null,soul:v}]}),p($).next(null,S,c)});d.put[l][h]=b}}a(d.put[l])}else a(null)},c)},y=async(s,l,a,c)=>{if(a){let d=await I.sign(l,a);return H(s,d.m,d.s,a.pub)}return e.secure?(c||(c=console.log),c(`error putting data on ${s}: user required in secure mode`),null):H(s,l)},m=s=>l=>{let a=r.get(s);a&&typeof a.cb<"u"?setTimeout(()=>a.cb(l),1):l&&console.log("error no callback for data",l,"ctx",a),a&&!a.on&&r.delete(s)},w=(s,l)=>{if(!s){console.log("error resolve request parameter required");return}let a=typeof s.get<"u",c=typeof s.put<"u",d=typeof s.on<"u",h=typeof s.off<"u",v=!1,b=r.get(n);for(var S=1;S<b.chain.length;S++)if(b.chain[S].soul===null){v=!0;break}if(v){let{item:$,soul:j}=b.chain[S-1],O=b.user||e.secure?{"#":j}:{"#":j,".":$};return t.get(O,async A=>{if(A.err){b.user||e.secure?console.log(`error getting ${j}: ${A.err}`):console.log(`error getting ${$} on ${j}: ${A.err}`),l&&l(null);return}let _=A.put&&A.put[j];if(_&&typeof _[$]<"u"){let x=N.is(_[$]);if(x)b.chain[S].soul=x,r.set(n,{...b}),a?p(n).next(null,s.get,l,s._opt):c?p(n).put(s.put,l):d?p(n).on(s.on,l,s._get,s._opt):h&&p(n).off(l);else if(a)l(_[$]);else if(c){x=E.random(),_[$]=N.ify(x);let k=await y(j,_,b.user,l);if(k===null)return;t.put(k,C=>{if(C){l(`error putting ${$} on ${j}: ${C}`);return}b.chain[S].soul=x,p(n).put(s.put,l)})}else(d||h&&l)&&l(null)}else if(c){let x=E.random();_||(_={}),_[$]=N.ify(x);let k=await y(j,_,b.user,l);if(k===null)return;t.put(k,C=>{if(C){l(`error putting ${$} on ${j}: ${C}`);return}b.chain[S].soul=x,p(n).put(s.put,l)})}else l&&l(null)},s._opt),!1}return a&&b.chain[b.chain.length-1].item!==null?(b.chain.push({item:null,soul:null}),p(n).next(null,s.get,l,s._opt),!1):b.chain[b.chain.length-1]};return{get:(s,l,a,c)=>{if(typeof l=="function"&&(c=a,a=l,l=null),s===null||s===""||s==="_"){console.log("error please provide a key"),a&&a(null);return}if(l&&typeof a!="function"){console.log("error lex requires a callback function");return}if(n=E.random(),r.set(n,{chain:[{item:s,soul:"root"}],cb:a}),!a)return p(n);let d=m(n),{soul:h}=w({get:l,_opt:c},d);h&&g(l,h,d,c)},next:(s,l,a,c)=>{let d=S=>$=>{a?a($):m(S)($)};if(typeof l=="function"&&(c=a,a=l,l=null),!n){console.log("error please provide a key using get(key)"),a&&a(null);return}let h=d(n);if(s===""||s==="_"){h(null);return}if(l&&typeof a!="function"){console.log("error lex requires a callback function");return}let v=r.get(n);if(!v)return;if(a&&typeof v.cb>"u"&&(v.cb=a,a=null),s!==null&&v.chain.push({item:s,soul:null}),!v.cb)return p(n);let{soul:b}=w({get:l,_opt:c},h);b&&g(l,b,h,c)},put:(s,l,a)=>{typeof l=="function"&&(a=l,l=!1);let c=j=>O=>{a?a(O):m(j)(O)};if(!n){a&&a("error please provide a key using get(key)");return}let d=r.get(n);if(!d)return;if(!d.cb){if(!a)return;d.cb=a,a=null}l&&(s={[E.random()]:s});let h=c(n),v=f(s);if(typeof v=="string"){h(v);return}let{item:b,soul:S}=w({put:s},h);if(!S)return;if(v===!0){let j=d.user||e.secure?{"#":S}:{"#":S,".":b};t.get(j,async O=>{if(O.err){h(`error getting ${S}: ${O.err}`);return}let A=O.put&&O.put[S],_=A&&A[b],x=N.is(_);if(!x){A||(A={}),A[b]=s;let k=await y(S,A,d.user,h);if(k===null)return;t.put(k,h);return}t.get({"#":x},async k=>{if(k.err){h(`error getting ${x}: ${k.err}`);return}if(!k.put||!k.put[x]){h(`error ${x} not found`);return}for(let D of Object.keys(k.put[x])){if(D==="_"||D===B||D===W)continue;let M=await new Promise(se=>{let pe=E.random(),Oe=[{item:D,soul:x}];r.set(pe,{chain:Oe,user:d.user}),p(pe).put(null,se)});if(M){h(M);return}}A||(A={}),A[b]=s;let C=await y(S,A,d.user,h);C!==null&&t.put(C,h)})});return}let $=d.user||e.secure?{"#":S}:{"#":S,".":b};t.get($,async j=>{if(j.err){h(`error getting ${S}.${b}: ${j.err}`);return}let O=j.put&&j.put[S],A=O&&O[b],_=N.is(A);if(!_){O||(O={}),O[b]=N.ify(E.random());let k=await y(S,O,d.user,h);if(k===null)return;t.put(k,C=>{if(C)h(`error putting ${b} on ${S}: ${C}`);else{let D=E.random(),M=[{item:b,soul:S}];r.set(D,{chain:M,user:d.user,cb:d.cb}),p(D).put(s)}});return}let x=[];for(let k of v){let C=await new Promise(D=>{if(P.is(s[k])&&!N.is(s[k])){let M=E.random(),se=[{item:k,soul:_}];r.set(M,{chain:se,user:d.user}),p(M).put(s[k],D)}else x.push(k),D(null)});if(C){h(C,n);return}}if(x.length===0){h(null);return}t.get({"#":_},async k=>{if(k.err){h(`error getting ${_}: ${k.err}`);return}let C=k.put&&k.put[_];C||(C={}),x.forEach(M=>{C[M]=s[M]});let D=await y(_,C,d.user,h);D!==null&&t.put(D,h)})})},on:(s,l,a,c)=>{if(typeof s=="function"&&(c=a,a=l,l=s,s=null),typeof l!="function"){console.log("error on() requires a callback function");return}if(!n){console.log("error please provide a key using get(key)"),l(null);return}let{item:d,soul:h}=w({on:s,_get:a,_opt:c},l);h&&(r.set(n,{chain:[{item:d,soul:h}],on:!0}),i.set(l,()=>p(n).next(null,l,c)),t.get({"#":h,".":d},v=>{if(v.err){console.log(`error getting ${h}.${d}: ${v.err}`);return}let b=v.put&&v.put[h]&&v.put[h][d],S=N.is(b);S?s?s=P.put(s,"#",S):s={"#":S,".":null}:s?s=P.put(s,"#",h):s={"#":h,".":d},t.on(s,i.get(l),a,c)},c))},off:s=>{if(!n){console.log("error please provide a key using get(key)"),s&&s(null);return}let{item:l,soul:a}=w({off:!0},s);a&&t.get({"#":a,".":l},c=>{if(c.err){console.log(`error getting ${a}.${l}: ${c.err}`);return}let d=c.put&&c.put[a]&&c.put[a][l],h=N.is(d);h?t.off({"#":h},i.get(s)):t.off({"#":a},i.get(s)),i.delete(s),r.delete(n)})},user:()=>(o.get||(Object.assign(o,p()),o.get=(s,l,a,c)=>{typeof l=="function"&&(c=a,a=l,l=null);let d=null,h=null;if(o.is&&(d=o.is.pub),typeof s=="string"?h=s:s instanceof Array&&(s.length===2?(d=s[0],h=s[1]):s.length===1&&(h=s[0])),!d){console.log("error please log in or provide a public key"),a&&a(null);return}if(h===null||h===""||h==="_"){console.log("error please provide a key"),a&&a(null);return}if(l&&!a){console.log("error lex requires a callback function");return}n=E.random();let v=[{item:h,soul:"~"+d}];if(r.set(n,{chain:v,user:o.is,cb:a}),!a)return p(n);let b=m(n),{soul:S}=w({get:l,_opt:c},b);S&&g(l,S,b,c)}),o),wire:t,SEA:I}};return p()},gt=Be;export{gt as default};
|
|
1
|
+
var te={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}},C={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 i=0;i<n.length;i++){let u=t(e[n[i]],n[i],r);if(typeof u<"u")return u}},put:(e,t,r)=>(e||(e={}),e[t]=r,e),del:(e,t)=>{if(e)return e[t]=null,delete e[t],e}},Ie=(e,t,r)=>{if(r.id){r.id=!1;return}if(t==="#"&&typeof e=="string"){r.id=e;return}r.id=!1},N={is:e=>{if(e&&e["#"]&&!e._&&C.is(e)){let t={};if(C.map(e,Ie,t),t.id)return t.id}return!1},ify:e=>C.put({},"#",e)},D="_holster_user_signature",P="_holster_user_public_key",H=(e,t,r,n)=>{let i=Date.now(),u={[e]:{_:{"#":e,">":{}}}};for(let[a,p]of Object.entries(t))a!=="_"&&a!==P&&a!==D&&(u[e][a]=p,u[e]._[">"][a]=i);return r&&n&&(u[e][D]=r,u[e]._[">"][D]=i,u[e][P]=n,u[e]._[">"][P]=i),u},z=(e,t)=>{if(typeof t>"u")return e===null;if(typeof e>"u")return!0;if(typeof e=="string")return e===t;if(!C.is(e)||!t)return!1;let r=e["*"];if(r)return t.slice(0,r.length)===r;let n=e[">"],i=e["<"];return n&&i?t>=n&&t<=i:n?t>=n:i?t<=i:!1},_={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 Ne=e=>{e||(e=9e3);let t={store:{}};return t.check=r=>t.store[r]?t.track(r):!1,t.track=r=>(t.store[r]=Date.now(),t.expiry||(t.expiry=setTimeout(()=>{if(t.expiry)return;let n=Date.now();Object.keys(t.store).forEach(i=>{n-t.store[i]>e&&delete t.store[i]}),t.expiry=null},e)),r),t},he=Ne;var Ue=(e,t)=>{if(!e||typeof e!="object")throw new TypeError("lex must be an object");if(!t||typeof t!="object")throw new TypeError("graph must be an object");let r=e["#"];if(!r||typeof r!="string")throw new TypeError("soul must be a string");if(!t[r])return;let n={_:{"#":r,">":{}}};if(typeof e["."]=="string"){let i=e["."];if(typeof t[r][i]>"u")return;n[i]=t[r][i],n._[">"][i]=t[r]._[">"][i]}else for(let i of Object.keys(t[r]))z(e["."],i)&&(n[i]=t[r][i],n._[">"][i]=t[r]._[">"][i]);return{[r]:n}},ae=Ue;typeof btoa>"u"&&(globalThis.btoa=e=>Buffer.from(e,"binary").toString("base64"),globalThis.atob=e=>Buffer.from(e,"base64").toString("binary"));function re(){}Object.assign(re,{from:Array.from});re.prototype=Object.create(Array.prototype);re.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,i=>i.toString(16).padStart(2,"0")).join("")}if(e==="utf8")return Array.from({length:r-t},(n,i)=>{let u=this[i+t];return u<0||u>1114111?"\uFFFD":String.fromCharCode(u)}).join("");if(e==="base64"){let n=Array.from({length:r-t},(i,u)=>{let a=this[u+t];return a<0||a>255?"\uFFFD":String.fromCharCode(a)}).join("");return btoa(n)}};var W=re;var ne={MAX_BUFFER_SIZE:10*1024*1024,MAX_STRING_LENGTH:1024*1024};function G(...e){return console.warn("new SafeBuffer() is deprecated, please use SafeBuffer.from()"),G.from(...e)}G.prototype=Object.create(Array.prototype);var Q=(e,t)=>{if(typeof e!="string")throw new TypeError("Input must be a string for encoding: "+t);if(e.length>ne.MAX_STRING_LENGTH)throw new RangeError(`String too large: ${e.length} > ${ne.MAX_STRING_LENGTH}`)},L=(e,t="buffer operation")=>{if(e>ne.MAX_BUFFER_SIZE)throw new RangeError(`Buffer size too large for ${t}: ${e} > ${ne.MAX_BUFFER_SIZE}`)},Be=e=>{Q(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);L(t.length/2,"hex parsing");let r=new Uint8Array(t.length/2);for(let n=0;n<t.length;n+=2){let i=t.substr(n,2);r[n/2]=parseInt(i,16)}return r},me=e=>{Q(e,"utf8");try{let r=new TextEncoder().encode(e);return L(r.length,"UTF-8 encoding"),r}catch(t){throw new TypeError("Failed to encode UTF-8 string: "+t.message)}},Fe=e=>{Q(e,"binary"),L(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},Pe=e=>{Q(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);L(r.length,"base64 decoding");let n=new Uint8Array(r.length);for(let i=0;i<r.length;i++)n[i]=r.charCodeAt(i);return n}catch(r){throw new TypeError("Failed to decode base64 string: "+r.message)}},we=e=>{let t;if(e instanceof ArrayBuffer)L(e.byteLength,"ArrayBuffer processing"),t=new Uint8Array(e);else if(ArrayBuffer.isView(e))L(e.byteLength||e.length,"TypedArray processing"),t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);else if(Array.isArray(e)){L(e.length,"Array processing");for(let r=0;r<e.length;r++){let n=e[r];if(typeof n!="number"||n<0||n>255||!Number.isInteger(n))throw new TypeError(`Invalid byte value at index ${r}: ${n} (must be integer 0-255)`)}t=new Uint8Array(e)}else if(typeof e=="object"&&e!==null&&typeof e.length=="number"){L(e.length,"array-like processing");let r=Array.from(e);for(let n=0;n<r.length;n++){let i=r[n];if(typeof i!="number"||i<0||i>255||!Number.isInteger(i))throw new TypeError(`Invalid byte value at index ${n}: ${i} (must be integer 0-255)`)}t=new Uint8Array(r)}else throw new TypeError("Unsupported input type: "+typeof e);return t};Object.assign(G,{from(){if(arguments.length===0)throw new TypeError("SafeBuffer.from() requires at least one argument");let t=arguments[0];if(t==null)throw new TypeError("First argument must not be null or undefined");let r;if(typeof t=="string"){let n=(arguments[1]||"utf8").toLowerCase();switch(n){case"hex":r=Be(t);break;case"utf8":case"utf-8":r=me(t);break;case"binary":case"latin1":r=Fe(t);break;case"base64":r=Pe(t);break;case"ascii":Q(t,"ascii");for(let i=0;i<t.length;i++)if(t.charCodeAt(i)>127)throw new TypeError(`Invalid ASCII character at position ${i}: ${t.charCodeAt(i)} > 127`);r=me(t);break;default:throw new TypeError("Unknown encoding: "+n)}}else r=we(t);if(!r||r.length===0)return W.from(new Uint8Array(0));try{return W.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(L(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),W.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 W.from(new Uint8Array(0));let t=0,r=[];for(let n=0;n<e.length;n++){let i=e[n];if(!i)throw new TypeError(`Array element at index ${n} is null or undefined`);let u;try{u=we(i)}catch(a){throw new TypeError(`Invalid array element at index ${n}: ${a.message}`)}t+=u.length,L(t,"buffer concatenation"),r.push(u)}try{let n=new Uint8Array(t),i=0;for(let u of r)n.set(u,i),i+=u.length;return W.from(n)}catch(n){throw new Error("Failed to concatenate buffers: "+n.message)}},isBuffer(e){return e instanceof W||e&&typeof e=="object"&&e.constructor===G},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)}}});G.prototype.from=G.from;G.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 W.prototype.toString.call(this,e,t,r)}catch(n){throw new Error("Failed to convert buffer to string: "+n.message)}};var K=G;var Ke=typeof document>"u",be=Ke?(await import("node:crypto")).webcrypto:globalThis.crypto,O=be.subtle,ie=e=>typeof e=="string"?e:JSON.stringify(e),V=e=>{try{return JSON.parse(e)}catch{return e}},oe=e=>{let t=new Uint8Array(K.alloc(e));return K.from(be.getRandomValues(t))},ee=(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 O.digest({name:"SHA-256"},new TextEncoder().encode(ie(e)));return K.from(t)},ce=async(e,t)=>{let r=e+t.toString("utf8"),n=K.from(await se(r),"binary"),i=Me(n);return await O.importKey("jwk",i,{name:"AES-GCM"},!1,["encrypt","decrypt"])},Me=e=>({kty:"oct",k:e.toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/\=/g,""),ext:!1,alg:"A256GCM"});var Je={pair:async e=>{let t=await O.generateKey({name:"ECDSA",namedCurve:"P-256"},!0,["sign","verify"]).then(async i=>{let u=await O.exportKey("jwk",i.publicKey);return{priv:(await O.exportKey("jwk",i.privateKey)).d,pub:u.x+"."+u.y}}),r=await O.generateKey({name:"ECDH",namedCurve:"P-256"},!0,["deriveKey"]).then(async i=>{let u=await O.exportKey("jwk",i.publicKey);return{epriv:(await O.exportKey("jwk",i.privateKey)).d,epub:u.x+"."+u.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:oe(9),iv:oe(15)},i=await ce(t.epriv,n.s).then(a=>O.encrypt({name:"AES-GCM",iv:new Uint8Array(n.iv)},a,new TextEncoder().encode(ie(e)))),u={ct:K.from(i,"binary").toString("base64"),iv:n.iv.toString("base64"),s:n.s.toString("base64")};return r&&r(u),u},decrypt:async(e,t,r)=>{if(!e||!e.ct||!e.iv||!e.s||!t||!t.epriv)return r&&r(null),null;let n={ct:K.from(e.ct,"base64"),iv:K.from(e.iv,"base64"),s:K.from(e.s,"base64")};try{let i=await ce(t.epriv,n.s).then(a=>O.decrypt({name:"AES-GCM",iv:new Uint8Array(n.iv),tagLength:128},a,new Uint8Array(n.ct))),u=V(new TextDecoder("utf8").decode(i));return r&&r(u),u}catch{return r&&r(null),null}},verify:async(e,t,r)=>{if(!t||!t.pub)return r&&r(null),null;let n=V(e),i=await O.importKey("jwk",ee(t.pub),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]),u={};if(typeof n.m=="string")u=n.m;else for(let f of Object.keys(n.m).sort())f!=="_"&&f!=P&&f!=D&&(u[f]=n.m[f]);let a=await se(u),p=new Uint8Array(K.from(n.s,"base64")),s={name:"ECDSA",hash:{name:"SHA-256"}};if(await O.verify(s,i,p,new Uint8Array(a))){let f=V(n.m);return r&&r(f),f}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 f=V(e);for(let y of Object.keys(f).sort())y!=="_"&&y!=P&&y!=D&&(n[y]=f[y])}let i=await se(n),u=ee(t.pub,t.priv),a={name:"ECDSA",namedCurve:"P-256"},p=await O.importKey("jwk",u,a,!1,["sign"]).then(f=>O.sign({name:"ECDSA",hash:{name:"SHA-256"}},f,new Uint8Array(i))),s={m:n,s:K.from(p,"binary").toString("base64")};return r&&r(s),s},work:async(e,t,r)=>{typeof t=="function"&&(r=t,t=void 0),typeof t>"u"&&(t=oe(9));let n=await O.importKey("raw",new TextEncoder().encode(ie(e)),{name:"PBKDF2"},!1,["deriveBits"]),i={name:"PBKDF2",iterations:1e5,salt:new TextEncoder().encode(t),hash:{name:"SHA-256"}},u=await O.deriveBits(i,n,512),a={epriv:K.from(u,"binary").toString("base64")};return r&&r(a),a},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"},i=ee(e.epub),u=await O.importKey("jwk",i,n,!0,[]),a=ee(t.epub,t.epriv,!1);delete a.key_ops;let p=await O.importKey("jwk",a,n,!1,["deriveBits"]).then(async s=>{let f=await O.deriveBits({public:u,name:"ECDH",namedCurve:"P-256"},s,256),y=await O.importKey("raw",new Uint8Array(f),{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]);return O.exportKey("jwk",y).then(({k:m})=>m)});return r&&r({epriv:p}),{epriv:p}}},B=Je;var Se=100,Re=1e4,pe=(e,t,r,n)=>e<t?{historical:!0}:e>t?{incoming:!0}:(typeof r!="string"&&(r=JSON.stringify(r)||""),typeof n!="string"&&(n=JSON.stringify(n)||""),r===n?{state:!0}:r<n?{current:!0}:{incoming:!0});pe.mix=async(e,t,r,n)=>{if(!e||typeof e!="object")throw new TypeError("change must be an object");if(!t||typeof t!="object")throw new TypeError("graph must be an object");if(!n||typeof n!="object")throw new TypeError("listen must be an object");let i=Date.now(),u={},a={},p=0;for(let f of Object.keys(e)){let y=e[f],m=!1,w=!1,o=0,l=r;if(!y||!y._)continue;let c=y[D],d=y[P];if(c&&d&&(l=!0),f.length>1&&f[0]==="~")if(f[1]==="@")w=!0,l=!1;else{if(d&&f!="~"+d){console.log(`error public key does not match for soul: ${f}`);continue}l=!0}if(!(l&&(!c||!d||!await B.verify({m:y,s:c},{pub:d})))){for(let g of Object.keys(y)){if(g==="_")continue;let h=y[g],b=y._&&y._[">"]?y._[">"][g]:0,S=(t[f]||{})[g],v=(t[f]||{_:{">":{}}})._[">"][g]||0;if(w&&g!==N.is(h)){console.log(`error alias ${w}: ${g} !== ${N.is(h)}`);continue}let E=b-i;if(E>0){if(E>864e5)continue;(p===0||E<p)&&(p=o=E),a[f]||(a[f]={_:{"#":f,">":{}}}),a[f][g]=h,a[f]._[">"][g]=b}else pe(b,v,h,S).incoming&&(u[f]||(u[f]={_:{"#":f,">":{}}}),t[f]||(t[f]={_:{"#":f,">":{}}}),t[f][g]=u[f][g]=h,t[f]._[">"][g]=u[f]._[">"][g]=b,n[f]&&setTimeout(()=>{n[f]&&n[f].filter(T=>z(T["."],g)).forEach(T=>T.cb())},Se),m=!0)}l&&o!==0&&u[f]&&(Object.assign(a[f],u[f]),delete u[f]),m&&n[f]&&setTimeout(()=>{n[f]&&n[f].filter(g=>z(g["."])).forEach(g=>g.cb())},Se)}}let s=Object.keys(t);return s.length>Re&&s.map(m=>{let w=t[m]._&&t[m]._[">"],o=w?Math.max(...Object.values(w)):0;return{soul:m,maxState:o}}).sort((m,w)=>m.maxState-w.maxState).slice(0,s.length-maxSize).forEach(({soul:m})=>delete t[m]),{now:u,defer:a,wait:p}};var ge=pe;var J="",Y="",ve=()=>{let e=(t,r,n)=>{if(n||(e[J]||(e[J]={}),n=e[J]),!t)return n;let i=0,u={},a=t[i],p=t.length-1,s=typeof r>"u",f=n[a];for(;!f&&i<p;)a+=t[++i],f=n[a];if(f)if(i===p){if(s)return typeof f[Y]>"u"?f[J]:f[Y];f[Y]=r}else return!f[J]&&!s&&(f[J]={}),e(t.slice(++i),r,f[J]);else if(C.map(n,(m,w)=>{let o=0,l="";for(;w[o]===t[o];)l+=w[o++];if(l){if(s)return o<=p?void 0:(u[w.slice(o)]=m,m);let c={[w.slice(o)]:m,[t.slice(o)]:{[Y]:r}};return n[l]={[J]:c},delete n[w],!0}})){if(s)return u}else{if(s)return;n[a]||(n[a]={}),n[a][Y]=r}};return e};ve.map=function e(t,r,n,i){i||(i=[]);var u=t[J]||t,a=Object.keys(u).sort(),p;for(let s=0;s<a.length;s++){let f=a[s],y=u[f],m=y[Y];if(typeof m<"u"){if(m=r(m,i.join("")+f,f,i),typeof m<"u")return m}else n&&r(p,i.join(""),f,i);if(y[J]){if(i.push(f),m=e(y[J],r,n,i),typeof m<"u")return m;i.pop()}}};var M=ve;var Ee="",ke="",U="",Z=e=>{var t,r=null;if(e||(e={}),e.log||(e.log=console.log),e.batch||(e.batch=10*1e3),e.write||(e.write=1),e.size||(e.size=1024*1024),!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 n=(i,u,a)=>{if(i=""+i,typeof u=="function")return a=u,u=n.batch(i),typeof u<"u"||n.thrash.at&&(u=n.thrash.at(i),typeof u<"u")?a(t,u):n.read(i,a);if(n.batch(i,u),a&&n.batch.acks.push(a),++n.batch.ed>=e.batch)return n.thrash();clearTimeout(n.batch.timeout),n.batch.timeout=setTimeout(n.thrash,e.write)};return n.batch=M(),n.batch.acks=[],n.batch.ed=0,n.thrash=()=>{if(n.thrash.ing)return n.thrash.more=!0;clearTimeout(n.batch.timeout),n.thrash.more=!1,n.thrash.ing=!0;var i=n.thrash.at=n.batch;n.batch=null,n.batch=M(),n.batch.acks=[],n.batch.ed=0;let u=0;n.save(i,a=>{++u>1||(a&&e.log(a),i.acks.forEach(p=>p(a)),n.thrash.at=null,n.thrash.ing=!1,n.thrash.more&&n.thrash())})},n.save=(i,u)=>{let a={find:(p,s)=>{if(!(s<a.start))return a.start=s,e.store.list(a.lex),!0},lex:p=>{!p||p>a.start?(a.end=p,a.start&&a.mix(a.file||"!",a.start,a.end)):a.file=p},mix:(p,s,f)=>{a.start=a.end=a.file=t,n.parse(p,(y,m)=>{if(y)return u(y);M.map(i,(w,o)=>{if(!(o<s)){if(f&&f<o){a.start=o;return}m(o,w)}}),n.write(p,m,a.next)})},next:p=>{if(p)return u(p);if(a.start)return M.map(i,a.find);u(p)}};M.map(i,a.find)},n.write=(i,u,a)=>{r=null;let p={text:"",limit:"",done:!1,count:0,each:(s,f,y,m)=>{if(p.done)return;p.count++,s=typeof s>"u"?"":"="+Z.encode(s);let w=Z.encode(m.length)+"#"+Z.encode(y)+s+`
|
|
2
|
+
`;if(p.count>1&&m.length===0&&p.text.length+w.length>e.size){let o=y.indexOf(ke);if(p.limit=o===-1?y:y.substring(0,o),p.limit!==i){p.done=!0,p.sub=M(),M.map(u,p.slice),n.write(p.limit,p.sub,a);return}}p.text+=w},slice:(s,f)=>{f<p.limit||p.sub(f,s)}};M.map(u,p.each,!0),e.store.put(i,p.text,a)},n.read=(i,u)=>{if(r){let f=r(i);if(typeof f<"u")return u(t,f)}let a=i.indexOf(ke),p=a===-1?i:i.substring(0,a),s={lex:f=>{if(!f){if(!s.file){u("no file found",t);return}n.parse(s.file,s.it);return}f>p||f<s.file||(s.file=f)},it:(f,y)=>{f&&e.log(f),y&&(r=y,s.value=y(i)),u(f,s.value)}};e.store.list(s.lex)},n.parse=(i,u)=>{let a={disk:M(),read:(p,s)=>{if(p)return u(p);if(!s)return u(t,a.disk);let f=[],y=a.split(s);for(;y;){let m,w,o=y[1];y=a.split(y[2])||"",y[0]==="#"&&(m=y[1],f=f.slice(0,o),o<=f.length&&f.push(m)),y=a.split(y[2])||"",y[0]!==`
|
|
3
|
+
`&&(y[0]==="="&&(w=y[1]),typeof m<"u"&&typeof w<"u"&&a.disk(f.join(""),w),y=a.split(y[2]))}u(t,a.disk)},split:p=>{if(!p)return;let s=-1,f="",y=null;for(;(y=p[++s])&&y!==U;)f+=y;let m={};if(y)return[f,Z.decode(p.slice(s),m),p.slice(s+m.i)]}};e.store.get(i,a.read)},n};Z.encode=e=>{let t="";if(e instanceof Array&&e.length===2&&(t=Ee+e[1],e=e[0]),typeof e=="string"){let n=0,i=null,u=U;for(;i=e[n++];)i===U&&(u+=U);return u+'"'+e+t+U}let r=N.is(e);if(r)return U+"#"+r+t+U;if(te.is(e))return U+"+"+(e||0)+t+U;if(e===!0)return U+"+"+t+U;if(e===!1)return U+"-"+t+U;if(e===null)return U+" "+t+U};Z.decode=(e,t)=>{var r="",n=-1,i=0,u=null,a=null;if(e[0]!==U)return;for(;u=e[++n];)if(a){if(u===U&&--i<=0)break;r+=u}else u===U?i++:a=u||!0;t&&(t.i=n+1);let[p,s]=r.split(Ee);if(s){if(s=parseFloat(s),a==='"')return[p,s];if(a==="#")return[N.ify(p),s];if(a==="+")return p.length===0?[!0,s]:[parseFloat(p),s];if(a==="-")return[!1,s];if(a===" ")return[null,s]}else{if(a==='"')return r;if(a==="#")return N.ify(r);if(a==="+")return r.length===0?!0:parseFloat(r);if(a==="-")return!1;if(a===" ")return null}};var Te=Z;var Ae=typeof document>"u",X=Ae?await import("node:fs"):void 0,je="",ue="",de=ue+"+0"+ue+"#"+ue+'"root'+ue,Le=e=>{let t=e.file;if(Ae)return X.existsSync(t)||X.mkdirSync(t),X.existsSync(t+"/!")||X.writeFileSync(t+"/!",de),{get:(r,n)=>{X.readFile(t+"/"+r,(i,u)=>{if(i){if(i.code==="ENOENT"){n();return}console.log("fs.readFile error:",i)}u&&(u=u.toString()),n(i,u)})},put:(r,n,i)=>{var u=r+"."+_.random(9)+".tmp";X.writeFile(u,n,a=>{if(a){console.log("fs.writeFile error:",a),i(a);return}X.rename(u,t+"/"+r,i)})},list:r=>{X.readdir(t,(n,i)=>{if(n){console.log("fs.readdir error:",n),r();return}i.forEach(r),r()})}};if(e.indexedDB){let r,n=indexedDB.open(t,1);return n.onupgradeneeded=i=>{i.target.result.createObjectStore(t)},n.onerror=i=>{console.log(i)},n.onsuccess=()=>{if(r=n.result,r){let u=r.transaction([t],"readonly").objectStore(t).getKey("!");u.onerror=()=>{console.log(`error getting key ${t}/!`)},u.onsuccess=()=>{if(!u.result){let p=r.transaction([t],"readwrite").objectStore(t).put(de,"!");p.onerror=()=>{console.log(`error putting root on ${t}/!`)}}}}else console.log("error indexedDB not available")},{get:(i,u)=>{let a=(f,y)=>{let w=r.transaction([t],"readonly").objectStore(t).get(f);w.onerror=()=>{console.log(`error getting ${t}/${f}`)},w.onsuccess=()=>{y(null,w.result)}};if(r){a(i,u);return}let p=0,s=setInterval(()=>{if(r){clearInterval(s),a(i,u);return}p++>5&&(clearInterval(s),u("error indexedDB not available"))},1e3)},put:(i,u,a)=>{let p=(y,m,w)=>{let l=r.transaction([t],"readwrite").objectStore(t).put(m,y);l.onerror=()=>{console.log(`error putting data on ${t}/${y}`)},l.onsuccess=()=>{w(null)}};if(r){p(i,u,a);return}let s=0,f=setInterval(()=>{if(r){clearInterval(f),p(i,u,a);return}s++>5&&(clearInterval(f),a("error indexedDB not available"))},1e3)},list:i=>{let u=s=>{let y=r.transaction([t],"readonly").objectStore(t).getAllKeys();y.onerror=()=>console.log("error getting keys for",t),y.onsuccess=()=>{y.result.forEach(s),s()}};if(r){u(i);return}let a=0,p=setInterval(()=>{if(r){clearInterval(p),u(i);return}a++>5&&(clearInterval(p),console.log("error indexedDB not available"),i())},1e3)}}}return{get:(r,n)=>{n(null,de)},put:(r,n,i)=>{i(null)},list:r=>{r("!"),r()}}},He=e=>{C.is(e)||(e={}),e.file=String(e.file||"radata"),e.store||(e.store=Le(e));let t=Te(e);return{get:(r,n)=>{if(!r||!C.is(r)){n("lex required");return}if(!r["#"]){n("soul required in lex");return}var i=r["#"],u=typeof r["."]=="string"?r["."]:"",a;let p=(s,f)=>{z(r["."],f)&&(a||(a={_:{"#":i,">":{}}}),a[f]=s[0],a._[">"][f]=s[1])};t(i+je+u,(s,f)=>{let y;C.is(f)?(M.map(f,p),a||p(f,u),y={[i]:a}):f&&(p(f,u),y={[i]:a}),n(s,y)})},put:(r,n)=>{if(!r){n("graph required");return}let i=0,u=!1,a=p=>{if(i--,!u){if(p){u=!0,n(p);return}i===0&&(u=!0,n(null))}};Object.keys(r).forEach(p=>{var s=r[p];Object.keys(s).forEach(f=>{if(f==="_")return;i++;let y=s[f],m=s._[">"][f];t(p+je+f,[y,m],a)})})}}},$e=He;var xe=typeof document>"u",_e=xe?await import("ws"):void 0;typeof globalThis.WebSocket>"u"&&(globalThis.WebSocket=_e?.WebSocket);var We=e=>{let t=he(e.maxAge),r=$e(e),n={},i={},u={},a=async(o,l,c)=>{for(let d of Object.keys(o)){let g=await new Promise(S=>{f({"#":d},S,l)});if(g.err)return c&&c(g.err),!1;let h=o[d],b=P;if(!(!g.put||!g.put[d]||g.put[d][b]===h[b]))return c&&c(`error in wire check public key does not match for soul: ${d}`),!1}return!0},p=(o,l)=>{let c=ae(o.get,n);c?l(JSON.stringify({"#":t.track(_.random(9)),"@":o["#"],put:c})):r.get(o.get,(d,g)=>{l(JSON.stringify({"#":t.track(_.random(9)),"@":o["#"],put:g,err:d}))})},s=async(o,l)=>{let c=await ge.mix(o.put,n,e.secure,u);if(Object.keys(c.now).length){if(!await a(c.now,l))return;r.put(c.now,d=>{l(JSON.stringify({"#":t.track(_.random(9)),"@":o["#"],err:d}))})}Object.keys(c.defer).length&&setTimeout(()=>s({put:c.defer},l),c.wait)},f=(o,l,c,d)=>{if(!l)return;C.is(d)||(d={});let g=ae(o,n),h=_.random(9),b=JSON.stringify({"#":t.track(h),get:e.secure?{"#":o["#"]}:o});if(g){c(b),l({put:g});return}r.get(o,(S,v)=>{if(v){c(b),l({put:v,err:S});return}S&&console.log(S),i[h]=l,c(b),setTimeout(()=>{let E=i[h];if(E){let j=o["#"],T={[j]:null};typeof o["."]=="string"&&(T[j]={[o["."]]:null}),E({put:T}),delete i[h]}},d.wait||100)})},y=o=>({get:(l,c,d)=>{f(l,c,o,d)},put:async(l,c)=>{let d=await ge.mix(l,n,e.secure,u);if(Object.keys(d.now).length===0){c(null);return}await a(d.now,o,c)&&(r.put(d.now,c),o(JSON.stringify({"#":t.track(_.random(9)),put:l})))},on:(l,c,d,g)=>{let h=l&&l["#"];!h||!c||(u[h]?u[h].push({".":l["."],cb:c}):u[h]=[{".":l["."],cb:c}],d&&f(l,c,o,g))},off:(l,c)=>{let d=l&&l["#"];if(!(!d||!u[d]))if(c){let g=u[d].find(h=>h.cb===c);g&&u[d].splice(u[d].indexOf(g),1)}else delete u[d]}});if(xe){let o=e.wss,l=()=>o.clients();if(!o){let d=e.server?{server:e.server}:{port:e.port||8765};o=new _e.WebSocketServer(d),l=()=>o.clients}let c=(d,g)=>{l().forEach(h=>{if(h&&h.readyState===WebSocket.OPEN)h.send(d,{binary:g});else{let b=0,S=setInterval(()=>{if(h&&h.readyState===WebSocket.OPEN){clearInterval(S),h.send(d,{binary:g});return}b++>5&&clearInterval(S)},1e3)}})};return o.on("connection",d=>{d.on("error",console.error),d.on("message",(g,h)=>{let b=JSON.parse(g);if(t.check(b["#"]))return;t.track(b["#"]),b.get&&p(b,c),b.put&&s(b,c),c(g,h);let S=b["@"],v=i[S];v&&(delete b["#"],delete b["@"],v(b),delete i[S])})}),y(c)}let m=[],w=o=>{m.forEach(l=>{if(l&&l.readyState===WebSocket.OPEN)l.send(o);else{let c=0,d=setInterval(()=>{if(l&&l.readyState===WebSocket.OPEN){clearInterval(d),l.send(o);return}c++>5&&clearInterval(d)},1e3)}})};return e.peers instanceof Array||(e.peers=[`ws://localhost:${e.port||8765}`]),e.peers.forEach(o=>{let l=()=>{let c=new WebSocket(o);m.push(c),c.onclose=d=>{m.indexOf(c)!==-1&&m.splice(m.indexOf(c),1),c=null,setTimeout(l,Math.floor(Math.random()*5e3))},c.onerror=d=>{console.error(d)},c.onmessage=d=>{let g=JSON.parse(d.data);if(t.check(g["#"]))return;t.track(g["#"]),g.get&&p(g,w),g.put&&s(g,w),w(d.data);let h=g["@"],b=i[h];b&&(delete g["#"],delete g["@"],b(g),delete i[h])}};l()}),y(w)},fe=We;var Ge=(e,t)=>{t||(t=fe(e));let r=[],n=!1,i=!1,u=0,a=(s,f,y,m)=>{let w=d=>{u++,a(d,f,y,m)},o=d=>{r=[],u=0,i=!1,m(d)},l=()=>{if(r.length===0){o("Wrong username or password");return}let d=r.shift();t.get({"#":d},async g=>{if(g.err){o(`error getting ${d}: ${g.err}`);return}let h=g.put&&g.put[d];if(!h||!h.auth)return l();let b=JSON.parse(h.auth),S=await B.work(f,b.salt),v=await B.decrypt(b.enc,S);if(!v)return l();if(p.is={username:s,pub:h.pub,epub:h.epub,priv:v.priv,epriv:v.epriv},y!==""){let E=_.random(64),j=await B.work(y,E),T=await B.encrypt(v,j),A={username:s,pub:h.pub,epub:h.epub,auth:JSON.stringify({enc:T,salt:E})},$=await B.sign(A,p.is),x=H(d,$.m,$.s,h.pub);t.put(x,k=>{o(k?`error putting ${A} on ${d}: ${k}`:null)});return}return o(null)},{wait:1e3})};if(u>9){o("Wrong username or password");return}let c="~@"+s;t.get({"#":c},async d=>{if(d.err){o(`error getting ${c}: ${d.err}`);return}let g=d.put&&d.put[c];if(!g)return w(s);delete d.put[c]._,r=Object.keys(g),l()},{wait:1e3})},p={create:(s,f,y)=>{let m=o=>{y?y(o):console.log(o)};if(n){m("User is already being created");return}if(s===""){m("Please provide a username");return}if(f===""){m("Please provide a password");return}n=!0;let w="~@"+s;t.get({"#":w},async o=>{if(o.err){n=!1,m(`error getting ${w}: ${o.err}`);return}if(o.put&&o.put[w]){n=!1,m("Username already exists");return}let l=_.random(64),c=await B.work(f,l),d=await B.pair(),g={priv:d.priv,epriv:d.epriv},h=await B.encrypt(g,c),b={username:s,pub:d.pub,epub:d.epub,auth:JSON.stringify({enc:h,salt:l})},S="~"+d.pub,v=await B.sign(b,d),E=H(S,v.m,v.s,d.pub);t.put(E,j=>{if(n=!1,j){m(`error putting ${b} on ${S}: ${j}`);return}let T={[S]:{"#":S}};t.put(H(w,T),A=>{if(A){m(`error putting ${T} on ${w}: ${A}`);return}y&&y(null)})})},{wait:1e3})},auth:(s,f,y)=>{let m=w=>{y?y(w):w&&console.log(w)};if(i){m("User is already authenticating");return}if(p.is=null,s===""){m("Please provide a username");return}if(f===""){m("Please provide a password");return}i=!0,a(s,f,"",m)},change:(s,f,y,m)=>{let w=o=>{m?m(o):o&&console.log(o)};if(i){w("User is already authenticating");return}if(p.is=null,s===""){w("Please provide a username");return}if(f===""){w("Please provide a password");return}if(y===""){w("Please provide a new password");return}i=!0,a(s,f,y,w)},store:s=>{if(!p.is){console.log("Please authenticate before calling store");return}if(s){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 s=globalThis.localStorage.getItem("user.is");if(s){p.is=JSON.parse(s);return}}if(typeof globalThis.sessionStorage<"u"){let s=globalThis.sessionStorage.getItem("user.is");s&&(p.is=JSON.parse(s))}},leave:()=>{p.is=null,typeof globalThis.localStorage<"u"&&globalThis.localStorage.removeItem("user.is"),typeof globalThis.sessionStorage<"u"&&globalThis.sessionStorage.removeItem("user.is")},delete:(s,f,y)=>{let m=w=>{y?y(w):console.log(w)};if(i){m("User is already authenticating");return}if(s===""){m("Please provide a username");return}if(f===""){m("Please provide a password");return}i=!0,a(s,f,"",async w=>{if(w){m(w);return}let o={username:null,pub:null,epub:null,auth:null},l=await B.sign(o,p.is),c="~"+p.is.pub,d=H(c,l.m,l.s,p.is.pub);t.put(d,g=>{if(g){m(`error putting null on ${c}: ${g}`);return}p.is=null,y&&y(null)})})}};return p},Oe=Ge;var Xe=e=>{typeof e=="string"?e={peers:[e]}:e instanceof Array?e={peers:e}:C.is(e)||(e={});let t=fe(e),r=Oe(null,t),n=new Map,i=new Map,u=s=>s===null||s===!0||s===!1||typeof s=="string"||N.is(s)||te.is(s),a=s=>{if(u(s))return!0;if(C.is(s)){let y=[];for(let[m,w]of Object.entries(s)){if(m==="_")return"error underscore cannot be used as a property name";if(C.is(w)||u(w)){y.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(y.length!==0)return y}return`error ${JSON.stringify(s)} cannot be converted to a graph`},p=s=>{let f=(o,l,c,d)=>{t.get(C.put(o,"#",l),async g=>{if(g.err&&console.log(g.err),g.put&&g.put[l]){delete g.put[l]._,delete g.put[l][P],delete g.put[l][D];for(let h of Object.keys(g.put[l])){let b=N.is(g.put[l][h]);if(b){let S=await new Promise(v=>{let E=_.random();i.set(E,{chain:[{item:null,soul:b}]}),p(E).next(null,v,d)});g.put[l][h]=S}}c(g.put[l])}else c(null)},d)},y=async(o,l,c,d)=>{if(c){let g=await B.sign(l,c);return H(o,g.m,g.s,c.pub)}return e.secure?(d||(d=console.log),d(`error putting data on ${o}: user required in secure mode`),null):H(o,l)},m=o=>l=>{let c=i.get(o);c&&typeof c.cb<"u"?setTimeout(()=>c.cb(l),1):l&&console.log("error no callback for data",l,"ctx",c),c&&!c.on&&i.delete(o)},w=(o,l)=>{if(!o){console.log("error resolve request parameter required");return}let c=typeof o.get<"u",d=typeof o.put<"u",g=typeof o.on<"u",h=typeof o.off<"u",b=!1,S=i.get(s);for(var v=1;v<S.chain.length;v++)if(S.chain[v].soul===null){b=!0;break}if(b){let{item:E,soul:j}=S.chain[v-1],T=S.user||e.secure?{"#":j}:{"#":j,".":E};return t.get(T,async A=>{if(A.err){S.user||e.secure?console.log(`error getting ${j}: ${A.err}`):console.log(`error getting ${E} on ${j}: ${A.err}`),l&&l(null);return}let $=A.put&&A.put[j];if($&&typeof $[E]<"u"){let x=N.is($[E]);if(x)S.chain[v].soul=x,i.set(s,{...S}),c?p(s).next(null,o.get,l,o._opt):d?p(s).put(o.put,l):g?p(s).on(o.on,l,o._get,o._opt):h&&p(s).off(l);else if(c)l($[E]);else if(d){x=_.random(),$[E]=N.ify(x);let k=await y(j,$,S.user,l);if(k===null)return;t.put(k,I=>{if(I){l(`error putting ${E} on ${j}: ${I}`);return}S.chain[v].soul=x,p(s).put(o.put,l)})}else(g||h&&l)&&l(null)}else if(d){let x=_.random();$||($={}),$[E]=N.ify(x);let k=await y(j,$,S.user,l);if(k===null)return;t.put(k,I=>{if(I){l(`error putting ${E} on ${j}: ${I}`);return}S.chain[v].soul=x,p(s).put(o.put,l)})}else l&&l(null)},o._opt),!1}return c&&S.chain[S.chain.length-1].item!==null?(S.chain.push({item:null,soul:null}),p(s).next(null,o.get,l,o._opt),!1):S.chain[S.chain.length-1]};return{get:(o,l,c,d)=>{if(typeof l=="function"&&(d=c,c=l,l=null),o===null||o===""||o==="_"){console.log("error please provide a key"),c&&c(null);return}if(l&&typeof c!="function"){console.log("error lex requires a callback function");return}if(s=_.random(),i.set(s,{chain:[{item:o,soul:"root"}],cb:c}),!c)return p(s);let g=m(s),{soul:h}=w({get:l,_opt:d},g);h&&f(l,h,g,d)},next:(o,l,c,d)=>{let g=v=>E=>{c?c(E):m(v)(E)};if(typeof l=="function"&&(d=c,c=l,l=null),!s){console.log("error please provide a key using get(key)"),c&&c(null);return}let h=g(s);if(o===""||o==="_"){h(null);return}if(l&&typeof c!="function"){console.log("error lex requires a callback function");return}let b=i.get(s);if(!b)return;if(c&&typeof b.cb>"u"&&(b.cb=c,c=null),o!==null&&b.chain.push({item:o,soul:null}),!b.cb)return p(s);let{soul:S}=w({get:l,_opt:d},h);S&&f(l,S,h,d)},put:(o,l,c)=>{typeof l=="function"&&(c=l,l=!1);let d=j=>T=>{c?c(T):m(j)(T)};if(!s){c&&c("error please provide a key using get(key)");return}let g=i.get(s);if(!g)return;if(!g.cb){if(!c)return;g.cb=c,c=null}l&&(o={[_.random()]:o});let h=d(s),b=a(o);if(typeof b=="string"){h(b);return}let{item:S,soul:v}=w({put:o},h);if(!v)return;if(b===!0){let j=g.user||e.secure?{"#":v}:{"#":v,".":S};t.get(j,async T=>{if(T.err){h(`error getting ${v}: ${T.err}`);return}let A=T.put&&T.put[v],$=A&&A[S],x=N.is($);if(!x){A||(A={}),A[S]=o;let k=await y(v,A,g.user,h);if(k===null)return;t.put(k,h);return}t.get({"#":x},async k=>{if(k.err){h(`error getting ${x}: ${k.err}`);return}if(!k.put||!k.put[x]){h(`error ${x} not found`);return}for(let F of Object.keys(k.put[x])){if(F==="_"||F===P||F===D)continue;let R=await new Promise(le=>{let ye=_.random(),Ce=[{item:F,soul:x}];i.set(ye,{chain:Ce,user:g.user}),p(ye).put(null,le)});if(R){h(R);return}}A||(A={}),A[S]=o;let I=await y(v,A,g.user,h);I!==null&&t.put(I,h)})});return}let E=g.user||e.secure?{"#":v}:{"#":v,".":S};t.get(E,async j=>{if(j.err){h(`error getting ${v}.${S}: ${j.err}`);return}let T=j.put&&j.put[v],A=T&&T[S],$=N.is(A);if(!$){T||(T={}),T[S]=N.ify(_.random());let k=await y(v,T,g.user,h);if(k===null)return;t.put(k,I=>{if(I)h(`error putting ${S} on ${v}: ${I}`);else{let F=_.random(),R=[{item:S,soul:v}];i.set(F,{chain:R,user:g.user,cb:g.cb}),p(F).put(o)}});return}let x=[];for(let k of b){let I=await new Promise(F=>{if(C.is(o[k])&&!N.is(o[k])){let R=_.random(),le=[{item:k,soul:$}];i.set(R,{chain:le,user:g.user}),p(R).put(o[k],F)}else x.push(k),F(null)});if(I){h(I,s);return}}if(x.length===0){h(null);return}t.get({"#":$},async k=>{if(k.err){h(`error getting ${$}: ${k.err}`);return}let I=k.put&&k.put[$];I||(I={}),x.forEach(R=>{I[R]=o[R]});let F=await y($,I,g.user,h);F!==null&&t.put(F,h)})})},on:(o,l,c,d)=>{if(typeof o=="function"&&(d=c,c=l,l=o,o=null),typeof l!="function"){console.log("error on() requires a callback function");return}if(!s){console.log("error please provide a key using get(key)"),l(null);return}let{item:g,soul:h}=w({on:o,_get:c,_opt:d},l);h&&(i.set(s,{chain:[{item:g,soul:h}],on:!0}),n.set(l,()=>p(s).next(null,l,d)),t.get({"#":h,".":g},b=>{if(b.err){console.log(`error getting ${h}.${g}: ${b.err}`);return}let S=b.put&&b.put[h]&&b.put[h][g],v=N.is(S);v?o?o=C.put(o,"#",v):o={"#":v,".":null}:o?o=C.put(o,"#",h):o={"#":h,".":g},t.on(o,n.get(l),c,d)},d))},off:o=>{if(!s){console.log("error please provide a key using get(key)"),o&&o(null);return}let{item:l,soul:c}=w({off:!0},o);c&&t.get({"#":c,".":l},d=>{if(d.err){console.log(`error getting ${c}.${l}: ${d.err}`);return}let g=d.put&&d.put[c]&&d.put[c][l],h=N.is(g);h?t.off({"#":h},n.get(o)):t.off({"#":c},n.get(o)),n.delete(o),i.delete(s)})},user:()=>(r.get||(Object.assign(r,p()),r.get=(o,l,c,d)=>{typeof l=="function"&&(d=c,c=l,l=null);let g=null,h=null;if(r.is&&(g=r.is.pub),typeof o=="string"?h=o:o instanceof Array&&(o.length===2?(g=o[0],h=o[1]):o.length===1&&(h=o[0])),!g){console.log("error please log in or provide a public key"),c&&c(null);return}if(h===null||h===""||h==="_"){console.log("error please provide a key"),c&&c(null);return}if(l&&!c){console.log("error lex requires a callback function");return}s=_.random();let b=[{item:h,soul:"~"+g}];if(i.set(s,{chain:b,user:r.is,cb:c}),!c)return p(s);let S=m(s),{soul:v}=w({get:l,_opt:d},S);v&&f(l,v,S,d)}),r),wire:t,SEA:B}};return p()},Et=Xe;export{Et as default};
|
|
4
4
|
//# sourceMappingURL=holster.js.map
|