genosdb 0.2.4 → 0.2.7

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 CHANGED
@@ -86,7 +86,7 @@ This is a distributed database (P2P + CRDT); therefore:
86
86
 
87
87
  The project has achieved the expected stability goals (such as conflict resolution, synchronization, and distributed storage), without intending to ignore the limitations inherent to distributed technologies (P2P + CRDT).
88
88
 
89
- gdb‑p2p has been rigorously tested with our common usage examples in such environments, demonstrating greater stability than many other well-known distributed databases.
89
+ GenosDB has been rigorously tested with our common usage examples in such environments, demonstrating greater stability than many other well-known distributed databases.
90
90
 
91
91
  ---
92
92
 
@@ -114,7 +114,9 @@ import { GDB } from "genosdb"
114
114
 
115
115
  For detailed documentation, visit our [GitHub Wiki](https://github.com/estebanrfp/gdb/wiki).
116
116
 
117
- For interactive, AI-assisted GenosDB documentation, visit our [Devin Wiki](https://deepwiki.com/estebanrfp/gdb).
117
+ For interactive, AI-assisted GenosDB documentation:
118
+
119
+ [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/estebanrfp/gdb)
118
120
 
119
121
  ## Examples
120
122
 
package/dist/gdb.min.js CHANGED
@@ -8,4 +8,4 @@ use chrome, FireFox or Internet Explorer 11`)}var F=l0(),O=s8(),Z=F.Buffer,N=F.k
8
8
  *
9
9
  * @author Feross Aboukhadijeh <https://feross.org>
10
10
  * @license MIT
11
- *//*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> *//*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */var K2=function(Y){const{a:q,b:F}=H6,O=y0(Y*Y),Z=y0(O*Y);return y0(Z+q*Y+F)},z2=function(Y){if(!(Y instanceof o0))throw new TypeError("JacobianPoint expected")},A7=function(Y,q){const F=q.negate();return Y?F:q},Z2=function(Y){return Number.parseInt(Y[0],16)>=8?"00"+Y:Y},$2=function(Y){if(Y.length<2||Y[0]!==2)throw new Error(`Invalid signature integer tag: ${Y1(Y)}`);const q=Y[1],F=Y.subarray(2,q+2);if(!q||F.length!==q)throw new Error("Invalid signature integer: wrong length");if(F[0]===0&&F[1]<=127)throw new Error("Invalid signature integer: trailing length");return{data:b6(F),left:Y.subarray(q+2)}},sY=function(Y){if(Y.length<2||Y[0]!=48)throw new Error(`Invalid signature tag: ${Y1(Y)}`);if(Y[1]!==Y.length-2)throw new Error("Invalid signature: incorrect length");const{data:q,left:F}=$2(Y.subarray(2)),{data:O,left:Z}=$2(F);if(Z.length)throw new Error(`Invalid signature: left bytes after parsing: ${Y1(Z)}`);return{r:q,s:O}},h1=function(Y){return Y instanceof Uint8Array||ArrayBuffer.isView(Y)&&Y.constructor.name==="Uint8Array"},H2=function(Y){if(!h1(Y))throw new Error("Uint8Array expected")},_1=function(...Y){if(Y.every(H2),Y.length===1)return Y[0];const q=Y.reduce((O,Z)=>O+Z.length,0),F=new Uint8Array(q);for(let O=0,Z=0;O<Y.length;O++){const N=Y[O];F.set(N,Z),Z+=N.length}return F};function Y1(Y){H2(Y);let q="";for(let F=0;F<Y.length;F++)q+=tY[Y[F]];return q}var q2=function(Y){if(Y>=Y8._0&&Y<=Y8._9)return Y-Y8._0;if(Y>=Y8.A&&Y<=Y8.F)return Y-(Y8.A-10);if(Y>=Y8.a&&Y<=Y8.f)return Y-(Y8.a-10);return};function H8(Y){if(typeof Y!=="string")throw new Error("hex string expected, got "+typeof Y);const q=Y.length,F=q/2;if(q%2)throw new Error("hex string expected, got unpadded hex of length "+q);const O=new Uint8Array(F);for(let Z=0,N=0;Z<F;Z++,N+=2){const J=q2(Y.charCodeAt(N)),C=q2(Y.charCodeAt(N+1));if(J===void 0||C===void 0){const B=Y[N]+Y[N+1];throw new Error('hex string expected, got non-hex character "'+B+'" at index '+N)}O[Z]=J*16+C}return O}var C8=function(Y){if(typeof Y!=="bigint")throw new Error("Expected bigint");if(!(u0<=Y&&Y<eY))throw new Error("Expected number 0 <= n < 2^256");return Y.toString(16).padStart(64,"0")},c1=function(Y){const q=H8(C8(Y));if(q.length!==32)throw new Error("Error: expected 32 bytes");return q},m1=function(Y){const q=Y.toString(16);return q.length&1?`0${q}`:q},S7=function(Y){if(typeof Y!=="string")throw new TypeError("hexToNumber: expected string, got "+typeof Y);return BigInt(`0x${Y}`)},b6=function(Y){return S7(Y1(Y))},w8=function(Y){return h1(Y)?Uint8Array.from(Y):H8(Y)},j2=function(Y){if(typeof Y==="number"&&Number.isSafeInteger(Y)&&Y>0)return BigInt(Y);if(typeof Y==="bigint"&&l1(Y))return Y;throw new TypeError("Expected valid private scalar: 0 < scalar < curve.n")},y0=function(Y,q=H6.P){const F=Y%q;return F>=u0?F:q+F},m6=function(Y,q){const{P:F}=H6;let O=Y;while(q-- >u0)O*=O,O%=F;return O},QV=function(Y){const{P:q}=H6,F=BigInt(6),O=BigInt(11),Z=BigInt(22),N=BigInt(23),J=BigInt(44),C=BigInt(88),B=Y*Y*Y%q,D=B*B*Y%q,L=m6(D,p1)*D%q,H=m6(L,p1)*D%q,P=m6(H,j8)*B%q,R=m6(P,O)*P%q,k=m6(R,Z)*R%q,v=m6(k,J)*k%q,M=m6(v,C)*v%q,w=m6(M,J)*k%q,x=m6(w,p1)*D%q,g=m6(x,N)*R%q,_=m6(g,F)*B%q,p=m6(_,j8);if(p*p%q!==Y)throw new Error("Cannot find square root");return p},w7=function(Y,q=H6.P){if(Y===u0||q<=u0)throw new Error(`invert: expected positive integers, got n=${Y} mod=${q}`);let F=y0(Y,q),O=q,Z=u0,N=j6,J=j6,C=u0;while(F!==u0){const D=O/F,L=O%F,H=Z-J*D,P=N-C*D;O=F,F=L,Z=J,N=C,J=H,C=P}if(O!==j6)throw new Error("invert: does not exist");return y0(Z,q)},WV=function(Y,q=H6.P){const F=new Array(Y.length),O=Y.reduce((N,J,C)=>{if(J===u0)return N;return F[C]=N,y0(N*J,q)},j6),Z=w7(O,q);return Y.reduceRight((N,J,C)=>{if(J===u0)return N;return F[C]=y0(N*F[C],q),y0(N*J,q)},Z),F},GV=function(Y){const q=Y.length*8-b1*8,F=b6(Y);return q>0?F>>BigInt(q):F},XV=function(Y,q=!1){const F=GV(Y);if(q)return F;const{n:O}=H6;return F>=O?F-O:F},l1=function(Y){return u0<Y&&Y<H6.n},x7=function(Y){return u0<Y&&Y<H6.P};var d1=function(Y){let q;if(typeof Y==="bigint")q=Y;else if(typeof Y==="number"&&Number.isSafeInteger(Y)&&Y>0)q=BigInt(Y);else if(typeof Y==="string"){if(Y.length!==2*b1)throw new Error("Expected 32 bytes of private key");q=S7(Y)}else if(h1(Y)){if(Y.length!==b1)throw new Error("Expected 32 bytes of private key");q=b6(Y)}else throw new TypeError("Expected valid private key");if(!l1(q))throw new Error("Expected private key: 0 < key < n");return q},YV=function(Y){if(Y instanceof Z6)return Y.assertValidity(),Y;else return Z6.fromHex(Y)},VV=function(Y){if(Y instanceof E8)return Y.assertValidity(),Y;try{return E8.fromDER(Y)}catch(q){return E8.fromCompact(Y)}};var E7=function(Y){return y0(b6(Y),H6.n)},JV=function(Y){return Z6.fromPrivateKey(Y).toRawX()};async function UV(Y,q,F){return new z9(Y,q,F).calc()}var FV=function(Y,q,F){return new z9(Y,q,F).calcSync()},C2=function(Y,q,F){const O=Y instanceof V1,Z=O?Y:V1.fromHex(Y);if(O)Z.assertValidity();return{...Z,m:w8(q),P:YV(F)}},O2=function(Y,q,F,O){const Z=Z6.BASE.multiplyAndAddUnsafe(q,d1(F),y0(-O,H6.n));if(!Z||!Z.hasEvenY()||Z.x!==Y)return!1;return!0};async function D2(Y,q,F){try{const{r:O,s:Z,m:N,P:J}=C2(Y,q,F),C=E7(await p6.taggedHash(q8.challenge,c1(O),J.toRawX(),N));return O2(O,J,Z,C)}catch(O){return!1}}var L2=function(Y,q,F){try{const{r:O,s:Z,m:N,P:J}=C2(Y,q,F),C=E7(p6.taggedHashSync(q8.challenge,c1(O),J.toRawX(),N));return O2(O,J,Z,C)}catch(O){if(O instanceof K9)throw O;return!1}};/*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */var u0=BigInt(0),j6=BigInt(1),j8=BigInt(2),p1=BigInt(3),V2=BigInt(8),H6=Object.freeze({a:u0,b:BigInt(7),P:BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),n:BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),h:j6,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee")}),J2=(Y,q)=>(Y+q/j8)/q,T7={beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar(Y){const{n:q}=H6,F=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),O=-j6*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),Z=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),N=F,J=BigInt("0x100000000000000000000000000000000"),C=J2(N*Y,q),B=J2(-O*Y,q);let D=y0(Y-C*F-B*Z,q),L=y0(-C*O-B*N,q);const H=D>J,P=L>J;if(H)D=q-D;if(P)L=q-L;if(D>J||L>J)throw new Error("splitScalarEndo: Endomorphism failed, k="+Y);return{k1neg:H,k1:D,k2neg:P,k2:L}}},G1=32,b1=32;var U2=G1+1,F2=2*G1+1;var M7=H6.a===u0;class K9 extends Error{constructor(Y){super(Y)}}class o0{constructor(Y,q,F){this.x=Y,this.y=q,this.z=F}static fromAffine(Y){if(!(Y instanceof Z6))throw new TypeError("JacobianPoint#fromAffine: expected Point");if(Y.equals(Z6.ZERO))return o0.ZERO;return new o0(Y.x,Y.y,j6)}static toAffineBatch(Y){const q=WV(Y.map((F)=>F.z));return Y.map((F,O)=>F.toAffine(q[O]))}static normalizeZ(Y){return o0.toAffineBatch(Y).map(o0.fromAffine)}equals(Y){z2(Y);const{x:q,y:F,z:O}=this,{x:Z,y:N,z:J}=Y,C=y0(O*O),B=y0(J*J),D=y0(q*B),L=y0(Z*C),H=y0(y0(F*J)*B),P=y0(y0(N*O)*C);return D===L&&H===P}negate(){return new o0(this.x,y0(-this.y),this.z)}double(){const{x:Y,y:q,z:F}=this,O=y0(Y*Y),Z=y0(q*q),N=y0(Z*Z),J=Y+Z,C=y0(j8*(y0(J*J)-O-N)),B=y0(p1*O),D=y0(B*B),L=y0(D-j8*C),H=y0(B*(C-L)-V2*N),P=y0(j8*q*F);return new o0(L,H,P)}add(Y){z2(Y);const{x:q,y:F,z:O}=this,{x:Z,y:N,z:J}=Y;if(Z===u0||N===u0)return this;if(q===u0||F===u0)return Y;const C=y0(O*O),B=y0(J*J),D=y0(q*B),L=y0(Z*C),H=y0(y0(F*J)*B),P=y0(y0(N*O)*C),R=y0(L-D),k=y0(P-H);if(R===u0)if(k===u0)return this.double();else return o0.ZERO;const v=y0(R*R),M=y0(R*v),w=y0(D*v),x=y0(k*k-M-j8*w),g=y0(k*(w-x)-H*M),_=y0(O*J*R);return new o0(x,g,_)}subtract(Y){return this.add(Y.negate())}multiplyUnsafe(Y){const q=o0.ZERO;if(typeof Y==="bigint"&&Y===u0)return q;let F=j2(Y);if(F===j6)return this;if(!M7){let L=q,H=this;while(F>u0){if(F&j6)L=L.add(H);H=H.double(),F>>=j6}return L}let{k1neg:O,k1:Z,k2neg:N,k2:J}=T7.splitScalar(F),C=q,B=q,D=this;while(Z>u0||J>u0){if(Z&j6)C=C.add(D);if(J&j6)B=B.add(D);D=D.double(),Z>>=j6,J>>=j6}if(O)C=C.negate();if(N)B=B.negate();return B=new o0(y0(B.x*T7.beta),B.y,B.z),C.add(B)}precomputeWindow(Y){const q=M7?128/Y+1:256/Y+1,F=[];let O=this,Z=O;for(let N=0;N<q;N++){Z=O,F.push(Z);for(let J=1;J<2**(Y-1);J++)Z=Z.add(O),F.push(Z);O=Z.double()}return F}wNAF(Y,q){if(!q&&this.equals(o0.BASE))q=Z6.BASE;const F=q&&q._WINDOW_SIZE||1;if(256%F)throw new Error("Point#wNAF: Invalid precomputation window, must be power of 2");let O=q&&F9.get(q);if(!O){if(O=this.precomputeWindow(F),q&&F!==1)O=o0.normalizeZ(O),F9.set(q,O)}let{ZERO:Z,BASE:N}=o0;const J=1+(M7?128/F:256/F),C=2**(F-1),B=BigInt(2**F-1),D=2**F,L=BigInt(F);for(let H=0;H<J;H++){const P=H*C;let R=Number(Y&B);if(Y>>=L,R>C)R-=D,Y+=j6;const k=P,v=P+Math.abs(R)-1,M=H%2!==0,w=R<0;if(R===0)N=N.add(A7(M,O[k]));else Z=Z.add(A7(w,O[v]))}return{p:Z,f:N}}multiply(Y,q){let F=j2(Y),O,Z;if(M7){const{k1neg:N,k1:J,k2neg:C,k2:B}=T7.splitScalar(F);let{p:D,f:L}=this.wNAF(J,q),{p:H,f:P}=this.wNAF(B,q);D=A7(N,D),H=A7(C,H),H=new o0(y0(H.x*T7.beta),H.y,H.z),O=D.add(H),Z=L.add(P)}else{const{p:N,f:J}=this.wNAF(F,q);O=N,Z=J}return o0.normalizeZ([O,Z])[0]}toAffine(Y){const{x:q,y:F,z:O}=this,Z=this.equals(o0.ZERO);if(Y==null)Y=Z?V2:w7(O);const N=Y,J=y0(N*N),C=y0(J*N),B=y0(q*J),D=y0(F*C),L=y0(O*N);if(Z)return Z6.ZERO;if(L!==j6)throw new Error("invZ was invalid");return new Z6(B,D)}}o0.BASE=new o0(H6.Gx,H6.Gy,j6);o0.ZERO=new o0(u0,j6,u0);var F9=new WeakMap;class Z6{constructor(Y,q){this.x=Y,this.y=q}_setWindowSize(Y){this._WINDOW_SIZE=Y,F9.delete(this)}hasEvenY(){return this.y%j8===u0}static fromCompressedHex(Y){const q=Y.length===32,F=b6(q?Y:Y.subarray(1));if(!x7(F))throw new Error("Point is not on curve");const O=K2(F);let Z=QV(O);const N=(Z&j6)===j6;if(q){if(N)Z=y0(-Z)}else if((Y[0]&1)===1!==N)Z=y0(-Z);const J=new Z6(F,Z);return J.assertValidity(),J}static fromUncompressedHex(Y){const q=b6(Y.subarray(1,G1+1)),F=b6(Y.subarray(G1+1,G1*2+1)),O=new Z6(q,F);return O.assertValidity(),O}static fromHex(Y){const q=w8(Y),F=q.length,O=q[0];if(F===G1)return this.fromCompressedHex(q);if(F===U2&&(O===2||O===3))return this.fromCompressedHex(q);if(F===F2&&O===4)return this.fromUncompressedHex(q);throw new Error(`Point.fromHex: received invalid point. Expected 32-${U2} compressed bytes or ${F2} uncompressed bytes, not ${F}`)}static fromPrivateKey(Y){return Z6.BASE.multiply(d1(Y))}static fromSignature(Y,q,F){const{r:O,s:Z}=VV(q);if(![0,1,2,3].includes(F))throw new Error("Cannot recover: invalid recovery bit");const N=XV(w8(Y)),{n:J}=H6,C=F===2||F===3?O+J:O,B=w7(C,J),D=y0(-N*B,J),L=y0(Z*B,J),H=F&1?"03":"02",P=Z6.fromHex(H+C8(C)),R=Z6.BASE.multiplyAndAddUnsafe(P,D,L);if(!R)throw new Error("Cannot recover signature: point at infinify");return R.assertValidity(),R}toRawBytes(Y=!1){return H8(this.toHex(Y))}toHex(Y=!1){const q=C8(this.x);if(Y)return`${this.hasEvenY()?"02":"03"}${q}`;else return`04${q}${C8(this.y)}`}toHexX(){return this.toHex(!0).slice(2)}toRawX(){return this.toRawBytes(!0).slice(1)}assertValidity(){const{x:q,y:F}=this;if(!x7(q)||!x7(F))throw new Error("Point is not on elliptic curve");const O=y0(F*F),Z=K2(q);if(y0(O-Z)!==u0)throw new Error("Point is not on elliptic curve")}equals(Y){return this.x===Y.x&&this.y===Y.y}negate(){return new Z6(this.x,y0(-this.y))}double(){return o0.fromAffine(this).double().toAffine()}add(Y){return o0.fromAffine(this).add(o0.fromAffine(Y)).toAffine()}subtract(Y){return this.add(Y.negate())}multiply(Y){return o0.fromAffine(this).multiply(Y,this).toAffine()}multiplyAndAddUnsafe(Y,q,F){const O=o0.fromAffine(this),Z=q===u0||q===j6||this!==Z6.BASE?O.multiplyUnsafe(q):O.multiply(q),N=o0.fromAffine(Y).multiplyUnsafe(F),J=Z.add(N);return J.equals(o0.ZERO)?void 0:J.toAffine()}}Z6.BASE=new Z6(H6.Gx,H6.Gy);Z6.ZERO=new Z6(u0,u0);class E8{constructor(Y,q){this.r=Y,this.s=q,this.assertValidity()}static fromCompact(Y){const q=h1(Y);if(typeof Y!=="string"&&!q)throw new TypeError("Signature.fromCompact: Expected string or Uint8Array");const O=q?Y1(Y):Y;if(O.length!==128)throw new Error("Signature.fromCompact: Expected 64-byte hex");return new E8(S7(O.slice(0,64)),S7(O.slice(64,128)))}static fromDER(Y){const q=h1(Y);if(typeof Y!=="string"&&!q)throw new TypeError("Signature.fromDER: Expected string or Uint8Array");const{r:F,s:O}=sY(q?Y:H8(Y));return new E8(F,O)}static fromHex(Y){return this.fromDER(Y)}assertValidity(){const{r:Y,s:q}=this;if(!l1(Y))throw new Error("Invalid Signature: r must be 0 < r < n");if(!l1(q))throw new Error("Invalid Signature: s must be 0 < s < n")}hasHighS(){const Y=H6.n>>j6;return this.s>Y}normalizeS(){return this.hasHighS()?new E8(this.r,y0(-this.s,H6.n)):this}toDERRawBytes(){return H8(this.toDERHex())}toDERHex(){const Y=Z2(m1(this.s)),q=Z2(m1(this.r)),F=Y.length/2,O=q.length/2,Z=m1(F),N=m1(O);return`30${m1(O+F+4)}02${N}${q}02${Z}${Y}`}toRawBytes(){return this.toDERRawBytes()}toHex(){return this.toDERHex()}toCompactRawBytes(){return H8(this.toCompactHex())}toCompactHex(){return C8(this.r)+C8(this.s)}}var tY=Array.from({length:256},(Y,q)=>q.toString(16).padStart(2,"0")),Y8={_0:48,_9:57,A:65,F:70,a:97,f:102},eY=BigInt("0x10000000000000000000000000000000000000000000000000000000000000000"),X1,U9;class V1{constructor(Y,q){this.r=Y,this.s=q,this.assertValidity()}static fromHex(Y){const q=w8(Y);if(q.length!==64)throw new TypeError(`SchnorrSignature.fromHex: expected 64 bytes, not ${q.length}`);const F=b6(q.subarray(0,32)),O=b6(q.subarray(32,64));return new V1(F,O)}assertValidity(){const{r:Y,s:q}=this;if(!x7(Y)||!l1(q))throw new Error("Invalid signature")}toHex(){return C8(this.r)+C8(this.s)}toRawBytes(){return H8(this.toHex())}}class z9{constructor(Y,q,F=p6.randomBytes()){if(Y==null)throw new TypeError(`sign: Expected valid message, not "${Y}"`);this.m=w8(Y);const{x:O,scalar:Z}=this.getScalar(d1(q));if(this.px=O,this.d=Z,this.rand=w8(F),this.rand.length!==32)throw new TypeError("sign: Expected 32 bytes of aux randomness")}getScalar(Y){const q=Z6.fromPrivateKey(Y),F=q.hasEvenY()?Y:H6.n-Y;return{point:q,scalar:F,x:q.toRawX()}}initNonce(Y,q){return c1(Y^b6(q))}finalizeNonce(Y){const q=y0(b6(Y),H6.n);if(q===u0)throw new Error("sign: Creation of signature failed. k is zero");const{point:F,x:O,scalar:Z}=this.getScalar(q);return{R:F,rx:O,k:Z}}finalizeSig(Y,q,F,O){return new V1(Y.x,y0(q+F*O,H6.n)).toRawBytes()}error(){throw new Error("sign: Invalid signature produced")}async calc(){const{m:Y,d:q,px:F,rand:O}=this,Z=p6.taggedHash,N=this.initNonce(q,await Z(q8.aux,O)),{R:J,rx:C,k:B}=this.finalizeNonce(await Z(q8.nonce,N,F,Y)),D=E7(await Z(q8.challenge,C,F,Y)),L=this.finalizeSig(J,B,D,q);if(!await D2(L,Y,F))this.error();return L}calcSync(){const{m:Y,d:q,px:F,rand:O}=this,Z=p6.taggedHashSync,N=this.initNonce(q,Z(q8.aux,O)),{R:J,rx:C,k:B}=this.finalizeNonce(Z(q8.nonce,N,F,Y)),D=E7(Z(q8.challenge,C,F,Y)),L=this.finalizeSig(J,B,D,q);if(!L2(L,Y,F))this.error();return L}}var Z9={Signature:V1,getPublicKey:JV,sign:UV,verify:D2,signSync:FV,verifySync:L2};Z6.BASE._setWindowSize(8);var S6={node:J9,web:typeof self==="object"&&("crypto"in self)?self.crypto:void 0},q8={challenge:"BIP0340/challenge",aux:"BIP0340/aux",nonce:"BIP0340/nonce"},v7={},p6={bytesToHex:Y1,hexToBytes:H8,concatBytes:_1,mod:y0,invert:w7,isValidPrivateKey(Y){try{return d1(Y),!0}catch(q){return!1}},_bigintTo32Bytes:c1,_normalizePrivateKey:d1,hashToPrivateKey:(Y)=>{Y=w8(Y);const q=b1+8;if(Y.length<q||Y.length>1024)throw new Error("Expected valid bytes of private key as per FIPS 186");const F=y0(b6(Y),H6.n-j6)+j6;return c1(F)},randomBytes:(Y=32)=>{if(S6.web)return S6.web.getRandomValues(new Uint8Array(Y));else if(S6.node){const{randomBytes:q}=S6.node;return Uint8Array.from(q(Y))}else throw new Error("The environment doesn't have randomBytes function")},randomPrivateKey:()=>p6.hashToPrivateKey(p6.randomBytes(b1+8)),precompute(Y=8,q=Z6.BASE){const F=q===Z6.BASE?q:new Z6(q.x,q.y);return F._setWindowSize(Y),F.multiply(p1),F},sha256:async(...Y)=>{if(S6.web){const q=await S6.web.subtle.digest("SHA-256",_1(...Y));return new Uint8Array(q)}else if(S6.node){const{createHash:q}=S6.node,F=q("sha256");return Y.forEach((O)=>F.update(O)),Uint8Array.from(F.digest())}else throw new Error("The environment doesn't have sha256 function")},hmacSha256:async(Y,...q)=>{if(S6.web){const F=await S6.web.subtle.importKey("raw",Y,{name:"HMAC",hash:{name:"SHA-256"}},!1,["sign"]),O=_1(...q),Z=await S6.web.subtle.sign("HMAC",F,O);return new Uint8Array(Z)}else if(S6.node){const{createHmac:F}=S6.node,O=F("sha256",Y);return q.forEach((Z)=>O.update(Z)),Uint8Array.from(O.digest())}else throw new Error("The environment doesn't have hmac-sha256 function")},sha256Sync:void 0,hmacSha256Sync:void 0,taggedHash:async(Y,...q)=>{let F=v7[Y];if(F===void 0){const O=await p6.sha256(Uint8Array.from(Y,(Z)=>Z.charCodeAt(0)));F=_1(O,O),v7[Y]=F}return p6.sha256(F,...q)},taggedHashSync:(Y,...q)=>{if(typeof X1!=="function")throw new K9("sha256Sync is undefined, you need to set it");let F=v7[Y];if(F===void 0){const O=X1(Uint8Array.from(Y,(Z)=>Z.charCodeAt(0)));F=_1(O,O),v7[Y]=F}return X1(F,...q)},_JacobianPoint:o0};Object.defineProperties(p6,{sha256Sync:{configurable:!1,get(){return X1},set(Y){if(!X1)X1=Y}},hmacSha256Sync:{configurable:!1,get(){return U9},set(Y){if(!U9)U9=Y}}});var{floor:$9,random:KV,sin:zV}=Math,g8="Trystero",O8=(Y,q)=>Array(Y).fill().map(q);var y7=(Y)=>O8(Y,()=>"0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"[$9(KV()*"0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz".length)]).join(""),a6=y7(20),n6=Promise.all.bind(Promise),N2=typeof window!=="undefined",{entries:_7,fromEntries:q9,keys:P2}=Object,V8=()=>{},c6=(Y)=>new Error(`Trystero: ${Y}`),ZV=new TextEncoder,$V=new TextDecoder,r6=(Y)=>ZV.encode(Y),J1=(Y)=>$V.decode(Y),m7=(Y)=>Y.reduce((q,F)=>q+F.toString(16).padStart(2,"0"),""),u1=(...Y)=>Y.join("@"),qV=(Y,q)=>{const F=[...Y],O=()=>{const N=zV(q++)*1e4;return N-$9(N)};let Z=F.length;while(Z){const N=$9(O()*Z--);[F[Z],F[N]]=[F[N],F[Z]]}return F},k2=(Y,q,F,O)=>{return(Y.relayUrls||(O?qV(q,j9(Y.appId)):q)).slice(0,Y.relayUrls?Y.relayUrls.length:Y.relayRedundancy||F)},h6=JSON.stringify,y8=JSON.parse,j9=(Y,q=Number.MAX_SAFE_INTEGER)=>Y.split("").reduce((F,O)=>F+O.charCodeAt(0),0)%q;var g7={},B2=(Y,q)=>{const F={},O=()=>{const Z=new WebSocket(Y);Z.onclose=()=>{g7[Y]??=3333,setTimeout(O,g7[Y]),g7[Y]*=2},Z.onmessage=(N)=>q(N.data),F.socket=Z,F.url=Z.url,F.ready=new Promise((N)=>Z.onopen=()=>{N(F),g7[Y]=3333}),F.send=(N)=>{if(Z.readyState===1)Z.send(N)}};return O(),F},R2=(Y)=>()=>q9(_7(Y).map(([q,F])=>[q,F.socket]));var H9="AES-GCM",jV={},HV=(Y)=>btoa(String.fromCharCode.apply(null,new Uint8Array(Y))),CV=(Y)=>{const q=atob(Y);return new Uint8Array(q.length).map((F,O)=>q.charCodeAt(O)).buffer},f1=async(Y)=>jV[Y]||=Array.from(new Uint8Array(await crypto.subtle.digest("SHA-1",r6(Y)))).map((q)=>q.toString(36)).join(""),I2=async(Y,q,F)=>crypto.subtle.importKey("raw",await crypto.subtle.digest({name:"SHA-256"},r6(`${Y}:${q}:${F}`)),{name:H9},!1,["encrypt","decrypt"]),T2="$",M2=",",A2=async(Y,q)=>{const F=crypto.getRandomValues(new Uint8Array(16));return F.join(M2)+T2+HV(await crypto.subtle.encrypt({name:H9,iv:F},await Y,r6(q)))},v2=async(Y,q)=>{const[F,O]=q.split(T2);return J1(await crypto.subtle.decrypt({name:H9,iv:new Uint8Array(F.split(M2))},await Y,CV(O)))};var OV=5000,x2="icegatheringstatechange",S2="offer",DV="answer",C9=(Y,{rtcConfig:q,rtcPolyfill:F,turnConfig:O})=>{const Z=new(F||RTCPeerConnection)({iceServers:LV.concat(O||[]),...q}),N={};let J=!1,C=!1,B=null;const D=(H)=>{H.binaryType="arraybuffer",H.bufferedAmountLowThreshold=65535,H.onmessage=(P)=>N.data?.(P.data),H.onopen=()=>N.connect?.(),H.onclose=()=>N.close?.(),H.onerror=(P)=>N.error?.(P)},L=(H)=>Promise.race([new Promise((P)=>{const R=()=>{if(H.iceGatheringState==="complete")H.removeEventListener(x2,R),P()};H.addEventListener(x2,R),R()}),new Promise((P)=>setTimeout(P,OV))]).then(()=>({type:H.localDescription.type,sdp:H.localDescription.sdp.replace(/a=ice-options:trickle\s\n/g,"")}));if(Y)B=Z.createDataChannel("data"),D(B);else Z.ondatachannel=({channel:H})=>{B=H,D(H)};if(Z.onnegotiationneeded=async()=>{try{J=!0,await Z.setLocalDescription();const H=await L(Z);N.signal?.(H)}catch(H){N.error?.(H)}finally{J=!1}},Z.onconnectionstatechange=()=>{if(["disconnected","failed","closed"].includes(Z.connectionState))N.close?.()},Z.ontrack=(H)=>{N.track?.(H.track,H.streams[0]),N.stream?.(H.streams[0])},Z.onremovestream=(H)=>N.stream?.(H.stream),Y){if(!Z.canTrickleIceCandidates)Z.onnegotiationneeded()}return{created:Date.now(),connection:Z,get channel(){return B},get isDead(){return Z.connectionState==="closed"},async signal(H){if(B?.readyState==="open"&&!H.sdp?.includes("a=rtpmap"))return;try{if(H.type===S2){if(J||Z.signalingState!=="stable"&&!C){if(Y)return;await n6([Z.setLocalDescription({type:"rollback"}),Z.setRemoteDescription(H)])}else await Z.setRemoteDescription(H);await Z.setLocalDescription();const P=await L(Z);return N.signal?.(P),P}else if(H.type===DV){C=!0;try{await Z.setRemoteDescription(H)}finally{C=!1}}}catch(P){N.error?.(P)}},sendData:(H)=>B.send(H),destroy:()=>{B?.close(),Z.close(),J=!1,C=!1},setHandlers:(H)=>Object.assign(N,H),offerPromise:Y?new Promise((H)=>N.signal=(P)=>{if(P.type===S2)H(P)}):Promise.resolve(),addStream:(H)=>H.getTracks().forEach((P)=>Z.addTrack(P,H)),removeStream:(H)=>Z.getSenders().filter((P)=>H.getTracks().includes(P.track)).forEach((P)=>Z.removeTrack(P)),addTrack:(H,P)=>Z.addTrack(H,P),removeTrack:(H)=>{const P=Z.getSenders().find((R)=>R.track===H);if(P)Z.removeTrack(P)},replaceTrack:(H,P)=>{const R=Z.getSenders().find((k)=>k.track===H);if(R)return R.replaceTrack(P)}}},LV=[...O8(3,(Y,q)=>`stun:stun${q||""}.l.google.com:19302`),"stun:stun.cloudflare.com:3478"].map((Y)=>({urls:Y}));var NV=Object.getPrototypeOf(Uint8Array),b7=12,w2=0,h7=w2+b7,c7=h7+1,o1=c7+1,a1=o1+1,_8=16384-a1,p7=255,E2="bufferedamountlow",U1=(Y)=>"@_"+Y,g2=(Y,q,F)=>{const O={},Z={},N={},J={},C={},B={},D={},L={onPeerJoin:V8,onPeerLeave:V8,onPeerStream:V8,onPeerTrack:V8},H=(Q,G)=>(Q?Array.isArray(Q)?Q:[Q]:P2(O)).flatMap((V)=>{const X=O[V];if(!X)return console.warn(`${g8}: no peer with id ${V} found`),[];return G(V,X)}),P=(Q)=>{if(!O[Q])return;delete O[Q],delete J[Q],delete C[Q],L.onPeerLeave(Q),q(Q)},R=(Q)=>{if(Z[Q])return N[Q];if(!Q)throw c6("action type argument is required");const G=r6(Q);if(G.byteLength>b7)throw c6(`action type string "${Q}" (${G.byteLength}b) exceeds `+`byte limit (${b7}). Hint: choose a shorter name.`);const V=new Uint8Array(b7);V.set(G);let X=0;return Z[Q]={onComplete:V8,onProgress:V8,setOnComplete:(U)=>Z[Q]={...Z[Q],onComplete:U},setOnProgress:(U)=>Z[Q]={...Z[Q],onProgress:U},send:async(U,$,j,K)=>{if(j&&typeof j!=="object")throw c6("action meta argument must be an object");const W=typeof U;if(W==="undefined")throw c6("action data cannot be undefined");const z=W!=="string",A=U instanceof Blob,T=A||U instanceof ArrayBuffer||U instanceof NV;if(j&&!T)throw c6("action meta argument can only be used with binary data");const y=T?new Uint8Array(A?await U.arrayBuffer():U):r6(z?h6(U):U),r=j?r6(h6(j)):null,a=Math.ceil(y.byteLength/_8)+(j?1:0)||1,t=O8(a,(l,h)=>{const n=h===a-1,q0=j&&h===0,G0=new Uint8Array(a1+(q0?r.byteLength:n?y.byteLength-_8*(a-(j?2:1)):_8));return G0.set(V),G0.set([X],h7),G0.set([n|q0<<1|T<<2|z<<3],c7),G0.set([Math.round((h+1)/a*p7)],o1),G0.set(j?q0?r:y.subarray((h-1)*_8,h*_8):y.subarray(h*_8,(h+1)*_8),a1),G0});return X=X+1&p7,n6(H($,async(l,h)=>{const{channel:n}=h;let q0=0;while(q0<a){const G0=t[q0];if(n.bufferedAmount>n.bufferedAmountLowThreshold)await new Promise((F0)=>{const b=()=>{n.removeEventListener(E2,b),F0()};n.addEventListener(E2,b)});if(!O[l])break;h.sendData(G0),q0++,K?.(G0[o1]/p7,l,j)}}))}},N[Q]||=[Z[Q].send,Z[Q].setOnComplete,Z[Q].setOnProgress]},k=(Q,G)=>{const V=new Uint8Array(G),X=J1(V.subarray(w2,h7)).replaceAll("\0",""),[U]=V.subarray(h7,c7),[$]=V.subarray(c7,o1),[j]=V.subarray(o1,a1),K=V.subarray(a1),W=!!($&1),z=!!($&1<<1),A=!!($&1<<2),T=!!($&1<<3);if(!Z[X]){console.warn(`${g8}: received message with unregistered type (${X})`);return}J[Q]||={},J[Q][X]||={};const y=J[Q][X][U]||={chunks:[]};if(z)y.meta=y8(J1(K));else y.chunks.push(K);if(Z[X].onProgress(j/p7,Q,y.meta),!W)return;const r=new Uint8Array(y.chunks.reduce((a,t)=>a+t.byteLength,0));if(y.chunks.reduce((a,t)=>{return r.set(t,a),a+t.byteLength},0),delete J[Q][X][U],A)Z[X].onComplete(r,Q,y.meta);else{const a=J1(r);Z[X].onComplete(T?y8(a):a,Q)}},v=async()=>{await u(""),await new Promise((Q)=>setTimeout(Q,99)),_7(O).forEach(([Q,G])=>{G.destroy(),delete O[Q]}),F()},[M,w]=R(U1("ping")),[x,g]=R(U1("pong")),[_,p]=R(U1("signal")),[m,f]=R(U1("stream")),[s,Q0]=R(U1("track")),[u,K0]=R(U1("leave"));if(Y((Q,G)=>{if(O[G])return;O[G]=Q,Q.setHandlers({data:(V)=>k(G,V),stream:(V)=>{L.onPeerStream(V,G,B[G]),delete B[G]},track:(V,X)=>{L.onPeerTrack(V,X,G,D[G]),delete D[G]},signal:(V)=>_(V,G),close:()=>P(G),error:(V)=>{console.error(V),P(G)}}),L.onPeerJoin(G)}),w((Q,G)=>x("",G)),g((Q,G)=>{C[G]?.(),delete C[G]}),p((Q,G)=>O[G]?.signal(Q)),f((Q,G)=>B[G]=Q),Q0((Q,G)=>D[G]=Q),K0((Q,G)=>P(G)),N2)addEventListener("beforeunload",v);return{makeAction:R,leave:v,ping:async(Q)=>{if(!Q)throw c6("ping() must be called with target peer ID");const G=Date.now();return M("",Q),await new Promise((V)=>C[Q]=V),Date.now()-G},getPeers:()=>q9(_7(O).map(([Q,G])=>[Q,G.connection])),addStream:(Q,G,V)=>H(G,async(X,U)=>{if(V)await m(V,X);U.addStream(Q)}),removeStream:(Q,G)=>H(G,(V,X)=>X.removeStream(Q)),addTrack:(Q,G,V,X)=>H(V,async(U,$)=>{if(X)await s(X,U);$.addTrack(Q,G)}),removeTrack:(Q,G)=>H(G,(V,X)=>X.removeTrack(Q)),replaceTrack:(Q,G,V,X)=>H(V,async(U,$)=>{if(X)await s(X,U);$.replaceTrack(Q,G)}),onPeerJoin:(Q)=>L.onPeerJoin=Q,onPeerLeave:(Q)=>L.onPeerLeave=Q,onPeerStream:(Q)=>L.onPeerStream=Q,onPeerTrack:(Q)=>L.onPeerTrack=Q}};var PV=20,kV=5333,y2=57333,_2=({init:Y,subscribe:q,announce:F})=>{const O={};let Z=!1,N,J,C;return(B,D,L)=>{const{appId:H}=B;if(O[H]?.[D])return O[H][D];const P={},R={},k=u1(g8,H,D),v=f1(k),M=f1(u1(k,a6)),w=I2(B.password||"",H,D),x=(U)=>async($)=>({type:$.type,sdp:await U(w,$.sdp)}),g=x(v2),_=x(A2),p=()=>C9(!0,B),m=(U,$,j)=>{if(R[$]){if(R[$]!==U)U.destroy();return}R[$]=U,X(U,$),P[$]?.forEach((K,W)=>{if(W!==j)K.destroy()}),delete P[$]},f=(U,$)=>{if(R[$]===U)delete R[$]},s=(U,$)=>{if(R[U])return;const j=P[U]?.[$];if(j)delete P[U][$],j.destroy()},Q0=(U)=>{return J.push(...O8(U,p)),n6(J.splice(0,U).map(($)=>$.offerPromise.then(_).then((j)=>({peer:$,offer:j}))))},u=(U,$)=>L?.({error:`incorrect password (${B.password}) when decrypting ${$}`,appId:H,peerId:U,roomId:D}),K0=(U)=>async($,j,K)=>{const[W,z]=await n6([v,M]);if($!==W&&$!==z)return;const{peerId:A,offer:T,answer:y,peer:r}=typeof j==="string"?y8(j):j;if(A===a6||R[A])return;if(A&&!T&&!y){if(P[A]?.[U])return;const[[{peer:a,offer:t}],l]=await n6([Q0(1),f1(u1(k,A))]);P[A]||=[],P[A][U]=a,setTimeout(()=>s(A,U),Q[U]*0.9),a.setHandlers({connect:()=>m(a,A,U),close:()=>f(a,A)}),K(l,h6({peerId:a6,offer:t}))}else if(T){if(P[A]?.[U]&&a6>A)return;const t=C9(!1,B);t.setHandlers({connect:()=>m(t,A,U),close:()=>f(t,A)});let l;try{l=await g(T)}catch{u(A,"offer");return}if(t.isDead)return;const[h,n]=await n6([f1(u1(k,A)),t.signal(l)]);K(h,h6({peerId:a6,answer:await _(n)}))}else if(y){let a;try{a=await g(y)}catch(t){u(A,"answer");return}if(r)r.setHandlers({connect:()=>m(r,A,U),close:()=>f(r,A)}),r.signal(a);else{const t=P[A]?.[U];if(t&&!t.isDead)t.signal(a)}}};if(!B)throw c6("requires a config map as the first argument");if(!H&&!B.firebaseApp)throw c6("config map is missing appId field");if(!D)throw c6("roomId argument required");if(!Z){const U=Y(B);J=O8(PV,p),N=Array.isArray(U)?U:[U],Z=!0,C=setInterval(()=>J=J.filter(($)=>{const j=Date.now()-$.created<y2;if(!j)$.destroy();return j}),y2*1.03)}const Q=N.map(()=>kV),G=[],V=N.map(async(U,$)=>q(await U,await v,await M,K0($),Q0));n6([v,M]).then(([U,$])=>{const j=async(K,W)=>{const z=await F(K,U,$);if(typeof z==="number")Q[W]=z;G[W]=setTimeout(()=>j(K,W),Q[W])};V.forEach(async(K,W)=>{await K,j(await N[W],W)})});let X=V8;return O[H]||={},O[H][D]=g2((U)=>X=U,(U)=>delete R[U],()=>{delete O[H][D],G.forEach(clearTimeout),V.forEach(async(U)=>(await U)()),clearInterval(C)})}};var h2={},BV=5,c2="x",l2="EVENT",d2=p6.randomPrivateKey(),RV=m7(Z9.getPublicKey(d2)),O9={},n1={},IV={},u2=()=>Math.floor(Date.now()/1000),f2=(Y)=>IV[Y]??=j9(Y,1e4)+20000,m2=async(Y,q)=>{const F={kind:f2(Y),content:q,pubkey:RV,created_at:u2(),tags:[[c2,Y]]},O=m7(new Uint8Array(await crypto.subtle.digest("SHA-256",r6(h6([0,F.pubkey,F.created_at,F.kind,F.tags,F.content])))));return h6([l2,{...F,id:O,sig:m7(await Z9.sign(O,d2))}])},p2=(Y,q)=>{return O9[Y]=q,h6(["REQ",Y,{kinds:[f2(q)],since:u2(),["#"+c2]:[q]}])},b2=(Y)=>{return delete O9[Y],h6(["CLOSE",Y])},l7=_2({init:(Y)=>k2(Y,MV,BV,!0).map((q)=>{const F=B2(q,(O)=>{const[Z,N,J,C]=y8(O);if(Z!==l2){const B=`${g8}: relay failure from ${F.url} - `;if(Z==="NOTICE")console.warn(B+N);else if(Z==="OK"&&!J)console.warn(B+C);return}n1[N]?.(O9[N],J.content)});return h2[q]=F,F.ready}),subscribe:(Y,q,F,O)=>{const Z=y7(64),N=y7(64);return n1[Z]=n1[N]=(J,C)=>O(J,C,async(B,D)=>Y.send(await m2(B,D))),Y.send(p2(Z,q)),Y.send(p2(N,F)),()=>{Y.send(b2(Z)),Y.send(b2(N)),delete n1[Z],delete n1[N]}},announce:async(Y,q)=>Y.send(await m2(q,h6({peerId:a6})))}),TV=R2(h2),MV=["black.nostrcity.club","eu.purplerelay.com","ftp.halifax.rwth-aachen.de/nostr","nostr.cool110.xyz","nostr.data.haus","nostr.mom","nostr.oxtr.dev","nostr.sathoarder.com","nostr.vulpem.com","nostrelay.memory-art.xyz","playground.nostrcheck.me/relay","relay.agorist.space","relay.binaryrobot.com","relay.fountain.fm","relay.mostro.network","relay.nostraddress.com","relay.nostrdice.com","relay.nostromo.social","relay.oldenburg.cool","relay.snort.social","relay.verified-nostr.com","sendit.nosflare.com","yabu.me/v2"].map((Y)=>"wss://"+Y);var o2=(Y,q,F)=>{let O=q.timestamp;if(q.timestamp&&typeof q.timestamp.physical==="number"){const J=Date.now()+7200000;if(q.timestamp.physical>J)O={physical:J,logical:q.timestamp.logical}}if(!Y||!Y.timestamp)return{resolved:!0,value:q.value,timestamp:O};const Z=Y.timestamp;if(F.compare(Z,O)<0)return{resolved:!0,value:q.value,timestamp:O};return{resolved:!1}};var AV=()=>{const Y=new Map,q=async()=>{try{const B=await navigator.storage.getDirectory(),L=await(await B.getFileHandle("~opfs-sync-test",{create:!0})).createSyncAccessHandle?.();return await L?.close(),await B.removeEntry("~opfs-sync-test"),!!L}catch{return!1}};let F="idb";const O=(async()=>{if(await q())F="sync";else try{const B=await navigator.storage.getDirectory(),L=await(await B.getFileHandle("~opfs-async-test",{create:!0})).createWritable?.();if(await L?.close(),await B.removeEntry("~opfs-async-test"),L)F="async";else F="idb"}catch{F="idb"}})(),Z=async(B,D)=>{if(!Y.has(B))Y.set(B,[]);const L=Y.get(B),H=L[L.length-1]||Promise.resolve();let P;const R=new Promise((k)=>P=k);L.push(R);try{return await H,await D()}finally{if(L.shift(),P(),L.length===0)Y.delete(B)}},N=(()=>{let B;const D=async()=>{if(!B)B=new Promise((L,H)=>{const P=indexedDB.open("opfs-fallback-db",1);P.onupgradeneeded=()=>P.result.createObjectStore("files"),P.onsuccess=()=>L(P.result),P.onerror=()=>H(P.error)});return B};return{getDB:D,get:async(L)=>{const H=await D();return new Promise((P,R)=>{const v=H.transaction("files","readonly").objectStore("files").get(L);v.onsuccess=()=>P(v.result||new Uint8Array),v.onerror=()=>R(v.error)})},set:async(L,H)=>{const P=await D();return new Promise((R,k)=>{const M=P.transaction("files","readwrite").objectStore("files").put(H,L);M.onsuccess=()=>R(),M.onerror=()=>k(M.error)})}}})(),J=async(B)=>{await O;try{if(F==="idb"){const R=await N.get(B);return{type:"loaded",name:B,data:R}}const L=await(await navigator.storage.getDirectory()).getFileHandle(B);if(F==="sync"){let R;try{R=await L.createSyncAccessHandle();const k=R.getSize(),v=new Uint8Array(k),M=R.read(v,{at:0});return{type:"loaded",name:B,data:v.slice(0,M)}}finally{R?.close()}}const H=await L.getFile(),P=new Uint8Array(await H.arrayBuffer());return{type:"loaded",name:B,data:P}}catch(D){const L=D.name==="NotFoundError"?"File not found":D.message||"Error reading file";return{type:"error",name:B,message:L}}},C=async(B,D)=>{if(await O,!(D instanceof Uint8Array))return{type:"error",name:B,message:"Content must be a Uint8Array"};return Z(B,async()=>{try{if(F==="idb")return await N.set(B,D),{type:"saved",name:B};const H=await(await navigator.storage.getDirectory()).getFileHandle(B,{create:!0});if(F==="sync"){let P;try{P=await H.createSyncAccessHandle(),P.truncate(0),P.write(D,{at:0}),P.flush()}finally{P?.close()}}else{let P;try{P=await H.createWritable(),await P.write(D)}finally{await P?.close()}}return{type:"saved",name:B}}catch(L){return{type:"error",name:B,message:L.message||"Error saving file"}}})};self.onmessage=async({data:B})=>{const{type:D,name:L,content:H}=B;await O;const P={load:()=>J(L),save:()=>C(L,H)};try{const R=P[D],k=R?await R():{type:"error",message:`Unrecognized action type: ${D}`};self.postMessage(k)}catch(R){console.error("Worker unexpected error:",R),self.postMessage({type:"error",name:L,message:R.message||"Unexpected worker error"})}}},a2=AV;var m8={$eq:(Y,q)=>Y===q,$ne:(Y,q)=>Y!==q,$gt:(Y,q)=>Y>q,$gte:(Y,q)=>Y>=q,$lt:(Y,q)=>Y<q,$lte:(Y,q)=>Y<=q,$in:(Y,q)=>Array.isArray(q)&&q.includes(Y),$between:(Y,[q,F])=>Y>=q&&Y<=F,$exists:(Y,q)=>q?Y!==void 0:Y===void 0,$text:{global:(Y,q)=>{const F=(Z)=>String(Z).normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^\w\s]/g,""),O=F(q);return Object.values(Y).some((Z)=>{if(typeof Z==="object")return null.fieldSearch(Z,O);return F(Z).includes(O)})},field:(Y,q)=>{const F=(O)=>String(O).normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^\w\s]/g,"");return Array.isArray(Y)?Y.some((O)=>F(O).includes(F(q))):F(Y).includes(F(q))}},$like:(Y,q)=>{if(typeof Y!=="string"||typeof q!=="string")return!1;return new RegExp(`^${q.replace(/%/g,".*").replace(/_/g,".")}\$`,"i").test(Y)},$regex:(Y,q)=>typeof Y==="string"&&new RegExp(q.$regex||q,"i").test(Y),$and:(Y,q,F)=>q.every((O)=>{return F.createFilter(O)(Y)}),$or:(Y,q,F)=>q.some((O)=>{return F.createFilter(O)(Y)}),$not:(Y,q,F)=>{return!F.createFilter(q)(Y)}},D9=(Y,q)=>{const F=q.split(".");let O=Y;for(let Z of F)if(O&&typeof O==="object"&&(Z in O))O=O[Z];else return;return O},L9=(Y)=>{const q=(F)=>{return Object.entries(Y).every(([O,Z])=>{if(O.startsWith("$"))return m8[O](F,Z,{filterNode:q,createFilter:L9});const N=D9(F.value,O);if(typeof Z!=="object"||Z===null)return m8.$eq(N,Z);return Object.entries(Z).every(([J,C])=>{if(J==="$text")return m8.$text.field(N,C);if(J==="$between"&&C.every((B)=>B instanceof Date)){const B=new Date(N);return m8.$between(B,C)}return m8[J]?.(N,C,{filterNode:q,createFilter:L9})??!1})})};return q},N9=(Y,q)=>{const F=L9(q.query);let O=Object.values(Y).filter(F);if(q.field)O.sort((Z,N)=>{const J=D9(Z.value,q.field),C=D9(N.value,q.field),B=q.order==="asc"?1:-1;if(typeof J==="string"&&typeof C==="string")return J.localeCompare(C)*B;return((J??0)-(C??0))*B});if(q.$after){const Z=O.findIndex((N)=>N.id===q.$after);O=Z>=0?O.slice(Z+1):[]}if(q.$before){const Z=O.findIndex((N)=>N.id===q.$before);O=Z>=0?O.slice(0,Z):[]}return q.$limit?O.slice(0,q.$limit):O};class P9{constructor(){this.physical=Date.now(),this.logical=0}now(){const Y=Date.now();return this.physical=Math.max(this.physical,Y),this.logical++,{physical:this.physical,logical:this.logical}}update(Y){if(!Y||typeof Y.physical!=="number"||typeof Y.logical!=="number")return;this.physical=Math.max(this.physical,Y.physical),this.logical=Math.max(this.logical,Y.logical)+1}compare(Y,q){if(!Y&&!q)return 0;if(!Y)return-1;if(!q)return 1;if(Y.physical>q.physical)return 1;if(Y.physical<q.physical)return-1;if(Y.logical>q.logical)return 1;if(Y.logical<q.logical)return-1;return 0}}var n2=function(Y,q){return Y.length===q.length&&Y.every((F,O)=>F===q[O])};async function vV(){console.log("\u26A1 GDB-P2P: Empowering distributed graph databases with real-time synchronization and scalability. Learn more: https://github.com/estebanrfp/gdb \u26A1"),console.log(navigator?.storage?.getDirectory?"OPFS is enabled.":"OPFS is not available."),navigator?.storage?.getDirectory&&await navigator.storage.getDirectory()}if(Symbol.dispose===void 0)Object.defineProperty(Symbol,"dispose",{value:Symbol.for("Symbol.dispose")});class r2{constructor(){this.nodes={}}insert(Y,q,F){this.nodes[Y]={id:Y,value:q,edges:[],timestamp:F}}get(Y){return this.nodes[Y]||null}link(Y,q){const F=this.nodes[Y],O=this.nodes[q];if(F&&O&&!F.edges.includes(q))F.edges.push(q)}getAllNodes(){return Object.values(this.nodes)}serialize(){return v1.deflate(L8(this.nodes))}deserialize(Y){this.nodes=s7(v1.inflate(new Uint8Array(Y)))}}class d7{static _listenersInitialized=!1;constructor(Y,{password:q,securityManager:F=null}={}){this.hybridClock=new P9,this.name=Y,this.password=q,this.globalTimestamp=null,this.graph=new r2,this.securityManager=F,this.eventListeners=[],this.operators=m8,this.initWorker(),this.ready=this.loadGraphFromOPFS(),this.loadGlobalTimestamp();const O=`graph-sync-room-${this.name}`,Z={appId:"1234",...this.password&&{password:this.password}},N=l7(Z,O),[J,C]=N.makeAction("syncGraph");this.sendData=J;const B=l7(Z,`app-sync-${this.name}`);if(this.room=B,!d7._listenersInitialized)d7._listenersInitialized=!0,window.addEventListener("online",async()=>{console.log("\u2705 Reconnected to the network."),this.sendData([{type:"sync",timestamp:this.globalTimestamp}])}),window.addEventListener("offline",async()=>{console.log("\u274C Disconnected from the network.")}),document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible")console.log("The tab is visible again."),this.sendData([{type:"sync",timestamp:this.globalTimestamp}]);else if(document.visibilityState==="hidden")console.log("The tab is no longer visible.")});vV(),N.onPeerJoin(async(D)=>{console.log("\u26A1 New pair connected:",D),this.sendData([{type:"sync",timestamp:this.globalTimestamp}])}),N.onPeerLeave((D)=>{console.log("\u26A1 Pair disconnected:",D)}),C(async(D)=>{if(this.securityManager&&typeof this.securityManager.verifyIncomingOperations==="function"){const{validatedOperations:L}=await this.securityManager.verifyIncomingOperations(D);if(L&&L.length>0)await this.receiveChanges(L)}else console.log("GDB: No SecurityManager configured or verifyIncomingOperations missing. Processing P2P data directly."),await this.receiveChanges(D),this.emit()}),this.channel=new BroadcastChannel(`graphdb_sync_${this.name}`),this.channel.onmessage=async(D)=>{if(D.data==="update")console.log("\uD83D\uDD04 Update received from another tab..."),await this.loadGraphFromOPFS(),this.loadGlobalTimestamp(),this.emit()}}loadGlobalTimestamp(){const Y=localStorage.getItem(`${this.name}_time`);this.globalTimestamp=Y?JSON.parse(Y):null}saveGlobalTimestamp(Y){this.globalTimestamp=Y,localStorage.setItem(`${this.name}_time`,JSON.stringify(Y))}initWorker(){try{const Y=URL.createObjectURL(new Blob([`(${a2.toString()})()`],{type:"application/javascript"}));this.worker=new Worker(Y),this.worker.addEventListener("message",({data:q})=>{console.log("Worker message:",`${q.name} ${q.type}`),URL.revokeObjectURL(Y)}),console.log("Worker initialized successfully.")}catch({message:Y}){console.error("Failed to initialize worker:",Y)}}getWorker(){return this.worker}emit(){this.eventListeners.forEach((Y)=>Y(this.graph.nodes))}compress(Y){return v1.deflate(Y)}decompress(Y){return v1.inflate(Y)}async getAllNodes(){return await this.ready,this.graph.getAllNodes()}async generateHash(){return crypto.randomUUID()}async hashValue(Y){const q=(new TextEncoder()).encode(Y),F=await crypto.subtle.digest("SHA-256",q);return Array.from(new Uint8Array(F)).map((O)=>O.toString(16).padStart(2,"0")).join("")}async loadGraphFromOPFS(){try{const q=await((F)=>new Promise((O,Z)=>{const N=async({data:J})=>{if(J.type==="loaded"&&J.name===F)this.worker.removeEventListener("message",N),O(new Uint8Array(J.data));else if(J.type==="error")this.worker.removeEventListener("message",N),Z(new Error(J.message||"Unknown error"))};this.worker.addEventListener("message",N),this.worker.postMessage({type:"load",name:F})}))(`${this.name}_graph.msgpack`).catch(()=>new Uint8Array);q.byteLength>0?this.graph.deserialize(q):console.warn("The file '_graph.msgpack' is empty or could not be loaded."),console.log(`Graph loaded from OPFS: [ ${this.graph.getAllNodes().length} nodes ]`)}catch({message:Y}){console.error("General error loading the graph from OPFS:",Y)}}async saveGraphToOPFS(){try{const Y=this.graph.serialize();return await((F,O)=>new Promise((Z,N)=>{const J=({data:C})=>{if(C.type==="saved"&&C.name===F)this.worker.removeEventListener("message",J),Z();else if(C.type==="error")this.worker.removeEventListener("message",J),N(new Error(C.message||"Save error"))};this.worker.addEventListener("message",J),this.worker.postMessage({type:"save",name:F,content:O})}))(`${this.name}_graph.msgpack`,Y),this.channel.postMessage("update"),!0}catch({message:Y}){throw console.error("Save error:",Y),new Error("Save failed")}}async put(Y,q){await this.ready;const F=this.hybridClock.now();return this.saveGlobalTimestamp(F),q??=await this.generateHash(),this.graph.insert(q,Y,F),await this.saveGraphToOPFS(),await this.sendData([{type:"insert",id:q,value:Y,timestamp:F}]),this.emit(),q}async get(Y,q=null){if(await this.ready,typeof Y!=="string")return{result:null};const F=this.graph.get(Y);if(!F){if(q)q(null);return{result:null}}const O=(J)=>{if(!J)return null;const C=J.value!==null&&typeof J.value==="object"?{...J.value}:J.value;return{...J,value:C}};if(!q)return{result:O(F)};let Z=F.timestamp;q(O(F));const N=(J)=>{const C=J[Y];if(C){if(this.hybridClock.compare(C.timestamp,Z)>0)Z=C.timestamp,q(O(C))}else q(null),this.eventListeners.splice(this.eventListeners.indexOf(N),1)};return this.eventListeners.push(N),{result:O(F),unsubscribe:()=>{const J=this.eventListeners.indexOf(N);if(J>-1)this.eventListeners.splice(J,1)}}}async map(...Y){await this.ready;let F={...{realtime:!1,query:{},field:null,order:"asc",$limit:null,$after:null,$before:null}},O=null,Z=!1;Y.forEach((B)=>typeof B==="function"?O=B:B&&typeof B==="object"&&(Z||=("realtime"in B),Object.assign(F,B))),O&&!Z&&(F.realtime=!0);let N=N9(this.graph.nodes,F),J=null;const C=(B)=>{const D=B.filter((R)=>!N.some((k)=>k.id===R.id)),L=N.filter((R)=>!B.some((k)=>k.id===R.id)),H=B.filter((R)=>{const k=N.find((v)=>v.id===R.id);return k&&!n2(L8(R.value),L8(k.value))}),P=(R,k)=>{const v=k==="removed"?null:R.value,M={id:R.id,value:v,edges:R.edges||[],timestamp:R.timestamp||null,action:k};O(M)};D.forEach((R)=>P(R,"added")),L.forEach((R)=>P(R,"removed")),H.forEach((R)=>P(R,"updated"))};if(O){if(N.forEach((B)=>{if(B.value)O({id:B.id,value:B.value,edges:B.edges,timestamp:B.timestamp,action:"initial"})}),F.realtime)J=(B)=>{const D=N9(B,F);if(!n2(L8(D),L8(N)))C(D),N=D},this.eventListeners.push(J)}return{results:N,...F.realtime&&O&&J&&{unsubscribe:()=>{const B=this.eventListeners.indexOf(J);B>-1&&this.eventListeners.splice(B,1)}}}}async remove(Y){await this.ready;const q=this.hybridClock.now(),F=this.graph.get(Y);if(!F)return console.error(`Node with ID '${Y}' not found.`);delete this.graph.nodes[Y],Object.values(this.graph.nodes).forEach((O)=>O.edges=O.edges.filter((Z)=>Z!==Y)),await this.saveGraphToOPFS(),this.saveGlobalTimestamp(q),await this.sendData([{type:"remove",id:Y,value:F.value,timestamp:q}]),this.emit()}async clear(){await this.ready,this.graph.nodes={};try{await(await navigator.storage.getDirectory()).removeEntry(`${this.name}_graph.msgpack`)}catch({message:Y}){console.warn(`Error deleting _graph.msgpack: ${Y}`)}this.emit(),console.log("All data has been deleted.")}async link(Y,q){await this.ready;const F=this.hybridClock.now();if(!this.graph.nodes[Y]||!this.graph.nodes[q]){console.error(`One or both nodes (${Y}, ${q}) do not exist.`);return}this.graph.link(Y,q),await this.saveGraphToOPFS(),this.saveGlobalTimestamp(F),await this.sendData([{type:"link",sourceId:Y,targetId:q,timestamp:F}]),this.emit()}async applyFullGraph(Y){try{console.log("Applying full graph from remote..."),this.graph.nodes={...Y.nodes},await this.saveGraphToOPFS()}catch({message:q}){console.error(`Error applying the full graph: ${q}`)}}async receiveChanges(Y){const q={insert:(F)=>{this.graph.insert(F.id,F.value,F.timestamp),this.hybridClock.update(F.timestamp)},update:(F)=>{const O=this.graph.get(F.id),Z=o2(O,F,this.hybridClock);if(Z.resolved)Object.assign(O,{value:Z.value,timestamp:Z.timestamp}),this.hybridClock.update(Z.timestamp)},remove:(F)=>{if(this.graph.nodes[F.id])this.hybridClock.update(F.timestamp),delete this.graph.nodes[F.id]},link:(F)=>{if(this.graph.nodes[F.sourceId]&&this.graph.nodes[F.targetId])this.graph.link(F.sourceId,F.targetId),this.hybridClock.update(F.timestamp)},sync:async(F)=>{if(console.log(F),this.hybridClock.update(F.timestamp),this.hybridClock.compare(this.globalTimestamp,F.timestamp)>0)console.log("Sending recent data to the remote node."),await this.sendData([{type:"syncReceive",graph:this.graph}])},syncReceive:async(F)=>await this.applyFullGraph(F.graph)};for(let F of Y)await q[F.type]?.(F);await this.saveGraphToOPFS(),this.emit()}}export{d7 as default};
11
+ *//*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> *//*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */var K2=function(Y){const{a:q,b:F}=H6,O=y0(Y*Y),Z=y0(O*Y);return y0(Z+q*Y+F)},z2=function(Y){if(!(Y instanceof o0))throw new TypeError("JacobianPoint expected")},A7=function(Y,q){const F=q.negate();return Y?F:q},Z2=function(Y){return Number.parseInt(Y[0],16)>=8?"00"+Y:Y},$2=function(Y){if(Y.length<2||Y[0]!==2)throw new Error(`Invalid signature integer tag: ${Y1(Y)}`);const q=Y[1],F=Y.subarray(2,q+2);if(!q||F.length!==q)throw new Error("Invalid signature integer: wrong length");if(F[0]===0&&F[1]<=127)throw new Error("Invalid signature integer: trailing length");return{data:b6(F),left:Y.subarray(q+2)}},sY=function(Y){if(Y.length<2||Y[0]!=48)throw new Error(`Invalid signature tag: ${Y1(Y)}`);if(Y[1]!==Y.length-2)throw new Error("Invalid signature: incorrect length");const{data:q,left:F}=$2(Y.subarray(2)),{data:O,left:Z}=$2(F);if(Z.length)throw new Error(`Invalid signature: left bytes after parsing: ${Y1(Z)}`);return{r:q,s:O}},h1=function(Y){return Y instanceof Uint8Array||ArrayBuffer.isView(Y)&&Y.constructor.name==="Uint8Array"},H2=function(Y){if(!h1(Y))throw new Error("Uint8Array expected")},_1=function(...Y){if(Y.every(H2),Y.length===1)return Y[0];const q=Y.reduce((O,Z)=>O+Z.length,0),F=new Uint8Array(q);for(let O=0,Z=0;O<Y.length;O++){const N=Y[O];F.set(N,Z),Z+=N.length}return F};function Y1(Y){H2(Y);let q="";for(let F=0;F<Y.length;F++)q+=tY[Y[F]];return q}var q2=function(Y){if(Y>=Y8._0&&Y<=Y8._9)return Y-Y8._0;if(Y>=Y8.A&&Y<=Y8.F)return Y-(Y8.A-10);if(Y>=Y8.a&&Y<=Y8.f)return Y-(Y8.a-10);return};function H8(Y){if(typeof Y!=="string")throw new Error("hex string expected, got "+typeof Y);const q=Y.length,F=q/2;if(q%2)throw new Error("hex string expected, got unpadded hex of length "+q);const O=new Uint8Array(F);for(let Z=0,N=0;Z<F;Z++,N+=2){const J=q2(Y.charCodeAt(N)),C=q2(Y.charCodeAt(N+1));if(J===void 0||C===void 0){const B=Y[N]+Y[N+1];throw new Error('hex string expected, got non-hex character "'+B+'" at index '+N)}O[Z]=J*16+C}return O}var C8=function(Y){if(typeof Y!=="bigint")throw new Error("Expected bigint");if(!(u0<=Y&&Y<eY))throw new Error("Expected number 0 <= n < 2^256");return Y.toString(16).padStart(64,"0")},c1=function(Y){const q=H8(C8(Y));if(q.length!==32)throw new Error("Error: expected 32 bytes");return q},m1=function(Y){const q=Y.toString(16);return q.length&1?`0${q}`:q},S7=function(Y){if(typeof Y!=="string")throw new TypeError("hexToNumber: expected string, got "+typeof Y);return BigInt(`0x${Y}`)},b6=function(Y){return S7(Y1(Y))},w8=function(Y){return h1(Y)?Uint8Array.from(Y):H8(Y)},j2=function(Y){if(typeof Y==="number"&&Number.isSafeInteger(Y)&&Y>0)return BigInt(Y);if(typeof Y==="bigint"&&l1(Y))return Y;throw new TypeError("Expected valid private scalar: 0 < scalar < curve.n")},y0=function(Y,q=H6.P){const F=Y%q;return F>=u0?F:q+F},m6=function(Y,q){const{P:F}=H6;let O=Y;while(q-- >u0)O*=O,O%=F;return O},QV=function(Y){const{P:q}=H6,F=BigInt(6),O=BigInt(11),Z=BigInt(22),N=BigInt(23),J=BigInt(44),C=BigInt(88),B=Y*Y*Y%q,D=B*B*Y%q,L=m6(D,p1)*D%q,H=m6(L,p1)*D%q,P=m6(H,j8)*B%q,R=m6(P,O)*P%q,k=m6(R,Z)*R%q,v=m6(k,J)*k%q,M=m6(v,C)*v%q,w=m6(M,J)*k%q,x=m6(w,p1)*D%q,g=m6(x,N)*R%q,_=m6(g,F)*B%q,p=m6(_,j8);if(p*p%q!==Y)throw new Error("Cannot find square root");return p},w7=function(Y,q=H6.P){if(Y===u0||q<=u0)throw new Error(`invert: expected positive integers, got n=${Y} mod=${q}`);let F=y0(Y,q),O=q,Z=u0,N=j6,J=j6,C=u0;while(F!==u0){const D=O/F,L=O%F,H=Z-J*D,P=N-C*D;O=F,F=L,Z=J,N=C,J=H,C=P}if(O!==j6)throw new Error("invert: does not exist");return y0(Z,q)},WV=function(Y,q=H6.P){const F=new Array(Y.length),O=Y.reduce((N,J,C)=>{if(J===u0)return N;return F[C]=N,y0(N*J,q)},j6),Z=w7(O,q);return Y.reduceRight((N,J,C)=>{if(J===u0)return N;return F[C]=y0(N*F[C],q),y0(N*J,q)},Z),F},GV=function(Y){const q=Y.length*8-b1*8,F=b6(Y);return q>0?F>>BigInt(q):F},XV=function(Y,q=!1){const F=GV(Y);if(q)return F;const{n:O}=H6;return F>=O?F-O:F},l1=function(Y){return u0<Y&&Y<H6.n},x7=function(Y){return u0<Y&&Y<H6.P};var d1=function(Y){let q;if(typeof Y==="bigint")q=Y;else if(typeof Y==="number"&&Number.isSafeInteger(Y)&&Y>0)q=BigInt(Y);else if(typeof Y==="string"){if(Y.length!==2*b1)throw new Error("Expected 32 bytes of private key");q=S7(Y)}else if(h1(Y)){if(Y.length!==b1)throw new Error("Expected 32 bytes of private key");q=b6(Y)}else throw new TypeError("Expected valid private key");if(!l1(q))throw new Error("Expected private key: 0 < key < n");return q},YV=function(Y){if(Y instanceof Z6)return Y.assertValidity(),Y;else return Z6.fromHex(Y)},VV=function(Y){if(Y instanceof E8)return Y.assertValidity(),Y;try{return E8.fromDER(Y)}catch(q){return E8.fromCompact(Y)}};var E7=function(Y){return y0(b6(Y),H6.n)},JV=function(Y){return Z6.fromPrivateKey(Y).toRawX()};async function UV(Y,q,F){return new z9(Y,q,F).calc()}var FV=function(Y,q,F){return new z9(Y,q,F).calcSync()},C2=function(Y,q,F){const O=Y instanceof V1,Z=O?Y:V1.fromHex(Y);if(O)Z.assertValidity();return{...Z,m:w8(q),P:YV(F)}},O2=function(Y,q,F,O){const Z=Z6.BASE.multiplyAndAddUnsafe(q,d1(F),y0(-O,H6.n));if(!Z||!Z.hasEvenY()||Z.x!==Y)return!1;return!0};async function D2(Y,q,F){try{const{r:O,s:Z,m:N,P:J}=C2(Y,q,F),C=E7(await p6.taggedHash(q8.challenge,c1(O),J.toRawX(),N));return O2(O,J,Z,C)}catch(O){return!1}}var L2=function(Y,q,F){try{const{r:O,s:Z,m:N,P:J}=C2(Y,q,F),C=E7(p6.taggedHashSync(q8.challenge,c1(O),J.toRawX(),N));return O2(O,J,Z,C)}catch(O){if(O instanceof K9)throw O;return!1}};/*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */var u0=BigInt(0),j6=BigInt(1),j8=BigInt(2),p1=BigInt(3),V2=BigInt(8),H6=Object.freeze({a:u0,b:BigInt(7),P:BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),n:BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),h:j6,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee")}),J2=(Y,q)=>(Y+q/j8)/q,T7={beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar(Y){const{n:q}=H6,F=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),O=-j6*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),Z=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),N=F,J=BigInt("0x100000000000000000000000000000000"),C=J2(N*Y,q),B=J2(-O*Y,q);let D=y0(Y-C*F-B*Z,q),L=y0(-C*O-B*N,q);const H=D>J,P=L>J;if(H)D=q-D;if(P)L=q-L;if(D>J||L>J)throw new Error("splitScalarEndo: Endomorphism failed, k="+Y);return{k1neg:H,k1:D,k2neg:P,k2:L}}},G1=32,b1=32;var U2=G1+1,F2=2*G1+1;var M7=H6.a===u0;class K9 extends Error{constructor(Y){super(Y)}}class o0{constructor(Y,q,F){this.x=Y,this.y=q,this.z=F}static fromAffine(Y){if(!(Y instanceof Z6))throw new TypeError("JacobianPoint#fromAffine: expected Point");if(Y.equals(Z6.ZERO))return o0.ZERO;return new o0(Y.x,Y.y,j6)}static toAffineBatch(Y){const q=WV(Y.map((F)=>F.z));return Y.map((F,O)=>F.toAffine(q[O]))}static normalizeZ(Y){return o0.toAffineBatch(Y).map(o0.fromAffine)}equals(Y){z2(Y);const{x:q,y:F,z:O}=this,{x:Z,y:N,z:J}=Y,C=y0(O*O),B=y0(J*J),D=y0(q*B),L=y0(Z*C),H=y0(y0(F*J)*B),P=y0(y0(N*O)*C);return D===L&&H===P}negate(){return new o0(this.x,y0(-this.y),this.z)}double(){const{x:Y,y:q,z:F}=this,O=y0(Y*Y),Z=y0(q*q),N=y0(Z*Z),J=Y+Z,C=y0(j8*(y0(J*J)-O-N)),B=y0(p1*O),D=y0(B*B),L=y0(D-j8*C),H=y0(B*(C-L)-V2*N),P=y0(j8*q*F);return new o0(L,H,P)}add(Y){z2(Y);const{x:q,y:F,z:O}=this,{x:Z,y:N,z:J}=Y;if(Z===u0||N===u0)return this;if(q===u0||F===u0)return Y;const C=y0(O*O),B=y0(J*J),D=y0(q*B),L=y0(Z*C),H=y0(y0(F*J)*B),P=y0(y0(N*O)*C),R=y0(L-D),k=y0(P-H);if(R===u0)if(k===u0)return this.double();else return o0.ZERO;const v=y0(R*R),M=y0(R*v),w=y0(D*v),x=y0(k*k-M-j8*w),g=y0(k*(w-x)-H*M),_=y0(O*J*R);return new o0(x,g,_)}subtract(Y){return this.add(Y.negate())}multiplyUnsafe(Y){const q=o0.ZERO;if(typeof Y==="bigint"&&Y===u0)return q;let F=j2(Y);if(F===j6)return this;if(!M7){let L=q,H=this;while(F>u0){if(F&j6)L=L.add(H);H=H.double(),F>>=j6}return L}let{k1neg:O,k1:Z,k2neg:N,k2:J}=T7.splitScalar(F),C=q,B=q,D=this;while(Z>u0||J>u0){if(Z&j6)C=C.add(D);if(J&j6)B=B.add(D);D=D.double(),Z>>=j6,J>>=j6}if(O)C=C.negate();if(N)B=B.negate();return B=new o0(y0(B.x*T7.beta),B.y,B.z),C.add(B)}precomputeWindow(Y){const q=M7?128/Y+1:256/Y+1,F=[];let O=this,Z=O;for(let N=0;N<q;N++){Z=O,F.push(Z);for(let J=1;J<2**(Y-1);J++)Z=Z.add(O),F.push(Z);O=Z.double()}return F}wNAF(Y,q){if(!q&&this.equals(o0.BASE))q=Z6.BASE;const F=q&&q._WINDOW_SIZE||1;if(256%F)throw new Error("Point#wNAF: Invalid precomputation window, must be power of 2");let O=q&&F9.get(q);if(!O){if(O=this.precomputeWindow(F),q&&F!==1)O=o0.normalizeZ(O),F9.set(q,O)}let{ZERO:Z,BASE:N}=o0;const J=1+(M7?128/F:256/F),C=2**(F-1),B=BigInt(2**F-1),D=2**F,L=BigInt(F);for(let H=0;H<J;H++){const P=H*C;let R=Number(Y&B);if(Y>>=L,R>C)R-=D,Y+=j6;const k=P,v=P+Math.abs(R)-1,M=H%2!==0,w=R<0;if(R===0)N=N.add(A7(M,O[k]));else Z=Z.add(A7(w,O[v]))}return{p:Z,f:N}}multiply(Y,q){let F=j2(Y),O,Z;if(M7){const{k1neg:N,k1:J,k2neg:C,k2:B}=T7.splitScalar(F);let{p:D,f:L}=this.wNAF(J,q),{p:H,f:P}=this.wNAF(B,q);D=A7(N,D),H=A7(C,H),H=new o0(y0(H.x*T7.beta),H.y,H.z),O=D.add(H),Z=L.add(P)}else{const{p:N,f:J}=this.wNAF(F,q);O=N,Z=J}return o0.normalizeZ([O,Z])[0]}toAffine(Y){const{x:q,y:F,z:O}=this,Z=this.equals(o0.ZERO);if(Y==null)Y=Z?V2:w7(O);const N=Y,J=y0(N*N),C=y0(J*N),B=y0(q*J),D=y0(F*C),L=y0(O*N);if(Z)return Z6.ZERO;if(L!==j6)throw new Error("invZ was invalid");return new Z6(B,D)}}o0.BASE=new o0(H6.Gx,H6.Gy,j6);o0.ZERO=new o0(u0,j6,u0);var F9=new WeakMap;class Z6{constructor(Y,q){this.x=Y,this.y=q}_setWindowSize(Y){this._WINDOW_SIZE=Y,F9.delete(this)}hasEvenY(){return this.y%j8===u0}static fromCompressedHex(Y){const q=Y.length===32,F=b6(q?Y:Y.subarray(1));if(!x7(F))throw new Error("Point is not on curve");const O=K2(F);let Z=QV(O);const N=(Z&j6)===j6;if(q){if(N)Z=y0(-Z)}else if((Y[0]&1)===1!==N)Z=y0(-Z);const J=new Z6(F,Z);return J.assertValidity(),J}static fromUncompressedHex(Y){const q=b6(Y.subarray(1,G1+1)),F=b6(Y.subarray(G1+1,G1*2+1)),O=new Z6(q,F);return O.assertValidity(),O}static fromHex(Y){const q=w8(Y),F=q.length,O=q[0];if(F===G1)return this.fromCompressedHex(q);if(F===U2&&(O===2||O===3))return this.fromCompressedHex(q);if(F===F2&&O===4)return this.fromUncompressedHex(q);throw new Error(`Point.fromHex: received invalid point. Expected 32-${U2} compressed bytes or ${F2} uncompressed bytes, not ${F}`)}static fromPrivateKey(Y){return Z6.BASE.multiply(d1(Y))}static fromSignature(Y,q,F){const{r:O,s:Z}=VV(q);if(![0,1,2,3].includes(F))throw new Error("Cannot recover: invalid recovery bit");const N=XV(w8(Y)),{n:J}=H6,C=F===2||F===3?O+J:O,B=w7(C,J),D=y0(-N*B,J),L=y0(Z*B,J),H=F&1?"03":"02",P=Z6.fromHex(H+C8(C)),R=Z6.BASE.multiplyAndAddUnsafe(P,D,L);if(!R)throw new Error("Cannot recover signature: point at infinify");return R.assertValidity(),R}toRawBytes(Y=!1){return H8(this.toHex(Y))}toHex(Y=!1){const q=C8(this.x);if(Y)return`${this.hasEvenY()?"02":"03"}${q}`;else return`04${q}${C8(this.y)}`}toHexX(){return this.toHex(!0).slice(2)}toRawX(){return this.toRawBytes(!0).slice(1)}assertValidity(){const{x:q,y:F}=this;if(!x7(q)||!x7(F))throw new Error("Point is not on elliptic curve");const O=y0(F*F),Z=K2(q);if(y0(O-Z)!==u0)throw new Error("Point is not on elliptic curve")}equals(Y){return this.x===Y.x&&this.y===Y.y}negate(){return new Z6(this.x,y0(-this.y))}double(){return o0.fromAffine(this).double().toAffine()}add(Y){return o0.fromAffine(this).add(o0.fromAffine(Y)).toAffine()}subtract(Y){return this.add(Y.negate())}multiply(Y){return o0.fromAffine(this).multiply(Y,this).toAffine()}multiplyAndAddUnsafe(Y,q,F){const O=o0.fromAffine(this),Z=q===u0||q===j6||this!==Z6.BASE?O.multiplyUnsafe(q):O.multiply(q),N=o0.fromAffine(Y).multiplyUnsafe(F),J=Z.add(N);return J.equals(o0.ZERO)?void 0:J.toAffine()}}Z6.BASE=new Z6(H6.Gx,H6.Gy);Z6.ZERO=new Z6(u0,u0);class E8{constructor(Y,q){this.r=Y,this.s=q,this.assertValidity()}static fromCompact(Y){const q=h1(Y);if(typeof Y!=="string"&&!q)throw new TypeError("Signature.fromCompact: Expected string or Uint8Array");const O=q?Y1(Y):Y;if(O.length!==128)throw new Error("Signature.fromCompact: Expected 64-byte hex");return new E8(S7(O.slice(0,64)),S7(O.slice(64,128)))}static fromDER(Y){const q=h1(Y);if(typeof Y!=="string"&&!q)throw new TypeError("Signature.fromDER: Expected string or Uint8Array");const{r:F,s:O}=sY(q?Y:H8(Y));return new E8(F,O)}static fromHex(Y){return this.fromDER(Y)}assertValidity(){const{r:Y,s:q}=this;if(!l1(Y))throw new Error("Invalid Signature: r must be 0 < r < n");if(!l1(q))throw new Error("Invalid Signature: s must be 0 < s < n")}hasHighS(){const Y=H6.n>>j6;return this.s>Y}normalizeS(){return this.hasHighS()?new E8(this.r,y0(-this.s,H6.n)):this}toDERRawBytes(){return H8(this.toDERHex())}toDERHex(){const Y=Z2(m1(this.s)),q=Z2(m1(this.r)),F=Y.length/2,O=q.length/2,Z=m1(F),N=m1(O);return`30${m1(O+F+4)}02${N}${q}02${Z}${Y}`}toRawBytes(){return this.toDERRawBytes()}toHex(){return this.toDERHex()}toCompactRawBytes(){return H8(this.toCompactHex())}toCompactHex(){return C8(this.r)+C8(this.s)}}var tY=Array.from({length:256},(Y,q)=>q.toString(16).padStart(2,"0")),Y8={_0:48,_9:57,A:65,F:70,a:97,f:102},eY=BigInt("0x10000000000000000000000000000000000000000000000000000000000000000"),X1,U9;class V1{constructor(Y,q){this.r=Y,this.s=q,this.assertValidity()}static fromHex(Y){const q=w8(Y);if(q.length!==64)throw new TypeError(`SchnorrSignature.fromHex: expected 64 bytes, not ${q.length}`);const F=b6(q.subarray(0,32)),O=b6(q.subarray(32,64));return new V1(F,O)}assertValidity(){const{r:Y,s:q}=this;if(!x7(Y)||!l1(q))throw new Error("Invalid signature")}toHex(){return C8(this.r)+C8(this.s)}toRawBytes(){return H8(this.toHex())}}class z9{constructor(Y,q,F=p6.randomBytes()){if(Y==null)throw new TypeError(`sign: Expected valid message, not "${Y}"`);this.m=w8(Y);const{x:O,scalar:Z}=this.getScalar(d1(q));if(this.px=O,this.d=Z,this.rand=w8(F),this.rand.length!==32)throw new TypeError("sign: Expected 32 bytes of aux randomness")}getScalar(Y){const q=Z6.fromPrivateKey(Y),F=q.hasEvenY()?Y:H6.n-Y;return{point:q,scalar:F,x:q.toRawX()}}initNonce(Y,q){return c1(Y^b6(q))}finalizeNonce(Y){const q=y0(b6(Y),H6.n);if(q===u0)throw new Error("sign: Creation of signature failed. k is zero");const{point:F,x:O,scalar:Z}=this.getScalar(q);return{R:F,rx:O,k:Z}}finalizeSig(Y,q,F,O){return new V1(Y.x,y0(q+F*O,H6.n)).toRawBytes()}error(){throw new Error("sign: Invalid signature produced")}async calc(){const{m:Y,d:q,px:F,rand:O}=this,Z=p6.taggedHash,N=this.initNonce(q,await Z(q8.aux,O)),{R:J,rx:C,k:B}=this.finalizeNonce(await Z(q8.nonce,N,F,Y)),D=E7(await Z(q8.challenge,C,F,Y)),L=this.finalizeSig(J,B,D,q);if(!await D2(L,Y,F))this.error();return L}calcSync(){const{m:Y,d:q,px:F,rand:O}=this,Z=p6.taggedHashSync,N=this.initNonce(q,Z(q8.aux,O)),{R:J,rx:C,k:B}=this.finalizeNonce(Z(q8.nonce,N,F,Y)),D=E7(Z(q8.challenge,C,F,Y)),L=this.finalizeSig(J,B,D,q);if(!L2(L,Y,F))this.error();return L}}var Z9={Signature:V1,getPublicKey:JV,sign:UV,verify:D2,signSync:FV,verifySync:L2};Z6.BASE._setWindowSize(8);var S6={node:J9,web:typeof self==="object"&&("crypto"in self)?self.crypto:void 0},q8={challenge:"BIP0340/challenge",aux:"BIP0340/aux",nonce:"BIP0340/nonce"},v7={},p6={bytesToHex:Y1,hexToBytes:H8,concatBytes:_1,mod:y0,invert:w7,isValidPrivateKey(Y){try{return d1(Y),!0}catch(q){return!1}},_bigintTo32Bytes:c1,_normalizePrivateKey:d1,hashToPrivateKey:(Y)=>{Y=w8(Y);const q=b1+8;if(Y.length<q||Y.length>1024)throw new Error("Expected valid bytes of private key as per FIPS 186");const F=y0(b6(Y),H6.n-j6)+j6;return c1(F)},randomBytes:(Y=32)=>{if(S6.web)return S6.web.getRandomValues(new Uint8Array(Y));else if(S6.node){const{randomBytes:q}=S6.node;return Uint8Array.from(q(Y))}else throw new Error("The environment doesn't have randomBytes function")},randomPrivateKey:()=>p6.hashToPrivateKey(p6.randomBytes(b1+8)),precompute(Y=8,q=Z6.BASE){const F=q===Z6.BASE?q:new Z6(q.x,q.y);return F._setWindowSize(Y),F.multiply(p1),F},sha256:async(...Y)=>{if(S6.web){const q=await S6.web.subtle.digest("SHA-256",_1(...Y));return new Uint8Array(q)}else if(S6.node){const{createHash:q}=S6.node,F=q("sha256");return Y.forEach((O)=>F.update(O)),Uint8Array.from(F.digest())}else throw new Error("The environment doesn't have sha256 function")},hmacSha256:async(Y,...q)=>{if(S6.web){const F=await S6.web.subtle.importKey("raw",Y,{name:"HMAC",hash:{name:"SHA-256"}},!1,["sign"]),O=_1(...q),Z=await S6.web.subtle.sign("HMAC",F,O);return new Uint8Array(Z)}else if(S6.node){const{createHmac:F}=S6.node,O=F("sha256",Y);return q.forEach((Z)=>O.update(Z)),Uint8Array.from(O.digest())}else throw new Error("The environment doesn't have hmac-sha256 function")},sha256Sync:void 0,hmacSha256Sync:void 0,taggedHash:async(Y,...q)=>{let F=v7[Y];if(F===void 0){const O=await p6.sha256(Uint8Array.from(Y,(Z)=>Z.charCodeAt(0)));F=_1(O,O),v7[Y]=F}return p6.sha256(F,...q)},taggedHashSync:(Y,...q)=>{if(typeof X1!=="function")throw new K9("sha256Sync is undefined, you need to set it");let F=v7[Y];if(F===void 0){const O=X1(Uint8Array.from(Y,(Z)=>Z.charCodeAt(0)));F=_1(O,O),v7[Y]=F}return X1(F,...q)},_JacobianPoint:o0};Object.defineProperties(p6,{sha256Sync:{configurable:!1,get(){return X1},set(Y){if(!X1)X1=Y}},hmacSha256Sync:{configurable:!1,get(){return U9},set(Y){if(!U9)U9=Y}}});var{floor:$9,random:KV,sin:zV}=Math,g8="Trystero",O8=(Y,q)=>Array(Y).fill().map(q);var y7=(Y)=>O8(Y,()=>"0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"[$9(KV()*"0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz".length)]).join(""),a6=y7(20),n6=Promise.all.bind(Promise),N2=typeof window!=="undefined",{entries:_7,fromEntries:q9,keys:P2}=Object,V8=()=>{},c6=(Y)=>new Error(`Trystero: ${Y}`),ZV=new TextEncoder,$V=new TextDecoder,r6=(Y)=>ZV.encode(Y),J1=(Y)=>$V.decode(Y),m7=(Y)=>Y.reduce((q,F)=>q+F.toString(16).padStart(2,"0"),""),u1=(...Y)=>Y.join("@"),qV=(Y,q)=>{const F=[...Y],O=()=>{const N=zV(q++)*1e4;return N-$9(N)};let Z=F.length;while(Z){const N=$9(O()*Z--);[F[Z],F[N]]=[F[N],F[Z]]}return F},k2=(Y,q,F,O)=>{return(Y.relayUrls||(O?qV(q,j9(Y.appId)):q)).slice(0,Y.relayUrls?Y.relayUrls.length:Y.relayRedundancy||F)},h6=JSON.stringify,y8=JSON.parse,j9=(Y,q=Number.MAX_SAFE_INTEGER)=>Y.split("").reduce((F,O)=>F+O.charCodeAt(0),0)%q;var g7={},B2=(Y,q)=>{const F={},O=()=>{const Z=new WebSocket(Y);Z.onclose=()=>{g7[Y]??=3333,setTimeout(O,g7[Y]),g7[Y]*=2},Z.onmessage=(N)=>q(N.data),F.socket=Z,F.url=Z.url,F.ready=new Promise((N)=>Z.onopen=()=>{N(F),g7[Y]=3333}),F.send=(N)=>{if(Z.readyState===1)Z.send(N)}};return O(),F},R2=(Y)=>()=>q9(_7(Y).map(([q,F])=>[q,F.socket]));var H9="AES-GCM",jV={},HV=(Y)=>btoa(String.fromCharCode.apply(null,new Uint8Array(Y))),CV=(Y)=>{const q=atob(Y);return new Uint8Array(q.length).map((F,O)=>q.charCodeAt(O)).buffer},f1=async(Y)=>jV[Y]||=Array.from(new Uint8Array(await crypto.subtle.digest("SHA-1",r6(Y)))).map((q)=>q.toString(36)).join(""),I2=async(Y,q,F)=>crypto.subtle.importKey("raw",await crypto.subtle.digest({name:"SHA-256"},r6(`${Y}:${q}:${F}`)),{name:H9},!1,["encrypt","decrypt"]),T2="$",M2=",",A2=async(Y,q)=>{const F=crypto.getRandomValues(new Uint8Array(16));return F.join(M2)+T2+HV(await crypto.subtle.encrypt({name:H9,iv:F},await Y,r6(q)))},v2=async(Y,q)=>{const[F,O]=q.split(T2);return J1(await crypto.subtle.decrypt({name:H9,iv:new Uint8Array(F.split(M2))},await Y,CV(O)))};var OV=5000,x2="icegatheringstatechange",S2="offer",DV="answer",C9=(Y,{rtcConfig:q,rtcPolyfill:F,turnConfig:O})=>{const Z=new(F||RTCPeerConnection)({iceServers:LV.concat(O||[]),...q}),N={};let J=!1,C=!1,B=null;const D=(H)=>{H.binaryType="arraybuffer",H.bufferedAmountLowThreshold=65535,H.onmessage=(P)=>N.data?.(P.data),H.onopen=()=>N.connect?.(),H.onclose=()=>N.close?.(),H.onerror=(P)=>N.error?.(P)},L=(H)=>Promise.race([new Promise((P)=>{const R=()=>{if(H.iceGatheringState==="complete")H.removeEventListener(x2,R),P()};H.addEventListener(x2,R),R()}),new Promise((P)=>setTimeout(P,OV))]).then(()=>({type:H.localDescription.type,sdp:H.localDescription.sdp.replace(/a=ice-options:trickle\s\n/g,"")}));if(Y)B=Z.createDataChannel("data"),D(B);else Z.ondatachannel=({channel:H})=>{B=H,D(H)};if(Z.onnegotiationneeded=async()=>{try{J=!0,await Z.setLocalDescription();const H=await L(Z);N.signal?.(H)}catch(H){N.error?.(H)}finally{J=!1}},Z.onconnectionstatechange=()=>{if(["disconnected","failed","closed"].includes(Z.connectionState))N.close?.()},Z.ontrack=(H)=>{N.track?.(H.track,H.streams[0]),N.stream?.(H.streams[0])},Z.onremovestream=(H)=>N.stream?.(H.stream),Y){if(!Z.canTrickleIceCandidates)Z.onnegotiationneeded()}return{created:Date.now(),connection:Z,get channel(){return B},get isDead(){return Z.connectionState==="closed"},async signal(H){if(B?.readyState==="open"&&!H.sdp?.includes("a=rtpmap"))return;try{if(H.type===S2){if(J||Z.signalingState!=="stable"&&!C){if(Y)return;await n6([Z.setLocalDescription({type:"rollback"}),Z.setRemoteDescription(H)])}else await Z.setRemoteDescription(H);await Z.setLocalDescription();const P=await L(Z);return N.signal?.(P),P}else if(H.type===DV){C=!0;try{await Z.setRemoteDescription(H)}finally{C=!1}}}catch(P){N.error?.(P)}},sendData:(H)=>B.send(H),destroy:()=>{B?.close(),Z.close(),J=!1,C=!1},setHandlers:(H)=>Object.assign(N,H),offerPromise:Y?new Promise((H)=>N.signal=(P)=>{if(P.type===S2)H(P)}):Promise.resolve(),addStream:(H)=>H.getTracks().forEach((P)=>Z.addTrack(P,H)),removeStream:(H)=>Z.getSenders().filter((P)=>H.getTracks().includes(P.track)).forEach((P)=>Z.removeTrack(P)),addTrack:(H,P)=>Z.addTrack(H,P),removeTrack:(H)=>{const P=Z.getSenders().find((R)=>R.track===H);if(P)Z.removeTrack(P)},replaceTrack:(H,P)=>{const R=Z.getSenders().find((k)=>k.track===H);if(R)return R.replaceTrack(P)}}},LV=[...O8(3,(Y,q)=>`stun:stun${q||""}.l.google.com:19302`),"stun:stun.cloudflare.com:3478"].map((Y)=>({urls:Y}));var NV=Object.getPrototypeOf(Uint8Array),b7=12,w2=0,h7=w2+b7,c7=h7+1,o1=c7+1,a1=o1+1,_8=16384-a1,p7=255,E2="bufferedamountlow",U1=(Y)=>"@_"+Y,g2=(Y,q,F)=>{const O={},Z={},N={},J={},C={},B={},D={},L={onPeerJoin:V8,onPeerLeave:V8,onPeerStream:V8,onPeerTrack:V8},H=(Q,G)=>(Q?Array.isArray(Q)?Q:[Q]:P2(O)).flatMap((V)=>{const X=O[V];if(!X)return console.warn(`${g8}: no peer with id ${V} found`),[];return G(V,X)}),P=(Q)=>{if(!O[Q])return;delete O[Q],delete J[Q],delete C[Q],L.onPeerLeave(Q),q(Q)},R=(Q)=>{if(Z[Q])return N[Q];if(!Q)throw c6("action type argument is required");const G=r6(Q);if(G.byteLength>b7)throw c6(`action type string "${Q}" (${G.byteLength}b) exceeds `+`byte limit (${b7}). Hint: choose a shorter name.`);const V=new Uint8Array(b7);V.set(G);let X=0;return Z[Q]={onComplete:V8,onProgress:V8,setOnComplete:(U)=>Z[Q]={...Z[Q],onComplete:U},setOnProgress:(U)=>Z[Q]={...Z[Q],onProgress:U},send:async(U,$,j,K)=>{if(j&&typeof j!=="object")throw c6("action meta argument must be an object");const W=typeof U;if(W==="undefined")throw c6("action data cannot be undefined");const z=W!=="string",A=U instanceof Blob,T=A||U instanceof ArrayBuffer||U instanceof NV;if(j&&!T)throw c6("action meta argument can only be used with binary data");const y=T?new Uint8Array(A?await U.arrayBuffer():U):r6(z?h6(U):U),r=j?r6(h6(j)):null,a=Math.ceil(y.byteLength/_8)+(j?1:0)||1,t=O8(a,(l,h)=>{const n=h===a-1,q0=j&&h===0,G0=new Uint8Array(a1+(q0?r.byteLength:n?y.byteLength-_8*(a-(j?2:1)):_8));return G0.set(V),G0.set([X],h7),G0.set([n|q0<<1|T<<2|z<<3],c7),G0.set([Math.round((h+1)/a*p7)],o1),G0.set(j?q0?r:y.subarray((h-1)*_8,h*_8):y.subarray(h*_8,(h+1)*_8),a1),G0});return X=X+1&p7,n6(H($,async(l,h)=>{const{channel:n}=h;let q0=0;while(q0<a){const G0=t[q0];if(n.bufferedAmount>n.bufferedAmountLowThreshold)await new Promise((F0)=>{const b=()=>{n.removeEventListener(E2,b),F0()};n.addEventListener(E2,b)});if(!O[l])break;h.sendData(G0),q0++,K?.(G0[o1]/p7,l,j)}}))}},N[Q]||=[Z[Q].send,Z[Q].setOnComplete,Z[Q].setOnProgress]},k=(Q,G)=>{const V=new Uint8Array(G),X=J1(V.subarray(w2,h7)).replaceAll("\0",""),[U]=V.subarray(h7,c7),[$]=V.subarray(c7,o1),[j]=V.subarray(o1,a1),K=V.subarray(a1),W=!!($&1),z=!!($&1<<1),A=!!($&1<<2),T=!!($&1<<3);if(!Z[X]){console.warn(`${g8}: received message with unregistered type (${X})`);return}J[Q]||={},J[Q][X]||={};const y=J[Q][X][U]||={chunks:[]};if(z)y.meta=y8(J1(K));else y.chunks.push(K);if(Z[X].onProgress(j/p7,Q,y.meta),!W)return;const r=new Uint8Array(y.chunks.reduce((a,t)=>a+t.byteLength,0));if(y.chunks.reduce((a,t)=>{return r.set(t,a),a+t.byteLength},0),delete J[Q][X][U],A)Z[X].onComplete(r,Q,y.meta);else{const a=J1(r);Z[X].onComplete(T?y8(a):a,Q)}},v=async()=>{await u(""),await new Promise((Q)=>setTimeout(Q,99)),_7(O).forEach(([Q,G])=>{G.destroy(),delete O[Q]}),F()},[M,w]=R(U1("ping")),[x,g]=R(U1("pong")),[_,p]=R(U1("signal")),[m,f]=R(U1("stream")),[s,Q0]=R(U1("track")),[u,K0]=R(U1("leave"));if(Y((Q,G)=>{if(O[G])return;O[G]=Q,Q.setHandlers({data:(V)=>k(G,V),stream:(V)=>{L.onPeerStream(V,G,B[G]),delete B[G]},track:(V,X)=>{L.onPeerTrack(V,X,G,D[G]),delete D[G]},signal:(V)=>_(V,G),close:()=>P(G),error:(V)=>{console.error(V),P(G)}}),L.onPeerJoin(G)}),w((Q,G)=>x("",G)),g((Q,G)=>{C[G]?.(),delete C[G]}),p((Q,G)=>O[G]?.signal(Q)),f((Q,G)=>B[G]=Q),Q0((Q,G)=>D[G]=Q),K0((Q,G)=>P(G)),N2)addEventListener("beforeunload",v);return{makeAction:R,leave:v,ping:async(Q)=>{if(!Q)throw c6("ping() must be called with target peer ID");const G=Date.now();return M("",Q),await new Promise((V)=>C[Q]=V),Date.now()-G},getPeers:()=>q9(_7(O).map(([Q,G])=>[Q,G.connection])),addStream:(Q,G,V)=>H(G,async(X,U)=>{if(V)await m(V,X);U.addStream(Q)}),removeStream:(Q,G)=>H(G,(V,X)=>X.removeStream(Q)),addTrack:(Q,G,V,X)=>H(V,async(U,$)=>{if(X)await s(X,U);$.addTrack(Q,G)}),removeTrack:(Q,G)=>H(G,(V,X)=>X.removeTrack(Q)),replaceTrack:(Q,G,V,X)=>H(V,async(U,$)=>{if(X)await s(X,U);$.replaceTrack(Q,G)}),onPeerJoin:(Q)=>L.onPeerJoin=Q,onPeerLeave:(Q)=>L.onPeerLeave=Q,onPeerStream:(Q)=>L.onPeerStream=Q,onPeerTrack:(Q)=>L.onPeerTrack=Q}};var PV=20,kV=5333,y2=57333,_2=({init:Y,subscribe:q,announce:F})=>{const O={};let Z=!1,N,J,C;return(B,D,L)=>{const{appId:H}=B;if(O[H]?.[D])return O[H][D];const P={},R={},k=u1(g8,H,D),v=f1(k),M=f1(u1(k,a6)),w=I2(B.password||"",H,D),x=(U)=>async($)=>({type:$.type,sdp:await U(w,$.sdp)}),g=x(v2),_=x(A2),p=()=>C9(!0,B),m=(U,$,j)=>{if(R[$]){if(R[$]!==U)U.destroy();return}R[$]=U,X(U,$),P[$]?.forEach((K,W)=>{if(W!==j)K.destroy()}),delete P[$]},f=(U,$)=>{if(R[$]===U)delete R[$]},s=(U,$)=>{if(R[U])return;const j=P[U]?.[$];if(j)delete P[U][$],j.destroy()},Q0=(U)=>{return J.push(...O8(U,p)),n6(J.splice(0,U).map(($)=>$.offerPromise.then(_).then((j)=>({peer:$,offer:j}))))},u=(U,$)=>L?.({error:`incorrect password (${B.password}) when decrypting ${$}`,appId:H,peerId:U,roomId:D}),K0=(U)=>async($,j,K)=>{const[W,z]=await n6([v,M]);if($!==W&&$!==z)return;const{peerId:A,offer:T,answer:y,peer:r}=typeof j==="string"?y8(j):j;if(A===a6||R[A])return;if(A&&!T&&!y){if(P[A]?.[U])return;const[[{peer:a,offer:t}],l]=await n6([Q0(1),f1(u1(k,A))]);P[A]||=[],P[A][U]=a,setTimeout(()=>s(A,U),Q[U]*0.9),a.setHandlers({connect:()=>m(a,A,U),close:()=>f(a,A)}),K(l,h6({peerId:a6,offer:t}))}else if(T){if(P[A]?.[U]&&a6>A)return;const t=C9(!1,B);t.setHandlers({connect:()=>m(t,A,U),close:()=>f(t,A)});let l;try{l=await g(T)}catch{u(A,"offer");return}if(t.isDead)return;const[h,n]=await n6([f1(u1(k,A)),t.signal(l)]);K(h,h6({peerId:a6,answer:await _(n)}))}else if(y){let a;try{a=await g(y)}catch(t){u(A,"answer");return}if(r)r.setHandlers({connect:()=>m(r,A,U),close:()=>f(r,A)}),r.signal(a);else{const t=P[A]?.[U];if(t&&!t.isDead)t.signal(a)}}};if(!B)throw c6("requires a config map as the first argument");if(!H&&!B.firebaseApp)throw c6("config map is missing appId field");if(!D)throw c6("roomId argument required");if(!Z){const U=Y(B);J=O8(PV,p),N=Array.isArray(U)?U:[U],Z=!0,C=setInterval(()=>J=J.filter(($)=>{const j=Date.now()-$.created<y2;if(!j)$.destroy();return j}),y2*1.03)}const Q=N.map(()=>kV),G=[],V=N.map(async(U,$)=>q(await U,await v,await M,K0($),Q0));n6([v,M]).then(([U,$])=>{const j=async(K,W)=>{const z=await F(K,U,$);if(typeof z==="number")Q[W]=z;G[W]=setTimeout(()=>j(K,W),Q[W])};V.forEach(async(K,W)=>{await K,j(await N[W],W)})});let X=V8;return O[H]||={},O[H][D]=g2((U)=>X=U,(U)=>delete R[U],()=>{delete O[H][D],G.forEach(clearTimeout),V.forEach(async(U)=>(await U)()),clearInterval(C)})}};var h2={},BV=5,c2="x",l2="EVENT",d2=p6.randomPrivateKey(),RV=m7(Z9.getPublicKey(d2)),O9={},n1={},IV={},u2=()=>Math.floor(Date.now()/1000),f2=(Y)=>IV[Y]??=j9(Y,1e4)+20000,m2=async(Y,q)=>{const F={kind:f2(Y),content:q,pubkey:RV,created_at:u2(),tags:[[c2,Y]]},O=m7(new Uint8Array(await crypto.subtle.digest("SHA-256",r6(h6([0,F.pubkey,F.created_at,F.kind,F.tags,F.content])))));return h6([l2,{...F,id:O,sig:m7(await Z9.sign(O,d2))}])},p2=(Y,q)=>{return O9[Y]=q,h6(["REQ",Y,{kinds:[f2(q)],since:u2(),["#"+c2]:[q]}])},b2=(Y)=>{return delete O9[Y],h6(["CLOSE",Y])},l7=_2({init:(Y)=>k2(Y,MV,BV,!0).map((q)=>{const F=B2(q,(O)=>{const[Z,N,J,C]=y8(O);if(Z!==l2){const B=`${g8}: relay failure from ${F.url} - `;if(Z==="NOTICE")console.warn(B+N);else if(Z==="OK"&&!J)console.warn(B+C);return}n1[N]?.(O9[N],J.content)});return h2[q]=F,F.ready}),subscribe:(Y,q,F,O)=>{const Z=y7(64),N=y7(64);return n1[Z]=n1[N]=(J,C)=>O(J,C,async(B,D)=>Y.send(await m2(B,D))),Y.send(p2(Z,q)),Y.send(p2(N,F)),()=>{Y.send(b2(Z)),Y.send(b2(N)),delete n1[Z],delete n1[N]}},announce:async(Y,q)=>Y.send(await m2(q,h6({peerId:a6})))}),TV=R2(h2),MV=["black.nostrcity.club","eu.purplerelay.com","ftp.halifax.rwth-aachen.de/nostr","nostr.cool110.xyz","nostr.data.haus","nostr.mom","nostr.oxtr.dev","nostr.sathoarder.com","nostr.vulpem.com","nostrelay.memory-art.xyz","playground.nostrcheck.me/relay","relay.agorist.space","relay.binaryrobot.com","relay.fountain.fm","relay.mostro.network","relay.nostraddress.com","relay.nostrdice.com","relay.nostromo.social","relay.oldenburg.cool","relay.snort.social","relay.verified-nostr.com","sendit.nosflare.com","yabu.me/v2"].map((Y)=>"wss://"+Y);var o2=(Y,q,F)=>{let O=q.timestamp;if(q.timestamp&&typeof q.timestamp.physical==="number"){const J=Date.now()+7200000;if(q.timestamp.physical>J)O={physical:J,logical:q.timestamp.logical}}if(!Y||!Y.timestamp)return{resolved:!0,value:q.value,timestamp:O};const Z=Y.timestamp;if(F.compare(Z,O)<0)return{resolved:!0,value:q.value,timestamp:O};return{resolved:!1}};var AV=()=>{const Y=new Map,q=async()=>{try{const B=await navigator.storage.getDirectory(),L=await(await B.getFileHandle("~opfs-sync-test",{create:!0})).createSyncAccessHandle?.();return await L?.close(),await B.removeEntry("~opfs-sync-test"),!!L}catch{return!1}};let F="idb";const O=(async()=>{if(await q())F="sync";else try{const B=await navigator.storage.getDirectory(),L=await(await B.getFileHandle("~opfs-async-test",{create:!0})).createWritable?.();if(await L?.close(),await B.removeEntry("~opfs-async-test"),L)F="async";else F="idb"}catch{F="idb"}})(),Z=async(B,D)=>{if(!Y.has(B))Y.set(B,[]);const L=Y.get(B),H=L[L.length-1]||Promise.resolve();let P;const R=new Promise((k)=>P=k);L.push(R);try{return await H,await D()}finally{if(L.shift(),P(),L.length===0)Y.delete(B)}},N=(()=>{let B;const D=async()=>{if(!B)B=new Promise((L,H)=>{const P=indexedDB.open("opfs-fallback-db",1);P.onupgradeneeded=()=>P.result.createObjectStore("files"),P.onsuccess=()=>L(P.result),P.onerror=()=>H(P.error)});return B};return{getDB:D,get:async(L)=>{const H=await D();return new Promise((P,R)=>{const v=H.transaction("files","readonly").objectStore("files").get(L);v.onsuccess=()=>P(v.result||new Uint8Array),v.onerror=()=>R(v.error)})},set:async(L,H)=>{const P=await D();return new Promise((R,k)=>{const M=P.transaction("files","readwrite").objectStore("files").put(H,L);M.onsuccess=()=>R(),M.onerror=()=>k(M.error)})}}})(),J=async(B)=>{await O;try{if(F==="idb"){const R=await N.get(B);return{type:"loaded",name:B,data:R}}const L=await(await navigator.storage.getDirectory()).getFileHandle(B);if(F==="sync"){let R;try{R=await L.createSyncAccessHandle();const k=R.getSize(),v=new Uint8Array(k),M=R.read(v,{at:0});return{type:"loaded",name:B,data:v.slice(0,M)}}finally{R?.close()}}const H=await L.getFile(),P=new Uint8Array(await H.arrayBuffer());return{type:"loaded",name:B,data:P}}catch(D){const L=D.name==="NotFoundError"?"File not found":D.message||"Error reading file";return{type:"error",name:B,message:L}}},C=async(B,D)=>{if(await O,!(D instanceof Uint8Array))return{type:"error",name:B,message:"Content must be a Uint8Array"};return Z(B,async()=>{try{if(F==="idb")return await N.set(B,D),{type:"saved",name:B};const H=await(await navigator.storage.getDirectory()).getFileHandle(B,{create:!0});if(F==="sync"){let P;try{P=await H.createSyncAccessHandle(),P.truncate(0),P.write(D,{at:0}),P.flush()}finally{P?.close()}}else{let P;try{P=await H.createWritable(),await P.write(D)}finally{await P?.close()}}return{type:"saved",name:B}}catch(L){return{type:"error",name:B,message:L.message||"Error saving file"}}})};self.onmessage=async({data:B})=>{const{type:D,name:L,content:H}=B;await O;const P={load:()=>J(L),save:()=>C(L,H)};try{const R=P[D],k=R?await R():{type:"error",message:`Unrecognized action type: ${D}`};self.postMessage(k)}catch(R){console.error("Worker unexpected error:",R),self.postMessage({type:"error",name:L,message:R.message||"Unexpected worker error"})}}},a2=AV;var m8={$eq:(Y,q)=>Y===q,$ne:(Y,q)=>Y!==q,$gt:(Y,q)=>Y>q,$gte:(Y,q)=>Y>=q,$lt:(Y,q)=>Y<q,$lte:(Y,q)=>Y<=q,$in:(Y,q)=>Array.isArray(q)&&q.includes(Y),$between:(Y,[q,F])=>Y>=q&&Y<=F,$exists:(Y,q)=>q?Y!==void 0:Y===void 0,$text:{global:(Y,q)=>{const F=(Z)=>String(Z).normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^\w\s]/g,""),O=F(q);return Object.values(Y).some((Z)=>{if(typeof Z==="object")return null.fieldSearch(Z,O);return F(Z).includes(O)})},field:(Y,q)=>{const F=(O)=>String(O).normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^\w\s]/g,"");return Array.isArray(Y)?Y.some((O)=>F(O).includes(F(q))):F(Y).includes(F(q))}},$like:(Y,q)=>{if(typeof Y!=="string"||typeof q!=="string")return!1;return new RegExp(`^${q.replace(/%/g,".*").replace(/_/g,".")}\$`,"i").test(Y)},$regex:(Y,q)=>typeof Y==="string"&&new RegExp(q.$regex||q,"i").test(Y),$and:(Y,q,F)=>q.every((O)=>{return F.createFilter(O)(Y)}),$or:(Y,q,F)=>q.some((O)=>{return F.createFilter(O)(Y)}),$not:(Y,q,F)=>{return!F.createFilter(q)(Y)}},D9=(Y,q)=>{const F=q.split(".");let O=Y;for(let Z of F)if(O&&typeof O==="object"&&(Z in O))O=O[Z];else return;return O},L9=(Y)=>{const q=(F)=>{return Object.entries(Y).every(([O,Z])=>{if(O.startsWith("$"))return m8[O](F,Z,{filterNode:q,createFilter:L9});const N=D9(F.value,O);if(typeof Z!=="object"||Z===null)return m8.$eq(N,Z);return Object.entries(Z).every(([J,C])=>{if(J==="$text")return m8.$text.field(N,C);if(J==="$between"&&C.every((B)=>B instanceof Date)){const B=new Date(N);return m8.$between(B,C)}return m8[J]?.(N,C,{filterNode:q,createFilter:L9})??!1})})};return q},N9=(Y,q)=>{const F=L9(q.query);let O=Object.values(Y).filter(F);if(q.field)O.sort((Z,N)=>{const J=D9(Z.value,q.field),C=D9(N.value,q.field),B=q.order==="asc"?1:-1;if(typeof J==="string"&&typeof C==="string")return J.localeCompare(C)*B;return((J??0)-(C??0))*B});if(q.$after){const Z=O.findIndex((N)=>N.id===q.$after);O=Z>=0?O.slice(Z+1):[]}if(q.$before){const Z=O.findIndex((N)=>N.id===q.$before);O=Z>=0?O.slice(0,Z):[]}return q.$limit?O.slice(0,q.$limit):O};class P9{constructor(){this.physical=Date.now(),this.logical=0}now(){const Y=Date.now();return this.physical=Math.max(this.physical,Y),this.logical++,{physical:this.physical,logical:this.logical}}update(Y){if(!Y||typeof Y.physical!=="number"||typeof Y.logical!=="number")return;this.physical=Math.max(this.physical,Y.physical),this.logical=Math.max(this.logical,Y.logical)+1}compare(Y,q){if(!Y&&!q)return 0;if(!Y)return-1;if(!q)return 1;if(Y.physical>q.physical)return 1;if(Y.physical<q.physical)return-1;if(Y.logical>q.logical)return 1;if(Y.logical<q.logical)return-1;return 0}}var n2=function(Y,q){return Y.length===q.length&&Y.every((F,O)=>F===q[O])};async function vV(){console.log("\u26A1 GenosDB: Empowering distributed graph databases with real-time synchronization and scalability. Learn more: https://github.com/estebanrfp/gdb \u26A1"),console.log(navigator?.storage?.getDirectory?"OPFS is enabled.":"OPFS is not available."),navigator?.storage?.getDirectory&&await navigator.storage.getDirectory()}if(Symbol.dispose===void 0)Object.defineProperty(Symbol,"dispose",{value:Symbol.for("Symbol.dispose")});class r2{constructor(){this.nodes={}}insert(Y,q,F){this.nodes[Y]={id:Y,value:q,edges:[],timestamp:F}}get(Y){return this.nodes[Y]||null}link(Y,q){const F=this.nodes[Y],O=this.nodes[q];if(F&&O&&!F.edges.includes(q))F.edges.push(q)}getAllNodes(){return Object.values(this.nodes)}serialize(){return v1.deflate(L8(this.nodes))}deserialize(Y){this.nodes=s7(v1.inflate(new Uint8Array(Y)))}}class d7{static _listenersInitialized=!1;constructor(Y,{password:q,securityManager:F=null}={}){this.hybridClock=new P9,this.name=Y,this.password=q,this.globalTimestamp=null,this.graph=new r2,this.securityManager=F,this.eventListeners=[],this.operators=m8,this.initWorker(),this.ready=this.loadGraphFromOPFS(),this.loadGlobalTimestamp();const O=`graph-sync-room-${this.name}`,Z={appId:"1234",...this.password&&{password:this.password}},N=l7(Z,O),[J,C]=N.makeAction("syncGraph");this.sendData=J;const B=l7(Z,`app-sync-${this.name}`);if(this.room=B,!d7._listenersInitialized)d7._listenersInitialized=!0,window.addEventListener("online",async()=>{console.log("\u2705 Reconnected to the network."),this.sendData([{type:"sync",timestamp:this.globalTimestamp}])}),window.addEventListener("offline",async()=>{console.log("\u274C Disconnected from the network.")}),document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible")console.log("The tab is visible again."),this.sendData([{type:"sync",timestamp:this.globalTimestamp}]);else if(document.visibilityState==="hidden")console.log("The tab is no longer visible.")});vV(),N.onPeerJoin(async(D)=>{console.log("\u26A1 New pair connected:",D),this.sendData([{type:"sync",timestamp:this.globalTimestamp}])}),N.onPeerLeave((D)=>{console.log("\u26A1 Pair disconnected:",D)}),C(async(D)=>{if(this.securityManager&&typeof this.securityManager.verifyIncomingOperations==="function"){const{validatedOperations:L}=await this.securityManager.verifyIncomingOperations(D);if(L&&L.length>0)await this.receiveChanges(L)}else console.log("GDB: No SecurityManager configured or verifyIncomingOperations missing. Processing P2P data directly."),await this.receiveChanges(D),this.emit()}),this.channel=new BroadcastChannel(`graphdb_sync_${this.name}`),this.channel.onmessage=async(D)=>{if(D.data==="update")console.log("\uD83D\uDD04 Update received from another tab..."),await this.loadGraphFromOPFS(),this.loadGlobalTimestamp(),this.emit()}}loadGlobalTimestamp(){const Y=localStorage.getItem(`${this.name}_time`);this.globalTimestamp=Y?JSON.parse(Y):null}saveGlobalTimestamp(Y){this.globalTimestamp=Y,localStorage.setItem(`${this.name}_time`,JSON.stringify(Y))}initWorker(){try{const Y=URL.createObjectURL(new Blob([`(${a2.toString()})()`],{type:"application/javascript"}));this.worker=new Worker(Y),this.worker.addEventListener("message",({data:q})=>{console.log("Worker message:",`${q.name} ${q.type}`),URL.revokeObjectURL(Y)}),console.log("Worker initialized successfully.")}catch({message:Y}){console.error("Failed to initialize worker:",Y)}}getWorker(){return this.worker}emit(){this.eventListeners.forEach((Y)=>Y(this.graph.nodes))}compress(Y){return v1.deflate(Y)}decompress(Y){return v1.inflate(Y)}async getAllNodes(){return await this.ready,this.graph.getAllNodes()}async generateHash(){return crypto.randomUUID()}async hashValue(Y){const q=(new TextEncoder()).encode(Y),F=await crypto.subtle.digest("SHA-256",q);return Array.from(new Uint8Array(F)).map((O)=>O.toString(16).padStart(2,"0")).join("")}async loadGraphFromOPFS(){try{const q=await((F)=>new Promise((O,Z)=>{const N=async({data:J})=>{if(J.type==="loaded"&&J.name===F)this.worker.removeEventListener("message",N),O(new Uint8Array(J.data));else if(J.type==="error")this.worker.removeEventListener("message",N),Z(new Error(J.message||"Unknown error"))};this.worker.addEventListener("message",N),this.worker.postMessage({type:"load",name:F})}))(`${this.name}_graph.msgpack`).catch(()=>new Uint8Array);q.byteLength>0?this.graph.deserialize(q):console.warn("The file '_graph.msgpack' is empty or could not be loaded."),console.log(`Graph loaded from OPFS: [ ${this.graph.getAllNodes().length} nodes ]`)}catch({message:Y}){console.error("General error loading the graph from OPFS:",Y)}}async saveGraphToOPFS(){try{const Y=this.graph.serialize();return await((F,O)=>new Promise((Z,N)=>{const J=({data:C})=>{if(C.type==="saved"&&C.name===F)this.worker.removeEventListener("message",J),Z();else if(C.type==="error")this.worker.removeEventListener("message",J),N(new Error(C.message||"Save error"))};this.worker.addEventListener("message",J),this.worker.postMessage({type:"save",name:F,content:O})}))(`${this.name}_graph.msgpack`,Y),this.channel.postMessage("update"),!0}catch({message:Y}){throw console.error("Save error:",Y),new Error("Save failed")}}async put(Y,q){await this.ready;const F=this.hybridClock.now();return this.saveGlobalTimestamp(F),q??=await this.generateHash(),this.graph.insert(q,Y,F),await this.saveGraphToOPFS(),await this.sendData([{type:"insert",id:q,value:Y,timestamp:F}]),this.emit(),q}async get(Y,q=null){if(await this.ready,typeof Y!=="string")return{result:null};const F=this.graph.get(Y);if(!F){if(q)q(null);return{result:null}}const O=(J)=>{if(!J)return null;const C=J.value!==null&&typeof J.value==="object"?{...J.value}:J.value;return{...J,value:C}};if(!q)return{result:O(F)};let Z=F.timestamp;q(O(F));const N=(J)=>{const C=J[Y];if(C){if(this.hybridClock.compare(C.timestamp,Z)>0)Z=C.timestamp,q(O(C))}else q(null),this.eventListeners.splice(this.eventListeners.indexOf(N),1)};return this.eventListeners.push(N),{result:O(F),unsubscribe:()=>{const J=this.eventListeners.indexOf(N);if(J>-1)this.eventListeners.splice(J,1)}}}async map(...Y){await this.ready;let F={...{realtime:!1,query:{},field:null,order:"asc",$limit:null,$after:null,$before:null}},O=null,Z=!1;Y.forEach((B)=>typeof B==="function"?O=B:B&&typeof B==="object"&&(Z||=("realtime"in B),Object.assign(F,B))),O&&!Z&&(F.realtime=!0);let N=N9(this.graph.nodes,F),J=null;const C=(B)=>{const D=B.filter((R)=>!N.some((k)=>k.id===R.id)),L=N.filter((R)=>!B.some((k)=>k.id===R.id)),H=B.filter((R)=>{const k=N.find((v)=>v.id===R.id);return k&&!n2(L8(R.value),L8(k.value))}),P=(R,k)=>{const v=k==="removed"?null:R.value,M={id:R.id,value:v,edges:R.edges||[],timestamp:R.timestamp||null,action:k};O(M)};D.forEach((R)=>P(R,"added")),L.forEach((R)=>P(R,"removed")),H.forEach((R)=>P(R,"updated"))};if(O){if(N.forEach((B)=>{if(B.value)O({id:B.id,value:B.value,edges:B.edges,timestamp:B.timestamp,action:"initial"})}),F.realtime)J=(B)=>{const D=N9(B,F);if(!n2(L8(D),L8(N)))C(D),N=D},this.eventListeners.push(J)}return{results:N,...F.realtime&&O&&J&&{unsubscribe:()=>{const B=this.eventListeners.indexOf(J);B>-1&&this.eventListeners.splice(B,1)}}}}async remove(Y){await this.ready;const q=this.hybridClock.now(),F=this.graph.get(Y);if(!F)return console.error(`Node with ID '${Y}' not found.`);delete this.graph.nodes[Y],Object.values(this.graph.nodes).forEach((O)=>O.edges=O.edges.filter((Z)=>Z!==Y)),await this.saveGraphToOPFS(),this.saveGlobalTimestamp(q),await this.sendData([{type:"remove",id:Y,value:F.value,timestamp:q}]),this.emit()}async clear(){await this.ready,this.graph.nodes={};try{await(await navigator.storage.getDirectory()).removeEntry(`${this.name}_graph.msgpack`)}catch({message:Y}){console.warn(`Error deleting _graph.msgpack: ${Y}`)}this.emit(),console.log("All data has been deleted.")}async link(Y,q){await this.ready;const F=this.hybridClock.now();if(!this.graph.nodes[Y]||!this.graph.nodes[q]){console.error(`One or both nodes (${Y}, ${q}) do not exist.`);return}this.graph.link(Y,q),await this.saveGraphToOPFS(),this.saveGlobalTimestamp(F),await this.sendData([{type:"link",sourceId:Y,targetId:q,timestamp:F}]),this.emit()}async applyFullGraph(Y){try{console.log("Applying full graph from remote..."),this.graph.nodes={...Y.nodes},await this.saveGraphToOPFS()}catch({message:q}){console.error(`Error applying the full graph: ${q}`)}}async receiveChanges(Y){const q={insert:(F)=>{this.graph.insert(F.id,F.value,F.timestamp),this.hybridClock.update(F.timestamp)},update:(F)=>{const O=this.graph.get(F.id),Z=o2(O,F,this.hybridClock);if(Z.resolved)Object.assign(O,{value:Z.value,timestamp:Z.timestamp}),this.hybridClock.update(Z.timestamp)},remove:(F)=>{if(this.graph.nodes[F.id])this.hybridClock.update(F.timestamp),delete this.graph.nodes[F.id]},link:(F)=>{if(this.graph.nodes[F.sourceId]&&this.graph.nodes[F.targetId])this.graph.link(F.sourceId,F.targetId),this.hybridClock.update(F.timestamp)},sync:async(F)=>{if(console.log(F),this.hybridClock.update(F.timestamp),this.hybridClock.compare(this.globalTimestamp,F.timestamp)>0)console.log("Sending recent data to the remote node."),await this.sendData([{type:"syncReceive",graph:this.graph}])},syncReceive:async(F)=>await this.applyFullGraph(F.graph)};for(let F of Y)await q[F.type]?.(F);await this.saveGraphToOPFS(),this.emit()}}export{d7 as default};
Binary file
package/dist/index.js CHANGED
@@ -8,4 +8,4 @@ use chrome, FireFox or Internet Explorer 11`)}var F=l0(),O=s8(),Z=F.Buffer,N=F.k
8
8
  *
