From 1f811e292d646c30beea2785e23436b17f68f02e Mon Sep 17 00:00:00 2001 From: Mario Kozjak Date: Tue, 25 Feb 2025 12:48:21 +0100 Subject: [PATCH] build Signed-off-by: Mario Kozjak --- dist/index.browser-bundle.js | 2 +- dist/index.browser.cjs | 2 +- dist/index.browser.cjs.map | 2 +- dist/index.browser.d.mts | 6 +++--- dist/index.browser.d.ts | 6 +++--- dist/index.browser.mjs | 2 +- dist/index.browser.mjs.map | 2 +- dist/index.cjs | 2 +- dist/index.cjs.map | 2 +- dist/index.d.mts | 6 +++--- dist/index.d.ts | 6 +++--- dist/index.mjs | 2 +- dist/index.mjs.map | 2 +- 13 files changed, 21 insertions(+), 21 deletions(-) diff --git a/dist/index.browser-bundle.js b/dist/index.browser-bundle.js index e19e108..f885d47 100644 --- a/dist/index.browser-bundle.js +++ b/dist/index.browser-bundle.js @@ -1,7 +1,7 @@ var RPCWebSocket = (function (exports) { 'use strict'; - var Tr=Object.create;var ht=Object.defineProperty;var Cr=Object.getOwnPropertyDescriptor;var Rr=Object.getOwnPropertyNames,at=Object.getOwnPropertySymbols,Pr=Object.getPrototypeOf,_t=Object.prototype.hasOwnProperty,qt=Object.prototype.propertyIsEnumerable;var It=(h,u,c)=>u in h?ht(h,u,{enumerable:!0,configurable:!0,writable:!0,value:c}):h[u]=c,bt=(h,u)=>{for(var c in u||(u={}))_t.call(u,c)&&It(h,c,u[c]);if(at)for(var c of at(u))qt.call(u,c)&&It(h,c,u[c]);return h};var Dt=(h,u)=>{var c={};for(var l in h)_t.call(h,l)&&u.indexOf(l)<0&&(c[l]=h[l]);if(h!=null&&at)for(var l of at(h))u.indexOf(l)<0&&qt.call(h,l)&&(c[l]=h[l]);return c};var it=(h,u)=>()=>(h&&(u=h(h=0)),u);var Lr=(h,u)=>()=>(u||h((u={exports:{}}).exports,u),u.exports),Nr=(h,u)=>{for(var c in u)ht(h,c,{get:u[c],enumerable:!0});},Wr=(h,u,c,l)=>{if(u&&typeof u=="object"||typeof u=="function")for(let p of Rr(u))!_t.call(h,p)&&p!==c&&ht(h,p,{get:()=>u[p],enumerable:!(l=Cr(u,p))||l.enumerable});return h};var Mr=(h,u,c)=>(c=h!=null?Tr(Pr(h)):{},Wr(ht(c,"default",{value:h,enumerable:!0}),h));var R=(h,u,c)=>It(h,typeof u!="symbol"?u+"":u,c);var v=it(()=>{});var j={};Nr(j,{_debugEnd:()=>Te,_debugProcess:()=>Ue,_events:()=>He,_eventsCount:()=>Ke,_exiting:()=>he,_fatalExceptions:()=>xe,_getActiveHandles:()=>de,_getActiveRequests:()=>fe,_kill:()=>me,_linkedBinding:()=>ce,_maxListeners:()=>Ge,_preload_modules:()=>De,_rawDebug:()=>se,_startProfilerIdleNotifier:()=>Ce,_stopProfilerIdleNotifier:()=>Re,_tickCallback:()=>Se,abort:()=>We,addListener:()=>Xe,allowedNodeEnvironmentFlags:()=>_e,arch:()=>Kt,argv:()=>Qt,argv0:()=>qe,assert:()=>be,binding:()=>ee,chdir:()=>ie,config:()=>pe,cpuUsage:()=>ft,cwd:()=>ne,debugPort:()=>Fe,default:()=>nr,dlopen:()=>le,domain:()=>ae,emit:()=>Ze,emitWarning:()=>te,env:()=>Jt,execArgv:()=>Vt,execPath:()=>$e,exit:()=>Be,features:()=>Ae,hasUncaughtExceptionCaptureCallback:()=>ve,hrtime:()=>lt,kill:()=>Ee,listeners:()=>rr,memoryUsage:()=>ge,moduleLoadList:()=>ue,nextTick:()=>Yt,off:()=>Qe,on:()=>X,once:()=>Je,openStdin:()=>Ie,pid:()=>Me,platform:()=>Xt,ppid:()=>Oe,prependListener:()=>tr,prependOnceListener:()=>er,reallyExit:()=>ye,release:()=>oe,removeAllListeners:()=>ze,removeListener:()=>Ve,resourceUsage:()=>we,setSourceMapsEnabled:()=>je,setUncaughtExceptionCaptureCallback:()=>ke,stderr:()=>Le,stdin:()=>Ne,stdout:()=>Pe,title:()=>Ht,umask:()=>re,uptime:()=>Ye,version:()=>zt,versions:()=>Zt});function kt(h){throw new Error("Node.js process "+h+" is not supported by JSPM core outside of Node.js")}function Or(){!rt||!V||(rt=!1,V.length?H=V.concat(H):pt=-1,H.length&&jt());}function jt(){if(!rt){var h=setTimeout(Or,0);rt=!0;for(var u=H.length;u;){for(V=H,H=[];++pt1)for(var c=1;c{v();U();S();H=[],rt=!1,pt=-1;Gt.prototype.run=function(){this.fun.apply(null,this.array);};Ht="browser",Kt="x64",Xt="browser",Jt={PATH:"/usr/bin",LANG:navigator.language+".UTF-8",PWD:"/",HOME:"/home",TMP:"/tmp"},Qt=["/usr/bin/node"],Vt=[],zt="v16.8.0",Zt={},te=function(h,u){console.warn((u?u+": ":"")+h);},ee=function(h){kt("binding");},re=function(h){return 0},ne=function(){return "/"},ie=function(h){},oe={name:"node",sourceUrl:"",headersUrl:"",libUrl:""};se=N,ue=[];ae={},he=!1,pe={};ye=N,me=N,ft=function(){return {}},we=ft,ge=ft,Ee=N,Be=N,Ie=N,_e={};Ae={inspector:!1,debug:!1,uv:!1,ipv6:!1,tls_alpn:!1,tls_sni:!1,tls_ocsp:!1,tls:!1,cached_builtins:!0},xe=N,ke=N;Se=N,Ue=N,Te=N,Ce=N,Re=N,Pe=void 0,Le=void 0,Ne=void 0,We=N,Me=2,Oe=1,$e="/bin/usr/node",Fe=9229,qe="node",De=[],je=N,Q={now:typeof performance!="undefined"?performance.now.bind(performance):void 0,timing:typeof performance!="undefined"?performance.timing:void 0};Q.now===void 0&&(At=Date.now(),Q.timing&&Q.timing.navigationStart&&(At=Q.timing.navigationStart),Q.now=()=>Date.now()-At);xt=1e9;lt.bigint=function(h){var u=lt(h);return typeof BigInt=="undefined"?u[0]*xt+u[1]:BigInt(u[0]*xt)+BigInt(u[1])};Ge=10,He={},Ke=0;Xe=X,Je=X,Qe=X,Ve=X,ze=X,Ze=N,tr=X,er=X;nr={version:zt,versions:Zt,arch:Kt,platform:Xt,release:oe,_rawDebug:se,moduleLoadList:ue,binding:ee,_linkedBinding:ce,_events:He,_eventsCount:Ke,_maxListeners:Ge,on:X,addListener:Xe,once:Je,off:Qe,removeListener:Ve,removeAllListeners:ze,emit:Ze,prependListener:tr,prependOnceListener:er,listeners:rr,domain:ae,_exiting:he,config:pe,dlopen:le,uptime:Ye,_getActiveRequests:fe,_getActiveHandles:de,reallyExit:ye,_kill:me,cpuUsage:ft,resourceUsage:we,memoryUsage:ge,kill:Ee,exit:Be,openStdin:Ie,allowedNodeEnvironmentFlags:_e,assert:be,features:Ae,_fatalExceptions:xe,setUncaughtExceptionCaptureCallback:ke,hasUncaughtExceptionCaptureCallback:ve,emitWarning:te,nextTick:Yt,_tickCallback:Se,_debugProcess:Ue,_debugEnd:Te,_startProfilerIdleNotifier:Ce,_stopProfilerIdleNotifier:Re,stdout:Pe,stdin:Ne,stderr:Le,abort:We,umask:re,chdir:ie,cwd:ne,env:Jt,title:Ht,argv:Qt,execArgv:Vt,pid:Me,ppid:Oe,execPath:$e,debugPort:Fe,hrtime:lt,argv0:qe,_preload_modules:De,setSourceMapsEnabled:je};});var S=it(()=>{ir();});function $r(){if(or)return ot;or=!0,ot.byteLength=E,ot.toByteArray=b,ot.fromByteArray=L;for(var h=[],u=[],c=typeof Uint8Array!="undefined"?Uint8Array:Array,l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",p=0,f=l.length;p0)throw new Error("Invalid string. Length must be a multiple of 4");var _=y.indexOf("=");_===-1&&(_=g);var C=_===g?0:4-_%4;return [_,C]}function E(y){var g=i(y),_=g[0],C=g[1];return (_+C)*3/4-C}function d(y,g,_){return (g+_)*3/4-_}function b(y){var g,_=i(y),C=_[0],$=_[1],T=new c(d(y,C,$)),F=0,D=$>0?C-4:C,M;for(M=0;M>16&255,T[F++]=g>>8&255,T[F++]=g&255;return $===2&&(g=u[y.charCodeAt(M)]<<2|u[y.charCodeAt(M+1)]>>4,T[F++]=g&255),$===1&&(g=u[y.charCodeAt(M)]<<10|u[y.charCodeAt(M+1)]<<4|u[y.charCodeAt(M+2)]>>2,T[F++]=g>>8&255,T[F++]=g&255),T}function B(y){return h[y>>18&63]+h[y>>12&63]+h[y>>6&63]+h[y&63]}function m(y,g,_){for(var C,$=[],T=g;T<_;T+=3)C=(y[T]<<16&16711680)+(y[T+1]<<8&65280)+(y[T+2]&255),$.push(B(C));return $.join("")}function L(y){for(var g,_=y.length,C=_%3,$=[],T=16383,F=0,D=_-C;FD?D:F+T));return C===1?(g=y[_-1],$.push(h[g>>2]+h[g<<4&63]+"==")):C===2&&(g=(y[_-2]<<8)+y[_-1],$.push(h[g>>10]+h[g>>4&63]+h[g<<2&63]+"=")),$.join("")}return ot}function Fr(){if(sr)return dt;sr=!0;return dt.read=function(h,u,c,l,p){var f,i,E=p*8-l-1,d=(1<>1,B=-7,m=c?p-1:0,L=c?-1:1,y=h[u+m];for(m+=L,f=y&(1<<-B)-1,y>>=-B,B+=E;B>0;f=f*256+h[u+m],m+=L,B-=8);for(i=f&(1<<-B)-1,f>>=-B,B+=l;B>0;i=i*256+h[u+m],m+=L,B-=8);if(f===0)f=1-b;else {if(f===d)return i?NaN:(y?-1:1)*(1/0);i=i+Math.pow(2,l),f=f-b;}return (y?-1:1)*i*Math.pow(2,f-l)},dt.write=function(h,u,c,l,p,f){var i,E,d,b=f*8-p-1,B=(1<>1,L=p===23?Math.pow(2,-24)-Math.pow(2,-77):0,y=l?0:f-1,g=l?1:-1,_=u<0||u===0&&1/u<0?1:0;for(u=Math.abs(u),isNaN(u)||u===1/0?(E=isNaN(u)?1:0,i=B):(i=Math.floor(Math.log(u)/Math.LN2),u*(d=Math.pow(2,-i))<1&&(i--,d*=2),i+m>=1?u+=L/d:u+=L*Math.pow(2,1-m),u*d>=2&&(i++,d/=2),i+m>=B?(E=0,i=B):i+m>=1?(E=(u*d-1)*Math.pow(2,p),i=i+m):(E=u*Math.pow(2,m-1)*Math.pow(2,p),i=0));p>=8;h[c+y]=E&255,y+=g,E/=256,p-=8);for(i=i<0;h[c+y]=i&255,y+=g,i/=256,b-=8);h[c+y-g]|=_*128;},dt}function qr(){if(ur)return z;ur=!0;let h=$r(),u=Fr(),c=typeof Symbol=="function"&&typeof Symbol.for=="function"?Symbol.for("nodejs.util.inspect.custom"):null;z.Buffer=i,z.SlowBuffer=$,z.INSPECT_MAX_BYTES=50;let l=2147483647;z.kMaxLength=l,i.TYPED_ARRAY_SUPPORT=p(),!i.TYPED_ARRAY_SUPPORT&&typeof console!="undefined"&&typeof console.error=="function"&&console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.");function p(){try{let r=new Uint8Array(1),t={foo:function(){return 42}};return Object.setPrototypeOf(t,Uint8Array.prototype),Object.setPrototypeOf(r,t),r.foo()===42}catch(r){return !1}}Object.defineProperty(i.prototype,"parent",{enumerable:!0,get:function(){if(i.isBuffer(this))return this.buffer}}),Object.defineProperty(i.prototype,"offset",{enumerable:!0,get:function(){if(i.isBuffer(this))return this.byteOffset}});function f(r){if(r>l)throw new RangeError('The value "'+r+'" is invalid for option "size"');let t=new Uint8Array(r);return Object.setPrototypeOf(t,i.prototype),t}function i(r,t,e){if(typeof r=="number"){if(typeof t=="string")throw new TypeError('The "string" argument must be of type string. Received type number');return B(r)}return E(r,t,e)}i.poolSize=8192;function E(r,t,e){if(typeof r=="string")return m(r,t);if(ArrayBuffer.isView(r))return y(r);if(r==null)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof r);if(G(r,ArrayBuffer)||r&&G(r.buffer,ArrayBuffer)||typeof SharedArrayBuffer!="undefined"&&(G(r,SharedArrayBuffer)||r&&G(r.buffer,SharedArrayBuffer)))return g(r,t,e);if(typeof r=="number")throw new TypeError('The "value" argument must not be of type number. Received type number');let n=r.valueOf&&r.valueOf();if(n!=null&&n!==r)return i.from(n,t,e);let o=_(r);if(o)return o;if(typeof Symbol!="undefined"&&Symbol.toPrimitive!=null&&typeof r[Symbol.toPrimitive]=="function")return i.from(r[Symbol.toPrimitive]("string"),t,e);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof r)}i.from=function(r,t,e){return E(r,t,e)},Object.setPrototypeOf(i.prototype,Uint8Array.prototype),Object.setPrototypeOf(i,Uint8Array);function d(r){if(typeof r!="number")throw new TypeError('"size" argument must be of type number');if(r<0)throw new RangeError('The value "'+r+'" is invalid for option "size"')}function b(r,t,e){return d(r),r<=0?f(r):t!==void 0?typeof e=="string"?f(r).fill(t,e):f(r).fill(t):f(r)}i.alloc=function(r,t,e){return b(r,t,e)};function B(r){return d(r),f(r<0?0:C(r)|0)}i.allocUnsafe=function(r){return B(r)},i.allocUnsafeSlow=function(r){return B(r)};function m(r,t){if((typeof t!="string"||t==="")&&(t="utf8"),!i.isEncoding(t))throw new TypeError("Unknown encoding: "+t);let e=T(r,t)|0,n=f(e),o=n.write(r,t);return o!==e&&(n=n.slice(0,o)),n}function L(r){let t=r.length<0?0:C(r.length)|0,e=f(t);for(let n=0;n=l)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+l.toString(16)+" bytes");return r|0}function $(r){return +r!=r&&(r=0),i.alloc(+r)}i.isBuffer=function(t){return t!=null&&t._isBuffer===!0&&t!==i.prototype},i.compare=function(t,e){if(G(t,Uint8Array)&&(t=i.from(t,t.offset,t.byteLength)),G(e,Uint8Array)&&(e=i.from(e,e.offset,e.byteLength)),!i.isBuffer(t)||!i.isBuffer(e))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(t===e)return 0;let n=t.length,o=e.length;for(let s=0,a=Math.min(n,o);so.length?(i.isBuffer(a)||(a=i.from(a)),a.copy(o,s)):Uint8Array.prototype.set.call(o,a,s);else if(i.isBuffer(a))a.copy(o,s);else throw new TypeError('"list" argument must be an Array of Buffers');s+=a.length;}return o};function T(r,t){if(i.isBuffer(r))return r.length;if(ArrayBuffer.isView(r)||G(r,ArrayBuffer))return r.byteLength;if(typeof r!="string")throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof r);let e=r.length,n=arguments.length>2&&arguments[2]===!0;if(!n&&e===0)return 0;let o=!1;for(;;)switch(t){case"ascii":case"latin1":case"binary":return e;case"utf8":case"utf-8":return Et(r).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return e*2;case"hex":return e>>>1;case"base64":return Ft(r).length;default:if(o)return n?-1:Et(r).length;t=(""+t).toLowerCase(),o=!0;}}i.byteLength=T;function F(r,t,e){let n=!1;if((t===void 0||t<0)&&(t=0),t>this.length||((e===void 0||e>this.length)&&(e=this.length),e<=0)||(e>>>=0,t>>>=0,e<=t))return "";for(r||(r="utf8");;)switch(r){case"hex":return Ir(this,t,e);case"utf8":case"utf-8":return Ct(this,t,e);case"ascii":return Er(this,t,e);case"latin1":case"binary":return Br(this,t,e);case"base64":return wr(this,t,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _r(this,t,e);default:if(n)throw new TypeError("Unknown encoding: "+r);r=(r+"").toLowerCase(),n=!0;}}i.prototype._isBuffer=!0;function D(r,t,e){let n=r[t];r[t]=r[e],r[e]=n;}i.prototype.swap16=function(){let t=this.length;if(t%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;ee&&(t+=" ... "),""},c&&(i.prototype[c]=i.prototype.inspect),i.prototype.compare=function(t,e,n,o,s){if(G(t,Uint8Array)&&(t=i.from(t,t.offset,t.byteLength)),!i.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(e===void 0&&(e=0),n===void 0&&(n=t?t.length:0),o===void 0&&(o=0),s===void 0&&(s=this.length),e<0||n>t.length||o<0||s>this.length)throw new RangeError("out of range index");if(o>=s&&e>=n)return 0;if(o>=s)return -1;if(e>=n)return 1;if(e>>>=0,n>>>=0,o>>>=0,s>>>=0,this===t)return 0;let a=s-o,w=n-e,x=Math.min(a,w),A=this.slice(o,s),k=t.slice(e,n);for(let I=0;I2147483647?e=2147483647:e<-2147483648&&(e=-2147483648),e=+e,Bt(e)&&(e=o?0:r.length-1),e<0&&(e=r.length+e),e>=r.length){if(o)return -1;e=r.length-1;}else if(e<0)if(o)e=0;else return -1;if(typeof t=="string"&&(t=i.from(t,n)),i.isBuffer(t))return t.length===0?-1:Tt(r,t,e,n,o);if(typeof t=="number")return t=t&255,typeof Uint8Array.prototype.indexOf=="function"?o?Uint8Array.prototype.indexOf.call(r,t,e):Uint8Array.prototype.lastIndexOf.call(r,t,e):Tt(r,[t],e,n,o);throw new TypeError("val must be string, number or Buffer")}function Tt(r,t,e,n,o){let s=1,a=r.length,w=t.length;if(n!==void 0&&(n=String(n).toLowerCase(),n==="ucs2"||n==="ucs-2"||n==="utf16le"||n==="utf-16le")){if(r.length<2||t.length<2)return -1;s=2,a/=2,w/=2,e/=2;}function x(k,I){return s===1?k[I]:k.readUInt16BE(I*s)}let A;if(o){let k=-1;for(A=e;Aa&&(e=a-w),A=e;A>=0;A--){let k=!0;for(let I=0;Io&&(n=o)):n=o;let s=t.length;n>s/2&&(n=s/2);let a;for(a=0;a>>0,isFinite(n)?(n=n>>>0,o===void 0&&(o="utf8")):(o=n,n=void 0);else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");let s=this.length-e;if((n===void 0||n>s)&&(n=s),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");o||(o="utf8");let a=!1;for(;;)switch(o){case"hex":return lr(this,t,e,n);case"utf8":case"utf-8":return fr(this,t,e,n);case"ascii":case"latin1":case"binary":return dr(this,t,e,n);case"base64":return yr(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return mr(this,t,e,n);default:if(a)throw new TypeError("Unknown encoding: "+o);o=(""+o).toLowerCase(),a=!0;}},i.prototype.toJSON=function(){return {type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function wr(r,t,e){return t===0&&e===r.length?h.fromByteArray(r):h.fromByteArray(r.slice(t,e))}function Ct(r,t,e){e=Math.min(r.length,e);let n=[],o=t;for(;o239?4:s>223?3:s>191?2:1;if(o+w<=e){let x,A,k,I;switch(w){case 1:s<128&&(a=s);break;case 2:x=r[o+1],(x&192)===128&&(I=(s&31)<<6|x&63,I>127&&(a=I));break;case 3:x=r[o+1],A=r[o+2],(x&192)===128&&(A&192)===128&&(I=(s&15)<<12|(x&63)<<6|A&63,I>2047&&(I<55296||I>57343)&&(a=I));break;case 4:x=r[o+1],A=r[o+2],k=r[o+3],(x&192)===128&&(A&192)===128&&(k&192)===128&&(I=(s&15)<<18|(x&63)<<12|(A&63)<<6|k&63,I>65535&&I<1114112&&(a=I));}}a===null?(a=65533,w=1):a>65535&&(a-=65536,n.push(a>>>10&1023|55296),a=56320|a&1023),n.push(a),o+=w;}return gr(n)}let Rt=4096;function gr(r){let t=r.length;if(t<=Rt)return String.fromCharCode.apply(String,r);let e="",n=0;for(;nn)&&(e=n);let o="";for(let s=t;sn&&(t=n),e<0?(e+=n,e<0&&(e=0)):e>n&&(e=n),ee)throw new RangeError("Trying to access beyond buffer length")}i.prototype.readUintLE=i.prototype.readUIntLE=function(t,e,n){t=t>>>0,e=e>>>0,n||P(t,e,this.length);let o=this[t],s=1,a=0;for(;++a>>0,e=e>>>0,n||P(t,e,this.length);let o=this[t+--e],s=1;for(;e>0&&(s*=256);)o+=this[t+--e]*s;return o},i.prototype.readUint8=i.prototype.readUInt8=function(t,e){return t=t>>>0,e||P(t,1,this.length),this[t]},i.prototype.readUint16LE=i.prototype.readUInt16LE=function(t,e){return t=t>>>0,e||P(t,2,this.length),this[t]|this[t+1]<<8},i.prototype.readUint16BE=i.prototype.readUInt16BE=function(t,e){return t=t>>>0,e||P(t,2,this.length),this[t]<<8|this[t+1]},i.prototype.readUint32LE=i.prototype.readUInt32LE=function(t,e){return t=t>>>0,e||P(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+this[t+3]*16777216},i.prototype.readUint32BE=i.prototype.readUInt32BE=function(t,e){return t=t>>>0,e||P(t,4,this.length),this[t]*16777216+(this[t+1]<<16|this[t+2]<<8|this[t+3])},i.prototype.readBigUInt64LE=J(function(t){t=t>>>0,et(t,"offset");let e=this[t],n=this[t+7];(e===void 0||n===void 0)&&nt(t,this.length-8);let o=e+this[++t]*2**8+this[++t]*2**16+this[++t]*2**24,s=this[++t]+this[++t]*2**8+this[++t]*2**16+n*2**24;return BigInt(o)+(BigInt(s)<>>0,et(t,"offset");let e=this[t],n=this[t+7];(e===void 0||n===void 0)&&nt(t,this.length-8);let o=e*2**24+this[++t]*2**16+this[++t]*2**8+this[++t],s=this[++t]*2**24+this[++t]*2**16+this[++t]*2**8+n;return (BigInt(o)<>>0,e=e>>>0,n||P(t,e,this.length);let o=this[t],s=1,a=0;for(;++a=s&&(o-=Math.pow(2,8*e)),o},i.prototype.readIntBE=function(t,e,n){t=t>>>0,e=e>>>0,n||P(t,e,this.length);let o=e,s=1,a=this[t+--o];for(;o>0&&(s*=256);)a+=this[t+--o]*s;return s*=128,a>=s&&(a-=Math.pow(2,8*e)),a},i.prototype.readInt8=function(t,e){return t=t>>>0,e||P(t,1,this.length),this[t]&128?(255-this[t]+1)*-1:this[t]},i.prototype.readInt16LE=function(t,e){t=t>>>0,e||P(t,2,this.length);let n=this[t]|this[t+1]<<8;return n&32768?n|4294901760:n},i.prototype.readInt16BE=function(t,e){t=t>>>0,e||P(t,2,this.length);let n=this[t+1]|this[t]<<8;return n&32768?n|4294901760:n},i.prototype.readInt32LE=function(t,e){return t=t>>>0,e||P(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},i.prototype.readInt32BE=function(t,e){return t=t>>>0,e||P(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},i.prototype.readBigInt64LE=J(function(t){t=t>>>0,et(t,"offset");let e=this[t],n=this[t+7];(e===void 0||n===void 0)&&nt(t,this.length-8);let o=this[t+4]+this[t+5]*2**8+this[t+6]*2**16+(n<<24);return (BigInt(o)<>>0,et(t,"offset");let e=this[t],n=this[t+7];(e===void 0||n===void 0)&&nt(t,this.length-8);let o=(e<<24)+this[++t]*2**16+this[++t]*2**8+this[++t];return (BigInt(o)<>>0,e||P(t,4,this.length),u.read(this,t,!0,23,4)},i.prototype.readFloatBE=function(t,e){return t=t>>>0,e||P(t,4,this.length),u.read(this,t,!1,23,4)},i.prototype.readDoubleLE=function(t,e){return t=t>>>0,e||P(t,8,this.length),u.read(this,t,!0,52,8)},i.prototype.readDoubleBE=function(t,e){return t=t>>>0,e||P(t,8,this.length),u.read(this,t,!1,52,8)};function q(r,t,e,n,o,s){if(!i.isBuffer(r))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||tr.length)throw new RangeError("Index out of range")}i.prototype.writeUintLE=i.prototype.writeUIntLE=function(t,e,n,o){if(t=+t,e=e>>>0,n=n>>>0,!o){let w=Math.pow(2,8*n)-1;q(this,t,e,n,w,0);}let s=1,a=0;for(this[e]=t&255;++a>>0,n=n>>>0,!o){let w=Math.pow(2,8*n)-1;q(this,t,e,n,w,0);}let s=n-1,a=1;for(this[e+s]=t&255;--s>=0&&(a*=256);)this[e+s]=t/a&255;return e+n},i.prototype.writeUint8=i.prototype.writeUInt8=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,1,255,0),this[e]=t&255,e+1},i.prototype.writeUint16LE=i.prototype.writeUInt16LE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,2,65535,0),this[e]=t&255,this[e+1]=t>>>8,e+2},i.prototype.writeUint16BE=i.prototype.writeUInt16BE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=t&255,e+2},i.prototype.writeUint32LE=i.prototype.writeUInt32LE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=t&255,e+4},i.prototype.writeUint32BE=i.prototype.writeUInt32BE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=t&255,e+4};function Pt(r,t,e,n,o){$t(t,n,o,r,e,7);let s=Number(t&BigInt(4294967295));r[e++]=s,s=s>>8,r[e++]=s,s=s>>8,r[e++]=s,s=s>>8,r[e++]=s;let a=Number(t>>BigInt(32)&BigInt(4294967295));return r[e++]=a,a=a>>8,r[e++]=a,a=a>>8,r[e++]=a,a=a>>8,r[e++]=a,e}function Lt(r,t,e,n,o){$t(t,n,o,r,e,7);let s=Number(t&BigInt(4294967295));r[e+7]=s,s=s>>8,r[e+6]=s,s=s>>8,r[e+5]=s,s=s>>8,r[e+4]=s;let a=Number(t>>BigInt(32)&BigInt(4294967295));return r[e+3]=a,a=a>>8,r[e+2]=a,a=a>>8,r[e+1]=a,a=a>>8,r[e]=a,e+8}i.prototype.writeBigUInt64LE=J(function(t,e=0){return Pt(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))}),i.prototype.writeBigUInt64BE=J(function(t,e=0){return Lt(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))}),i.prototype.writeIntLE=function(t,e,n,o){if(t=+t,e=e>>>0,!o){let x=Math.pow(2,8*n-1);q(this,t,e,n,x-1,-x);}let s=0,a=1,w=0;for(this[e]=t&255;++s>0)-w&255;return e+n},i.prototype.writeIntBE=function(t,e,n,o){if(t=+t,e=e>>>0,!o){let x=Math.pow(2,8*n-1);q(this,t,e,n,x-1,-x);}let s=n-1,a=1,w=0;for(this[e+s]=t&255;--s>=0&&(a*=256);)t<0&&w===0&&this[e+s+1]!==0&&(w=1),this[e+s]=(t/a>>0)-w&255;return e+n},i.prototype.writeInt8=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=t&255,e+1},i.prototype.writeInt16LE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,2,32767,-32768),this[e]=t&255,this[e+1]=t>>>8,e+2},i.prototype.writeInt16BE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=t&255,e+2},i.prototype.writeInt32LE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,4,2147483647,-2147483648),this[e]=t&255,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},i.prototype.writeInt32BE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=t&255,e+4},i.prototype.writeBigInt64LE=J(function(t,e=0){return Pt(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),i.prototype.writeBigInt64BE=J(function(t,e=0){return Lt(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});function Nt(r,t,e,n,o,s){if(e+n>r.length)throw new RangeError("Index out of range");if(e<0)throw new RangeError("Index out of range")}function Wt(r,t,e,n,o){return t=+t,e=e>>>0,o||Nt(r,t,e,4),u.write(r,t,e,n,23,4),e+4}i.prototype.writeFloatLE=function(t,e,n){return Wt(this,t,e,!0,n)},i.prototype.writeFloatBE=function(t,e,n){return Wt(this,t,e,!1,n)};function Mt(r,t,e,n,o){return t=+t,e=e>>>0,o||Nt(r,t,e,8),u.write(r,t,e,n,52,8),e+8}i.prototype.writeDoubleLE=function(t,e,n){return Mt(this,t,e,!0,n)},i.prototype.writeDoubleBE=function(t,e,n){return Mt(this,t,e,!1,n)},i.prototype.copy=function(t,e,n,o){if(!i.isBuffer(t))throw new TypeError("argument should be a Buffer");if(n||(n=0),!o&&o!==0&&(o=this.length),e>=t.length&&(e=t.length),e||(e=0),o>0&&o=this.length)throw new RangeError("Index out of range");if(o<0)throw new RangeError("sourceEnd out of bounds");o>this.length&&(o=this.length),t.length-e>>0,n=n===void 0?this.length:n>>>0,t||(t=0);let s;if(typeof t=="number")for(s=e;s2**32?o=Ot(String(e)):typeof e=="bigint"&&(o=String(e),(e>BigInt(2)**BigInt(32)||e<-(BigInt(2)**BigInt(32)))&&(o=Ot(o)),o+="n"),n+=` It must be ${t}. Received ${o}`,n},RangeError);function Ot(r){let t="",e=r.length,n=r[0]==="-"?1:0;for(;e>=n+4;e-=3)t=`_${r.slice(e-3,e)}${t}`;return `${r.slice(0,e)}${t}`}function br(r,t,e){et(t,"offset"),(r[t]===void 0||r[t+e]===void 0)&&nt(t,r.length-(e+1));}function $t(r,t,e,n,o,s){if(r>e||r= 0${a} and < 2${a} ** ${(s+1)*8}${a}`:w=`>= -(2${a} ** ${(s+1)*8-1}${a}) and < 2 ** ${(s+1)*8-1}${a}`,new tt.ERR_OUT_OF_RANGE("value",w,r)}br(n,o,s);}function et(r,t){if(typeof r!="number")throw new tt.ERR_INVALID_ARG_TYPE(t,"number",r)}function nt(r,t,e){throw Math.floor(r)!==r?(et(r,e),new tt.ERR_OUT_OF_RANGE("offset","an integer",r)):t<0?new tt.ERR_BUFFER_OUT_OF_BOUNDS:new tt.ERR_OUT_OF_RANGE("offset",`>= ${0} and <= ${t}`,r)}let Ar=/[^+/0-9A-Za-z-_]/g;function xr(r){if(r=r.split("=")[0],r=r.trim().replace(Ar,""),r.length<2)return "";for(;r.length%4!==0;)r=r+"=";return r}function Et(r,t){t=t||1/0;let e,n=r.length,o=null,s=[];for(let a=0;a55295&&e<57344){if(!o){if(e>56319){(t-=3)>-1&&s.push(239,191,189);continue}else if(a+1===n){(t-=3)>-1&&s.push(239,191,189);continue}o=e;continue}if(e<56320){(t-=3)>-1&&s.push(239,191,189),o=e;continue}e=(o-55296<<10|e-56320)+65536;}else o&&(t-=3)>-1&&s.push(239,191,189);if(o=null,e<128){if((t-=1)<0)break;s.push(e);}else if(e<2048){if((t-=2)<0)break;s.push(e>>6|192,e&63|128);}else if(e<65536){if((t-=3)<0)break;s.push(e>>12|224,e>>6&63|128,e&63|128);}else if(e<1114112){if((t-=4)<0)break;s.push(e>>18|240,e>>12&63|128,e>>6&63|128,e&63|128);}else throw new Error("Invalid code point")}return s}function kr(r){let t=[];for(let e=0;e>8,o=e%256,s.push(o),s.push(n);return s}function Ft(r){return h.toByteArray(xr(r))}function ct(r,t,e,n){let o;for(o=0;o=t.length||o>=r.length);++o)t[o+e]=r[o];return o}function G(r,t){return r instanceof t||r!=null&&r.constructor!=null&&r.constructor.name!=null&&r.constructor.name===t.name}function Bt(r){return r!==r}let Sr=function(){let r="0123456789abcdef",t=new Array(256);for(let e=0;e<16;++e){let n=e*16;for(let o=0;o<16;++o)t[n+o]=r[e]+r[o];}return t}();function J(r){return typeof BigInt=="undefined"?Ur:r}function Ur(){throw new Error("BigInt not supported")}return z}var ot,or,dt,sr,z,ur,Z,Y,cr=it(()=>{v();U();S();ot={},or=!1;dt={},sr=!1;z={},ur=!1;Z=qr();Z.Buffer;Z.SlowBuffer;Z.INSPECT_MAX_BYTES;Z.kMaxLength;Y=Z.Buffer,Z.INSPECT_MAX_BYTES,Z.kMaxLength;});var U=it(()=>{cr();});var hr=Lr((sn,vt)=>{v();U();S();var Dr=Object.prototype.hasOwnProperty,O="~";function st(){}Object.create&&(st.prototype=Object.create(null),new st().__proto__||(O=!1));function jr(h,u,c){this.fn=h,this.context=u,this.once=c||!1;}function ar(h,u,c,l,p){if(typeof c!="function")throw new TypeError("The listener must be a function");var f=new jr(c,l||h,p),i=O?O+u:u;return h._events[i]?h._events[i].fn?h._events[i]=[h._events[i],f]:h._events[i].push(f):(h._events[i]=f,h._eventsCount++),h}function yt(h,u){--h._eventsCount===0?h._events=new st:delete h._events[u];}function W(){this._events=new st,this._eventsCount=0;}W.prototype.eventNames=function(){var u=[],c,l;if(this._eventsCount===0)return u;for(l in c=this._events)Dr.call(c,l)&&u.push(O?l.slice(1):l);return Object.getOwnPropertySymbols?u.concat(Object.getOwnPropertySymbols(c)):u};W.prototype.listeners=function(u){var c=O?O+u:u,l=this._events[c];if(!l)return [];if(l.fn)return [l.fn];for(var p=0,f=l.length,i=new Array(f);pthis.emit("open"),this.socket.onmessage=f=>this.emit("message",f.data),this.socket.onerror=f=>this.emit("error",f),this.socket.onclose=f=>{this.emit("close",f.code,f.reason);};}send(c,l,p){let f=p||l;try{this.socket.send(c),f();}catch(i){f(i);}}close(c,l){this.socket.close(c,l);}addEventListener(c,l,p){this.socket.addEventListener(c,l,p);}};function pr(h,u){return new St(h,u)}v();U();S();v();U();S();var mt=class{encode(u){return JSON.stringify(u)}decode(u){return JSON.parse(u)}};var wt=class extends ut.default{constructor(c,l="ws://localhost:8080",m={},b,B){var L=m,{autoconnect:p=!0,reconnect:f=!0,reconnect_interval:i=1e3,max_reconnects:E=5}=L,d=Dt(L,["autoconnect","reconnect","reconnect_interval","max_reconnects"]);super();R(this,"address");R(this,"rpc_id");R(this,"queue");R(this,"options");R(this,"autoconnect");R(this,"ready");R(this,"reconnect");R(this,"reconnect_timer_id");R(this,"reconnect_interval");R(this,"max_reconnects");R(this,"rest_options");R(this,"current_reconnects");R(this,"generate_request_id");R(this,"socket");R(this,"webSocketFactory");R(this,"dataPack");this.webSocketFactory=c,this.queue={},this.rpc_id=0,this.address=l,this.autoconnect=p,this.ready=!1,this.reconnect=f,this.reconnect_timer_id=void 0,this.reconnect_interval=i,this.max_reconnects=E,this.rest_options=d,this.current_reconnects=0,this.generate_request_id=b||(()=>++this.rpc_id),B?this.dataPack=B:this.dataPack=new mt,this.autoconnect&&this._connect(this.address,bt({autoconnect:this.autoconnect,reconnect:this.reconnect,reconnect_interval:this.reconnect_interval,max_reconnects:this.max_reconnects},this.rest_options));}connect(){this.socket||this._connect(this.address,bt({autoconnect:this.autoconnect,reconnect:this.reconnect,reconnect_interval:this.reconnect_interval,max_reconnects:this.max_reconnects},this.rest_options));}call(c,l,p,f){return !f&&typeof p=="object"&&(f=p,p=null),new Promise((i,E)=>{if(!this.ready)return E(new Error("socket not ready"));let d=this.generate_request_id(c,l),b={jsonrpc:"2.0",method:c,params:l||void 0,id:d};this.socket.send(this.dataPack.encode(b),f,B=>{if(B)return E(B);this.queue[d]={promise:[i,E]},p&&(this.queue[d].timeout=setTimeout(()=>{delete this.queue[d],E(new Error("reply timeout"));},p));});})}async login(c){let l=await this.call("rpc.login",c);if(!l)throw new Error("authentication failed");return l}async listMethods(){return await this.call("__listMethods")}notify(c,l){return new Promise((p,f)=>{if(!this.ready)return f(new Error("socket not ready"));let i={jsonrpc:"2.0",method:c,params:l};this.socket.send(this.dataPack.encode(i),E=>{if(E)return f(E);p();});})}async subscribe(c){typeof c=="string"&&(c=[c]);let l=await this.call("rpc.on",c);if(typeof c=="string"&&l[c]!=="ok")throw new Error("Failed subscribing to an event '"+c+"' with: "+l[c]);return l}async unsubscribe(c){typeof c=="string"&&(c=[c]);let l=await this.call("rpc.off",c);if(typeof c=="string"&&l[c]!=="ok")throw new Error("Failed unsubscribing from an event with: "+l);return l}close(c,l){this.socket.close(c||1e3,l);}setAutoReconnect(c){this.reconnect=c;}setReconnectInterval(c){this.reconnect_interval=c;}setMaxReconnects(c){this.max_reconnects=c;}_connect(c,l){clearTimeout(this.reconnect_timer_id),this.socket=this.webSocketFactory(c,l),this.socket.addEventListener("open",()=>{this.ready=!0,this.emit("open"),this.current_reconnects=0;}),this.socket.addEventListener("message",({data:p})=>{p instanceof ArrayBuffer&&(p=Y.from(p).toString());try{p=this.dataPack.decode(p);}catch(f){return}if(p.notification&&this.listeners(p.notification).length){if(!Object.keys(p.params).length)return this.emit(p.notification);let f=[p.notification];if(p.params.constructor===Object)f.push(p.params);else for(let i=0;i{this.emit.apply(this,f);})}if(!this.queue[p.id])return p.method?Promise.resolve().then(()=>{this.emit(p.method,p==null?void 0:p.params);}):void 0;"error"in p=="result"in p&&this.queue[p.id].promise[1](new Error('Server response malformed. Response must include either "result" or "error", but not both.')),this.queue[p.id].timeout&&clearTimeout(this.queue[p.id].timeout),p.error?this.queue[p.id].promise[1](p.error):this.queue[p.id].promise[0](p.result),delete this.queue[p.id];}),this.socket.addEventListener("error",p=>this.emit("error",p)),this.socket.addEventListener("close",({code:p,reason:f})=>{this.ready&&setTimeout(()=>this.emit("close",p,f),0),this.ready=!1,this.socket=void 0,p!==1e3&&(this.current_reconnects++,this.reconnect&&(this.max_reconnects>this.current_reconnects||this.max_reconnects===0)&&(this.reconnect_timer_id=setTimeout(()=>this._connect(c,l),this.reconnect_interval)));});}};v();U();S();var Ut=class extends wt{constructor(u="ws://localhost:8080",{autoconnect:c=!0,reconnect:l=!0,reconnect_interval:p=1e3,max_reconnects:f=5}={},i){super(pr,u,{autoconnect:c,reconnect:l,reconnect_interval:p,max_reconnects:f},i);}};/*! Bundled license information: + var Tr=Object.create;var ht=Object.defineProperty;var Cr=Object.getOwnPropertyDescriptor;var Rr=Object.getOwnPropertyNames,at=Object.getOwnPropertySymbols,Pr=Object.getPrototypeOf,_t=Object.prototype.hasOwnProperty,qt=Object.prototype.propertyIsEnumerable;var It=(h,u,c)=>u in h?ht(h,u,{enumerable:!0,configurable:!0,writable:!0,value:c}):h[u]=c,bt=(h,u)=>{for(var c in u||(u={}))_t.call(u,c)&&It(h,c,u[c]);if(at)for(var c of at(u))qt.call(u,c)&&It(h,c,u[c]);return h};var Dt=(h,u)=>{var c={};for(var l in h)_t.call(h,l)&&u.indexOf(l)<0&&(c[l]=h[l]);if(h!=null&&at)for(var l of at(h))u.indexOf(l)<0&&qt.call(h,l)&&(c[l]=h[l]);return c};var it=(h,u)=>()=>(h&&(u=h(h=0)),u);var Lr=(h,u)=>()=>(u||h((u={exports:{}}).exports,u),u.exports),Nr=(h,u)=>{for(var c in u)ht(h,c,{get:u[c],enumerable:!0});},Wr=(h,u,c,l)=>{if(u&&typeof u=="object"||typeof u=="function")for(let p of Rr(u))!_t.call(h,p)&&p!==c&&ht(h,p,{get:()=>u[p],enumerable:!(l=Cr(u,p))||l.enumerable});return h};var Mr=(h,u,c)=>(c=h!=null?Tr(Pr(h)):{},Wr(ht(c,"default",{value:h,enumerable:!0}),h));var R=(h,u,c)=>It(h,typeof u!="symbol"?u+"":u,c);var v=it(()=>{});var j={};Nr(j,{_debugEnd:()=>Te,_debugProcess:()=>Ue,_events:()=>He,_eventsCount:()=>Ke,_exiting:()=>he,_fatalExceptions:()=>xe,_getActiveHandles:()=>de,_getActiveRequests:()=>fe,_kill:()=>me,_linkedBinding:()=>ce,_maxListeners:()=>Ge,_preload_modules:()=>De,_rawDebug:()=>se,_startProfilerIdleNotifier:()=>Ce,_stopProfilerIdleNotifier:()=>Re,_tickCallback:()=>Se,abort:()=>We,addListener:()=>Xe,allowedNodeEnvironmentFlags:()=>_e,arch:()=>Kt,argv:()=>Qt,argv0:()=>qe,assert:()=>be,binding:()=>ee,chdir:()=>ie,config:()=>pe,cpuUsage:()=>ft,cwd:()=>ne,debugPort:()=>Fe,default:()=>nr,dlopen:()=>le,domain:()=>ae,emit:()=>Ze,emitWarning:()=>te,env:()=>Jt,execArgv:()=>Vt,execPath:()=>$e,exit:()=>Be,features:()=>Ae,hasUncaughtExceptionCaptureCallback:()=>ve,hrtime:()=>lt,kill:()=>Ee,listeners:()=>rr,memoryUsage:()=>ge,moduleLoadList:()=>ue,nextTick:()=>Yt,off:()=>Qe,on:()=>X,once:()=>Je,openStdin:()=>Ie,pid:()=>Me,platform:()=>Xt,ppid:()=>Oe,prependListener:()=>tr,prependOnceListener:()=>er,reallyExit:()=>ye,release:()=>oe,removeAllListeners:()=>ze,removeListener:()=>Ve,resourceUsage:()=>we,setSourceMapsEnabled:()=>je,setUncaughtExceptionCaptureCallback:()=>ke,stderr:()=>Le,stdin:()=>Ne,stdout:()=>Pe,title:()=>Ht,umask:()=>re,uptime:()=>Ye,version:()=>zt,versions:()=>Zt});function kt(h){throw new Error("Node.js process "+h+" is not supported by JSPM core outside of Node.js")}function Or(){!rt||!V||(rt=!1,V.length?H=V.concat(H):pt=-1,H.length&&jt());}function jt(){if(!rt){var h=setTimeout(Or,0);rt=!0;for(var u=H.length;u;){for(V=H,H=[];++pt1)for(var c=1;c{v();U();S();H=[],rt=!1,pt=-1;Gt.prototype.run=function(){this.fun.apply(null,this.array);};Ht="browser",Kt="x64",Xt="browser",Jt={PATH:"/usr/bin",LANG:navigator.language+".UTF-8",PWD:"/",HOME:"/home",TMP:"/tmp"},Qt=["/usr/bin/node"],Vt=[],zt="v16.8.0",Zt={},te=function(h,u){console.warn((u?u+": ":"")+h);},ee=function(h){kt("binding");},re=function(h){return 0},ne=function(){return "/"},ie=function(h){},oe={name:"node",sourceUrl:"",headersUrl:"",libUrl:""};se=N,ue=[];ae={},he=!1,pe={};ye=N,me=N,ft=function(){return {}},we=ft,ge=ft,Ee=N,Be=N,Ie=N,_e={};Ae={inspector:!1,debug:!1,uv:!1,ipv6:!1,tls_alpn:!1,tls_sni:!1,tls_ocsp:!1,tls:!1,cached_builtins:!0},xe=N,ke=N;Se=N,Ue=N,Te=N,Ce=N,Re=N,Pe=void 0,Le=void 0,Ne=void 0,We=N,Me=2,Oe=1,$e="/bin/usr/node",Fe=9229,qe="node",De=[],je=N,Q={now:typeof performance!="undefined"?performance.now.bind(performance):void 0,timing:typeof performance!="undefined"?performance.timing:void 0};Q.now===void 0&&(At=Date.now(),Q.timing&&Q.timing.navigationStart&&(At=Q.timing.navigationStart),Q.now=()=>Date.now()-At);xt=1e9;lt.bigint=function(h){var u=lt(h);return typeof BigInt=="undefined"?u[0]*xt+u[1]:BigInt(u[0]*xt)+BigInt(u[1])};Ge=10,He={},Ke=0;Xe=X,Je=X,Qe=X,Ve=X,ze=X,Ze=N,tr=X,er=X;nr={version:zt,versions:Zt,arch:Kt,platform:Xt,release:oe,_rawDebug:se,moduleLoadList:ue,binding:ee,_linkedBinding:ce,_events:He,_eventsCount:Ke,_maxListeners:Ge,on:X,addListener:Xe,once:Je,off:Qe,removeListener:Ve,removeAllListeners:ze,emit:Ze,prependListener:tr,prependOnceListener:er,listeners:rr,domain:ae,_exiting:he,config:pe,dlopen:le,uptime:Ye,_getActiveRequests:fe,_getActiveHandles:de,reallyExit:ye,_kill:me,cpuUsage:ft,resourceUsage:we,memoryUsage:ge,kill:Ee,exit:Be,openStdin:Ie,allowedNodeEnvironmentFlags:_e,assert:be,features:Ae,_fatalExceptions:xe,setUncaughtExceptionCaptureCallback:ke,hasUncaughtExceptionCaptureCallback:ve,emitWarning:te,nextTick:Yt,_tickCallback:Se,_debugProcess:Ue,_debugEnd:Te,_startProfilerIdleNotifier:Ce,_stopProfilerIdleNotifier:Re,stdout:Pe,stdin:Ne,stderr:Le,abort:We,umask:re,chdir:ie,cwd:ne,env:Jt,title:Ht,argv:Qt,execArgv:Vt,pid:Me,ppid:Oe,execPath:$e,debugPort:Fe,hrtime:lt,argv0:qe,_preload_modules:De,setSourceMapsEnabled:je};});var S=it(()=>{ir();});function $r(){if(or)return ot;or=!0,ot.byteLength=E,ot.toByteArray=b,ot.fromByteArray=L;for(var h=[],u=[],c=typeof Uint8Array!="undefined"?Uint8Array:Array,l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",p=0,f=l.length;p0)throw new Error("Invalid string. Length must be a multiple of 4");var _=y.indexOf("=");_===-1&&(_=g);var C=_===g?0:4-_%4;return [_,C]}function E(y){var g=i(y),_=g[0],C=g[1];return (_+C)*3/4-C}function d(y,g,_){return (g+_)*3/4-_}function b(y){var g,_=i(y),C=_[0],$=_[1],T=new c(d(y,C,$)),F=0,D=$>0?C-4:C,M;for(M=0;M>16&255,T[F++]=g>>8&255,T[F++]=g&255;return $===2&&(g=u[y.charCodeAt(M)]<<2|u[y.charCodeAt(M+1)]>>4,T[F++]=g&255),$===1&&(g=u[y.charCodeAt(M)]<<10|u[y.charCodeAt(M+1)]<<4|u[y.charCodeAt(M+2)]>>2,T[F++]=g>>8&255,T[F++]=g&255),T}function B(y){return h[y>>18&63]+h[y>>12&63]+h[y>>6&63]+h[y&63]}function m(y,g,_){for(var C,$=[],T=g;T<_;T+=3)C=(y[T]<<16&16711680)+(y[T+1]<<8&65280)+(y[T+2]&255),$.push(B(C));return $.join("")}function L(y){for(var g,_=y.length,C=_%3,$=[],T=16383,F=0,D=_-C;FD?D:F+T));return C===1?(g=y[_-1],$.push(h[g>>2]+h[g<<4&63]+"==")):C===2&&(g=(y[_-2]<<8)+y[_-1],$.push(h[g>>10]+h[g>>4&63]+h[g<<2&63]+"=")),$.join("")}return ot}function Fr(){if(sr)return dt;sr=!0;return dt.read=function(h,u,c,l,p){var f,i,E=p*8-l-1,d=(1<>1,B=-7,m=c?p-1:0,L=c?-1:1,y=h[u+m];for(m+=L,f=y&(1<<-B)-1,y>>=-B,B+=E;B>0;f=f*256+h[u+m],m+=L,B-=8);for(i=f&(1<<-B)-1,f>>=-B,B+=l;B>0;i=i*256+h[u+m],m+=L,B-=8);if(f===0)f=1-b;else {if(f===d)return i?NaN:(y?-1:1)*(1/0);i=i+Math.pow(2,l),f=f-b;}return (y?-1:1)*i*Math.pow(2,f-l)},dt.write=function(h,u,c,l,p,f){var i,E,d,b=f*8-p-1,B=(1<>1,L=p===23?Math.pow(2,-24)-Math.pow(2,-77):0,y=l?0:f-1,g=l?1:-1,_=u<0||u===0&&1/u<0?1:0;for(u=Math.abs(u),isNaN(u)||u===1/0?(E=isNaN(u)?1:0,i=B):(i=Math.floor(Math.log(u)/Math.LN2),u*(d=Math.pow(2,-i))<1&&(i--,d*=2),i+m>=1?u+=L/d:u+=L*Math.pow(2,1-m),u*d>=2&&(i++,d/=2),i+m>=B?(E=0,i=B):i+m>=1?(E=(u*d-1)*Math.pow(2,p),i=i+m):(E=u*Math.pow(2,m-1)*Math.pow(2,p),i=0));p>=8;h[c+y]=E&255,y+=g,E/=256,p-=8);for(i=i<0;h[c+y]=i&255,y+=g,i/=256,b-=8);h[c+y-g]|=_*128;},dt}function qr(){if(ur)return z;ur=!0;let h=$r(),u=Fr(),c=typeof Symbol=="function"&&typeof Symbol.for=="function"?Symbol.for("nodejs.util.inspect.custom"):null;z.Buffer=i,z.SlowBuffer=$,z.INSPECT_MAX_BYTES=50;let l=2147483647;z.kMaxLength=l,i.TYPED_ARRAY_SUPPORT=p(),!i.TYPED_ARRAY_SUPPORT&&typeof console!="undefined"&&typeof console.error=="function"&&console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.");function p(){try{let r=new Uint8Array(1),t={foo:function(){return 42}};return Object.setPrototypeOf(t,Uint8Array.prototype),Object.setPrototypeOf(r,t),r.foo()===42}catch(r){return !1}}Object.defineProperty(i.prototype,"parent",{enumerable:!0,get:function(){if(i.isBuffer(this))return this.buffer}}),Object.defineProperty(i.prototype,"offset",{enumerable:!0,get:function(){if(i.isBuffer(this))return this.byteOffset}});function f(r){if(r>l)throw new RangeError('The value "'+r+'" is invalid for option "size"');let t=new Uint8Array(r);return Object.setPrototypeOf(t,i.prototype),t}function i(r,t,e){if(typeof r=="number"){if(typeof t=="string")throw new TypeError('The "string" argument must be of type string. Received type number');return B(r)}return E(r,t,e)}i.poolSize=8192;function E(r,t,e){if(typeof r=="string")return m(r,t);if(ArrayBuffer.isView(r))return y(r);if(r==null)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof r);if(G(r,ArrayBuffer)||r&&G(r.buffer,ArrayBuffer)||typeof SharedArrayBuffer!="undefined"&&(G(r,SharedArrayBuffer)||r&&G(r.buffer,SharedArrayBuffer)))return g(r,t,e);if(typeof r=="number")throw new TypeError('The "value" argument must not be of type number. Received type number');let n=r.valueOf&&r.valueOf();if(n!=null&&n!==r)return i.from(n,t,e);let o=_(r);if(o)return o;if(typeof Symbol!="undefined"&&Symbol.toPrimitive!=null&&typeof r[Symbol.toPrimitive]=="function")return i.from(r[Symbol.toPrimitive]("string"),t,e);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof r)}i.from=function(r,t,e){return E(r,t,e)},Object.setPrototypeOf(i.prototype,Uint8Array.prototype),Object.setPrototypeOf(i,Uint8Array);function d(r){if(typeof r!="number")throw new TypeError('"size" argument must be of type number');if(r<0)throw new RangeError('The value "'+r+'" is invalid for option "size"')}function b(r,t,e){return d(r),r<=0?f(r):t!==void 0?typeof e=="string"?f(r).fill(t,e):f(r).fill(t):f(r)}i.alloc=function(r,t,e){return b(r,t,e)};function B(r){return d(r),f(r<0?0:C(r)|0)}i.allocUnsafe=function(r){return B(r)},i.allocUnsafeSlow=function(r){return B(r)};function m(r,t){if((typeof t!="string"||t==="")&&(t="utf8"),!i.isEncoding(t))throw new TypeError("Unknown encoding: "+t);let e=T(r,t)|0,n=f(e),o=n.write(r,t);return o!==e&&(n=n.slice(0,o)),n}function L(r){let t=r.length<0?0:C(r.length)|0,e=f(t);for(let n=0;n=l)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+l.toString(16)+" bytes");return r|0}function $(r){return +r!=r&&(r=0),i.alloc(+r)}i.isBuffer=function(t){return t!=null&&t._isBuffer===!0&&t!==i.prototype},i.compare=function(t,e){if(G(t,Uint8Array)&&(t=i.from(t,t.offset,t.byteLength)),G(e,Uint8Array)&&(e=i.from(e,e.offset,e.byteLength)),!i.isBuffer(t)||!i.isBuffer(e))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(t===e)return 0;let n=t.length,o=e.length;for(let s=0,a=Math.min(n,o);so.length?(i.isBuffer(a)||(a=i.from(a)),a.copy(o,s)):Uint8Array.prototype.set.call(o,a,s);else if(i.isBuffer(a))a.copy(o,s);else throw new TypeError('"list" argument must be an Array of Buffers');s+=a.length;}return o};function T(r,t){if(i.isBuffer(r))return r.length;if(ArrayBuffer.isView(r)||G(r,ArrayBuffer))return r.byteLength;if(typeof r!="string")throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof r);let e=r.length,n=arguments.length>2&&arguments[2]===!0;if(!n&&e===0)return 0;let o=!1;for(;;)switch(t){case"ascii":case"latin1":case"binary":return e;case"utf8":case"utf-8":return Et(r).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return e*2;case"hex":return e>>>1;case"base64":return Ft(r).length;default:if(o)return n?-1:Et(r).length;t=(""+t).toLowerCase(),o=!0;}}i.byteLength=T;function F(r,t,e){let n=!1;if((t===void 0||t<0)&&(t=0),t>this.length||((e===void 0||e>this.length)&&(e=this.length),e<=0)||(e>>>=0,t>>>=0,e<=t))return "";for(r||(r="utf8");;)switch(r){case"hex":return Ir(this,t,e);case"utf8":case"utf-8":return Ct(this,t,e);case"ascii":return Er(this,t,e);case"latin1":case"binary":return Br(this,t,e);case"base64":return wr(this,t,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _r(this,t,e);default:if(n)throw new TypeError("Unknown encoding: "+r);r=(r+"").toLowerCase(),n=!0;}}i.prototype._isBuffer=!0;function D(r,t,e){let n=r[t];r[t]=r[e],r[e]=n;}i.prototype.swap16=function(){let t=this.length;if(t%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let e=0;ee&&(t+=" ... "),""},c&&(i.prototype[c]=i.prototype.inspect),i.prototype.compare=function(t,e,n,o,s){if(G(t,Uint8Array)&&(t=i.from(t,t.offset,t.byteLength)),!i.isBuffer(t))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof t);if(e===void 0&&(e=0),n===void 0&&(n=t?t.length:0),o===void 0&&(o=0),s===void 0&&(s=this.length),e<0||n>t.length||o<0||s>this.length)throw new RangeError("out of range index");if(o>=s&&e>=n)return 0;if(o>=s)return -1;if(e>=n)return 1;if(e>>>=0,n>>>=0,o>>>=0,s>>>=0,this===t)return 0;let a=s-o,w=n-e,x=Math.min(a,w),A=this.slice(o,s),k=t.slice(e,n);for(let I=0;I2147483647?e=2147483647:e<-2147483648&&(e=-2147483648),e=+e,Bt(e)&&(e=o?0:r.length-1),e<0&&(e=r.length+e),e>=r.length){if(o)return -1;e=r.length-1;}else if(e<0)if(o)e=0;else return -1;if(typeof t=="string"&&(t=i.from(t,n)),i.isBuffer(t))return t.length===0?-1:Tt(r,t,e,n,o);if(typeof t=="number")return t=t&255,typeof Uint8Array.prototype.indexOf=="function"?o?Uint8Array.prototype.indexOf.call(r,t,e):Uint8Array.prototype.lastIndexOf.call(r,t,e):Tt(r,[t],e,n,o);throw new TypeError("val must be string, number or Buffer")}function Tt(r,t,e,n,o){let s=1,a=r.length,w=t.length;if(n!==void 0&&(n=String(n).toLowerCase(),n==="ucs2"||n==="ucs-2"||n==="utf16le"||n==="utf-16le")){if(r.length<2||t.length<2)return -1;s=2,a/=2,w/=2,e/=2;}function x(k,I){return s===1?k[I]:k.readUInt16BE(I*s)}let A;if(o){let k=-1;for(A=e;Aa&&(e=a-w),A=e;A>=0;A--){let k=!0;for(let I=0;Io&&(n=o)):n=o;let s=t.length;n>s/2&&(n=s/2);let a;for(a=0;a>>0,isFinite(n)?(n=n>>>0,o===void 0&&(o="utf8")):(o=n,n=void 0);else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");let s=this.length-e;if((n===void 0||n>s)&&(n=s),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");o||(o="utf8");let a=!1;for(;;)switch(o){case"hex":return lr(this,t,e,n);case"utf8":case"utf-8":return fr(this,t,e,n);case"ascii":case"latin1":case"binary":return dr(this,t,e,n);case"base64":return yr(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return mr(this,t,e,n);default:if(a)throw new TypeError("Unknown encoding: "+o);o=(""+o).toLowerCase(),a=!0;}},i.prototype.toJSON=function(){return {type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function wr(r,t,e){return t===0&&e===r.length?h.fromByteArray(r):h.fromByteArray(r.slice(t,e))}function Ct(r,t,e){e=Math.min(r.length,e);let n=[],o=t;for(;o239?4:s>223?3:s>191?2:1;if(o+w<=e){let x,A,k,I;switch(w){case 1:s<128&&(a=s);break;case 2:x=r[o+1],(x&192)===128&&(I=(s&31)<<6|x&63,I>127&&(a=I));break;case 3:x=r[o+1],A=r[o+2],(x&192)===128&&(A&192)===128&&(I=(s&15)<<12|(x&63)<<6|A&63,I>2047&&(I<55296||I>57343)&&(a=I));break;case 4:x=r[o+1],A=r[o+2],k=r[o+3],(x&192)===128&&(A&192)===128&&(k&192)===128&&(I=(s&15)<<18|(x&63)<<12|(A&63)<<6|k&63,I>65535&&I<1114112&&(a=I));}}a===null?(a=65533,w=1):a>65535&&(a-=65536,n.push(a>>>10&1023|55296),a=56320|a&1023),n.push(a),o+=w;}return gr(n)}let Rt=4096;function gr(r){let t=r.length;if(t<=Rt)return String.fromCharCode.apply(String,r);let e="",n=0;for(;nn)&&(e=n);let o="";for(let s=t;sn&&(t=n),e<0?(e+=n,e<0&&(e=0)):e>n&&(e=n),ee)throw new RangeError("Trying to access beyond buffer length")}i.prototype.readUintLE=i.prototype.readUIntLE=function(t,e,n){t=t>>>0,e=e>>>0,n||P(t,e,this.length);let o=this[t],s=1,a=0;for(;++a>>0,e=e>>>0,n||P(t,e,this.length);let o=this[t+--e],s=1;for(;e>0&&(s*=256);)o+=this[t+--e]*s;return o},i.prototype.readUint8=i.prototype.readUInt8=function(t,e){return t=t>>>0,e||P(t,1,this.length),this[t]},i.prototype.readUint16LE=i.prototype.readUInt16LE=function(t,e){return t=t>>>0,e||P(t,2,this.length),this[t]|this[t+1]<<8},i.prototype.readUint16BE=i.prototype.readUInt16BE=function(t,e){return t=t>>>0,e||P(t,2,this.length),this[t]<<8|this[t+1]},i.prototype.readUint32LE=i.prototype.readUInt32LE=function(t,e){return t=t>>>0,e||P(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+this[t+3]*16777216},i.prototype.readUint32BE=i.prototype.readUInt32BE=function(t,e){return t=t>>>0,e||P(t,4,this.length),this[t]*16777216+(this[t+1]<<16|this[t+2]<<8|this[t+3])},i.prototype.readBigUInt64LE=J(function(t){t=t>>>0,et(t,"offset");let e=this[t],n=this[t+7];(e===void 0||n===void 0)&&nt(t,this.length-8);let o=e+this[++t]*2**8+this[++t]*2**16+this[++t]*2**24,s=this[++t]+this[++t]*2**8+this[++t]*2**16+n*2**24;return BigInt(o)+(BigInt(s)<>>0,et(t,"offset");let e=this[t],n=this[t+7];(e===void 0||n===void 0)&&nt(t,this.length-8);let o=e*2**24+this[++t]*2**16+this[++t]*2**8+this[++t],s=this[++t]*2**24+this[++t]*2**16+this[++t]*2**8+n;return (BigInt(o)<>>0,e=e>>>0,n||P(t,e,this.length);let o=this[t],s=1,a=0;for(;++a=s&&(o-=Math.pow(2,8*e)),o},i.prototype.readIntBE=function(t,e,n){t=t>>>0,e=e>>>0,n||P(t,e,this.length);let o=e,s=1,a=this[t+--o];for(;o>0&&(s*=256);)a+=this[t+--o]*s;return s*=128,a>=s&&(a-=Math.pow(2,8*e)),a},i.prototype.readInt8=function(t,e){return t=t>>>0,e||P(t,1,this.length),this[t]&128?(255-this[t]+1)*-1:this[t]},i.prototype.readInt16LE=function(t,e){t=t>>>0,e||P(t,2,this.length);let n=this[t]|this[t+1]<<8;return n&32768?n|4294901760:n},i.prototype.readInt16BE=function(t,e){t=t>>>0,e||P(t,2,this.length);let n=this[t+1]|this[t]<<8;return n&32768?n|4294901760:n},i.prototype.readInt32LE=function(t,e){return t=t>>>0,e||P(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},i.prototype.readInt32BE=function(t,e){return t=t>>>0,e||P(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},i.prototype.readBigInt64LE=J(function(t){t=t>>>0,et(t,"offset");let e=this[t],n=this[t+7];(e===void 0||n===void 0)&&nt(t,this.length-8);let o=this[t+4]+this[t+5]*2**8+this[t+6]*2**16+(n<<24);return (BigInt(o)<>>0,et(t,"offset");let e=this[t],n=this[t+7];(e===void 0||n===void 0)&&nt(t,this.length-8);let o=(e<<24)+this[++t]*2**16+this[++t]*2**8+this[++t];return (BigInt(o)<>>0,e||P(t,4,this.length),u.read(this,t,!0,23,4)},i.prototype.readFloatBE=function(t,e){return t=t>>>0,e||P(t,4,this.length),u.read(this,t,!1,23,4)},i.prototype.readDoubleLE=function(t,e){return t=t>>>0,e||P(t,8,this.length),u.read(this,t,!0,52,8)},i.prototype.readDoubleBE=function(t,e){return t=t>>>0,e||P(t,8,this.length),u.read(this,t,!1,52,8)};function q(r,t,e,n,o,s){if(!i.isBuffer(r))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>o||tr.length)throw new RangeError("Index out of range")}i.prototype.writeUintLE=i.prototype.writeUIntLE=function(t,e,n,o){if(t=+t,e=e>>>0,n=n>>>0,!o){let w=Math.pow(2,8*n)-1;q(this,t,e,n,w,0);}let s=1,a=0;for(this[e]=t&255;++a>>0,n=n>>>0,!o){let w=Math.pow(2,8*n)-1;q(this,t,e,n,w,0);}let s=n-1,a=1;for(this[e+s]=t&255;--s>=0&&(a*=256);)this[e+s]=t/a&255;return e+n},i.prototype.writeUint8=i.prototype.writeUInt8=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,1,255,0),this[e]=t&255,e+1},i.prototype.writeUint16LE=i.prototype.writeUInt16LE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,2,65535,0),this[e]=t&255,this[e+1]=t>>>8,e+2},i.prototype.writeUint16BE=i.prototype.writeUInt16BE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=t&255,e+2},i.prototype.writeUint32LE=i.prototype.writeUInt32LE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=t&255,e+4},i.prototype.writeUint32BE=i.prototype.writeUInt32BE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=t&255,e+4};function Pt(r,t,e,n,o){$t(t,n,o,r,e,7);let s=Number(t&BigInt(4294967295));r[e++]=s,s=s>>8,r[e++]=s,s=s>>8,r[e++]=s,s=s>>8,r[e++]=s;let a=Number(t>>BigInt(32)&BigInt(4294967295));return r[e++]=a,a=a>>8,r[e++]=a,a=a>>8,r[e++]=a,a=a>>8,r[e++]=a,e}function Lt(r,t,e,n,o){$t(t,n,o,r,e,7);let s=Number(t&BigInt(4294967295));r[e+7]=s,s=s>>8,r[e+6]=s,s=s>>8,r[e+5]=s,s=s>>8,r[e+4]=s;let a=Number(t>>BigInt(32)&BigInt(4294967295));return r[e+3]=a,a=a>>8,r[e+2]=a,a=a>>8,r[e+1]=a,a=a>>8,r[e]=a,e+8}i.prototype.writeBigUInt64LE=J(function(t,e=0){return Pt(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))}),i.prototype.writeBigUInt64BE=J(function(t,e=0){return Lt(this,t,e,BigInt(0),BigInt("0xffffffffffffffff"))}),i.prototype.writeIntLE=function(t,e,n,o){if(t=+t,e=e>>>0,!o){let x=Math.pow(2,8*n-1);q(this,t,e,n,x-1,-x);}let s=0,a=1,w=0;for(this[e]=t&255;++s>0)-w&255;return e+n},i.prototype.writeIntBE=function(t,e,n,o){if(t=+t,e=e>>>0,!o){let x=Math.pow(2,8*n-1);q(this,t,e,n,x-1,-x);}let s=n-1,a=1,w=0;for(this[e+s]=t&255;--s>=0&&(a*=256);)t<0&&w===0&&this[e+s+1]!==0&&(w=1),this[e+s]=(t/a>>0)-w&255;return e+n},i.prototype.writeInt8=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=t&255,e+1},i.prototype.writeInt16LE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,2,32767,-32768),this[e]=t&255,this[e+1]=t>>>8,e+2},i.prototype.writeInt16BE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=t&255,e+2},i.prototype.writeInt32LE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,4,2147483647,-2147483648),this[e]=t&255,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},i.prototype.writeInt32BE=function(t,e,n){return t=+t,e=e>>>0,n||q(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=t&255,e+4},i.prototype.writeBigInt64LE=J(function(t,e=0){return Pt(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))}),i.prototype.writeBigInt64BE=J(function(t,e=0){return Lt(this,t,e,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});function Nt(r,t,e,n,o,s){if(e+n>r.length)throw new RangeError("Index out of range");if(e<0)throw new RangeError("Index out of range")}function Wt(r,t,e,n,o){return t=+t,e=e>>>0,o||Nt(r,t,e,4),u.write(r,t,e,n,23,4),e+4}i.prototype.writeFloatLE=function(t,e,n){return Wt(this,t,e,!0,n)},i.prototype.writeFloatBE=function(t,e,n){return Wt(this,t,e,!1,n)};function Mt(r,t,e,n,o){return t=+t,e=e>>>0,o||Nt(r,t,e,8),u.write(r,t,e,n,52,8),e+8}i.prototype.writeDoubleLE=function(t,e,n){return Mt(this,t,e,!0,n)},i.prototype.writeDoubleBE=function(t,e,n){return Mt(this,t,e,!1,n)},i.prototype.copy=function(t,e,n,o){if(!i.isBuffer(t))throw new TypeError("argument should be a Buffer");if(n||(n=0),!o&&o!==0&&(o=this.length),e>=t.length&&(e=t.length),e||(e=0),o>0&&o=this.length)throw new RangeError("Index out of range");if(o<0)throw new RangeError("sourceEnd out of bounds");o>this.length&&(o=this.length),t.length-e>>0,n=n===void 0?this.length:n>>>0,t||(t=0);let s;if(typeof t=="number")for(s=e;s2**32?o=Ot(String(e)):typeof e=="bigint"&&(o=String(e),(e>BigInt(2)**BigInt(32)||e<-(BigInt(2)**BigInt(32)))&&(o=Ot(o)),o+="n"),n+=` It must be ${t}. Received ${o}`,n},RangeError);function Ot(r){let t="",e=r.length,n=r[0]==="-"?1:0;for(;e>=n+4;e-=3)t=`_${r.slice(e-3,e)}${t}`;return `${r.slice(0,e)}${t}`}function br(r,t,e){et(t,"offset"),(r[t]===void 0||r[t+e]===void 0)&&nt(t,r.length-(e+1));}function $t(r,t,e,n,o,s){if(r>e||r= 0${a} and < 2${a} ** ${(s+1)*8}${a}`:w=`>= -(2${a} ** ${(s+1)*8-1}${a}) and < 2 ** ${(s+1)*8-1}${a}`,new tt.ERR_OUT_OF_RANGE("value",w,r)}br(n,o,s);}function et(r,t){if(typeof r!="number")throw new tt.ERR_INVALID_ARG_TYPE(t,"number",r)}function nt(r,t,e){throw Math.floor(r)!==r?(et(r,e),new tt.ERR_OUT_OF_RANGE("offset","an integer",r)):t<0?new tt.ERR_BUFFER_OUT_OF_BOUNDS:new tt.ERR_OUT_OF_RANGE("offset",`>= ${0} and <= ${t}`,r)}let Ar=/[^+/0-9A-Za-z-_]/g;function xr(r){if(r=r.split("=")[0],r=r.trim().replace(Ar,""),r.length<2)return "";for(;r.length%4!==0;)r=r+"=";return r}function Et(r,t){t=t||1/0;let e,n=r.length,o=null,s=[];for(let a=0;a55295&&e<57344){if(!o){if(e>56319){(t-=3)>-1&&s.push(239,191,189);continue}else if(a+1===n){(t-=3)>-1&&s.push(239,191,189);continue}o=e;continue}if(e<56320){(t-=3)>-1&&s.push(239,191,189),o=e;continue}e=(o-55296<<10|e-56320)+65536;}else o&&(t-=3)>-1&&s.push(239,191,189);if(o=null,e<128){if((t-=1)<0)break;s.push(e);}else if(e<2048){if((t-=2)<0)break;s.push(e>>6|192,e&63|128);}else if(e<65536){if((t-=3)<0)break;s.push(e>>12|224,e>>6&63|128,e&63|128);}else if(e<1114112){if((t-=4)<0)break;s.push(e>>18|240,e>>12&63|128,e>>6&63|128,e&63|128);}else throw new Error("Invalid code point")}return s}function kr(r){let t=[];for(let e=0;e>8,o=e%256,s.push(o),s.push(n);return s}function Ft(r){return h.toByteArray(xr(r))}function ct(r,t,e,n){let o;for(o=0;o=t.length||o>=r.length);++o)t[o+e]=r[o];return o}function G(r,t){return r instanceof t||r!=null&&r.constructor!=null&&r.constructor.name!=null&&r.constructor.name===t.name}function Bt(r){return r!==r}let Sr=function(){let r="0123456789abcdef",t=new Array(256);for(let e=0;e<16;++e){let n=e*16;for(let o=0;o<16;++o)t[n+o]=r[e]+r[o];}return t}();function J(r){return typeof BigInt=="undefined"?Ur:r}function Ur(){throw new Error("BigInt not supported")}return z}var ot,or,dt,sr,z,ur,Z,Y,cr=it(()=>{v();U();S();ot={},or=!1;dt={},sr=!1;z={},ur=!1;Z=qr();Z.Buffer;Z.SlowBuffer;Z.INSPECT_MAX_BYTES;Z.kMaxLength;Y=Z.Buffer,Z.INSPECT_MAX_BYTES,Z.kMaxLength;});var U=it(()=>{cr();});var hr=Lr((sn,vt)=>{v();U();S();var Dr=Object.prototype.hasOwnProperty,O="~";function st(){}Object.create&&(st.prototype=Object.create(null),new st().__proto__||(O=!1));function jr(h,u,c){this.fn=h,this.context=u,this.once=c||!1;}function ar(h,u,c,l,p){if(typeof c!="function")throw new TypeError("The listener must be a function");var f=new jr(c,l||h,p),i=O?O+u:u;return h._events[i]?h._events[i].fn?h._events[i]=[h._events[i],f]:h._events[i].push(f):(h._events[i]=f,h._eventsCount++),h}function yt(h,u){--h._eventsCount===0?h._events=new st:delete h._events[u];}function W(){this._events=new st,this._eventsCount=0;}W.prototype.eventNames=function(){var u=[],c,l;if(this._eventsCount===0)return u;for(l in c=this._events)Dr.call(c,l)&&u.push(O?l.slice(1):l);return Object.getOwnPropertySymbols?u.concat(Object.getOwnPropertySymbols(c)):u};W.prototype.listeners=function(u){var c=O?O+u:u,l=this._events[c];if(!l)return [];if(l.fn)return [l.fn];for(var p=0,f=l.length,i=new Array(f);pthis.emit("open"),this.socket.onmessage=f=>this.emit("message",f.data),this.socket.onerror=f=>this.emit("error",f),this.socket.onclose=f=>{this.emit("close",f.code,f.reason);};}send(c,l,p){let f=p||l;try{this.socket.send(c),f();}catch(i){f(i);}}close(c,l){this.socket.close(c,l);}addEventListener(c,l,p){this.socket.addEventListener(c,l,p);}};function pr(h,u){return new St(h,u)}v();U();S();v();U();S();var mt=class{encode(u){return JSON.stringify(u)}decode(u){return JSON.parse(u)}};var wt=class extends ut.default{constructor(c,l="ws://localhost:8080",m={},b,B){var L=m,{autoconnect:p=!0,reconnect:f=!0,reconnect_interval:i=1e3,max_reconnects:E=5}=L,d=Dt(L,["autoconnect","reconnect","reconnect_interval","max_reconnects"]);super();R(this,"address");R(this,"rpc_id");R(this,"queue");R(this,"options");R(this,"autoconnect");R(this,"ready");R(this,"reconnect");R(this,"reconnect_timer_id");R(this,"reconnect_interval");R(this,"max_reconnects");R(this,"rest_options");R(this,"current_reconnects");R(this,"generate_request_id");R(this,"socket");R(this,"webSocketFactory");R(this,"dataPack");this.webSocketFactory=c,this.queue={},this.rpc_id=0,this.address=l,this.autoconnect=p,this.ready=!1,this.reconnect=f,this.reconnect_timer_id=void 0,this.reconnect_interval=i,this.max_reconnects=E,this.rest_options=d,this.current_reconnects=0,this.generate_request_id=b||(()=>Number(this.rpc_id)+1),B?this.dataPack=B:this.dataPack=new mt,this.autoconnect&&this._connect(this.address,bt({autoconnect:this.autoconnect,reconnect:this.reconnect,reconnect_interval:this.reconnect_interval,max_reconnects:this.max_reconnects},this.rest_options));}connect(){this.socket||this._connect(this.address,bt({autoconnect:this.autoconnect,reconnect:this.reconnect,reconnect_interval:this.reconnect_interval,max_reconnects:this.max_reconnects},this.rest_options));}call(c,l,p,f){return !f&&typeof p=="object"&&(f=p,p=null),new Promise((i,E)=>{if(!this.ready)return E(new Error("socket not ready"));let d=this.generate_request_id(c,l),b={jsonrpc:"2.0",method:c,params:l||void 0,id:d};this.socket.send(this.dataPack.encode(b),f,B=>{if(B)return E(B);this.queue[d]={promise:[i,E]},p&&(this.queue[d].timeout=setTimeout(()=>{delete this.queue[d],E(new Error("reply timeout"));},p));});})}async login(c){let l=await this.call("rpc.login",c);if(!l)throw new Error("authentication failed");return l}async listMethods(){return await this.call("__listMethods")}notify(c,l){return new Promise((p,f)=>{if(!this.ready)return f(new Error("socket not ready"));let i={jsonrpc:"2.0",method:c,params:l};this.socket.send(this.dataPack.encode(i),E=>{if(E)return f(E);p();});})}async subscribe(c){typeof c=="string"&&(c=[c]);let l=await this.call("rpc.on",c);if(typeof c=="string"&&l[c]!=="ok")throw new Error("Failed subscribing to an event '"+c+"' with: "+l[c]);return l}async unsubscribe(c){typeof c=="string"&&(c=[c]);let l=await this.call("rpc.off",c);if(typeof c=="string"&&l[c]!=="ok")throw new Error("Failed unsubscribing from an event with: "+l);return l}close(c,l){this.socket.close(c||1e3,l);}setAutoReconnect(c){this.reconnect=c;}setReconnectInterval(c){this.reconnect_interval=c;}setMaxReconnects(c){this.max_reconnects=c;}_connect(c,l){clearTimeout(this.reconnect_timer_id),this.socket=this.webSocketFactory(c,l),this.socket.addEventListener("open",()=>{this.ready=!0,this.emit("open"),this.current_reconnects=0;}),this.socket.addEventListener("message",({data:p})=>{p instanceof ArrayBuffer&&(p=Y.from(p).toString());try{p=this.dataPack.decode(p);}catch(f){return}if(p.notification&&this.listeners(p.notification).length){if(!Object.keys(p.params).length)return this.emit(p.notification);let f=[p.notification];if(p.params.constructor===Object)f.push(p.params);else for(let i=0;i{this.emit.apply(this,f);})}if(!this.queue[p.id])return p.method?Promise.resolve().then(()=>{this.emit(p.method,p==null?void 0:p.params);}):void 0;"error"in p=="result"in p&&this.queue[p.id].promise[1](new Error('Server response malformed. Response must include either "result" or "error", but not both.')),this.queue[p.id].timeout&&clearTimeout(this.queue[p.id].timeout),p.error?this.queue[p.id].promise[1](p.error):this.queue[p.id].promise[0](p.result),delete this.queue[p.id];}),this.socket.addEventListener("error",p=>this.emit("error",p)),this.socket.addEventListener("close",({code:p,reason:f})=>{this.ready&&setTimeout(()=>this.emit("close",p,f),0),this.ready=!1,this.socket=void 0,p!==1e3&&(this.current_reconnects++,this.reconnect&&(this.max_reconnects>this.current_reconnects||this.max_reconnects===0)&&(this.reconnect_timer_id=setTimeout(()=>this._connect(c,l),this.reconnect_interval)));});}};v();U();S();var Ut=class extends wt{constructor(u="ws://localhost:8080",{autoconnect:c=!0,reconnect:l=!0,reconnect_interval:p=1e3,max_reconnects:f=5}={},i){super(pr,u,{autoconnect:c,reconnect:l,reconnect_interval:p,max_reconnects:f},i);}};/*! Bundled license information: @jspm/core/nodelibs/browser/buffer.js: (*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh *) diff --git a/dist/index.browser.cjs b/dist/index.browser.cjs index 7e2266a..0b8f4a7 100644 --- a/dist/index.browser.cjs +++ b/dist/index.browser.cjs @@ -117,7 +117,7 @@ var CommonClient = class extends eventemitter3.EventEmitter { this.max_reconnects = max_reconnects; this.rest_options = rest_options; this.current_reconnects = 0; - this.generate_request_id = generate_request_id || (() => ++this.rpc_id); + this.generate_request_id = generate_request_id || (() => Number(this.rpc_id) + 1); if (!dataPack) this.dataPack = new DefaultDataPack(); else this.dataPack = dataPack; if (this.autoconnect) diff --git a/dist/index.browser.cjs.map b/dist/index.browser.cjs.map index d720c5f..c3a4f01 100644 --- a/dist/index.browser.cjs.map +++ b/dist/index.browser.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../node_modules/esbuild-plugin-polyfill-node/polyfills/buffer.js","../src/lib/client/websocket.browser.ts","../src/lib/client.ts","../src/lib/utils.ts","../src/index.browser.ts"],"names":["EventEmitter"],"mappings":"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","sourcesContent":["export { Buffer } from \"buffer\";\n","/**\n * WebSocket implements a browser-side WebSocket specification.\n * @module Client\n */\n\n\"use strict\"\n\nimport { EventEmitter } from \"eventemitter3\"\n\nimport {\n BrowserWebSocketType,\n NodeWebSocketType,\n IWSClientAdditionalOptions,\n} from \"./client.types.js\"\n\nclass WebSocketBrowserImpl extends EventEmitter\n{\n socket: BrowserWebSocketType\n\n /** Instantiate a WebSocket class\n * @constructor\n * @param {String} address - url to a websocket server\n * @param {(Object)} options - websocket options\n * @param {(String|Array)} protocols - a list of protocols\n * @return {WebSocketBrowserImpl} - returns a WebSocket instance\n */\n constructor(address: string, options: {}, protocols?: string | string[])\n {\n super()\n\n this.socket = new window.WebSocket(address, protocols)\n\n this.socket.onopen = () => this.emit(\"open\")\n this.socket.onmessage = (event) => this.emit(\"message\", event.data)\n this.socket.onerror = (error) => this.emit(\"error\", error)\n this.socket.onclose = (event) =>\n {\n this.emit(\"close\", event.code, event.reason)\n }\n }\n\n /**\n * Sends data through a websocket connection\n * @method\n * @param {(String|Object)} data - data to be sent via websocket\n * @param {Object} optionsOrCallback - ws options\n * @param {Function} callback - a callback called once the data is sent\n * @return {Undefined}\n */\n send(\n data: Parameters[0],\n optionsOrCallback: (\n error?: Error\n ) => void | Parameters[1],\n callback?: () => void\n )\n {\n const cb = callback || optionsOrCallback\n\n try\n {\n this.socket.send(data)\n cb()\n }\n catch (error)\n {\n cb(error)\n }\n }\n\n /**\n * Closes an underlying socket\n * @method\n * @param {Number} code - status code explaining why the connection is being closed\n * @param {String} reason - a description why the connection is closing\n * @return {Undefined}\n * @throws {Error}\n */\n close(code?: number, reason?: string)\n {\n this.socket.close(code, reason)\n }\n\n addEventListener(\n type: K,\n listener: (ev: WebSocketEventMap[K]) => any,\n options?: boolean | AddEventListenerOptions\n ): void\n {\n this.socket.addEventListener(type, listener, options)\n }\n}\n\n/**\n * factory method for common WebSocket instance\n * @method\n * @param {String} address - url to a websocket server\n * @param {(Object)} options - websocket options\n * @return {Undefined}\n */\nexport function WebSocket(\n address: string,\n options: IWSClientAdditionalOptions\n)\n{\n return new WebSocketBrowserImpl(address, options)\n}\n","/**\n * \"Client\" wraps \"ws\" or a browser-implemented \"WebSocket\" library\n * according to the environment providing JSON RPC 2.0 support on top.\n * @module Client\n */\n\n\"use strict\"\n\nimport NodeWebSocket from \"ws\"\nimport { EventEmitter } from \"eventemitter3\"\nimport {\n ICommonWebSocket,\n IWSClientAdditionalOptions,\n NodeWebSocketType,\n ICommonWebSocketFactory,\n} from \"./client/client.types.js\"\n\nimport { DataPack, DefaultDataPack } from \"./utils.js\"\n\ninterface IQueueElement {\n promise: [\n Parameters[0]>[0],\n Parameters[0]>[1]\n ];\n timeout?: ReturnType;\n}\n\nexport interface IQueue {\n [x: number]: IQueueElement;\n}\n\nexport interface IWSRequestParams {\n [x: string]: any;\n [x: number]: any;\n}\n\nexport class CommonClient extends EventEmitter\n{\n private address: string\n private rpc_id: number\n private queue: IQueue\n private options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n private autoconnect: boolean\n private ready: boolean\n private reconnect: boolean\n private reconnect_timer_id: NodeJS.Timeout\n private reconnect_interval: number\n private max_reconnects: number\n private rest_options: IWSClientAdditionalOptions &\n NodeWebSocket.ClientOptions\n private current_reconnects: number\n private generate_request_id: (\n method: string,\n params: object | Array\n ) => number\n private socket: ICommonWebSocket\n private webSocketFactory: ICommonWebSocketFactory\n private dataPack: DataPack\n\n /**\n * Instantiate a Client class.\n * @constructor\n * @param {webSocketFactory} webSocketFactory - factory method for WebSocket\n * @param {String} address - url to a websocket server\n * @param {Object} options - ws options object with reconnect parameters\n * @param {Function} generate_request_id - custom generation request Id\n * @param {DataPack} dataPack - data pack contains encoder and decoder\n * @return {CommonClient}\n */\n constructor(\n webSocketFactory: ICommonWebSocketFactory,\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n ...rest_options\n } = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number,\n dataPack?: DataPack\n )\n {\n super()\n\n this.webSocketFactory = webSocketFactory\n\n this.queue = {}\n this.rpc_id = 0\n\n this.address = address\n this.autoconnect = autoconnect\n this.ready = false\n this.reconnect = reconnect\n this.reconnect_timer_id = undefined\n this.reconnect_interval = reconnect_interval\n this.max_reconnects = max_reconnects\n this.rest_options = rest_options\n this.current_reconnects = 0\n this.generate_request_id = generate_request_id || (() => ++this.rpc_id)\n\n if (!dataPack) this.dataPack = new DefaultDataPack()\n else this.dataPack = dataPack\n\n if (this.autoconnect)\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Connects to a defined server if not connected already.\n * @method\n * @return {Undefined}\n */\n connect()\n {\n if (this.socket) return\n\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Calls a registered RPC method on server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object|Array} params - optional method parameters\n * @param {Number} timeout - RPC reply timeout value\n * @param {Object} ws_opts - options passed to ws\n * @return {Promise}\n */\n call(\n method: string,\n params?: IWSRequestParams,\n timeout?: number,\n ws_opts?: Parameters[1]\n )\n {\n if (!ws_opts && \"object\" === typeof timeout)\n {\n ws_opts = timeout\n timeout = null\n }\n\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const rpc_id = this.generate_request_id(method, params)\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params: params || undefined,\n id: rpc_id,\n }\n\n this.socket.send(this.dataPack.encode(message), ws_opts, (error) =>\n {\n if (error) return reject(error)\n\n this.queue[rpc_id] = { promise: [resolve, reject] }\n\n if (timeout)\n {\n this.queue[rpc_id].timeout = setTimeout(() =>\n {\n delete this.queue[rpc_id]\n reject(new Error(\"reply timeout\"))\n }, timeout)\n }\n })\n })\n }\n\n /**\n * Logins with the other side of the connection.\n * @method\n * @param {Object} params - Login credentials object\n * @return {Promise}\n */\n async login(params: IWSRequestParams)\n {\n const resp = await this.call(\"rpc.login\", params)\n\n if (!resp) throw new Error(\"authentication failed\")\n\n return resp\n }\n\n /**\n * Fetches a list of client's methods registered on server.\n * @method\n * @return {Array}\n */\n async listMethods()\n {\n return await this.call(\"__listMethods\")\n }\n\n /**\n * Sends a JSON-RPC 2.0 notification to server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object} params - optional method parameters\n * @return {Promise}\n */\n notify(method: string, params?: IWSRequestParams)\n {\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params,\n }\n\n this.socket.send(this.dataPack.encode(message), (error) =>\n {\n if (error) return reject(error)\n\n resolve()\n })\n })\n }\n\n /**\n * Subscribes for a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async subscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.on\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\n \"Failed subscribing to an event '\" + event + \"' with: \" + result[event]\n )\n\n return result\n }\n\n /**\n * Unsubscribes from a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async unsubscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.off\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\"Failed unsubscribing from an event with: \" + result)\n\n return result\n }\n\n /**\n * Closes a WebSocket connection gracefully.\n * @method\n * @param {Number} code - socket close code\n * @param {String} data - optional data to be sent before closing\n * @return {Undefined}\n */\n close(code?: number, data?: string)\n {\n this.socket.close(code || 1000, data)\n }\n\n /**\n * Enable / disable automatic reconnection.\n * @method\n * @param {Boolean} reconnect - enable / disable reconnection\n * @return {Undefined}\n */\n setAutoReconnect(reconnect: boolean)\n {\n this.reconnect = reconnect\n }\n\n /**\n * Set the interval between reconnection attempts.\n * @method\n * @param {Number} interval - reconnection interval in milliseconds\n * @return {Undefined}\n */\n setReconnectInterval(interval: number)\n {\n this.reconnect_interval = interval\n }\n\n /**\n * Set the maximum number of reconnection attempts.\n * @method\n * @param {Number} max_reconnects - maximum reconnection attempts\n * @return {Undefined}\n */\n setMaxReconnects(max_reconnects: number)\n {\n this.max_reconnects = max_reconnects\n }\n\n /**\n * Connection/Message handler.\n * @method\n * @private\n * @param {String} address - WebSocket API address\n * @param {Object} options - ws options object\n * @return {Undefined}\n */\n private _connect(\n address: string,\n options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n )\n {\n clearTimeout(this.reconnect_timer_id)\n this.socket = this.webSocketFactory(address, options)\n\n this.socket.addEventListener(\"open\", () =>\n {\n this.ready = true\n this.emit(\"open\")\n this.current_reconnects = 0\n })\n\n this.socket.addEventListener(\"message\", ({ data: message }) =>\n {\n if (message instanceof ArrayBuffer)\n message = Buffer.from(message).toString()\n\n try\n {\n message = this.dataPack.decode(message)\n }\n catch (error)\n {\n return\n }\n\n // check if any listeners are attached and forward event\n if (message.notification && this.listeners(message.notification).length)\n {\n if (!Object.keys(message.params).length)\n return this.emit(message.notification)\n\n const args = [message.notification]\n\n if (message.params.constructor === Object) args.push(message.params)\n // using for-loop instead of unshift/spread because performance is better\n else\n for (let i = 0; i < message.params.length; i++)\n args.push(message.params[i])\n\n // run as microtask so that pending queue messages are resolved first\n // eslint-disable-next-line prefer-spread\n return Promise.resolve().then(() =>\n {\n // eslint-disable-next-line prefer-spread\n this.emit.apply(this, args)\n })\n }\n\n if (!this.queue[message.id])\n {\n // general JSON RPC 2.0 events\n if (message.method)\n {\n // run as microtask so that pending queue messages are resolved first\n return Promise.resolve().then(() =>\n {\n this.emit(message.method, message?.params)\n })\n }\n\n return\n }\n\n // reject early since server's response is invalid\n if (\"error\" in message === \"result\" in message)\n this.queue[message.id].promise[1](\n new Error(\n \"Server response malformed. Response must include either \\\"result\\\"\" +\n \" or \\\"error\\\", but not both.\"\n )\n )\n\n if (this.queue[message.id].timeout)\n clearTimeout(this.queue[message.id].timeout)\n\n if (message.error) this.queue[message.id].promise[1](message.error)\n else this.queue[message.id].promise[0](message.result)\n\n delete this.queue[message.id]\n })\n\n this.socket.addEventListener(\"error\", (error) => this.emit(\"error\", error))\n\n this.socket.addEventListener(\"close\", ({ code, reason }) =>\n {\n if (this.ready)\n // Delay close event until internal state is updated\n setTimeout(() => this.emit(\"close\", code, reason), 0)\n\n this.ready = false\n this.socket = undefined\n\n if (code === 1000) return\n\n this.current_reconnects++\n\n if (\n this.reconnect &&\n (this.max_reconnects > this.current_reconnects ||\n this.max_reconnects === 0)\n )\n this.reconnect_timer_id = setTimeout(\n () => this._connect(address, options),\n this.reconnect_interval\n )\n })\n }\n}\n","\"use strict\"\n\nexport interface DataPack<\n T,\n R extends string | ArrayBufferLike | Blob | ArrayBufferView\n> {\n encode(value: T): R;\n decode(value: R): T;\n}\n\nexport class DefaultDataPack implements DataPack\n{\n encode(value: Object): string\n {\n return JSON.stringify(value)\n }\n\n decode(value: string): Object\n {\n return JSON.parse(value)\n }\n}\n","\"use strict\"\n\nimport { WebSocket } from \"./lib/client/websocket.browser.js\"\nimport { CommonClient } from \"./lib/client.js\"\nimport { IWSClientAdditionalOptions } from \"./lib/client/client.types.js\"\n\nexport class Client extends CommonClient\n{\n constructor(\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n }: IWSClientAdditionalOptions = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number\n )\n {\n super(\n WebSocket,\n address,\n {\n autoconnect,\n reconnect,\n reconnect_interval,\n max_reconnects,\n },\n generate_request_id\n )\n }\n}\n\nexport * from \"./lib/client.js\"\nexport * from \"./lib/client/websocket.browser.js\"\nexport * from \"./lib/client/client.types.js\"\nexport * from \"./lib/utils.js\"\n"]} \ No newline at end of file +{"version":3,"sources":["../node_modules/esbuild-plugin-polyfill-node/polyfills/buffer.js","../src/lib/client/websocket.browser.ts","../src/lib/client.ts","../src/lib/utils.ts","../src/index.browser.ts"],"names":["EventEmitter"],"mappings":";AAAA,SAAS,cAAc;;;ACOvB,SAAS,oBAAoB;AAQ7B,IAAM,uBAAN,cAAmC,aACnC;AAAA,EACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAY,SAAiB,SAAa,WAC1C;AACI,UAAM;AAEN,SAAK,SAAS,IAAI,OAAO,UAAU,SAAS,SAAS;AAErD,SAAK,OAAO,SAAS,MAAM,KAAK,KAAK,MAAM;AAC3C,SAAK,OAAO,YAAY,CAAC,UAAU,KAAK,KAAK,WAAW,MAAM,IAAI;AAClE,SAAK,OAAO,UAAU,CAAC,UAAU,KAAK,KAAK,SAAS,KAAK;AACzD,SAAK,OAAO,UAAU,CAAC,UACvB;AACI,WAAK,KAAK,SAAS,MAAM,MAAM,MAAM,MAAM;AAAA,IAC/C;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,KACI,MACA,mBAGA,UAEJ;AACI,UAAM,KAAK,YAAY;AAEvB,QACA;AACI,WAAK,OAAO,KAAK,IAAI;AACrB,SAAG;AAAA,IACP,SACO,OACP;AACI,SAAG,KAAK;AAAA,IACZ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MAAe,QACrB;AACI,SAAK,OAAO,MAAM,MAAM,MAAM;AAAA,EAClC;AAAA,EAEA,iBACI,MACA,UACA,SAEJ;AACI,SAAK,OAAO,iBAAiB,MAAM,UAAU,OAAO;AAAA,EACxD;AACJ;AASO,SAAS,UACZ,SACA,SAEJ;AACI,SAAO,IAAI,qBAAqB,SAAS,OAAO;AACpD;;;ACjGA,SAAS,gBAAAA,qBAAoB;;;ACCtB,IAAM,kBAAN,MACP;AAAA,EACI,OAAO,OACP;AACI,WAAO,KAAK,UAAU,KAAK;AAAA,EAC/B;AAAA,EAEA,OAAO,OACP;AACI,WAAO,KAAK,MAAM,KAAK;AAAA,EAC3B;AACJ;;;ADeO,IAAM,eAAN,cAA2BA,cAClC;AAAA,EACY;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYR,YACI,kBACA,UAAU,uBACV;AAAA,IACI,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,GAAG;AAAA,EACP,IAAI,CAAC,GACL,qBAIA,UAEJ;AACI,UAAM;AAEN,SAAK,mBAAmB;AAExB,SAAK,QAAQ,CAAC;AACd,SAAK,SAAS;AAEd,SAAK,UAAU;AACf,SAAK,cAAc;AACnB,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,SAAK,qBAAqB;AAC1B,SAAK,qBAAqB;AAC1B,SAAK,iBAAiB;AACtB,SAAK,eAAe;AACpB,SAAK,qBAAqB;AAC1B,SAAK,sBAAsB,wBAAwB,MAAM,OAAO,KAAK,MAAM,IAAI;AAE/E,QAAI,CAAC,SAAU,MAAK,WAAW,IAAI,gBAAgB;AAAA,QAC9C,MAAK,WAAW;AAErB,QAAI,KAAK;AACL,WAAK,SAAS,KAAK,SAAS;AAAA,QACxB,aAAa,KAAK;AAAA,QAClB,WAAW,KAAK;AAAA,QAChB,oBAAoB,KAAK;AAAA,QACzB,gBAAgB,KAAK;AAAA,QACrB,GAAG,KAAK;AAAA,MACZ,CAAC;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UACA;AACI,QAAI,KAAK,OAAQ;AAEjB,SAAK,SAAS,KAAK,SAAS;AAAA,MACxB,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,oBAAoB,KAAK;AAAA,MACzB,gBAAgB,KAAK;AAAA,MACrB,GAAG,KAAK;AAAA,IACZ,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,KACI,QACA,QACA,SACA,SAEJ;AACI,QAAI,CAAC,WAAW,aAAa,OAAO,SACpC;AACI,gBAAU;AACV,gBAAU;AAAA,IACd;AAEA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAC7B;AACI,UAAI,CAAC,KAAK,MAAO,QAAO,OAAO,IAAI,MAAM,kBAAkB,CAAC;AAE5D,YAAM,SAAS,KAAK,oBAAoB,QAAQ,MAAM;AAEtD,YAAM,UAAU;AAAA,QACZ,SAAS;AAAA,QACT;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,IAAI;AAAA,MACR;AAEA,WAAK,OAAO,KAAK,KAAK,SAAS,OAAO,OAAO,GAAG,SAAS,CAAC,UAC1D;AACI,YAAI,MAAO,QAAO,OAAO,KAAK;AAE9B,aAAK,MAAM,MAAM,IAAI,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE;AAElD,YAAI,SACJ;AACI,eAAK,MAAM,MAAM,EAAE,UAAU,WAAW,MACxC;AACI,mBAAO,KAAK,MAAM,MAAM;AACxB,mBAAO,IAAI,MAAM,eAAe,CAAC;AAAA,UACrC,GAAG,OAAO;AAAA,QACd;AAAA,MACJ,CAAC;AAAA,IACL,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAM,QACZ;AACI,UAAM,OAAO,MAAM,KAAK,KAAK,aAAa,MAAM;AAEhD,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,uBAAuB;AAElD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cACN;AACI,WAAO,MAAM,KAAK,KAAK,eAAe;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,QAAgB,QACvB;AACI,WAAO,IAAI,QAAc,CAAC,SAAS,WACnC;AACI,UAAI,CAAC,KAAK,MAAO,QAAO,OAAO,IAAI,MAAM,kBAAkB,CAAC;AAE5D,YAAM,UAAU;AAAA,QACZ,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACJ;AAEA,WAAK,OAAO,KAAK,KAAK,SAAS,OAAO,OAAO,GAAG,CAAC,UACjD;AACI,YAAI,MAAO,QAAO,OAAO,KAAK;AAE9B,gBAAQ;AAAA,MACZ,CAAC;AAAA,IACL,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,UAAU,OAChB;AACI,QAAI,OAAO,UAAU,SAAU,SAAQ,CAAC,KAAK;AAE7C,UAAM,SAAS,MAAM,KAAK,KAAK,UAAU,KAAK;AAE9C,QAAI,OAAO,UAAU,YAAY,OAAO,KAAK,MAAM;AAC/C,YAAM,IAAI;AAAA,QACN,qCAAqC,QAAQ,aAAa,OAAO,KAAK;AAAA,MAC1E;AAEJ,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAY,OAClB;AACI,QAAI,OAAO,UAAU,SAAU,SAAQ,CAAC,KAAK;AAE7C,UAAM,SAAS,MAAM,KAAK,KAAK,WAAW,KAAK;AAE/C,QAAI,OAAO,UAAU,YAAY,OAAO,KAAK,MAAM;AAC/C,YAAM,IAAI,MAAM,8CAA8C,MAAM;AAExE,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAe,MACrB;AACI,SAAK,OAAO,MAAM,QAAQ,KAAM,IAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,WACjB;AACI,SAAK,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAAqB,UACrB;AACI,SAAK,qBAAqB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,gBACjB;AACI,SAAK,iBAAiB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,SACJ,SACA,SAEJ;AACI,iBAAa,KAAK,kBAAkB;AACpC,SAAK,SAAS,KAAK,iBAAiB,SAAS,OAAO;AAEpD,SAAK,OAAO,iBAAiB,QAAQ,MACrC;AACI,WAAK,QAAQ;AACb,WAAK,KAAK,MAAM;AAChB,WAAK,qBAAqB;AAAA,IAC9B,CAAC;AAED,SAAK,OAAO,iBAAiB,WAAW,CAAC,EAAE,MAAM,QAAQ,MACzD;AACI,UAAI,mBAAmB;AACnB,kBAAU,OAAO,KAAK,OAAO,EAAE,SAAS;AAE5C,UACA;AACI,kBAAU,KAAK,SAAS,OAAO,OAAO;AAAA,MAC1C,SACO,OACP;AACI;AAAA,MACJ;AAGA,UAAI,QAAQ,gBAAgB,KAAK,UAAU,QAAQ,YAAY,EAAE,QACjE;AACI,YAAI,CAAC,OAAO,KAAK,QAAQ,MAAM,EAAE;AAC7B,iBAAO,KAAK,KAAK,QAAQ,YAAY;AAEzC,cAAM,OAAO,CAAC,QAAQ,YAAY;AAElC,YAAI,QAAQ,OAAO,gBAAgB,OAAQ,MAAK,KAAK,QAAQ,MAAM;AAAA;AAG/D,mBAAS,IAAI,GAAG,IAAI,QAAQ,OAAO,QAAQ;AACvC,iBAAK,KAAK,QAAQ,OAAO,CAAC,CAAC;AAInC,eAAO,QAAQ,QAAQ,EAAE,KAAK,MAC9B;AAEI,eAAK,KAAK,MAAM,MAAM,IAAI;AAAA,QAC9B,CAAC;AAAA,MACL;AAEA,UAAI,CAAC,KAAK,MAAM,QAAQ,EAAE,GAC1B;AAEI,YAAI,QAAQ,QACZ;AAEI,iBAAO,QAAQ,QAAQ,EAAE,KAAK,MAC9B;AACI,iBAAK,KAAK,QAAQ,QAAQ,SAAS,MAAM;AAAA,UAC7C,CAAC;AAAA,QACL;AAEA;AAAA,MACJ;AAGA,UAAI,WAAW,YAAY,YAAY;AACnC,aAAK,MAAM,QAAQ,EAAE,EAAE,QAAQ,CAAC;AAAA,UAC5B,IAAI;AAAA,YACA;AAAA,UAEJ;AAAA,QACJ;AAEJ,UAAI,KAAK,MAAM,QAAQ,EAAE,EAAE;AACvB,qBAAa,KAAK,MAAM,QAAQ,EAAE,EAAE,OAAO;AAE/C,UAAI,QAAQ,MAAO,MAAK,MAAM,QAAQ,EAAE,EAAE,QAAQ,CAAC,EAAE,QAAQ,KAAK;AAAA,UAC7D,MAAK,MAAM,QAAQ,EAAE,EAAE,QAAQ,CAAC,EAAE,QAAQ,MAAM;AAErD,aAAO,KAAK,MAAM,QAAQ,EAAE;AAAA,IAChC,CAAC;AAED,SAAK,OAAO,iBAAiB,SAAS,CAAC,UAAU,KAAK,KAAK,SAAS,KAAK,CAAC;AAE1E,SAAK,OAAO,iBAAiB,SAAS,CAAC,EAAE,MAAM,OAAO,MACtD;AACI,UAAI,KAAK;AAEL,mBAAW,MAAM,KAAK,KAAK,SAAS,MAAM,MAAM,GAAG,CAAC;AAExD,WAAK,QAAQ;AACb,WAAK,SAAS;AAEd,UAAI,SAAS,IAAM;AAEnB,WAAK;AAEL,UACI,KAAK,cACZ,KAAK,iBAAiB,KAAK,sBAC1B,KAAK,mBAAmB;AAElB,aAAK,qBAAqB;AAAA,UACtB,MAAM,KAAK,SAAS,SAAS,OAAO;AAAA,UACpC,KAAK;AAAA,QACT;AAAA,IACR,CAAC;AAAA,EACL;AACJ;;;AEvbO,IAAM,SAAN,cAAqB,aAC5B;AAAA,EACI,YACI,UAAU,uBACV;AAAA,IACI,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,EACrB,IAAgC,CAAC,GACjC,qBAKJ;AACI;AAAA,MACI;AAAA,MACA;AAAA,MACA;AAAA,QACI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AACJ","sourcesContent":["export { Buffer } from \"buffer\";\n","/**\n * WebSocket implements a browser-side WebSocket specification.\n * @module Client\n */\n\n\"use strict\"\n\nimport { EventEmitter } from \"eventemitter3\"\n\nimport {\n BrowserWebSocketType,\n NodeWebSocketType,\n IWSClientAdditionalOptions,\n} from \"./client.types.js\"\n\nclass WebSocketBrowserImpl extends EventEmitter\n{\n socket: BrowserWebSocketType\n\n /** Instantiate a WebSocket class\n * @constructor\n * @param {String} address - url to a websocket server\n * @param {(Object)} options - websocket options\n * @param {(String|Array)} protocols - a list of protocols\n * @return {WebSocketBrowserImpl} - returns a WebSocket instance\n */\n constructor(address: string, options: {}, protocols?: string | string[])\n {\n super()\n\n this.socket = new window.WebSocket(address, protocols)\n\n this.socket.onopen = () => this.emit(\"open\")\n this.socket.onmessage = (event) => this.emit(\"message\", event.data)\n this.socket.onerror = (error) => this.emit(\"error\", error)\n this.socket.onclose = (event) =>\n {\n this.emit(\"close\", event.code, event.reason)\n }\n }\n\n /**\n * Sends data through a websocket connection\n * @method\n * @param {(String|Object)} data - data to be sent via websocket\n * @param {Object} optionsOrCallback - ws options\n * @param {Function} callback - a callback called once the data is sent\n * @return {Undefined}\n */\n send(\n data: Parameters[0],\n optionsOrCallback: (\n error?: Error\n ) => void | Parameters[1],\n callback?: () => void\n )\n {\n const cb = callback || optionsOrCallback\n\n try\n {\n this.socket.send(data)\n cb()\n }\n catch (error)\n {\n cb(error)\n }\n }\n\n /**\n * Closes an underlying socket\n * @method\n * @param {Number} code - status code explaining why the connection is being closed\n * @param {String} reason - a description why the connection is closing\n * @return {Undefined}\n * @throws {Error}\n */\n close(code?: number, reason?: string)\n {\n this.socket.close(code, reason)\n }\n\n addEventListener(\n type: K,\n listener: (ev: WebSocketEventMap[K]) => any,\n options?: boolean | AddEventListenerOptions\n ): void\n {\n this.socket.addEventListener(type, listener, options)\n }\n}\n\n/**\n * factory method for common WebSocket instance\n * @method\n * @param {String} address - url to a websocket server\n * @param {(Object)} options - websocket options\n * @return {Undefined}\n */\nexport function WebSocket(\n address: string,\n options: IWSClientAdditionalOptions\n)\n{\n return new WebSocketBrowserImpl(address, options)\n}\n","/**\n * \"Client\" wraps \"ws\" or a browser-implemented \"WebSocket\" library\n * according to the environment providing JSON RPC 2.0 support on top.\n * @module Client\n */\n\n\"use strict\"\n\nimport NodeWebSocket from \"ws\"\nimport { EventEmitter } from \"eventemitter3\"\nimport {\n ICommonWebSocket,\n IWSClientAdditionalOptions,\n NodeWebSocketType,\n ICommonWebSocketFactory,\n} from \"./client/client.types.js\"\n\nimport { DataPack, DefaultDataPack } from \"./utils.js\"\n\ninterface IQueueElement {\n promise: [\n Parameters[0]>[0],\n Parameters[0]>[1]\n ];\n timeout?: ReturnType;\n}\n\nexport interface IQueue {\n [x: number | string]: IQueueElement;\n}\n\nexport interface IWSRequestParams {\n [x: string]: any;\n [x: number]: any;\n}\n\nexport class CommonClient extends EventEmitter\n{\n private address: string\n private rpc_id: number | string\n private queue: IQueue\n private options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n private autoconnect: boolean\n private ready: boolean\n private reconnect: boolean\n private reconnect_timer_id: NodeJS.Timeout\n private reconnect_interval: number\n private max_reconnects: number\n private rest_options: IWSClientAdditionalOptions &\n NodeWebSocket.ClientOptions\n private current_reconnects: number\n private generate_request_id: (\n method: string,\n params: object | Array\n ) => number | string\n private socket: ICommonWebSocket\n private webSocketFactory: ICommonWebSocketFactory\n private dataPack: DataPack\n\n /**\n * Instantiate a Client class.\n * @constructor\n * @param {webSocketFactory} webSocketFactory - factory method for WebSocket\n * @param {String} address - url to a websocket server\n * @param {Object} options - ws options object with reconnect parameters\n * @param {Function} generate_request_id - custom generation request Id\n * @param {DataPack} dataPack - data pack contains encoder and decoder\n * @return {CommonClient}\n */\n constructor(\n webSocketFactory: ICommonWebSocketFactory,\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n ...rest_options\n } = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number | string,\n dataPack?: DataPack\n )\n {\n super()\n\n this.webSocketFactory = webSocketFactory\n\n this.queue = {}\n this.rpc_id = 0\n\n this.address = address\n this.autoconnect = autoconnect\n this.ready = false\n this.reconnect = reconnect\n this.reconnect_timer_id = undefined\n this.reconnect_interval = reconnect_interval\n this.max_reconnects = max_reconnects\n this.rest_options = rest_options\n this.current_reconnects = 0\n this.generate_request_id = generate_request_id || (() => Number(this.rpc_id) + 1)\n\n if (!dataPack) this.dataPack = new DefaultDataPack()\n else this.dataPack = dataPack\n\n if (this.autoconnect)\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Connects to a defined server if not connected already.\n * @method\n * @return {Undefined}\n */\n connect()\n {\n if (this.socket) return\n\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Calls a registered RPC method on server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object|Array} params - optional method parameters\n * @param {Number} timeout - RPC reply timeout value\n * @param {Object} ws_opts - options passed to ws\n * @return {Promise}\n */\n call(\n method: string,\n params?: IWSRequestParams,\n timeout?: number,\n ws_opts?: Parameters[1]\n )\n {\n if (!ws_opts && \"object\" === typeof timeout)\n {\n ws_opts = timeout\n timeout = null\n }\n\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const rpc_id = this.generate_request_id(method, params)\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params: params || undefined,\n id: rpc_id,\n }\n\n this.socket.send(this.dataPack.encode(message), ws_opts, (error) =>\n {\n if (error) return reject(error)\n\n this.queue[rpc_id] = { promise: [resolve, reject] }\n\n if (timeout)\n {\n this.queue[rpc_id].timeout = setTimeout(() =>\n {\n delete this.queue[rpc_id]\n reject(new Error(\"reply timeout\"))\n }, timeout)\n }\n })\n })\n }\n\n /**\n * Logins with the other side of the connection.\n * @method\n * @param {Object} params - Login credentials object\n * @return {Promise}\n */\n async login(params: IWSRequestParams)\n {\n const resp = await this.call(\"rpc.login\", params)\n\n if (!resp) throw new Error(\"authentication failed\")\n\n return resp\n }\n\n /**\n * Fetches a list of client's methods registered on server.\n * @method\n * @return {Array}\n */\n async listMethods()\n {\n return await this.call(\"__listMethods\")\n }\n\n /**\n * Sends a JSON-RPC 2.0 notification to server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object} params - optional method parameters\n * @return {Promise}\n */\n notify(method: string, params?: IWSRequestParams)\n {\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params,\n }\n\n this.socket.send(this.dataPack.encode(message), (error) =>\n {\n if (error) return reject(error)\n\n resolve()\n })\n })\n }\n\n /**\n * Subscribes for a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async subscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.on\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\n \"Failed subscribing to an event '\" + event + \"' with: \" + result[event]\n )\n\n return result\n }\n\n /**\n * Unsubscribes from a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async unsubscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.off\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\"Failed unsubscribing from an event with: \" + result)\n\n return result\n }\n\n /**\n * Closes a WebSocket connection gracefully.\n * @method\n * @param {Number} code - socket close code\n * @param {String} data - optional data to be sent before closing\n * @return {Undefined}\n */\n close(code?: number, data?: string)\n {\n this.socket.close(code || 1000, data)\n }\n\n /**\n * Enable / disable automatic reconnection.\n * @method\n * @param {Boolean} reconnect - enable / disable reconnection\n * @return {Undefined}\n */\n setAutoReconnect(reconnect: boolean)\n {\n this.reconnect = reconnect\n }\n\n /**\n * Set the interval between reconnection attempts.\n * @method\n * @param {Number} interval - reconnection interval in milliseconds\n * @return {Undefined}\n */\n setReconnectInterval(interval: number)\n {\n this.reconnect_interval = interval\n }\n\n /**\n * Set the maximum number of reconnection attempts.\n * @method\n * @param {Number} max_reconnects - maximum reconnection attempts\n * @return {Undefined}\n */\n setMaxReconnects(max_reconnects: number)\n {\n this.max_reconnects = max_reconnects\n }\n\n /**\n * Connection/Message handler.\n * @method\n * @private\n * @param {String} address - WebSocket API address\n * @param {Object} options - ws options object\n * @return {Undefined}\n */\n private _connect(\n address: string,\n options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n )\n {\n clearTimeout(this.reconnect_timer_id)\n this.socket = this.webSocketFactory(address, options)\n\n this.socket.addEventListener(\"open\", () =>\n {\n this.ready = true\n this.emit(\"open\")\n this.current_reconnects = 0\n })\n\n this.socket.addEventListener(\"message\", ({ data: message }) =>\n {\n if (message instanceof ArrayBuffer)\n message = Buffer.from(message).toString()\n\n try\n {\n message = this.dataPack.decode(message)\n }\n catch (error)\n {\n return\n }\n\n // check if any listeners are attached and forward event\n if (message.notification && this.listeners(message.notification).length)\n {\n if (!Object.keys(message.params).length)\n return this.emit(message.notification)\n\n const args = [message.notification]\n\n if (message.params.constructor === Object) args.push(message.params)\n // using for-loop instead of unshift/spread because performance is better\n else\n for (let i = 0; i < message.params.length; i++)\n args.push(message.params[i])\n\n // run as microtask so that pending queue messages are resolved first\n // eslint-disable-next-line prefer-spread\n return Promise.resolve().then(() =>\n {\n // eslint-disable-next-line prefer-spread\n this.emit.apply(this, args)\n })\n }\n\n if (!this.queue[message.id])\n {\n // general JSON RPC 2.0 events\n if (message.method)\n {\n // run as microtask so that pending queue messages are resolved first\n return Promise.resolve().then(() =>\n {\n this.emit(message.method, message?.params)\n })\n }\n\n return\n }\n\n // reject early since server's response is invalid\n if (\"error\" in message === \"result\" in message)\n this.queue[message.id].promise[1](\n new Error(\n \"Server response malformed. Response must include either \\\"result\\\"\" +\n \" or \\\"error\\\", but not both.\"\n )\n )\n\n if (this.queue[message.id].timeout)\n clearTimeout(this.queue[message.id].timeout)\n\n if (message.error) this.queue[message.id].promise[1](message.error)\n else this.queue[message.id].promise[0](message.result)\n\n delete this.queue[message.id]\n })\n\n this.socket.addEventListener(\"error\", (error) => this.emit(\"error\", error))\n\n this.socket.addEventListener(\"close\", ({ code, reason }) =>\n {\n if (this.ready)\n // Delay close event until internal state is updated\n setTimeout(() => this.emit(\"close\", code, reason), 0)\n\n this.ready = false\n this.socket = undefined\n\n if (code === 1000) return\n\n this.current_reconnects++\n\n if (\n this.reconnect &&\n (this.max_reconnects > this.current_reconnects ||\n this.max_reconnects === 0)\n )\n this.reconnect_timer_id = setTimeout(\n () => this._connect(address, options),\n this.reconnect_interval\n )\n })\n }\n}\n","\"use strict\"\n\nexport interface DataPack<\n T,\n R extends string | ArrayBufferLike | Blob | ArrayBufferView\n> {\n encode(value: T): R;\n decode(value: R): T;\n}\n\nexport class DefaultDataPack implements DataPack\n{\n encode(value: Object): string\n {\n return JSON.stringify(value)\n }\n\n decode(value: string): Object\n {\n return JSON.parse(value)\n }\n}\n","\"use strict\"\n\nimport { WebSocket } from \"./lib/client/websocket.browser.js\"\nimport { CommonClient } from \"./lib/client.js\"\nimport { IWSClientAdditionalOptions } from \"./lib/client/client.types.js\"\n\nexport class Client extends CommonClient\n{\n constructor(\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n }: IWSClientAdditionalOptions = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number | string\n )\n {\n super(\n WebSocket,\n address,\n {\n autoconnect,\n reconnect,\n reconnect_interval,\n max_reconnects,\n },\n generate_request_id\n )\n }\n}\n\nexport * from \"./lib/client.js\"\nexport * from \"./lib/client/websocket.browser.js\"\nexport * from \"./lib/client/client.types.js\"\nexport * from \"./lib/utils.js\"\n"]} \ No newline at end of file diff --git a/dist/index.browser.d.mts b/dist/index.browser.d.mts index ae9a3ca..2f152b8 100644 --- a/dist/index.browser.d.mts +++ b/dist/index.browser.d.mts @@ -42,7 +42,7 @@ interface IQueueElement { timeout?: ReturnType; } interface IQueue { - [x: number]: IQueueElement; + [x: number | string]: IQueueElement; } interface IWSRequestParams { [x: string]: any; @@ -80,7 +80,7 @@ declare class CommonClient extends EventEmitter { reconnect?: boolean; reconnect_interval?: number; max_reconnects?: number; - }, generate_request_id?: (method: string, params: object | Array) => number, dataPack?: DataPack); + }, generate_request_id?: (method: string, params: object | Array) => number | string, dataPack?: DataPack); /** * Connects to a defined server if not connected already. * @method @@ -219,7 +219,7 @@ declare class WebSocketBrowserImpl extends EventEmitter { declare function WebSocket$1(address: string, options: IWSClientAdditionalOptions): WebSocketBrowserImpl; declare class Client extends CommonClient { - constructor(address?: string, { autoconnect, reconnect, reconnect_interval, max_reconnects, }?: IWSClientAdditionalOptions, generate_request_id?: (method: string, params: object | Array) => number); + constructor(address?: string, { autoconnect, reconnect, reconnect_interval, max_reconnects, }?: IWSClientAdditionalOptions, generate_request_id?: (method: string, params: object | Array) => number | string); } export { type BrowserWebSocketType, Client, CommonClient, type DataPack, DefaultDataPack, type ICommonWebSocket, type ICommonWebSocketFactory, type IQueue, type IWSClientAdditionalOptions, type IWSRequestParams, type NodeWebSocketType, type NodeWebSocketTypeOptions, WebSocket$1 as WebSocket }; diff --git a/dist/index.browser.d.ts b/dist/index.browser.d.ts index ae9a3ca..2f152b8 100644 --- a/dist/index.browser.d.ts +++ b/dist/index.browser.d.ts @@ -42,7 +42,7 @@ interface IQueueElement { timeout?: ReturnType; } interface IQueue { - [x: number]: IQueueElement; + [x: number | string]: IQueueElement; } interface IWSRequestParams { [x: string]: any; @@ -80,7 +80,7 @@ declare class CommonClient extends EventEmitter { reconnect?: boolean; reconnect_interval?: number; max_reconnects?: number; - }, generate_request_id?: (method: string, params: object | Array) => number, dataPack?: DataPack); + }, generate_request_id?: (method: string, params: object | Array) => number | string, dataPack?: DataPack); /** * Connects to a defined server if not connected already. * @method @@ -219,7 +219,7 @@ declare class WebSocketBrowserImpl extends EventEmitter { declare function WebSocket$1(address: string, options: IWSClientAdditionalOptions): WebSocketBrowserImpl; declare class Client extends CommonClient { - constructor(address?: string, { autoconnect, reconnect, reconnect_interval, max_reconnects, }?: IWSClientAdditionalOptions, generate_request_id?: (method: string, params: object | Array) => number); + constructor(address?: string, { autoconnect, reconnect, reconnect_interval, max_reconnects, }?: IWSClientAdditionalOptions, generate_request_id?: (method: string, params: object | Array) => number | string); } export { type BrowserWebSocketType, Client, CommonClient, type DataPack, DefaultDataPack, type ICommonWebSocket, type ICommonWebSocketFactory, type IQueue, type IWSClientAdditionalOptions, type IWSRequestParams, type NodeWebSocketType, type NodeWebSocketTypeOptions, WebSocket$1 as WebSocket }; diff --git a/dist/index.browser.mjs b/dist/index.browser.mjs index 1674310..5c30e6d 100644 --- a/dist/index.browser.mjs +++ b/dist/index.browser.mjs @@ -115,7 +115,7 @@ var CommonClient = class extends EventEmitter { this.max_reconnects = max_reconnects; this.rest_options = rest_options; this.current_reconnects = 0; - this.generate_request_id = generate_request_id || (() => ++this.rpc_id); + this.generate_request_id = generate_request_id || (() => Number(this.rpc_id) + 1); if (!dataPack) this.dataPack = new DefaultDataPack(); else this.dataPack = dataPack; if (this.autoconnect) diff --git a/dist/index.browser.mjs.map b/dist/index.browser.mjs.map index d720c5f..c3a4f01 100644 --- a/dist/index.browser.mjs.map +++ b/dist/index.browser.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../node_modules/esbuild-plugin-polyfill-node/polyfills/buffer.js","../src/lib/client/websocket.browser.ts","../src/lib/client.ts","../src/lib/utils.ts","../src/index.browser.ts"],"names":["EventEmitter"],"mappings":"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","sourcesContent":["export { Buffer } from \"buffer\";\n","/**\n * WebSocket implements a browser-side WebSocket specification.\n * @module Client\n */\n\n\"use strict\"\n\nimport { EventEmitter } from \"eventemitter3\"\n\nimport {\n BrowserWebSocketType,\n NodeWebSocketType,\n IWSClientAdditionalOptions,\n} from \"./client.types.js\"\n\nclass WebSocketBrowserImpl extends EventEmitter\n{\n socket: BrowserWebSocketType\n\n /** Instantiate a WebSocket class\n * @constructor\n * @param {String} address - url to a websocket server\n * @param {(Object)} options - websocket options\n * @param {(String|Array)} protocols - a list of protocols\n * @return {WebSocketBrowserImpl} - returns a WebSocket instance\n */\n constructor(address: string, options: {}, protocols?: string | string[])\n {\n super()\n\n this.socket = new window.WebSocket(address, protocols)\n\n this.socket.onopen = () => this.emit(\"open\")\n this.socket.onmessage = (event) => this.emit(\"message\", event.data)\n this.socket.onerror = (error) => this.emit(\"error\", error)\n this.socket.onclose = (event) =>\n {\n this.emit(\"close\", event.code, event.reason)\n }\n }\n\n /**\n * Sends data through a websocket connection\n * @method\n * @param {(String|Object)} data - data to be sent via websocket\n * @param {Object} optionsOrCallback - ws options\n * @param {Function} callback - a callback called once the data is sent\n * @return {Undefined}\n */\n send(\n data: Parameters[0],\n optionsOrCallback: (\n error?: Error\n ) => void | Parameters[1],\n callback?: () => void\n )\n {\n const cb = callback || optionsOrCallback\n\n try\n {\n this.socket.send(data)\n cb()\n }\n catch (error)\n {\n cb(error)\n }\n }\n\n /**\n * Closes an underlying socket\n * @method\n * @param {Number} code - status code explaining why the connection is being closed\n * @param {String} reason - a description why the connection is closing\n * @return {Undefined}\n * @throws {Error}\n */\n close(code?: number, reason?: string)\n {\n this.socket.close(code, reason)\n }\n\n addEventListener(\n type: K,\n listener: (ev: WebSocketEventMap[K]) => any,\n options?: boolean | AddEventListenerOptions\n ): void\n {\n this.socket.addEventListener(type, listener, options)\n }\n}\n\n/**\n * factory method for common WebSocket instance\n * @method\n * @param {String} address - url to a websocket server\n * @param {(Object)} options - websocket options\n * @return {Undefined}\n */\nexport function WebSocket(\n address: string,\n options: IWSClientAdditionalOptions\n)\n{\n return new WebSocketBrowserImpl(address, options)\n}\n","/**\n * \"Client\" wraps \"ws\" or a browser-implemented \"WebSocket\" library\n * according to the environment providing JSON RPC 2.0 support on top.\n * @module Client\n */\n\n\"use strict\"\n\nimport NodeWebSocket from \"ws\"\nimport { EventEmitter } from \"eventemitter3\"\nimport {\n ICommonWebSocket,\n IWSClientAdditionalOptions,\n NodeWebSocketType,\n ICommonWebSocketFactory,\n} from \"./client/client.types.js\"\n\nimport { DataPack, DefaultDataPack } from \"./utils.js\"\n\ninterface IQueueElement {\n promise: [\n Parameters[0]>[0],\n Parameters[0]>[1]\n ];\n timeout?: ReturnType;\n}\n\nexport interface IQueue {\n [x: number]: IQueueElement;\n}\n\nexport interface IWSRequestParams {\n [x: string]: any;\n [x: number]: any;\n}\n\nexport class CommonClient extends EventEmitter\n{\n private address: string\n private rpc_id: number\n private queue: IQueue\n private options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n private autoconnect: boolean\n private ready: boolean\n private reconnect: boolean\n private reconnect_timer_id: NodeJS.Timeout\n private reconnect_interval: number\n private max_reconnects: number\n private rest_options: IWSClientAdditionalOptions &\n NodeWebSocket.ClientOptions\n private current_reconnects: number\n private generate_request_id: (\n method: string,\n params: object | Array\n ) => number\n private socket: ICommonWebSocket\n private webSocketFactory: ICommonWebSocketFactory\n private dataPack: DataPack\n\n /**\n * Instantiate a Client class.\n * @constructor\n * @param {webSocketFactory} webSocketFactory - factory method for WebSocket\n * @param {String} address - url to a websocket server\n * @param {Object} options - ws options object with reconnect parameters\n * @param {Function} generate_request_id - custom generation request Id\n * @param {DataPack} dataPack - data pack contains encoder and decoder\n * @return {CommonClient}\n */\n constructor(\n webSocketFactory: ICommonWebSocketFactory,\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n ...rest_options\n } = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number,\n dataPack?: DataPack\n )\n {\n super()\n\n this.webSocketFactory = webSocketFactory\n\n this.queue = {}\n this.rpc_id = 0\n\n this.address = address\n this.autoconnect = autoconnect\n this.ready = false\n this.reconnect = reconnect\n this.reconnect_timer_id = undefined\n this.reconnect_interval = reconnect_interval\n this.max_reconnects = max_reconnects\n this.rest_options = rest_options\n this.current_reconnects = 0\n this.generate_request_id = generate_request_id || (() => ++this.rpc_id)\n\n if (!dataPack) this.dataPack = new DefaultDataPack()\n else this.dataPack = dataPack\n\n if (this.autoconnect)\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Connects to a defined server if not connected already.\n * @method\n * @return {Undefined}\n */\n connect()\n {\n if (this.socket) return\n\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Calls a registered RPC method on server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object|Array} params - optional method parameters\n * @param {Number} timeout - RPC reply timeout value\n * @param {Object} ws_opts - options passed to ws\n * @return {Promise}\n */\n call(\n method: string,\n params?: IWSRequestParams,\n timeout?: number,\n ws_opts?: Parameters[1]\n )\n {\n if (!ws_opts && \"object\" === typeof timeout)\n {\n ws_opts = timeout\n timeout = null\n }\n\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const rpc_id = this.generate_request_id(method, params)\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params: params || undefined,\n id: rpc_id,\n }\n\n this.socket.send(this.dataPack.encode(message), ws_opts, (error) =>\n {\n if (error) return reject(error)\n\n this.queue[rpc_id] = { promise: [resolve, reject] }\n\n if (timeout)\n {\n this.queue[rpc_id].timeout = setTimeout(() =>\n {\n delete this.queue[rpc_id]\n reject(new Error(\"reply timeout\"))\n }, timeout)\n }\n })\n })\n }\n\n /**\n * Logins with the other side of the connection.\n * @method\n * @param {Object} params - Login credentials object\n * @return {Promise}\n */\n async login(params: IWSRequestParams)\n {\n const resp = await this.call(\"rpc.login\", params)\n\n if (!resp) throw new Error(\"authentication failed\")\n\n return resp\n }\n\n /**\n * Fetches a list of client's methods registered on server.\n * @method\n * @return {Array}\n */\n async listMethods()\n {\n return await this.call(\"__listMethods\")\n }\n\n /**\n * Sends a JSON-RPC 2.0 notification to server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object} params - optional method parameters\n * @return {Promise}\n */\n notify(method: string, params?: IWSRequestParams)\n {\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params,\n }\n\n this.socket.send(this.dataPack.encode(message), (error) =>\n {\n if (error) return reject(error)\n\n resolve()\n })\n })\n }\n\n /**\n * Subscribes for a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async subscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.on\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\n \"Failed subscribing to an event '\" + event + \"' with: \" + result[event]\n )\n\n return result\n }\n\n /**\n * Unsubscribes from a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async unsubscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.off\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\"Failed unsubscribing from an event with: \" + result)\n\n return result\n }\n\n /**\n * Closes a WebSocket connection gracefully.\n * @method\n * @param {Number} code - socket close code\n * @param {String} data - optional data to be sent before closing\n * @return {Undefined}\n */\n close(code?: number, data?: string)\n {\n this.socket.close(code || 1000, data)\n }\n\n /**\n * Enable / disable automatic reconnection.\n * @method\n * @param {Boolean} reconnect - enable / disable reconnection\n * @return {Undefined}\n */\n setAutoReconnect(reconnect: boolean)\n {\n this.reconnect = reconnect\n }\n\n /**\n * Set the interval between reconnection attempts.\n * @method\n * @param {Number} interval - reconnection interval in milliseconds\n * @return {Undefined}\n */\n setReconnectInterval(interval: number)\n {\n this.reconnect_interval = interval\n }\n\n /**\n * Set the maximum number of reconnection attempts.\n * @method\n * @param {Number} max_reconnects - maximum reconnection attempts\n * @return {Undefined}\n */\n setMaxReconnects(max_reconnects: number)\n {\n this.max_reconnects = max_reconnects\n }\n\n /**\n * Connection/Message handler.\n * @method\n * @private\n * @param {String} address - WebSocket API address\n * @param {Object} options - ws options object\n * @return {Undefined}\n */\n private _connect(\n address: string,\n options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n )\n {\n clearTimeout(this.reconnect_timer_id)\n this.socket = this.webSocketFactory(address, options)\n\n this.socket.addEventListener(\"open\", () =>\n {\n this.ready = true\n this.emit(\"open\")\n this.current_reconnects = 0\n })\n\n this.socket.addEventListener(\"message\", ({ data: message }) =>\n {\n if (message instanceof ArrayBuffer)\n message = Buffer.from(message).toString()\n\n try\n {\n message = this.dataPack.decode(message)\n }\n catch (error)\n {\n return\n }\n\n // check if any listeners are attached and forward event\n if (message.notification && this.listeners(message.notification).length)\n {\n if (!Object.keys(message.params).length)\n return this.emit(message.notification)\n\n const args = [message.notification]\n\n if (message.params.constructor === Object) args.push(message.params)\n // using for-loop instead of unshift/spread because performance is better\n else\n for (let i = 0; i < message.params.length; i++)\n args.push(message.params[i])\n\n // run as microtask so that pending queue messages are resolved first\n // eslint-disable-next-line prefer-spread\n return Promise.resolve().then(() =>\n {\n // eslint-disable-next-line prefer-spread\n this.emit.apply(this, args)\n })\n }\n\n if (!this.queue[message.id])\n {\n // general JSON RPC 2.0 events\n if (message.method)\n {\n // run as microtask so that pending queue messages are resolved first\n return Promise.resolve().then(() =>\n {\n this.emit(message.method, message?.params)\n })\n }\n\n return\n }\n\n // reject early since server's response is invalid\n if (\"error\" in message === \"result\" in message)\n this.queue[message.id].promise[1](\n new Error(\n \"Server response malformed. Response must include either \\\"result\\\"\" +\n \" or \\\"error\\\", but not both.\"\n )\n )\n\n if (this.queue[message.id].timeout)\n clearTimeout(this.queue[message.id].timeout)\n\n if (message.error) this.queue[message.id].promise[1](message.error)\n else this.queue[message.id].promise[0](message.result)\n\n delete this.queue[message.id]\n })\n\n this.socket.addEventListener(\"error\", (error) => this.emit(\"error\", error))\n\n this.socket.addEventListener(\"close\", ({ code, reason }) =>\n {\n if (this.ready)\n // Delay close event until internal state is updated\n setTimeout(() => this.emit(\"close\", code, reason), 0)\n\n this.ready = false\n this.socket = undefined\n\n if (code === 1000) return\n\n this.current_reconnects++\n\n if (\n this.reconnect &&\n (this.max_reconnects > this.current_reconnects ||\n this.max_reconnects === 0)\n )\n this.reconnect_timer_id = setTimeout(\n () => this._connect(address, options),\n this.reconnect_interval\n )\n })\n }\n}\n","\"use strict\"\n\nexport interface DataPack<\n T,\n R extends string | ArrayBufferLike | Blob | ArrayBufferView\n> {\n encode(value: T): R;\n decode(value: R): T;\n}\n\nexport class DefaultDataPack implements DataPack\n{\n encode(value: Object): string\n {\n return JSON.stringify(value)\n }\n\n decode(value: string): Object\n {\n return JSON.parse(value)\n }\n}\n","\"use strict\"\n\nimport { WebSocket } from \"./lib/client/websocket.browser.js\"\nimport { CommonClient } from \"./lib/client.js\"\nimport { IWSClientAdditionalOptions } from \"./lib/client/client.types.js\"\n\nexport class Client extends CommonClient\n{\n constructor(\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n }: IWSClientAdditionalOptions = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number\n )\n {\n super(\n WebSocket,\n address,\n {\n autoconnect,\n reconnect,\n reconnect_interval,\n max_reconnects,\n },\n generate_request_id\n )\n }\n}\n\nexport * from \"./lib/client.js\"\nexport * from \"./lib/client/websocket.browser.js\"\nexport * from \"./lib/client/client.types.js\"\nexport * from \"./lib/utils.js\"\n"]} \ No newline at end of file +{"version":3,"sources":["../node_modules/esbuild-plugin-polyfill-node/polyfills/buffer.js","../src/lib/client/websocket.browser.ts","../src/lib/client.ts","../src/lib/utils.ts","../src/index.browser.ts"],"names":["EventEmitter"],"mappings":"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","sourcesContent":["export { Buffer } from \"buffer\";\n","/**\n * WebSocket implements a browser-side WebSocket specification.\n * @module Client\n */\n\n\"use strict\"\n\nimport { EventEmitter } from \"eventemitter3\"\n\nimport {\n BrowserWebSocketType,\n NodeWebSocketType,\n IWSClientAdditionalOptions,\n} from \"./client.types.js\"\n\nclass WebSocketBrowserImpl extends EventEmitter\n{\n socket: BrowserWebSocketType\n\n /** Instantiate a WebSocket class\n * @constructor\n * @param {String} address - url to a websocket server\n * @param {(Object)} options - websocket options\n * @param {(String|Array)} protocols - a list of protocols\n * @return {WebSocketBrowserImpl} - returns a WebSocket instance\n */\n constructor(address: string, options: {}, protocols?: string | string[])\n {\n super()\n\n this.socket = new window.WebSocket(address, protocols)\n\n this.socket.onopen = () => this.emit(\"open\")\n this.socket.onmessage = (event) => this.emit(\"message\", event.data)\n this.socket.onerror = (error) => this.emit(\"error\", error)\n this.socket.onclose = (event) =>\n {\n this.emit(\"close\", event.code, event.reason)\n }\n }\n\n /**\n * Sends data through a websocket connection\n * @method\n * @param {(String|Object)} data - data to be sent via websocket\n * @param {Object} optionsOrCallback - ws options\n * @param {Function} callback - a callback called once the data is sent\n * @return {Undefined}\n */\n send(\n data: Parameters[0],\n optionsOrCallback: (\n error?: Error\n ) => void | Parameters[1],\n callback?: () => void\n )\n {\n const cb = callback || optionsOrCallback\n\n try\n {\n this.socket.send(data)\n cb()\n }\n catch (error)\n {\n cb(error)\n }\n }\n\n /**\n * Closes an underlying socket\n * @method\n * @param {Number} code - status code explaining why the connection is being closed\n * @param {String} reason - a description why the connection is closing\n * @return {Undefined}\n * @throws {Error}\n */\n close(code?: number, reason?: string)\n {\n this.socket.close(code, reason)\n }\n\n addEventListener(\n type: K,\n listener: (ev: WebSocketEventMap[K]) => any,\n options?: boolean | AddEventListenerOptions\n ): void\n {\n this.socket.addEventListener(type, listener, options)\n }\n}\n\n/**\n * factory method for common WebSocket instance\n * @method\n * @param {String} address - url to a websocket server\n * @param {(Object)} options - websocket options\n * @return {Undefined}\n */\nexport function WebSocket(\n address: string,\n options: IWSClientAdditionalOptions\n)\n{\n return new WebSocketBrowserImpl(address, options)\n}\n","/**\n * \"Client\" wraps \"ws\" or a browser-implemented \"WebSocket\" library\n * according to the environment providing JSON RPC 2.0 support on top.\n * @module Client\n */\n\n\"use strict\"\n\nimport NodeWebSocket from \"ws\"\nimport { EventEmitter } from \"eventemitter3\"\nimport {\n ICommonWebSocket,\n IWSClientAdditionalOptions,\n NodeWebSocketType,\n ICommonWebSocketFactory,\n} from \"./client/client.types.js\"\n\nimport { DataPack, DefaultDataPack } from \"./utils.js\"\n\ninterface IQueueElement {\n promise: [\n Parameters[0]>[0],\n Parameters[0]>[1]\n ];\n timeout?: ReturnType;\n}\n\nexport interface IQueue {\n [x: number | string]: IQueueElement;\n}\n\nexport interface IWSRequestParams {\n [x: string]: any;\n [x: number]: any;\n}\n\nexport class CommonClient extends EventEmitter\n{\n private address: string\n private rpc_id: number | string\n private queue: IQueue\n private options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n private autoconnect: boolean\n private ready: boolean\n private reconnect: boolean\n private reconnect_timer_id: NodeJS.Timeout\n private reconnect_interval: number\n private max_reconnects: number\n private rest_options: IWSClientAdditionalOptions &\n NodeWebSocket.ClientOptions\n private current_reconnects: number\n private generate_request_id: (\n method: string,\n params: object | Array\n ) => number | string\n private socket: ICommonWebSocket\n private webSocketFactory: ICommonWebSocketFactory\n private dataPack: DataPack\n\n /**\n * Instantiate a Client class.\n * @constructor\n * @param {webSocketFactory} webSocketFactory - factory method for WebSocket\n * @param {String} address - url to a websocket server\n * @param {Object} options - ws options object with reconnect parameters\n * @param {Function} generate_request_id - custom generation request Id\n * @param {DataPack} dataPack - data pack contains encoder and decoder\n * @return {CommonClient}\n */\n constructor(\n webSocketFactory: ICommonWebSocketFactory,\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n ...rest_options\n } = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number | string,\n dataPack?: DataPack\n )\n {\n super()\n\n this.webSocketFactory = webSocketFactory\n\n this.queue = {}\n this.rpc_id = 0\n\n this.address = address\n this.autoconnect = autoconnect\n this.ready = false\n this.reconnect = reconnect\n this.reconnect_timer_id = undefined\n this.reconnect_interval = reconnect_interval\n this.max_reconnects = max_reconnects\n this.rest_options = rest_options\n this.current_reconnects = 0\n this.generate_request_id = generate_request_id || (() => Number(this.rpc_id) + 1)\n\n if (!dataPack) this.dataPack = new DefaultDataPack()\n else this.dataPack = dataPack\n\n if (this.autoconnect)\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Connects to a defined server if not connected already.\n * @method\n * @return {Undefined}\n */\n connect()\n {\n if (this.socket) return\n\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Calls a registered RPC method on server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object|Array} params - optional method parameters\n * @param {Number} timeout - RPC reply timeout value\n * @param {Object} ws_opts - options passed to ws\n * @return {Promise}\n */\n call(\n method: string,\n params?: IWSRequestParams,\n timeout?: number,\n ws_opts?: Parameters[1]\n )\n {\n if (!ws_opts && \"object\" === typeof timeout)\n {\n ws_opts = timeout\n timeout = null\n }\n\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const rpc_id = this.generate_request_id(method, params)\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params: params || undefined,\n id: rpc_id,\n }\n\n this.socket.send(this.dataPack.encode(message), ws_opts, (error) =>\n {\n if (error) return reject(error)\n\n this.queue[rpc_id] = { promise: [resolve, reject] }\n\n if (timeout)\n {\n this.queue[rpc_id].timeout = setTimeout(() =>\n {\n delete this.queue[rpc_id]\n reject(new Error(\"reply timeout\"))\n }, timeout)\n }\n })\n })\n }\n\n /**\n * Logins with the other side of the connection.\n * @method\n * @param {Object} params - Login credentials object\n * @return {Promise}\n */\n async login(params: IWSRequestParams)\n {\n const resp = await this.call(\"rpc.login\", params)\n\n if (!resp) throw new Error(\"authentication failed\")\n\n return resp\n }\n\n /**\n * Fetches a list of client's methods registered on server.\n * @method\n * @return {Array}\n */\n async listMethods()\n {\n return await this.call(\"__listMethods\")\n }\n\n /**\n * Sends a JSON-RPC 2.0 notification to server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object} params - optional method parameters\n * @return {Promise}\n */\n notify(method: string, params?: IWSRequestParams)\n {\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params,\n }\n\n this.socket.send(this.dataPack.encode(message), (error) =>\n {\n if (error) return reject(error)\n\n resolve()\n })\n })\n }\n\n /**\n * Subscribes for a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async subscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.on\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\n \"Failed subscribing to an event '\" + event + \"' with: \" + result[event]\n )\n\n return result\n }\n\n /**\n * Unsubscribes from a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async unsubscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.off\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\"Failed unsubscribing from an event with: \" + result)\n\n return result\n }\n\n /**\n * Closes a WebSocket connection gracefully.\n * @method\n * @param {Number} code - socket close code\n * @param {String} data - optional data to be sent before closing\n * @return {Undefined}\n */\n close(code?: number, data?: string)\n {\n this.socket.close(code || 1000, data)\n }\n\n /**\n * Enable / disable automatic reconnection.\n * @method\n * @param {Boolean} reconnect - enable / disable reconnection\n * @return {Undefined}\n */\n setAutoReconnect(reconnect: boolean)\n {\n this.reconnect = reconnect\n }\n\n /**\n * Set the interval between reconnection attempts.\n * @method\n * @param {Number} interval - reconnection interval in milliseconds\n * @return {Undefined}\n */\n setReconnectInterval(interval: number)\n {\n this.reconnect_interval = interval\n }\n\n /**\n * Set the maximum number of reconnection attempts.\n * @method\n * @param {Number} max_reconnects - maximum reconnection attempts\n * @return {Undefined}\n */\n setMaxReconnects(max_reconnects: number)\n {\n this.max_reconnects = max_reconnects\n }\n\n /**\n * Connection/Message handler.\n * @method\n * @private\n * @param {String} address - WebSocket API address\n * @param {Object} options - ws options object\n * @return {Undefined}\n */\n private _connect(\n address: string,\n options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n )\n {\n clearTimeout(this.reconnect_timer_id)\n this.socket = this.webSocketFactory(address, options)\n\n this.socket.addEventListener(\"open\", () =>\n {\n this.ready = true\n this.emit(\"open\")\n this.current_reconnects = 0\n })\n\n this.socket.addEventListener(\"message\", ({ data: message }) =>\n {\n if (message instanceof ArrayBuffer)\n message = Buffer.from(message).toString()\n\n try\n {\n message = this.dataPack.decode(message)\n }\n catch (error)\n {\n return\n }\n\n // check if any listeners are attached and forward event\n if (message.notification && this.listeners(message.notification).length)\n {\n if (!Object.keys(message.params).length)\n return this.emit(message.notification)\n\n const args = [message.notification]\n\n if (message.params.constructor === Object) args.push(message.params)\n // using for-loop instead of unshift/spread because performance is better\n else\n for (let i = 0; i < message.params.length; i++)\n args.push(message.params[i])\n\n // run as microtask so that pending queue messages are resolved first\n // eslint-disable-next-line prefer-spread\n return Promise.resolve().then(() =>\n {\n // eslint-disable-next-line prefer-spread\n this.emit.apply(this, args)\n })\n }\n\n if (!this.queue[message.id])\n {\n // general JSON RPC 2.0 events\n if (message.method)\n {\n // run as microtask so that pending queue messages are resolved first\n return Promise.resolve().then(() =>\n {\n this.emit(message.method, message?.params)\n })\n }\n\n return\n }\n\n // reject early since server's response is invalid\n if (\"error\" in message === \"result\" in message)\n this.queue[message.id].promise[1](\n new Error(\n \"Server response malformed. Response must include either \\\"result\\\"\" +\n \" or \\\"error\\\", but not both.\"\n )\n )\n\n if (this.queue[message.id].timeout)\n clearTimeout(this.queue[message.id].timeout)\n\n if (message.error) this.queue[message.id].promise[1](message.error)\n else this.queue[message.id].promise[0](message.result)\n\n delete this.queue[message.id]\n })\n\n this.socket.addEventListener(\"error\", (error) => this.emit(\"error\", error))\n\n this.socket.addEventListener(\"close\", ({ code, reason }) =>\n {\n if (this.ready)\n // Delay close event until internal state is updated\n setTimeout(() => this.emit(\"close\", code, reason), 0)\n\n this.ready = false\n this.socket = undefined\n\n if (code === 1000) return\n\n this.current_reconnects++\n\n if (\n this.reconnect &&\n (this.max_reconnects > this.current_reconnects ||\n this.max_reconnects === 0)\n )\n this.reconnect_timer_id = setTimeout(\n () => this._connect(address, options),\n this.reconnect_interval\n )\n })\n }\n}\n","\"use strict\"\n\nexport interface DataPack<\n T,\n R extends string | ArrayBufferLike | Blob | ArrayBufferView\n> {\n encode(value: T): R;\n decode(value: R): T;\n}\n\nexport class DefaultDataPack implements DataPack\n{\n encode(value: Object): string\n {\n return JSON.stringify(value)\n }\n\n decode(value: string): Object\n {\n return JSON.parse(value)\n }\n}\n","\"use strict\"\n\nimport { WebSocket } from \"./lib/client/websocket.browser.js\"\nimport { CommonClient } from \"./lib/client.js\"\nimport { IWSClientAdditionalOptions } from \"./lib/client/client.types.js\"\n\nexport class Client extends CommonClient\n{\n constructor(\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n }: IWSClientAdditionalOptions = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number | string\n )\n {\n super(\n WebSocket,\n address,\n {\n autoconnect,\n reconnect,\n reconnect_interval,\n max_reconnects,\n },\n generate_request_id\n )\n }\n}\n\nexport * from \"./lib/client.js\"\nexport * from \"./lib/client/websocket.browser.js\"\nexport * from \"./lib/client/client.types.js\"\nexport * from \"./lib/utils.js\"\n"]} \ No newline at end of file diff --git a/dist/index.cjs b/dist/index.cjs index 7f499dd..a12d2e5 100644 --- a/dist/index.cjs +++ b/dist/index.cjs @@ -73,7 +73,7 @@ var CommonClient = class extends eventemitter3.EventEmitter { this.max_reconnects = max_reconnects; this.rest_options = rest_options; this.current_reconnects = 0; - this.generate_request_id = generate_request_id || (() => ++this.rpc_id); + this.generate_request_id = generate_request_id || (() => Number(this.rpc_id) + 1); if (!dataPack) this.dataPack = new DefaultDataPack(); else this.dataPack = dataPack; if (this.autoconnect) diff --git a/dist/index.cjs.map b/dist/index.cjs.map index 6e99d14..ecb5f0e 100644 --- a/dist/index.cjs.map +++ b/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/lib/client/websocket.ts","../src/lib/client.ts","../src/lib/utils.ts","../src/lib/server.ts","../src/index.ts"],"names":["EventEmitter","response"],"mappings":"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","sourcesContent":["/* A wrapper for the \"qaap/uws-bindings\" library. */\n\n\"use strict\"\n\nimport WebSocketImpl from \"ws\"\n\nimport { IWSClientAdditionalOptions } from \"./client.types.js\"\n\n/**\n * factory method for common WebSocket instance\n * @method\n * @param {String} address - url to a websocket server\n * @param {(Object)} options - websocket options\n * @return {Undefined}\n */\nexport function WebSocket(\n address: string,\n options: IWSClientAdditionalOptions & WebSocketImpl.ClientOptions\n)\n{\n return new WebSocketImpl(address, options)\n}\n","/**\n * \"Client\" wraps \"ws\" or a browser-implemented \"WebSocket\" library\n * according to the environment providing JSON RPC 2.0 support on top.\n * @module Client\n */\n\n\"use strict\"\n\nimport NodeWebSocket from \"ws\"\nimport { EventEmitter } from \"eventemitter3\"\nimport {\n ICommonWebSocket,\n IWSClientAdditionalOptions,\n NodeWebSocketType,\n ICommonWebSocketFactory,\n} from \"./client/client.types.js\"\n\nimport { DataPack, DefaultDataPack } from \"./utils.js\"\n\ninterface IQueueElement {\n promise: [\n Parameters[0]>[0],\n Parameters[0]>[1]\n ];\n timeout?: ReturnType;\n}\n\nexport interface IQueue {\n [x: number]: IQueueElement;\n}\n\nexport interface IWSRequestParams {\n [x: string]: any;\n [x: number]: any;\n}\n\nexport class CommonClient extends EventEmitter\n{\n private address: string\n private rpc_id: number\n private queue: IQueue\n private options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n private autoconnect: boolean\n private ready: boolean\n private reconnect: boolean\n private reconnect_timer_id: NodeJS.Timeout\n private reconnect_interval: number\n private max_reconnects: number\n private rest_options: IWSClientAdditionalOptions &\n NodeWebSocket.ClientOptions\n private current_reconnects: number\n private generate_request_id: (\n method: string,\n params: object | Array\n ) => number\n private socket: ICommonWebSocket\n private webSocketFactory: ICommonWebSocketFactory\n private dataPack: DataPack\n\n /**\n * Instantiate a Client class.\n * @constructor\n * @param {webSocketFactory} webSocketFactory - factory method for WebSocket\n * @param {String} address - url to a websocket server\n * @param {Object} options - ws options object with reconnect parameters\n * @param {Function} generate_request_id - custom generation request Id\n * @param {DataPack} dataPack - data pack contains encoder and decoder\n * @return {CommonClient}\n */\n constructor(\n webSocketFactory: ICommonWebSocketFactory,\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n ...rest_options\n } = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number,\n dataPack?: DataPack\n )\n {\n super()\n\n this.webSocketFactory = webSocketFactory\n\n this.queue = {}\n this.rpc_id = 0\n\n this.address = address\n this.autoconnect = autoconnect\n this.ready = false\n this.reconnect = reconnect\n this.reconnect_timer_id = undefined\n this.reconnect_interval = reconnect_interval\n this.max_reconnects = max_reconnects\n this.rest_options = rest_options\n this.current_reconnects = 0\n this.generate_request_id = generate_request_id || (() => ++this.rpc_id)\n\n if (!dataPack) this.dataPack = new DefaultDataPack()\n else this.dataPack = dataPack\n\n if (this.autoconnect)\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Connects to a defined server if not connected already.\n * @method\n * @return {Undefined}\n */\n connect()\n {\n if (this.socket) return\n\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Calls a registered RPC method on server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object|Array} params - optional method parameters\n * @param {Number} timeout - RPC reply timeout value\n * @param {Object} ws_opts - options passed to ws\n * @return {Promise}\n */\n call(\n method: string,\n params?: IWSRequestParams,\n timeout?: number,\n ws_opts?: Parameters[1]\n )\n {\n if (!ws_opts && \"object\" === typeof timeout)\n {\n ws_opts = timeout\n timeout = null\n }\n\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const rpc_id = this.generate_request_id(method, params)\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params: params || undefined,\n id: rpc_id,\n }\n\n this.socket.send(this.dataPack.encode(message), ws_opts, (error) =>\n {\n if (error) return reject(error)\n\n this.queue[rpc_id] = { promise: [resolve, reject] }\n\n if (timeout)\n {\n this.queue[rpc_id].timeout = setTimeout(() =>\n {\n delete this.queue[rpc_id]\n reject(new Error(\"reply timeout\"))\n }, timeout)\n }\n })\n })\n }\n\n /**\n * Logins with the other side of the connection.\n * @method\n * @param {Object} params - Login credentials object\n * @return {Promise}\n */\n async login(params: IWSRequestParams)\n {\n const resp = await this.call(\"rpc.login\", params)\n\n if (!resp) throw new Error(\"authentication failed\")\n\n return resp\n }\n\n /**\n * Fetches a list of client's methods registered on server.\n * @method\n * @return {Array}\n */\n async listMethods()\n {\n return await this.call(\"__listMethods\")\n }\n\n /**\n * Sends a JSON-RPC 2.0 notification to server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object} params - optional method parameters\n * @return {Promise}\n */\n notify(method: string, params?: IWSRequestParams)\n {\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params,\n }\n\n this.socket.send(this.dataPack.encode(message), (error) =>\n {\n if (error) return reject(error)\n\n resolve()\n })\n })\n }\n\n /**\n * Subscribes for a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async subscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.on\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\n \"Failed subscribing to an event '\" + event + \"' with: \" + result[event]\n )\n\n return result\n }\n\n /**\n * Unsubscribes from a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async unsubscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.off\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\"Failed unsubscribing from an event with: \" + result)\n\n return result\n }\n\n /**\n * Closes a WebSocket connection gracefully.\n * @method\n * @param {Number} code - socket close code\n * @param {String} data - optional data to be sent before closing\n * @return {Undefined}\n */\n close(code?: number, data?: string)\n {\n this.socket.close(code || 1000, data)\n }\n\n /**\n * Enable / disable automatic reconnection.\n * @method\n * @param {Boolean} reconnect - enable / disable reconnection\n * @return {Undefined}\n */\n setAutoReconnect(reconnect: boolean)\n {\n this.reconnect = reconnect\n }\n\n /**\n * Set the interval between reconnection attempts.\n * @method\n * @param {Number} interval - reconnection interval in milliseconds\n * @return {Undefined}\n */\n setReconnectInterval(interval: number)\n {\n this.reconnect_interval = interval\n }\n\n /**\n * Set the maximum number of reconnection attempts.\n * @method\n * @param {Number} max_reconnects - maximum reconnection attempts\n * @return {Undefined}\n */\n setMaxReconnects(max_reconnects: number)\n {\n this.max_reconnects = max_reconnects\n }\n\n /**\n * Connection/Message handler.\n * @method\n * @private\n * @param {String} address - WebSocket API address\n * @param {Object} options - ws options object\n * @return {Undefined}\n */\n private _connect(\n address: string,\n options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n )\n {\n clearTimeout(this.reconnect_timer_id)\n this.socket = this.webSocketFactory(address, options)\n\n this.socket.addEventListener(\"open\", () =>\n {\n this.ready = true\n this.emit(\"open\")\n this.current_reconnects = 0\n })\n\n this.socket.addEventListener(\"message\", ({ data: message }) =>\n {\n if (message instanceof ArrayBuffer)\n message = Buffer.from(message).toString()\n\n try\n {\n message = this.dataPack.decode(message)\n }\n catch (error)\n {\n return\n }\n\n // check if any listeners are attached and forward event\n if (message.notification && this.listeners(message.notification).length)\n {\n if (!Object.keys(message.params).length)\n return this.emit(message.notification)\n\n const args = [message.notification]\n\n if (message.params.constructor === Object) args.push(message.params)\n // using for-loop instead of unshift/spread because performance is better\n else\n for (let i = 0; i < message.params.length; i++)\n args.push(message.params[i])\n\n // run as microtask so that pending queue messages are resolved first\n // eslint-disable-next-line prefer-spread\n return Promise.resolve().then(() =>\n {\n // eslint-disable-next-line prefer-spread\n this.emit.apply(this, args)\n })\n }\n\n if (!this.queue[message.id])\n {\n // general JSON RPC 2.0 events\n if (message.method)\n {\n // run as microtask so that pending queue messages are resolved first\n return Promise.resolve().then(() =>\n {\n this.emit(message.method, message?.params)\n })\n }\n\n return\n }\n\n // reject early since server's response is invalid\n if (\"error\" in message === \"result\" in message)\n this.queue[message.id].promise[1](\n new Error(\n \"Server response malformed. Response must include either \\\"result\\\"\" +\n \" or \\\"error\\\", but not both.\"\n )\n )\n\n if (this.queue[message.id].timeout)\n clearTimeout(this.queue[message.id].timeout)\n\n if (message.error) this.queue[message.id].promise[1](message.error)\n else this.queue[message.id].promise[0](message.result)\n\n delete this.queue[message.id]\n })\n\n this.socket.addEventListener(\"error\", (error) => this.emit(\"error\", error))\n\n this.socket.addEventListener(\"close\", ({ code, reason }) =>\n {\n if (this.ready)\n // Delay close event until internal state is updated\n setTimeout(() => this.emit(\"close\", code, reason), 0)\n\n this.ready = false\n this.socket = undefined\n\n if (code === 1000) return\n\n this.current_reconnects++\n\n if (\n this.reconnect &&\n (this.max_reconnects > this.current_reconnects ||\n this.max_reconnects === 0)\n )\n this.reconnect_timer_id = setTimeout(\n () => this._connect(address, options),\n this.reconnect_interval\n )\n })\n }\n}\n","\"use strict\"\n\nexport interface DataPack<\n T,\n R extends string | ArrayBufferLike | Blob | ArrayBufferView\n> {\n encode(value: T): R;\n decode(value: R): T;\n}\n\nexport class DefaultDataPack implements DataPack\n{\n encode(value: Object): string\n {\n return JSON.stringify(value)\n }\n\n decode(value: string): Object\n {\n return JSON.parse(value)\n }\n}\n","/**\n * \"Server\" wraps the \"ws\" library providing JSON RPC 2.0 support on top.\n * @module Server\n */\n\n\"use strict\"\n\nimport { EventEmitter } from \"eventemitter3\"\nimport url from \"node:url\"\nimport { v1 as uuidv1 } from \"uuid\"\nimport NodeWebSocket, { WebSocketServer } from \"ws\"\n\nimport { DataPack, DefaultDataPack } from \"./utils.js\"\n\ninterface INamespaceEvent {\n [x: string]: {\n sockets: Array;\n protected: boolean;\n };\n}\n\ninterface IMethod {\n public: () => void;\n protected: () => void;\n}\n\ninterface IEvent {\n public: () => void;\n protected: () => void;\n}\n\ninterface IRPCError {\n code: number;\n message: string;\n data?: string;\n}\n\ninterface IRPCMethodParams {\n [x: string]: any;\n}\n\ninterface IRPCMethod {\n [x: string]: {\n fn: (params: IRPCMethodParams, socket_id: string) => any;\n protected: boolean;\n };\n}\n\ninterface INamespace {\n [x: string]: {\n rpc_methods: IRPCMethod;\n clients: Map;\n events: INamespaceEvent;\n };\n}\n\ninterface IClientWebSocket extends NodeWebSocket {\n _id: string;\n _authenticated: boolean;\n}\n\ninterface IRPCResult {\n [x: string]: string;\n}\n\nexport class Server extends EventEmitter\n{\n private namespaces: INamespace\n private dataPack: DataPack\n wss: InstanceType\n\n /**\n * Instantiate a Server class.\n * @constructor\n * @param {Object} options - ws constructor's parameters with rpc\n * @param {DataPack} dataPack - data pack contains encoder and decoder\n * @return {Server} - returns a new Server instance\n */\n constructor(\n options: NodeWebSocket.ServerOptions,\n dataPack?: DataPack\n )\n {\n super()\n\n /**\n * Stores all connected sockets with a universally unique identifier\n * in the appropriate namespace.\n * Stores all rpc methods to specific namespaces. \"/\" by default.\n * Stores all events as keys and subscribed users in array as value\n * @private\n * @name namespaces\n * @param {Object} namespaces.rpc_methods\n * @param {Map} namespaces.clients\n * @param {Object} namespaces.events\n */\n this.namespaces = {}\n\n if (!dataPack) this.dataPack = new DefaultDataPack()\n else this.dataPack = dataPack\n\n this.wss = new WebSocketServer(options)\n\n this.wss.on(\"listening\", () => this.emit(\"listening\"))\n\n this.wss.on(\"connection\", (socket: IClientWebSocket, request) =>\n {\n const u = url.parse(request.url, true)\n const ns = u.pathname\n\n if (u.query.socket_id) socket._id = u.query.socket_id as string\n else socket._id = uuidv1()\n\n // unauthenticated by default\n socket[\"_authenticated\"] = false\n\n // propagate socket errors\n socket.on(\"error\", (error) => this.emit(\"socket-error\", socket, error))\n\n // cleanup after the socket gets disconnected\n socket.on(\"close\", () =>\n {\n this.namespaces[ns].clients.delete(socket._id)\n\n for (const event of Object.keys(this.namespaces[ns].events))\n {\n const index = this.namespaces[ns].events[event].sockets.indexOf(\n socket._id\n )\n\n if (index >= 0)\n this.namespaces[ns].events[event].sockets.splice(index, 1)\n }\n\n this.emit(\"disconnection\", socket)\n })\n\n if (!this.namespaces[ns]) this._generateNamespace(ns)\n\n // store socket and method\n this.namespaces[ns].clients.set(socket._id, socket)\n\n this.emit(\"connection\", socket, request)\n\n return this._handleRPC(socket, ns)\n })\n\n this.wss.on(\"error\", (error) => this.emit(\"error\", error))\n }\n\n /**\n * Registers an RPC method.\n * @method\n * @param {String} name - method name\n * @param {Function} fn - a callee function\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Object} - returns an IMethod object\n */\n register(\n name: string,\n fn: (params: IRPCMethodParams, socket_id: string) => void,\n ns = \"/\"\n )\n {\n if (!this.namespaces[ns]) this._generateNamespace(ns)\n\n this.namespaces[ns].rpc_methods[name] = {\n fn: fn,\n protected: false,\n }\n\n return {\n protected: () => this._makeProtectedMethod(name, ns),\n public: () => this._makePublicMethod(name, ns),\n } as IMethod\n }\n\n /**\n * Sets an auth method.\n * @method\n * @param {Function} fn - an arbitrary auth method\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Undefined}\n */\n setAuth(\n fn: (params: IRPCMethodParams, socket_id: string) => Promise,\n ns = \"/\"\n )\n {\n this.register(\"rpc.login\", fn, ns)\n }\n\n /**\n * Marks an RPC method as protected.\n * @method\n * @param {String} name - method name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makeProtectedMethod(name: string, ns = \"/\")\n {\n this.namespaces[ns].rpc_methods[name].protected = true\n }\n\n /**\n * Marks an RPC method as public.\n * @method\n * @param {String} name - method name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makePublicMethod(name: string, ns = \"/\")\n {\n this.namespaces[ns].rpc_methods[name].protected = false\n }\n\n /**\n * Marks an event as protected.\n * @method\n * @param {String} name - event name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makeProtectedEvent(name: string, ns = \"/\")\n {\n this.namespaces[ns].events[name].protected = true\n }\n\n /**\n * Marks an event as public.\n * @method\n * @param {String} name - event name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makePublicEvent(name: string, ns = \"/\")\n {\n this.namespaces[ns].events[name].protected = false\n }\n\n /**\n * Removes a namespace and closes all connections\n * @method\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Undefined}\n */\n closeNamespace(ns: string)\n {\n const namespace = this.namespaces[ns]\n\n if (namespace)\n {\n delete namespace.rpc_methods\n delete namespace.events\n\n for (const socket of namespace.clients.values()) socket.close()\n\n delete this.namespaces[ns]\n }\n }\n\n /**\n * Creates a new event that can be emitted to clients.\n * @method\n * @param {String} name - event name\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Object} - returns an IEvent object\n */\n event(name: string, ns = \"/\"): IEvent\n {\n if (!this.namespaces[ns]) this._generateNamespace(ns)\n else\n {\n const index = this.namespaces[ns].events[name]\n\n if (index !== undefined)\n throw new Error(`Already registered event ${ns}${name}`)\n }\n\n this.namespaces[ns].events[name] = {\n sockets: [],\n protected: false,\n }\n\n // forward emitted event to subscribers\n this.on(name, (...params) =>\n {\n // flatten an object if no spreading is wanted\n if (params.length === 1 && params[0] instanceof Object)\n params = params[0]\n\n for (const socket_id of this.namespaces[ns].events[name].sockets)\n {\n const socket = this.namespaces[ns].clients.get(socket_id)\n\n if (!socket) continue\n\n socket.send(\n this.dataPack.encode({\n notification: name,\n params,\n })\n )\n }\n })\n\n return {\n protected: () => this._makeProtectedEvent(name, ns),\n public: () => this._makePublicEvent(name, ns),\n }\n }\n\n /**\n * Returns a requested namespace object\n * @method\n * @param {String} name - namespace identifier\n * @throws {TypeError}\n * @return {Object} - namespace object\n */\n of(name: string)\n {\n if (!this.namespaces[name]) this._generateNamespace(name)\n\n const self = this\n\n return {\n // self.register convenience method\n register(\n fn_name: string,\n fn: (params: IRPCMethodParams) => void\n ): IMethod\n {\n if (arguments.length !== 2)\n throw new Error(\"must provide exactly two arguments\")\n\n if (typeof fn_name !== \"string\")\n throw new Error(\"name must be a string\")\n\n if (typeof fn !== \"function\")\n throw new Error(\"handler must be a function\")\n\n return self.register(fn_name, fn, name)\n },\n\n // self.event convenience method\n event(ev_name: string): IEvent\n {\n if (arguments.length !== 1)\n throw new Error(\"must provide exactly one argument\")\n\n if (typeof ev_name !== \"string\")\n throw new Error(\"name must be a string\")\n\n return self.event(ev_name, name)\n },\n\n // self.eventList convenience method\n get eventList()\n {\n return Object.keys(self.namespaces[name].events)\n },\n\n /**\n * Emits a specified event to this namespace.\n * @inner\n * @method\n * @param {String} event - event name\n * @param {Array} params - event parameters\n * @return {Undefined}\n */\n emit(event: string, ...params: Array)\n {\n const socket_ids = [...self.namespaces[name].clients.keys()]\n\n for (let i = 0, id; (id = socket_ids[i]); ++i)\n {\n self.namespaces[name].clients.get(id).send(\n self.dataPack.encode({\n notification: event,\n params: params || [],\n })\n )\n }\n },\n\n /**\n * Returns a name of this namespace.\n * @inner\n * @method\n * @kind constant\n * @return {String}\n */\n get name()\n {\n return name\n },\n\n /**\n * Returns a hash of websocket objects connected to this namespace.\n * @inner\n * @method\n * @return {Object}\n */\n connected()\n {\n const socket_ids = [...self.namespaces[name].clients.keys()]\n\n return socket_ids.reduce(\n (acc, curr) => ({\n ...acc,\n [curr]: self.namespaces[name].clients.get(curr),\n }),\n {}\n )\n },\n\n /**\n * Returns a list of client unique identifiers connected to this namespace.\n * @inner\n * @method\n * @return {Array}\n */\n clients()\n {\n return self.namespaces[name]\n },\n }\n }\n\n /**\n * Lists all created events in a given namespace. Defaults to \"/\".\n * @method\n * @param {String} ns - namespaces identifier\n * @readonly\n * @return {Array} - returns a list of created events\n */\n eventList(ns = \"/\")\n {\n if (!this.namespaces[ns]) return []\n\n return Object.keys(this.namespaces[ns].events)\n }\n\n /**\n * Creates a JSON-RPC 2.0 compliant error\n * @method\n * @param {Number} code - indicates the error type that occurred\n * @param {String} message - provides a short description of the error\n * @param {String|Object} data - details containing additional information about the error\n * @return {Object}\n */\n createError(code: number, message: string, data: string | object)\n {\n return {\n code: code,\n message: message,\n data: data || null,\n }\n }\n\n /**\n * Closes the server and terminates all clients.\n * @method\n * @return {Promise}\n */\n close()\n {\n return new Promise((resolve, reject) =>\n {\n try\n {\n this.wss.close()\n this.emit(\"close\")\n resolve()\n }\n catch (error)\n {\n reject(error)\n }\n })\n }\n\n /**\n * Handles all WebSocket JSON RPC 2.0 requests.\n * @private\n * @param {Object} socket - ws socket instance\n * @param {String} ns - namespaces identifier\n * @return {Undefined}\n */\n private _handleRPC(socket: IClientWebSocket, ns = \"/\")\n {\n socket.on(\"message\", async (data: any) =>\n {\n const msg_options: Parameters[1] = {}\n\n if (data instanceof ArrayBuffer)\n {\n msg_options.binary = true\n\n data = Buffer.from(data).toString()\n }\n\n if (socket.readyState !== 1) return // TODO: should have debug logs here\n\n let parsedData: any\n\n try\n {\n parsedData = this.dataPack.decode(data as string)\n }\n catch (error)\n {\n return socket.send(\n this.dataPack.encode({\n jsonrpc: \"2.0\",\n error: createError(-32700, error.toString()),\n id: null,\n }),\n msg_options\n )\n }\n\n if (Array.isArray(parsedData))\n {\n if (!parsedData.length)\n return socket.send(\n this.dataPack.encode({\n jsonrpc: \"2.0\",\n error: createError(-32600, \"Invalid array\"),\n id: null,\n }),\n msg_options\n )\n\n const responses = []\n\n for (const message of parsedData)\n {\n const response = await this._runMethod(message, socket._id, ns)\n\n if (!response) continue\n\n responses.push(response)\n }\n\n if (!responses.length) return\n\n return socket.send(this.dataPack.encode(responses), msg_options)\n }\n\n const response = await this._runMethod(parsedData, socket._id, ns)\n\n if (!response) return\n\n return socket.send(this.dataPack.encode(response), msg_options)\n })\n }\n\n /**\n * Runs a defined RPC method.\n * @private\n * @param {Object} message - a message received\n * @param {Object} socket_id - user's socket id\n * @param {String} ns - namespaces identifier\n * @return {Object|undefined}\n */\n private async _runMethod(message: any, socket_id: string, ns = \"/\")\n {\n if (typeof message !== \"object\" || message === null)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600),\n id: null,\n }\n\n if (message.jsonrpc !== \"2.0\")\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600, \"Invalid JSON RPC version\"),\n id: message.id || null,\n }\n\n if (!message.method)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32602, \"Method not specified\"),\n id: message.id || null,\n }\n\n if (typeof message.method !== \"string\")\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600, \"Invalid method name\"),\n id: message.id || null,\n }\n\n if (message.params && typeof message.params === \"string\")\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600),\n id: message.id || null,\n }\n\n if (message.method === \"rpc.on\")\n {\n if (!message.params)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32000),\n id: message.id || null,\n }\n\n const results: IRPCMethodParams = {}\n\n const event_names = Object.keys(this.namespaces[ns].events)\n\n for (const name of message.params)\n {\n const index = event_names.indexOf(name)\n const namespace = this.namespaces[ns]\n\n if (index === -1)\n {\n results[name] = \"provided event invalid\"\n continue\n }\n\n // reject request if event is protected and if client is not authenticated\n if (\n namespace.events[event_names[index]].protected === true &&\n namespace.clients.get(socket_id)[\"_authenticated\"] === false\n )\n {\n return {\n jsonrpc: \"2.0\",\n error: createError(-32606),\n id: message.id || null,\n }\n }\n\n const socket_index =\n namespace.events[event_names[index]].sockets.indexOf(socket_id)\n if (socket_index >= 0)\n {\n results[name] = \"socket has already been subscribed to event\"\n continue\n }\n namespace.events[event_names[index]].sockets.push(socket_id)\n\n results[name] = \"ok\"\n }\n\n return {\n jsonrpc: \"2.0\",\n result: results,\n id: message.id || null,\n }\n }\n else if (message.method === \"rpc.off\")\n {\n if (!message.params)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32000),\n id: message.id || null,\n }\n\n const results: IRPCResult = {}\n\n for (const name of message.params)\n {\n if (!this.namespaces[ns].events[name])\n {\n results[name] = \"provided event invalid\"\n continue\n }\n\n const index =\n this.namespaces[ns].events[name].sockets.indexOf(socket_id)\n\n if (index === -1)\n {\n results[name] = \"not subscribed\"\n continue\n }\n\n this.namespaces[ns].events[name].sockets.splice(index, 1)\n results[name] = \"ok\"\n }\n\n return {\n jsonrpc: \"2.0\",\n result: results,\n id: message.id || null,\n }\n }\n else if (message.method === \"rpc.login\")\n {\n if (!message.params)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32604),\n id: message.id || null,\n }\n }\n\n if (!this.namespaces[ns].rpc_methods[message.method])\n {\n return {\n jsonrpc: \"2.0\",\n error: createError(-32601),\n id: message.id || null,\n }\n }\n\n let response = null\n\n // reject request if method is protected and if client is not authenticated\n if (\n this.namespaces[ns].rpc_methods[message.method].protected === true &&\n this.namespaces[ns].clients.get(socket_id)[\"_authenticated\"] === false\n )\n {\n return {\n jsonrpc: \"2.0\",\n error: createError(-32605),\n id: message.id || null,\n }\n }\n\n try\n {\n response = await this.namespaces[ns].rpc_methods[message.method].fn(\n message.params,\n socket_id\n )\n }\n catch (error)\n {\n if (!message.id) return\n\n if (error instanceof Error)\n return {\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: error.name,\n data: error.message,\n },\n id: message.id,\n }\n\n return {\n jsonrpc: \"2.0\",\n error: error,\n id: message.id,\n }\n }\n\n // client sent a notification, so we won't need a reply\n if (!message.id) return\n\n // if login middleware returned true, set connection as authenticated\n if (message.method === \"rpc.login\" && response === true)\n {\n const s = this.namespaces[ns].clients.get(socket_id)\n s[\"_authenticated\"] = true\n this.namespaces[ns].clients.set(socket_id, s)\n }\n\n return {\n jsonrpc: \"2.0\",\n result: response,\n id: message.id,\n }\n }\n\n /**\n * Generate a new namespace store.\n * Also preregister some special namespace methods.\n * @private\n * @param {String} name - namespaces identifier\n * @return {undefined}\n */\n private _generateNamespace(name: string)\n {\n this.namespaces[name] = {\n rpc_methods: {\n __listMethods: {\n fn: () => Object.keys(this.namespaces[name].rpc_methods),\n protected: false,\n },\n },\n clients: new Map(),\n events: {},\n }\n }\n}\n\nconst RPC_ERRORS = new Map([\n [-32000, \"Event not provided\"],\n [-32600, \"Invalid Request\"],\n [-32601, \"Method not found\"],\n [-32602, \"Invalid params\"],\n [-32603, \"Internal error\"],\n [-32604, \"Params not found\"],\n [-32605, \"Method forbidden\"],\n [-32606, \"Event forbidden\"],\n [-32700, \"Parse error\"],\n])\n\n/**\n * Creates a JSON-RPC 2.0-compliant error.\n * @param {Number} code - error code\n * @param {String} details - error details\n * @return {Object}\n */\nexport function createError(code: number, details?: string)\n{\n const error: IRPCError = {\n code: code,\n message: RPC_ERRORS.get(code) || \"Internal Server Error\",\n }\n\n if (details) error[\"data\"] = details\n\n return error\n}\n","\"use strict\"\n\nimport { WebSocket } from \"./lib/client/websocket.js\"\nimport { CommonClient } from \"./lib/client.js\"\nimport {\n NodeWebSocketTypeOptions,\n IWSClientAdditionalOptions,\n ICommonWebSocketFactory,\n} from \"./lib/client/client.types.js\"\n\nexport class Client extends CommonClient\n{\n constructor(\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n ...rest_options\n }: IWSClientAdditionalOptions & NodeWebSocketTypeOptions = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number\n )\n {\n super(\n WebSocket as ICommonWebSocketFactory,\n address,\n {\n autoconnect,\n reconnect,\n reconnect_interval,\n max_reconnects,\n ...rest_options,\n },\n generate_request_id\n )\n }\n}\n\nexport * from \"./lib/client.js\"\nexport * from \"./lib/client/websocket.js\"\nexport * from \"./lib/client/client.types.js\"\nexport * from \"./lib/server.js\"\nexport * from \"./lib/utils.js\""]} \ No newline at end of file +{"version":3,"sources":["../src/lib/client/websocket.ts","../src/lib/client.ts","../src/lib/utils.ts","../src/lib/server.ts","../src/index.ts"],"names":["EventEmitter","response"],"mappings":"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","sourcesContent":["/* A wrapper for the \"qaap/uws-bindings\" library. */\n\n\"use strict\"\n\nimport WebSocketImpl from \"ws\"\n\nimport { IWSClientAdditionalOptions } from \"./client.types.js\"\n\n/**\n * factory method for common WebSocket instance\n * @method\n * @param {String} address - url to a websocket server\n * @param {(Object)} options - websocket options\n * @return {Undefined}\n */\nexport function WebSocket(\n address: string,\n options: IWSClientAdditionalOptions & WebSocketImpl.ClientOptions\n)\n{\n return new WebSocketImpl(address, options)\n}\n","/**\n * \"Client\" wraps \"ws\" or a browser-implemented \"WebSocket\" library\n * according to the environment providing JSON RPC 2.0 support on top.\n * @module Client\n */\n\n\"use strict\"\n\nimport NodeWebSocket from \"ws\"\nimport { EventEmitter } from \"eventemitter3\"\nimport {\n ICommonWebSocket,\n IWSClientAdditionalOptions,\n NodeWebSocketType,\n ICommonWebSocketFactory,\n} from \"./client/client.types.js\"\n\nimport { DataPack, DefaultDataPack } from \"./utils.js\"\n\ninterface IQueueElement {\n promise: [\n Parameters[0]>[0],\n Parameters[0]>[1]\n ];\n timeout?: ReturnType;\n}\n\nexport interface IQueue {\n [x: number | string]: IQueueElement;\n}\n\nexport interface IWSRequestParams {\n [x: string]: any;\n [x: number]: any;\n}\n\nexport class CommonClient extends EventEmitter\n{\n private address: string\n private rpc_id: number | string\n private queue: IQueue\n private options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n private autoconnect: boolean\n private ready: boolean\n private reconnect: boolean\n private reconnect_timer_id: NodeJS.Timeout\n private reconnect_interval: number\n private max_reconnects: number\n private rest_options: IWSClientAdditionalOptions &\n NodeWebSocket.ClientOptions\n private current_reconnects: number\n private generate_request_id: (\n method: string,\n params: object | Array\n ) => number | string\n private socket: ICommonWebSocket\n private webSocketFactory: ICommonWebSocketFactory\n private dataPack: DataPack\n\n /**\n * Instantiate a Client class.\n * @constructor\n * @param {webSocketFactory} webSocketFactory - factory method for WebSocket\n * @param {String} address - url to a websocket server\n * @param {Object} options - ws options object with reconnect parameters\n * @param {Function} generate_request_id - custom generation request Id\n * @param {DataPack} dataPack - data pack contains encoder and decoder\n * @return {CommonClient}\n */\n constructor(\n webSocketFactory: ICommonWebSocketFactory,\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n ...rest_options\n } = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number | string,\n dataPack?: DataPack\n )\n {\n super()\n\n this.webSocketFactory = webSocketFactory\n\n this.queue = {}\n this.rpc_id = 0\n\n this.address = address\n this.autoconnect = autoconnect\n this.ready = false\n this.reconnect = reconnect\n this.reconnect_timer_id = undefined\n this.reconnect_interval = reconnect_interval\n this.max_reconnects = max_reconnects\n this.rest_options = rest_options\n this.current_reconnects = 0\n this.generate_request_id = generate_request_id || (() => Number(this.rpc_id) + 1)\n\n if (!dataPack) this.dataPack = new DefaultDataPack()\n else this.dataPack = dataPack\n\n if (this.autoconnect)\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Connects to a defined server if not connected already.\n * @method\n * @return {Undefined}\n */\n connect()\n {\n if (this.socket) return\n\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Calls a registered RPC method on server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object|Array} params - optional method parameters\n * @param {Number} timeout - RPC reply timeout value\n * @param {Object} ws_opts - options passed to ws\n * @return {Promise}\n */\n call(\n method: string,\n params?: IWSRequestParams,\n timeout?: number,\n ws_opts?: Parameters[1]\n )\n {\n if (!ws_opts && \"object\" === typeof timeout)\n {\n ws_opts = timeout\n timeout = null\n }\n\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const rpc_id = this.generate_request_id(method, params)\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params: params || undefined,\n id: rpc_id,\n }\n\n this.socket.send(this.dataPack.encode(message), ws_opts, (error) =>\n {\n if (error) return reject(error)\n\n this.queue[rpc_id] = { promise: [resolve, reject] }\n\n if (timeout)\n {\n this.queue[rpc_id].timeout = setTimeout(() =>\n {\n delete this.queue[rpc_id]\n reject(new Error(\"reply timeout\"))\n }, timeout)\n }\n })\n })\n }\n\n /**\n * Logins with the other side of the connection.\n * @method\n * @param {Object} params - Login credentials object\n * @return {Promise}\n */\n async login(params: IWSRequestParams)\n {\n const resp = await this.call(\"rpc.login\", params)\n\n if (!resp) throw new Error(\"authentication failed\")\n\n return resp\n }\n\n /**\n * Fetches a list of client's methods registered on server.\n * @method\n * @return {Array}\n */\n async listMethods()\n {\n return await this.call(\"__listMethods\")\n }\n\n /**\n * Sends a JSON-RPC 2.0 notification to server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object} params - optional method parameters\n * @return {Promise}\n */\n notify(method: string, params?: IWSRequestParams)\n {\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params,\n }\n\n this.socket.send(this.dataPack.encode(message), (error) =>\n {\n if (error) return reject(error)\n\n resolve()\n })\n })\n }\n\n /**\n * Subscribes for a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async subscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.on\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\n \"Failed subscribing to an event '\" + event + \"' with: \" + result[event]\n )\n\n return result\n }\n\n /**\n * Unsubscribes from a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async unsubscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.off\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\"Failed unsubscribing from an event with: \" + result)\n\n return result\n }\n\n /**\n * Closes a WebSocket connection gracefully.\n * @method\n * @param {Number} code - socket close code\n * @param {String} data - optional data to be sent before closing\n * @return {Undefined}\n */\n close(code?: number, data?: string)\n {\n this.socket.close(code || 1000, data)\n }\n\n /**\n * Enable / disable automatic reconnection.\n * @method\n * @param {Boolean} reconnect - enable / disable reconnection\n * @return {Undefined}\n */\n setAutoReconnect(reconnect: boolean)\n {\n this.reconnect = reconnect\n }\n\n /**\n * Set the interval between reconnection attempts.\n * @method\n * @param {Number} interval - reconnection interval in milliseconds\n * @return {Undefined}\n */\n setReconnectInterval(interval: number)\n {\n this.reconnect_interval = interval\n }\n\n /**\n * Set the maximum number of reconnection attempts.\n * @method\n * @param {Number} max_reconnects - maximum reconnection attempts\n * @return {Undefined}\n */\n setMaxReconnects(max_reconnects: number)\n {\n this.max_reconnects = max_reconnects\n }\n\n /**\n * Connection/Message handler.\n * @method\n * @private\n * @param {String} address - WebSocket API address\n * @param {Object} options - ws options object\n * @return {Undefined}\n */\n private _connect(\n address: string,\n options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n )\n {\n clearTimeout(this.reconnect_timer_id)\n this.socket = this.webSocketFactory(address, options)\n\n this.socket.addEventListener(\"open\", () =>\n {\n this.ready = true\n this.emit(\"open\")\n this.current_reconnects = 0\n })\n\n this.socket.addEventListener(\"message\", ({ data: message }) =>\n {\n if (message instanceof ArrayBuffer)\n message = Buffer.from(message).toString()\n\n try\n {\n message = this.dataPack.decode(message)\n }\n catch (error)\n {\n return\n }\n\n // check if any listeners are attached and forward event\n if (message.notification && this.listeners(message.notification).length)\n {\n if (!Object.keys(message.params).length)\n return this.emit(message.notification)\n\n const args = [message.notification]\n\n if (message.params.constructor === Object) args.push(message.params)\n // using for-loop instead of unshift/spread because performance is better\n else\n for (let i = 0; i < message.params.length; i++)\n args.push(message.params[i])\n\n // run as microtask so that pending queue messages are resolved first\n // eslint-disable-next-line prefer-spread\n return Promise.resolve().then(() =>\n {\n // eslint-disable-next-line prefer-spread\n this.emit.apply(this, args)\n })\n }\n\n if (!this.queue[message.id])\n {\n // general JSON RPC 2.0 events\n if (message.method)\n {\n // run as microtask so that pending queue messages are resolved first\n return Promise.resolve().then(() =>\n {\n this.emit(message.method, message?.params)\n })\n }\n\n return\n }\n\n // reject early since server's response is invalid\n if (\"error\" in message === \"result\" in message)\n this.queue[message.id].promise[1](\n new Error(\n \"Server response malformed. Response must include either \\\"result\\\"\" +\n \" or \\\"error\\\", but not both.\"\n )\n )\n\n if (this.queue[message.id].timeout)\n clearTimeout(this.queue[message.id].timeout)\n\n if (message.error) this.queue[message.id].promise[1](message.error)\n else this.queue[message.id].promise[0](message.result)\n\n delete this.queue[message.id]\n })\n\n this.socket.addEventListener(\"error\", (error) => this.emit(\"error\", error))\n\n this.socket.addEventListener(\"close\", ({ code, reason }) =>\n {\n if (this.ready)\n // Delay close event until internal state is updated\n setTimeout(() => this.emit(\"close\", code, reason), 0)\n\n this.ready = false\n this.socket = undefined\n\n if (code === 1000) return\n\n this.current_reconnects++\n\n if (\n this.reconnect &&\n (this.max_reconnects > this.current_reconnects ||\n this.max_reconnects === 0)\n )\n this.reconnect_timer_id = setTimeout(\n () => this._connect(address, options),\n this.reconnect_interval\n )\n })\n }\n}\n","\"use strict\"\n\nexport interface DataPack<\n T,\n R extends string | ArrayBufferLike | Blob | ArrayBufferView\n> {\n encode(value: T): R;\n decode(value: R): T;\n}\n\nexport class DefaultDataPack implements DataPack\n{\n encode(value: Object): string\n {\n return JSON.stringify(value)\n }\n\n decode(value: string): Object\n {\n return JSON.parse(value)\n }\n}\n","/**\n * \"Server\" wraps the \"ws\" library providing JSON RPC 2.0 support on top.\n * @module Server\n */\n\n\"use strict\"\n\nimport { EventEmitter } from \"eventemitter3\"\nimport url from \"node:url\"\nimport { v1 as uuidv1 } from \"uuid\"\nimport NodeWebSocket, { WebSocketServer } from \"ws\"\n\nimport { DataPack, DefaultDataPack } from \"./utils.js\"\n\ninterface INamespaceEvent {\n [x: string]: {\n sockets: Array;\n protected: boolean;\n };\n}\n\ninterface IMethod {\n public: () => void;\n protected: () => void;\n}\n\ninterface IEvent {\n public: () => void;\n protected: () => void;\n}\n\ninterface IRPCError {\n code: number;\n message: string;\n data?: string;\n}\n\ninterface IRPCMethodParams {\n [x: string]: any;\n}\n\ninterface IRPCMethod {\n [x: string]: {\n fn: (params: IRPCMethodParams, socket_id: string) => any;\n protected: boolean;\n };\n}\n\ninterface INamespace {\n [x: string]: {\n rpc_methods: IRPCMethod;\n clients: Map;\n events: INamespaceEvent;\n };\n}\n\ninterface IClientWebSocket extends NodeWebSocket {\n _id: string;\n _authenticated: boolean;\n}\n\ninterface IRPCResult {\n [x: string]: string;\n}\n\nexport class Server extends EventEmitter\n{\n private namespaces: INamespace\n private dataPack: DataPack\n wss: InstanceType\n\n /**\n * Instantiate a Server class.\n * @constructor\n * @param {Object} options - ws constructor's parameters with rpc\n * @param {DataPack} dataPack - data pack contains encoder and decoder\n * @return {Server} - returns a new Server instance\n */\n constructor(\n options: NodeWebSocket.ServerOptions,\n dataPack?: DataPack\n )\n {\n super()\n\n /**\n * Stores all connected sockets with a universally unique identifier\n * in the appropriate namespace.\n * Stores all rpc methods to specific namespaces. \"/\" by default.\n * Stores all events as keys and subscribed users in array as value\n * @private\n * @name namespaces\n * @param {Object} namespaces.rpc_methods\n * @param {Map} namespaces.clients\n * @param {Object} namespaces.events\n */\n this.namespaces = {}\n\n if (!dataPack) this.dataPack = new DefaultDataPack()\n else this.dataPack = dataPack\n\n this.wss = new WebSocketServer(options)\n\n this.wss.on(\"listening\", () => this.emit(\"listening\"))\n\n this.wss.on(\"connection\", (socket: IClientWebSocket, request) =>\n {\n const u = url.parse(request.url, true)\n const ns = u.pathname\n\n if (u.query.socket_id) socket._id = u.query.socket_id as string\n else socket._id = uuidv1()\n\n // unauthenticated by default\n socket[\"_authenticated\"] = false\n\n // propagate socket errors\n socket.on(\"error\", (error) => this.emit(\"socket-error\", socket, error))\n\n // cleanup after the socket gets disconnected\n socket.on(\"close\", () =>\n {\n this.namespaces[ns].clients.delete(socket._id)\n\n for (const event of Object.keys(this.namespaces[ns].events))\n {\n const index = this.namespaces[ns].events[event].sockets.indexOf(\n socket._id\n )\n\n if (index >= 0)\n this.namespaces[ns].events[event].sockets.splice(index, 1)\n }\n\n this.emit(\"disconnection\", socket)\n })\n\n if (!this.namespaces[ns]) this._generateNamespace(ns)\n\n // store socket and method\n this.namespaces[ns].clients.set(socket._id, socket)\n\n this.emit(\"connection\", socket, request)\n\n return this._handleRPC(socket, ns)\n })\n\n this.wss.on(\"error\", (error) => this.emit(\"error\", error))\n }\n\n /**\n * Registers an RPC method.\n * @method\n * @param {String} name - method name\n * @param {Function} fn - a callee function\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Object} - returns an IMethod object\n */\n register(\n name: string,\n fn: (params: IRPCMethodParams, socket_id: string) => void,\n ns = \"/\"\n )\n {\n if (!this.namespaces[ns]) this._generateNamespace(ns)\n\n this.namespaces[ns].rpc_methods[name] = {\n fn: fn,\n protected: false,\n }\n\n return {\n protected: () => this._makeProtectedMethod(name, ns),\n public: () => this._makePublicMethod(name, ns),\n } as IMethod\n }\n\n /**\n * Sets an auth method.\n * @method\n * @param {Function} fn - an arbitrary auth method\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Undefined}\n */\n setAuth(\n fn: (params: IRPCMethodParams, socket_id: string) => Promise,\n ns = \"/\"\n )\n {\n this.register(\"rpc.login\", fn, ns)\n }\n\n /**\n * Marks an RPC method as protected.\n * @method\n * @param {String} name - method name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makeProtectedMethod(name: string, ns = \"/\")\n {\n this.namespaces[ns].rpc_methods[name].protected = true\n }\n\n /**\n * Marks an RPC method as public.\n * @method\n * @param {String} name - method name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makePublicMethod(name: string, ns = \"/\")\n {\n this.namespaces[ns].rpc_methods[name].protected = false\n }\n\n /**\n * Marks an event as protected.\n * @method\n * @param {String} name - event name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makeProtectedEvent(name: string, ns = \"/\")\n {\n this.namespaces[ns].events[name].protected = true\n }\n\n /**\n * Marks an event as public.\n * @method\n * @param {String} name - event name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makePublicEvent(name: string, ns = \"/\")\n {\n this.namespaces[ns].events[name].protected = false\n }\n\n /**\n * Removes a namespace and closes all connections\n * @method\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Undefined}\n */\n closeNamespace(ns: string)\n {\n const namespace = this.namespaces[ns]\n\n if (namespace)\n {\n delete namespace.rpc_methods\n delete namespace.events\n\n for (const socket of namespace.clients.values()) socket.close()\n\n delete this.namespaces[ns]\n }\n }\n\n /**\n * Creates a new event that can be emitted to clients.\n * @method\n * @param {String} name - event name\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Object} - returns an IEvent object\n */\n event(name: string, ns = \"/\"): IEvent\n {\n if (!this.namespaces[ns]) this._generateNamespace(ns)\n else\n {\n const index = this.namespaces[ns].events[name]\n\n if (index !== undefined)\n throw new Error(`Already registered event ${ns}${name}`)\n }\n\n this.namespaces[ns].events[name] = {\n sockets: [],\n protected: false,\n }\n\n // forward emitted event to subscribers\n this.on(name, (...params) =>\n {\n // flatten an object if no spreading is wanted\n if (params.length === 1 && params[0] instanceof Object)\n params = params[0]\n\n for (const socket_id of this.namespaces[ns].events[name].sockets)\n {\n const socket = this.namespaces[ns].clients.get(socket_id)\n\n if (!socket) continue\n\n socket.send(\n this.dataPack.encode({\n notification: name,\n params,\n })\n )\n }\n })\n\n return {\n protected: () => this._makeProtectedEvent(name, ns),\n public: () => this._makePublicEvent(name, ns),\n }\n }\n\n /**\n * Returns a requested namespace object\n * @method\n * @param {String} name - namespace identifier\n * @throws {TypeError}\n * @return {Object} - namespace object\n */\n of(name: string)\n {\n if (!this.namespaces[name]) this._generateNamespace(name)\n\n const self = this\n\n return {\n // self.register convenience method\n register(\n fn_name: string,\n fn: (params: IRPCMethodParams) => void\n ): IMethod\n {\n if (arguments.length !== 2)\n throw new Error(\"must provide exactly two arguments\")\n\n if (typeof fn_name !== \"string\")\n throw new Error(\"name must be a string\")\n\n if (typeof fn !== \"function\")\n throw new Error(\"handler must be a function\")\n\n return self.register(fn_name, fn, name)\n },\n\n // self.event convenience method\n event(ev_name: string): IEvent\n {\n if (arguments.length !== 1)\n throw new Error(\"must provide exactly one argument\")\n\n if (typeof ev_name !== \"string\")\n throw new Error(\"name must be a string\")\n\n return self.event(ev_name, name)\n },\n\n // self.eventList convenience method\n get eventList()\n {\n return Object.keys(self.namespaces[name].events)\n },\n\n /**\n * Emits a specified event to this namespace.\n * @inner\n * @method\n * @param {String} event - event name\n * @param {Array} params - event parameters\n * @return {Undefined}\n */\n emit(event: string, ...params: Array)\n {\n const socket_ids = [...self.namespaces[name].clients.keys()]\n\n for (let i = 0, id; (id = socket_ids[i]); ++i)\n {\n self.namespaces[name].clients.get(id).send(\n self.dataPack.encode({\n notification: event,\n params: params || [],\n })\n )\n }\n },\n\n /**\n * Returns a name of this namespace.\n * @inner\n * @method\n * @kind constant\n * @return {String}\n */\n get name()\n {\n return name\n },\n\n /**\n * Returns a hash of websocket objects connected to this namespace.\n * @inner\n * @method\n * @return {Object}\n */\n connected()\n {\n const socket_ids = [...self.namespaces[name].clients.keys()]\n\n return socket_ids.reduce(\n (acc, curr) => ({\n ...acc,\n [curr]: self.namespaces[name].clients.get(curr),\n }),\n {}\n )\n },\n\n /**\n * Returns a list of client unique identifiers connected to this namespace.\n * @inner\n * @method\n * @return {Array}\n */\n clients()\n {\n return self.namespaces[name]\n },\n }\n }\n\n /**\n * Lists all created events in a given namespace. Defaults to \"/\".\n * @method\n * @param {String} ns - namespaces identifier\n * @readonly\n * @return {Array} - returns a list of created events\n */\n eventList(ns = \"/\")\n {\n if (!this.namespaces[ns]) return []\n\n return Object.keys(this.namespaces[ns].events)\n }\n\n /**\n * Creates a JSON-RPC 2.0 compliant error\n * @method\n * @param {Number} code - indicates the error type that occurred\n * @param {String} message - provides a short description of the error\n * @param {String|Object} data - details containing additional information about the error\n * @return {Object}\n */\n createError(code: number, message: string, data: string | object)\n {\n return {\n code: code,\n message: message,\n data: data || null,\n }\n }\n\n /**\n * Closes the server and terminates all clients.\n * @method\n * @return {Promise}\n */\n close()\n {\n return new Promise((resolve, reject) =>\n {\n try\n {\n this.wss.close()\n this.emit(\"close\")\n resolve()\n }\n catch (error)\n {\n reject(error)\n }\n })\n }\n\n /**\n * Handles all WebSocket JSON RPC 2.0 requests.\n * @private\n * @param {Object} socket - ws socket instance\n * @param {String} ns - namespaces identifier\n * @return {Undefined}\n */\n private _handleRPC(socket: IClientWebSocket, ns = \"/\")\n {\n socket.on(\"message\", async (data: any) =>\n {\n const msg_options: Parameters[1] = {}\n\n if (data instanceof ArrayBuffer)\n {\n msg_options.binary = true\n\n data = Buffer.from(data).toString()\n }\n\n if (socket.readyState !== 1) return // TODO: should have debug logs here\n\n let parsedData: any\n\n try\n {\n parsedData = this.dataPack.decode(data as string)\n }\n catch (error)\n {\n return socket.send(\n this.dataPack.encode({\n jsonrpc: \"2.0\",\n error: createError(-32700, error.toString()),\n id: null,\n }),\n msg_options\n )\n }\n\n if (Array.isArray(parsedData))\n {\n if (!parsedData.length)\n return socket.send(\n this.dataPack.encode({\n jsonrpc: \"2.0\",\n error: createError(-32600, \"Invalid array\"),\n id: null,\n }),\n msg_options\n )\n\n const responses = []\n\n for (const message of parsedData)\n {\n const response = await this._runMethod(message, socket._id, ns)\n\n if (!response) continue\n\n responses.push(response)\n }\n\n if (!responses.length) return\n\n return socket.send(this.dataPack.encode(responses), msg_options)\n }\n\n const response = await this._runMethod(parsedData, socket._id, ns)\n\n if (!response) return\n\n return socket.send(this.dataPack.encode(response), msg_options)\n })\n }\n\n /**\n * Runs a defined RPC method.\n * @private\n * @param {Object} message - a message received\n * @param {Object} socket_id - user's socket id\n * @param {String} ns - namespaces identifier\n * @return {Object|undefined}\n */\n private async _runMethod(message: any, socket_id: string, ns = \"/\")\n {\n if (typeof message !== \"object\" || message === null)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600),\n id: null,\n }\n\n if (message.jsonrpc !== \"2.0\")\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600, \"Invalid JSON RPC version\"),\n id: message.id || null,\n }\n\n if (!message.method)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32602, \"Method not specified\"),\n id: message.id || null,\n }\n\n if (typeof message.method !== \"string\")\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600, \"Invalid method name\"),\n id: message.id || null,\n }\n\n if (message.params && typeof message.params === \"string\")\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600),\n id: message.id || null,\n }\n\n if (message.method === \"rpc.on\")\n {\n if (!message.params)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32000),\n id: message.id || null,\n }\n\n const results: IRPCMethodParams = {}\n\n const event_names = Object.keys(this.namespaces[ns].events)\n\n for (const name of message.params)\n {\n const index = event_names.indexOf(name)\n const namespace = this.namespaces[ns]\n\n if (index === -1)\n {\n results[name] = \"provided event invalid\"\n continue\n }\n\n // reject request if event is protected and if client is not authenticated\n if (\n namespace.events[event_names[index]].protected === true &&\n namespace.clients.get(socket_id)[\"_authenticated\"] === false\n )\n {\n return {\n jsonrpc: \"2.0\",\n error: createError(-32606),\n id: message.id || null,\n }\n }\n\n const socket_index =\n namespace.events[event_names[index]].sockets.indexOf(socket_id)\n if (socket_index >= 0)\n {\n results[name] = \"socket has already been subscribed to event\"\n continue\n }\n namespace.events[event_names[index]].sockets.push(socket_id)\n\n results[name] = \"ok\"\n }\n\n return {\n jsonrpc: \"2.0\",\n result: results,\n id: message.id || null,\n }\n }\n else if (message.method === \"rpc.off\")\n {\n if (!message.params)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32000),\n id: message.id || null,\n }\n\n const results: IRPCResult = {}\n\n for (const name of message.params)\n {\n if (!this.namespaces[ns].events[name])\n {\n results[name] = \"provided event invalid\"\n continue\n }\n\n const index =\n this.namespaces[ns].events[name].sockets.indexOf(socket_id)\n\n if (index === -1)\n {\n results[name] = \"not subscribed\"\n continue\n }\n\n this.namespaces[ns].events[name].sockets.splice(index, 1)\n results[name] = \"ok\"\n }\n\n return {\n jsonrpc: \"2.0\",\n result: results,\n id: message.id || null,\n }\n }\n else if (message.method === \"rpc.login\")\n {\n if (!message.params)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32604),\n id: message.id || null,\n }\n }\n\n if (!this.namespaces[ns].rpc_methods[message.method])\n {\n return {\n jsonrpc: \"2.0\",\n error: createError(-32601),\n id: message.id || null,\n }\n }\n\n let response = null\n\n // reject request if method is protected and if client is not authenticated\n if (\n this.namespaces[ns].rpc_methods[message.method].protected === true &&\n this.namespaces[ns].clients.get(socket_id)[\"_authenticated\"] === false\n )\n {\n return {\n jsonrpc: \"2.0\",\n error: createError(-32605),\n id: message.id || null,\n }\n }\n\n try\n {\n response = await this.namespaces[ns].rpc_methods[message.method].fn(\n message.params,\n socket_id\n )\n }\n catch (error)\n {\n if (!message.id) return\n\n if (error instanceof Error)\n return {\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: error.name,\n data: error.message,\n },\n id: message.id,\n }\n\n return {\n jsonrpc: \"2.0\",\n error: error,\n id: message.id,\n }\n }\n\n // client sent a notification, so we won't need a reply\n if (!message.id) return\n\n // if login middleware returned true, set connection as authenticated\n if (message.method === \"rpc.login\" && response === true)\n {\n const s = this.namespaces[ns].clients.get(socket_id)\n s[\"_authenticated\"] = true\n this.namespaces[ns].clients.set(socket_id, s)\n }\n\n return {\n jsonrpc: \"2.0\",\n result: response,\n id: message.id,\n }\n }\n\n /**\n * Generate a new namespace store.\n * Also preregister some special namespace methods.\n * @private\n * @param {String} name - namespaces identifier\n * @return {undefined}\n */\n private _generateNamespace(name: string)\n {\n this.namespaces[name] = {\n rpc_methods: {\n __listMethods: {\n fn: () => Object.keys(this.namespaces[name].rpc_methods),\n protected: false,\n },\n },\n clients: new Map(),\n events: {},\n }\n }\n}\n\nconst RPC_ERRORS = new Map([\n [-32000, \"Event not provided\"],\n [-32600, \"Invalid Request\"],\n [-32601, \"Method not found\"],\n [-32602, \"Invalid params\"],\n [-32603, \"Internal error\"],\n [-32604, \"Params not found\"],\n [-32605, \"Method forbidden\"],\n [-32606, \"Event forbidden\"],\n [-32700, \"Parse error\"],\n])\n\n/**\n * Creates a JSON-RPC 2.0-compliant error.\n * @param {Number} code - error code\n * @param {String} details - error details\n * @return {Object}\n */\nexport function createError(code: number, details?: string)\n{\n const error: IRPCError = {\n code: code,\n message: RPC_ERRORS.get(code) || \"Internal Server Error\",\n }\n\n if (details) error[\"data\"] = details\n\n return error\n}\n","\"use strict\"\n\nimport { WebSocket } from \"./lib/client/websocket.js\"\nimport { CommonClient } from \"./lib/client.js\"\nimport {\n NodeWebSocketTypeOptions,\n IWSClientAdditionalOptions,\n ICommonWebSocketFactory,\n} from \"./lib/client/client.types.js\"\n\nexport class Client extends CommonClient\n{\n constructor(\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n ...rest_options\n }: IWSClientAdditionalOptions & NodeWebSocketTypeOptions = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number | string\n )\n {\n super(\n WebSocket as ICommonWebSocketFactory,\n address,\n {\n autoconnect,\n reconnect,\n reconnect_interval,\n max_reconnects,\n ...rest_options,\n },\n generate_request_id\n )\n }\n}\n\nexport * from \"./lib/client.js\"\nexport * from \"./lib/client/websocket.js\"\nexport * from \"./lib/client/client.types.js\"\nexport * from \"./lib/server.js\"\nexport * from \"./lib/utils.js\"\n"]} \ No newline at end of file diff --git a/dist/index.d.mts b/dist/index.d.mts index 19c0b1b..46d543e 100644 --- a/dist/index.d.mts +++ b/dist/index.d.mts @@ -42,7 +42,7 @@ interface IQueueElement { timeout?: ReturnType; } interface IQueue { - [x: number]: IQueueElement; + [x: number | string]: IQueueElement; } interface IWSRequestParams { [x: string]: any; @@ -80,7 +80,7 @@ declare class CommonClient extends EventEmitter { reconnect?: boolean; reconnect_interval?: number; max_reconnects?: number; - }, generate_request_id?: (method: string, params: object | Array) => number, dataPack?: DataPack); + }, generate_request_id?: (method: string, params: object | Array) => number | string, dataPack?: DataPack); /** * Connects to a defined server if not connected already. * @method @@ -409,7 +409,7 @@ declare class Server extends EventEmitter { declare function createError(code: number, details?: string): IRPCError; declare class Client extends CommonClient { - constructor(address?: string, { autoconnect, reconnect, reconnect_interval, max_reconnects, ...rest_options }?: IWSClientAdditionalOptions & NodeWebSocketTypeOptions, generate_request_id?: (method: string, params: object | Array) => number); + constructor(address?: string, { autoconnect, reconnect, reconnect_interval, max_reconnects, ...rest_options }?: IWSClientAdditionalOptions & NodeWebSocketTypeOptions, generate_request_id?: (method: string, params: object | Array) => number | string); } export { type BrowserWebSocketType, Client, CommonClient, type DataPack, DefaultDataPack, type ICommonWebSocket, type ICommonWebSocketFactory, type IQueue, type IWSClientAdditionalOptions, type IWSRequestParams, type NodeWebSocketType, type NodeWebSocketTypeOptions, Server, WebSocket$1 as WebSocket, createError }; diff --git a/dist/index.d.ts b/dist/index.d.ts index 19c0b1b..46d543e 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -42,7 +42,7 @@ interface IQueueElement { timeout?: ReturnType; } interface IQueue { - [x: number]: IQueueElement; + [x: number | string]: IQueueElement; } interface IWSRequestParams { [x: string]: any; @@ -80,7 +80,7 @@ declare class CommonClient extends EventEmitter { reconnect?: boolean; reconnect_interval?: number; max_reconnects?: number; - }, generate_request_id?: (method: string, params: object | Array) => number, dataPack?: DataPack); + }, generate_request_id?: (method: string, params: object | Array) => number | string, dataPack?: DataPack); /** * Connects to a defined server if not connected already. * @method @@ -409,7 +409,7 @@ declare class Server extends EventEmitter { declare function createError(code: number, details?: string): IRPCError; declare class Client extends CommonClient { - constructor(address?: string, { autoconnect, reconnect, reconnect_interval, max_reconnects, ...rest_options }?: IWSClientAdditionalOptions & NodeWebSocketTypeOptions, generate_request_id?: (method: string, params: object | Array) => number); + constructor(address?: string, { autoconnect, reconnect, reconnect_interval, max_reconnects, ...rest_options }?: IWSClientAdditionalOptions & NodeWebSocketTypeOptions, generate_request_id?: (method: string, params: object | Array) => number | string); } export { type BrowserWebSocketType, Client, CommonClient, type DataPack, DefaultDataPack, type ICommonWebSocket, type ICommonWebSocketFactory, type IQueue, type IWSClientAdditionalOptions, type IWSRequestParams, type NodeWebSocketType, type NodeWebSocketTypeOptions, Server, WebSocket$1 as WebSocket, createError }; diff --git a/dist/index.mjs b/dist/index.mjs index d127eed..2761e62 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -66,7 +66,7 @@ var CommonClient = class extends EventEmitter { this.max_reconnects = max_reconnects; this.rest_options = rest_options; this.current_reconnects = 0; - this.generate_request_id = generate_request_id || (() => ++this.rpc_id); + this.generate_request_id = generate_request_id || (() => Number(this.rpc_id) + 1); if (!dataPack) this.dataPack = new DefaultDataPack(); else this.dataPack = dataPack; if (this.autoconnect) diff --git a/dist/index.mjs.map b/dist/index.mjs.map index 6e99d14..ecb5f0e 100644 --- a/dist/index.mjs.map +++ b/dist/index.mjs.map @@ -1 +1 @@ -{"version":3,"sources":["../src/lib/client/websocket.ts","../src/lib/client.ts","../src/lib/utils.ts","../src/lib/server.ts","../src/index.ts"],"names":["EventEmitter","response"],"mappings":";AAIA,OAAO,mBAAmB;AAWnB,SAAS,UACZ,SACA,SAEJ;AACI,SAAO,IAAI,cAAc,SAAS,OAAO;AAC7C;;;ACZA,SAAS,oBAAoB;;;ACCtB,IAAM,kBAAN,MACP;AAAA,EACI,OAAO,OACP;AACI,WAAO,KAAK,UAAU,KAAK;AAAA,EAC/B;AAAA,EAEA,OAAO,OACP;AACI,WAAO,KAAK,MAAM,KAAK;AAAA,EAC3B;AACJ;;;ADeO,IAAM,eAAN,cAA2B,aAClC;AAAA,EACY;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAIA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYR,YACI,kBACA,UAAU,uBACV;AAAA,IACI,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,GAAG;AAAA,EACP,IAAI,CAAC,GACL,qBAIA,UAEJ;AACI,UAAM;AAEN,SAAK,mBAAmB;AAExB,SAAK,QAAQ,CAAC;AACd,SAAK,SAAS;AAEd,SAAK,UAAU;AACf,SAAK,cAAc;AACnB,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,SAAK,qBAAqB;AAC1B,SAAK,qBAAqB;AAC1B,SAAK,iBAAiB;AACtB,SAAK,eAAe;AACpB,SAAK,qBAAqB;AAC1B,SAAK,sBAAsB,wBAAwB,MAAM,EAAE,KAAK;AAEhE,QAAI,CAAC,SAAU,MAAK,WAAW,IAAI,gBAAgB;AAAA,QAC9C,MAAK,WAAW;AAErB,QAAI,KAAK;AACL,WAAK,SAAS,KAAK,SAAS;AAAA,QACxB,aAAa,KAAK;AAAA,QAClB,WAAW,KAAK;AAAA,QAChB,oBAAoB,KAAK;AAAA,QACzB,gBAAgB,KAAK;AAAA,QACrB,GAAG,KAAK;AAAA,MACZ,CAAC;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UACA;AACI,QAAI,KAAK,OAAQ;AAEjB,SAAK,SAAS,KAAK,SAAS;AAAA,MACxB,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,MAChB,oBAAoB,KAAK;AAAA,MACzB,gBAAgB,KAAK;AAAA,MACrB,GAAG,KAAK;AAAA,IACZ,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,KACI,QACA,QACA,SACA,SAEJ;AACI,QAAI,CAAC,WAAW,aAAa,OAAO,SACpC;AACI,gBAAU;AACV,gBAAU;AAAA,IACd;AAEA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAC7B;AACI,UAAI,CAAC,KAAK,MAAO,QAAO,OAAO,IAAI,MAAM,kBAAkB,CAAC;AAE5D,YAAM,SAAS,KAAK,oBAAoB,QAAQ,MAAM;AAEtD,YAAM,UAAU;AAAA,QACZ,SAAS;AAAA,QACT;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,IAAI;AAAA,MACR;AAEA,WAAK,OAAO,KAAK,KAAK,SAAS,OAAO,OAAO,GAAG,SAAS,CAAC,UAC1D;AACI,YAAI,MAAO,QAAO,OAAO,KAAK;AAE9B,aAAK,MAAM,MAAM,IAAI,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE;AAElD,YAAI,SACJ;AACI,eAAK,MAAM,MAAM,EAAE,UAAU,WAAW,MACxC;AACI,mBAAO,KAAK,MAAM,MAAM;AACxB,mBAAO,IAAI,MAAM,eAAe,CAAC;AAAA,UACrC,GAAG,OAAO;AAAA,QACd;AAAA,MACJ,CAAC;AAAA,IACL,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAM,QACZ;AACI,UAAM,OAAO,MAAM,KAAK,KAAK,aAAa,MAAM;AAEhD,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,uBAAuB;AAElD,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cACN;AACI,WAAO,MAAM,KAAK,KAAK,eAAe;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,QAAgB,QACvB;AACI,WAAO,IAAI,QAAc,CAAC,SAAS,WACnC;AACI,UAAI,CAAC,KAAK,MAAO,QAAO,OAAO,IAAI,MAAM,kBAAkB,CAAC;AAE5D,YAAM,UAAU;AAAA,QACZ,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACJ;AAEA,WAAK,OAAO,KAAK,KAAK,SAAS,OAAO,OAAO,GAAG,CAAC,UACjD;AACI,YAAI,MAAO,QAAO,OAAO,KAAK;AAE9B,gBAAQ;AAAA,MACZ,CAAC;AAAA,IACL,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,UAAU,OAChB;AACI,QAAI,OAAO,UAAU,SAAU,SAAQ,CAAC,KAAK;AAE7C,UAAM,SAAS,MAAM,KAAK,KAAK,UAAU,KAAK;AAE9C,QAAI,OAAO,UAAU,YAAY,OAAO,KAAK,MAAM;AAC/C,YAAM,IAAI;AAAA,QACN,qCAAqC,QAAQ,aAAa,OAAO,KAAK;AAAA,MAC1E;AAEJ,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAY,OAClB;AACI,QAAI,OAAO,UAAU,SAAU,SAAQ,CAAC,KAAK;AAE7C,UAAM,SAAS,MAAM,KAAK,KAAK,WAAW,KAAK;AAE/C,QAAI,OAAO,UAAU,YAAY,OAAO,KAAK,MAAM;AAC/C,YAAM,IAAI,MAAM,8CAA8C,MAAM;AAExE,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,MAAe,MACrB;AACI,SAAK,OAAO,MAAM,QAAQ,KAAM,IAAI;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,WACjB;AACI,SAAK,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAAqB,UACrB;AACI,SAAK,qBAAqB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,gBACjB;AACI,SAAK,iBAAiB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,SACJ,SACA,SAEJ;AACI,iBAAa,KAAK,kBAAkB;AACpC,SAAK,SAAS,KAAK,iBAAiB,SAAS,OAAO;AAEpD,SAAK,OAAO,iBAAiB,QAAQ,MACrC;AACI,WAAK,QAAQ;AACb,WAAK,KAAK,MAAM;AAChB,WAAK,qBAAqB;AAAA,IAC9B,CAAC;AAED,SAAK,OAAO,iBAAiB,WAAW,CAAC,EAAE,MAAM,QAAQ,MACzD;AACI,UAAI,mBAAmB;AACnB,kBAAU,OAAO,KAAK,OAAO,EAAE,SAAS;AAE5C,UACA;AACI,kBAAU,KAAK,SAAS,OAAO,OAAO;AAAA,MAC1C,SACO,OACP;AACI;AAAA,MACJ;AAGA,UAAI,QAAQ,gBAAgB,KAAK,UAAU,QAAQ,YAAY,EAAE,QACjE;AACI,YAAI,CAAC,OAAO,KAAK,QAAQ,MAAM,EAAE;AAC7B,iBAAO,KAAK,KAAK,QAAQ,YAAY;AAEzC,cAAM,OAAO,CAAC,QAAQ,YAAY;AAElC,YAAI,QAAQ,OAAO,gBAAgB,OAAQ,MAAK,KAAK,QAAQ,MAAM;AAAA;AAG/D,mBAAS,IAAI,GAAG,IAAI,QAAQ,OAAO,QAAQ;AACvC,iBAAK,KAAK,QAAQ,OAAO,CAAC,CAAC;AAInC,eAAO,QAAQ,QAAQ,EAAE,KAAK,MAC9B;AAEI,eAAK,KAAK,MAAM,MAAM,IAAI;AAAA,QAC9B,CAAC;AAAA,MACL;AAEA,UAAI,CAAC,KAAK,MAAM,QAAQ,EAAE,GAC1B;AAEI,YAAI,QAAQ,QACZ;AAEI,iBAAO,QAAQ,QAAQ,EAAE,KAAK,MAC9B;AACI,iBAAK,KAAK,QAAQ,QAAQ,SAAS,MAAM;AAAA,UAC7C,CAAC;AAAA,QACL;AAEA;AAAA,MACJ;AAGA,UAAI,WAAW,YAAY,YAAY;AACnC,aAAK,MAAM,QAAQ,EAAE,EAAE,QAAQ,CAAC;AAAA,UAC5B,IAAI;AAAA,YACA;AAAA,UAEJ;AAAA,QACJ;AAEJ,UAAI,KAAK,MAAM,QAAQ,EAAE,EAAE;AACvB,qBAAa,KAAK,MAAM,QAAQ,EAAE,EAAE,OAAO;AAE/C,UAAI,QAAQ,MAAO,MAAK,MAAM,QAAQ,EAAE,EAAE,QAAQ,CAAC,EAAE,QAAQ,KAAK;AAAA,UAC7D,MAAK,MAAM,QAAQ,EAAE,EAAE,QAAQ,CAAC,EAAE,QAAQ,MAAM;AAErD,aAAO,KAAK,MAAM,QAAQ,EAAE;AAAA,IAChC,CAAC;AAED,SAAK,OAAO,iBAAiB,SAAS,CAAC,UAAU,KAAK,KAAK,SAAS,KAAK,CAAC;AAE1E,SAAK,OAAO,iBAAiB,SAAS,CAAC,EAAE,MAAM,OAAO,MACtD;AACI,UAAI,KAAK;AAEL,mBAAW,MAAM,KAAK,KAAK,SAAS,MAAM,MAAM,GAAG,CAAC;AAExD,WAAK,QAAQ;AACb,WAAK,SAAS;AAEd,UAAI,SAAS,IAAM;AAEnB,WAAK;AAEL,UACI,KAAK,cACZ,KAAK,iBAAiB,KAAK,sBAC1B,KAAK,mBAAmB;AAElB,aAAK,qBAAqB;AAAA,UACtB,MAAM,KAAK,SAAS,SAAS,OAAO;AAAA,UACpC,KAAK;AAAA,QACT;AAAA,IACR,CAAC;AAAA,EACL;AACJ;;;AEtbA,SAAS,gBAAAA,qBAAoB;AAC7B,OAAO,SAAS;AAChB,SAAS,MAAM,cAAc;AAC7B,SAAwB,uBAAuB;AAuDxC,IAAM,SAAN,cAAqBA,cAC5B;AAAA,EACY;AAAA,EACA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YACI,SACA,UAEJ;AACI,UAAM;AAaN,SAAK,aAAa,CAAC;AAEnB,QAAI,CAAC,SAAU,MAAK,WAAW,IAAI,gBAAgB;AAAA,QAC9C,MAAK,WAAW;AAErB,SAAK,MAAM,IAAI,gBAAgB,OAAO;AAEtC,SAAK,IAAI,GAAG,aAAa,MAAM,KAAK,KAAK,WAAW,CAAC;AAErD,SAAK,IAAI,GAAG,cAAc,CAAC,QAA0B,YACrD;AACI,YAAM,IAAI,IAAI,MAAM,QAAQ,KAAK,IAAI;AACrC,YAAM,KAAK,EAAE;AAEb,UAAI,EAAE,MAAM,UAAW,QAAO,MAAM,EAAE,MAAM;AAAA,UACvC,QAAO,MAAM,OAAO;AAGzB,aAAO,gBAAgB,IAAI;AAG3B,aAAO,GAAG,SAAS,CAAC,UAAU,KAAK,KAAK,gBAAgB,QAAQ,KAAK,CAAC;AAGtE,aAAO,GAAG,SAAS,MACnB;AACI,aAAK,WAAW,EAAE,EAAE,QAAQ,OAAO,OAAO,GAAG;AAE7C,mBAAW,SAAS,OAAO,KAAK,KAAK,WAAW,EAAE,EAAE,MAAM,GAC1D;AACI,gBAAM,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO,KAAK,EAAE,QAAQ;AAAA,YACpD,OAAO;AAAA,UACX;AAEA,cAAI,SAAS;AACT,iBAAK,WAAW,EAAE,EAAE,OAAO,KAAK,EAAE,QAAQ,OAAO,OAAO,CAAC;AAAA,QACjE;AAEA,aAAK,KAAK,iBAAiB,MAAM;AAAA,MACrC,CAAC;AAED,UAAI,CAAC,KAAK,WAAW,EAAE,EAAG,MAAK,mBAAmB,EAAE;AAGpD,WAAK,WAAW,EAAE,EAAE,QAAQ,IAAI,OAAO,KAAK,MAAM;AAElD,WAAK,KAAK,cAAc,QAAQ,OAAO;AAEvC,aAAO,KAAK,WAAW,QAAQ,EAAE;AAAA,IACrC,CAAC;AAED,SAAK,IAAI,GAAG,SAAS,CAAC,UAAU,KAAK,KAAK,SAAS,KAAK,CAAC;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SACI,MACA,IACA,KAAK,KAET;AACI,QAAI,CAAC,KAAK,WAAW,EAAE,EAAG,MAAK,mBAAmB,EAAE;AAEpD,SAAK,WAAW,EAAE,EAAE,YAAY,IAAI,IAAI;AAAA,MACpC;AAAA,MACA,WAAW;AAAA,IACf;AAEA,WAAO;AAAA,MACH,WAAW,MAAM,KAAK,qBAAqB,MAAM,EAAE;AAAA,MACnD,QAAQ,MAAM,KAAK,kBAAkB,MAAM,EAAE;AAAA,IACjD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QACI,IACA,KAAK,KAET;AACI,SAAK,SAAS,aAAa,IAAI,EAAE;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,qBAAqB,MAAc,KAAK,KAChD;AACI,SAAK,WAAW,EAAE,EAAE,YAAY,IAAI,EAAE,YAAY;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,kBAAkB,MAAc,KAAK,KAC7C;AACI,SAAK,WAAW,EAAE,EAAE,YAAY,IAAI,EAAE,YAAY;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,oBAAoB,MAAc,KAAK,KAC/C;AACI,SAAK,WAAW,EAAE,EAAE,OAAO,IAAI,EAAE,YAAY;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,iBAAiB,MAAc,KAAK,KAC5C;AACI,SAAK,WAAW,EAAE,EAAE,OAAO,IAAI,EAAE,YAAY;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAe,IACf;AACI,UAAM,YAAY,KAAK,WAAW,EAAE;AAEpC,QAAI,WACJ;AACI,aAAO,UAAU;AACjB,aAAO,UAAU;AAEjB,iBAAW,UAAU,UAAU,QAAQ,OAAO,EAAG,QAAO,MAAM;AAE9D,aAAO,KAAK,WAAW,EAAE;AAAA,IAC7B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,MAAc,KAAK,KACzB;AACI,QAAI,CAAC,KAAK,WAAW,EAAE,EAAG,MAAK,mBAAmB,EAAE;AAAA,SAEpD;AACI,YAAM,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO,IAAI;AAE7C,UAAI,UAAU;AACV,cAAM,IAAI,MAAM,4BAA4B,EAAE,GAAG,IAAI,EAAE;AAAA,IAC/D;AAEA,SAAK,WAAW,EAAE,EAAE,OAAO,IAAI,IAAI;AAAA,MAC/B,SAAS,CAAC;AAAA,MACV,WAAW;AAAA,IACf;AAGA,SAAK,GAAG,MAAM,IAAI,WAClB;AAEI,UAAI,OAAO,WAAW,KAAK,OAAO,CAAC,aAAa;AAC5C,iBAAS,OAAO,CAAC;AAErB,iBAAW,aAAa,KAAK,WAAW,EAAE,EAAE,OAAO,IAAI,EAAE,SACzD;AACI,cAAM,SAAS,KAAK,WAAW,EAAE,EAAE,QAAQ,IAAI,SAAS;AAExD,YAAI,CAAC,OAAQ;AAEb,eAAO;AAAA,UACH,KAAK,SAAS,OAAO;AAAA,YACjB,cAAc;AAAA,YACd;AAAA,UACJ,CAAC;AAAA,QACL;AAAA,MACJ;AAAA,IACJ,CAAC;AAED,WAAO;AAAA,MACH,WAAW,MAAM,KAAK,oBAAoB,MAAM,EAAE;AAAA,MAClD,QAAQ,MAAM,KAAK,iBAAiB,MAAM,EAAE;AAAA,IAChD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,GAAG,MACH;AACI,QAAI,CAAC,KAAK,WAAW,IAAI,EAAG,MAAK,mBAAmB,IAAI;AAExD,UAAM,OAAO;AAEb,WAAO;AAAA;AAAA,MAEH,SACI,SACA,IAEJ;AACI,YAAI,UAAU,WAAW;AACrB,gBAAM,IAAI,MAAM,oCAAoC;AAExD,YAAI,OAAO,YAAY;AACnB,gBAAM,IAAI,MAAM,uBAAuB;AAE3C,YAAI,OAAO,OAAO;AACd,gBAAM,IAAI,MAAM,4BAA4B;AAEhD,eAAO,KAAK,SAAS,SAAS,IAAI,IAAI;AAAA,MAC1C;AAAA;AAAA,MAGA,MAAM,SACN;AACI,YAAI,UAAU,WAAW;AACrB,gBAAM,IAAI,MAAM,mCAAmC;AAEvD,YAAI,OAAO,YAAY;AACnB,gBAAM,IAAI,MAAM,uBAAuB;AAE3C,eAAO,KAAK,MAAM,SAAS,IAAI;AAAA,MACnC;AAAA;AAAA,MAGA,IAAI,YACJ;AACI,eAAO,OAAO,KAAK,KAAK,WAAW,IAAI,EAAE,MAAM;AAAA,MACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUA,KAAK,UAAkB,QACvB;AACI,cAAM,aAAa,CAAC,GAAG,KAAK,WAAW,IAAI,EAAE,QAAQ,KAAK,CAAC;AAE3D,iBAAS,IAAI,GAAG,IAAK,KAAK,WAAW,CAAC,GAAI,EAAE,GAC5C;AACI,eAAK,WAAW,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE;AAAA,YAClC,KAAK,SAAS,OAAO;AAAA,cACjB,cAAc;AAAA,cACd,QAAQ,UAAU,CAAC;AAAA,YACvB,CAAC;AAAA,UACL;AAAA,QACJ;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,IAAI,OACJ;AACI,eAAO;AAAA,MACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,YACA;AACI,cAAM,aAAa,CAAC,GAAG,KAAK,WAAW,IAAI,EAAE,QAAQ,KAAK,CAAC;AAE3D,eAAO,WAAW;AAAA,UACd,CAAC,KAAK,UAAU;AAAA,YACZ,GAAG;AAAA,YACH,CAAC,IAAI,GAAG,KAAK,WAAW,IAAI,EAAE,QAAQ,IAAI,IAAI;AAAA,UAClD;AAAA,UACA,CAAC;AAAA,QACL;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,UACA;AACI,eAAO,KAAK,WAAW,IAAI;AAAA,MAC/B;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,KAAK,KACf;AACI,QAAI,CAAC,KAAK,WAAW,EAAE,EAAG,QAAO,CAAC;AAElC,WAAO,OAAO,KAAK,KAAK,WAAW,EAAE,EAAE,MAAM;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,YAAY,MAAc,SAAiB,MAC3C;AACI,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA,MAAM,QAAQ;AAAA,IAClB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QACA;AACI,WAAO,IAAI,QAAc,CAAC,SAAS,WACnC;AACI,UACA;AACI,aAAK,IAAI,MAAM;AACf,aAAK,KAAK,OAAO;AACjB,gBAAQ;AAAA,MACZ,SACO,OACP;AACI,eAAO,KAAK;AAAA,MAChB;AAAA,IACJ,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,WAAW,QAA0B,KAAK,KAClD;AACI,WAAO,GAAG,WAAW,OAAO,SAC5B;AACI,YAAM,cAAoD,CAAC;AAE3D,UAAI,gBAAgB,aACpB;AACI,oBAAY,SAAS;AAErB,eAAO,OAAO,KAAK,IAAI,EAAE,SAAS;AAAA,MACtC;AAEA,UAAI,OAAO,eAAe,EAAG;AAE7B,UAAI;AAEJ,UACA;AACI,qBAAa,KAAK,SAAS,OAAO,IAAc;AAAA,MACpD,SACO,OACP;AACI,eAAO,OAAO;AAAA,UACV,KAAK,SAAS,OAAO;AAAA,YACjB,SAAS;AAAA,YACT,OAAO,YAAY,QAAQ,MAAM,SAAS,CAAC;AAAA,YAC3C,IAAI;AAAA,UACR,CAAC;AAAA,UACD;AAAA,QACJ;AAAA,MACJ;AAEA,UAAI,MAAM,QAAQ,UAAU,GAC5B;AACI,YAAI,CAAC,WAAW;AACZ,iBAAO,OAAO;AAAA,YACV,KAAK,SAAS,OAAO;AAAA,cACjB,SAAS;AAAA,cACT,OAAO,YAAY,QAAQ,eAAe;AAAA,cAC1C,IAAI;AAAA,YACR,CAAC;AAAA,YACD;AAAA,UACJ;AAEJ,cAAM,YAAY,CAAC;AAEnB,mBAAW,WAAW,YACtB;AACI,gBAAMC,YAAW,MAAM,KAAK,WAAW,SAAS,OAAO,KAAK,EAAE;AAE9D,cAAI,CAACA,UAAU;AAEf,oBAAU,KAAKA,SAAQ;AAAA,QAC3B;AAEA,YAAI,CAAC,UAAU,OAAQ;AAEvB,eAAO,OAAO,KAAK,KAAK,SAAS,OAAO,SAAS,GAAG,WAAW;AAAA,MACnE;AAEA,YAAM,WAAW,MAAM,KAAK,WAAW,YAAY,OAAO,KAAK,EAAE;AAEjE,UAAI,CAAC,SAAU;AAEf,aAAO,OAAO,KAAK,KAAK,SAAS,OAAO,QAAQ,GAAG,WAAW;AAAA,IAClE,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,WAAW,SAAc,WAAmB,KAAK,KAC/D;AACI,QAAI,OAAO,YAAY,YAAY,YAAY;AAC3C,aAAO;AAAA,QACH,SAAS;AAAA,QACT,OAAO,YAAY,MAAM;AAAA,QACzB,IAAI;AAAA,MACR;AAEJ,QAAI,QAAQ,YAAY;AACpB,aAAO;AAAA,QACH,SAAS;AAAA,QACT,OAAO,YAAY,QAAQ,0BAA0B;AAAA,QACrD,IAAI,QAAQ,MAAM;AAAA,MACtB;AAEJ,QAAI,CAAC,QAAQ;AACT,aAAO;AAAA,QACH,SAAS;AAAA,QACT,OAAO,YAAY,QAAQ,sBAAsB;AAAA,QACjD,IAAI,QAAQ,MAAM;AAAA,MACtB;AAEJ,QAAI,OAAO,QAAQ,WAAW;AAC1B,aAAO;AAAA,QACH,SAAS;AAAA,QACT,OAAO,YAAY,QAAQ,qBAAqB;AAAA,QAChD,IAAI,QAAQ,MAAM;AAAA,MACtB;AAEJ,QAAI,QAAQ,UAAU,OAAO,QAAQ,WAAW;AAC5C,aAAO;AAAA,QACH,SAAS;AAAA,QACT,OAAO,YAAY,MAAM;AAAA,QACzB,IAAI,QAAQ,MAAM;AAAA,MACtB;AAEJ,QAAI,QAAQ,WAAW,UACvB;AACI,UAAI,CAAC,QAAQ;AACT,eAAO;AAAA,UACH,SAAS;AAAA,UACT,OAAO,YAAY,KAAM;AAAA,UACzB,IAAI,QAAQ,MAAM;AAAA,QACtB;AAEJ,YAAM,UAA4B,CAAC;AAEnC,YAAM,cAAc,OAAO,KAAK,KAAK,WAAW,EAAE,EAAE,MAAM;AAE1D,iBAAW,QAAQ,QAAQ,QAC3B;AACI,cAAM,QAAQ,YAAY,QAAQ,IAAI;AACtC,cAAM,YAAY,KAAK,WAAW,EAAE;AAEpC,YAAI,UAAU,IACd;AACI,kBAAQ,IAAI,IAAI;AAChB;AAAA,QACJ;AAGA,YACI,UAAU,OAAO,YAAY,KAAK,CAAC,EAAE,cAAc,QAC7D,UAAU,QAAQ,IAAI,SAAS,EAAE,gBAAgB,MAAM,OAEjD;AACI,iBAAO;AAAA,YACH,SAAS;AAAA,YACT,OAAO,YAAY,MAAM;AAAA,YACzB,IAAI,QAAQ,MAAM;AAAA,UACtB;AAAA,QACJ;AAEA,cAAM,eACZ,UAAU,OAAO,YAAY,KAAK,CAAC,EAAE,QAAQ,QAAQ,SAAS;AACxD,YAAI,gBAAgB,GACpB;AACI,kBAAQ,IAAI,IAAI;AAChB;AAAA,QACJ;AACA,kBAAU,OAAO,YAAY,KAAK,CAAC,EAAE,QAAQ,KAAK,SAAS;AAE3D,gBAAQ,IAAI,IAAI;AAAA,MACpB;AAEA,aAAO;AAAA,QACH,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,IAAI,QAAQ,MAAM;AAAA,MACtB;AAAA,IACJ,WACS,QAAQ,WAAW,WAC5B;AACI,UAAI,CAAC,QAAQ;AACT,eAAO;AAAA,UACH,SAAS;AAAA,UACT,OAAO,YAAY,KAAM;AAAA,UACzB,IAAI,QAAQ,MAAM;AAAA,QACtB;AAEJ,YAAM,UAAsB,CAAC;AAE7B,iBAAW,QAAQ,QAAQ,QAC3B;AACI,YAAI,CAAC,KAAK,WAAW,EAAE,EAAE,OAAO,IAAI,GACpC;AACI,kBAAQ,IAAI,IAAI;AAChB;AAAA,QACJ;AAEA,cAAM,QACZ,KAAK,WAAW,EAAE,EAAE,OAAO,IAAI,EAAE,QAAQ,QAAQ,SAAS;AAEpD,YAAI,UAAU,IACd;AACI,kBAAQ,IAAI,IAAI;AAChB;AAAA,QACJ;AAEA,aAAK,WAAW,EAAE,EAAE,OAAO,IAAI,EAAE,QAAQ,OAAO,OAAO,CAAC;AACxD,gBAAQ,IAAI,IAAI;AAAA,MACpB;AAEA,aAAO;AAAA,QACH,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,IAAI,QAAQ,MAAM;AAAA,MACtB;AAAA,IACJ,WACS,QAAQ,WAAW,aAC5B;AACI,UAAI,CAAC,QAAQ;AACT,eAAO;AAAA,UACH,SAAS;AAAA,UACT,OAAO,YAAY,MAAM;AAAA,UACzB,IAAI,QAAQ,MAAM;AAAA,QACtB;AAAA,IACR;AAEA,QAAI,CAAC,KAAK,WAAW,EAAE,EAAE,YAAY,QAAQ,MAAM,GACnD;AACI,aAAO;AAAA,QACH,SAAS;AAAA,QACT,OAAO,YAAY,MAAM;AAAA,QACzB,IAAI,QAAQ,MAAM;AAAA,MACtB;AAAA,IACJ;AAEA,QAAI,WAAW;AAGf,QACI,KAAK,WAAW,EAAE,EAAE,YAAY,QAAQ,MAAM,EAAE,cAAc,QACpE,KAAK,WAAW,EAAE,EAAE,QAAQ,IAAI,SAAS,EAAE,gBAAgB,MAAM,OAE/D;AACI,aAAO;AAAA,QACH,SAAS;AAAA,QACT,OAAO,YAAY,MAAM;AAAA,QACzB,IAAI,QAAQ,MAAM;AAAA,MACtB;AAAA,IACJ;AAEA,QACA;AACI,iBAAW,MAAM,KAAK,WAAW,EAAE,EAAE,YAAY,QAAQ,MAAM,EAAE;AAAA,QAC7D,QAAQ;AAAA,QACR;AAAA,MACJ;AAAA,IACJ,SACO,OACP;AACI,UAAI,CAAC,QAAQ,GAAI;AAEjB,UAAI,iBAAiB;AACjB,eAAO;AAAA,UACH,SAAS;AAAA,UACT,OAAO;AAAA,YACH,MAAM;AAAA,YACN,SAAS,MAAM;AAAA,YACf,MAAM,MAAM;AAAA,UAChB;AAAA,UACA,IAAI,QAAQ;AAAA,QAChB;AAEJ,aAAO;AAAA,QACH,SAAS;AAAA,QACT;AAAA,QACA,IAAI,QAAQ;AAAA,MAChB;AAAA,IACJ;AAGA,QAAI,CAAC,QAAQ,GAAI;AAGjB,QAAI,QAAQ,WAAW,eAAe,aAAa,MACnD;AACI,YAAM,IAAI,KAAK,WAAW,EAAE,EAAE,QAAQ,IAAI,SAAS;AACnD,QAAE,gBAAgB,IAAI;AACtB,WAAK,WAAW,EAAE,EAAE,QAAQ,IAAI,WAAW,CAAC;AAAA,IAChD;AAEA,WAAO;AAAA,MACH,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,IAAI,QAAQ;AAAA,IAChB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,mBAAmB,MAC3B;AACI,SAAK,WAAW,IAAI,IAAI;AAAA,MACpB,aAAa;AAAA,QACT,eAAe;AAAA,UACX,IAAI,MAAM,OAAO,KAAK,KAAK,WAAW,IAAI,EAAE,WAAW;AAAA,UACvD,WAAW;AAAA,QACf;AAAA,MACJ;AAAA,MACA,SAAS,oBAAI,IAAI;AAAA,MACjB,QAAQ,CAAC;AAAA,IACb;AAAA,EACJ;AACJ;AAEA,IAAM,aAAa,oBAAI,IAAI;AAAA,EACvB,CAAC,OAAQ,oBAAoB;AAAA,EAC7B,CAAC,QAAQ,iBAAiB;AAAA,EAC1B,CAAC,QAAQ,kBAAkB;AAAA,EAC3B,CAAC,QAAQ,gBAAgB;AAAA,EACzB,CAAC,QAAQ,gBAAgB;AAAA,EACzB,CAAC,QAAQ,kBAAkB;AAAA,EAC3B,CAAC,QAAQ,kBAAkB;AAAA,EAC3B,CAAC,QAAQ,iBAAiB;AAAA,EAC1B,CAAC,QAAQ,aAAa;AAC1B,CAAC;AAQM,SAAS,YAAY,MAAc,SAC1C;AACI,QAAM,QAAmB;AAAA,IACrB;AAAA,IACA,SAAS,WAAW,IAAI,IAAI,KAAK;AAAA,EACrC;AAEA,MAAI,QAAS,OAAM,MAAM,IAAI;AAE7B,SAAO;AACX;;;ACrzBO,IAAM,SAAN,cAAqB,aAC5B;AAAA,EACI,YACI,UAAU,uBACV;AAAA,IACI,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,qBAAqB;AAAA,IACrB,iBAAiB;AAAA,IACjB,GAAG;AAAA,EACP,IAA2D,CAAC,GAC5D,qBAKJ;AACI;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,QACI;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG;AAAA,MACP;AAAA,MACA;AAAA,IACE;AAAA,EACJ;AACJ","sourcesContent":["/* A wrapper for the \"qaap/uws-bindings\" library. */\n\n\"use strict\"\n\nimport WebSocketImpl from \"ws\"\n\nimport { IWSClientAdditionalOptions } from \"./client.types.js\"\n\n/**\n * factory method for common WebSocket instance\n * @method\n * @param {String} address - url to a websocket server\n * @param {(Object)} options - websocket options\n * @return {Undefined}\n */\nexport function WebSocket(\n address: string,\n options: IWSClientAdditionalOptions & WebSocketImpl.ClientOptions\n)\n{\n return new WebSocketImpl(address, options)\n}\n","/**\n * \"Client\" wraps \"ws\" or a browser-implemented \"WebSocket\" library\n * according to the environment providing JSON RPC 2.0 support on top.\n * @module Client\n */\n\n\"use strict\"\n\nimport NodeWebSocket from \"ws\"\nimport { EventEmitter } from \"eventemitter3\"\nimport {\n ICommonWebSocket,\n IWSClientAdditionalOptions,\n NodeWebSocketType,\n ICommonWebSocketFactory,\n} from \"./client/client.types.js\"\n\nimport { DataPack, DefaultDataPack } from \"./utils.js\"\n\ninterface IQueueElement {\n promise: [\n Parameters[0]>[0],\n Parameters[0]>[1]\n ];\n timeout?: ReturnType;\n}\n\nexport interface IQueue {\n [x: number]: IQueueElement;\n}\n\nexport interface IWSRequestParams {\n [x: string]: any;\n [x: number]: any;\n}\n\nexport class CommonClient extends EventEmitter\n{\n private address: string\n private rpc_id: number\n private queue: IQueue\n private options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n private autoconnect: boolean\n private ready: boolean\n private reconnect: boolean\n private reconnect_timer_id: NodeJS.Timeout\n private reconnect_interval: number\n private max_reconnects: number\n private rest_options: IWSClientAdditionalOptions &\n NodeWebSocket.ClientOptions\n private current_reconnects: number\n private generate_request_id: (\n method: string,\n params: object | Array\n ) => number\n private socket: ICommonWebSocket\n private webSocketFactory: ICommonWebSocketFactory\n private dataPack: DataPack\n\n /**\n * Instantiate a Client class.\n * @constructor\n * @param {webSocketFactory} webSocketFactory - factory method for WebSocket\n * @param {String} address - url to a websocket server\n * @param {Object} options - ws options object with reconnect parameters\n * @param {Function} generate_request_id - custom generation request Id\n * @param {DataPack} dataPack - data pack contains encoder and decoder\n * @return {CommonClient}\n */\n constructor(\n webSocketFactory: ICommonWebSocketFactory,\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n ...rest_options\n } = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number,\n dataPack?: DataPack\n )\n {\n super()\n\n this.webSocketFactory = webSocketFactory\n\n this.queue = {}\n this.rpc_id = 0\n\n this.address = address\n this.autoconnect = autoconnect\n this.ready = false\n this.reconnect = reconnect\n this.reconnect_timer_id = undefined\n this.reconnect_interval = reconnect_interval\n this.max_reconnects = max_reconnects\n this.rest_options = rest_options\n this.current_reconnects = 0\n this.generate_request_id = generate_request_id || (() => ++this.rpc_id)\n\n if (!dataPack) this.dataPack = new DefaultDataPack()\n else this.dataPack = dataPack\n\n if (this.autoconnect)\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Connects to a defined server if not connected already.\n * @method\n * @return {Undefined}\n */\n connect()\n {\n if (this.socket) return\n\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Calls a registered RPC method on server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object|Array} params - optional method parameters\n * @param {Number} timeout - RPC reply timeout value\n * @param {Object} ws_opts - options passed to ws\n * @return {Promise}\n */\n call(\n method: string,\n params?: IWSRequestParams,\n timeout?: number,\n ws_opts?: Parameters[1]\n )\n {\n if (!ws_opts && \"object\" === typeof timeout)\n {\n ws_opts = timeout\n timeout = null\n }\n\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const rpc_id = this.generate_request_id(method, params)\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params: params || undefined,\n id: rpc_id,\n }\n\n this.socket.send(this.dataPack.encode(message), ws_opts, (error) =>\n {\n if (error) return reject(error)\n\n this.queue[rpc_id] = { promise: [resolve, reject] }\n\n if (timeout)\n {\n this.queue[rpc_id].timeout = setTimeout(() =>\n {\n delete this.queue[rpc_id]\n reject(new Error(\"reply timeout\"))\n }, timeout)\n }\n })\n })\n }\n\n /**\n * Logins with the other side of the connection.\n * @method\n * @param {Object} params - Login credentials object\n * @return {Promise}\n */\n async login(params: IWSRequestParams)\n {\n const resp = await this.call(\"rpc.login\", params)\n\n if (!resp) throw new Error(\"authentication failed\")\n\n return resp\n }\n\n /**\n * Fetches a list of client's methods registered on server.\n * @method\n * @return {Array}\n */\n async listMethods()\n {\n return await this.call(\"__listMethods\")\n }\n\n /**\n * Sends a JSON-RPC 2.0 notification to server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object} params - optional method parameters\n * @return {Promise}\n */\n notify(method: string, params?: IWSRequestParams)\n {\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params,\n }\n\n this.socket.send(this.dataPack.encode(message), (error) =>\n {\n if (error) return reject(error)\n\n resolve()\n })\n })\n }\n\n /**\n * Subscribes for a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async subscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.on\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\n \"Failed subscribing to an event '\" + event + \"' with: \" + result[event]\n )\n\n return result\n }\n\n /**\n * Unsubscribes from a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async unsubscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.off\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\"Failed unsubscribing from an event with: \" + result)\n\n return result\n }\n\n /**\n * Closes a WebSocket connection gracefully.\n * @method\n * @param {Number} code - socket close code\n * @param {String} data - optional data to be sent before closing\n * @return {Undefined}\n */\n close(code?: number, data?: string)\n {\n this.socket.close(code || 1000, data)\n }\n\n /**\n * Enable / disable automatic reconnection.\n * @method\n * @param {Boolean} reconnect - enable / disable reconnection\n * @return {Undefined}\n */\n setAutoReconnect(reconnect: boolean)\n {\n this.reconnect = reconnect\n }\n\n /**\n * Set the interval between reconnection attempts.\n * @method\n * @param {Number} interval - reconnection interval in milliseconds\n * @return {Undefined}\n */\n setReconnectInterval(interval: number)\n {\n this.reconnect_interval = interval\n }\n\n /**\n * Set the maximum number of reconnection attempts.\n * @method\n * @param {Number} max_reconnects - maximum reconnection attempts\n * @return {Undefined}\n */\n setMaxReconnects(max_reconnects: number)\n {\n this.max_reconnects = max_reconnects\n }\n\n /**\n * Connection/Message handler.\n * @method\n * @private\n * @param {String} address - WebSocket API address\n * @param {Object} options - ws options object\n * @return {Undefined}\n */\n private _connect(\n address: string,\n options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n )\n {\n clearTimeout(this.reconnect_timer_id)\n this.socket = this.webSocketFactory(address, options)\n\n this.socket.addEventListener(\"open\", () =>\n {\n this.ready = true\n this.emit(\"open\")\n this.current_reconnects = 0\n })\n\n this.socket.addEventListener(\"message\", ({ data: message }) =>\n {\n if (message instanceof ArrayBuffer)\n message = Buffer.from(message).toString()\n\n try\n {\n message = this.dataPack.decode(message)\n }\n catch (error)\n {\n return\n }\n\n // check if any listeners are attached and forward event\n if (message.notification && this.listeners(message.notification).length)\n {\n if (!Object.keys(message.params).length)\n return this.emit(message.notification)\n\n const args = [message.notification]\n\n if (message.params.constructor === Object) args.push(message.params)\n // using for-loop instead of unshift/spread because performance is better\n else\n for (let i = 0; i < message.params.length; i++)\n args.push(message.params[i])\n\n // run as microtask so that pending queue messages are resolved first\n // eslint-disable-next-line prefer-spread\n return Promise.resolve().then(() =>\n {\n // eslint-disable-next-line prefer-spread\n this.emit.apply(this, args)\n })\n }\n\n if (!this.queue[message.id])\n {\n // general JSON RPC 2.0 events\n if (message.method)\n {\n // run as microtask so that pending queue messages are resolved first\n return Promise.resolve().then(() =>\n {\n this.emit(message.method, message?.params)\n })\n }\n\n return\n }\n\n // reject early since server's response is invalid\n if (\"error\" in message === \"result\" in message)\n this.queue[message.id].promise[1](\n new Error(\n \"Server response malformed. Response must include either \\\"result\\\"\" +\n \" or \\\"error\\\", but not both.\"\n )\n )\n\n if (this.queue[message.id].timeout)\n clearTimeout(this.queue[message.id].timeout)\n\n if (message.error) this.queue[message.id].promise[1](message.error)\n else this.queue[message.id].promise[0](message.result)\n\n delete this.queue[message.id]\n })\n\n this.socket.addEventListener(\"error\", (error) => this.emit(\"error\", error))\n\n this.socket.addEventListener(\"close\", ({ code, reason }) =>\n {\n if (this.ready)\n // Delay close event until internal state is updated\n setTimeout(() => this.emit(\"close\", code, reason), 0)\n\n this.ready = false\n this.socket = undefined\n\n if (code === 1000) return\n\n this.current_reconnects++\n\n if (\n this.reconnect &&\n (this.max_reconnects > this.current_reconnects ||\n this.max_reconnects === 0)\n )\n this.reconnect_timer_id = setTimeout(\n () => this._connect(address, options),\n this.reconnect_interval\n )\n })\n }\n}\n","\"use strict\"\n\nexport interface DataPack<\n T,\n R extends string | ArrayBufferLike | Blob | ArrayBufferView\n> {\n encode(value: T): R;\n decode(value: R): T;\n}\n\nexport class DefaultDataPack implements DataPack\n{\n encode(value: Object): string\n {\n return JSON.stringify(value)\n }\n\n decode(value: string): Object\n {\n return JSON.parse(value)\n }\n}\n","/**\n * \"Server\" wraps the \"ws\" library providing JSON RPC 2.0 support on top.\n * @module Server\n */\n\n\"use strict\"\n\nimport { EventEmitter } from \"eventemitter3\"\nimport url from \"node:url\"\nimport { v1 as uuidv1 } from \"uuid\"\nimport NodeWebSocket, { WebSocketServer } from \"ws\"\n\nimport { DataPack, DefaultDataPack } from \"./utils.js\"\n\ninterface INamespaceEvent {\n [x: string]: {\n sockets: Array;\n protected: boolean;\n };\n}\n\ninterface IMethod {\n public: () => void;\n protected: () => void;\n}\n\ninterface IEvent {\n public: () => void;\n protected: () => void;\n}\n\ninterface IRPCError {\n code: number;\n message: string;\n data?: string;\n}\n\ninterface IRPCMethodParams {\n [x: string]: any;\n}\n\ninterface IRPCMethod {\n [x: string]: {\n fn: (params: IRPCMethodParams, socket_id: string) => any;\n protected: boolean;\n };\n}\n\ninterface INamespace {\n [x: string]: {\n rpc_methods: IRPCMethod;\n clients: Map;\n events: INamespaceEvent;\n };\n}\n\ninterface IClientWebSocket extends NodeWebSocket {\n _id: string;\n _authenticated: boolean;\n}\n\ninterface IRPCResult {\n [x: string]: string;\n}\n\nexport class Server extends EventEmitter\n{\n private namespaces: INamespace\n private dataPack: DataPack\n wss: InstanceType\n\n /**\n * Instantiate a Server class.\n * @constructor\n * @param {Object} options - ws constructor's parameters with rpc\n * @param {DataPack} dataPack - data pack contains encoder and decoder\n * @return {Server} - returns a new Server instance\n */\n constructor(\n options: NodeWebSocket.ServerOptions,\n dataPack?: DataPack\n )\n {\n super()\n\n /**\n * Stores all connected sockets with a universally unique identifier\n * in the appropriate namespace.\n * Stores all rpc methods to specific namespaces. \"/\" by default.\n * Stores all events as keys and subscribed users in array as value\n * @private\n * @name namespaces\n * @param {Object} namespaces.rpc_methods\n * @param {Map} namespaces.clients\n * @param {Object} namespaces.events\n */\n this.namespaces = {}\n\n if (!dataPack) this.dataPack = new DefaultDataPack()\n else this.dataPack = dataPack\n\n this.wss = new WebSocketServer(options)\n\n this.wss.on(\"listening\", () => this.emit(\"listening\"))\n\n this.wss.on(\"connection\", (socket: IClientWebSocket, request) =>\n {\n const u = url.parse(request.url, true)\n const ns = u.pathname\n\n if (u.query.socket_id) socket._id = u.query.socket_id as string\n else socket._id = uuidv1()\n\n // unauthenticated by default\n socket[\"_authenticated\"] = false\n\n // propagate socket errors\n socket.on(\"error\", (error) => this.emit(\"socket-error\", socket, error))\n\n // cleanup after the socket gets disconnected\n socket.on(\"close\", () =>\n {\n this.namespaces[ns].clients.delete(socket._id)\n\n for (const event of Object.keys(this.namespaces[ns].events))\n {\n const index = this.namespaces[ns].events[event].sockets.indexOf(\n socket._id\n )\n\n if (index >= 0)\n this.namespaces[ns].events[event].sockets.splice(index, 1)\n }\n\n this.emit(\"disconnection\", socket)\n })\n\n if (!this.namespaces[ns]) this._generateNamespace(ns)\n\n // store socket and method\n this.namespaces[ns].clients.set(socket._id, socket)\n\n this.emit(\"connection\", socket, request)\n\n return this._handleRPC(socket, ns)\n })\n\n this.wss.on(\"error\", (error) => this.emit(\"error\", error))\n }\n\n /**\n * Registers an RPC method.\n * @method\n * @param {String} name - method name\n * @param {Function} fn - a callee function\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Object} - returns an IMethod object\n */\n register(\n name: string,\n fn: (params: IRPCMethodParams, socket_id: string) => void,\n ns = \"/\"\n )\n {\n if (!this.namespaces[ns]) this._generateNamespace(ns)\n\n this.namespaces[ns].rpc_methods[name] = {\n fn: fn,\n protected: false,\n }\n\n return {\n protected: () => this._makeProtectedMethod(name, ns),\n public: () => this._makePublicMethod(name, ns),\n } as IMethod\n }\n\n /**\n * Sets an auth method.\n * @method\n * @param {Function} fn - an arbitrary auth method\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Undefined}\n */\n setAuth(\n fn: (params: IRPCMethodParams, socket_id: string) => Promise,\n ns = \"/\"\n )\n {\n this.register(\"rpc.login\", fn, ns)\n }\n\n /**\n * Marks an RPC method as protected.\n * @method\n * @param {String} name - method name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makeProtectedMethod(name: string, ns = \"/\")\n {\n this.namespaces[ns].rpc_methods[name].protected = true\n }\n\n /**\n * Marks an RPC method as public.\n * @method\n * @param {String} name - method name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makePublicMethod(name: string, ns = \"/\")\n {\n this.namespaces[ns].rpc_methods[name].protected = false\n }\n\n /**\n * Marks an event as protected.\n * @method\n * @param {String} name - event name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makeProtectedEvent(name: string, ns = \"/\")\n {\n this.namespaces[ns].events[name].protected = true\n }\n\n /**\n * Marks an event as public.\n * @method\n * @param {String} name - event name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makePublicEvent(name: string, ns = \"/\")\n {\n this.namespaces[ns].events[name].protected = false\n }\n\n /**\n * Removes a namespace and closes all connections\n * @method\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Undefined}\n */\n closeNamespace(ns: string)\n {\n const namespace = this.namespaces[ns]\n\n if (namespace)\n {\n delete namespace.rpc_methods\n delete namespace.events\n\n for (const socket of namespace.clients.values()) socket.close()\n\n delete this.namespaces[ns]\n }\n }\n\n /**\n * Creates a new event that can be emitted to clients.\n * @method\n * @param {String} name - event name\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Object} - returns an IEvent object\n */\n event(name: string, ns = \"/\"): IEvent\n {\n if (!this.namespaces[ns]) this._generateNamespace(ns)\n else\n {\n const index = this.namespaces[ns].events[name]\n\n if (index !== undefined)\n throw new Error(`Already registered event ${ns}${name}`)\n }\n\n this.namespaces[ns].events[name] = {\n sockets: [],\n protected: false,\n }\n\n // forward emitted event to subscribers\n this.on(name, (...params) =>\n {\n // flatten an object if no spreading is wanted\n if (params.length === 1 && params[0] instanceof Object)\n params = params[0]\n\n for (const socket_id of this.namespaces[ns].events[name].sockets)\n {\n const socket = this.namespaces[ns].clients.get(socket_id)\n\n if (!socket) continue\n\n socket.send(\n this.dataPack.encode({\n notification: name,\n params,\n })\n )\n }\n })\n\n return {\n protected: () => this._makeProtectedEvent(name, ns),\n public: () => this._makePublicEvent(name, ns),\n }\n }\n\n /**\n * Returns a requested namespace object\n * @method\n * @param {String} name - namespace identifier\n * @throws {TypeError}\n * @return {Object} - namespace object\n */\n of(name: string)\n {\n if (!this.namespaces[name]) this._generateNamespace(name)\n\n const self = this\n\n return {\n // self.register convenience method\n register(\n fn_name: string,\n fn: (params: IRPCMethodParams) => void\n ): IMethod\n {\n if (arguments.length !== 2)\n throw new Error(\"must provide exactly two arguments\")\n\n if (typeof fn_name !== \"string\")\n throw new Error(\"name must be a string\")\n\n if (typeof fn !== \"function\")\n throw new Error(\"handler must be a function\")\n\n return self.register(fn_name, fn, name)\n },\n\n // self.event convenience method\n event(ev_name: string): IEvent\n {\n if (arguments.length !== 1)\n throw new Error(\"must provide exactly one argument\")\n\n if (typeof ev_name !== \"string\")\n throw new Error(\"name must be a string\")\n\n return self.event(ev_name, name)\n },\n\n // self.eventList convenience method\n get eventList()\n {\n return Object.keys(self.namespaces[name].events)\n },\n\n /**\n * Emits a specified event to this namespace.\n * @inner\n * @method\n * @param {String} event - event name\n * @param {Array} params - event parameters\n * @return {Undefined}\n */\n emit(event: string, ...params: Array)\n {\n const socket_ids = [...self.namespaces[name].clients.keys()]\n\n for (let i = 0, id; (id = socket_ids[i]); ++i)\n {\n self.namespaces[name].clients.get(id).send(\n self.dataPack.encode({\n notification: event,\n params: params || [],\n })\n )\n }\n },\n\n /**\n * Returns a name of this namespace.\n * @inner\n * @method\n * @kind constant\n * @return {String}\n */\n get name()\n {\n return name\n },\n\n /**\n * Returns a hash of websocket objects connected to this namespace.\n * @inner\n * @method\n * @return {Object}\n */\n connected()\n {\n const socket_ids = [...self.namespaces[name].clients.keys()]\n\n return socket_ids.reduce(\n (acc, curr) => ({\n ...acc,\n [curr]: self.namespaces[name].clients.get(curr),\n }),\n {}\n )\n },\n\n /**\n * Returns a list of client unique identifiers connected to this namespace.\n * @inner\n * @method\n * @return {Array}\n */\n clients()\n {\n return self.namespaces[name]\n },\n }\n }\n\n /**\n * Lists all created events in a given namespace. Defaults to \"/\".\n * @method\n * @param {String} ns - namespaces identifier\n * @readonly\n * @return {Array} - returns a list of created events\n */\n eventList(ns = \"/\")\n {\n if (!this.namespaces[ns]) return []\n\n return Object.keys(this.namespaces[ns].events)\n }\n\n /**\n * Creates a JSON-RPC 2.0 compliant error\n * @method\n * @param {Number} code - indicates the error type that occurred\n * @param {String} message - provides a short description of the error\n * @param {String|Object} data - details containing additional information about the error\n * @return {Object}\n */\n createError(code: number, message: string, data: string | object)\n {\n return {\n code: code,\n message: message,\n data: data || null,\n }\n }\n\n /**\n * Closes the server and terminates all clients.\n * @method\n * @return {Promise}\n */\n close()\n {\n return new Promise((resolve, reject) =>\n {\n try\n {\n this.wss.close()\n this.emit(\"close\")\n resolve()\n }\n catch (error)\n {\n reject(error)\n }\n })\n }\n\n /**\n * Handles all WebSocket JSON RPC 2.0 requests.\n * @private\n * @param {Object} socket - ws socket instance\n * @param {String} ns - namespaces identifier\n * @return {Undefined}\n */\n private _handleRPC(socket: IClientWebSocket, ns = \"/\")\n {\n socket.on(\"message\", async (data: any) =>\n {\n const msg_options: Parameters[1] = {}\n\n if (data instanceof ArrayBuffer)\n {\n msg_options.binary = true\n\n data = Buffer.from(data).toString()\n }\n\n if (socket.readyState !== 1) return // TODO: should have debug logs here\n\n let parsedData: any\n\n try\n {\n parsedData = this.dataPack.decode(data as string)\n }\n catch (error)\n {\n return socket.send(\n this.dataPack.encode({\n jsonrpc: \"2.0\",\n error: createError(-32700, error.toString()),\n id: null,\n }),\n msg_options\n )\n }\n\n if (Array.isArray(parsedData))\n {\n if (!parsedData.length)\n return socket.send(\n this.dataPack.encode({\n jsonrpc: \"2.0\",\n error: createError(-32600, \"Invalid array\"),\n id: null,\n }),\n msg_options\n )\n\n const responses = []\n\n for (const message of parsedData)\n {\n const response = await this._runMethod(message, socket._id, ns)\n\n if (!response) continue\n\n responses.push(response)\n }\n\n if (!responses.length) return\n\n return socket.send(this.dataPack.encode(responses), msg_options)\n }\n\n const response = await this._runMethod(parsedData, socket._id, ns)\n\n if (!response) return\n\n return socket.send(this.dataPack.encode(response), msg_options)\n })\n }\n\n /**\n * Runs a defined RPC method.\n * @private\n * @param {Object} message - a message received\n * @param {Object} socket_id - user's socket id\n * @param {String} ns - namespaces identifier\n * @return {Object|undefined}\n */\n private async _runMethod(message: any, socket_id: string, ns = \"/\")\n {\n if (typeof message !== \"object\" || message === null)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600),\n id: null,\n }\n\n if (message.jsonrpc !== \"2.0\")\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600, \"Invalid JSON RPC version\"),\n id: message.id || null,\n }\n\n if (!message.method)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32602, \"Method not specified\"),\n id: message.id || null,\n }\n\n if (typeof message.method !== \"string\")\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600, \"Invalid method name\"),\n id: message.id || null,\n }\n\n if (message.params && typeof message.params === \"string\")\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600),\n id: message.id || null,\n }\n\n if (message.method === \"rpc.on\")\n {\n if (!message.params)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32000),\n id: message.id || null,\n }\n\n const results: IRPCMethodParams = {}\n\n const event_names = Object.keys(this.namespaces[ns].events)\n\n for (const name of message.params)\n {\n const index = event_names.indexOf(name)\n const namespace = this.namespaces[ns]\n\n if (index === -1)\n {\n results[name] = \"provided event invalid\"\n continue\n }\n\n // reject request if event is protected and if client is not authenticated\n if (\n namespace.events[event_names[index]].protected === true &&\n namespace.clients.get(socket_id)[\"_authenticated\"] === false\n )\n {\n return {\n jsonrpc: \"2.0\",\n error: createError(-32606),\n id: message.id || null,\n }\n }\n\n const socket_index =\n namespace.events[event_names[index]].sockets.indexOf(socket_id)\n if (socket_index >= 0)\n {\n results[name] = \"socket has already been subscribed to event\"\n continue\n }\n namespace.events[event_names[index]].sockets.push(socket_id)\n\n results[name] = \"ok\"\n }\n\n return {\n jsonrpc: \"2.0\",\n result: results,\n id: message.id || null,\n }\n }\n else if (message.method === \"rpc.off\")\n {\n if (!message.params)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32000),\n id: message.id || null,\n }\n\n const results: IRPCResult = {}\n\n for (const name of message.params)\n {\n if (!this.namespaces[ns].events[name])\n {\n results[name] = \"provided event invalid\"\n continue\n }\n\n const index =\n this.namespaces[ns].events[name].sockets.indexOf(socket_id)\n\n if (index === -1)\n {\n results[name] = \"not subscribed\"\n continue\n }\n\n this.namespaces[ns].events[name].sockets.splice(index, 1)\n results[name] = \"ok\"\n }\n\n return {\n jsonrpc: \"2.0\",\n result: results,\n id: message.id || null,\n }\n }\n else if (message.method === \"rpc.login\")\n {\n if (!message.params)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32604),\n id: message.id || null,\n }\n }\n\n if (!this.namespaces[ns].rpc_methods[message.method])\n {\n return {\n jsonrpc: \"2.0\",\n error: createError(-32601),\n id: message.id || null,\n }\n }\n\n let response = null\n\n // reject request if method is protected and if client is not authenticated\n if (\n this.namespaces[ns].rpc_methods[message.method].protected === true &&\n this.namespaces[ns].clients.get(socket_id)[\"_authenticated\"] === false\n )\n {\n return {\n jsonrpc: \"2.0\",\n error: createError(-32605),\n id: message.id || null,\n }\n }\n\n try\n {\n response = await this.namespaces[ns].rpc_methods[message.method].fn(\n message.params,\n socket_id\n )\n }\n catch (error)\n {\n if (!message.id) return\n\n if (error instanceof Error)\n return {\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: error.name,\n data: error.message,\n },\n id: message.id,\n }\n\n return {\n jsonrpc: \"2.0\",\n error: error,\n id: message.id,\n }\n }\n\n // client sent a notification, so we won't need a reply\n if (!message.id) return\n\n // if login middleware returned true, set connection as authenticated\n if (message.method === \"rpc.login\" && response === true)\n {\n const s = this.namespaces[ns].clients.get(socket_id)\n s[\"_authenticated\"] = true\n this.namespaces[ns].clients.set(socket_id, s)\n }\n\n return {\n jsonrpc: \"2.0\",\n result: response,\n id: message.id,\n }\n }\n\n /**\n * Generate a new namespace store.\n * Also preregister some special namespace methods.\n * @private\n * @param {String} name - namespaces identifier\n * @return {undefined}\n */\n private _generateNamespace(name: string)\n {\n this.namespaces[name] = {\n rpc_methods: {\n __listMethods: {\n fn: () => Object.keys(this.namespaces[name].rpc_methods),\n protected: false,\n },\n },\n clients: new Map(),\n events: {},\n }\n }\n}\n\nconst RPC_ERRORS = new Map([\n [-32000, \"Event not provided\"],\n [-32600, \"Invalid Request\"],\n [-32601, \"Method not found\"],\n [-32602, \"Invalid params\"],\n [-32603, \"Internal error\"],\n [-32604, \"Params not found\"],\n [-32605, \"Method forbidden\"],\n [-32606, \"Event forbidden\"],\n [-32700, \"Parse error\"],\n])\n\n/**\n * Creates a JSON-RPC 2.0-compliant error.\n * @param {Number} code - error code\n * @param {String} details - error details\n * @return {Object}\n */\nexport function createError(code: number, details?: string)\n{\n const error: IRPCError = {\n code: code,\n message: RPC_ERRORS.get(code) || \"Internal Server Error\",\n }\n\n if (details) error[\"data\"] = details\n\n return error\n}\n","\"use strict\"\n\nimport { WebSocket } from \"./lib/client/websocket.js\"\nimport { CommonClient } from \"./lib/client.js\"\nimport {\n NodeWebSocketTypeOptions,\n IWSClientAdditionalOptions,\n ICommonWebSocketFactory,\n} from \"./lib/client/client.types.js\"\n\nexport class Client extends CommonClient\n{\n constructor(\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n ...rest_options\n }: IWSClientAdditionalOptions & NodeWebSocketTypeOptions = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number\n )\n {\n super(\n WebSocket as ICommonWebSocketFactory,\n address,\n {\n autoconnect,\n reconnect,\n reconnect_interval,\n max_reconnects,\n ...rest_options,\n },\n generate_request_id\n )\n }\n}\n\nexport * from \"./lib/client.js\"\nexport * from \"./lib/client/websocket.js\"\nexport * from \"./lib/client/client.types.js\"\nexport * from \"./lib/server.js\"\nexport * from \"./lib/utils.js\""]} \ No newline at end of file +{"version":3,"sources":["../src/lib/client/websocket.ts","../src/lib/client.ts","../src/lib/utils.ts","../src/lib/server.ts","../src/index.ts"],"names":["EventEmitter","response"],"mappings":"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","sourcesContent":["/* A wrapper for the \"qaap/uws-bindings\" library. */\n\n\"use strict\"\n\nimport WebSocketImpl from \"ws\"\n\nimport { IWSClientAdditionalOptions } from \"./client.types.js\"\n\n/**\n * factory method for common WebSocket instance\n * @method\n * @param {String} address - url to a websocket server\n * @param {(Object)} options - websocket options\n * @return {Undefined}\n */\nexport function WebSocket(\n address: string,\n options: IWSClientAdditionalOptions & WebSocketImpl.ClientOptions\n)\n{\n return new WebSocketImpl(address, options)\n}\n","/**\n * \"Client\" wraps \"ws\" or a browser-implemented \"WebSocket\" library\n * according to the environment providing JSON RPC 2.0 support on top.\n * @module Client\n */\n\n\"use strict\"\n\nimport NodeWebSocket from \"ws\"\nimport { EventEmitter } from \"eventemitter3\"\nimport {\n ICommonWebSocket,\n IWSClientAdditionalOptions,\n NodeWebSocketType,\n ICommonWebSocketFactory,\n} from \"./client/client.types.js\"\n\nimport { DataPack, DefaultDataPack } from \"./utils.js\"\n\ninterface IQueueElement {\n promise: [\n Parameters[0]>[0],\n Parameters[0]>[1]\n ];\n timeout?: ReturnType;\n}\n\nexport interface IQueue {\n [x: number | string]: IQueueElement;\n}\n\nexport interface IWSRequestParams {\n [x: string]: any;\n [x: number]: any;\n}\n\nexport class CommonClient extends EventEmitter\n{\n private address: string\n private rpc_id: number | string\n private queue: IQueue\n private options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n private autoconnect: boolean\n private ready: boolean\n private reconnect: boolean\n private reconnect_timer_id: NodeJS.Timeout\n private reconnect_interval: number\n private max_reconnects: number\n private rest_options: IWSClientAdditionalOptions &\n NodeWebSocket.ClientOptions\n private current_reconnects: number\n private generate_request_id: (\n method: string,\n params: object | Array\n ) => number | string\n private socket: ICommonWebSocket\n private webSocketFactory: ICommonWebSocketFactory\n private dataPack: DataPack\n\n /**\n * Instantiate a Client class.\n * @constructor\n * @param {webSocketFactory} webSocketFactory - factory method for WebSocket\n * @param {String} address - url to a websocket server\n * @param {Object} options - ws options object with reconnect parameters\n * @param {Function} generate_request_id - custom generation request Id\n * @param {DataPack} dataPack - data pack contains encoder and decoder\n * @return {CommonClient}\n */\n constructor(\n webSocketFactory: ICommonWebSocketFactory,\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n ...rest_options\n } = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number | string,\n dataPack?: DataPack\n )\n {\n super()\n\n this.webSocketFactory = webSocketFactory\n\n this.queue = {}\n this.rpc_id = 0\n\n this.address = address\n this.autoconnect = autoconnect\n this.ready = false\n this.reconnect = reconnect\n this.reconnect_timer_id = undefined\n this.reconnect_interval = reconnect_interval\n this.max_reconnects = max_reconnects\n this.rest_options = rest_options\n this.current_reconnects = 0\n this.generate_request_id = generate_request_id || (() => Number(this.rpc_id) + 1)\n\n if (!dataPack) this.dataPack = new DefaultDataPack()\n else this.dataPack = dataPack\n\n if (this.autoconnect)\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Connects to a defined server if not connected already.\n * @method\n * @return {Undefined}\n */\n connect()\n {\n if (this.socket) return\n\n this._connect(this.address, {\n autoconnect: this.autoconnect,\n reconnect: this.reconnect,\n reconnect_interval: this.reconnect_interval,\n max_reconnects: this.max_reconnects,\n ...this.rest_options,\n })\n }\n\n /**\n * Calls a registered RPC method on server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object|Array} params - optional method parameters\n * @param {Number} timeout - RPC reply timeout value\n * @param {Object} ws_opts - options passed to ws\n * @return {Promise}\n */\n call(\n method: string,\n params?: IWSRequestParams,\n timeout?: number,\n ws_opts?: Parameters[1]\n )\n {\n if (!ws_opts && \"object\" === typeof timeout)\n {\n ws_opts = timeout\n timeout = null\n }\n\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const rpc_id = this.generate_request_id(method, params)\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params: params || undefined,\n id: rpc_id,\n }\n\n this.socket.send(this.dataPack.encode(message), ws_opts, (error) =>\n {\n if (error) return reject(error)\n\n this.queue[rpc_id] = { promise: [resolve, reject] }\n\n if (timeout)\n {\n this.queue[rpc_id].timeout = setTimeout(() =>\n {\n delete this.queue[rpc_id]\n reject(new Error(\"reply timeout\"))\n }, timeout)\n }\n })\n })\n }\n\n /**\n * Logins with the other side of the connection.\n * @method\n * @param {Object} params - Login credentials object\n * @return {Promise}\n */\n async login(params: IWSRequestParams)\n {\n const resp = await this.call(\"rpc.login\", params)\n\n if (!resp) throw new Error(\"authentication failed\")\n\n return resp\n }\n\n /**\n * Fetches a list of client's methods registered on server.\n * @method\n * @return {Array}\n */\n async listMethods()\n {\n return await this.call(\"__listMethods\")\n }\n\n /**\n * Sends a JSON-RPC 2.0 notification to server.\n * @method\n * @param {String} method - RPC method name\n * @param {Object} params - optional method parameters\n * @return {Promise}\n */\n notify(method: string, params?: IWSRequestParams)\n {\n return new Promise((resolve, reject) =>\n {\n if (!this.ready) return reject(new Error(\"socket not ready\"))\n\n const message = {\n jsonrpc: \"2.0\",\n method: method,\n params,\n }\n\n this.socket.send(this.dataPack.encode(message), (error) =>\n {\n if (error) return reject(error)\n\n resolve()\n })\n })\n }\n\n /**\n * Subscribes for a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async subscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.on\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\n \"Failed subscribing to an event '\" + event + \"' with: \" + result[event]\n )\n\n return result\n }\n\n /**\n * Unsubscribes from a defined event.\n * @method\n * @param {String|Array} event - event name\n * @return {Undefined}\n * @throws {Error}\n */\n async unsubscribe(event: string | Array)\n {\n if (typeof event === \"string\") event = [event]\n\n const result = await this.call(\"rpc.off\", event)\n\n if (typeof event === \"string\" && result[event] !== \"ok\")\n throw new Error(\"Failed unsubscribing from an event with: \" + result)\n\n return result\n }\n\n /**\n * Closes a WebSocket connection gracefully.\n * @method\n * @param {Number} code - socket close code\n * @param {String} data - optional data to be sent before closing\n * @return {Undefined}\n */\n close(code?: number, data?: string)\n {\n this.socket.close(code || 1000, data)\n }\n\n /**\n * Enable / disable automatic reconnection.\n * @method\n * @param {Boolean} reconnect - enable / disable reconnection\n * @return {Undefined}\n */\n setAutoReconnect(reconnect: boolean)\n {\n this.reconnect = reconnect\n }\n\n /**\n * Set the interval between reconnection attempts.\n * @method\n * @param {Number} interval - reconnection interval in milliseconds\n * @return {Undefined}\n */\n setReconnectInterval(interval: number)\n {\n this.reconnect_interval = interval\n }\n\n /**\n * Set the maximum number of reconnection attempts.\n * @method\n * @param {Number} max_reconnects - maximum reconnection attempts\n * @return {Undefined}\n */\n setMaxReconnects(max_reconnects: number)\n {\n this.max_reconnects = max_reconnects\n }\n\n /**\n * Connection/Message handler.\n * @method\n * @private\n * @param {String} address - WebSocket API address\n * @param {Object} options - ws options object\n * @return {Undefined}\n */\n private _connect(\n address: string,\n options: IWSClientAdditionalOptions & NodeWebSocket.ClientOptions\n )\n {\n clearTimeout(this.reconnect_timer_id)\n this.socket = this.webSocketFactory(address, options)\n\n this.socket.addEventListener(\"open\", () =>\n {\n this.ready = true\n this.emit(\"open\")\n this.current_reconnects = 0\n })\n\n this.socket.addEventListener(\"message\", ({ data: message }) =>\n {\n if (message instanceof ArrayBuffer)\n message = Buffer.from(message).toString()\n\n try\n {\n message = this.dataPack.decode(message)\n }\n catch (error)\n {\n return\n }\n\n // check if any listeners are attached and forward event\n if (message.notification && this.listeners(message.notification).length)\n {\n if (!Object.keys(message.params).length)\n return this.emit(message.notification)\n\n const args = [message.notification]\n\n if (message.params.constructor === Object) args.push(message.params)\n // using for-loop instead of unshift/spread because performance is better\n else\n for (let i = 0; i < message.params.length; i++)\n args.push(message.params[i])\n\n // run as microtask so that pending queue messages are resolved first\n // eslint-disable-next-line prefer-spread\n return Promise.resolve().then(() =>\n {\n // eslint-disable-next-line prefer-spread\n this.emit.apply(this, args)\n })\n }\n\n if (!this.queue[message.id])\n {\n // general JSON RPC 2.0 events\n if (message.method)\n {\n // run as microtask so that pending queue messages are resolved first\n return Promise.resolve().then(() =>\n {\n this.emit(message.method, message?.params)\n })\n }\n\n return\n }\n\n // reject early since server's response is invalid\n if (\"error\" in message === \"result\" in message)\n this.queue[message.id].promise[1](\n new Error(\n \"Server response malformed. Response must include either \\\"result\\\"\" +\n \" or \\\"error\\\", but not both.\"\n )\n )\n\n if (this.queue[message.id].timeout)\n clearTimeout(this.queue[message.id].timeout)\n\n if (message.error) this.queue[message.id].promise[1](message.error)\n else this.queue[message.id].promise[0](message.result)\n\n delete this.queue[message.id]\n })\n\n this.socket.addEventListener(\"error\", (error) => this.emit(\"error\", error))\n\n this.socket.addEventListener(\"close\", ({ code, reason }) =>\n {\n if (this.ready)\n // Delay close event until internal state is updated\n setTimeout(() => this.emit(\"close\", code, reason), 0)\n\n this.ready = false\n this.socket = undefined\n\n if (code === 1000) return\n\n this.current_reconnects++\n\n if (\n this.reconnect &&\n (this.max_reconnects > this.current_reconnects ||\n this.max_reconnects === 0)\n )\n this.reconnect_timer_id = setTimeout(\n () => this._connect(address, options),\n this.reconnect_interval\n )\n })\n }\n}\n","\"use strict\"\n\nexport interface DataPack<\n T,\n R extends string | ArrayBufferLike | Blob | ArrayBufferView\n> {\n encode(value: T): R;\n decode(value: R): T;\n}\n\nexport class DefaultDataPack implements DataPack\n{\n encode(value: Object): string\n {\n return JSON.stringify(value)\n }\n\n decode(value: string): Object\n {\n return JSON.parse(value)\n }\n}\n","/**\n * \"Server\" wraps the \"ws\" library providing JSON RPC 2.0 support on top.\n * @module Server\n */\n\n\"use strict\"\n\nimport { EventEmitter } from \"eventemitter3\"\nimport url from \"node:url\"\nimport { v1 as uuidv1 } from \"uuid\"\nimport NodeWebSocket, { WebSocketServer } from \"ws\"\n\nimport { DataPack, DefaultDataPack } from \"./utils.js\"\n\ninterface INamespaceEvent {\n [x: string]: {\n sockets: Array;\n protected: boolean;\n };\n}\n\ninterface IMethod {\n public: () => void;\n protected: () => void;\n}\n\ninterface IEvent {\n public: () => void;\n protected: () => void;\n}\n\ninterface IRPCError {\n code: number;\n message: string;\n data?: string;\n}\n\ninterface IRPCMethodParams {\n [x: string]: any;\n}\n\ninterface IRPCMethod {\n [x: string]: {\n fn: (params: IRPCMethodParams, socket_id: string) => any;\n protected: boolean;\n };\n}\n\ninterface INamespace {\n [x: string]: {\n rpc_methods: IRPCMethod;\n clients: Map;\n events: INamespaceEvent;\n };\n}\n\ninterface IClientWebSocket extends NodeWebSocket {\n _id: string;\n _authenticated: boolean;\n}\n\ninterface IRPCResult {\n [x: string]: string;\n}\n\nexport class Server extends EventEmitter\n{\n private namespaces: INamespace\n private dataPack: DataPack\n wss: InstanceType\n\n /**\n * Instantiate a Server class.\n * @constructor\n * @param {Object} options - ws constructor's parameters with rpc\n * @param {DataPack} dataPack - data pack contains encoder and decoder\n * @return {Server} - returns a new Server instance\n */\n constructor(\n options: NodeWebSocket.ServerOptions,\n dataPack?: DataPack\n )\n {\n super()\n\n /**\n * Stores all connected sockets with a universally unique identifier\n * in the appropriate namespace.\n * Stores all rpc methods to specific namespaces. \"/\" by default.\n * Stores all events as keys and subscribed users in array as value\n * @private\n * @name namespaces\n * @param {Object} namespaces.rpc_methods\n * @param {Map} namespaces.clients\n * @param {Object} namespaces.events\n */\n this.namespaces = {}\n\n if (!dataPack) this.dataPack = new DefaultDataPack()\n else this.dataPack = dataPack\n\n this.wss = new WebSocketServer(options)\n\n this.wss.on(\"listening\", () => this.emit(\"listening\"))\n\n this.wss.on(\"connection\", (socket: IClientWebSocket, request) =>\n {\n const u = url.parse(request.url, true)\n const ns = u.pathname\n\n if (u.query.socket_id) socket._id = u.query.socket_id as string\n else socket._id = uuidv1()\n\n // unauthenticated by default\n socket[\"_authenticated\"] = false\n\n // propagate socket errors\n socket.on(\"error\", (error) => this.emit(\"socket-error\", socket, error))\n\n // cleanup after the socket gets disconnected\n socket.on(\"close\", () =>\n {\n this.namespaces[ns].clients.delete(socket._id)\n\n for (const event of Object.keys(this.namespaces[ns].events))\n {\n const index = this.namespaces[ns].events[event].sockets.indexOf(\n socket._id\n )\n\n if (index >= 0)\n this.namespaces[ns].events[event].sockets.splice(index, 1)\n }\n\n this.emit(\"disconnection\", socket)\n })\n\n if (!this.namespaces[ns]) this._generateNamespace(ns)\n\n // store socket and method\n this.namespaces[ns].clients.set(socket._id, socket)\n\n this.emit(\"connection\", socket, request)\n\n return this._handleRPC(socket, ns)\n })\n\n this.wss.on(\"error\", (error) => this.emit(\"error\", error))\n }\n\n /**\n * Registers an RPC method.\n * @method\n * @param {String} name - method name\n * @param {Function} fn - a callee function\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Object} - returns an IMethod object\n */\n register(\n name: string,\n fn: (params: IRPCMethodParams, socket_id: string) => void,\n ns = \"/\"\n )\n {\n if (!this.namespaces[ns]) this._generateNamespace(ns)\n\n this.namespaces[ns].rpc_methods[name] = {\n fn: fn,\n protected: false,\n }\n\n return {\n protected: () => this._makeProtectedMethod(name, ns),\n public: () => this._makePublicMethod(name, ns),\n } as IMethod\n }\n\n /**\n * Sets an auth method.\n * @method\n * @param {Function} fn - an arbitrary auth method\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Undefined}\n */\n setAuth(\n fn: (params: IRPCMethodParams, socket_id: string) => Promise,\n ns = \"/\"\n )\n {\n this.register(\"rpc.login\", fn, ns)\n }\n\n /**\n * Marks an RPC method as protected.\n * @method\n * @param {String} name - method name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makeProtectedMethod(name: string, ns = \"/\")\n {\n this.namespaces[ns].rpc_methods[name].protected = true\n }\n\n /**\n * Marks an RPC method as public.\n * @method\n * @param {String} name - method name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makePublicMethod(name: string, ns = \"/\")\n {\n this.namespaces[ns].rpc_methods[name].protected = false\n }\n\n /**\n * Marks an event as protected.\n * @method\n * @param {String} name - event name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makeProtectedEvent(name: string, ns = \"/\")\n {\n this.namespaces[ns].events[name].protected = true\n }\n\n /**\n * Marks an event as public.\n * @method\n * @param {String} name - event name\n * @param {String} ns - namespace identifier\n * @return {Undefined}\n */\n private _makePublicEvent(name: string, ns = \"/\")\n {\n this.namespaces[ns].events[name].protected = false\n }\n\n /**\n * Removes a namespace and closes all connections\n * @method\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Undefined}\n */\n closeNamespace(ns: string)\n {\n const namespace = this.namespaces[ns]\n\n if (namespace)\n {\n delete namespace.rpc_methods\n delete namespace.events\n\n for (const socket of namespace.clients.values()) socket.close()\n\n delete this.namespaces[ns]\n }\n }\n\n /**\n * Creates a new event that can be emitted to clients.\n * @method\n * @param {String} name - event name\n * @param {String} ns - namespace identifier\n * @throws {TypeError}\n * @return {Object} - returns an IEvent object\n */\n event(name: string, ns = \"/\"): IEvent\n {\n if (!this.namespaces[ns]) this._generateNamespace(ns)\n else\n {\n const index = this.namespaces[ns].events[name]\n\n if (index !== undefined)\n throw new Error(`Already registered event ${ns}${name}`)\n }\n\n this.namespaces[ns].events[name] = {\n sockets: [],\n protected: false,\n }\n\n // forward emitted event to subscribers\n this.on(name, (...params) =>\n {\n // flatten an object if no spreading is wanted\n if (params.length === 1 && params[0] instanceof Object)\n params = params[0]\n\n for (const socket_id of this.namespaces[ns].events[name].sockets)\n {\n const socket = this.namespaces[ns].clients.get(socket_id)\n\n if (!socket) continue\n\n socket.send(\n this.dataPack.encode({\n notification: name,\n params,\n })\n )\n }\n })\n\n return {\n protected: () => this._makeProtectedEvent(name, ns),\n public: () => this._makePublicEvent(name, ns),\n }\n }\n\n /**\n * Returns a requested namespace object\n * @method\n * @param {String} name - namespace identifier\n * @throws {TypeError}\n * @return {Object} - namespace object\n */\n of(name: string)\n {\n if (!this.namespaces[name]) this._generateNamespace(name)\n\n const self = this\n\n return {\n // self.register convenience method\n register(\n fn_name: string,\n fn: (params: IRPCMethodParams) => void\n ): IMethod\n {\n if (arguments.length !== 2)\n throw new Error(\"must provide exactly two arguments\")\n\n if (typeof fn_name !== \"string\")\n throw new Error(\"name must be a string\")\n\n if (typeof fn !== \"function\")\n throw new Error(\"handler must be a function\")\n\n return self.register(fn_name, fn, name)\n },\n\n // self.event convenience method\n event(ev_name: string): IEvent\n {\n if (arguments.length !== 1)\n throw new Error(\"must provide exactly one argument\")\n\n if (typeof ev_name !== \"string\")\n throw new Error(\"name must be a string\")\n\n return self.event(ev_name, name)\n },\n\n // self.eventList convenience method\n get eventList()\n {\n return Object.keys(self.namespaces[name].events)\n },\n\n /**\n * Emits a specified event to this namespace.\n * @inner\n * @method\n * @param {String} event - event name\n * @param {Array} params - event parameters\n * @return {Undefined}\n */\n emit(event: string, ...params: Array)\n {\n const socket_ids = [...self.namespaces[name].clients.keys()]\n\n for (let i = 0, id; (id = socket_ids[i]); ++i)\n {\n self.namespaces[name].clients.get(id).send(\n self.dataPack.encode({\n notification: event,\n params: params || [],\n })\n )\n }\n },\n\n /**\n * Returns a name of this namespace.\n * @inner\n * @method\n * @kind constant\n * @return {String}\n */\n get name()\n {\n return name\n },\n\n /**\n * Returns a hash of websocket objects connected to this namespace.\n * @inner\n * @method\n * @return {Object}\n */\n connected()\n {\n const socket_ids = [...self.namespaces[name].clients.keys()]\n\n return socket_ids.reduce(\n (acc, curr) => ({\n ...acc,\n [curr]: self.namespaces[name].clients.get(curr),\n }),\n {}\n )\n },\n\n /**\n * Returns a list of client unique identifiers connected to this namespace.\n * @inner\n * @method\n * @return {Array}\n */\n clients()\n {\n return self.namespaces[name]\n },\n }\n }\n\n /**\n * Lists all created events in a given namespace. Defaults to \"/\".\n * @method\n * @param {String} ns - namespaces identifier\n * @readonly\n * @return {Array} - returns a list of created events\n */\n eventList(ns = \"/\")\n {\n if (!this.namespaces[ns]) return []\n\n return Object.keys(this.namespaces[ns].events)\n }\n\n /**\n * Creates a JSON-RPC 2.0 compliant error\n * @method\n * @param {Number} code - indicates the error type that occurred\n * @param {String} message - provides a short description of the error\n * @param {String|Object} data - details containing additional information about the error\n * @return {Object}\n */\n createError(code: number, message: string, data: string | object)\n {\n return {\n code: code,\n message: message,\n data: data || null,\n }\n }\n\n /**\n * Closes the server and terminates all clients.\n * @method\n * @return {Promise}\n */\n close()\n {\n return new Promise((resolve, reject) =>\n {\n try\n {\n this.wss.close()\n this.emit(\"close\")\n resolve()\n }\n catch (error)\n {\n reject(error)\n }\n })\n }\n\n /**\n * Handles all WebSocket JSON RPC 2.0 requests.\n * @private\n * @param {Object} socket - ws socket instance\n * @param {String} ns - namespaces identifier\n * @return {Undefined}\n */\n private _handleRPC(socket: IClientWebSocket, ns = \"/\")\n {\n socket.on(\"message\", async (data: any) =>\n {\n const msg_options: Parameters[1] = {}\n\n if (data instanceof ArrayBuffer)\n {\n msg_options.binary = true\n\n data = Buffer.from(data).toString()\n }\n\n if (socket.readyState !== 1) return // TODO: should have debug logs here\n\n let parsedData: any\n\n try\n {\n parsedData = this.dataPack.decode(data as string)\n }\n catch (error)\n {\n return socket.send(\n this.dataPack.encode({\n jsonrpc: \"2.0\",\n error: createError(-32700, error.toString()),\n id: null,\n }),\n msg_options\n )\n }\n\n if (Array.isArray(parsedData))\n {\n if (!parsedData.length)\n return socket.send(\n this.dataPack.encode({\n jsonrpc: \"2.0\",\n error: createError(-32600, \"Invalid array\"),\n id: null,\n }),\n msg_options\n )\n\n const responses = []\n\n for (const message of parsedData)\n {\n const response = await this._runMethod(message, socket._id, ns)\n\n if (!response) continue\n\n responses.push(response)\n }\n\n if (!responses.length) return\n\n return socket.send(this.dataPack.encode(responses), msg_options)\n }\n\n const response = await this._runMethod(parsedData, socket._id, ns)\n\n if (!response) return\n\n return socket.send(this.dataPack.encode(response), msg_options)\n })\n }\n\n /**\n * Runs a defined RPC method.\n * @private\n * @param {Object} message - a message received\n * @param {Object} socket_id - user's socket id\n * @param {String} ns - namespaces identifier\n * @return {Object|undefined}\n */\n private async _runMethod(message: any, socket_id: string, ns = \"/\")\n {\n if (typeof message !== \"object\" || message === null)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600),\n id: null,\n }\n\n if (message.jsonrpc !== \"2.0\")\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600, \"Invalid JSON RPC version\"),\n id: message.id || null,\n }\n\n if (!message.method)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32602, \"Method not specified\"),\n id: message.id || null,\n }\n\n if (typeof message.method !== \"string\")\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600, \"Invalid method name\"),\n id: message.id || null,\n }\n\n if (message.params && typeof message.params === \"string\")\n return {\n jsonrpc: \"2.0\",\n error: createError(-32600),\n id: message.id || null,\n }\n\n if (message.method === \"rpc.on\")\n {\n if (!message.params)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32000),\n id: message.id || null,\n }\n\n const results: IRPCMethodParams = {}\n\n const event_names = Object.keys(this.namespaces[ns].events)\n\n for (const name of message.params)\n {\n const index = event_names.indexOf(name)\n const namespace = this.namespaces[ns]\n\n if (index === -1)\n {\n results[name] = \"provided event invalid\"\n continue\n }\n\n // reject request if event is protected and if client is not authenticated\n if (\n namespace.events[event_names[index]].protected === true &&\n namespace.clients.get(socket_id)[\"_authenticated\"] === false\n )\n {\n return {\n jsonrpc: \"2.0\",\n error: createError(-32606),\n id: message.id || null,\n }\n }\n\n const socket_index =\n namespace.events[event_names[index]].sockets.indexOf(socket_id)\n if (socket_index >= 0)\n {\n results[name] = \"socket has already been subscribed to event\"\n continue\n }\n namespace.events[event_names[index]].sockets.push(socket_id)\n\n results[name] = \"ok\"\n }\n\n return {\n jsonrpc: \"2.0\",\n result: results,\n id: message.id || null,\n }\n }\n else if (message.method === \"rpc.off\")\n {\n if (!message.params)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32000),\n id: message.id || null,\n }\n\n const results: IRPCResult = {}\n\n for (const name of message.params)\n {\n if (!this.namespaces[ns].events[name])\n {\n results[name] = \"provided event invalid\"\n continue\n }\n\n const index =\n this.namespaces[ns].events[name].sockets.indexOf(socket_id)\n\n if (index === -1)\n {\n results[name] = \"not subscribed\"\n continue\n }\n\n this.namespaces[ns].events[name].sockets.splice(index, 1)\n results[name] = \"ok\"\n }\n\n return {\n jsonrpc: \"2.0\",\n result: results,\n id: message.id || null,\n }\n }\n else if (message.method === \"rpc.login\")\n {\n if (!message.params)\n return {\n jsonrpc: \"2.0\",\n error: createError(-32604),\n id: message.id || null,\n }\n }\n\n if (!this.namespaces[ns].rpc_methods[message.method])\n {\n return {\n jsonrpc: \"2.0\",\n error: createError(-32601),\n id: message.id || null,\n }\n }\n\n let response = null\n\n // reject request if method is protected and if client is not authenticated\n if (\n this.namespaces[ns].rpc_methods[message.method].protected === true &&\n this.namespaces[ns].clients.get(socket_id)[\"_authenticated\"] === false\n )\n {\n return {\n jsonrpc: \"2.0\",\n error: createError(-32605),\n id: message.id || null,\n }\n }\n\n try\n {\n response = await this.namespaces[ns].rpc_methods[message.method].fn(\n message.params,\n socket_id\n )\n }\n catch (error)\n {\n if (!message.id) return\n\n if (error instanceof Error)\n return {\n jsonrpc: \"2.0\",\n error: {\n code: -32000,\n message: error.name,\n data: error.message,\n },\n id: message.id,\n }\n\n return {\n jsonrpc: \"2.0\",\n error: error,\n id: message.id,\n }\n }\n\n // client sent a notification, so we won't need a reply\n if (!message.id) return\n\n // if login middleware returned true, set connection as authenticated\n if (message.method === \"rpc.login\" && response === true)\n {\n const s = this.namespaces[ns].clients.get(socket_id)\n s[\"_authenticated\"] = true\n this.namespaces[ns].clients.set(socket_id, s)\n }\n\n return {\n jsonrpc: \"2.0\",\n result: response,\n id: message.id,\n }\n }\n\n /**\n * Generate a new namespace store.\n * Also preregister some special namespace methods.\n * @private\n * @param {String} name - namespaces identifier\n * @return {undefined}\n */\n private _generateNamespace(name: string)\n {\n this.namespaces[name] = {\n rpc_methods: {\n __listMethods: {\n fn: () => Object.keys(this.namespaces[name].rpc_methods),\n protected: false,\n },\n },\n clients: new Map(),\n events: {},\n }\n }\n}\n\nconst RPC_ERRORS = new Map([\n [-32000, \"Event not provided\"],\n [-32600, \"Invalid Request\"],\n [-32601, \"Method not found\"],\n [-32602, \"Invalid params\"],\n [-32603, \"Internal error\"],\n [-32604, \"Params not found\"],\n [-32605, \"Method forbidden\"],\n [-32606, \"Event forbidden\"],\n [-32700, \"Parse error\"],\n])\n\n/**\n * Creates a JSON-RPC 2.0-compliant error.\n * @param {Number} code - error code\n * @param {String} details - error details\n * @return {Object}\n */\nexport function createError(code: number, details?: string)\n{\n const error: IRPCError = {\n code: code,\n message: RPC_ERRORS.get(code) || \"Internal Server Error\",\n }\n\n if (details) error[\"data\"] = details\n\n return error\n}\n","\"use strict\"\n\nimport { WebSocket } from \"./lib/client/websocket.js\"\nimport { CommonClient } from \"./lib/client.js\"\nimport {\n NodeWebSocketTypeOptions,\n IWSClientAdditionalOptions,\n ICommonWebSocketFactory,\n} from \"./lib/client/client.types.js\"\n\nexport class Client extends CommonClient\n{\n constructor(\n address = \"ws://localhost:8080\",\n {\n autoconnect = true,\n reconnect = true,\n reconnect_interval = 1000,\n max_reconnects = 5,\n ...rest_options\n }: IWSClientAdditionalOptions & NodeWebSocketTypeOptions = {},\n generate_request_id?: (\n method: string,\n params: object | Array\n ) => number | string\n )\n {\n super(\n WebSocket as ICommonWebSocketFactory,\n address,\n {\n autoconnect,\n reconnect,\n reconnect_interval,\n max_reconnects,\n ...rest_options,\n },\n generate_request_id\n )\n }\n}\n\nexport * from \"./lib/client.js\"\nexport * from \"./lib/client/websocket.js\"\nexport * from \"./lib/client/client.types.js\"\nexport * from \"./lib/server.js\"\nexport * from \"./lib/utils.js\"\n"]} \ No newline at end of file