dignity.js 0.1.0
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/LICENSE +201 -0
- package/README.md +197 -0
- package/dist/dignity.cjs.js +3585 -0
- package/dist/dignity.cjs.js.map +7 -0
- package/dist/dignity.esm.js +3606 -0
- package/dist/dignity.esm.js.map +7 -0
- package/dist/dignity.min.js +1 -0
- package/docs/assets/dignity-logo.svg +54 -0
- package/docs/assets/styles.css +68 -0
- package/docs/index.html +117 -0
- package/docs/openapi-like.json +64 -0
- package/examples/decentralized-chess-lite.js +102 -0
- package/examples/decentralized-tictactoe.js +112 -0
- package/package.json +53 -0
- package/src/core/dignity-p2p.js +604 -0
- package/src/index.js +41 -0
- package/src/network/in-memory-network.js +77 -0
- package/src/security/message-security-service.js +462 -0
- package/src/security/sloth-vdf.js +83 -0
- package/src/security/vdf.js +23 -0
- package/src/signaling/create-default-signaling-pool.js +44 -0
- package/src/signaling/default-signaling-config.js +15 -0
- package/src/signaling/signaling-pool.js +75 -0
- package/src/signaling/websocket-signaling-provider.js +69 -0
- package/src/utils/event-emitter.js +38 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var DignityJS=(()=>{var Ur=Object.defineProperty;var Tr=(y,r,a)=>r in y?Ur(y,r,{enumerable:!0,configurable:!0,writable:!0,value:a}):y[r]=a;var Jt=(y=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(y,{get:(r,a)=>(typeof require<"u"?require:r)[a]}):y)(function(y){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+y+'" is not supported')});var de=(y,r)=>()=>(r||y((r={exports:{}}).exports,r),r.exports);var Xt=(y,r,a)=>Tr(y,typeof r!="symbol"?r+"":r,a);var Qt=de((ef,kt)=>{var lt=class{constructor(){this.handlers=new Map}on(r,a){this.handlers.has(r)||this.handlers.set(r,new Set),this.handlers.get(r).add(a)}off(r,a){let o=this.handlers.get(r);o&&(o.delete(a),o.size===0&&this.handlers.delete(r))}emit(r,a){let o=this.handlers.get(r);if(o)for(let u of o)u(a)}};kt.exports=lt});var er=de(()=>{});var tr=de((ff,We)=>{(function(y){"use strict";var r=function(t){var n,f=new Float64Array(16);if(t)for(n=0;n<t.length;n++)f[n]=t[n];return f},a=function(){throw new Error("no PRNG")},o=new Uint8Array(16),u=new Uint8Array(32);u[0]=9;var l=r(),P=r([1]),k=r([56129,1]),ie=r([30883,4953,19914,30187,55467,16705,2637,112,59544,30585,16505,36039,65139,11119,27886,20995]),ge=r([61785,9906,39828,60374,45398,33411,5274,224,53552,61171,33010,6542,64743,22239,55772,9222]),Oe=r([54554,36645,11616,51542,42930,38181,51040,26924,56412,64982,57905,49316,21502,52590,14035,8553]),Ee=r([26200,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214]),je=r([41136,18958,6951,50414,58488,44335,6150,12099,55207,15867,153,11085,57099,20417,9344,11139]);function Re(t,n,f,e){t[n]=f>>24&255,t[n+1]=f>>16&255,t[n+2]=f>>8&255,t[n+3]=f&255,t[n+4]=e>>24&255,t[n+5]=e>>16&255,t[n+6]=e>>8&255,t[n+7]=e&255}function Je(t,n,f,e,s){var c,d=0;for(c=0;c<s;c++)d|=t[n+c]^f[e+c];return(1&d-1>>>8)-1}function Kt(t,n,f,e){return Je(t,n,f,e,16)}function Xe(t,n,f,e){return Je(t,n,f,e,32)}function Ir(t,n,f,e){for(var s=e[0]&255|(e[1]&255)<<8|(e[2]&255)<<16|(e[3]&255)<<24,c=f[0]&255|(f[1]&255)<<8|(f[2]&255)<<16|(f[3]&255)<<24,d=f[4]&255|(f[5]&255)<<8|(f[6]&255)<<16|(f[7]&255)<<24,b=f[8]&255|(f[9]&255)<<8|(f[10]&255)<<16|(f[11]&255)<<24,I=f[12]&255|(f[13]&255)<<8|(f[14]&255)<<16|(f[15]&255)<<24,U=e[4]&255|(e[5]&255)<<8|(e[6]&255)<<16|(e[7]&255)<<24,_=n[0]&255|(n[1]&255)<<8|(n[2]&255)<<16|(n[3]&255)<<24,W=n[4]&255|(n[5]&255)<<8|(n[6]&255)<<16|(n[7]&255)<<24,E=n[8]&255|(n[9]&255)<<8|(n[10]&255)<<16|(n[11]&255)<<24,L=n[12]&255|(n[13]&255)<<8|(n[14]&255)<<16|(n[15]&255)<<24,O=e[8]&255|(e[9]&255)<<8|(e[10]&255)<<16|(e[11]&255)<<24,C=f[16]&255|(f[17]&255)<<8|(f[18]&255)<<16|(f[19]&255)<<24,D=f[20]&255|(f[21]&255)<<8|(f[22]&255)<<16|(f[23]&255)<<24,j=f[24]&255|(f[25]&255)<<8|(f[26]&255)<<16|(f[27]&255)<<24,Y=f[28]&255|(f[29]&255)<<8|(f[30]&255)<<16|(f[31]&255)<<24,R=e[12]&255|(e[13]&255)<<8|(e[14]&255)<<16|(e[15]&255)<<24,B=s,T=c,A=d,m=b,M=I,S=U,x=_,h=W,w=E,p=L,g=O,v=C,K=D,N=j,z=Y,F=R,i,q=0;q<20;q+=2)i=B+K|0,M^=i<<7|i>>>25,i=M+B|0,w^=i<<9|i>>>23,i=w+M|0,K^=i<<13|i>>>19,i=K+w|0,B^=i<<18|i>>>14,i=S+T|0,p^=i<<7|i>>>25,i=p+S|0,N^=i<<9|i>>>23,i=N+p|0,T^=i<<13|i>>>19,i=T+N|0,S^=i<<18|i>>>14,i=g+x|0,z^=i<<7|i>>>25,i=z+g|0,A^=i<<9|i>>>23,i=A+z|0,x^=i<<13|i>>>19,i=x+A|0,g^=i<<18|i>>>14,i=F+v|0,m^=i<<7|i>>>25,i=m+F|0,h^=i<<9|i>>>23,i=h+m|0,v^=i<<13|i>>>19,i=v+h|0,F^=i<<18|i>>>14,i=B+m|0,T^=i<<7|i>>>25,i=T+B|0,A^=i<<9|i>>>23,i=A+T|0,m^=i<<13|i>>>19,i=m+A|0,B^=i<<18|i>>>14,i=S+M|0,x^=i<<7|i>>>25,i=x+S|0,h^=i<<9|i>>>23,i=h+x|0,M^=i<<13|i>>>19,i=M+h|0,S^=i<<18|i>>>14,i=g+p|0,v^=i<<7|i>>>25,i=v+g|0,w^=i<<9|i>>>23,i=w+v|0,p^=i<<13|i>>>19,i=p+w|0,g^=i<<18|i>>>14,i=F+z|0,K^=i<<7|i>>>25,i=K+F|0,N^=i<<9|i>>>23,i=N+K|0,z^=i<<13|i>>>19,i=z+N|0,F^=i<<18|i>>>14;B=B+s|0,T=T+c|0,A=A+d|0,m=m+b|0,M=M+I|0,S=S+U|0,x=x+_|0,h=h+W|0,w=w+E|0,p=p+L|0,g=g+O|0,v=v+C|0,K=K+D|0,N=N+j|0,z=z+Y|0,F=F+R|0,t[0]=B>>>0&255,t[1]=B>>>8&255,t[2]=B>>>16&255,t[3]=B>>>24&255,t[4]=T>>>0&255,t[5]=T>>>8&255,t[6]=T>>>16&255,t[7]=T>>>24&255,t[8]=A>>>0&255,t[9]=A>>>8&255,t[10]=A>>>16&255,t[11]=A>>>24&255,t[12]=m>>>0&255,t[13]=m>>>8&255,t[14]=m>>>16&255,t[15]=m>>>24&255,t[16]=M>>>0&255,t[17]=M>>>8&255,t[18]=M>>>16&255,t[19]=M>>>24&255,t[20]=S>>>0&255,t[21]=S>>>8&255,t[22]=S>>>16&255,t[23]=S>>>24&255,t[24]=x>>>0&255,t[25]=x>>>8&255,t[26]=x>>>16&255,t[27]=x>>>24&255,t[28]=h>>>0&255,t[29]=h>>>8&255,t[30]=h>>>16&255,t[31]=h>>>24&255,t[32]=w>>>0&255,t[33]=w>>>8&255,t[34]=w>>>16&255,t[35]=w>>>24&255,t[36]=p>>>0&255,t[37]=p>>>8&255,t[38]=p>>>16&255,t[39]=p>>>24&255,t[40]=g>>>0&255,t[41]=g>>>8&255,t[42]=g>>>16&255,t[43]=g>>>24&255,t[44]=v>>>0&255,t[45]=v>>>8&255,t[46]=v>>>16&255,t[47]=v>>>24&255,t[48]=K>>>0&255,t[49]=K>>>8&255,t[50]=K>>>16&255,t[51]=K>>>24&255,t[52]=N>>>0&255,t[53]=N>>>8&255,t[54]=N>>>16&255,t[55]=N>>>24&255,t[56]=z>>>0&255,t[57]=z>>>8&255,t[58]=z>>>16&255,t[59]=z>>>24&255,t[60]=F>>>0&255,t[61]=F>>>8&255,t[62]=F>>>16&255,t[63]=F>>>24&255}function Pr(t,n,f,e){for(var s=e[0]&255|(e[1]&255)<<8|(e[2]&255)<<16|(e[3]&255)<<24,c=f[0]&255|(f[1]&255)<<8|(f[2]&255)<<16|(f[3]&255)<<24,d=f[4]&255|(f[5]&255)<<8|(f[6]&255)<<16|(f[7]&255)<<24,b=f[8]&255|(f[9]&255)<<8|(f[10]&255)<<16|(f[11]&255)<<24,I=f[12]&255|(f[13]&255)<<8|(f[14]&255)<<16|(f[15]&255)<<24,U=e[4]&255|(e[5]&255)<<8|(e[6]&255)<<16|(e[7]&255)<<24,_=n[0]&255|(n[1]&255)<<8|(n[2]&255)<<16|(n[3]&255)<<24,W=n[4]&255|(n[5]&255)<<8|(n[6]&255)<<16|(n[7]&255)<<24,E=n[8]&255|(n[9]&255)<<8|(n[10]&255)<<16|(n[11]&255)<<24,L=n[12]&255|(n[13]&255)<<8|(n[14]&255)<<16|(n[15]&255)<<24,O=e[8]&255|(e[9]&255)<<8|(e[10]&255)<<16|(e[11]&255)<<24,C=f[16]&255|(f[17]&255)<<8|(f[18]&255)<<16|(f[19]&255)<<24,D=f[20]&255|(f[21]&255)<<8|(f[22]&255)<<16|(f[23]&255)<<24,j=f[24]&255|(f[25]&255)<<8|(f[26]&255)<<16|(f[27]&255)<<24,Y=f[28]&255|(f[29]&255)<<8|(f[30]&255)<<16|(f[31]&255)<<24,R=e[12]&255|(e[13]&255)<<8|(e[14]&255)<<16|(e[15]&255)<<24,B=s,T=c,A=d,m=b,M=I,S=U,x=_,h=W,w=E,p=L,g=O,v=C,K=D,N=j,z=Y,F=R,i,q=0;q<20;q+=2)i=B+K|0,M^=i<<7|i>>>25,i=M+B|0,w^=i<<9|i>>>23,i=w+M|0,K^=i<<13|i>>>19,i=K+w|0,B^=i<<18|i>>>14,i=S+T|0,p^=i<<7|i>>>25,i=p+S|0,N^=i<<9|i>>>23,i=N+p|0,T^=i<<13|i>>>19,i=T+N|0,S^=i<<18|i>>>14,i=g+x|0,z^=i<<7|i>>>25,i=z+g|0,A^=i<<9|i>>>23,i=A+z|0,x^=i<<13|i>>>19,i=x+A|0,g^=i<<18|i>>>14,i=F+v|0,m^=i<<7|i>>>25,i=m+F|0,h^=i<<9|i>>>23,i=h+m|0,v^=i<<13|i>>>19,i=v+h|0,F^=i<<18|i>>>14,i=B+m|0,T^=i<<7|i>>>25,i=T+B|0,A^=i<<9|i>>>23,i=A+T|0,m^=i<<13|i>>>19,i=m+A|0,B^=i<<18|i>>>14,i=S+M|0,x^=i<<7|i>>>25,i=x+S|0,h^=i<<9|i>>>23,i=h+x|0,M^=i<<13|i>>>19,i=M+h|0,S^=i<<18|i>>>14,i=g+p|0,v^=i<<7|i>>>25,i=v+g|0,w^=i<<9|i>>>23,i=w+v|0,p^=i<<13|i>>>19,i=p+w|0,g^=i<<18|i>>>14,i=F+z|0,K^=i<<7|i>>>25,i=K+F|0,N^=i<<9|i>>>23,i=N+K|0,z^=i<<13|i>>>19,i=z+N|0,F^=i<<18|i>>>14;t[0]=B>>>0&255,t[1]=B>>>8&255,t[2]=B>>>16&255,t[3]=B>>>24&255,t[4]=S>>>0&255,t[5]=S>>>8&255,t[6]=S>>>16&255,t[7]=S>>>24&255,t[8]=g>>>0&255,t[9]=g>>>8&255,t[10]=g>>>16&255,t[11]=g>>>24&255,t[12]=F>>>0&255,t[13]=F>>>8&255,t[14]=F>>>16&255,t[15]=F>>>24&255,t[16]=x>>>0&255,t[17]=x>>>8&255,t[18]=x>>>16&255,t[19]=x>>>24&255,t[20]=h>>>0&255,t[21]=h>>>8&255,t[22]=h>>>16&255,t[23]=h>>>24&255,t[24]=w>>>0&255,t[25]=w>>>8&255,t[26]=w>>>16&255,t[27]=w>>>24&255,t[28]=p>>>0&255,t[29]=p>>>8&255,t[30]=p>>>16&255,t[31]=p>>>24&255}function Ye(t,n,f,e){Ir(t,n,f,e)}function De(t,n,f,e){Pr(t,n,f,e)}var we=new Uint8Array([101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107]);function Lt(t,n,f,e,s,c,d){var b=new Uint8Array(16),I=new Uint8Array(64),U,_;for(_=0;_<16;_++)b[_]=0;for(_=0;_<8;_++)b[_]=c[_];for(;s>=64;){for(Ye(I,b,d,we),_=0;_<64;_++)t[n+_]=f[e+_]^I[_];for(U=1,_=8;_<16;_++)U=U+(b[_]&255)|0,b[_]=U&255,U>>>=8;s-=64,n+=64,e+=64}if(s>0)for(Ye(I,b,d,we),_=0;_<s;_++)t[n+_]=f[e+_]^I[_];return 0}function Ot(t,n,f,e,s){var c=new Uint8Array(16),d=new Uint8Array(64),b,I;for(I=0;I<16;I++)c[I]=0;for(I=0;I<8;I++)c[I]=e[I];for(;f>=64;){for(Ye(d,c,s,we),I=0;I<64;I++)t[n+I]=d[I];for(b=1,I=8;I<16;I++)b=b+(c[I]&255)|0,c[I]=b&255,b>>>=8;f-=64,n+=64}if(f>0)for(Ye(d,c,s,we),I=0;I<f;I++)t[n+I]=d[I];return 0}function jt(t,n,f,e,s){var c=new Uint8Array(32);De(c,e,s,we);for(var d=new Uint8Array(8),b=0;b<8;b++)d[b]=e[b+16];return Ot(t,n,f,d,c)}function ke(t,n,f,e,s,c,d){var b=new Uint8Array(32);De(b,c,d,we);for(var I=new Uint8Array(8),U=0;U<8;U++)I[U]=c[U+16];return Lt(t,n,f,e,s,I,b)}var Ce=function(t){this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.leftover=0,this.fin=0;var n,f,e,s,c,d,b,I;n=t[0]&255|(t[1]&255)<<8,this.r[0]=n&8191,f=t[2]&255|(t[3]&255)<<8,this.r[1]=(n>>>13|f<<3)&8191,e=t[4]&255|(t[5]&255)<<8,this.r[2]=(f>>>10|e<<6)&7939,s=t[6]&255|(t[7]&255)<<8,this.r[3]=(e>>>7|s<<9)&8191,c=t[8]&255|(t[9]&255)<<8,this.r[4]=(s>>>4|c<<12)&255,this.r[5]=c>>>1&8190,d=t[10]&255|(t[11]&255)<<8,this.r[6]=(c>>>14|d<<2)&8191,b=t[12]&255|(t[13]&255)<<8,this.r[7]=(d>>>11|b<<5)&8065,I=t[14]&255|(t[15]&255)<<8,this.r[8]=(b>>>8|I<<8)&8191,this.r[9]=I>>>5&127,this.pad[0]=t[16]&255|(t[17]&255)<<8,this.pad[1]=t[18]&255|(t[19]&255)<<8,this.pad[2]=t[20]&255|(t[21]&255)<<8,this.pad[3]=t[22]&255|(t[23]&255)<<8,this.pad[4]=t[24]&255|(t[25]&255)<<8,this.pad[5]=t[26]&255|(t[27]&255)<<8,this.pad[6]=t[28]&255|(t[29]&255)<<8,this.pad[7]=t[30]&255|(t[31]&255)<<8};Ce.prototype.blocks=function(t,n,f){for(var e=this.fin?0:2048,s,c,d,b,I,U,_,W,E,L,O,C,D,j,Y,R,B,T,A,m=this.h[0],M=this.h[1],S=this.h[2],x=this.h[3],h=this.h[4],w=this.h[5],p=this.h[6],g=this.h[7],v=this.h[8],K=this.h[9],N=this.r[0],z=this.r[1],F=this.r[2],i=this.r[3],q=this.r[4],Z=this.r[5],J=this.r[6],$=this.r[7],V=this.r[8],H=this.r[9];f>=16;)s=t[n+0]&255|(t[n+1]&255)<<8,m+=s&8191,c=t[n+2]&255|(t[n+3]&255)<<8,M+=(s>>>13|c<<3)&8191,d=t[n+4]&255|(t[n+5]&255)<<8,S+=(c>>>10|d<<6)&8191,b=t[n+6]&255|(t[n+7]&255)<<8,x+=(d>>>7|b<<9)&8191,I=t[n+8]&255|(t[n+9]&255)<<8,h+=(b>>>4|I<<12)&8191,w+=I>>>1&8191,U=t[n+10]&255|(t[n+11]&255)<<8,p+=(I>>>14|U<<2)&8191,_=t[n+12]&255|(t[n+13]&255)<<8,g+=(U>>>11|_<<5)&8191,W=t[n+14]&255|(t[n+15]&255)<<8,v+=(_>>>8|W<<8)&8191,K+=W>>>5|e,E=0,L=E,L+=m*N,L+=M*(5*H),L+=S*(5*V),L+=x*(5*$),L+=h*(5*J),E=L>>>13,L&=8191,L+=w*(5*Z),L+=p*(5*q),L+=g*(5*i),L+=v*(5*F),L+=K*(5*z),E+=L>>>13,L&=8191,O=E,O+=m*z,O+=M*N,O+=S*(5*H),O+=x*(5*V),O+=h*(5*$),E=O>>>13,O&=8191,O+=w*(5*J),O+=p*(5*Z),O+=g*(5*q),O+=v*(5*i),O+=K*(5*F),E+=O>>>13,O&=8191,C=E,C+=m*F,C+=M*z,C+=S*N,C+=x*(5*H),C+=h*(5*V),E=C>>>13,C&=8191,C+=w*(5*$),C+=p*(5*J),C+=g*(5*Z),C+=v*(5*q),C+=K*(5*i),E+=C>>>13,C&=8191,D=E,D+=m*i,D+=M*F,D+=S*z,D+=x*N,D+=h*(5*H),E=D>>>13,D&=8191,D+=w*(5*V),D+=p*(5*$),D+=g*(5*J),D+=v*(5*Z),D+=K*(5*q),E+=D>>>13,D&=8191,j=E,j+=m*q,j+=M*i,j+=S*F,j+=x*z,j+=h*N,E=j>>>13,j&=8191,j+=w*(5*H),j+=p*(5*V),j+=g*(5*$),j+=v*(5*J),j+=K*(5*Z),E+=j>>>13,j&=8191,Y=E,Y+=m*Z,Y+=M*q,Y+=S*i,Y+=x*F,Y+=h*z,E=Y>>>13,Y&=8191,Y+=w*N,Y+=p*(5*H),Y+=g*(5*V),Y+=v*(5*$),Y+=K*(5*J),E+=Y>>>13,Y&=8191,R=E,R+=m*J,R+=M*Z,R+=S*q,R+=x*i,R+=h*F,E=R>>>13,R&=8191,R+=w*z,R+=p*N,R+=g*(5*H),R+=v*(5*V),R+=K*(5*$),E+=R>>>13,R&=8191,B=E,B+=m*$,B+=M*J,B+=S*Z,B+=x*q,B+=h*i,E=B>>>13,B&=8191,B+=w*F,B+=p*z,B+=g*N,B+=v*(5*H),B+=K*(5*V),E+=B>>>13,B&=8191,T=E,T+=m*V,T+=M*$,T+=S*J,T+=x*Z,T+=h*q,E=T>>>13,T&=8191,T+=w*i,T+=p*F,T+=g*z,T+=v*N,T+=K*(5*H),E+=T>>>13,T&=8191,A=E,A+=m*H,A+=M*V,A+=S*$,A+=x*J,A+=h*Z,E=A>>>13,A&=8191,A+=w*q,A+=p*i,A+=g*F,A+=v*z,A+=K*N,E+=A>>>13,A&=8191,E=(E<<2)+E|0,E=E+L|0,L=E&8191,E=E>>>13,O+=E,m=L,M=O,S=C,x=D,h=j,w=Y,p=R,g=B,v=T,K=A,n+=16,f-=16;this.h[0]=m,this.h[1]=M,this.h[2]=S,this.h[3]=x,this.h[4]=h,this.h[5]=w,this.h[6]=p,this.h[7]=g,this.h[8]=v,this.h[9]=K},Ce.prototype.finish=function(t,n){var f=new Uint16Array(10),e,s,c,d;if(this.leftover){for(d=this.leftover,this.buffer[d++]=1;d<16;d++)this.buffer[d]=0;this.fin=1,this.blocks(this.buffer,0,16)}for(e=this.h[1]>>>13,this.h[1]&=8191,d=2;d<10;d++)this.h[d]+=e,e=this.h[d]>>>13,this.h[d]&=8191;for(this.h[0]+=e*5,e=this.h[0]>>>13,this.h[0]&=8191,this.h[1]+=e,e=this.h[1]>>>13,this.h[1]&=8191,this.h[2]+=e,f[0]=this.h[0]+5,e=f[0]>>>13,f[0]&=8191,d=1;d<10;d++)f[d]=this.h[d]+e,e=f[d]>>>13,f[d]&=8191;for(f[9]-=8192,s=(e^1)-1,d=0;d<10;d++)f[d]&=s;for(s=~s,d=0;d<10;d++)this.h[d]=this.h[d]&s|f[d];for(this.h[0]=(this.h[0]|this.h[1]<<13)&65535,this.h[1]=(this.h[1]>>>3|this.h[2]<<10)&65535,this.h[2]=(this.h[2]>>>6|this.h[3]<<7)&65535,this.h[3]=(this.h[3]>>>9|this.h[4]<<4)&65535,this.h[4]=(this.h[4]>>>12|this.h[5]<<1|this.h[6]<<14)&65535,this.h[5]=(this.h[6]>>>2|this.h[7]<<11)&65535,this.h[6]=(this.h[7]>>>5|this.h[8]<<8)&65535,this.h[7]=(this.h[8]>>>8|this.h[9]<<5)&65535,c=this.h[0]+this.pad[0],this.h[0]=c&65535,d=1;d<8;d++)c=(this.h[d]+this.pad[d]|0)+(c>>>16)|0,this.h[d]=c&65535;t[n+0]=this.h[0]>>>0&255,t[n+1]=this.h[0]>>>8&255,t[n+2]=this.h[1]>>>0&255,t[n+3]=this.h[1]>>>8&255,t[n+4]=this.h[2]>>>0&255,t[n+5]=this.h[2]>>>8&255,t[n+6]=this.h[3]>>>0&255,t[n+7]=this.h[3]>>>8&255,t[n+8]=this.h[4]>>>0&255,t[n+9]=this.h[4]>>>8&255,t[n+10]=this.h[5]>>>0&255,t[n+11]=this.h[5]>>>8&255,t[n+12]=this.h[6]>>>0&255,t[n+13]=this.h[6]>>>8&255,t[n+14]=this.h[7]>>>0&255,t[n+15]=this.h[7]>>>8&255},Ce.prototype.update=function(t,n,f){var e,s;if(this.leftover){for(s=16-this.leftover,s>f&&(s=f),e=0;e<s;e++)this.buffer[this.leftover+e]=t[n+e];if(f-=s,n+=s,this.leftover+=s,this.leftover<16)return;this.blocks(this.buffer,0,16),this.leftover=0}if(f>=16&&(s=f-f%16,this.blocks(t,n,s),n+=s,f-=s),f){for(e=0;e<f;e++)this.buffer[this.leftover+e]=t[n+e];this.leftover+=f}};function Qe(t,n,f,e,s,c){var d=new Ce(c);return d.update(f,e,s),d.finish(t,n),0}function Rt(t,n,f,e,s,c){var d=new Uint8Array(16);return Qe(d,0,f,e,s,c),Kt(t,n,d,0)}function et(t,n,f,e,s){var c;if(f<32)return-1;for(ke(t,0,n,0,f,e,s),Qe(t,16,t,32,f-32,t),c=0;c<16;c++)t[c]=0;return 0}function tt(t,n,f,e,s){var c,d=new Uint8Array(32);if(f<32||(jt(d,0,32,e,s),Rt(n,16,n,32,f-32,d)!==0))return-1;for(ke(t,0,n,0,f,e,s),c=0;c<32;c++)t[c]=0;return 0}function pe(t,n){var f;for(f=0;f<16;f++)t[f]=n[f]|0}function rt(t){var n,f,e=1;for(n=0;n<16;n++)f=t[n]+e+65535,e=Math.floor(f/65536),t[n]=f-e*65536;t[0]+=e-1+37*(e-1)}function Pe(t,n,f){for(var e,s=~(f-1),c=0;c<16;c++)e=s&(t[c]^n[c]),t[c]^=e,n[c]^=e}function Se(t,n){var f,e,s,c=r(),d=r();for(f=0;f<16;f++)d[f]=n[f];for(rt(d),rt(d),rt(d),e=0;e<2;e++){for(c[0]=d[0]-65517,f=1;f<15;f++)c[f]=d[f]-65535-(c[f-1]>>16&1),c[f-1]&=65535;c[15]=d[15]-32767-(c[14]>>16&1),s=c[15]>>16&1,c[14]&=65535,Pe(d,c,1-s)}for(f=0;f<16;f++)t[2*f]=d[f]&255,t[2*f+1]=d[f]>>8}function Yt(t,n){var f=new Uint8Array(32),e=new Uint8Array(32);return Se(f,t),Se(e,n),Xe(f,0,e,0)}function Dt(t){var n=new Uint8Array(32);return Se(n,t),n[0]&1}function ft(t,n){var f;for(f=0;f<16;f++)t[f]=n[2*f]+(n[2*f+1]<<8);t[15]&=32767}function le(t,n,f){for(var e=0;e<16;e++)t[e]=n[e]+f[e]}function ye(t,n,f){for(var e=0;e<16;e++)t[e]=n[e]-f[e]}function G(t,n,f){var e,s,c=0,d=0,b=0,I=0,U=0,_=0,W=0,E=0,L=0,O=0,C=0,D=0,j=0,Y=0,R=0,B=0,T=0,A=0,m=0,M=0,S=0,x=0,h=0,w=0,p=0,g=0,v=0,K=0,N=0,z=0,F=0,i=f[0],q=f[1],Z=f[2],J=f[3],$=f[4],V=f[5],H=f[6],fe=f[7],X=f[8],Q=f[9],ee=f[10],te=f[11],ne=f[12],ae=f[13],oe=f[14],ce=f[15];e=n[0],c+=e*i,d+=e*q,b+=e*Z,I+=e*J,U+=e*$,_+=e*V,W+=e*H,E+=e*fe,L+=e*X,O+=e*Q,C+=e*ee,D+=e*te,j+=e*ne,Y+=e*ae,R+=e*oe,B+=e*ce,e=n[1],d+=e*i,b+=e*q,I+=e*Z,U+=e*J,_+=e*$,W+=e*V,E+=e*H,L+=e*fe,O+=e*X,C+=e*Q,D+=e*ee,j+=e*te,Y+=e*ne,R+=e*ae,B+=e*oe,T+=e*ce,e=n[2],b+=e*i,I+=e*q,U+=e*Z,_+=e*J,W+=e*$,E+=e*V,L+=e*H,O+=e*fe,C+=e*X,D+=e*Q,j+=e*ee,Y+=e*te,R+=e*ne,B+=e*ae,T+=e*oe,A+=e*ce,e=n[3],I+=e*i,U+=e*q,_+=e*Z,W+=e*J,E+=e*$,L+=e*V,O+=e*H,C+=e*fe,D+=e*X,j+=e*Q,Y+=e*ee,R+=e*te,B+=e*ne,T+=e*ae,A+=e*oe,m+=e*ce,e=n[4],U+=e*i,_+=e*q,W+=e*Z,E+=e*J,L+=e*$,O+=e*V,C+=e*H,D+=e*fe,j+=e*X,Y+=e*Q,R+=e*ee,B+=e*te,T+=e*ne,A+=e*ae,m+=e*oe,M+=e*ce,e=n[5],_+=e*i,W+=e*q,E+=e*Z,L+=e*J,O+=e*$,C+=e*V,D+=e*H,j+=e*fe,Y+=e*X,R+=e*Q,B+=e*ee,T+=e*te,A+=e*ne,m+=e*ae,M+=e*oe,S+=e*ce,e=n[6],W+=e*i,E+=e*q,L+=e*Z,O+=e*J,C+=e*$,D+=e*V,j+=e*H,Y+=e*fe,R+=e*X,B+=e*Q,T+=e*ee,A+=e*te,m+=e*ne,M+=e*ae,S+=e*oe,x+=e*ce,e=n[7],E+=e*i,L+=e*q,O+=e*Z,C+=e*J,D+=e*$,j+=e*V,Y+=e*H,R+=e*fe,B+=e*X,T+=e*Q,A+=e*ee,m+=e*te,M+=e*ne,S+=e*ae,x+=e*oe,h+=e*ce,e=n[8],L+=e*i,O+=e*q,C+=e*Z,D+=e*J,j+=e*$,Y+=e*V,R+=e*H,B+=e*fe,T+=e*X,A+=e*Q,m+=e*ee,M+=e*te,S+=e*ne,x+=e*ae,h+=e*oe,w+=e*ce,e=n[9],O+=e*i,C+=e*q,D+=e*Z,j+=e*J,Y+=e*$,R+=e*V,B+=e*H,T+=e*fe,A+=e*X,m+=e*Q,M+=e*ee,S+=e*te,x+=e*ne,h+=e*ae,w+=e*oe,p+=e*ce,e=n[10],C+=e*i,D+=e*q,j+=e*Z,Y+=e*J,R+=e*$,B+=e*V,T+=e*H,A+=e*fe,m+=e*X,M+=e*Q,S+=e*ee,x+=e*te,h+=e*ne,w+=e*ae,p+=e*oe,g+=e*ce,e=n[11],D+=e*i,j+=e*q,Y+=e*Z,R+=e*J,B+=e*$,T+=e*V,A+=e*H,m+=e*fe,M+=e*X,S+=e*Q,x+=e*ee,h+=e*te,w+=e*ne,p+=e*ae,g+=e*oe,v+=e*ce,e=n[12],j+=e*i,Y+=e*q,R+=e*Z,B+=e*J,T+=e*$,A+=e*V,m+=e*H,M+=e*fe,S+=e*X,x+=e*Q,h+=e*ee,w+=e*te,p+=e*ne,g+=e*ae,v+=e*oe,K+=e*ce,e=n[13],Y+=e*i,R+=e*q,B+=e*Z,T+=e*J,A+=e*$,m+=e*V,M+=e*H,S+=e*fe,x+=e*X,h+=e*Q,w+=e*ee,p+=e*te,g+=e*ne,v+=e*ae,K+=e*oe,N+=e*ce,e=n[14],R+=e*i,B+=e*q,T+=e*Z,A+=e*J,m+=e*$,M+=e*V,S+=e*H,x+=e*fe,h+=e*X,w+=e*Q,p+=e*ee,g+=e*te,v+=e*ne,K+=e*ae,N+=e*oe,z+=e*ce,e=n[15],B+=e*i,T+=e*q,A+=e*Z,m+=e*J,M+=e*$,S+=e*V,x+=e*H,h+=e*fe,w+=e*X,p+=e*Q,g+=e*ee,v+=e*te,K+=e*ne,N+=e*ae,z+=e*oe,F+=e*ce,c+=38*T,d+=38*A,b+=38*m,I+=38*M,U+=38*S,_+=38*x,W+=38*h,E+=38*w,L+=38*p,O+=38*g,C+=38*v,D+=38*K,j+=38*N,Y+=38*z,R+=38*F,s=1,e=c+s+65535,s=Math.floor(e/65536),c=e-s*65536,e=d+s+65535,s=Math.floor(e/65536),d=e-s*65536,e=b+s+65535,s=Math.floor(e/65536),b=e-s*65536,e=I+s+65535,s=Math.floor(e/65536),I=e-s*65536,e=U+s+65535,s=Math.floor(e/65536),U=e-s*65536,e=_+s+65535,s=Math.floor(e/65536),_=e-s*65536,e=W+s+65535,s=Math.floor(e/65536),W=e-s*65536,e=E+s+65535,s=Math.floor(e/65536),E=e-s*65536,e=L+s+65535,s=Math.floor(e/65536),L=e-s*65536,e=O+s+65535,s=Math.floor(e/65536),O=e-s*65536,e=C+s+65535,s=Math.floor(e/65536),C=e-s*65536,e=D+s+65535,s=Math.floor(e/65536),D=e-s*65536,e=j+s+65535,s=Math.floor(e/65536),j=e-s*65536,e=Y+s+65535,s=Math.floor(e/65536),Y=e-s*65536,e=R+s+65535,s=Math.floor(e/65536),R=e-s*65536,e=B+s+65535,s=Math.floor(e/65536),B=e-s*65536,c+=s-1+37*(s-1),s=1,e=c+s+65535,s=Math.floor(e/65536),c=e-s*65536,e=d+s+65535,s=Math.floor(e/65536),d=e-s*65536,e=b+s+65535,s=Math.floor(e/65536),b=e-s*65536,e=I+s+65535,s=Math.floor(e/65536),I=e-s*65536,e=U+s+65535,s=Math.floor(e/65536),U=e-s*65536,e=_+s+65535,s=Math.floor(e/65536),_=e-s*65536,e=W+s+65535,s=Math.floor(e/65536),W=e-s*65536,e=E+s+65535,s=Math.floor(e/65536),E=e-s*65536,e=L+s+65535,s=Math.floor(e/65536),L=e-s*65536,e=O+s+65535,s=Math.floor(e/65536),O=e-s*65536,e=C+s+65535,s=Math.floor(e/65536),C=e-s*65536,e=D+s+65535,s=Math.floor(e/65536),D=e-s*65536,e=j+s+65535,s=Math.floor(e/65536),j=e-s*65536,e=Y+s+65535,s=Math.floor(e/65536),Y=e-s*65536,e=R+s+65535,s=Math.floor(e/65536),R=e-s*65536,e=B+s+65535,s=Math.floor(e/65536),B=e-s*65536,c+=s-1+37*(s-1),t[0]=c,t[1]=d,t[2]=b,t[3]=I,t[4]=U,t[5]=_,t[6]=W,t[7]=E,t[8]=L,t[9]=O,t[10]=C,t[11]=D,t[12]=j,t[13]=Y,t[14]=R,t[15]=B}function ue(t,n){G(t,n,n)}function Ct(t,n){var f=r(),e;for(e=0;e<16;e++)f[e]=n[e];for(e=253;e>=0;e--)ue(f,f),e!==2&&e!==4&&G(f,f,n);for(e=0;e<16;e++)t[e]=f[e]}function Nt(t,n){var f=r(),e;for(e=0;e<16;e++)f[e]=n[e];for(e=250;e>=0;e--)ue(f,f),e!==1&&G(f,f,n);for(e=0;e<16;e++)t[e]=f[e]}function Ne(t,n,f){var e=new Uint8Array(32),s=new Float64Array(80),c,d,b=r(),I=r(),U=r(),_=r(),W=r(),E=r();for(d=0;d<31;d++)e[d]=n[d];for(e[31]=n[31]&127|64,e[0]&=248,ft(s,f),d=0;d<16;d++)I[d]=s[d],_[d]=b[d]=U[d]=0;for(b[0]=_[0]=1,d=254;d>=0;--d)c=e[d>>>3]>>>(d&7)&1,Pe(b,I,c),Pe(U,_,c),le(W,b,U),ye(b,b,U),le(U,I,_),ye(I,I,_),ue(_,W),ue(E,b),G(b,U,b),G(U,I,W),le(W,b,U),ye(b,b,U),ue(I,b),ye(U,_,E),G(b,U,k),le(b,b,_),G(U,U,b),G(b,_,E),G(_,I,s),ue(I,W),Pe(b,I,c),Pe(U,_,c);for(d=0;d<16;d++)s[d+16]=b[d],s[d+32]=U[d],s[d+48]=I[d],s[d+64]=_[d];var L=s.subarray(32),O=s.subarray(16);return Ct(L,L),G(O,O,L),Se(t,O),0}function Fe(t,n){return Ne(t,n,u)}function Ft(t,n){return a(n,32),Fe(t,n)}function ze(t,n,f){var e=new Uint8Array(32);return Ne(e,f,n),De(t,o,e,we)}var zt=et,Sr=tt;function _r(t,n,f,e,s,c){var d=new Uint8Array(32);return ze(d,s,c),zt(t,n,f,e,d)}function Ar(t,n,f,e,s,c){var d=new Uint8Array(32);return ze(d,s,c),Sr(t,n,f,e,d)}var $t=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591];function qt(t,n,f,e){for(var s=new Int32Array(16),c=new Int32Array(16),d,b,I,U,_,W,E,L,O,C,D,j,Y,R,B,T,A,m,M,S,x,h,w,p,g,v,K=t[0],N=t[1],z=t[2],F=t[3],i=t[4],q=t[5],Z=t[6],J=t[7],$=n[0],V=n[1],H=n[2],fe=n[3],X=n[4],Q=n[5],ee=n[6],te=n[7],ne=0;e>=128;){for(M=0;M<16;M++)S=8*M+ne,s[M]=f[S+0]<<24|f[S+1]<<16|f[S+2]<<8|f[S+3],c[M]=f[S+4]<<24|f[S+5]<<16|f[S+6]<<8|f[S+7];for(M=0;M<80;M++)if(d=K,b=N,I=z,U=F,_=i,W=q,E=Z,L=J,O=$,C=V,D=H,j=fe,Y=X,R=Q,B=ee,T=te,x=J,h=te,w=h&65535,p=h>>>16,g=x&65535,v=x>>>16,x=(i>>>14|X<<18)^(i>>>18|X<<14)^(X>>>9|i<<23),h=(X>>>14|i<<18)^(X>>>18|i<<14)^(i>>>9|X<<23),w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,x=i&q^~i&Z,h=X&Q^~X&ee,w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,x=$t[M*2],h=$t[M*2+1],w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,x=s[M%16],h=c[M%16],w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,p+=w>>>16,g+=p>>>16,v+=g>>>16,A=g&65535|v<<16,m=w&65535|p<<16,x=A,h=m,w=h&65535,p=h>>>16,g=x&65535,v=x>>>16,x=(K>>>28|$<<4)^($>>>2|K<<30)^($>>>7|K<<25),h=($>>>28|K<<4)^(K>>>2|$<<30)^(K>>>7|$<<25),w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,x=K&N^K&z^N&z,h=$&V^$&H^V&H,w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,p+=w>>>16,g+=p>>>16,v+=g>>>16,L=g&65535|v<<16,T=w&65535|p<<16,x=U,h=j,w=h&65535,p=h>>>16,g=x&65535,v=x>>>16,x=A,h=m,w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,p+=w>>>16,g+=p>>>16,v+=g>>>16,U=g&65535|v<<16,j=w&65535|p<<16,N=d,z=b,F=I,i=U,q=_,Z=W,J=E,K=L,V=O,H=C,fe=D,X=j,Q=Y,ee=R,te=B,$=T,M%16===15)for(S=0;S<16;S++)x=s[S],h=c[S],w=h&65535,p=h>>>16,g=x&65535,v=x>>>16,x=s[(S+9)%16],h=c[(S+9)%16],w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,A=s[(S+1)%16],m=c[(S+1)%16],x=(A>>>1|m<<31)^(A>>>8|m<<24)^A>>>7,h=(m>>>1|A<<31)^(m>>>8|A<<24)^(m>>>7|A<<25),w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,A=s[(S+14)%16],m=c[(S+14)%16],x=(A>>>19|m<<13)^(m>>>29|A<<3)^A>>>6,h=(m>>>19|A<<13)^(A>>>29|m<<3)^(m>>>6|A<<26),w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,p+=w>>>16,g+=p>>>16,v+=g>>>16,s[S]=g&65535|v<<16,c[S]=w&65535|p<<16;x=K,h=$,w=h&65535,p=h>>>16,g=x&65535,v=x>>>16,x=t[0],h=n[0],w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,p+=w>>>16,g+=p>>>16,v+=g>>>16,t[0]=K=g&65535|v<<16,n[0]=$=w&65535|p<<16,x=N,h=V,w=h&65535,p=h>>>16,g=x&65535,v=x>>>16,x=t[1],h=n[1],w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,p+=w>>>16,g+=p>>>16,v+=g>>>16,t[1]=N=g&65535|v<<16,n[1]=V=w&65535|p<<16,x=z,h=H,w=h&65535,p=h>>>16,g=x&65535,v=x>>>16,x=t[2],h=n[2],w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,p+=w>>>16,g+=p>>>16,v+=g>>>16,t[2]=z=g&65535|v<<16,n[2]=H=w&65535|p<<16,x=F,h=fe,w=h&65535,p=h>>>16,g=x&65535,v=x>>>16,x=t[3],h=n[3],w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,p+=w>>>16,g+=p>>>16,v+=g>>>16,t[3]=F=g&65535|v<<16,n[3]=fe=w&65535|p<<16,x=i,h=X,w=h&65535,p=h>>>16,g=x&65535,v=x>>>16,x=t[4],h=n[4],w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,p+=w>>>16,g+=p>>>16,v+=g>>>16,t[4]=i=g&65535|v<<16,n[4]=X=w&65535|p<<16,x=q,h=Q,w=h&65535,p=h>>>16,g=x&65535,v=x>>>16,x=t[5],h=n[5],w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,p+=w>>>16,g+=p>>>16,v+=g>>>16,t[5]=q=g&65535|v<<16,n[5]=Q=w&65535|p<<16,x=Z,h=ee,w=h&65535,p=h>>>16,g=x&65535,v=x>>>16,x=t[6],h=n[6],w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,p+=w>>>16,g+=p>>>16,v+=g>>>16,t[6]=Z=g&65535|v<<16,n[6]=ee=w&65535|p<<16,x=J,h=te,w=h&65535,p=h>>>16,g=x&65535,v=x>>>16,x=t[7],h=n[7],w+=h&65535,p+=h>>>16,g+=x&65535,v+=x>>>16,p+=w>>>16,g+=p>>>16,v+=g>>>16,t[7]=J=g&65535|v<<16,n[7]=te=w&65535|p<<16,ne+=128,e-=128}return e}function ve(t,n,f){var e=new Int32Array(8),s=new Int32Array(8),c=new Uint8Array(256),d,b=f;for(e[0]=1779033703,e[1]=3144134277,e[2]=1013904242,e[3]=2773480762,e[4]=1359893119,e[5]=2600822924,e[6]=528734635,e[7]=1541459225,s[0]=4089235720,s[1]=2227873595,s[2]=4271175723,s[3]=1595750129,s[4]=2917565137,s[5]=725511199,s[6]=4215389547,s[7]=327033209,qt(e,s,n,f),f%=128,d=0;d<f;d++)c[d]=n[b-f+d];for(c[f]=128,f=256-128*(f<112?1:0),c[f-9]=0,Re(c,f-8,b/536870912|0,b<<3),qt(e,s,c,f),d=0;d<8;d++)Re(t,8*d,e[d],s[d]);return 0}function $e(t,n){var f=r(),e=r(),s=r(),c=r(),d=r(),b=r(),I=r(),U=r(),_=r();ye(f,t[1],t[0]),ye(_,n[1],n[0]),G(f,f,_),le(e,t[0],t[1]),le(_,n[0],n[1]),G(e,e,_),G(s,t[3],n[3]),G(s,s,ge),G(c,t[2],n[2]),le(c,c,c),ye(d,e,f),ye(b,c,s),le(I,c,s),le(U,e,f),G(t[0],d,b),G(t[1],U,I),G(t[2],I,b),G(t[3],d,U)}function Gt(t,n,f){var e;for(e=0;e<4;e++)Pe(t[e],n[e],f)}function nt(t,n){var f=r(),e=r(),s=r();Ct(s,n[2]),G(f,n[0],s),G(e,n[1],s),Se(t,e),t[31]^=Dt(f)<<7}function st(t,n,f){var e,s;for(pe(t[0],l),pe(t[1],P),pe(t[2],P),pe(t[3],l),s=255;s>=0;--s)e=f[s/8|0]>>(s&7)&1,Gt(t,n,e),$e(n,t),$e(t,t),Gt(t,n,e)}function qe(t,n){var f=[r(),r(),r(),r()];pe(f[0],Oe),pe(f[1],Ee),pe(f[2],P),G(f[3],Oe,Ee),st(t,f,n)}function it(t,n,f){var e=new Uint8Array(64),s=[r(),r(),r(),r()],c;for(f||a(n,32),ve(e,n,32),e[0]&=248,e[31]&=127,e[31]|=64,qe(s,e),nt(t,s),c=0;c<32;c++)n[c+32]=t[c];return 0}var Ge=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]);function at(t,n){var f,e,s,c;for(e=63;e>=32;--e){for(f=0,s=e-32,c=e-12;s<c;++s)n[s]+=f-16*n[e]*Ge[s-(e-32)],f=Math.floor((n[s]+128)/256),n[s]-=f*256;n[s]+=f,n[e]=0}for(f=0,s=0;s<32;s++)n[s]+=f-(n[31]>>4)*Ge[s],f=n[s]>>8,n[s]&=255;for(s=0;s<32;s++)n[s]-=f*Ge[s];for(e=0;e<32;e++)n[e+1]+=n[e]>>8,t[e]=n[e]&255}function ot(t){var n=new Float64Array(64),f;for(f=0;f<64;f++)n[f]=t[f];for(f=0;f<64;f++)t[f]=0;at(t,n)}function Vt(t,n,f,e){var s=new Uint8Array(64),c=new Uint8Array(64),d=new Uint8Array(64),b,I,U=new Float64Array(64),_=[r(),r(),r(),r()];ve(s,e,32),s[0]&=248,s[31]&=127,s[31]|=64;var W=f+64;for(b=0;b<f;b++)t[64+b]=n[b];for(b=0;b<32;b++)t[32+b]=s[32+b];for(ve(d,t.subarray(32),f+32),ot(d),qe(_,d),nt(t,_),b=32;b<64;b++)t[b]=e[b];for(ve(c,t,f+64),ot(c),b=0;b<64;b++)U[b]=0;for(b=0;b<32;b++)U[b]=d[b];for(b=0;b<32;b++)for(I=0;I<32;I++)U[b+I]+=c[b]*s[I];return at(t.subarray(32),U),W}function Er(t,n){var f=r(),e=r(),s=r(),c=r(),d=r(),b=r(),I=r();return pe(t[2],P),ft(t[1],n),ue(s,t[1]),G(c,s,ie),ye(s,s,t[2]),le(c,t[2],c),ue(d,c),ue(b,d),G(I,b,d),G(f,I,s),G(f,f,c),Nt(f,f),G(f,f,s),G(f,f,c),G(f,f,c),G(t[0],f,c),ue(e,t[0]),G(e,e,c),Yt(e,s)&&G(t[0],t[0],je),ue(e,t[0]),G(e,e,c),Yt(e,s)?-1:(Dt(t[0])===n[31]>>7&&ye(t[0],l,t[0]),G(t[3],t[0],t[1]),0)}function ct(t,n,f,e){var s,c=new Uint8Array(32),d=new Uint8Array(64),b=[r(),r(),r(),r()],I=[r(),r(),r(),r()];if(f<64||Er(I,e))return-1;for(s=0;s<f;s++)t[s]=n[s];for(s=0;s<32;s++)t[s+32]=e[s];if(ve(d,t,f),ot(d),st(b,I,d),qe(I,n.subarray(32)),$e(b,I),nt(c,b),f-=64,Xe(n,0,c,0)){for(s=0;s<f;s++)t[s]=0;return-1}for(s=0;s<f;s++)t[s]=n[s+64];return f}var dt=32,Ve=24,Be=32,_e=16,me=32,He=32,Me=32,Ue=32,xt=32,Ht=Ve,Br=Be,mr=_e,be=64,Ie=32,Ae=64,ht=32,ut=64;y.lowlevel={crypto_core_hsalsa20:De,crypto_stream_xor:ke,crypto_stream:jt,crypto_stream_salsa20_xor:Lt,crypto_stream_salsa20:Ot,crypto_onetimeauth:Qe,crypto_onetimeauth_verify:Rt,crypto_verify_16:Kt,crypto_verify_32:Xe,crypto_secretbox:et,crypto_secretbox_open:tt,crypto_scalarmult:Ne,crypto_scalarmult_base:Fe,crypto_box_beforenm:ze,crypto_box_afternm:zt,crypto_box:_r,crypto_box_open:Ar,crypto_box_keypair:Ft,crypto_hash:ve,crypto_sign:Vt,crypto_sign_keypair:it,crypto_sign_open:ct,crypto_secretbox_KEYBYTES:dt,crypto_secretbox_NONCEBYTES:Ve,crypto_secretbox_ZEROBYTES:Be,crypto_secretbox_BOXZEROBYTES:_e,crypto_scalarmult_BYTES:me,crypto_scalarmult_SCALARBYTES:He,crypto_box_PUBLICKEYBYTES:Me,crypto_box_SECRETKEYBYTES:Ue,crypto_box_BEFORENMBYTES:xt,crypto_box_NONCEBYTES:Ht,crypto_box_ZEROBYTES:Br,crypto_box_BOXZEROBYTES:mr,crypto_sign_BYTES:be,crypto_sign_PUBLICKEYBYTES:Ie,crypto_sign_SECRETKEYBYTES:Ae,crypto_sign_SEEDBYTES:ht,crypto_hash_BYTES:ut,gf:r,D:ie,L:Ge,pack25519:Se,unpack25519:ft,M:G,A:le,S:ue,Z:ye,pow2523:Nt,add:$e,set25519:pe,modL:at,scalarmult:st,scalarbase:qe};function Wt(t,n){if(t.length!==dt)throw new Error("bad key size");if(n.length!==Ve)throw new Error("bad nonce size")}function Mr(t,n){if(t.length!==Me)throw new Error("bad public key size");if(n.length!==Ue)throw new Error("bad secret key size")}function he(){for(var t=0;t<arguments.length;t++)if(!(arguments[t]instanceof Uint8Array))throw new TypeError("unexpected type, use Uint8Array")}function Zt(t){for(var n=0;n<t.length;n++)t[n]=0}y.randomBytes=function(t){var n=new Uint8Array(t);return a(n,t),n},y.secretbox=function(t,n,f){he(t,n,f),Wt(f,n);for(var e=new Uint8Array(Be+t.length),s=new Uint8Array(e.length),c=0;c<t.length;c++)e[c+Be]=t[c];return et(s,e,e.length,n,f),s.subarray(_e)},y.secretbox.open=function(t,n,f){he(t,n,f),Wt(f,n);for(var e=new Uint8Array(_e+t.length),s=new Uint8Array(e.length),c=0;c<t.length;c++)e[c+_e]=t[c];return e.length<32||tt(s,e,e.length,n,f)!==0?null:s.subarray(Be)},y.secretbox.keyLength=dt,y.secretbox.nonceLength=Ve,y.secretbox.overheadLength=_e,y.scalarMult=function(t,n){if(he(t,n),t.length!==He)throw new Error("bad n size");if(n.length!==me)throw new Error("bad p size");var f=new Uint8Array(me);return Ne(f,t,n),f},y.scalarMult.base=function(t){if(he(t),t.length!==He)throw new Error("bad n size");var n=new Uint8Array(me);return Fe(n,t),n},y.scalarMult.scalarLength=He,y.scalarMult.groupElementLength=me,y.box=function(t,n,f,e){var s=y.box.before(f,e);return y.secretbox(t,n,s)},y.box.before=function(t,n){he(t,n),Mr(t,n);var f=new Uint8Array(xt);return ze(f,t,n),f},y.box.after=y.secretbox,y.box.open=function(t,n,f,e){var s=y.box.before(f,e);return y.secretbox.open(t,n,s)},y.box.open.after=y.secretbox.open,y.box.keyPair=function(){var t=new Uint8Array(Me),n=new Uint8Array(Ue);return Ft(t,n),{publicKey:t,secretKey:n}},y.box.keyPair.fromSecretKey=function(t){if(he(t),t.length!==Ue)throw new Error("bad secret key size");var n=new Uint8Array(Me);return Fe(n,t),{publicKey:n,secretKey:new Uint8Array(t)}},y.box.publicKeyLength=Me,y.box.secretKeyLength=Ue,y.box.sharedKeyLength=xt,y.box.nonceLength=Ht,y.box.overheadLength=y.secretbox.overheadLength,y.sign=function(t,n){if(he(t,n),n.length!==Ae)throw new Error("bad secret key size");var f=new Uint8Array(be+t.length);return Vt(f,t,t.length,n),f},y.sign.open=function(t,n){if(he(t,n),n.length!==Ie)throw new Error("bad public key size");var f=new Uint8Array(t.length),e=ct(f,t,t.length,n);if(e<0)return null;for(var s=new Uint8Array(e),c=0;c<s.length;c++)s[c]=f[c];return s},y.sign.detached=function(t,n){for(var f=y.sign(t,n),e=new Uint8Array(be),s=0;s<e.length;s++)e[s]=f[s];return e},y.sign.detached.verify=function(t,n,f){if(he(t,n,f),n.length!==be)throw new Error("bad signature size");if(f.length!==Ie)throw new Error("bad public key size");var e=new Uint8Array(be+t.length),s=new Uint8Array(be+t.length),c;for(c=0;c<be;c++)e[c]=n[c];for(c=0;c<t.length;c++)e[c+be]=t[c];return ct(s,e,e.length,f)>=0},y.sign.keyPair=function(){var t=new Uint8Array(Ie),n=new Uint8Array(Ae);return it(t,n),{publicKey:t,secretKey:n}},y.sign.keyPair.fromSecretKey=function(t){if(he(t),t.length!==Ae)throw new Error("bad secret key size");for(var n=new Uint8Array(Ie),f=0;f<n.length;f++)n[f]=t[32+f];return{publicKey:n,secretKey:new Uint8Array(t)}},y.sign.keyPair.fromSeed=function(t){if(he(t),t.length!==ht)throw new Error("bad seed size");for(var n=new Uint8Array(Ie),f=new Uint8Array(Ae),e=0;e<32;e++)f[e]=t[e];return it(n,f,!0),{publicKey:n,secretKey:f}},y.sign.publicKeyLength=Ie,y.sign.secretKeyLength=Ae,y.sign.seedLength=ht,y.sign.signatureLength=be,y.hash=function(t){he(t);var n=new Uint8Array(ut);return ve(n,t,t.length),n},y.hash.hashLength=ut,y.verify=function(t,n){return he(t,n),t.length===0||n.length===0||t.length!==n.length?!1:Je(t,0,n,0,t.length)===0},y.setPRNG=function(t){a=t},(function(){var t=typeof self<"u"?self.crypto||self.msCrypto:null;if(t&&t.getRandomValues){var n=65536;y.setPRNG(function(f,e){var s,c=new Uint8Array(e);for(s=0;s<e;s+=n)t.getRandomValues(c.subarray(s,s+Math.min(e-s,n)));for(s=0;s<e;s++)f[s]=c[s];Zt(c)})}else typeof Jt<"u"&&(t=er(),t&&t.randomBytes&&y.setPRNG(function(f,e){var s,c=t.randomBytes(e);for(s=0;s<e;s++)f[s]=c[s];Zt(c)}))})()})(typeof We<"u"&&We.exports?We.exports:self.nacl=self.nacl||{})});var fr=de((rr,Ze)=>{(function(y,r){"use strict";typeof Ze<"u"&&Ze.exports?Ze.exports=r():(y.nacl||(y.nacl={}),y.nacl.util=r())})(rr,function(){"use strict";var y={};function r(a){if(!/^(?:[A-Za-z0-9+\/]{2}[A-Za-z0-9+\/]{2})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?$/.test(a))throw new TypeError("invalid encoding")}return y.decodeUTF8=function(a){if(typeof a!="string")throw new TypeError("expected string");var o,u=unescape(encodeURIComponent(a)),l=new Uint8Array(u.length);for(o=0;o<u.length;o++)l[o]=u.charCodeAt(o);return l},y.encodeUTF8=function(a){var o,u=[];for(o=0;o<a.length;o++)u.push(String.fromCharCode(a[o]));return decodeURIComponent(escape(u.join("")))},typeof atob>"u"?typeof Buffer.from<"u"?(y.encodeBase64=function(a){return Buffer.from(a).toString("base64")},y.decodeBase64=function(a){return r(a),new Uint8Array(Array.prototype.slice.call(Buffer.from(a,"base64"),0))}):(y.encodeBase64=function(a){return new Buffer(a).toString("base64")},y.decodeBase64=function(a){return r(a),new Uint8Array(Array.prototype.slice.call(new Buffer(a,"base64"),0))}):(y.encodeBase64=function(a){var o,u=[],l=a.length;for(o=0;o<l;o++)u.push(String.fromCharCode(a[o]));return btoa(u.join(""))},y.decodeBase64=function(a){r(a);var o,u=atob(a),l=new Uint8Array(u.length);for(o=0;o<u.length;o++)l[o]=u.charCodeAt(o);return l}),y})});var pt=de((sf,nr)=>{var se=class se{fastPow(r,a,o){if(o===BigInt(1))return BigInt(0);let u=BigInt(1),l=r%o,P=a;for(;P>0;)P%BigInt(2)===BigInt(1)&&(u=u*l%o),P=P/BigInt(2),l=l*l%o;return u}quadRes(r){return this.fastPow(r,(se.p-BigInt(1))/BigInt(2),se.p)===BigInt(1)}modSqrtOp(r){let a,o=r;return this.quadRes(o)?a=this.fastPow(o,(se.p+BigInt(1))/BigInt(4),se.p):(o=(-o+se.p)%se.p,a=this.fastPow(o,(se.p+BigInt(1))/BigInt(4),se.p)),a}modOp(r,a){let o=r%se.p;for(let u=BigInt(0);u<a;u+=BigInt(1))o=this.modSqrtOp(o);return o}modVerif(r,a,o){let u=a%se.p,l=r;for(let P=BigInt(0);P<o;P+=BigInt(1))l=l**BigInt(2)%se.p;return this.quadRes(l)||(l=(-l+se.p)%se.p),u===l||(-u+se.p)%se.p===l}generateProofVDF(r,a){return this.modOp(a,r)}verifyProofVDF(r,a,o){return this.modVerif(o,a,r)}};Xt(se,"p",BigInt("170082004324204494273811327264862981553264701145937538369570764779791492622392118654022654452947093285873855529044371650895045691292912712699015605832276411308653107069798639938826015099738961427172366594187783204437869906954750443653318078358839409699824714551430573905637228307966826784684174483831608534979"));var yt=se;nr.exports=yt});var gt=de((of,ir)=>{var sr=pt(),bt=class{static async compute(r,a){let o=new sr,u=BigInt(`0x${r}`);return o.generateProofVDF(a,u).toString(16)}static async verify(r,a,o){let u=new sr,l=BigInt(`0x${r}`),P=BigInt(`0x${o}`);return u.verifyProofVDF(a,l,P)}};ir.exports=bt});var St=de((cf,cr)=>{var xe=tr(),re=fr(),wt=gt(),or={enabled:!0,signingEnabled:!0,encryptionEnabled:!0,powEnabled:!0,powTargetMs:1e3,appPassword:"change-this-app-password",broadcastPasswords:{},resolveBroadcastPassword:null,powSteps:22,trustedPeerKeys:{}};function Le(y){return y===null||typeof y!="object"?JSON.stringify(y):Array.isArray(y)?`[${y.map(a=>Le(a)).join(",")}]`:`{${Object.keys(y).sort().map(a=>`${JSON.stringify(a)}:${Le(y[a])}`).join(",")}}`}function ar(y,r){let a=new Uint8Array(y.length+r.length);return a.set(y,0),a.set(r,y.length),a}function Te(y){return xe.hash(y).slice(0,32)}function vt(y){return Array.from(y,r=>r.toString(16).padStart(2,"0")).join("")}function Ke(y){return re.decodeUTF8(y)}function It(y){if(!y||typeof y!="object")throw new Error("Public key must be an object with signingPublicKey and encryptionPublicKey");if(!y.signingPublicKey||!y.encryptionPublicKey)throw new Error("Public key object is missing signingPublicKey or encryptionPublicKey");return{signingPublicKey:y.signingPublicKey,encryptionPublicKey:y.encryptionPublicKey}}var Pt=class{constructor({nodeId:r,options:a={},now:o}={}){if(!r)throw new Error("MessageSecurityService requires nodeId");this.nodeId=r,this.options={...or,...a},this.now=o||(()=>Date.now());let u=a.keyPair||{signing:xe.sign.keyPair(),encryption:xe.box.keyPair()};this.signingSecretKey=u.signing.secretKey,this.signingPublicKey=u.signing.publicKey,this.encryptionSecretKey=u.encryption.secretKey,this.encryptionPublicKey=u.encryption.publicKey,this.publicKeyBundle={signingPublicKey:re.encodeBase64(this.signingPublicKey),encryptionPublicKey:re.encodeBase64(this.encryptionPublicKey)},this.peerPublicKeys=new Map;for(let[l,P]of Object.entries(this.options.trustedPeerKeys||{}))this.peerPublicKeys.set(l,It(P));this.calibratedPowSteps=this.options.powSteps}getPublicKey(){return{...this.publicKeyBundle}}registerPeerPublicKey(r,a){this.peerPublicKeys.set(r,It(a))}resolvePeerPublicKey(r,a){let o=this.peerPublicKeys.get(r),u=a?It(a):null;if(o&&u&&(o.signingPublicKey!==u.signingPublicKey||o.encryptionPublicKey!==u.encryptionPublicKey))throw new Error(`Public key mismatch for peer ${r}`);return o||u||null}buildEnvelopeBase({messageType:r,payload:a,targetId:o=null}){return{version:1,senderId:this.nodeId,senderPublicKey:this.getPublicKey(),targetId:o,messageType:r,timestamp:this.now(),payload:a}}async secureOutgoingMessage({messageType:r,payload:a,targetId:o=null,securityContext:u={}}){if(!this.options.enabled)return this.buildEnvelopeBase({messageType:r,payload:a,targetId:o});let l=this.buildEnvelopeBase({messageType:r,payload:a,targetId:o}),P=await this.encryptPayload({payload:a,targetId:o,securityContext:u});if(l.payload=P.payload,l.security={encryption:P.security,signing:{enabled:!1},pow:{enabled:!1}},this.options.powEnabled){let k=await this.generatePow(l);l.security.pow={enabled:!0,challenge:k.challenge,proof:k.proof,steps:k.steps,durationMs:k.durationMs}}if(this.options.signingEnabled){let k=this.canonicalSigningInput(l),ie=xe.sign.detached(re.decodeUTF8(k),this.signingSecretKey);l.security.signing={enabled:!0,algorithm:"ed25519",signature:re.encodeBase64(ie)}}return l}canonicalSigningInput(r){return Le({version:r.version,senderId:r.senderId,senderPublicKey:r.senderPublicKey,targetId:r.targetId,messageType:r.messageType,timestamp:r.timestamp,payload:r.payload,security:{encryption:r.security?r.security.encryption:{enabled:!1},pow:r.security?r.security.pow:{enabled:!1}}})}canonicalPowInput(r){return Le({version:r.version,senderId:r.senderId,senderPublicKey:r.senderPublicKey,targetId:r.targetId,messageType:r.messageType,timestamp:r.timestamp,payload:r.payload,security:{encryption:r.security?r.security.encryption:{enabled:!1}}})}async decryptIncomingMessage(r){if(!this.options.enabled)return{ignored:!1,messageType:r.messageType,senderId:r.senderId,targetId:r.targetId,payload:r.payload};if(!r||typeof r!="object")throw new Error("Incoming message is invalid");if(r.targetId&&r.targetId!==this.nodeId)return{ignored:!0};r.security&&r.security.pow&&r.security.pow.enabled&&this.options.powEnabled&&await this.verifyPow(r),r.security&&r.security.signing&&r.security.signing.enabled&&this.options.signingEnabled&&this.verifySignature(r);let a=this.decryptPayload(r);return{ignored:!1,messageType:r.messageType,senderId:r.senderId,targetId:r.targetId,payload:a}}resolveBroadcastPassword(r){let a=r||"default";if(typeof this.options.resolveBroadcastPassword=="function"){let u=this.options.resolveBroadcastPassword({scope:a,nodeId:this.nodeId,defaultPassword:this.options.appPassword,broadcastPasswords:this.options.broadcastPasswords||{}});if(typeof u=="string"&&u.length>0)return u}let o=this.options.broadcastPasswords?this.options.broadcastPasswords[a]:null;return typeof o=="string"&&o.length>0?o:this.options.appPassword}async encryptPayload({payload:r,targetId:a,securityContext:o={}}){if(!this.options.encryptionEnabled)return{payload:r,security:{enabled:!1,mode:"none"}};let u=re.decodeUTF8(JSON.stringify(r));if(a){let Ee=this.resolvePeerPublicKey(a,null);if(!Ee)throw new Error(`Missing public key for target peer ${a}`);let je=xe.randomBytes(xe.box.nonceLength),Re=xe.box(u,je,re.decodeBase64(Ee.encryptionPublicKey),this.encryptionSecretKey);return{payload:re.encodeBase64(Re),security:{enabled:!0,mode:"direct",nonce:re.encodeBase64(je),senderEncryptionPublicKey:this.publicKeyBundle.encryptionPublicKey}}}let l=o.broadcastScope||"default",P=xe.randomBytes(xe.secretbox.nonceLength),k=xe.randomBytes(16),ie=this.resolveBroadcastPassword(l),ge=Te(ar(Ke(ie),k)),Oe=xe.secretbox(u,P,ge);return{payload:re.encodeBase64(Oe),security:{enabled:!0,mode:"broadcast",scope:l,nonce:re.encodeBase64(P),salt:re.encodeBase64(k)}}}decryptPayload(r){let a=r.security?r.security.encryption:null;if(!a||!a.enabled||!this.options.encryptionEnabled)return r.payload;let o=re.decodeBase64(r.payload);if(a.mode==="broadcast"){let u=a.scope||"default",l=this.resolveBroadcastPassword(u),P=re.decodeBase64(a.salt),k=re.decodeBase64(a.nonce),ie=Te(ar(Ke(l),P)),ge=xe.secretbox.open(o,k,ie);if(!ge)throw new Error("Unable to decrypt broadcast payload");return JSON.parse(re.encodeUTF8(ge))}if(a.mode==="direct"){let u=re.decodeBase64(a.senderEncryptionPublicKey),l=re.decodeBase64(a.nonce),P=xe.box.open(o,l,u,this.encryptionSecretKey);if(!P)throw new Error("Unable to decrypt direct payload");return JSON.parse(re.encodeUTF8(P))}throw new Error(`Unsupported encryption mode: ${a.mode}`)}verifySignature(r){let a=this.resolvePeerPublicKey(r.senderId,r.senderPublicKey);if(!a)throw new Error(`Missing public key for sender ${r.senderId}`);let o=this.canonicalSigningInput(r);if(!xe.sign.detached.verify(re.decodeUTF8(o),re.decodeBase64(r.security.signing.signature),re.decodeBase64(a.signingPublicKey))){let l=new Error(`Invalid signature for sender ${r.senderId}`);throw l.code="INVALID_SIGNATURE",l}return!0}async determinePowSteps(){if(typeof this.calibratedPowSteps=="bigint")return this.calibratedPowSteps;if(typeof this.options.powSteps=="number")return this.calibratedPowSteps=BigInt(Math.max(1,this.options.powSteps)),this.calibratedPowSteps;let r=Math.max(1,Number(this.options.powTargetMs||1)),a=vt(Te(Ke(`probe:${this.nodeId}:${this.now()}`))),o=BigInt(2),u=this.now();await wt.compute(a,o);let l=Math.max(1,this.now()-u),P=Math.max(1,Math.round(r/l*Number(o)));return this.calibratedPowSteps=BigInt(P),this.calibratedPowSteps}async generatePow(r){let a=vt(Te(Ke(this.canonicalPowInput(r)))),o=await this.determinePowSteps(),u=this.now(),l=await wt.compute(a,o),P=this.now()-u;return{challenge:a,proof:l,steps:o.toString(),durationMs:P}}async verifyPow(r){let a=vt(Te(Ke(this.canonicalPowInput(r)))),o=r.security.pow;if(!o||o.challenge!==a){let l=new Error("PoW challenge mismatch");throw l.code="INVALID_POW",l}if(!await wt.verify(o.challenge,BigInt(o.steps),o.proof)){let l=new Error("PoW verification failed");throw l.code="INVALID_POW",l}return!0}};cr.exports={MessageSecurityService:Pt,stableStringify:Le,DEFAULT_SECURITY_OPTIONS:or}});var xr=de((df,dr)=>{var Kr=Qt(),{MessageSecurityService:Lr}=St(),_t=class extends Kr{constructor({nodeId:r,networkAdapter:a,idGenerator:o,now:u,security:l}={}){if(super(),!r)throw new Error("DignityP2P requires nodeId");if(!a)throw new Error("DignityP2P requires networkAdapter");this.nodeId=r,this.networkAdapter=a,this.idGenerator=o||(()=>`${Date.now()}-${Math.random().toString(16).slice(2)}`),this.now=u||(()=>Date.now()),this.securityService=new Lr({nodeId:this.nodeId,options:l||{},now:this.now}),this.bannedPeers=new Map,this.peerBanDurationMs=l&&typeof l.banDurationMs=="number"?l.banDurationMs:2880*60*1e3,this.resolveBroadcastScope=l&&typeof l.resolveBroadcastScope=="function"?l.resolveBroadcastScope:(()=>"default"),this.defaultDiscoveryHeartbeatMs=l&&typeof l.discoveryHeartbeatMs=="number"?l.discoveryHeartbeatMs:15e3,this.defaultPresenceTtlMs=l&&typeof l.presenceTtlMs=="number"?l.presenceTtlMs:45e3,this.discoveryRooms=new Map,this.presenceByScope=new Map,this.state=new Map,this.appliedOperations=new Set,this.boundMessageHandler=this.handleIncomingMessage.bind(this)}async start(){this.networkAdapter.onMessage(this.boundMessageHandler),await this.networkAdapter.start(this.nodeId)}async stop(){let r=Array.from(this.discoveryRooms.keys());for(let a of r)try{await this.leaveDiscovery(a)}catch(o){this.emit("warning",{type:"presence-leave-failed",scope:a,error:o})}this.networkAdapter.offMessage(this.boundMessageHandler),await this.networkAdapter.stop()}getCollection(r){if(!r)throw new Error("collectionName is required");return this.state.has(r)||this.state.set(r,new Map),this.state.get(r)}normalizeRecord(r){return!r||r.deletedAt?null:{id:r.id,ownerId:r.ownerId,createdAt:r.createdAt,updatedAt:r.updatedAt,version:r.version,data:{...r.data}}}async create(r,a,o={}){let u=this.getCollection(r),l=o.id||this.idGenerator();if(u.has(l)&&!u.get(l).deletedAt)throw new Error(`Object ${l} already exists in ${r}`);let P=this.now(),k={opId:this.idGenerator(),kind:"create",collectionName:r,id:l,actorId:this.nodeId,ownerId:this.nodeId,timestamp:P,payload:{...a}};return this.applyOperation(k),await this.broadcastMessage("operation",k,{broadcastScope:o.broadcastScope||this.resolveBroadcastScope({messageType:"operation",operation:k,collectionName:r})}),this.read(r,l)}read(r,a){let o=this.getCollection(r);return this.normalizeRecord(o.get(a))}list(r,a={}){let o=this.getCollection(r),u=a.includeDeleted||!1,l=[];for(let P of o.values())if(!(P.deletedAt&&!u)){if(P.deletedAt&&u){l.push({id:P.id,ownerId:P.ownerId,deletedAt:P.deletedAt,version:P.version});continue}l.push(this.normalizeRecord(P))}return l}async update(r,a,o,u={}){let l=this.getCollection(r).get(a);if(!l||l.deletedAt)throw new Error(`Object ${a} does not exist in ${r}`);if(l.ownerId!==this.nodeId)throw new Error(`Only owner ${l.ownerId} can update object ${a}`);let P={opId:this.idGenerator(),kind:"update",collectionName:r,id:a,actorId:this.nodeId,timestamp:this.now(),baseVersion:l.version,payload:{...o}};return this.applyOperation(P),await this.broadcastMessage("operation",P,{broadcastScope:u.broadcastScope||this.resolveBroadcastScope({messageType:"operation",operation:P,collectionName:r})}),this.read(r,a)}async remove(r,a,o={}){let u=this.getCollection(r).get(a);if(!u||u.deletedAt)throw new Error(`Object ${a} does not exist in ${r}`);if(u.ownerId!==this.nodeId)throw new Error(`Only owner ${u.ownerId} can delete object ${a}`);let l={opId:this.idGenerator(),kind:"delete",collectionName:r,id:a,actorId:this.nodeId,timestamp:this.now(),baseVersion:u.version};this.applyOperation(l),await this.broadcastMessage("operation",l,{broadcastScope:o.broadcastScope||this.resolveBroadcastScope({messageType:"operation",operation:l,collectionName:r})})}registerPeerPublicKey(r,a){this.securityService.registerPeerPublicKey(r,a)}getPublicKey(){return this.securityService.getPublicKey()}async broadcastMessage(r,a,o={}){let u=await this.securityService.secureOutgoingMessage({messageType:r,payload:a,targetId:null,securityContext:o});await this.networkAdapter.broadcast(u)}async sendDirectMessage(r,a,o){let u=await this.securityService.secureOutgoingMessage({messageType:a,payload:o,targetId:r});await this.networkAdapter.broadcast(u)}getPresenceMap(r){return this.presenceByScope.has(r)||this.presenceByScope.set(r,new Map),this.presenceByScope.get(r)}upsertPresence(r,a,o,u,l){let P=this.getPresenceMap(r),k=P.get(a),ie={peerId:a,scope:r,metadata:o?{...o}:{},lastSeenAt:l,expiresAt:l+u};return P.set(a,ie),k||this.emit("peerdiscovered",{scope:r,peerId:a,metadata:ie.metadata}),ie}prunePresence(r){let a=this.presenceByScope.get(r);if(!a)return;let o=this.now();for(let[u,l]of a.entries())l.expiresAt<=o&&(a.delete(u),this.emit("peerleft",{scope:r,peerId:u,reason:"timeout"}))}async joinDiscovery(r="main",a={}){let o=r||"main",u=a.heartbeatIntervalMs||this.defaultDiscoveryHeartbeatMs,l=a.ttlMs||this.defaultPresenceTtlMs,P=a.metadata||{},k=this.discoveryRooms.get(o);k&&k.timer&&clearInterval(k.timer);let ie=setInterval(()=>{this.announcePresence(o).catch(ge=>{this.emit("warning",{type:"presence-heartbeat-failed",scope:o,error:ge})})},u);this.discoveryRooms.set(o,{metadata:P,heartbeatIntervalMs:u,ttlMs:l,timer:ie}),this.upsertPresence(o,this.nodeId,P,l,this.now()),await this.announcePresence(o)}async announcePresence(r="main",a=null){let o=r||"main",u=this.discoveryRooms.get(o);if(!u)throw new Error(`Scope ${o} has not been joined for discovery`);let l=a||u.metadata||{},P=this.now();this.upsertPresence(o,this.nodeId,l,u.ttlMs,P),await this.broadcastMessage("presence:announce",{scope:o,peerId:this.nodeId,metadata:l,ttlMs:u.ttlMs,announcedAt:P},{broadcastScope:o})}async leaveDiscovery(r="main"){let a=r||"main",o=this.discoveryRooms.get(a);if(!o)return;o.timer&&clearInterval(o.timer),this.discoveryRooms.delete(a);let u=this.presenceByScope.get(a);u&&u.delete(this.nodeId),await this.broadcastMessage("presence:leave",{scope:a,peerId:this.nodeId,leftAt:this.now()},{broadcastScope:a})}listPeers(r="main",a={}){let o=r||"main",u=a.includeSelf!==!1;this.prunePresence(o);let l=this.presenceByScope.get(o);return l?Array.from(l.values()).filter(P=>u||P.peerId!==this.nodeId).map(P=>({peerId:P.peerId,scope:P.scope,metadata:{...P.metadata},lastSeenAt:P.lastSeenAt,expiresAt:P.expiresAt})):[]}async handleIncomingMessage(r){if(r&&r.opId&&r.kind){this.applyOperation(r);return}if(r&&r.senderId&&this.isPeerBanned(r.senderId)){this.emit("messageignored",{senderId:r.senderId,reason:"peer-banned"});return}let a;try{a=await this.securityService.decryptIncomingMessage(r)}catch(o){let u=r?r.senderId:null;u&&(o.code==="INVALID_SIGNATURE"||o.code==="INVALID_POW")&&this.banPeer(u,this.peerBanDurationMs,o.code),this.emit("securityerror",{senderId:u,error:o});return}if(!(!a||a.ignored)){if(a.messageType==="operation"){this.applyOperation(a.payload);return}if(a.messageType==="presence:announce"){let o=a.payload||{},u=o.scope||"main",l=o.peerId||a.senderId;if(!l)return;let k=!this.getPresenceMap(u).has(l);this.upsertPresence(u,l,o.metadata||{},o.ttlMs||this.defaultPresenceTtlMs,o.announcedAt||this.now()),k&&l!==this.nodeId&&this.discoveryRooms.has(u)&&this.announcePresence(u).catch(ie=>{this.emit("warning",{type:"presence-handshake-failed",scope:u,error:ie})});return}if(a.messageType==="presence:leave"){let o=a.payload||{},u=o.scope||"main",l=o.peerId||a.senderId,P=this.presenceByScope.get(u);P&&l&&P.has(l)&&(P.delete(l),this.emit("peerleft",{scope:u,peerId:l,reason:"leave"}));return}this.emit("message",{senderId:a.senderId,targetId:a.targetId,type:a.messageType,payload:a.payload})}}banPeer(r,a=this.peerBanDurationMs,o="manual"){if(!r)return;let u=this.now()+Math.max(1,a);this.bannedPeers.set(r,{peerId:r,reason:o,bannedAt:this.now(),bannedUntil:u}),this.emit("peerbanned",{peerId:r,reason:o,bannedUntil:u})}unbanPeer(r){this.bannedPeers.delete(r),this.emit("peerunbanned",{peerId:r})}getBanInfo(r){let a=this.bannedPeers.get(r);return a?a.bannedUntil<=this.now()?(this.bannedPeers.delete(r),null):{...a}:null}isPeerBanned(r){return this.getBanInfo(r)!==null}applyOperation(r){if(!r||!r.opId||this.appliedOperations.has(r.opId))return!1;let a=this.getCollection(r.collectionName),o=a.get(r.id);return r.kind==="create"?o&&!o.deletedAt?!1:(a.set(r.id,{id:r.id,ownerId:r.ownerId,data:{...r.payload},createdAt:r.timestamp,updatedAt:r.timestamp,deletedAt:null,version:1}),this.appliedOperations.add(r.opId),this.emit("change",{kind:"create",collection:r.collectionName,id:r.id}),!0):!o||o.deletedAt||r.actorId!==o.ownerId||typeof r.baseVersion=="number"&&r.baseVersion!==o.version?!1:r.kind==="update"?(o.data={...o.data,...r.payload},o.updatedAt=r.timestamp,o.version+=1,this.appliedOperations.add(r.opId),this.emit("change",{kind:"update",collection:r.collectionName,id:r.id}),!0):r.kind==="delete"?(o.deletedAt=r.timestamp,o.updatedAt=r.timestamp,o.version+=1,this.appliedOperations.add(r.opId),this.emit("change",{kind:"delete",collection:r.collectionName,id:r.id}),!0):!1}};dr.exports=_t});var Et=de((xf,hr)=>{var At=class{constructor(r=[]){this.providers=[...r],this.activeProvider=null}registerProvider(r){this.providers.push(r)}getProvidersByPriority(){return[...this.providers].sort((r,a)=>(r.priority||0)-(a.priority||0))}async connect(r=new Set){let a=this.getProvidersByPriority().filter(u=>!r.has(u.id)),o;for(let u of a)try{return await u.connect(),this.activeProvider=u,u}catch(l){o=l}throw o||new Error("No signaling provider could connect")}async send(r){this.activeProvider||await this.connect();try{await this.activeProvider.send(r)}catch(a){this.activeProvider&&typeof this.activeProvider.disconnect=="function"&&await this.activeProvider.disconnect();let o=this.activeProvider?this.activeProvider.id:null;this.activeProvider=null;let u=o?new Set([o]):new Set;return await this.connect(u),await this.activeProvider.send(r),a}return null}onMessage(r){for(let a of this.providers)typeof a.onMessage=="function"&&a.onMessage(r)}async disconnect(){let r=this.providers.filter(a=>typeof a.disconnect=="function").map(a=>a.disconnect());await Promise.all(r),this.activeProvider=null}};hr.exports=At});var mt=de((hf,ur)=>{var Bt=class{constructor({id:r,url:a,WebSocketImpl:o,priority:u=0}){if(!a)throw new Error("WebSocket signaling provider requires a url");this.id=r||a,this.url=a,this.priority=u,this.WebSocketImpl=o||globalThis.WebSocket,this.socket=null,this.messageHandlers=new Set}async connect(){if(!this.WebSocketImpl)throw new Error("WebSocket implementation is not available");await new Promise((r,a)=>{let o=new this.WebSocketImpl(this.url);o.onopen=()=>{this.socket=o,r()},o.onerror=()=>{a(new Error(`Unable to connect to signaling url ${this.url}`))},o.onmessage=u=>{let l=u.data;try{l=JSON.parse(u.data)}catch{l=u.data}for(let P of this.messageHandlers)P(l)}})}onMessage(r){this.messageHandlers.add(r)}async send(r){if(!this.socket||this.socket.readyState!==1)throw new Error(`Signaling socket is not open for ${this.url}`);this.socket.send(JSON.stringify(r))}async disconnect(){this.socket&&(this.socket.close(),this.socket=null)}};ur.exports=Bt});var Mt=de((uf,lr)=>{var Or=["wss://signaling.cloudflare.com","wss://cloudflare-webrtc-signaling.example","wss://trycloudflare-signaling.example"],jr=["wss://relay.dignity.dev/signaling","wss://backup-relay.dignity.dev/signaling"];lr.exports={DEFAULT_CLOUDFLARE_SIGNALING_URLS:Or,DEFAULT_SIGNALING_FALLBACK_URLS:jr}});var br=de((lf,pr)=>{var Rr=Et(),yr=mt(),{DEFAULT_CLOUDFLARE_SIGNALING_URLS:Yr,DEFAULT_SIGNALING_FALLBACK_URLS:Dr}=Mt();function Cr(y={}){let r=y.cloudflareUrls||Yr,a=y.fallbackUrls||Dr,o=y.WebSocketImpl,u=[];return r.forEach((l,P)=>{u.push(new yr({id:`cloudflare-${P+1}`,url:l,WebSocketImpl:o,priority:P}))}),a.forEach((l,P)=>{u.push(new yr({id:`fallback-${P+1}`,url:l,WebSocketImpl:o,priority:r.length+P}))}),Array.isArray(y.customProviders)&&u.push(...y.customProviders),new Rr(u)}pr.exports=Cr});var wr=de((yf,gr)=>{var Ut=class{constructor(){this.adapters=new Map}register(r){this.adapters.set(r.nodeId,r)}unregister(r){this.adapters.delete(r)}async broadcast(r,a){let o=[];for(let[u,l]of this.adapters.entries())u!==r&&o.push(l.receive(a));await Promise.all(o)}},Tt=class{constructor(r){if(!r)throw new Error("InMemoryNetworkAdapter requires an InMemoryNetworkHub");this.hub=r,this.nodeId=null,this.messageHandlers=new Set}async start(r){this.nodeId=r,this.hub.register(this)}async stop(){this.nodeId&&this.hub.unregister(this.nodeId),this.nodeId=null}async broadcast(r){if(!this.nodeId)throw new Error("Network adapter has not been started");await this.hub.broadcast(this.nodeId,r)}onMessage(r){this.messageHandlers.add(r)}offMessage(r){this.messageHandlers.delete(r)}async receive(r){let a=[];for(let o of this.messageHandlers)a.push(o(r));await Promise.all(a)}};gr.exports={InMemoryNetworkHub:Ut,InMemoryNetworkAdapter:Tt}});var kr=de((pf,vr)=>{var Nr=xr(),Fr=br(),zr=Et(),$r=mt(),{InMemoryNetworkHub:qr,InMemoryNetworkAdapter:Gr}=wr(),{DEFAULT_CLOUDFLARE_SIGNALING_URLS:Vr,DEFAULT_SIGNALING_FALLBACK_URLS:Hr}=Mt(),Wr=gt(),Zr=pt(),{MessageSecurityService:Jr,DEFAULT_SECURITY_OPTIONS:Xr}=St();vr.exports={DignityP2P:Nr,createDefaultSignalingPool:Fr,SignalingPool:zr,WebSocketSignalingProvider:$r,InMemoryNetworkHub:qr,InMemoryNetworkAdapter:Gr,DEFAULT_CLOUDFLARE_SIGNALING_URLS:Vr,DEFAULT_SIGNALING_FALLBACK_URLS:Hr,VDF:Wr,SlothPermutation:Zr,MessageSecurityService:Jr,DEFAULT_SECURITY_OPTIONS:Xr}});return kr();})();
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<svg width="860" height="320" viewBox="0 0 860 320" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="0" y1="0" x2="860" y2="320" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop offset="0%" stop-color="#0B1020"/>
|
|
5
|
+
<stop offset="100%" stop-color="#1A0F36"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="ink" x1="200" y1="60" x2="760" y2="270" gradientUnits="userSpaceOnUse">
|
|
8
|
+
<stop offset="0%" stop-color="#FFFFFF"/>
|
|
9
|
+
<stop offset="45%" stop-color="#A7D3FF"/>
|
|
10
|
+
<stop offset="100%" stop-color="#C89DFF"/>
|
|
11
|
+
</linearGradient>
|
|
12
|
+
<linearGradient id="nodeStroke" x1="56" y1="44" x2="236" y2="236" gradientUnits="userSpaceOnUse">
|
|
13
|
+
<stop offset="0%" stop-color="#5FE3FF"/>
|
|
14
|
+
<stop offset="100%" stop-color="#9C7CFF"/>
|
|
15
|
+
</linearGradient>
|
|
16
|
+
<filter id="glow" x="-20%" y="-20%" width="140%" height="140%">
|
|
17
|
+
<feGaussianBlur stdDeviation="6" result="blur"/>
|
|
18
|
+
<feMerge>
|
|
19
|
+
<feMergeNode in="blur"/>
|
|
20
|
+
<feMergeNode in="SourceGraphic"/>
|
|
21
|
+
</feMerge>
|
|
22
|
+
</filter>
|
|
23
|
+
<filter id="textSoftGlow" x="-20%" y="-20%" width="140%" height="140%">
|
|
24
|
+
<feGaussianBlur stdDeviation="2.2" result="blurText"/>
|
|
25
|
+
<feMerge>
|
|
26
|
+
<feMergeNode in="blurText"/>
|
|
27
|
+
<feMergeNode in="SourceGraphic"/>
|
|
28
|
+
</feMerge>
|
|
29
|
+
</filter>
|
|
30
|
+
</defs>
|
|
31
|
+
|
|
32
|
+
<rect x="8" y="8" width="844" height="304" rx="34" fill="url(#bg)"/>
|
|
33
|
+
<rect x="8" y="8" width="844" height="304" rx="34" stroke="#2B3B70" stroke-width="2"/>
|
|
34
|
+
|
|
35
|
+
<text
|
|
36
|
+
x="84"
|
|
37
|
+
y="178"
|
|
38
|
+
fill="url(#ink)"
|
|
39
|
+
font-size="124"
|
|
40
|
+
font-family="'Bree Serif', 'Bodoni Moda', 'Didot', 'Playfair Display', 'Cormorant Garamond', Georgia, serif"
|
|
41
|
+
font-weight="600"
|
|
42
|
+
letter-spacing="0.35"
|
|
43
|
+
filter="url(#textSoftGlow)"
|
|
44
|
+
>dignity.js</text>
|
|
45
|
+
|
|
46
|
+
<text
|
|
47
|
+
x="84"
|
|
48
|
+
y="254"
|
|
49
|
+
fill="#A8B7E8"
|
|
50
|
+
font-size="24"
|
|
51
|
+
font-family="'Avenir Next', 'Montserrat', 'Inter', Arial, sans-serif"
|
|
52
|
+
letter-spacing="4.2"
|
|
53
|
+
>DECENTRALIZED OBJECT API</text>
|
|
54
|
+
</svg>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--bg: #0b1020;
|
|
3
|
+
--card: #121a33;
|
|
4
|
+
--text: #e7ecff;
|
|
5
|
+
--muted: #9fb0de;
|
|
6
|
+
--accent: #66b3ff;
|
|
7
|
+
--line: #26335f;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
* {
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
body {
|
|
15
|
+
margin: 0;
|
|
16
|
+
padding: 32px;
|
|
17
|
+
background: var(--bg);
|
|
18
|
+
color: var(--text);
|
|
19
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
|
20
|
+
line-height: 1.5;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
main {
|
|
24
|
+
max-width: 980px;
|
|
25
|
+
margin: 0 auto;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
h1, h2, h3 {
|
|
29
|
+
margin-top: 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
h1 {
|
|
33
|
+
margin-bottom: 8px;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.subtitle {
|
|
37
|
+
color: var(--muted);
|
|
38
|
+
margin-top: 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
section {
|
|
42
|
+
background: var(--card);
|
|
43
|
+
border: 1px solid var(--line);
|
|
44
|
+
border-radius: 12px;
|
|
45
|
+
padding: 18px 20px;
|
|
46
|
+
margin-bottom: 16px;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
code, pre {
|
|
50
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
pre {
|
|
54
|
+
background: #0a142d;
|
|
55
|
+
border: 1px solid var(--line);
|
|
56
|
+
border-radius: 8px;
|
|
57
|
+
padding: 12px;
|
|
58
|
+
overflow: auto;
|
|
59
|
+
white-space: pre;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
a {
|
|
63
|
+
color: var(--accent);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
ul {
|
|
67
|
+
margin-bottom: 0;
|
|
68
|
+
}
|
package/docs/index.html
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>dignity.js v0.1.0 docs</title>
|
|
7
|
+
<link rel="stylesheet" href="./assets/styles.css" />
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<main>
|
|
11
|
+
<h1>dignity.js documentation</h1>
|
|
12
|
+
<p class="subtitle">Version 0.1.0 - P2P object API for decentralized JavaScript applications</p>
|
|
13
|
+
|
|
14
|
+
<section>
|
|
15
|
+
<h2>Professional docs layout (recommended)</h2>
|
|
16
|
+
<ul>
|
|
17
|
+
<li><strong>Monorepo style:</strong> <code>apps/docs</code> (Next.js/Nextra or Docusaurus) + versioned routes.</li>
|
|
18
|
+
<li><strong>Library style:</strong> top-level <code>docs/</code> for public docs and examples.</li>
|
|
19
|
+
<li><strong>API reference:</strong> generated from source comments and published online.</li>
|
|
20
|
+
<li><strong>Examples:</strong> runnable samples under <code>examples/</code> or linked demos.</li>
|
|
21
|
+
</ul>
|
|
22
|
+
</section>
|
|
23
|
+
|
|
24
|
+
<section>
|
|
25
|
+
<h2>Quick start</h2>
|
|
26
|
+
<pre><code>const {
|
|
27
|
+
DignityP2P,
|
|
28
|
+
InMemoryNetworkHub,
|
|
29
|
+
InMemoryNetworkAdapter
|
|
30
|
+
} = require('dignity.js');
|
|
31
|
+
|
|
32
|
+
const hub = new InMemoryNetworkHub();
|
|
33
|
+
|
|
34
|
+
const alice = new DignityP2P({
|
|
35
|
+
nodeId: 'alice',
|
|
36
|
+
networkAdapter: new InMemoryNetworkAdapter(hub)
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
await alice.start();
|
|
40
|
+
await alice.create('notes', { title: 'hello world' }, { id: 'note-1' });
|
|
41
|
+
const note = alice.read('notes', 'note-1');</code></pre>
|
|
42
|
+
</section>
|
|
43
|
+
|
|
44
|
+
<section>
|
|
45
|
+
<h2>REST-like object API</h2>
|
|
46
|
+
<ul>
|
|
47
|
+
<li><code>create(collection, data, options)</code> -> owner is the creator.</li>
|
|
48
|
+
<li><code>read(collection, id)</code> -> returns object or <code>null</code>.</li>
|
|
49
|
+
<li><code>list(collection, options)</code> -> list active objects (or include deleted markers).</li>
|
|
50
|
+
<li><code>update(collection, id, patch)</code> -> only object owner can update.</li>
|
|
51
|
+
<li><code>remove(collection, id)</code> -> only object owner can delete.</li>
|
|
52
|
+
</ul>
|
|
53
|
+
</section>
|
|
54
|
+
|
|
55
|
+
<section>
|
|
56
|
+
<h2>Room / team discovery</h2>
|
|
57
|
+
<pre><code>await node.joinDiscovery('team:red', {\n metadata: { nickname: 'alice' },\n heartbeatIntervalMs: 15000,\n ttlMs: 45000\n});\n\nconst peers = node.listPeers('team:red', { includeSelf: false });\nawait node.leaveDiscovery('team:red');</code></pre>
|
|
58
|
+
</section>
|
|
59
|
+
|
|
60
|
+
<section>
|
|
61
|
+
<h2>Security defaults (enabled)</h2>
|
|
62
|
+
<ul>
|
|
63
|
+
<li><strong>Signing:</strong> every message is signed by sender keypair.</li>
|
|
64
|
+
<li><strong>Broadcast encryption:</strong> encrypted using shared <code>appPassword</code>.</li>
|
|
65
|
+
<li><strong>Direct encryption:</strong> encrypted with recipient public key.</li>
|
|
66
|
+
<li><strong>PoW:</strong> Sloth VDF proof per message, default <code>powSteps: 22</code> (~1000ms on this machine).</li>
|
|
67
|
+
<li><strong>Peer bans:</strong> invalid signature or invalid PoW bans sender for 48h by default.</li>
|
|
68
|
+
</ul>
|
|
69
|
+
<pre><code>const node = new DignityP2P({\n nodeId: 'alice',\n networkAdapter,\n security: {\n appPassword: 'shared-out-of-band-password',\n powTargetMs: 1000,\n signingEnabled: true,\n encryptionEnabled: true,\n powEnabled: true\n }\n});</code></pre>
|
|
70
|
+
<pre><code>const coopNode = new DignityP2P({\n nodeId: 'alice',\n networkAdapter,\n security: {\n appPassword: 'global-fallback-password',\n broadcastPasswords: {\n 'coop:red': 'red-team-password',\n 'coop:blue': 'blue-team-password'\n }\n }\n});\n\nawait coopNode.create('matches', { mode: 'coop' }, {\n id: 'match-1',\n broadcastScope: 'coop:red'\n});</code></pre>
|
|
71
|
+
</section>
|
|
72
|
+
|
|
73
|
+
<section>
|
|
74
|
+
<h2>Signaling defaults and customization</h2>
|
|
75
|
+
<pre><code>const {
|
|
76
|
+
createDefaultSignalingPool,
|
|
77
|
+
WebSocketSignalingProvider
|
|
78
|
+
} = require('dignity.js');
|
|
79
|
+
|
|
80
|
+
const pool = createDefaultSignalingPool({
|
|
81
|
+
cloudflareUrls: ['wss://your-cloudflare-endpoint.example'],
|
|
82
|
+
fallbackUrls: ['wss://relay-a.example', 'wss://relay-b.example'],
|
|
83
|
+
customProviders: [
|
|
84
|
+
new WebSocketSignalingProvider({
|
|
85
|
+
id: 'local-dev',
|
|
86
|
+
url: 'ws://localhost:3001',
|
|
87
|
+
priority: 99
|
|
88
|
+
})
|
|
89
|
+
]
|
|
90
|
+
});</code></pre>
|
|
91
|
+
<p>
|
|
92
|
+
Machine-readable API metadata is available in
|
|
93
|
+
<a href="./openapi-like.json">openapi-like.json</a>.
|
|
94
|
+
</p>
|
|
95
|
+
</section>
|
|
96
|
+
|
|
97
|
+
<section>
|
|
98
|
+
<h2>Minimal examples</h2>
|
|
99
|
+
<ul>
|
|
100
|
+
<li><code>examples/decentralized-tictactoe.js</code> - replicated board state and owner authorization.</li>
|
|
101
|
+
<li><code>examples/decentralized-chess-lite.js</code> - replicated move history with a compact board model.</li>
|
|
102
|
+
</ul>
|
|
103
|
+
<pre><code>npm run example:tictactoe\nnpm run example:chess</code></pre>
|
|
104
|
+
</section>
|
|
105
|
+
|
|
106
|
+
<section>
|
|
107
|
+
<h2>Publish-ready browser bundles</h2>
|
|
108
|
+
<ul>
|
|
109
|
+
<li><code>dist/dignity.min.js</code> - minified browser IIFE bundle (global <code>DignityJS</code>).</li>
|
|
110
|
+
<li><code>dist/dignity.esm.js</code> - browser ESM bundle.</li>
|
|
111
|
+
<li><code>dist/dignity.cjs.js</code> - Node/CommonJS bundle.</li>
|
|
112
|
+
</ul>
|
|
113
|
+
<pre><code>npm test\nnpm run build\nnpm publish --access public</code></pre>
|
|
114
|
+
</section>
|
|
115
|
+
</main>
|
|
116
|
+
</body>
|
|
117
|
+
</html>
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "dignity.js",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "REST-like object API over peer-to-peer replication",
|
|
5
|
+
"resources": {
|
|
6
|
+
"collections/{collection}/{id}": {
|
|
7
|
+
"create": {
|
|
8
|
+
"method": "create(collection, data, options)",
|
|
9
|
+
"owner": "actor that creates the object"
|
|
10
|
+
},
|
|
11
|
+
"read": {
|
|
12
|
+
"method": "read(collection, id)"
|
|
13
|
+
},
|
|
14
|
+
"update": {
|
|
15
|
+
"method": "update(collection, id, patch)",
|
|
16
|
+
"authorization": "owner-only"
|
|
17
|
+
},
|
|
18
|
+
"delete": {
|
|
19
|
+
"method": "remove(collection, id)",
|
|
20
|
+
"authorization": "owner-only"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"collections/{collection}": {
|
|
24
|
+
"list": {
|
|
25
|
+
"method": "list(collection, options)"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"signaling": {
|
|
30
|
+
"defaults": {
|
|
31
|
+
"cloudflare": "enabled by default",
|
|
32
|
+
"fallback": "enabled"
|
|
33
|
+
},
|
|
34
|
+
"customization": {
|
|
35
|
+
"factory": "createDefaultSignalingPool(options)",
|
|
36
|
+
"override": [
|
|
37
|
+
"cloudflareUrls",
|
|
38
|
+
"fallbackUrls",
|
|
39
|
+
"customProviders"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"messageSecurity": {
|
|
44
|
+
"defaults": {
|
|
45
|
+
"signingEnabled": true,
|
|
46
|
+
"encryptionEnabled": true,
|
|
47
|
+
"powEnabled": true,
|
|
48
|
+
"powTargetMs": 1000
|
|
49
|
+
},
|
|
50
|
+
"broadcast": {
|
|
51
|
+
"encryption": "aes-256-gcm with appPassword-derived key"
|
|
52
|
+
},
|
|
53
|
+
"direct": {
|
|
54
|
+
"encryption": "aes-256-gcm payload + rsa-oaep wrapped session key"
|
|
55
|
+
},
|
|
56
|
+
"pow": {
|
|
57
|
+
"algorithm": "Sloth VDF",
|
|
58
|
+
"config": [
|
|
59
|
+
"powTargetMs",
|
|
60
|
+
"powSteps"
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
const { DignityP2P, InMemoryNetworkHub, InMemoryNetworkAdapter } = require('../src');
|
|
2
|
+
|
|
3
|
+
function initialBoard() {
|
|
4
|
+
return {
|
|
5
|
+
whiteKing: 'e1',
|
|
6
|
+
blackKing: 'e8',
|
|
7
|
+
whitePawnA: 'a2',
|
|
8
|
+
blackPawnA: 'a7'
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
async function runDemo() {
|
|
13
|
+
const hub = new InMemoryNetworkHub();
|
|
14
|
+
|
|
15
|
+
const host = new DignityP2P({
|
|
16
|
+
nodeId: 'host',
|
|
17
|
+
networkAdapter: new InMemoryNetworkAdapter(hub),
|
|
18
|
+
security: {
|
|
19
|
+
appPassword: 'demo-shared-password',
|
|
20
|
+
powTargetMs: 100
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const observer = new DignityP2P({
|
|
25
|
+
nodeId: 'observer',
|
|
26
|
+
networkAdapter: new InMemoryNetworkAdapter(hub),
|
|
27
|
+
security: {
|
|
28
|
+
appPassword: 'demo-shared-password',
|
|
29
|
+
powTargetMs: 100
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
await host.start();
|
|
34
|
+
await observer.start();
|
|
35
|
+
await host.joinDiscovery('room:chess-lite', {
|
|
36
|
+
metadata: { nickname: 'host', role: 'owner' },
|
|
37
|
+
heartbeatIntervalMs: 100000,
|
|
38
|
+
ttlMs: 30000
|
|
39
|
+
});
|
|
40
|
+
await observer.joinDiscovery('room:chess-lite', {
|
|
41
|
+
metadata: { nickname: 'observer', role: 'viewer' },
|
|
42
|
+
heartbeatIntervalMs: 100000,
|
|
43
|
+
ttlMs: 30000
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
console.log(
|
|
47
|
+
'\nPeers visible from host in room:chess-lite:',
|
|
48
|
+
host.listPeers('room:chess-lite', { includeSelf: false }).map((peer) => peer.peerId)
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
await host.create(
|
|
52
|
+
'matches',
|
|
53
|
+
{
|
|
54
|
+
type: 'chess-lite',
|
|
55
|
+
board: initialBoard(),
|
|
56
|
+
moveHistory: []
|
|
57
|
+
},
|
|
58
|
+
{ id: 'match-1', broadcastScope: 'room:chess-lite' }
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
const scriptedMoves = [
|
|
62
|
+
{ from: 'a2', to: 'a4', piece: 'whitePawnA' },
|
|
63
|
+
{ from: 'a7', to: 'a5', piece: 'blackPawnA' },
|
|
64
|
+
{ from: 'e1', to: 'e2', piece: 'whiteKing' }
|
|
65
|
+
];
|
|
66
|
+
|
|
67
|
+
for (const move of scriptedMoves) {
|
|
68
|
+
const match = host.read('matches', 'match-1');
|
|
69
|
+
const board = { ...match.data.board, [move.piece]: move.to };
|
|
70
|
+
const moveHistory = [...match.data.moveHistory, move];
|
|
71
|
+
|
|
72
|
+
await host.update(
|
|
73
|
+
'matches',
|
|
74
|
+
'match-1',
|
|
75
|
+
{
|
|
76
|
+
board,
|
|
77
|
+
moveHistory,
|
|
78
|
+
lastMove: move
|
|
79
|
+
},
|
|
80
|
+
{ broadcastScope: 'room:chess-lite' }
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const hostState = host.read('matches', 'match-1');
|
|
85
|
+
const observerState = observer.read('matches', 'match-1');
|
|
86
|
+
|
|
87
|
+
console.log('\nHost state:');
|
|
88
|
+
console.log(JSON.stringify(hostState.data, null, 2));
|
|
89
|
+
|
|
90
|
+
console.log('\nObserver replicated state:');
|
|
91
|
+
console.log(JSON.stringify(observerState.data, null, 2));
|
|
92
|
+
|
|
93
|
+
await host.leaveDiscovery('room:chess-lite');
|
|
94
|
+
await observer.leaveDiscovery('room:chess-lite');
|
|
95
|
+
await host.stop();
|
|
96
|
+
await observer.stop();
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
runDemo().catch((error) => {
|
|
100
|
+
console.error(error);
|
|
101
|
+
process.exitCode = 1;
|
|
102
|
+
});
|