9
9
  * @author Feross Aboukhadijeh <https://feross.org>
10
10
  * @license MIT
11
- *//*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> *//*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */var K2=function(Y){const{a:q,b:F}=H6,O=y0(Y*Y),Z=y0(O*Y);return y0(Z+q*Y+F)},z2=function(Y){if(!(Y instanceof o0))throw new TypeError("JacobianPoint expected")},v7=function(Y,q){const F=q.negate();return Y?F:q},Z2=function(Y){return Number.parseInt(Y[0],16)>=8?"00"+Y:Y},$2=function(Y){if(Y.length<2||Y[0]!==2)throw new Error(`Invalid signature integer tag: ${Y1(Y)}`);const q=Y[1],F=Y.subarray(2,q+2);if(!q||F.length!==q)throw new Error("Invalid signature integer: wrong length");if(F[0]===0&&F[1]<=127)throw new Error("Invalid signature integer: trailing length");return{data:b6(F),left:Y.subarray(q+2)}},sY=function(Y){if(Y.length<2||Y[0]!=48)throw new Error(`Invalid signature tag: ${Y1(Y)}`);if(Y[1]!==Y.length-2)throw new Error("Invalid signature: incorrect length");const{data:q,left:F}=$2(Y.subarray(2)),{data:O,left:Z}=$2(F);if(Z.length)throw new Error(`Invalid signature: left bytes after parsing: ${Y1(Z)}`);return{r:q,s:O}},h1=function(Y){return Y instanceof Uint8Array||ArrayBuffer.isView(Y)&&Y.constructor.name==="Uint8Array"},H2=function(Y){if(!h1(Y))throw new Error("Uint8Array expected")},_1=function(...Y){if(Y.every(H2),Y.length===1)return Y[0];const q=Y.reduce((O,Z)=>O+Z.length,0),F=new Uint8Array(q);for(let O=0,Z=0;O<Y.length;O++){const N=Y[O];F.set(N,Z),Z+=N.length}return F};function Y1(Y){H2(Y);let q="";for(let F=0;F<Y.length;F++)q+=tY[Y[F]];return q}var q2=function(Y){if(Y>=Y8._0&&Y<=Y8._9)return Y-Y8._0;if(Y>=Y8.A&&Y<=Y8.F)return Y-(Y8.A-10);if(Y>=Y8.a&&Y<=Y8.f)return Y-(Y8.a-10);return};function H8(Y){if(typeof Y!=="string")throw new Error("hex string expected, got "+typeof Y);const q=Y.length,F=q/2;if(q%2)throw new Error("hex string expected, got unpadded hex of length "+q);const O=new Uint8Array(F);for(let Z=0,N=0;Z<F;Z++,N+=2){const J=q2(Y.charCodeAt(N)),C=q2(Y.charCodeAt(N+1));if(J===void 0||C===void 0){const B=Y[N]+Y[N+1];throw new Error('hex string expected, got non-hex character "'+B+'" at index '+N)}O[Z]=J*16+C}return O}var C8=function(Y){if(typeof Y!=="bigint")throw new Error("Expected bigint");if(!(u0<=Y&&Y<eY))throw new Error("Expected number 0 <= n < 2^256");return Y.toString(16).padStart(64,"0")},c1=function(Y){const q=H8(C8(Y));if(q.length!==32)throw new Error("Error: expected 32 bytes");return q},m1=function(Y){const q=Y.toString(16);return q.length&1?`0${q}`:q},E7=function(Y){if(typeof Y!=="string")throw new TypeError("hexToNumber: expected string, got "+typeof Y);return BigInt(`0x${Y}`)},b6=function(Y){return E7(Y1(Y))},w8=function(Y){return h1(Y)?Uint8Array.from(Y):H8(Y)},j2=function(Y){if(typeof Y==="number"&&Number.isSafeInteger(Y)&&Y>0)return BigInt(Y);if(typeof Y==="bigint"&&l1(Y))return Y;throw new TypeError("Expected valid private scalar: 0 < scalar < curve.n")},y0=function(Y,q=H6.P){const F=Y%q;return F>=u0?F:q+F},m6=function(Y,q){const{P:F}=H6;let O=Y;while(q-- >u0)O*=O,O%=F;return O},QV=function(Y){const{P:q}=H6,F=BigInt(6),O=BigInt(11),Z=BigInt(22),N=BigInt(23),J=BigInt(44),C=BigInt(88),B=Y*Y*Y%q,D=B*B*Y%q,L=m6(D,p1)*D%q,H=m6(L,p1)*D%q,P=m6(H,j8)*B%q,R=m6(P,O)*P%q,k=m6(R,Z)*R%q,v=m6(k,J)*k%q,M=m6(v,C)*v%q,w=m6(M,J)*k%q,x=m6(w,p1)*D%q,g=m6(x,N)*R%q,_=m6(g,F)*B%q,p=m6(_,j8);if(p*p%q!==Y)throw new Error("Cannot find square root");return p},g7=function(Y,q=H6.P){if(Y===u0||q<=u0)throw new Error(`invert: expected positive integers, got n=${Y} mod=${q}`);let F=y0(Y,q),O=q,Z=u0,N=j6,J=j6,C=u0;while(F!==u0){const D=O/F,L=O%F,H=Z-J*D,P=N-C*D;O=F,F=L,Z=J,N=C,J=H,C=P}if(O!==j6)throw new Error("invert: does not exist");return y0(Z,q)},WV=function(Y,q=H6.P){const F=new Array(Y.length),O=Y.reduce((N,J,C)=>{if(J===u0)return N;return F[C]=N,y0(N*J,q)},j6),Z=g7(O,q);return Y.reduceRight((N,J,C)=>{if(J===u0)return N;return F[C]=y0(N*F[C],q),y0(N*J,q)},Z),F},GV=function(Y){const q=Y.length*8-b1*8,F=b6(Y);return q>0?F>>BigInt(q):F},XV=function(Y,q=!1){const F=GV(Y);if(q)return F;const{n:O}=H6;return F>=O?F-O:F},l1=function(Y){return u0<Y&&Y<H6.n},S7=function(Y){return u0<Y&&Y<H6.P};var d1=function(Y){let q;if(typeof Y==="bigint")q=Y;else if(typeof Y==="number"&&Number.isSafeInteger(Y)&&Y>0)q=BigInt(Y);else if(typeof Y==="string"){if(Y.length!==2*b1)throw new Error("Expected 32 bytes of private key");q=E7(Y)}else if(h1(Y)){if(Y.length!==b1)throw new Error("Expected 32 bytes of private key");q=b6(Y)}else throw new TypeError("Expected valid private key");if(!l1(q))throw new Error("Expected private key: 0 < key < n");return q},YV=function(Y){if(Y instanceof Z6)return Y.assertValidity(),Y;else return Z6.fromHex(Y)},VV=function(Y){if(Y instanceof E8)return Y.assertValidity(),Y;try{return E8.fromDER(Y)}catch(q){return E8.fromCompact(Y)}};var w7=function(Y){return y0(b6(Y),H6.n)},JV=function(Y){return Z6.fromPrivateKey(Y).toRawX()};async function UV(Y,q,F){return new z9(Y,q,F).calc()}var FV=function(Y,q,F){return new z9(Y,q,F).calcSync()},C2=function(Y,q,F){const O=Y instanceof V1,Z=O?Y:V1.fromHex(Y);if(O)Z.assertValidity();return{...Z,m:w8(q),P:YV(F)}},O2=function(Y,q,F,O){const Z=Z6.BASE.multiplyAndAddUnsafe(q,d1(F),y0(-O,H6.n));if(!Z||!Z.hasEvenY()||Z.x!==Y)return!1;return!0};async function D2(Y,q,F){try{const{r:O,s:Z,m:N,P:J}=C2(Y,q,F),C=w7(await p6.taggedHash(q8.challenge,c1(O),J.toRawX(),N));return O2(O,J,Z,C)}catch(O){return!1}}var L2=function(Y,q,F){try{const{r:O,s:Z,m:N,P:J}=C2(Y,q,F),C=w7(p6.taggedHashSync(q8.challenge,c1(O),J.toRawX(),N));return O2(O,J,Z,C)}catch(O){if(O instanceof K9)throw O;return!1}};/*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */var u0=BigInt(0),j6=BigInt(1),j8=BigInt(2),p1=BigInt(3),V2=BigInt(8),H6=Object.freeze({a:u0,b:BigInt(7),P:BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),n:BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),h:j6,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee")}),J2=(Y,q)=>(Y+q/j8)/q,M7={beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar(Y){const{n:q}=H6,F=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),O=-j6*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),Z=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),N=F,J=BigInt("0x100000000000000000000000000000000"),C=J2(N*Y,q),B=J2(-O*Y,q);let D=y0(Y-C*F-B*Z,q),L=y0(-C*O-B*N,q);const H=D>J,P=L>J;if(H)D=q-D;if(P)L=q-L;if(D>J||L>J)throw new Error("splitScalarEndo: Endomorphism failed, k="+Y);return{k1neg:H,k1:D,k2neg:P,k2:L}}},G1=32,b1=32;var U2=G1+1,F2=2*G1+1;var A7=H6.a===u0;class K9 extends Error{constructor(Y){super(Y)}}class o0{constructor(Y,q,F){this.x=Y,this.y=q,this.z=F}static fromAffine(Y){if(!(Y instanceof Z6))throw new TypeError("JacobianPoint#fromAffine: expected Point");if(Y.equals(Z6.ZERO))return o0.ZERO;return new o0(Y.x,Y.y,j6)}static toAffineBatch(Y){const q=WV(Y.map((F)=>F.z));return Y.map((F,O)=>F.toAffine(q[O]))}static normalizeZ(Y){return o0.toAffineBatch(Y).map(o0.fromAffine)}equals(Y){z2(Y);const{x:q,y:F,z:O}=this,{x:Z,y:N,z:J}=Y,C=y0(O*O),B=y0(J*J),D=y0(q*B),L=y0(Z*C),H=y0(y0(F*J)*B),P=y0(y0(N*O)*C);return D===L&&H===P}negate(){return new o0(this.x,y0(-this.y),this.z)}double(){const{x:Y,y:q,z:F}=this,O=y0(Y*Y),Z=y0(q*q),N=y0(Z*Z),J=Y+Z,C=y0(j8*(y0(J*J)-O-N)),B=y0(p1*O),D=y0(B*B),L=y0(D-j8*C),H=y0(B*(C-L)-V2*N),P=y0(j8*q*F);return new o0(L,H,P)}add(Y){z2(Y);const{x:q,y:F,z:O}=this,{x:Z,y:N,z:J}=Y;if(Z===u0||N===u0)return this;if(q===u0||F===u0)return Y;const C=y0(O*O),B=y0(J*J),D=y0(q*B),L=y0(Z*C),H=y0(y0(F*J)*B),P=y0(y0(N*O)*C),R=y0(L-D),k=y0(P-H);if(R===u0)if(k===u0)return this.double();else return o0.ZERO;const v=y0(R*R),M=y0(R*v),w=y0(D*v),x=y0(k*k-M-j8*w),g=y0(k*(w-x)-H*M),_=y0(O*J*R);return new o0(x,g,_)}subtract(Y){return this.add(Y.negate())}multiplyUnsafe(Y){const q=o0.ZERO;if(typeof Y==="bigint"&&Y===u0)return q;let F=j2(Y);if(F===j6)return this;if(!A7){let L=q,H=this;while(F>u0){if(F&j6)L=L.add(H);H=H.double(),F>>=j6}return L}let{k1neg:O,k1:Z,k2neg:N,k2:J}=M7.splitScalar(F),C=q,B=q,D=this;while(Z>u0||J>u0){if(Z&j6)C=C.add(D);if(J&j6)B=B.add(D);D=D.double(),Z>>=j6,J>>=j6}if(O)C=C.negate();if(N)B=B.negate();return B=new o0(y0(B.x*M7.beta),B.y,B.z),C.add(B)}precomputeWindow(Y){const q=A7?128/Y+1:256/Y+1,F=[];let O=this,Z=O;for(let N=0;N<q;N++){Z=O,F.push(Z);for(let J=1;J<2**(Y-1);J++)Z=Z.add(O),F.push(Z);O=Z.double()}return F}wNAF(Y,q){if(!q&&this.equals(o0.BASE))q=Z6.BASE;const F=q&&q._WINDOW_SIZE||1;if(256%F)throw new Error("Point#wNAF: Invalid precomputation window, must be power of 2");let O=q&&F9.get(q);if(!O){if(O=this.precomputeWindow(F),q&&F!==1)O=o0.normalizeZ(O),F9.set(q,O)}let{ZERO:Z,BASE:N}=o0;const J=1+(A7?128/F:256/F),C=2**(F-1),B=BigInt(2**F-1),D=2**F,L=BigInt(F);for(let H=0;H<J;H++){const P=H*C;let R=Number(Y&B);if(Y>>=L,R>C)R-=D,Y+=j6;const k=P,v=P+Math.abs(R)-1,M=H%2!==0,w=R<0;if(R===0)N=N.add(v7(M,O[k]));else Z=Z.add(v7(w,O[v]))}return{p:Z,f:N}}multiply(Y,q){let F=j2(Y),O,Z;if(A7){const{k1neg:N,k1:J,k2neg:C,k2:B}=M7.splitScalar(F);let{p:D,f:L}=this.wNAF(J,q),{p:H,f:P}=this.wNAF(B,q);D=v7(N,D),H=v7(C,H),H=new o0(y0(H.x*M7.beta),H.y,H.z),O=D.add(H),Z=L.add(P)}else{const{p:N,f:J}=this.wNAF(F,q);O=N,Z=J}return o0.normalizeZ([O,Z])[0]}toAffine(Y){const{x:q,y:F,z:O}=this,Z=this.equals(o0.ZERO);if(Y==null)Y=Z?V2:g7(O);const N=Y,J=y0(N*N),C=y0(J*N),B=y0(q*J),D=y0(F*C),L=y0(O*N);if(Z)return Z6.ZERO;if(L!==j6)throw new Error("invZ was invalid");return new Z6(B,D)}}o0.BASE=new o0(H6.Gx,H6.Gy,j6);o0.ZERO=new o0(u0,j6,u0);var F9=new WeakMap;class Z6{constructor(Y,q){this.x=Y,this.y=q}_setWindowSize(Y){this._WINDOW_SIZE=Y,F9.delete(this)}hasEvenY(){return this.y%j8===u0}static fromCompressedHex(Y){const q=Y.length===32,F=b6(q?Y:Y.subarray(1));if(!S7(F))throw new Error("Point is not on curve");const O=K2(F);let Z=QV(O);const N=(Z&j6)===j6;if(q){if(N)Z=y0(-Z)}else if((Y[0]&1)===1!==N)Z=y0(-Z);const J=new Z6(F,Z);return J.assertValidity(),J}static fromUncompressedHex(Y){const q=b6(Y.subarray(1,G1+1)),F=b6(Y.subarray(G1+1,G1*2+1)),O=new Z6(q,F);return O.assertValidity(),O}static fromHex(Y){const q=w8(Y),F=q.length,O=q[0];if(F===G1)return this.fromCompressedHex(q);if(F===U2&&(O===2||O===3))return this.fromCompressedHex(q);if(F===F2&&O===4)return this.fromUncompressedHex(q);throw new Error(`Point.fromHex: received invalid point. Expected 32-${U2} compressed bytes or ${F2} uncompressed bytes, not ${F}`)}static fromPrivateKey(Y){return Z6.BASE.multiply(d1(Y))}static fromSignature(Y,q,F){const{r:O,s:Z}=VV(q);if(![0,1,2,3].includes(F))throw new Error("Cannot recover: invalid recovery bit");const N=XV(w8(Y)),{n:J}=H6,C=F===2||F===3?O+J:O,B=g7(C,J),D=y0(-N*B,J),L=y0(Z*B,J),H=F&1?"03":"02",P=Z6.fromHex(H+C8(C)),R=Z6.BASE.multiplyAndAddUnsafe(P,D,L);if(!R)throw new Error("Cannot recover signature: point at infinify");return R.assertValidity(),R}toRawBytes(Y=!1){return H8(this.toHex(Y))}toHex(Y=!1){const q=C8(this.x);if(Y)return`${this.hasEvenY()?"02":"03"}${q}`;else return`04${q}${C8(this.y)}`}toHexX(){return this.toHex(!0).slice(2)}toRawX(){return this.toRawBytes(!0).slice(1)}assertValidity(){const{x:q,y:F}=this;if(!S7(q)||!S7(F))throw new Error("Point is not on elliptic curve");const O=y0(F*F),Z=K2(q);if(y0(O-Z)!==u0)throw new Error("Point is not on elliptic curve")}equals(Y){return this.x===Y.x&&this.y===Y.y}negate(){return new Z6(this.x,y0(-this.y))}double(){return o0.fromAffine(this).double().toAffine()}add(Y){return o0.fromAffine(this).add(o0.fromAffine(Y)).toAffine()}subtract(Y){return this.add(Y.negate())}multiply(Y){return o0.fromAffine(this).multiply(Y,this).toAffine()}multiplyAndAddUnsafe(Y,q,F){const O=o0.fromAffine(this),Z=q===u0||q===j6||this!==Z6.BASE?O.multiplyUnsafe(q):O.multiply(q),N=o0.fromAffine(Y).multiplyUnsafe(F),J=Z.add(N);return J.equals(o0.ZERO)?void 0:J.toAffine()}}Z6.BASE=new Z6(H6.Gx,H6.Gy);Z6.ZERO=new Z6(u0,u0);class E8{constructor(Y,q){this.r=Y,this.s=q,this.assertValidity()}static fromCompact(Y){const q=h1(Y);if(typeof Y!=="string"&&!q)throw new TypeError("Signature.fromCompact: Expected string or Uint8Array");const O=q?Y1(Y):Y;if(O.length!==128)throw new Error("Signature.fromCompact: Expected 64-byte hex");return new E8(E7(O.slice(0,64)),E7(O.slice(64,128)))}static fromDER(Y){const q=h1(Y);if(typeof Y!=="string"&&!q)throw new TypeError("Signature.fromDER: Expected string or Uint8Array");const{r:F,s:O}=sY(q?Y:H8(Y));return new E8(F,O)}static fromHex(Y){return this.fromDER(Y)}assertValidity(){const{r:Y,s:q}=this;if(!l1(Y))throw new Error("Invalid Signature: r must be 0 < r < n");if(!l1(q))throw new Error("Invalid Signature: s must be 0 < s < n")}hasHighS(){const Y=H6.n>>j6;return this.s>Y}normalizeS(){return this.hasHighS()?new E8(this.r,y0(-this.s,H6.n)):this}toDERRawBytes(){return H8(this.toDERHex())}toDERHex(){const Y=Z2(m1(this.s)),q=Z2(m1(this.r)),F=Y.length/2,O=q.length/2,Z=m1(F),N=m1(O);return`30${m1(O+F+4)}02${N}${q}02${Z}${Y}`}toRawBytes(){return this.toDERRawBytes()}toHex(){return this.toDERHex()}toCompactRawBytes(){return H8(this.toCompactHex())}toCompactHex(){return C8(this.r)+C8(this.s)}}var tY=Array.from({length:256},(Y,q)=>q.toString(16).padStart(2,"0")),Y8={_0:48,_9:57,A:65,F:70,a:97,f:102},eY=BigInt("0x10000000000000000000000000000000000000000000000000000000000000000"),X1,U9;class V1{constructor(Y,q){this.r=Y,this.s=q,this.assertValidity()}static fromHex(Y){const q=w8(Y);if(q.length!==64)throw new TypeError(`SchnorrSignature.fromHex: expected 64 bytes, not ${q.length}`);const F=b6(q.subarray(0,32)),O=b6(q.subarray(32,64));return new V1(F,O)}assertValidity(){const{r:Y,s:q}=this;if(!S7(Y)||!l1(q))throw new Error("Invalid signature")}toHex(){return C8(this.r)+C8(this.s)}toRawBytes(){return H8(this.toHex())}}class z9{constructor(Y,q,F=p6.randomBytes()){if(Y==null)throw new TypeError(`sign: Expected valid message, not "${Y}"`);this.m=w8(Y);const{x:O,scalar:Z}=this.getScalar(d1(q));if(this.px=O,this.d=Z,this.rand=w8(F),this.rand.length!==32)throw new TypeError("sign: Expected 32 bytes of aux randomness")}getScalar(Y){const q=Z6.fromPrivateKey(Y),F=q.hasEvenY()?Y:H6.n-Y;return{point:q,scalar:F,x:q.toRawX()}}initNonce(Y,q){return c1(Y^b6(q))}finalizeNonce(Y){const q=y0(b6(Y),H6.n);if(q===u0)throw new Error("sign: Creation of signature failed. k is zero");const{point:F,x:O,scalar:Z}=this.getScalar(q);return{R:F,rx:O,k:Z}}finalizeSig(Y,q,F,O){return new V1(Y.x,y0(q+F*O,H6.n)).toRawBytes()}error(){throw new Error("sign: Invalid signature produced")}async calc(){const{m:Y,d:q,px:F,rand:O}=this,Z=p6.taggedHash,N=this.initNonce(q,await Z(q8.aux,O)),{R:J,rx:C,k:B}=this.finalizeNonce(await Z(q8.nonce,N,F,Y)),D=w7(await Z(q8.challenge,C,F,Y)),L=this.finalizeSig(J,B,D,q);if(!await D2(L,Y,F))this.error();return L}calcSync(){const{m:Y,d:q,px:F,rand:O}=this,Z=p6.taggedHashSync,N=this.initNonce(q,Z(q8.aux,O)),{R:J,rx:C,k:B}=this.finalizeNonce(Z(q8.nonce,N,F,Y)),D=w7(Z(q8.challenge,C,F,Y)),L=this.finalizeSig(J,B,D,q);if(!L2(L,Y,F))this.error();return L}}var Z9={Signature:V1,getPublicKey:JV,sign:UV,verify:D2,signSync:FV,verifySync:L2};Z6.BASE._setWindowSize(8);var S6={node:J9,web:typeof self==="object"&&("crypto"in self)?self.crypto:void 0},q8={challenge:"BIP0340/challenge",aux:"BIP0340/aux",nonce:"BIP0340/nonce"},x7={},p6={bytesToHex:Y1,hexToBytes:H8,concatBytes:_1,mod:y0,invert:g7,isValidPrivateKey(Y){try{return d1(Y),!0}catch(q){return!1}},_bigintTo32Bytes:c1,_normalizePrivateKey:d1,hashToPrivateKey:(Y)=>{Y=w8(Y);const q=b1+8;if(Y.length<q||Y.length>1024)throw new Error("Expected valid bytes of private key as per FIPS 186");const F=y0(b6(Y),H6.n-j6)+j6;return c1(F)},randomBytes:(Y=32)=>{if(S6.web)return S6.web.getRandomValues(new Uint8Array(Y));else if(S6.node){const{randomBytes:q}=S6.node;return Uint8Array.from(q(Y))}else throw new Error("The environment doesn't have randomBytes function")},randomPrivateKey:()=>p6.hashToPrivateKey(p6.randomBytes(b1+8)),precompute(Y=8,q=Z6.BASE){const F=q===Z6.BASE?q:new Z6(q.x,q.y);return F._setWindowSize(Y),F.multiply(p1),F},sha256:async(...Y)=>{if(S6.web){const q=await S6.web.subtle.digest("SHA-256",_1(...Y));return new Uint8Array(q)}else if(S6.node){const{createHash:q}=S6.node,F=q("sha256");return Y.forEach((O)=>F.update(O)),Uint8Array.from(F.digest())}else throw new Error("The environment doesn't have sha256 function")},hmacSha256:async(Y,...q)=>{if(S6.web){const F=await S6.web.subtle.importKey("raw",Y,{name:"HMAC",hash:{name:"SHA-256"}},!1,["sign"]),O=_1(...q),Z=await S6.web.subtle.sign("HMAC",F,O);return new Uint8Array(Z)}else if(S6.node){const{createHmac:F}=S6.node,O=F("sha256",Y);return q.forEach((Z)=>O.update(Z)),Uint8Array.from(O.digest())}else throw new Error("The environment doesn't have hmac-sha256 function")},sha256Sync:void 0,hmacSha256Sync:void 0,taggedHash:async(Y,...q)=>{let F=x7[Y];if(F===void 0){const O=await p6.sha256(Uint8Array.from(Y,(Z)=>Z.charCodeAt(0)));F=_1(O,O),x7[Y]=F}return p6.sha256(F,...q)},taggedHashSync:(Y,...q)=>{if(typeof X1!=="function")throw new K9("sha256Sync is undefined, you need to set it");let F=x7[Y];if(F===void 0){const O=X1(Uint8Array.from(Y,(Z)=>Z.charCodeAt(0)));F=_1(O,O),x7[Y]=F}return X1(F,...q)},_JacobianPoint:o0};Object.defineProperties(p6,{sha256Sync:{configurable:!1,get(){return X1},set(Y){if(!X1)X1=Y}},hmacSha256Sync:{configurable:!1,get(){return U9},set(Y){if(!U9)U9=Y}}});var{floor:$9,random:KV,sin:zV}=Math,g8="Trystero",O8=(Y,q)=>Array(Y).fill().map(q);var _7=(Y)=>O8(Y,()=>"0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"[$9(KV()*"0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz".length)]).join(""),a6=_7(20),n6=Promise.all.bind(Promise),N2=typeof window!=="undefined",{entries:m7,fromEntries:q9,keys:P2}=Object,V8=()=>{},c6=(Y)=>new Error(`Trystero: ${Y}`),ZV=new TextEncoder,$V=new TextDecoder,r6=(Y)=>ZV.encode(Y),J1=(Y)=>$V.decode(Y),p7=(Y)=>Y.reduce((q,F)=>q+F.toString(16).padStart(2,"0"),""),u1=(...Y)=>Y.join("@"),qV=(Y,q)=>{const F=[...Y],O=()=>{const N=zV(q++)*1e4;return N-$9(N)};let Z=F.length;while(Z){const N=$9(O()*Z--);[F[Z],F[N]]=[F[N],F[Z]]}return F},k2=(Y,q,F,O)=>{return(Y.relayUrls||(O?qV(q,j9(Y.appId)):q)).slice(0,Y.relayUrls?Y.relayUrls.length:Y.relayRedundancy||F)},h6=JSON.stringify,y8=JSON.parse,j9=(Y,q=Number.MAX_SAFE_INTEGER)=>Y.split("").reduce((F,O)=>F+O.charCodeAt(0),0)%q;var y7={},B2=(Y,q)=>{const F={},O=()=>{const Z=new WebSocket(Y);Z.onclose=()=>{y7[Y]??=3333,setTimeout(O,y7[Y]),y7[Y]*=2},Z.onmessage=(N)=>q(N.data),F.socket=Z,F.url=Z.url,F.ready=new Promise((N)=>Z.onopen=()=>{N(F),y7[Y]=3333}),F.send=(N)=>{if(Z.readyState===1)Z.send(N)}};return O(),F},R2=(Y)=>()=>q9(m7(Y).map(([q,F])=>[q,F.socket]));var H9="AES-GCM",jV={},HV=(Y)=>btoa(String.fromCharCode.apply(null,new Uint8Array(Y))),CV=(Y)=>{const q=atob(Y);return new Uint8Array(q.length).map((F,O)=>q.charCodeAt(O)).buffer},f1=async(Y)=>jV[Y]||=Array.from(new Uint8Array(await crypto.subtle.digest("SHA-1",r6(Y)))).map((q)=>q.toString(36)).join(""),I2=async(Y,q,F)=>crypto.subtle.importKey("raw",await crypto.subtle.digest({name:"SHA-256"},r6(`${Y}:${q}:${F}`)),{name:H9},!1,["encrypt","decrypt"]),T2="$",M2=",",A2=async(Y,q)=>{const F=crypto.getRandomValues(new Uint8Array(16));return F.join(M2)+T2+HV(await crypto.subtle.encrypt({name:H9,iv:F},await Y,r6(q)))},v2=async(Y,q)=>{const[F,O]=q.split(T2);return J1(await crypto.subtle.decrypt({name:H9,iv:new Uint8Array(F.split(M2))},await Y,CV(O)))};var OV=5000,x2="icegatheringstatechange",S2="offer",DV="answer",C9=(Y,{rtcConfig:q,rtcPolyfill:F,turnConfig:O})=>{const Z=new(F||RTCPeerConnection)({iceServers:LV.concat(O||[]),...q}),N={};let J=!1,C=!1,B=null;const D=(H)=>{H.binaryType="arraybuffer",H.bufferedAmountLowThreshold=65535,H.onmessage=(P)=>N.data?.(P.data),H.onopen=()=>N.connect?.(),H.onclose=()=>N.close?.(),H.onerror=(P)=>N.error?.(P)},L=(H)=>Promise.race([new Promise((P)=>{const R=()=>{if(H.iceGatheringState==="complete")H.removeEventListener(x2,R),P()};H.addEventListener(x2,R),R()}),new Promise((P)=>setTimeout(P,OV))]).then(()=>({type:H.localDescription.type,sdp:H.localDescription.sdp.replace(/a=ice-options:trickle\s\n/g,"")}));if(Y)B=Z.createDataChannel("data"),D(B);else Z.ondatachannel=({channel:H})=>{B=H,D(H)};if(Z.onnegotiationneeded=async()=>{try{J=!0,await Z.setLocalDescription();const H=await L(Z);N.signal?.(H)}catch(H){N.error?.(H)}finally{J=!1}},Z.onconnectionstatechange=()=>{if(["disconnected","failed","closed"].includes(Z.connectionState))N.close?.()},Z.ontrack=(H)=>{N.track?.(H.track,H.streams[0]),N.stream?.(H.streams[0])},Z.onremovestream=(H)=>N.stream?.(H.stream),Y){if(!Z.canTrickleIceCandidates)Z.onnegotiationneeded()}return{created:Date.now(),connection:Z,get channel(){return B},get isDead(){return Z.connectionState==="closed"},async signal(H){if(B?.readyState==="open"&&!H.sdp?.includes("a=rtpmap"))return;try{if(H.type===S2){if(J||Z.signalingState!=="stable"&&!C){if(Y)return;await n6([Z.setLocalDescription({type:"rollback"}),Z.setRemoteDescription(H)])}else await Z.setRemoteDescription(H);await Z.setLocalDescription();const P=await L(Z);return N.signal?.(P),P}else if(H.type===DV){C=!0;try{await Z.setRemoteDescription(H)}finally{C=!1}}}catch(P){N.error?.(P)}},sendData:(H)=>B.send(H),destroy:()=>{B?.close(),Z.close(),J=!1,C=!1},setHandlers:(H)=>Object.assign(N,H),offerPromise:Y?new Promise((H)=>N.signal=(P)=>{if(P.type===S2)H(P)}):Promise.resolve(),addStream:(H)=>H.getTracks().forEach((P)=>Z.addTrack(P,H)),removeStream:(H)=>Z.getSenders().filter((P)=>H.getTracks().includes(P.track)).forEach((P)=>Z.removeTrack(P)),addTrack:(H,P)=>Z.addTrack(H,P),removeTrack:(H)=>{const P=Z.getSenders().find((R)=>R.track===H);if(P)Z.removeTrack(P)},replaceTrack:(H,P)=>{const R=Z.getSenders().find((k)=>k.track===H);if(R)return R.replaceTrack(P)}}},LV=[...O8(3,(Y,q)=>`stun:stun${q||""}.l.google.com:19302`),"stun:stun.cloudflare.com:3478"].map((Y)=>({urls:Y}));var NV=Object.getPrototypeOf(Uint8Array),h7=12,w2=0,c7=w2+h7,l7=c7+1,o1=l7+1,a1=o1+1,_8=16384-a1,b7=255,E2="bufferedamountlow",U1=(Y)=>"@_"+Y,g2=(Y,q,F)=>{const O={},Z={},N={},J={},C={},B={},D={},L={onPeerJoin:V8,onPeerLeave:V8,onPeerStream:V8,onPeerTrack:V8},H=(Q,G)=>(Q?Array.isArray(Q)?Q:[Q]:P2(O)).flatMap((V)=>{const X=O[V];if(!X)return console.warn(`${g8}: no peer with id ${V} found`),[];return G(V,X)}),P=(Q)=>{if(!O[Q])return;delete O[Q],delete J[Q],delete C[Q],L.onPeerLeave(Q),q(Q)},R=(Q)=>{if(Z[Q])return N[Q];if(!Q)throw c6("action type argument is required");const G=r6(Q);if(G.byteLength>h7)throw c6(`action type string "${Q}" (${G.byteLength}b) exceeds `+`byte limit (${h7}). Hint: choose a shorter name.`);const V=new Uint8Array(h7);V.set(G);let X=0;return Z[Q]={onComplete:V8,onProgress:V8,setOnComplete:(U)=>Z[Q]={...Z[Q],onComplete:U},setOnProgress:(U)=>Z[Q]={...Z[Q],onProgress:U},send:async(U,$,j,K)=>{if(j&&typeof j!=="object")throw c6("action meta argument must be an object");const W=typeof U;if(W==="undefined")throw c6("action data cannot be undefined");const z=W!=="string",A=U instanceof Blob,T=A||U instanceof ArrayBuffer||U instanceof NV;if(j&&!T)throw c6("action meta argument can only be used with binary data");const y=T?new Uint8Array(A?await U.arrayBuffer():U):r6(z?h6(U):U),r=j?r6(h6(j)):null,a=Math.ceil(y.byteLength/_8)+(j?1:0)||1,t=O8(a,(l,h)=>{const n=h===a-1,q0=j&&h===0,G0=new Uint8Array(a1+(q0?r.byteLength:n?y.byteLength-_8*(a-(j?2:1)):_8));return G0.set(V),G0.set([X],c7),G0.set([n|q0<<1|T<<2|z<<3],l7),G0.set([Math.round((h+1)/a*b7)],o1),G0.set(j?q0?r:y.subarray((h-1)*_8,h*_8):y.subarray(h*_8,(h+1)*_8),a1),G0});return X=X+1&b7,n6(H($,async(l,h)=>{const{channel:n}=h;let q0=0;while(q0<a){const G0=t[q0];if(n.bufferedAmount>n.bufferedAmountLowThreshold)await new Promise((F0)=>{const b=()=>{n.removeEventListener(E2,b),F0()};n.addEventListener(E2,b)});if(!O[l])break;h.sendData(G0),q0++,K?.(G0[o1]/b7,l,j)}}))}},N[Q]||=[Z[Q].send,Z[Q].setOnComplete,Z[Q].setOnProgress]},k=(Q,G)=>{const V=new Uint8Array(G),X=J1(V.subarray(w2,c7)).replaceAll("\0",""),[U]=V.subarray(c7,l7),[$]=V.subarray(l7,o1),[j]=V.subarray(o1,a1),K=V.subarray(a1),W=!!($&1),z=!!($&1<<1),A=!!($&1<<2),T=!!($&1<<3);if(!Z[X]){console.warn(`${g8}: received message with unregistered type (${X})`);return}J[Q]||={},J[Q][X]||={};const y=J[Q][X][U]||={chunks:[]};if(z)y.meta=y8(J1(K));else y.chunks.push(K);if(Z[X].onProgress(j/b7,Q,y.meta),!W)return;const r=new Uint8Array(y.chunks.reduce((a,t)=>a+t.byteLength,0));if(y.chunks.reduce((a,t)=>{return r.set(t,a),a+t.byteLength},0),delete J[Q][X][U],A)Z[X].onComplete(r,Q,y.meta);else{const a=J1(r);Z[X].onComplete(T?y8(a):a,Q)}},v=async()=>{await u(""),await new Promise((Q)=>setTimeout(Q,99)),m7(O).forEach(([Q,G])=>{G.destroy(),delete O[Q]}),F()},[M,w]=R(U1("ping")),[x,g]=R(U1("pong")),[_,p]=R(U1("signal")),[m,f]=R(U1("stream")),[s,Q0]=R(U1("track")),[u,K0]=R(U1("leave"));if(Y((Q,G)=>{if(O[G])return;O[G]=Q,Q.setHandlers({data:(V)=>k(G,V),stream:(V)=>{L.onPeerStream(V,G,B[G]),delete B[G]},track:(V,X)=>{L.onPeerTrack(V,X,G,D[G]),delete D[G]},signal:(V)=>_(V,G),close:()=>P(G),error:(V)=>{console.error(V),P(G)}}),L.onPeerJoin(G)}),w((Q,G)=>x("",G)),g((Q,G)=>{C[G]?.(),delete C[G]}),p((Q,G)=>O[G]?.signal(Q)),f((Q,G)=>B[G]=Q),Q0((Q,G)=>D[G]=Q),K0((Q,G)=>P(G)),N2)addEventListener("beforeunload",v);return{makeAction:R,leave:v,ping:async(Q)=>{if(!Q)throw c6("ping() must be called with target peer ID");const G=Date.now();return M("",Q),await new Promise((V)=>C[Q]=V),Date.now()-G},getPeers:()=>q9(m7(O).map(([Q,G])=>[Q,G.connection])),addStream:(Q,G,V)=>H(G,async(X,U)=>{if(V)await m(V,X);U.addStream(Q)}),removeStream:(Q,G)=>H(G,(V,X)=>X.removeStream(Q)),addTrack:(Q,G,V,X)=>H(V,async(U,$)=>{if(X)await s(X,U);$.addTrack(Q,G)}),removeTrack:(Q,G)=>H(G,(V,X)=>X.removeTrack(Q)),replaceTrack:(Q,G,V,X)=>H(V,async(U,$)=>{if(X)await s(X,U);$.replaceTrack(Q,G)}),onPeerJoin:(Q)=>L.onPeerJoin=Q,onPeerLeave:(Q)=>L.onPeerLeave=Q,onPeerStream:(Q)=>L.onPeerStream=Q,onPeerTrack:(Q)=>L.onPeerTrack=Q}};var PV=20,kV=5333,y2=57333,_2=({init:Y,subscribe:q,announce:F})=>{const O={};let Z=!1,N,J,C;return(B,D,L)=>{const{appId:H}=B;if(O[H]?.[D])return O[H][D];const P={},R={},k=u1(g8,H,D),v=f1(k),M=f1(u1(k,a6)),w=I2(B.password||"",H,D),x=(U)=>async($)=>({type:$.type,sdp:await U(w,$.sdp)}),g=x(v2),_=x(A2),p=()=>C9(!0,B),m=(U,$,j)=>{if(R[$]){if(R[$]!==U)U.destroy();return}R[$]=U,X(U,$),P[$]?.forEach((K,W)=>{if(W!==j)K.destroy()}),delete P[$]},f=(U,$)=>{if(R[$]===U)delete R[$]},s=(U,$)=>{if(R[U])return;const j=P[U]?.[$];if(j)delete P[U][$],j.destroy()},Q0=(U)=>{return J.push(...O8(U,p)),n6(J.splice(0,U).map(($)=>$.offerPromise.then(_).then((j)=>({peer:$,offer:j}))))},u=(U,$)=>L?.({error:`incorrect password (${B.password}) when decrypting ${$}`,appId:H,peerId:U,roomId:D}),K0=(U)=>async($,j,K)=>{const[W,z]=await n6([v,M]);if($!==W&&$!==z)return;const{peerId:A,offer:T,answer:y,peer:r}=typeof j==="string"?y8(j):j;if(A===a6||R[A])return;if(A&&!T&&!y){if(P[A]?.[U])return;const[[{peer:a,offer:t}],l]=await n6([Q0(1),f1(u1(k,A))]);P[A]||=[],P[A][U]=a,setTimeout(()=>s(A,U),Q[U]*0.9),a.setHandlers({connect:()=>m(a,A,U),close:()=>f(a,A)}),K(l,h6({peerId:a6,offer:t}))}else if(T){if(P[A]?.[U]&&a6>A)return;const t=C9(!1,B);t.setHandlers({connect:()=>m(t,A,U),close:()=>f(t,A)});let l;try{l=await g(T)}catch{u(A,"offer");return}if(t.isDead)return;const[h,n]=await n6([f1(u1(k,A)),t.signal(l)]);K(h,h6({peerId:a6,answer:await _(n)}))}else if(y){let a;try{a=await g(y)}catch(t){u(A,"answer");return}if(r)r.setHandlers({connect:()=>m(r,A,U),close:()=>f(r,A)}),r.signal(a);else{const t=P[A]?.[U];if(t&&!t.isDead)t.signal(a)}}};if(!B)throw c6("requires a config map as the first argument");if(!H&&!B.firebaseApp)throw c6("config map is missing appId field");if(!D)throw c6("roomId argument required");if(!Z){const U=Y(B);J=O8(PV,p),N=Array.isArray(U)?U:[U],Z=!0,C=setInterval(()=>J=J.filter(($)=>{const j=Date.now()-$.created<y2;if(!j)$.destroy();return j}),y2*1.03)}const Q=N.map(()=>kV),G=[],V=N.map(async(U,$)=>q(await U,await v,await M,K0($),Q0));n6([v,M]).then(([U,$])=>{const j=async(K,W)=>{const z=await F(K,U,$);if(typeof z==="number")Q[W]=z;G[W]=setTimeout(()=>j(K,W),Q[W])};V.forEach(async(K,W)=>{await K,j(await N[W],W)})});let X=V8;return O[H]||={},O[H][D]=g2((U)=>X=U,(U)=>delete R[U],()=>{delete O[H][D],G.forEach(clearTimeout),V.forEach(async(U)=>(await U)()),clearInterval(C)})}};var h2={},BV=5,c2="x",l2="EVENT",d2=p6.randomPrivateKey(),RV=p7(Z9.getPublicKey(d2)),O9={},n1={},IV={},u2=()=>Math.floor(Date.now()/1000),f2=(Y)=>IV[Y]??=j9(Y,1e4)+20000,m2=async(Y,q)=>{const F={kind:f2(Y),content:q,pubkey:RV,created_at:u2(),tags:[[c2,Y]]},O=p7(new Uint8Array(await crypto.subtle.digest("SHA-256",r6(h6([0,F.pubkey,F.created_at,F.kind,F.tags,F.content])))));return h6([l2,{...F,id:O,sig:p7(await Z9.sign(O,d2))}])},p2=(Y,q)=>{return O9[Y]=q,h6(["REQ",Y,{kinds:[f2(q)],since:u2(),["#"+c2]:[q]}])},b2=(Y)=>{return delete O9[Y],h6(["CLOSE",Y])},d7=_2({init:(Y)=>k2(Y,MV,BV,!0).map((q)=>{const F=B2(q,(O)=>{const[Z,N,J,C]=y8(O);if(Z!==l2){const B=`${g8}: relay failure from ${F.url} - `;if(Z==="NOTICE")console.warn(B+N);else if(Z==="OK"&&!J)console.warn(B+C);return}n1[N]?.(O9[N],J.content)});return h2[q]=F,F.ready}),subscribe:(Y,q,F,O)=>{const Z=_7(64),N=_7(64);return n1[Z]=n1[N]=(J,C)=>O(J,C,async(B,D)=>Y.send(await m2(B,D))),Y.send(p2(Z,q)),Y.send(p2(N,F)),()=>{Y.send(b2(Z)),Y.send(b2(N)),delete n1[Z],delete n1[N]}},announce:async(Y,q)=>Y.send(await m2(q,h6({peerId:a6})))}),TV=R2(h2),MV=["black.nostrcity.club","eu.purplerelay.com","ftp.halifax.rwth-aachen.de/nostr","nostr.cool110.xyz","nostr.data.haus","nostr.mom","nostr.oxtr.dev","nostr.sathoarder.com","nostr.vulpem.com","nostrelay.memory-art.xyz","playground.nostrcheck.me/relay","relay.agorist.space","relay.binaryrobot.com","relay.fountain.fm","relay.mostro.network","relay.nostraddress.com","relay.nostrdice.com","relay.nostromo.social","relay.oldenburg.cool","relay.snort.social","relay.verified-nostr.com","sendit.nosflare.com","yabu.me/v2"].map((Y)=>"wss://"+Y);var o2=(Y,q,F)=>{let O=q.timestamp;if(q.timestamp&&typeof q.timestamp.physical==="number"){const J=Date.now()+7200000;if(q.timestamp.physical>J)O={physical:J,logical:q.timestamp.logical}}if(!Y||!Y.timestamp)return{resolved:!0,value:q.value,timestamp:O};const Z=Y.timestamp;if(F.compare(Z,O)<0)return{resolved:!0,value:q.value,timestamp:O};return{resolved:!1}};var AV=()=>{const Y=new Map,q=async()=>{try{const B=await navigator.storage.getDirectory(),L=await(await B.getFileHandle("~opfs-sync-test",{create:!0})).createSyncAccessHandle?.();return await L?.close(),await B.removeEntry("~opfs-sync-test"),!!L}catch{return!1}};let F="idb";const O=(async()=>{if(await q())F="sync";else try{const B=await navigator.storage.getDirectory(),L=await(await B.getFileHandle("~opfs-async-test",{create:!0})).createWritable?.();if(await L?.close(),await B.removeEntry("~opfs-async-test"),L)F="async";else F="idb"}catch{F="idb"}})(),Z=async(B,D)=>{if(!Y.has(B))Y.set(B,[]);const L=Y.get(B),H=L[L.length-1]||Promise.resolve();let P;const R=new Promise((k)=>P=k);L.push(R);try{return await H,await D()}finally{if(L.shift(),P(),L.length===0)Y.delete(B)}},N=(()=>{let B;const D=async()=>{if(!B)B=new Promise((L,H)=>{const P=indexedDB.open("opfs-fallback-db",1);P.onupgradeneeded=()=>P.result.createObjectStore("files"),P.onsuccess=()=>L(P.result),P.onerror=()=>H(P.error)});return B};return{getDB:D,get:async(L)=>{const H=await D();return new Promise((P,R)=>{const v=H.transaction("files","readonly").objectStore("files").get(L);v.onsuccess=()=>P(v.result||new Uint8Array),v.onerror=()=>R(v.error)})},set:async(L,H)=>{const P=await D();return new Promise((R,k)=>{const M=P.transaction("files","readwrite").objectStore("files").put(H,L);M.onsuccess=()=>R(),M.onerror=()=>k(M.error)})}}})(),J=async(B)=>{await O;try{if(F==="idb"){const R=await N.get(B);return{type:"loaded",name:B,data:R}}const L=await(await navigator.storage.getDirectory()).getFileHandle(B);if(F==="sync"){let R;try{R=await L.createSyncAccessHandle();const k=R.getSize(),v=new Uint8Array(k),M=R.read(v,{at:0});return{type:"loaded",name:B,data:v.slice(0,M)}}finally{R?.close()}}const H=await L.getFile(),P=new Uint8Array(await H.arrayBuffer());return{type:"loaded",name:B,data:P}}catch(D){const L=D.name==="NotFoundError"?"File not found":D.message||"Error reading file";return{type:"error",name:B,message:L}}},C=async(B,D)=>{if(await O,!(D instanceof Uint8Array))return{type:"error",name:B,message:"Content must be a Uint8Array"};return Z(B,async()=>{try{if(F==="idb")return await N.set(B,D),{type:"saved",name:B};const H=await(await navigator.storage.getDirectory()).getFileHandle(B,{create:!0});if(F==="sync"){let P;try{P=await H.createSyncAccessHandle(),P.truncate(0),P.write(D,{at:0}),P.flush()}finally{P?.close()}}else{let P;try{P=await H.createWritable(),await P.write(D)}finally{await P?.close()}}return{type:"saved",name:B}}catch(L){return{type:"error",name:B,message:L.message||"Error saving file"}}})};self.onmessage=async({data:B})=>{const{type:D,name:L,content:H}=B;await O;const P={load:()=>J(L),save:()=>C(L,H)};try{const R=P[D],k=R?await R():{type:"error",message:`Unrecognized action type: ${D}`};self.postMessage(k)}catch(R){console.error("Worker unexpected error:",R),self.postMessage({type:"error",name:L,message:R.message||"Unexpected worker error"})}}},a2=AV;var m8={$eq:(Y,q)=>Y===q,$ne:(Y,q)=>Y!==q,$gt:(Y,q)=>Y>q,$gte:(Y,q)=>Y>=q,$lt:(Y,q)=>Y<q,$lte:(Y,q)=>Y<=q,$in:(Y,q)=>Array.isArray(q)&&q.includes(Y),$between:(Y,[q,F])=>Y>=q&&Y<=F,$exists:(Y,q)=>q?Y!==void 0:Y===void 0,$text:{global:(Y,q)=>{const F=(Z)=>String(Z).normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^\w\s]/g,""),O=F(q);return Object.values(Y).some((Z)=>{if(typeof Z==="object")return null.fieldSearch(Z,O);return F(Z).includes(O)})},field:(Y,q)=>{const F=(O)=>String(O).normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^\w\s]/g,"");return Array.isArray(Y)?Y.some((O)=>F(O).includes(F(q))):F(Y).includes(F(q))}},$like:(Y,q)=>{if(typeof Y!=="string"||typeof q!=="string")return!1;return new RegExp(`^${q.replace(/%/g,".*").replace(/_/g,".")}\$`,"i").test(Y)},$regex:(Y,q)=>typeof Y==="string"&&new RegExp(q.$regex||q,"i").test(Y),$and:(Y,q,F)=>q.every((O)=>{return F.createFilter(O)(Y)}),$or:(Y,q,F)=>q.some((O)=>{return F.createFilter(O)(Y)}),$not:(Y,q,F)=>{return!F.createFilter(q)(Y)}},D9=(Y,q)=>{const F=q.split(".");let O=Y;for(let Z of F)if(O&&typeof O==="object"&&(Z in O))O=O[Z];else return;return O},L9=(Y)=>{const q=(F)=>{return Object.entries(Y).every(([O,Z])=>{if(O.startsWith("$"))return m8[O](F,Z,{filterNode:q,createFilter:L9});const N=D9(F.value,O);if(typeof Z!=="object"||Z===null)return m8.$eq(N,Z);return Object.entries(Z).every(([J,C])=>{if(J==="$text")return m8.$text.field(N,C);if(J==="$between"&&C.every((B)=>B instanceof Date)){const B=new Date(N);return m8.$between(B,C)}return m8[J]?.(N,C,{filterNode:q,createFilter:L9})??!1})})};return q},N9=(Y,q)=>{const F=L9(q.query);let O=Object.values(Y).filter(F);if(q.field)O.sort((Z,N)=>{const J=D9(Z.value,q.field),C=D9(N.value,q.field),B=q.order==="asc"?1:-1;if(typeof J==="string"&&typeof C==="string")return J.localeCompare(C)*B;return((J??0)-(C??0))*B});if(q.$after){const Z=O.findIndex((N)=>N.id===q.$after);O=Z>=0?O.slice(Z+1):[]}if(q.$before){const Z=O.findIndex((N)=>N.id===q.$before);O=Z>=0?O.slice(0,Z):[]}return q.$limit?O.slice(0,q.$limit):O};class P9{constructor(){this.physical=Date.now(),this.logical=0}now(){const Y=Date.now();return this.physical=Math.max(this.physical,Y),this.logical++,{physical:this.physical,logical:this.logical}}update(Y){if(!Y||typeof Y.physical!=="number"||typeof Y.logical!=="number")return;this.physical=Math.max(this.physical,Y.physical),this.logical=Math.max(this.logical,Y.logical)+1}compare(Y,q){if(!Y&&!q)return 0;if(!Y)return-1;if(!q)return 1;if(Y.physical>q.physical)return 1;if(Y.physical<q.physical)return-1;if(Y.logical>q.logical)return 1;if(Y.logical<q.logical)return-1;return 0}}var n2=function(Y,q){return Y.length===q.length&&Y.every((F,O)=>F===q[O])};async function vV(){console.log("\u26A1 GDB-P2P: Empowering distributed graph databases with real-time synchronization and scalability. Learn more: https://github.com/estebanrfp/gdb \u26A1"),console.log(navigator?.storage?.getDirectory?"OPFS is enabled.":"OPFS is not available."),navigator?.storage?.getDirectory&&await navigator.storage.getDirectory()}if(Symbol.dispose===void 0)Object.defineProperty(Symbol,"dispose",{value:Symbol.for("Symbol.dispose")});class r2{constructor(){this.nodes={}}insert(Y,q,F){this.nodes[Y]={id:Y,value:q,edges:[],timestamp:F}}get(Y){return this.nodes[Y]||null}link(Y,q){const F=this.nodes[Y],O=this.nodes[q];if(F&&O&&!F.edges.includes(q))F.edges.push(q)}getAllNodes(){return Object.values(this.nodes)}serialize(){return v1.deflate(L8(this.nodes))}deserialize(Y){this.nodes=s7(v1.inflate(new Uint8Array(Y)))}}class r1{static _listenersInitialized=!1;constructor(Y,{password:q,securityManager:F=null}={}){this.hybridClock=new P9,this.name=Y,this.password=q,this.globalTimestamp=null,this.graph=new r2,this.securityManager=F,this.eventListeners=[],this.operators=m8,this.initWorker(),this.ready=this.loadGraphFromOPFS(),this.loadGlobalTimestamp();const O=`graph-sync-room-${this.name}`,Z={appId:"1234",...this.password&&{password:this.password}},N=d7(Z,O),[J,C]=N.makeAction("syncGraph");this.sendData=J;const B=d7(Z,`app-sync-${this.name}`);if(this.room=B,!r1._listenersInitialized)r1._listenersInitialized=!0,window.addEventListener("online",async()=>{console.log("\u2705 Reconnected to the network."),this.sendData([{type:"sync",timestamp:this.globalTimestamp}])}),window.addEventListener("offline",async()=>{console.log("\u274C Disconnected from the network.")}),document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible")console.log("The tab is visible again."),this.sendData([{type:"sync",timestamp:this.globalTimestamp}]);else if(document.visibilityState==="hidden")console.log("The tab is no longer visible.")});vV(),N.onPeerJoin(async(D)=>{console.log("\u26A1 New pair connected:",D),this.sendData([{type:"sync",timestamp:this.globalTimestamp}])}),N.onPeerLeave((D)=>{console.log("\u26A1 Pair disconnected:",D)}),C(async(D)=>{if(this.securityManager&&typeof this.securityManager.verifyIncomingOperations==="function"){const{validatedOperations:L}=await this.securityManager.verifyIncomingOperations(D);if(L&&L.length>0)await this.receiveChanges(L)}else console.log("GDB: No SecurityManager configured or verifyIncomingOperations missing. Processing P2P data directly."),await this.receiveChanges(D),this.emit()}),this.channel=new BroadcastChannel(`graphdb_sync_${this.name}`),this.channel.onmessage=async(D)=>{if(D.data==="update")console.log("\uD83D\uDD04 Update received from another tab..."),await this.loadGraphFromOPFS(),this.loadGlobalTimestamp(),this.emit()}}loadGlobalTimestamp(){const Y=localStorage.getItem(`${this.name}_time`);this.globalTimestamp=Y?JSON.parse(Y):null}saveGlobalTimestamp(Y){this.globalTimestamp=Y,localStorage.setItem(`${this.name}_time`,JSON.stringify(Y))}initWorker(){try{const Y=URL.createObjectURL(new Blob([`(${a2.toString()})()`],{type:"application/javascript"}));this.worker=new Worker(Y),this.worker.addEventListener("message",({data:q})=>{console.log("Worker message:",`${q.name} ${q.type}`),URL.revokeObjectURL(Y)}),console.log("Worker initialized successfully.")}catch({message:Y}){console.error("Failed to initialize worker:",Y)}}getWorker(){return this.worker}emit(){this.eventListeners.forEach((Y)=>Y(this.graph.nodes))}compress(Y){return v1.deflate(Y)}decompress(Y){return v1.inflate(Y)}async getAllNodes(){return await this.ready,this.graph.getAllNodes()}async generateHash(){return crypto.randomUUID()}async hashValue(Y){const q=(new TextEncoder()).encode(Y),F=await crypto.subtle.digest("SHA-256",q);return Array.from(new Uint8Array(F)).map((O)=>O.toString(16).padStart(2,"0")).join("")}async loadGraphFromOPFS(){try{const q=await((F)=>new Promise((O,Z)=>{const N=async({data:J})=>{if(J.type==="loaded"&&J.name===F)this.worker.removeEventListener("message",N),O(new Uint8Array(J.data));else if(J.type==="error")this.worker.removeEventListener("message",N),Z(new Error(J.message||"Unknown error"))};this.worker.addEventListener("message",N),this.worker.postMessage({type:"load",name:F})}))(`${this.name}_graph.msgpack`).catch(()=>new Uint8Array);q.byteLength>0?this.graph.deserialize(q):console.warn("The file '_graph.msgpack' is empty or could not be loaded."),console.log(`Graph loaded from OPFS: [ ${this.graph.getAllNodes().length} nodes ]`)}catch({message:Y}){console.error("General error loading the graph from OPFS:",Y)}}async saveGraphToOPFS(){try{const Y=this.graph.serialize();return await((F,O)=>new Promise((Z,N)=>{const J=({data:C})=>{if(C.type==="saved"&&C.name===F)this.worker.removeEventListener("message",J),Z();else if(C.type==="error")this.worker.removeEventListener("message",J),N(new Error(C.message||"Save error"))};this.worker.addEventListener("message",J),this.worker.postMessage({type:"save",name:F,content:O})}))(`${this.name}_graph.msgpack`,Y),this.channel.postMessage("update"),!0}catch({message:Y}){throw console.error("Save error:",Y),new Error("Save failed")}}async put(Y,q){await this.ready;const F=this.hybridClock.now();return this.saveGlobalTimestamp(F),q??=await this.generateHash(),this.graph.insert(q,Y,F),await this.saveGraphToOPFS(),await this.sendData([{type:"insert",id:q,value:Y,timestamp:F}]),this.emit(),q}async get(Y,q=null){if(await this.ready,typeof Y!=="string")return{result:null};const F=this.graph.get(Y);if(!F){if(q)q(null);return{result:null}}const O=(J)=>{if(!J)return null;const C=J.value!==null&&typeof J.value==="object"?{...J.value}:J.value;return{...J,value:C}};if(!q)return{result:O(F)};let Z=F.timestamp;q(O(F));const N=(J)=>{const C=J[Y];if(C){if(this.hybridClock.compare(C.timestamp,Z)>0)Z=C.timestamp,q(O(C))}else q(null),this.eventListeners.splice(this.eventListeners.indexOf(N),1)};return this.eventListeners.push(N),{result:O(F),unsubscribe:()=>{const J=this.eventListeners.indexOf(N);if(J>-1)this.eventListeners.splice(J,1)}}}async map(...Y){await this.ready;let F={...{realtime:!1,query:{},field:null,order:"asc",$limit:null,$after:null,$before:null}},O=null,Z=!1;Y.forEach((B)=>typeof B==="function"?O=B:B&&typeof B==="object"&&(Z||=("realtime"in B),Object.assign(F,B))),O&&!Z&&(F.realtime=!0);let N=N9(this.graph.nodes,F),J=null;const C=(B)=>{const D=B.filter((R)=>!N.some((k)=>k.id===R.id)),L=N.filter((R)=>!B.some((k)=>k.id===R.id)),H=B.filter((R)=>{const k=N.find((v)=>v.id===R.id);return k&&!n2(L8(R.value),L8(k.value))}),P=(R,k)=>{const v=k==="removed"?null:R.value,M={id:R.id,value:v,edges:R.edges||[],timestamp:R.timestamp||null,action:k};O(M)};D.forEach((R)=>P(R,"added")),L.forEach((R)=>P(R,"removed")),H.forEach((R)=>P(R,"updated"))};if(O){if(N.forEach((B)=>{if(B.value)O({id:B.id,value:B.value,edges:B.edges,timestamp:B.timestamp,action:"initial"})}),F.realtime)J=(B)=>{const D=N9(B,F);if(!n2(L8(D),L8(N)))C(D),N=D},this.eventListeners.push(J)}return{results:N,...F.realtime&&O&&J&&{unsubscribe:()=>{const B=this.eventListeners.indexOf(J);B>-1&&this.eventListeners.splice(B,1)}}}}async remove(Y){await this.ready;const q=this.hybridClock.now(),F=this.graph.get(Y);if(!F)return console.error(`Node with ID '${Y}' not found.`);delete this.graph.nodes[Y],Object.values(this.graph.nodes).forEach((O)=>O.edges=O.edges.filter((Z)=>Z!==Y)),await this.saveGraphToOPFS(),this.saveGlobalTimestamp(q),await this.sendData([{type:"remove",id:Y,value:F.value,timestamp:q}]),this.emit()}async clear(){await this.ready,this.graph.nodes={};try{await(await navigator.storage.getDirectory()).removeEntry(`${this.name}_graph.msgpack`)}catch({message:Y}){console.warn(`Error deleting _graph.msgpack: ${Y}`)}this.emit(),console.log("All data has been deleted.")}async link(Y,q){await this.ready;const F=this.hybridClock.now();if(!this.graph.nodes[Y]||!this.graph.nodes[q]){console.error(`One or both nodes (${Y}, ${q}) do not exist.`);return}this.graph.link(Y,q),await this.saveGraphToOPFS(),this.saveGlobalTimestamp(F),await this.sendData([{type:"link",sourceId:Y,targetId:q,timestamp:F}]),this.emit()}async applyFullGraph(Y){try{console.log("Applying full graph from remote..."),this.graph.nodes={...Y.nodes},await this.saveGraphToOPFS()}catch({message:q}){console.error(`Error applying the full graph: ${q}`)}}async receiveChanges(Y){const q={insert:(F)=>{this.graph.insert(F.id,F.value,F.timestamp),this.hybridClock.update(F.timestamp)},update:(F)=>{const O=this.graph.get(F.id),Z=o2(O,F,this.hybridClock);if(Z.resolved)Object.assign(O,{value:Z.value,timestamp:Z.timestamp}),this.hybridClock.update(Z.timestamp)},remove:(F)=>{if(this.graph.nodes[F.id])this.hybridClock.update(F.timestamp),delete this.graph.nodes[F.id]},link:(F)=>{if(this.graph.nodes[F.sourceId]&&this.graph.nodes[F.targetId])this.graph.link(F.sourceId,F.targetId),this.hybridClock.update(F.timestamp)},sync:async(F)=>{if(console.log(F),this.hybridClock.update(F.timestamp),this.hybridClock.compare(this.globalTimestamp,F.timestamp)>0)console.log("Sending recent data to the remote node."),await this.sendData([{type:"syncReceive",graph:this.graph}])},syncReceive:async(F)=>await this.applyFullGraph(F.graph)};for(let F of Y)await q[F.type]?.(F);await this.saveGraphToOPFS(),this.emit()}}export{r1 as GDB};
11
+ *//*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> *//*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */var K2=function(Y){const{a:q,b:F}=H6,O=y0(Y*Y),Z=y0(O*Y);return y0(Z+q*Y+F)},z2=function(Y){if(!(Y instanceof o0))throw new TypeError("JacobianPoint expected")},v7=function(Y,q){const F=q.negate();return Y?F:q},Z2=function(Y){return Number.parseInt(Y[0],16)>=8?"00"+Y:Y},$2=function(Y){if(Y.length<2||Y[0]!==2)throw new Error(`Invalid signature integer tag: ${Y1(Y)}`);const q=Y[1],F=Y.subarray(2,q+2);if(!q||F.length!==q)throw new Error("Invalid signature integer: wrong length");if(F[0]===0&&F[1]<=127)throw new Error("Invalid signature integer: trailing length");return{data:b6(F),left:Y.subarray(q+2)}},sY=function(Y){if(Y.length<2||Y[0]!=48)throw new Error(`Invalid signature tag: ${Y1(Y)}`);if(Y[1]!==Y.length-2)throw new Error("Invalid signature: incorrect length");const{data:q,left:F}=$2(Y.subarray(2)),{data:O,left:Z}=$2(F);if(Z.length)throw new Error(`Invalid signature: left bytes after parsing: ${Y1(Z)}`);return{r:q,s:O}},h1=function(Y){return Y instanceof Uint8Array||ArrayBuffer.isView(Y)&&Y.constructor.name==="Uint8Array"},H2=function(Y){if(!h1(Y))throw new Error("Uint8Array expected")},_1=function(...Y){if(Y.every(H2),Y.length===1)return Y[0];const q=Y.reduce((O,Z)=>O+Z.length,0),F=new Uint8Array(q);for(let O=0,Z=0;O<Y.length;O++){const N=Y[O];F.set(N,Z),Z+=N.length}return F};function Y1(Y){H2(Y);let q="";for(let F=0;F<Y.length;F++)q+=tY[Y[F]];return q}var q2=function(Y){if(Y>=Y8._0&&Y<=Y8._9)return Y-Y8._0;if(Y>=Y8.A&&Y<=Y8.F)return Y-(Y8.A-10);if(Y>=Y8.a&&Y<=Y8.f)return Y-(Y8.a-10);return};function H8(Y){if(typeof Y!=="string")throw new Error("hex string expected, got "+typeof Y);const q=Y.length,F=q/2;if(q%2)throw new Error("hex string expected, got unpadded hex of length "+q);const O=new Uint8Array(F);for(let Z=0,N=0;Z<F;Z++,N+=2){const J=q2(Y.charCodeAt(N)),C=q2(Y.charCodeAt(N+1));if(J===void 0||C===void 0){const B=Y[N]+Y[N+1];throw new Error('hex string expected, got non-hex character "'+B+'" at index '+N)}O[Z]=J*16+C}return O}var C8=function(Y){if(typeof Y!=="bigint")throw new Error("Expected bigint");if(!(u0<=Y&&Y<eY))throw new Error("Expected number 0 <= n < 2^256");return Y.toString(16).padStart(64,"0")},c1=function(Y){const q=H8(C8(Y));if(q.length!==32)throw new Error("Error: expected 32 bytes");return q},m1=function(Y){const q=Y.toString(16);return q.length&1?`0${q}`:q},E7=function(Y){if(typeof Y!=="string")throw new TypeError("hexToNumber: expected string, got "+typeof Y);return BigInt(`0x${Y}`)},b6=function(Y){return E7(Y1(Y))},w8=function(Y){return h1(Y)?Uint8Array.from(Y):H8(Y)},j2=function(Y){if(typeof Y==="number"&&Number.isSafeInteger(Y)&&Y>0)return BigInt(Y);if(typeof Y==="bigint"&&l1(Y))return Y;throw new TypeError("Expected valid private scalar: 0 < scalar < curve.n")},y0=function(Y,q=H6.P){const F=Y%q;return F>=u0?F:q+F},m6=function(Y,q){const{P:F}=H6;let O=Y;while(q-- >u0)O*=O,O%=F;return O},QV=function(Y){const{P:q}=H6,F=BigInt(6),O=BigInt(11),Z=BigInt(22),N=BigInt(23),J=BigInt(44),C=BigInt(88),B=Y*Y*Y%q,D=B*B*Y%q,L=m6(D,p1)*D%q,H=m6(L,p1)*D%q,P=m6(H,j8)*B%q,R=m6(P,O)*P%q,k=m6(R,Z)*R%q,v=m6(k,J)*k%q,M=m6(v,C)*v%q,w=m6(M,J)*k%q,x=m6(w,p1)*D%q,g=m6(x,N)*R%q,_=m6(g,F)*B%q,p=m6(_,j8);if(p*p%q!==Y)throw new Error("Cannot find square root");return p},g7=function(Y,q=H6.P){if(Y===u0||q<=u0)throw new Error(`invert: expected positive integers, got n=${Y} mod=${q}`);let F=y0(Y,q),O=q,Z=u0,N=j6,J=j6,C=u0;while(F!==u0){const D=O/F,L=O%F,H=Z-J*D,P=N-C*D;O=F,F=L,Z=J,N=C,J=H,C=P}if(O!==j6)throw new Error("invert: does not exist");return y0(Z,q)},WV=function(Y,q=H6.P){const F=new Array(Y.length),O=Y.reduce((N,J,C)=>{if(J===u0)return N;return F[C]=N,y0(N*J,q)},j6),Z=g7(O,q);return Y.reduceRight((N,J,C)=>{if(J===u0)return N;return F[C]=y0(N*F[C],q),y0(N*J,q)},Z),F},GV=function(Y){const q=Y.length*8-b1*8,F=b6(Y);return q>0?F>>BigInt(q):F},XV=function(Y,q=!1){const F=GV(Y);if(q)return F;const{n:O}=H6;return F>=O?F-O:F},l1=function(Y){return u0<Y&&Y<H6.n},S7=function(Y){return u0<Y&&Y<H6.P};var d1=function(Y){let q;if(typeof Y==="bigint")q=Y;else if(typeof Y==="number"&&Number.isSafeInteger(Y)&&Y>0)q=BigInt(Y);else if(typeof Y==="string"){if(Y.length!==2*b1)throw new Error("Expected 32 bytes of private key");q=E7(Y)}else if(h1(Y)){if(Y.length!==b1)throw new Error("Expected 32 bytes of private key");q=b6(Y)}else throw new TypeError("Expected valid private key");if(!l1(q))throw new Error("Expected private key: 0 < key < n");return q},YV=function(Y){if(Y instanceof Z6)return Y.assertValidity(),Y;else return Z6.fromHex(Y)},VV=function(Y){if(Y instanceof E8)return Y.assertValidity(),Y;try{return E8.fromDER(Y)}catch(q){return E8.fromCompact(Y)}};var w7=function(Y){return y0(b6(Y),H6.n)},JV=function(Y){return Z6.fromPrivateKey(Y).toRawX()};async function UV(Y,q,F){return new z9(Y,q,F).calc()}var FV=function(Y,q,F){return new z9(Y,q,F).calcSync()},C2=function(Y,q,F){const O=Y instanceof V1,Z=O?Y:V1.fromHex(Y);if(O)Z.assertValidity();return{...Z,m:w8(q),P:YV(F)}},O2=function(Y,q,F,O){const Z=Z6.BASE.multiplyAndAddUnsafe(q,d1(F),y0(-O,H6.n));if(!Z||!Z.hasEvenY()||Z.x!==Y)return!1;return!0};async function D2(Y,q,F){try{const{r:O,s:Z,m:N,P:J}=C2(Y,q,F),C=w7(await p6.taggedHash(q8.challenge,c1(O),J.toRawX(),N));return O2(O,J,Z,C)}catch(O){return!1}}var L2=function(Y,q,F){try{const{r:O,s:Z,m:N,P:J}=C2(Y,q,F),C=w7(p6.taggedHashSync(q8.challenge,c1(O),J.toRawX(),N));return O2(O,J,Z,C)}catch(O){if(O instanceof K9)throw O;return!1}};/*! noble-secp256k1 - MIT License (c) 2019 Paul Miller (paulmillr.com) */var u0=BigInt(0),j6=BigInt(1),j8=BigInt(2),p1=BigInt(3),V2=BigInt(8),H6=Object.freeze({a:u0,b:BigInt(7),P:BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),n:BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),h:j6,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee")}),J2=(Y,q)=>(Y+q/j8)/q,M7={beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar(Y){const{n:q}=H6,F=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),O=-j6*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),Z=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),N=F,J=BigInt("0x100000000000000000000000000000000"),C=J2(N*Y,q),B=J2(-O*Y,q);let D=y0(Y-C*F-B*Z,q),L=y0(-C*O-B*N,q);const H=D>J,P=L>J;if(H)D=q-D;if(P)L=q-L;if(D>J||L>J)throw new Error("splitScalarEndo: Endomorphism failed, k="+Y);return{k1neg:H,k1:D,k2neg:P,k2:L}}},G1=32,b1=32;var U2=G1+1,F2=2*G1+1;var A7=H6.a===u0;class K9 extends Error{constructor(Y){super(Y)}}class o0{constructor(Y,q,F){this.x=Y,this.y=q,this.z=F}static fromAffine(Y){if(!(Y instanceof Z6))throw new TypeError("JacobianPoint#fromAffine: expected Point");if(Y.equals(Z6.ZERO))return o0.ZERO;return new o0(Y.x,Y.y,j6)}static toAffineBatch(Y){const q=WV(Y.map((F)=>F.z));return Y.map((F,O)=>F.toAffine(q[O]))}static normalizeZ(Y){return o0.toAffineBatch(Y).map(o0.fromAffine)}equals(Y){z2(Y);const{x:q,y:F,z:O}=this,{x:Z,y:N,z:J}=Y,C=y0(O*O),B=y0(J*J),D=y0(q*B),L=y0(Z*C),H=y0(y0(F*J)*B),P=y0(y0(N*O)*C);return D===L&&H===P}negate(){return new o0(this.x,y0(-this.y),this.z)}double(){const{x:Y,y:q,z:F}=this,O=y0(Y*Y),Z=y0(q*q),N=y0(Z*Z),J=Y+Z,C=y0(j8*(y0(J*J)-O-N)),B=y0(p1*O),D=y0(B*B),L=y0(D-j8*C),H=y0(B*(C-L)-V2*N),P=y0(j8*q*F);return new o0(L,H,P)}add(Y){z2(Y);const{x:q,y:F,z:O}=this,{x:Z,y:N,z:J}=Y;if(Z===u0||N===u0)return this;if(q===u0||F===u0)return Y;const C=y0(O*O),B=y0(J*J),D=y0(q*B),L=y0(Z*C),H=y0(y0(F*J)*B),P=y0(y0(N*O)*C),R=y0(L-D),k=y0(P-H);if(R===u0)if(k===u0)return this.double();else return o0.ZERO;const v=y0(R*R),M=y0(R*v),w=y0(D*v),x=y0(k*k-M-j8*w),g=y0(k*(w-x)-H*M),_=y0(O*J*R);return new o0(x,g,_)}subtract(Y){return this.add(Y.negate())}multiplyUnsafe(Y){const q=o0.ZERO;if(typeof Y==="bigint"&&Y===u0)return q;let F=j2(Y);if(F===j6)return this;if(!A7){let L=q,H=this;while(F>u0){if(F&j6)L=L.add(H);H=H.double(),F>>=j6}return L}let{k1neg:O,k1:Z,k2neg:N,k2:J}=M7.splitScalar(F),C=q,B=q,D=this;while(Z>u0||J>u0){if(Z&j6)C=C.add(D);if(J&j6)B=B.add(D);D=D.double(),Z>>=j6,J>>=j6}if(O)C=C.negate();if(N)B=B.negate();return B=new o0(y0(B.x*M7.beta),B.y,B.z),C.add(B)}precomputeWindow(Y){const q=A7?128/Y+1:256/Y+1,F=[];let O=this,Z=O;for(let N=0;N<q;N++){Z=O,F.push(Z);for(let J=1;J<2**(Y-1);J++)Z=Z.add(O),F.push(Z);O=Z.double()}return F}wNAF(Y,q){if(!q&&this.equals(o0.BASE))q=Z6.BASE;const F=q&&q._WINDOW_SIZE||1;if(256%F)throw new Error("Point#wNAF: Invalid precomputation window, must be power of 2");let O=q&&F9.get(q);if(!O){if(O=this.precomputeWindow(F),q&&F!==1)O=o0.normalizeZ(O),F9.set(q,O)}let{ZERO:Z,BASE:N}=o0;const J=1+(A7?128/F:256/F),C=2**(F-1),B=BigInt(2**F-1),D=2**F,L=BigInt(F);for(let H=0;H<J;H++){const P=H*C;let R=Number(Y&B);if(Y>>=L,R>C)R-=D,Y+=j6;const k=P,v=P+Math.abs(R)-1,M=H%2!==0,w=R<0;if(R===0)N=N.add(v7(M,O[k]));else Z=Z.add(v7(w,O[v]))}return{p:Z,f:N}}multiply(Y,q){let F=j2(Y),O,Z;if(A7){const{k1neg:N,k1:J,k2neg:C,k2:B}=M7.splitScalar(F);let{p:D,f:L}=this.wNAF(J,q),{p:H,f:P}=this.wNAF(B,q);D=v7(N,D),H=v7(C,H),H=new o0(y0(H.x*M7.beta),H.y,H.z),O=D.add(H),Z=L.add(P)}else{const{p:N,f:J}=this.wNAF(F,q);O=N,Z=J}return o0.normalizeZ([O,Z])[0]}toAffine(Y){const{x:q,y:F,z:O}=this,Z=this.equals(o0.ZERO);if(Y==null)Y=Z?V2:g7(O);const N=Y,J=y0(N*N),C=y0(J*N),B=y0(q*J),D=y0(F*C),L=y0(O*N);if(Z)return Z6.ZERO;if(L!==j6)throw new Error("invZ was invalid");return new Z6(B,D)}}o0.BASE=new o0(H6.Gx,H6.Gy,j6);o0.ZERO=new o0(u0,j6,u0);var F9=new WeakMap;class Z6{constructor(Y,q){this.x=Y,this.y=q}_setWindowSize(Y){this._WINDOW_SIZE=Y,F9.delete(this)}hasEvenY(){return this.y%j8===u0}static fromCompressedHex(Y){const q=Y.length===32,F=b6(q?Y:Y.subarray(1));if(!S7(F))throw new Error("Point is not on curve");const O=K2(F);let Z=QV(O);const N=(Z&j6)===j6;if(q){if(N)Z=y0(-Z)}else if((Y[0]&1)===1!==N)Z=y0(-Z);const J=new Z6(F,Z);return J.assertValidity(),J}static fromUncompressedHex(Y){const q=b6(Y.subarray(1,G1+1)),F=b6(Y.subarray(G1+1,G1*2+1)),O=new Z6(q,F);return O.assertValidity(),O}static fromHex(Y){const q=w8(Y),F=q.length,O=q[0];if(F===G1)return this.fromCompressedHex(q);if(F===U2&&(O===2||O===3))return this.fromCompressedHex(q);if(F===F2&&O===4)return this.fromUncompressedHex(q);throw new Error(`Point.fromHex: received invalid point. Expected 32-${U2} compressed bytes or ${F2} uncompressed bytes, not ${F}`)}static fromPrivateKey(Y){return Z6.BASE.multiply(d1(Y))}static fromSignature(Y,q,F){const{r:O,s:Z}=VV(q);if(![0,1,2,3].includes(F))throw new Error("Cannot recover: invalid recovery bit");const N=XV(w8(Y)),{n:J}=H6,C=F===2||F===3?O+J:O,B=g7(C,J),D=y0(-N*B,J),L=y0(Z*B,J),H=F&1?"03":"02",P=Z6.fromHex(H+C8(C)),R=Z6.BASE.multiplyAndAddUnsafe(P,D,L);if(!R)throw new Error("Cannot recover signature: point at infinify");return R.assertValidity(),R}toRawBytes(Y=!1){return H8(this.toHex(Y))}toHex(Y=!1){const q=C8(this.x);if(Y)return`${this.hasEvenY()?"02":"03"}${q}`;else return`04${q}${C8(this.y)}`}toHexX(){return this.toHex(!0).slice(2)}toRawX(){return this.toRawBytes(!0).slice(1)}assertValidity(){const{x:q,y:F}=this;if(!S7(q)||!S7(F))throw new Error("Point is not on elliptic curve");const O=y0(F*F),Z=K2(q);if(y0(O-Z)!==u0)throw new Error("Point is not on elliptic curve")}equals(Y){return this.x===Y.x&&this.y===Y.y}negate(){return new Z6(this.x,y0(-this.y))}double(){return o0.fromAffine(this).double().toAffine()}add(Y){return o0.fromAffine(this).add(o0.fromAffine(Y)).toAffine()}subtract(Y){return this.add(Y.negate())}multiply(Y){return o0.fromAffine(this).multiply(Y,this).toAffine()}multiplyAndAddUnsafe(Y,q,F){const O=o0.fromAffine(this),Z=q===u0||q===j6||this!==Z6.BASE?O.multiplyUnsafe(q):O.multiply(q),N=o0.fromAffine(Y).multiplyUnsafe(F),J=Z.add(N);return J.equals(o0.ZERO)?void 0:J.toAffine()}}Z6.BASE=new Z6(H6.Gx,H6.Gy);Z6.ZERO=new Z6(u0,u0);class E8{constructor(Y,q){this.r=Y,this.s=q,this.assertValidity()}static fromCompact(Y){const q=h1(Y);if(typeof Y!=="string"&&!q)throw new TypeError("Signature.fromCompact: Expected string or Uint8Array");const O=q?Y1(Y):Y;if(O.length!==128)throw new Error("Signature.fromCompact: Expected 64-byte hex");return new E8(E7(O.slice(0,64)),E7(O.slice(64,128)))}static fromDER(Y){const q=h1(Y);if(typeof Y!=="string"&&!q)throw new TypeError("Signature.fromDER: Expected string or Uint8Array");const{r:F,s:O}=sY(q?Y:H8(Y));return new E8(F,O)}static fromHex(Y){return this.fromDER(Y)}assertValidity(){const{r:Y,s:q}=this;if(!l1(Y))throw new Error("Invalid Signature: r must be 0 < r < n");if(!l1(q))throw new Error("Invalid Signature: s must be 0 < s < n")}hasHighS(){const Y=H6.n>>j6;return this.s>Y}normalizeS(){return this.hasHighS()?new E8(this.r,y0(-this.s,H6.n)):this}toDERRawBytes(){return H8(this.toDERHex())}toDERHex(){const Y=Z2(m1(this.s)),q=Z2(m1(this.r)),F=Y.length/2,O=q.length/2,Z=m1(F),N=m1(O);return`30${m1(O+F+4)}02${N}${q}02${Z}${Y}`}toRawBytes(){return this.toDERRawBytes()}toHex(){return this.toDERHex()}toCompactRawBytes(){return H8(this.toCompactHex())}toCompactHex(){return C8(this.r)+C8(this.s)}}var tY=Array.from({length:256},(Y,q)=>q.toString(16).padStart(2,"0")),Y8={_0:48,_9:57,A:65,F:70,a:97,f:102},eY=BigInt("0x10000000000000000000000000000000000000000000000000000000000000000"),X1,U9;class V1{constructor(Y,q){this.r=Y,this.s=q,this.assertValidity()}static fromHex(Y){const q=w8(Y);if(q.length!==64)throw new TypeError(`SchnorrSignature.fromHex: expected 64 bytes, not ${q.length}`);const F=b6(q.subarray(0,32)),O=b6(q.subarray(32,64));return new V1(F,O)}assertValidity(){const{r:Y,s:q}=this;if(!S7(Y)||!l1(q))throw new Error("Invalid signature")}toHex(){return C8(this.r)+C8(this.s)}toRawBytes(){return H8(this.toHex())}}class z9{constructor(Y,q,F=p6.randomBytes()){if(Y==null)throw new TypeError(`sign: Expected valid message, not "${Y}"`);this.m=w8(Y);const{x:O,scalar:Z}=this.getScalar(d1(q));if(this.px=O,this.d=Z,this.rand=w8(F),this.rand.length!==32)throw new TypeError("sign: Expected 32 bytes of aux randomness")}getScalar(Y){const q=Z6.fromPrivateKey(Y),F=q.hasEvenY()?Y:H6.n-Y;return{point:q,scalar:F,x:q.toRawX()}}initNonce(Y,q){return c1(Y^b6(q))}finalizeNonce(Y){const q=y0(b6(Y),H6.n);if(q===u0)throw new Error("sign: Creation of signature failed. k is zero");const{point:F,x:O,scalar:Z}=this.getScalar(q);return{R:F,rx:O,k:Z}}finalizeSig(Y,q,F,O){return new V1(Y.x,y0(q+F*O,H6.n)).toRawBytes()}error(){throw new Error("sign: Invalid signature produced")}async calc(){const{m:Y,d:q,px:F,rand:O}=this,Z=p6.taggedHash,N=this.initNonce(q,await Z(q8.aux,O)),{R:J,rx:C,k:B}=this.finalizeNonce(await Z(q8.nonce,N,F,Y)),D=w7(await Z(q8.challenge,C,F,Y)),L=this.finalizeSig(J,B,D,q);if(!await D2(L,Y,F))this.error();return L}calcSync(){const{m:Y,d:q,px:F,rand:O}=this,Z=p6.taggedHashSync,N=this.initNonce(q,Z(q8.aux,O)),{R:J,rx:C,k:B}=this.finalizeNonce(Z(q8.nonce,N,F,Y)),D=w7(Z(q8.challenge,C,F,Y)),L=this.finalizeSig(J,B,D,q);if(!L2(L,Y,F))this.error();return L}}var Z9={Signature:V1,getPublicKey:JV,sign:UV,verify:D2,signSync:FV,verifySync:L2};Z6.BASE._setWindowSize(8);var S6={node:J9,web:typeof self==="object"&&("crypto"in self)?self.crypto:void 0},q8={challenge:"BIP0340/challenge",aux:"BIP0340/aux",nonce:"BIP0340/nonce"},x7={},p6={bytesToHex:Y1,hexToBytes:H8,concatBytes:_1,mod:y0,invert:g7,isValidPrivateKey(Y){try{return d1(Y),!0}catch(q){return!1}},_bigintTo32Bytes:c1,_normalizePrivateKey:d1,hashToPrivateKey:(Y)=>{Y=w8(Y);const q=b1+8;if(Y.length<q||Y.length>1024)throw new Error("Expected valid bytes of private key as per FIPS 186");const F=y0(b6(Y),H6.n-j6)+j6;return c1(F)},randomBytes:(Y=32)=>{if(S6.web)return S6.web.getRandomValues(new Uint8Array(Y));else if(S6.node){const{randomBytes:q}=S6.node;return Uint8Array.from(q(Y))}else throw new Error("The environment doesn't have randomBytes function")},randomPrivateKey:()=>p6.hashToPrivateKey(p6.randomBytes(b1+8)),precompute(Y=8,q=Z6.BASE){const F=q===Z6.BASE?q:new Z6(q.x,q.y);return F._setWindowSize(Y),F.multiply(p1),F},sha256:async(...Y)=>{if(S6.web){const q=await S6.web.subtle.digest("SHA-256",_1(...Y));return new Uint8Array(q)}else if(S6.node){const{createHash:q}=S6.node,F=q("sha256");return Y.forEach((O)=>F.update(O)),Uint8Array.from(F.digest())}else throw new Error("The environment doesn't have sha256 function")},hmacSha256:async(Y,...q)=>{if(S6.web){const F=await S6.web.subtle.importKey("raw",Y,{name:"HMAC",hash:{name:"SHA-256"}},!1,["sign"]),O=_1(...q),Z=await S6.web.subtle.sign("HMAC",F,O);return new Uint8Array(Z)}else if(S6.node){const{createHmac:F}=S6.node,O=F("sha256",Y);return q.forEach((Z)=>O.update(Z)),Uint8Array.from(O.digest())}else throw new Error("The environment doesn't have hmac-sha256 function")},sha256Sync:void 0,hmacSha256Sync:void 0,taggedHash:async(Y,...q)=>{let F=x7[Y];if(F===void 0){const O=await p6.sha256(Uint8Array.from(Y,(Z)=>Z.charCodeAt(0)));F=_1(O,O),x7[Y]=F}return p6.sha256(F,...q)},taggedHashSync:(Y,...q)=>{if(typeof X1!=="function")throw new K9("sha256Sync is undefined, you need to set it");let F=x7[Y];if(F===void 0){const O=X1(Uint8Array.from(Y,(Z)=>Z.charCodeAt(0)));F=_1(O,O),x7[Y]=F}return X1(F,...q)},_JacobianPoint:o0};Object.defineProperties(p6,{sha256Sync:{configurable:!1,get(){return X1},set(Y){if(!X1)X1=Y}},hmacSha256Sync:{configurable:!1,get(){return U9},set(Y){if(!U9)U9=Y}}});var{floor:$9,random:KV,sin:zV}=Math,g8="Trystero",O8=(Y,q)=>Array(Y).fill().map(q);var _7=(Y)=>O8(Y,()=>"0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"[$9(KV()*"0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz".length)]).join(""),a6=_7(20),n6=Promise.all.bind(Promise),N2=typeof window!=="undefined",{entries:m7,fromEntries:q9,keys:P2}=Object,V8=()=>{},c6=(Y)=>new Error(`Trystero: ${Y}`),ZV=new TextEncoder,$V=new TextDecoder,r6=(Y)=>ZV.encode(Y),J1=(Y)=>$V.decode(Y),p7=(Y)=>Y.reduce((q,F)=>q+F.toString(16).padStart(2,"0"),""),u1=(...Y)=>Y.join("@"),qV=(Y,q)=>{const F=[...Y],O=()=>{const N=zV(q++)*1e4;return N-$9(N)};let Z=F.length;while(Z){const N=$9(O()*Z--);[F[Z],F[N]]=[F[N],F[Z]]}return F},k2=(Y,q,F,O)=>{return(Y.relayUrls||(O?qV(q,j9(Y.appId)):q)).slice(0,Y.relayUrls?Y.relayUrls.length:Y.relayRedundancy||F)},h6=JSON.stringify,y8=JSON.parse,j9=(Y,q=Number.MAX_SAFE_INTEGER)=>Y.split("").reduce((F,O)=>F+O.charCodeAt(0),0)%q;var y7={},B2=(Y,q)=>{const F={},O=()=>{const Z=new WebSocket(Y);Z.onclose=()=>{y7[Y]??=3333,setTimeout(O,y7[Y]),y7[Y]*=2},Z.onmessage=(N)=>q(N.data),F.socket=Z,F.url=Z.url,F.ready=new Promise((N)=>Z.onopen=()=>{N(F),y7[Y]=3333}),F.send=(N)=>{if(Z.readyState===1)Z.send(N)}};return O(),F},R2=(Y)=>()=>q9(m7(Y).map(([q,F])=>[q,F.socket]));var H9="AES-GCM",jV={},HV=(Y)=>btoa(String.fromCharCode.apply(null,new Uint8Array(Y))),CV=(Y)=>{const q=atob(Y);return new Uint8Array(q.length).map((F,O)=>q.charCodeAt(O)).buffer},f1=async(Y)=>jV[Y]||=Array.from(new Uint8Array(await crypto.subtle.digest("SHA-1",r6(Y)))).map((q)=>q.toString(36)).join(""),I2=async(Y,q,F)=>crypto.subtle.importKey("raw",await crypto.subtle.digest({name:"SHA-256"},r6(`${Y}:${q}:${F}`)),{name:H9},!1,["encrypt","decrypt"]),T2="$",M2=",",A2=async(Y,q)=>{const F=crypto.getRandomValues(new Uint8Array(16));return F.join(M2)+T2+HV(await crypto.subtle.encrypt({name:H9,iv:F},await Y,r6(q)))},v2=async(Y,q)=>{const[F,O]=q.split(T2);return J1(await crypto.subtle.decrypt({name:H9,iv:new Uint8Array(F.split(M2))},await Y,CV(O)))};var OV=5000,x2="icegatheringstatechange",S2="offer",DV="answer",C9=(Y,{rtcConfig:q,rtcPolyfill:F,turnConfig:O})=>{const Z=new(F||RTCPeerConnection)({iceServers:LV.concat(O||[]),...q}),N={};let J=!1,C=!1,B=null;const D=(H)=>{H.binaryType="arraybuffer",H.bufferedAmountLowThreshold=65535,H.onmessage=(P)=>N.data?.(P.data),H.onopen=()=>N.connect?.(),H.onclose=()=>N.close?.(),H.onerror=(P)=>N.error?.(P)},L=(H)=>Promise.race([new Promise((P)=>{const R=()=>{if(H.iceGatheringState==="complete")H.removeEventListener(x2,R),P()};H.addEventListener(x2,R),R()}),new Promise((P)=>setTimeout(P,OV))]).then(()=>({type:H.localDescription.type,sdp:H.localDescription.sdp.replace(/a=ice-options:trickle\s\n/g,"")}));if(Y)B=Z.createDataChannel("data"),D(B);else Z.ondatachannel=({channel:H})=>{B=H,D(H)};if(Z.onnegotiationneeded=async()=>{try{J=!0,await Z.setLocalDescription();const H=await L(Z);N.signal?.(H)}catch(H){N.error?.(H)}finally{J=!1}},Z.onconnectionstatechange=()=>{if(["disconnected","failed","closed"].includes(Z.connectionState))N.close?.()},Z.ontrack=(H)=>{N.track?.(H.track,H.streams[0]),N.stream?.(H.streams[0])},Z.onremovestream=(H)=>N.stream?.(H.stream),Y){if(!Z.canTrickleIceCandidates)Z.onnegotiationneeded()}return{created:Date.now(),connection:Z,get channel(){return B},get isDead(){return Z.connectionState==="closed"},async signal(H){if(B?.readyState==="open"&&!H.sdp?.includes("a=rtpmap"))return;try{if(H.type===S2){if(J||Z.signalingState!=="stable"&&!C){if(Y)return;await n6([Z.setLocalDescription({type:"rollback"}),Z.setRemoteDescription(H)])}else await Z.setRemoteDescription(H);await Z.setLocalDescription();const P=await L(Z);return N.signal?.(P),P}else if(H.type===DV){C=!0;try{await Z.setRemoteDescription(H)}finally{C=!1}}}catch(P){N.error?.(P)}},sendData:(H)=>B.send(H),destroy:()=>{B?.close(),Z.close(),J=!1,C=!1},setHandlers:(H)=>Object.assign(N,H),offerPromise:Y?new Promise((H)=>N.signal=(P)=>{if(P.type===S2)H(P)}):Promise.resolve(),addStream:(H)=>H.getTracks().forEach((P)=>Z.addTrack(P,H)),removeStream:(H)=>Z.getSenders().filter((P)=>H.getTracks().includes(P.track)).forEach((P)=>Z.removeTrack(P)),addTrack:(H,P)=>Z.addTrack(H,P),removeTrack:(H)=>{const P=Z.getSenders().find((R)=>R.track===H);if(P)Z.removeTrack(P)},replaceTrack:(H,P)=>{const R=Z.getSenders().find((k)=>k.track===H);if(R)return R.replaceTrack(P)}}},LV=[...O8(3,(Y,q)=>`stun:stun${q||""}.l.google.com:19302`),"stun:stun.cloudflare.com:3478"].map((Y)=>({urls:Y}));var NV=Object.getPrototypeOf(Uint8Array),h7=12,w2=0,c7=w2+h7,l7=c7+1,o1=l7+1,a1=o1+1,_8=16384-a1,b7=255,E2="bufferedamountlow",U1=(Y)=>"@_"+Y,g2=(Y,q,F)=>{const O={},Z={},N={},J={},C={},B={},D={},L={onPeerJoin:V8,onPeerLeave:V8,onPeerStream:V8,onPeerTrack:V8},H=(Q,G)=>(Q?Array.isArray(Q)?Q:[Q]:P2(O)).flatMap((V)=>{const X=O[V];if(!X)return console.warn(`${g8}: no peer with id ${V} found`),[];return G(V,X)}),P=(Q)=>{if(!O[Q])return;delete O[Q],delete J[Q],delete C[Q],L.onPeerLeave(Q),q(Q)},R=(Q)=>{if(Z[Q])return N[Q];if(!Q)throw c6("action type argument is required");const G=r6(Q);if(G.byteLength>h7)throw c6(`action type string "${Q}" (${G.byteLength}b) exceeds `+`byte limit (${h7}). Hint: choose a shorter name.`);const V=new Uint8Array(h7);V.set(G);let X=0;return Z[Q]={onComplete:V8,onProgress:V8,setOnComplete:(U)=>Z[Q]={...Z[Q],onComplete:U},setOnProgress:(U)=>Z[Q]={...Z[Q],onProgress:U},send:async(U,$,j,K)=>{if(j&&typeof j!=="object")throw c6("action meta argument must be an object");const W=typeof U;if(W==="undefined")throw c6("action data cannot be undefined");const z=W!=="string",A=U instanceof Blob,T=A||U instanceof ArrayBuffer||U instanceof NV;if(j&&!T)throw c6("action meta argument can only be used with binary data");const y=T?new Uint8Array(A?await U.arrayBuffer():U):r6(z?h6(U):U),r=j?r6(h6(j)):null,a=Math.ceil(y.byteLength/_8)+(j?1:0)||1,t=O8(a,(l,h)=>{const n=h===a-1,q0=j&&h===0,G0=new Uint8Array(a1+(q0?r.byteLength:n?y.byteLength-_8*(a-(j?2:1)):_8));return G0.set(V),G0.set([X],c7),G0.set([n|q0<<1|T<<2|z<<3],l7),G0.set([Math.round((h+1)/a*b7)],o1),G0.set(j?q0?r:y.subarray((h-1)*_8,h*_8):y.subarray(h*_8,(h+1)*_8),a1),G0});return X=X+1&b7,n6(H($,async(l,h)=>{const{channel:n}=h;let q0=0;while(q0<a){const G0=t[q0];if(n.bufferedAmount>n.bufferedAmountLowThreshold)await new Promise((F0)=>{const b=()=>{n.removeEventListener(E2,b),F0()};n.addEventListener(E2,b)});if(!O[l])break;h.sendData(G0),q0++,K?.(G0[o1]/b7,l,j)}}))}},N[Q]||=[Z[Q].send,Z[Q].setOnComplete,Z[Q].setOnProgress]},k=(Q,G)=>{const V=new Uint8Array(G),X=J1(V.subarray(w2,c7)).replaceAll("\0",""),[U]=V.subarray(c7,l7),[$]=V.subarray(l7,o1),[j]=V.subarray(o1,a1),K=V.subarray(a1),W=!!($&1),z=!!($&1<<1),A=!!($&1<<2),T=!!($&1<<3);if(!Z[X]){console.warn(`${g8}: received message with unregistered type (${X})`);return}J[Q]||={},J[Q][X]||={};const y=J[Q][X][U]||={chunks:[]};if(z)y.meta=y8(J1(K));else y.chunks.push(K);if(Z[X].onProgress(j/b7,Q,y.meta),!W)return;const r=new Uint8Array(y.chunks.reduce((a,t)=>a+t.byteLength,0));if(y.chunks.reduce((a,t)=>{return r.set(t,a),a+t.byteLength},0),delete J[Q][X][U],A)Z[X].onComplete(r,Q,y.meta);else{const a=J1(r);Z[X].onComplete(T?y8(a):a,Q)}},v=async()=>{await u(""),await new Promise((Q)=>setTimeout(Q,99)),m7(O).forEach(([Q,G])=>{G.destroy(),delete O[Q]}),F()},[M,w]=R(U1("ping")),[x,g]=R(U1("pong")),[_,p]=R(U1("signal")),[m,f]=R(U1("stream")),[s,Q0]=R(U1("track")),[u,K0]=R(U1("leave"));if(Y((Q,G)=>{if(O[G])return;O[G]=Q,Q.setHandlers({data:(V)=>k(G,V),stream:(V)=>{L.onPeerStream(V,G,B[G]),delete B[G]},track:(V,X)=>{L.onPeerTrack(V,X,G,D[G]),delete D[G]},signal:(V)=>_(V,G),close:()=>P(G),error:(V)=>{console.error(V),P(G)}}),L.onPeerJoin(G)}),w((Q,G)=>x("",G)),g((Q,G)=>{C[G]?.(),delete C[G]}),p((Q,G)=>O[G]?.signal(Q)),f((Q,G)=>B[G]=Q),Q0((Q,G)=>D[G]=Q),K0((Q,G)=>P(G)),N2)addEventListener("beforeunload",v);return{makeAction:R,leave:v,ping:async(Q)=>{if(!Q)throw c6("ping() must be called with target peer ID");const G=Date.now();return M("",Q),await new Promise((V)=>C[Q]=V),Date.now()-G},getPeers:()=>q9(m7(O).map(([Q,G])=>[Q,G.connection])),addStream:(Q,G,V)=>H(G,async(X,U)=>{if(V)await m(V,X);U.addStream(Q)}),removeStream:(Q,G)=>H(G,(V,X)=>X.removeStream(Q)),addTrack:(Q,G,V,X)=>H(V,async(U,$)=>{if(X)await s(X,U);$.addTrack(Q,G)}),removeTrack:(Q,G)=>H(G,(V,X)=>X.removeTrack(Q)),replaceTrack:(Q,G,V,X)=>H(V,async(U,$)=>{if(X)await s(X,U);$.replaceTrack(Q,G)}),onPeerJoin:(Q)=>L.onPeerJoin=Q,onPeerLeave:(Q)=>L.onPeerLeave=Q,onPeerStream:(Q)=>L.onPeerStream=Q,onPeerTrack:(Q)=>L.onPeerTrack=Q}};var PV=20,kV=5333,y2=57333,_2=({init:Y,subscribe:q,announce:F})=>{const O={};let Z=!1,N,J,C;return(B,D,L)=>{const{appId:H}=B;if(O[H]?.[D])return O[H][D];const P={},R={},k=u1(g8,H,D),v=f1(k),M=f1(u1(k,a6)),w=I2(B.password||"",H,D),x=(U)=>async($)=>({type:$.type,sdp:await U(w,$.sdp)}),g=x(v2),_=x(A2),p=()=>C9(!0,B),m=(U,$,j)=>{if(R[$]){if(R[$]!==U)U.destroy();return}R[$]=U,X(U,$),P[$]?.forEach((K,W)=>{if(W!==j)K.destroy()}),delete P[$]},f=(U,$)=>{if(R[$]===U)delete R[$]},s=(U,$)=>{if(R[U])return;const j=P[U]?.[$];if(j)delete P[U][$],j.destroy()},Q0=(U)=>{return J.push(...O8(U,p)),n6(J.splice(0,U).map(($)=>$.offerPromise.then(_).then((j)=>({peer:$,offer:j}))))},u=(U,$)=>L?.({error:`incorrect password (${B.password}) when decrypting ${$}`,appId:H,peerId:U,roomId:D}),K0=(U)=>async($,j,K)=>{const[W,z]=await n6([v,M]);if($!==W&&$!==z)return;const{peerId:A,offer:T,answer:y,peer:r}=typeof j==="string"?y8(j):j;if(A===a6||R[A])return;if(A&&!T&&!y){if(P[A]?.[U])return;const[[{peer:a,offer:t}],l]=await n6([Q0(1),f1(u1(k,A))]);P[A]||=[],P[A][U]=a,setTimeout(()=>s(A,U),Q[U]*0.9),a.setHandlers({connect:()=>m(a,A,U),close:()=>f(a,A)}),K(l,h6({peerId:a6,offer:t}))}else if(T){if(P[A]?.[U]&&a6>A)return;const t=C9(!1,B);t.setHandlers({connect:()=>m(t,A,U),close:()=>f(t,A)});let l;try{l=await g(T)}catch{u(A,"offer");return}if(t.isDead)return;const[h,n]=await n6([f1(u1(k,A)),t.signal(l)]);K(h,h6({peerId:a6,answer:await _(n)}))}else if(y){let a;try{a=await g(y)}catch(t){u(A,"answer");return}if(r)r.setHandlers({connect:()=>m(r,A,U),close:()=>f(r,A)}),r.signal(a);else{const t=P[A]?.[U];if(t&&!t.isDead)t.signal(a)}}};if(!B)throw c6("requires a config map as the first argument");if(!H&&!B.firebaseApp)throw c6("config map is missing appId field");if(!D)throw c6("roomId argument required");if(!Z){const U=Y(B);J=O8(PV,p),N=Array.isArray(U)?U:[U],Z=!0,C=setInterval(()=>J=J.filter(($)=>{const j=Date.now()-$.created<y2;if(!j)$.destroy();return j}),y2*1.03)}const Q=N.map(()=>kV),G=[],V=N.map(async(U,$)=>q(await U,await v,await M,K0($),Q0));n6([v,M]).then(([U,$])=>{const j=async(K,W)=>{const z=await F(K,U,$);if(typeof z==="number")Q[W]=z;G[W]=setTimeout(()=>j(K,W),Q[W])};V.forEach(async(K,W)=>{await K,j(await N[W],W)})});let X=V8;return O[H]||={},O[H][D]=g2((U)=>X=U,(U)=>delete R[U],()=>{delete O[H][D],G.forEach(clearTimeout),V.forEach(async(U)=>(await U)()),clearInterval(C)})}};var h2={},BV=5,c2="x",l2="EVENT",d2=p6.randomPrivateKey(),RV=p7(Z9.getPublicKey(d2)),O9={},n1={},IV={},u2=()=>Math.floor(Date.now()/1000),f2=(Y)=>IV[Y]??=j9(Y,1e4)+20000,m2=async(Y,q)=>{const F={kind:f2(Y),content:q,pubkey:RV,created_at:u2(),tags:[[c2,Y]]},O=p7(new Uint8Array(await crypto.subtle.digest("SHA-256",r6(h6([0,F.pubkey,F.created_at,F.kind,F.tags,F.content])))));return h6([l2,{...F,id:O,sig:p7(await Z9.sign(O,d2))}])},p2=(Y,q)=>{return O9[Y]=q,h6(["REQ",Y,{kinds:[f2(q)],since:u2(),["#"+c2]:[q]}])},b2=(Y)=>{return delete O9[Y],h6(["CLOSE",Y])},d7=_2({init:(Y)=>k2(Y,MV,BV,!0).map((q)=>{const F=B2(q,(O)=>{const[Z,N,J,C]=y8(O);if(Z!==l2){const B=`${g8}: relay failure from ${F.url} - `;if(Z==="NOTICE")console.warn(B+N);else if(Z==="OK"&&!J)console.warn(B+C);return}n1[N]?.(O9[N],J.content)});return h2[q]=F,F.ready}),subscribe:(Y,q,F,O)=>{const Z=_7(64),N=_7(64);return n1[Z]=n1[N]=(J,C)=>O(J,C,async(B,D)=>Y.send(await m2(B,D))),Y.send(p2(Z,q)),Y.send(p2(N,F)),()=>{Y.send(b2(Z)),Y.send(b2(N)),delete n1[Z],delete n1[N]}},announce:async(Y,q)=>Y.send(await m2(q,h6({peerId:a6})))}),TV=R2(h2),MV=["black.nostrcity.club","eu.purplerelay.com","ftp.halifax.rwth-aachen.de/nostr","nostr.cool110.xyz","nostr.data.haus","nostr.mom","nostr.oxtr.dev","nostr.sathoarder.com","nostr.vulpem.com","nostrelay.memory-art.xyz","playground.nostrcheck.me/relay","relay.agorist.space","relay.binaryrobot.com","relay.fountain.fm","relay.mostro.network","relay.nostraddress.com","relay.nostrdice.com","relay.nostromo.social","relay.oldenburg.cool","relay.snort.social","relay.verified-nostr.com","sendit.nosflare.com","yabu.me/v2"].map((Y)=>"wss://"+Y);var o2=(Y,q,F)=>{let O=q.timestamp;if(q.timestamp&&typeof q.timestamp.physical==="number"){const J=Date.now()+7200000;if(q.timestamp.physical>J)O={physical:J,logical:q.timestamp.logical}}if(!Y||!Y.timestamp)return{resolved:!0,value:q.value,timestamp:O};const Z=Y.timestamp;if(F.compare(Z,O)<0)return{resolved:!0,value:q.value,timestamp:O};return{resolved:!1}};var AV=()=>{const Y=new Map,q=async()=>{try{const B=await navigator.storage.getDirectory(),L=await(await B.getFileHandle("~opfs-sync-test",{create:!0})).createSyncAccessHandle?.();return await L?.close(),await B.removeEntry("~opfs-sync-test"),!!L}catch{return!1}};let F="idb";const O=(async()=>{if(await q())F="sync";else try{const B=await navigator.storage.getDirectory(),L=await(await B.getFileHandle("~opfs-async-test",{create:!0})).createWritable?.();if(await L?.close(),await B.removeEntry("~opfs-async-test"),L)F="async";else F="idb"}catch{F="idb"}})(),Z=async(B,D)=>{if(!Y.has(B))Y.set(B,[]);const L=Y.get(B),H=L[L.length-1]||Promise.resolve();let P;const R=new Promise((k)=>P=k);L.push(R);try{return await H,await D()}finally{if(L.shift(),P(),L.length===0)Y.delete(B)}},N=(()=>{let B;const D=async()=>{if(!B)B=new Promise((L,H)=>{const P=indexedDB.open("opfs-fallback-db",1);P.onupgradeneeded=()=>P.result.createObjectStore("files"),P.onsuccess=()=>L(P.result),P.onerror=()=>H(P.error)});return B};return{getDB:D,get:async(L)=>{const H=await D();return new Promise((P,R)=>{const v=H.transaction("files","readonly").objectStore("files").get(L);v.onsuccess=()=>P(v.result||new Uint8Array),v.onerror=()=>R(v.error)})},set:async(L,H)=>{const P=await D();return new Promise((R,k)=>{const M=P.transaction("files","readwrite").objectStore("files").put(H,L);M.onsuccess=()=>R(),M.onerror=()=>k(M.error)})}}})(),J=async(B)=>{await O;try{if(F==="idb"){const R=await N.get(B);return{type:"loaded",name:B,data:R}}const L=await(await navigator.storage.getDirectory()).getFileHandle(B);if(F==="sync"){let R;try{R=await L.createSyncAccessHandle();const k=R.getSize(),v=new Uint8Array(k),M=R.read(v,{at:0});return{type:"loaded",name:B,data:v.slice(0,M)}}finally{R?.close()}}const H=await L.getFile(),P=new Uint8Array(await H.arrayBuffer());return{type:"loaded",name:B,data:P}}catch(D){const L=D.name==="NotFoundError"?"File not found":D.message||"Error reading file";return{type:"error",name:B,message:L}}},C=async(B,D)=>{if(await O,!(D instanceof Uint8Array))return{type:"error",name:B,message:"Content must be a Uint8Array"};return Z(B,async()=>{try{if(F==="idb")return await N.set(B,D),{type:"saved",name:B};const H=await(await navigator.storage.getDirectory()).getFileHandle(B,{create:!0});if(F==="sync"){let P;try{P=await H.createSyncAccessHandle(),P.truncate(0),P.write(D,{at:0}),P.flush()}finally{P?.close()}}else{let P;try{P=await H.createWritable(),await P.write(D)}finally{await P?.close()}}return{type:"saved",name:B}}catch(L){return{type:"error",name:B,message:L.message||"Error saving file"}}})};self.onmessage=async({data:B})=>{const{type:D,name:L,content:H}=B;await O;const P={load:()=>J(L),save:()=>C(L,H)};try{const R=P[D],k=R?await R():{type:"error",message:`Unrecognized action type: ${D}`};self.postMessage(k)}catch(R){console.error("Worker unexpected error:",R),self.postMessage({type:"error",name:L,message:R.message||"Unexpected worker error"})}}},a2=AV;var m8={$eq:(Y,q)=>Y===q,$ne:(Y,q)=>Y!==q,$gt:(Y,q)=>Y>q,$gte:(Y,q)=>Y>=q,$lt:(Y,q)=>Y<q,$lte:(Y,q)=>Y<=q,$in:(Y,q)=>Array.isArray(q)&&q.includes(Y),$between:(Y,[q,F])=>Y>=q&&Y<=F,$exists:(Y,q)=>q?Y!==void 0:Y===void 0,$text:{global:(Y,q)=>{const F=(Z)=>String(Z).normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^\w\s]/g,""),O=F(q);return Object.values(Y).some((Z)=>{if(typeof Z==="object")return null.fieldSearch(Z,O);return F(Z).includes(O)})},field:(Y,q)=>{const F=(O)=>String(O).normalize("NFD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^\w\s]/g,"");return Array.isArray(Y)?Y.some((O)=>F(O).includes(F(q))):F(Y).includes(F(q))}},$like:(Y,q)=>{if(typeof Y!=="string"||typeof q!=="string")return!1;return new RegExp(`^${q.replace(/%/g,".*").replace(/_/g,".")}\$`,"i").test(Y)},$regex:(Y,q)=>typeof Y==="string"&&new RegExp(q.$regex||q,"i").test(Y),$and:(Y,q,F)=>q.every((O)=>{return F.createFilter(O)(Y)}),$or:(Y,q,F)=>q.some((O)=>{return F.createFilter(O)(Y)}),$not:(Y,q,F)=>{return!F.createFilter(q)(Y)}},D9=(Y,q)=>{const F=q.split(".");let O=Y;for(let Z of F)if(O&&typeof O==="object"&&(Z in O))O=O[Z];else return;return O},L9=(Y)=>{const q=(F)=>{return Object.entries(Y).every(([O,Z])=>{if(O.startsWith("$"))return m8[O](F,Z,{filterNode:q,createFilter:L9});const N=D9(F.value,O);if(typeof Z!=="object"||Z===null)return m8.$eq(N,Z);return Object.entries(Z).every(([J,C])=>{if(J==="$text")return m8.$text.field(N,C);if(J==="$between"&&C.every((B)=>B instanceof Date)){const B=new Date(N);return m8.$between(B,C)}return m8[J]?.(N,C,{filterNode:q,createFilter:L9})??!1})})};return q},N9=(Y,q)=>{const F=L9(q.query);let O=Object.values(Y).filter(F);if(q.field)O.sort((Z,N)=>{const J=D9(Z.value,q.field),C=D9(N.value,q.field),B=q.order==="asc"?1:-1;if(typeof J==="string"&&typeof C==="string")return J.localeCompare(C)*B;return((J??0)-(C??0))*B});if(q.$after){const Z=O.findIndex((N)=>N.id===q.$after);O=Z>=0?O.slice(Z+1):[]}if(q.$before){const Z=O.findIndex((N)=>N.id===q.$before);O=Z>=0?O.slice(0,Z):[]}return q.$limit?O.slice(0,q.$limit):O};class P9{constructor(){this.physical=Date.now(),this.logical=0}now(){const Y=Date.now();return this.physical=Math.max(this.physical,Y),this.logical++,{physical:this.physical,logical:this.logical}}update(Y){if(!Y||typeof Y.physical!=="number"||typeof Y.logical!=="number")return;this.physical=Math.max(this.physical,Y.physical),this.logical=Math.max(this.logical,Y.logical)+1}compare(Y,q){if(!Y&&!q)return 0;if(!Y)return-1;if(!q)return 1;if(Y.physical>q.physical)return 1;if(Y.physical<q.physical)return-1;if(Y.logical>q.logical)return 1;if(Y.logical<q.logical)return-1;return 0}}var n2=function(Y,q){return Y.length===q.length&&Y.every((F,O)=>F===q[O])};async function vV(){console.log("\u26A1 GenosDB: Empowering distributed graph databases with real-time synchronization and scalability. Learn more: https://github.com/estebanrfp/gdb \u26A1"),console.log(navigator?.storage?.getDirectory?"OPFS is enabled.":"OPFS is not available."),navigator?.storage?.getDirectory&&await navigator.storage.getDirectory()}if(Symbol.dispose===void 0)Object.defineProperty(Symbol,"dispose",{value:Symbol.for("Symbol.dispose")});class r2{constructor(){this.nodes={}}insert(Y,q,F){this.nodes[Y]={id:Y,value:q,edges:[],timestamp:F}}get(Y){return this.nodes[Y]||null}link(Y,q){const F=this.nodes[Y],O=this.nodes[q];if(F&&O&&!F.edges.includes(q))F.edges.push(q)}getAllNodes(){return Object.values(this.nodes)}serialize(){return v1.deflate(L8(this.nodes))}deserialize(Y){this.nodes=s7(v1.inflate(new Uint8Array(Y)))}}class r1{static _listenersInitialized=!1;constructor(Y,{password:q,securityManager:F=null}={}){this.hybridClock=new P9,this.name=Y,this.password=q,this.globalTimestamp=null,this.graph=new r2,this.securityManager=F,this.eventListeners=[],this.operators=m8,this.initWorker(),this.ready=this.loadGraphFromOPFS(),this.loadGlobalTimestamp();const O=`graph-sync-room-${this.name}`,Z={appId:"1234",...this.password&&{password:this.password}},N=d7(Z,O),[J,C]=N.makeAction("syncGraph");this.sendData=J;const B=d7(Z,`app-sync-${this.name}`);if(this.room=B,!r1._listenersInitialized)r1._listenersInitialized=!0,window.addEventListener("online",async()=>{console.log("\u2705 Reconnected to the network."),this.sendData([{type:"sync",timestamp:this.globalTimestamp}])}),window.addEventListener("offline",async()=>{console.log("\u274C Disconnected from the network.")}),document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible")console.log("The tab is visible again."),this.sendData([{type:"sync",timestamp:this.globalTimestamp}]);else if(document.visibilityState==="hidden")console.log("The tab is no longer visible.")});vV(),N.onPeerJoin(async(D)=>{console.log("\u26A1 New pair connected:",D),this.sendData([{type:"sync",timestamp:this.globalTimestamp}])}),N.onPeerLeave((D)=>{console.log("\u26A1 Pair disconnected:",D)}),C(async(D)=>{if(this.securityManager&&typeof this.securityManager.verifyIncomingOperations==="function"){const{validatedOperations:L}=await this.securityManager.verifyIncomingOperations(D);if(L&&L.length>0)await this.receiveChanges(L)}else console.log("GDB: No SecurityManager configured or verifyIncomingOperations missing. Processing P2P data directly."),await this.receiveChanges(D),this.emit()}),this.channel=new BroadcastChannel(`graphdb_sync_${this.name}`),this.channel.onmessage=async(D)=>{if(D.data==="update")console.log("\uD83D\uDD04 Update received from another tab..."),await this.loadGraphFromOPFS(),this.loadGlobalTimestamp(),this.emit()}}loadGlobalTimestamp(){const Y=localStorage.getItem(`${this.name}_time`);this.globalTimestamp=Y?JSON.parse(Y):null}saveGlobalTimestamp(Y){this.globalTimestamp=Y,localStorage.setItem(`${this.name}_time`,JSON.stringify(Y))}initWorker(){try{const Y=URL.createObjectURL(new Blob([`(${a2.toString()})()`],{type:"application/javascript"}));this.worker=new Worker(Y),this.worker.addEventListener("message",({data:q})=>{console.log("Worker message:",`${q.name} ${q.type}`),URL.revokeObjectURL(Y)}),console.log("Worker initialized successfully.")}catch({message:Y}){console.error("Failed to initialize worker:",Y)}}getWorker(){return this.worker}emit(){this.eventListeners.forEach((Y)=>Y(this.graph.nodes))}compress(Y){return v1.deflate(Y)}decompress(Y){return v1.inflate(Y)}async getAllNodes(){return await this.ready,this.graph.getAllNodes()}async generateHash(){return crypto.randomUUID()}async hashValue(Y){const q=(new TextEncoder()).encode(Y),F=await crypto.subtle.digest("SHA-256",q);return Array.from(new Uint8Array(F)).map((O)=>O.toString(16).padStart(2,"0")).join("")}async loadGraphFromOPFS(){try{const q=await((F)=>new Promise((O,Z)=>{const N=async({data:J})=>{if(J.type==="loaded"&&J.name===F)this.worker.removeEventListener("message",N),O(new Uint8Array(J.data));else if(J.type==="error")this.worker.removeEventListener("message",N),Z(new Error(J.message||"Unknown error"))};this.worker.addEventListener("message",N),this.worker.postMessage({type:"load",name:F})}))(`${this.name}_graph.msgpack`).catch(()=>new Uint8Array);q.byteLength>0?this.graph.deserialize(q):console.warn("The file '_graph.msgpack' is empty or could not be loaded."),console.log(`Graph loaded from OPFS: [ ${this.graph.getAllNodes().length} nodes ]`)}catch({message:Y}){console.error("General error loading the graph from OPFS:",Y)}}async saveGraphToOPFS(){try{const Y=this.graph.serialize();return await((F,O)=>new Promise((Z,N)=>{const J=({data:C})=>{if(C.type==="saved"&&C.name===F)this.worker.removeEventListener("message",J),Z();else if(C.type==="error")this.worker.removeEventListener("message",J),N(new Error(C.message||"Save error"))};this.worker.addEventListener("message",J),this.worker.postMessage({type:"save",name:F,content:O})}))(`${this.name}_graph.msgpack`,Y),this.channel.postMessage("update"),!0}catch({message:Y}){throw console.error("Save error:",Y),new Error("Save failed")}}async put(Y,q){await this.ready;const F=this.hybridClock.now();return this.saveGlobalTimestamp(F),q??=await this.generateHash(),this.graph.insert(q,Y,F),await this.saveGraphToOPFS(),await this.sendData([{type:"insert",id:q,value:Y,timestamp:F}]),this.emit(),q}async get(Y,q=null){if(await this.ready,typeof Y!=="string")return{result:null};const F=this.graph.get(Y);if(!F){if(q)q(null);return{result:null}}const O=(J)=>{if(!J)return null;const C=J.value!==null&&typeof J.value==="object"?{...J.value}:J.value;return{...J,value:C}};if(!q)return{result:O(F)};let Z=F.timestamp;q(O(F));const N=(J)=>{const C=J[Y];if(C){if(this.hybridClock.compare(C.timestamp,Z)>0)Z=C.timestamp,q(O(C))}else q(null),this.eventListeners.splice(this.eventListeners.indexOf(N),1)};return this.eventListeners.push(N),{result:O(F),unsubscribe:()=>{const J=this.eventListeners.indexOf(N);if(J>-1)this.eventListeners.splice(J,1)}}}async map(...Y){await this.ready;let F={...{realtime:!1,query:{},field:null,order:"asc",$limit:null,$after:null,$before:null}},O=null,Z=!1;Y.forEach((B)=>typeof B==="function"?O=B:B&&typeof B==="object"&&(Z||=("realtime"in B),Object.assign(F,B))),O&&!Z&&(F.realtime=!0);let N=N9(this.graph.nodes,F),J=null;const C=(B)=>{const D=B.filter((R)=>!N.some((k)=>k.id===R.id)),L=N.filter((R)=>!B.some((k)=>k.id===R.id)),H=B.filter((R)=>{const k=N.find((v)=>v.id===R.id);return k&&!n2(L8(R.value),L8(k.value))}),P=(R,k)=>{const v=k==="removed"?null:R.value,M={id:R.id,value:v,edges:R.edges||[],timestamp:R.timestamp||null,action:k};O(M)};D.forEach((R)=>P(R,"added")),L.forEach((R)=>P(R,"removed")),H.forEach((R)=>P(R,"updated"))};if(O){if(N.forEach((B)=>{if(B.value)O({id:B.id,value:B.value,edges:B.edges,timestamp:B.timestamp,action:"initial"})}),F.realtime)J=(B)=>{const D=N9(B,F);if(!n2(L8(D),L8(N)))C(D),N=D},this.eventListeners.push(J)}return{results:N,...F.realtime&&O&&J&&{unsubscribe:()=>{const B=this.eventListeners.indexOf(J);B>-1&&this.eventListeners.splice(B,1)}}}}async remove(Y){await this.ready;const q=this.hybridClock.now(),F=this.graph.get(Y);if(!F)return console.error(`Node with ID '${Y}' not found.`);delete this.graph.nodes[Y],Object.values(this.graph.nodes).forEach((O)=>O.edges=O.edges.filter((Z)=>Z!==Y)),await this.saveGraphToOPFS(),this.saveGlobalTimestamp(q),await this.sendData([{type:"remove",id:Y,value:F.value,timestamp:q}]),this.emit()}async clear(){await this.ready,this.graph.nodes={};try{await(await navigator.storage.getDirectory()).removeEntry(`${this.name}_graph.msgpack`)}catch({message:Y}){console.warn(`Error deleting _graph.msgpack: ${Y}`)}this.emit(),console.log("All data has been deleted.")}async link(Y,q){await this.ready;const F=this.hybridClock.now();if(!this.graph.nodes[Y]||!this.graph.nodes[q]){console.error(`One or both nodes (${Y}, ${q}) do not exist.`);return}this.graph.link(Y,q),await this.saveGraphToOPFS(),this.saveGlobalTimestamp(F),await this.sendData([{type:"link",sourceId:Y,targetId:q,timestamp:F}]),this.emit()}async applyFullGraph(Y){try{console.log("Applying full graph from remote..."),this.graph.nodes={...Y.nodes},await this.saveGraphToOPFS()}catch({message:q}){console.error(`Error applying the full graph: ${q}`)}}async receiveChanges(Y){const q={insert:(F)=>{this.graph.insert(F.id,F.value,F.timestamp),this.hybridClock.update(F.timestamp)},update:(F)=>{const O=this.graph.get(F.id),Z=o2(O,F,this.hybridClock);if(Z.resolved)Object.assign(O,{value:Z.value,timestamp:Z.timestamp}),this.hybridClock.update(Z.timestamp)},remove:(F)=>{if(this.graph.nodes[F.id])this.hybridClock.update(F.timestamp),delete this.graph.nodes[F.id]},link:(F)=>{if(this.graph.nodes[F.sourceId]&&this.graph.nodes[F.targetId])this.graph.link(F.sourceId,F.targetId),this.hybridClock.update(F.timestamp)},sync:async(F)=>{if(console.log(F),this.hybridClock.update(F.timestamp),this.hybridClock.compare(this.globalTimestamp,F.timestamp)>0)console.log("Sending recent data to the remote node."),await this.sendData([{type:"syncReceive",graph:this.graph}])},syncReceive:async(F)=>await this.applyFullGraph(F.graph)};for(let F of Y)await q[F.type]?.(F);await this.saveGraphToOPFS(),this.emit()}}export{r1 as GDB};
package/dist/index.js.gz CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "genosdb",
3
- "version": "0.2.4",
3
+ "version": "0.2.7",
4
4
  "description2": "GenosDB (GDB): distributed graph database in real-time, peer-to-peer, scalable storage - efficient querying of complex relationships.",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -18,15 +18,14 @@
18
18
  "url": "git+https://github.com/estebanrfp/gdb.git"
19
19
  },
20
20
  "keywords": [
21
- "gdb",
22
21
  "GenosDB",
22
+ "gdb",
23
23
  "graph",
24
24
  "database",
25
- "realtime",
26
- "decentralized",
27
- "peer-to-peer",
25
+ "real-time",
26
+ "p2p",
28
27
  "distributed",
29
- "P2P",
28
+ "decentralized",
30
29
  "rbac"
31
30
  ],
32
31
  "author": {