insite-ws 2.0.16 → 2.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,50 +1,42 @@
1
1
  import EventEmitter from "eventemitter3";
2
2
  export type Options = {
3
- url?: string;
3
+ url?: string | URL;
4
4
  name?: string;
5
5
  protocols?: string[];
6
6
  immediately?: boolean;
7
- autoReconnect?: boolean;
7
+ reconnectAfter?: null | number;
8
8
  on?: Record<string, (...args: any[]) => void>;
9
+ quiet?: boolean;
9
10
  };
10
11
  type RequestListener = (...args: any[]) => any | Promise<any>;
11
12
  export declare class InSiteWebSocket extends EventEmitter {
12
- constructor(url: string, options?: Options);
13
+ #private;
14
+ constructor(options?: Options);
13
15
  readonly isWebSocket = true;
14
16
  readonly isWebSocketServer = false;
15
17
  readonly isWebSocketServerClient = false;
16
- url: string;
18
+ url: string | URL | undefined;
17
19
  readonly name: string;
18
20
  protocols?: string[] | undefined;
19
- autoReconnect: boolean;
21
+ reconnectAfter: number | null;
22
+ isUsed: boolean;
23
+ isAutoReconnecting: boolean;
20
24
  send?(data: ArrayBufferLike | ArrayBufferView | Blob | string): void;
21
25
  webSocket: null | WebSocket;
22
- private defib;
23
26
  get isConnecting(): boolean | null;
24
27
  get isOpen(): boolean | null;
25
28
  get isClosing(): boolean | null;
26
- get isClosed(): boolean | null;
27
- private openResolve?;
28
- private openReject?;
29
- private handleWebSocketOpen;
30
- private handleWebSocketMessage;
31
- private handleWebSocketError;
32
- private reconnectTimeout?;
33
- private handleWebSocketClose;
34
- open(options?: Options): Promise<unknown>;
35
- connect: (options?: Options) => Promise<unknown>;
36
- close(code?: number, reason?: string): Promise<unknown>;
37
- disconnect: (code?: number, reason?: string) => Promise<unknown>;
38
- private queue;
39
- private releaseQueue;
29
+ get isClosed(): boolean;
30
+ open(options?: Pick<Options, "protocols" | "url">): Promise<void>;
31
+ connect: (options?: Pick<Options, "protocols" | "url">) => Promise<void>;
32
+ close(code?: number, reason?: string): Promise<void>;
33
+ disconnect: (code?: number, reason?: string) => Promise<void>;
40
34
  sendMessage(...args: unknown[]): void;
41
35
  sendRequest(...args: unknown[]): this | Promise<unknown>;
42
- private requestListeners;
43
36
  addRequestListener(kind: string, listener: RequestListener): this;
44
37
  onRequest: (kind: string, listener: RequestListener) => this;
45
38
  removeRequestListener(kind: string): this;
46
39
  offRequest: (kind: string) => this;
47
- private handleRequest;
48
40
  static defib(this: InSiteWebSocket): void;
49
41
  }
50
42
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocket.d.ts","sourceRoot":"","sources":["../../src/client/WebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAWzC,MAAM,MAAM,OAAO,GAAG;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC;CAC9C,CAAC;AAEF,KAAK,eAAe,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAG9D,qBAAa,eAAgB,SAAQ,YAAY;gBACpC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,OAAY;IA+B9C,QAAQ,CAAC,WAAW,QAAQ;IAC5B,QAAQ,CAAC,iBAAiB,SAAS;IACnC,QAAQ,CAAC,uBAAuB,SAAS;IAEzC,GAAG,SAAC;IAEJ,QAAQ,CAAC,IAAI,SAAC;IAEd,SAAS,CAAC,uBAAC;IAEX,aAAa,UAAC;IAEd,IAAI,CAAC,CAAC,IAAI,EAAE,eAAe,GAAG,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI;IAEpE,SAAS,EAAE,IAAI,GAAG,SAAS,CAAQ;IAEnC,OAAO,CAAC,KAAK,CAAqE;IAElF,IAAI,YAAY,mBAEf;IAED,IAAI,MAAM,mBAET;IAED,IAAI,SAAS,mBAEZ;IAED,IAAI,QAAQ,mBAEX;IAED,OAAO,CAAC,WAAW,CAAC,CAA4B;IAChD,OAAO,CAAC,UAAU,CAAC,CAA6B;IAEhD,OAAO,CAAC,mBAAmB,CAUzB;IAEF,OAAO,CAAC,sBAAsB,CAgB5B;IAEF,OAAO,CAAC,oBAAoB,CAY1B;IAEF,OAAO,CAAC,gBAAgB,CAAC,CAAS;IAElC,OAAO,CAAC,oBAAoB,CAgB1B;IAEI,IAAI,CAAC,OAAO,GAAE,OAAY;IAmChC,OAAO,aAnCa,OAAO,sBAmCP;IAEpB,KAAK,CAAC,IAAI,SAAO,EAAE,MAAM,SAAW;IAcpC,UAAU,uDAAc;IAExB,OAAO,CAAC,KAAK,CAAgB;IAE7B,OAAO,CAAC,YAAY,CAOlB;IAEF,WAAW,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IAc9B,WAAW,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IA2B9B,OAAO,CAAC,gBAAgB,CAAsC;IAE9D,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe;IAM1D,SAAS,SANgB,MAAM,YAAY,eAAe,UAMtB;IAEpC,qBAAqB,CAAC,IAAI,EAAE,MAAM;IAMlC,UAAU,SANkB,MAAM,UAMM;IAExC,OAAO,CAAC,aAAa,CAoBnB;IAGF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe;CAWlC"}
1
+ {"version":3,"file":"WebSocket.d.ts","sourceRoot":"","sources":["../../src/client/WebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAYzC,MAAM,MAAM,OAAO,GAAG;IACrB,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,eAAe,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAG9D,qBAAa,eAAgB,SAAQ,YAAY;;gBACpC,OAAO,GAAE,OAAY;IAkCjC,QAAQ,CAAC,WAAW,QAAQ;IAC5B,QAAQ,CAAC,iBAAiB,SAAS;IACnC,QAAQ,CAAC,uBAAuB,SAAS;IAEzC,GAAG,2BAAC;IAEJ,QAAQ,CAAC,IAAI,SAAC;IAEd,SAAS,CAAC,uBAAC;IAEX,cAAc,gBAAC;IAIf,MAAM,UAAS;IACf,kBAAkB,UAAS;IAE3B,IAAI,CAAC,CAAC,IAAI,EAAE,eAAe,GAAG,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI;IAEpE,SAAS,EAAE,IAAI,GAAG,SAAS,CAAQ;IAInC,IAAI,YAAY,mBAEf;IAED,IAAI,MAAM,mBAET;IAED,IAAI,SAAS,mBAEZ;IAED,IAAI,QAAQ,YAEX;IA2EK,IAAI,CAAC,OAAO,GAAE,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,KAAK,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+C3E,OAAO,aA/Ca,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,KAAK,CAAC,KAAQ,OAAO,CAAC,IAAI,CAAC,CA+CvD;IAEpB,KAAK,CAAC,IAAI,SAAO,EAAE,MAAM,SAAW;IAkBpC,UAAU,oDAAc;IAaxB,WAAW,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IAc9B,WAAW,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IA6B9B,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe;IAM1D,SAAS,SANgB,MAAM,YAAY,eAAe,UAMtB;IAEpC,qBAAqB,CAAC,IAAI,EAAE,MAAM;IAMlC,UAAU,SANkB,MAAM,UAMM;IAyBxC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,eAAe;CAWlC"}
@@ -1,2 +1,2 @@
1
- var f=Object.defineProperty;var k=(c,o,e)=>o in c?f(c,o,{enumerable:!0,configurable:!0,writable:!0,value:e}):c[o]=e;var t=(c,o,e)=>k(c,typeof o!="symbol"?o+"":o,e);import g from"eventemitter3";import{debounce as v,noop as p,uid as q}from"@nesvet/n";var u={request:"~r-q",response:"~r-s"};var R=2e3,E=0,b=new WeakMap,S=class c extends g{constructor(e,s={}){super();t(this,"isWebSocket",!0);t(this,"isWebSocketServer",!1);t(this,"isWebSocketServerClient",!1);t(this,"url");t(this,"name");t(this,"protocols");t(this,"autoReconnect");t(this,"webSocket",null);t(this,"defib",v(c.defib,65e3));t(this,"openResolve");t(this,"openReject");t(this,"handleWebSocketOpen",()=>{this.openResolve(),this.openResolve=void 0,this.openReject=void 0,this.emit("open"),this.defib()});t(this,"handleWebSocketMessage",({data:e})=>{if(this.defib(),e)try{let[s,...n]=JSON.parse(e);this.emit("message",s,...n),this.emit(`message:${s}`,...n)}catch(s){this.handleWebSocketError(s)}else this.webSocket.send("")});t(this,"handleWebSocketError",e=>{e instanceof Event&&(e=void 0),this.openReject&&(this.openReject(e),this.openResolve=void 0,this.openReject=void 0),this.emit("error",e)});t(this,"reconnectTimeout");t(this,"handleWebSocketClose",e=>{process.env.NODE_ENV==="development"&&console.info(`WebSocket ${this.name} is closed with code ${e.code} and reason "${e.reason}"`),this.defib.clear(),this.emit("close",e),this.autoReconnect&&![1002,3500,4e3].includes(e.code)&&(process.env.NODE_ENV==="development"&&console.info(`WebSocket ${this.name} will try to reconnect in 2 sec\u2026`),this.reconnectTimeout=setTimeout(()=>this.open().catch(p),R))});t(this,"connect",this.open);t(this,"disconnect",this.close);t(this,"queue",[]);t(this,"releaseQueue",()=>{for(let e of this.queue)this.webSocket.send(e);this.queue.length=0});t(this,"requestListeners",new Map);t(this,"onRequest",this.addRequestListener);t(this,"offRequest",this.removeRequestListener);t(this,"handleRequest",async(e,s,...n)=>{let h=this.requestListeners.get(s),l,r=null;if(h)try{l=await h.apply(this,n)}catch(i){if(i instanceof Error){let{message:a,...d}=i;r={message:a,...d}}}else r={message:`Unknown request kind "${s}"`};this.sendMessage(`${u.response}-${e}`,r,l)});this.url=e;let{name:n=(E++).toString(),protocols:h,immediately:l=!0,autoReconnect:r=!0,on:i}=s;if(this.name=n,this.protocols=h,this.autoReconnect=!!r,this.on(`message:${u.request}`,this.handleRequest),i)for(let a in i)i[a]&&this.on(a,i[a]);this.url&&l&&this.open().catch(p)}get isConnecting(){return this.webSocket?this.webSocket.readyState===this.webSocket.CONNECTING:null}get isOpen(){return this.webSocket?this.webSocket.readyState===this.webSocket.OPEN:null}get isClosing(){return this.webSocket?this.webSocket.readyState===this.webSocket.CLOSING:null}get isClosed(){return this.webSocket?this.webSocket.readyState===this.webSocket.CLOSED:null}async open(e={}){return clearTimeout(this.reconnectTimeout),await this.close(4e3,"reopen"),e.url&&(this.url=e.url),e.protocols&&(this.protocols=e.protocols),this.webSocket&&b.get(this.webSocket)!==this.url&&this.emit("server-change"),new Promise((s,n)=>{this.openResolve=s,this.openReject=n,this.webSocket=new WebSocket(this.url,this.protocols),this.webSocket.addEventListener("open",this.handleWebSocketOpen),this.webSocket.addEventListener("message",this.handleWebSocketMessage),this.webSocket.addEventListener("error",this.handleWebSocketError),this.webSocket.addEventListener("close",this.handleWebSocketClose),this.send=this.webSocket.send.bind(this.webSocket),b.set(this.webSocket,this.url),this.emit("connecting")})}close(e=3500,s="manual"){return clearTimeout(this.reconnectTimeout),new Promise(n=>{this.isConnecting||this.isOpen?(this.webSocket.addEventListener("close",n),this.webSocket.close(e,s)):n(null)})}sendMessage(...e){let s=JSON.stringify(e);this.isOpen?this.webSocket.send(s):(this.queue.length||this.once("open",this.releaseQueue),this.queue.push(s))}sendRequest(...e){let s=q(),n=`message:${u.response}-${s}`;return typeof e.at(-1)=="function"?(this.once(n,e.splice(-1,1)[0]),this.sendMessage(u.request,s,...e),this):new Promise((h,l)=>{this.once(n,(r,i)=>{if(r){let{message:a,...d}=r;l(Object.assign(new Error(a),d))}else h(i)}),this.sendMessage(u.request,s,...e)})}addRequestListener(e,s){return this.requestListeners.set(e,s),this}removeRequestListener(e){return this.requestListeners.delete(e),this}static defib(){this.isOpen&&(process.env.NODE_ENV==="development"&&console.info(`WebSocket ${this.name} has no heartbeat - going offline`),this.webSocket.close())}};export{S as InSiteWebSocket};
1
+ var H=Object.defineProperty;var D=o=>{throw TypeError(o)};var Q=(o,r,e)=>r in o?H(o,r,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[r]=e;var c=(o,r,e)=>Q(o,typeof r!="symbol"?r+"":r,e),F=(o,r,e)=>r.has(o)||D("Cannot "+e);var n=(o,r,e)=>(F(o,r,"read from private field"),e?e.call(o):r.get(o)),a=(o,r,e)=>r.has(o)?D("Cannot add the same private member more than once"):r instanceof WeakSet?r.add(o):r.set(o,e),q=(o,r,e,t)=>(F(o,r,"write to private field"),t?t.call(o,e):r.set(o,e),e);import z from"eventemitter3";function m(){}function B(o,r=0,e={}){let{leading:t=!1,trailing:s=!0}=e,{maxWait:l=1/0}=e,i,f,u,d,p,P,x,N,_=async()=>{let w=Date.now();w>=u?(i=void 0,u=void 0,clearTimeout(f),typeof x=="function"&&await x(),h.resolve(N),h.promise.isResolved=!0,P=t):(clearTimeout(i),i=setTimeout(_,u-w))},I=Number.isFinite(l)?()=>{x===b&&(x=!1),b(),f=setTimeout(I,l)}:null;async function b(){return N=await o.apply(d,p)}t&&typeof t=="boolean"&&(t=b),P=t,s&&typeof s=="boolean"&&(s=b),x=s;let h=Object.assign(function(...w){return p=w,d=this,u=Date.now()+r,x=s,h.promise.isResolved&&(h.promise=Object.assign(new Promise(V=>{h.resolve=V,typeof P=="function"&&(P(),P=!1,x===b&&(x=!1)),i||(i=setTimeout(_,r),I&&(f=setTimeout(I,l)))}),{isResolved:!1})),h.promise},{callback:o,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:m,run:b,clear:async w=>{clearTimeout(i),i=void 0,clearTimeout(f),h.promise.isResolved=!0,h.resolve(w?await b():N)}});return h}B.noop=Object.assign(()=>{},{callback:m,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:m,run:m,clear:m});function U(o,r,e,t,s=!0){return Array.isArray(o)&&(o=o.length),typeof t!="string"&&(s=t??!0,t=e),(s?`${o}\xA0`:"")+U.raw(o,r,e,t)}U.raw=(o,r,e,t=e)=>{o=Math.abs(o);let s=o%10,l=o%100;return s===1&&l!==11?r:s>=2&&s<=4&&!(l>=12&&l<=15)?e:t};var R=new WeakMap,L=class extends Promise{constructor(e){let t,s;super((l,i)=>{t=l,s=i});c(this,"isPending",!0);c(this,"isFulfilled",!1);c(this,"isRejected",!1);c(this,"state","pending");c(this,"result");c(this,"resolve",e=>{if(this.isPending){this.isPending=!1,this.isFulfilled=!0,this.state="fulfilled",this.result=e;let t=R.get(this);t&&(t.resolve.call(this,e),R.delete(this))}});c(this,"reject",e=>{if(this.isPending){this.isPending=!1,this.isRejected=!0,this.state="rejected",this.result=e;let t=R.get(this);t&&(t.reject.call(this,e),R.delete(this))}});R.set(this,{resolve:t,reject:s}),e?.(this.resolve,this.reject)}};function G(o="",r=""){return`${o}${Date.now().toString(36)}${Math.round(Math.random()*Number.MAX_SAFE_INTEGER).toString(36)}${r}`}var y={request:"~r-q",response:"~r-s"};var Y=0,v,k,g,j,A,E,O,T,S,M,$,W,C=class C extends z{constructor(e={}){super();c(this,"isWebSocket",!0);c(this,"isWebSocketServer",!1);c(this,"isWebSocketServerClient",!1);c(this,"url");c(this,"name");c(this,"protocols");c(this,"reconnectAfter");a(this,v);c(this,"isUsed",!1);c(this,"isAutoReconnecting",!1);c(this,"webSocket",null);a(this,k,B(C.defib,65e3));a(this,g);a(this,j,()=>{n(this,g).resolve(),this.emit("open"),n(this,k).call(this)});a(this,A,({data:e})=>{if(n(this,k).call(this),e)try{let[t,...s]=JSON.parse(e);this.emit("message",t,...s),this.emit(`message:${t}`,...s)}catch(t){n(this,E).call(this,t)}else this.webSocket.send("")});a(this,E,e=>{e instanceof Event&&(e=void 0),n(this,g).isPending&&n(this,g).reject(e),this.emit("error",e)});a(this,O);a(this,T,e=>{process.env.NODE_ENV==="development"&&!n(this,v)&&console.info(`WebSocket ${this.name} is closed with code ${e.code} and reason "${e.reason}"`),n(this,k).clear();let t=this.webSocket;t.removeEventListener("open",n(this,j)),t.removeEventListener("message",n(this,A)),t.removeEventListener("error",n(this,E)),t.removeEventListener("close",n(this,T)),delete this.send,this.emit("close",e),this.webSocket=null,this.reconnectAfter&&![1002,3500,4e3].includes(e.code)&&(process.env.NODE_ENV==="development"&&!n(this,v)&&console.info(`WebSocket ${this.name} will try to reconnect in 2 sec\u2026`),q(this,O,setTimeout(()=>this.open().catch(m),this.reconnectAfter)))});c(this,"connect",this.open);c(this,"disconnect",this.close);a(this,S,[]);a(this,M,()=>{for(let e of n(this,S))this.webSocket.send(e);n(this,S).length=0});a(this,$,new Map);c(this,"onRequest",this.addRequestListener);c(this,"offRequest",this.removeRequestListener);a(this,W,async(e,t,...s)=>{let l=n(this,$).get(t),i,f=null;if(l)try{i=await l.apply(this,s)}catch(u){if(u instanceof Error){let{message:d,...p}=u;f={message:d,...p}}}else f={message:`Unknown request kind "${t}"`};this.sendMessage(`${y.response}-${e}`,f,i)});let{url:t,name:s=(Y++).toString(),protocols:l,immediately:i=!0,reconnectAfter:f=2e3,on:u,quiet:d=!1}=e;if(this.url=t,this.name=s,this.protocols=l,this.reconnectAfter=f,this.on(`message:${y.request}`,n(this,W)),u)for(let p in u)u[p]&&this.on(p,u[p]);q(this,v,d),this.url&&i&&this.open().catch(m)}get isConnecting(){return this.webSocket?this.webSocket.readyState===WebSocket.CONNECTING:null}get isOpen(){return this.webSocket?this.webSocket.readyState===WebSocket.OPEN:null}get isClosing(){return this.webSocket?this.webSocket.readyState===WebSocket.CLOSING:null}get isClosed(){return!this.webSocket||this.webSocket.readyState===WebSocket.CLOSED}async open(e={}){clearTimeout(n(this,O)),this.isUsed=!0,this.isAutoReconnecting=!!this.reconnectAfter,await this.close(4e3,"reopen");let t;return e.url&&this.url!==e.url&&(t=this.url,this.url=e.url),e.protocols&&(this.protocols=e.protocols),q(this,g,new L((s,l)=>{if(this.url){let i=new WebSocket(this.url,this.protocols);i.addEventListener("open",n(this,j)),i.addEventListener("message",n(this,A)),i.addEventListener("error",n(this,E)),i.addEventListener("close",n(this,T),{once:!0}),this.send=i.send.bind(i),this.webSocket=i,t&&this.emit("server-change",this.url,t),this.emit("connecting")}else this.webSocket=null,delete this.send,l(new Error("url prop is not set"))})),n(this,g)}close(e=3500,t="manual"){return clearTimeout(n(this,O)),t==="manual"&&(this.isAutoReconnecting=!1),new Promise(s=>{this.isConnecting||this.isOpen?(this.webSocket.addEventListener("close",()=>s(),{once:!0}),this.webSocket.close(e,t)):s()})}sendMessage(...e){let t=JSON.stringify(e);this.isOpen?this.webSocket.send(t):(n(this,S).length||this.once("open",n(this,M)),n(this,S).push(t))}sendRequest(...e){let t=G(),s=`message:${y.response}-${t}`;return typeof e.at(-1)=="function"?(this.once(s,e.splice(-1,1)[0]),this.sendMessage(y.request,t,...e),this):new Promise((l,i)=>{this.once(s,(f,u)=>{if(f){let{message:d,...p}=f;i(Object.assign(new Error(d),p))}else l(u)}),this.sendMessage(y.request,t,...e)})}addRequestListener(e,t){return n(this,$).set(e,t),this}removeRequestListener(e){return n(this,$).delete(e),this}static defib(){this.isOpen&&(process.env.NODE_ENV==="development"&&!n(this,v)&&console.info(`WebSocket ${this.name} has no heartbeat - going offline`),this.webSocket.close())}};v=new WeakMap,k=new WeakMap,g=new WeakMap,j=new WeakMap,A=new WeakMap,E=new WeakMap,O=new WeakMap,T=new WeakMap,S=new WeakMap,M=new WeakMap,$=new WeakMap,W=new WeakMap;var J=C;export{J as InSiteWebSocket};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/client/WebSocket.ts", "../../src/common.ts"],
4
- "sourcesContent": ["import EventEmitter from \"eventemitter3\";\nimport { debounce, noop, uid } from \"@nesvet/n\";\nimport { heartbeatGap, heartbeatInterval, requestHeaders } from \"../common\";\n\n\nconst reconnectTimeout = 2000;\n\nlet i = 0;\n\nconst webSocketUrlMap = new WeakMap<WebSocket, string>();\n\nexport type Options = {\n\turl?: string;\n\tname?: string;\n\tprotocols?: string[];\n\timmediately?: boolean;\n\tautoReconnect?: boolean;\n\ton?: Record<string, (...args: any[]) => void>;// eslint-disable-line @typescript-eslint/no-explicit-any\n};\n\ntype RequestListener = (...args: any[]) => any | Promise<any>;// eslint-disable-line @typescript-eslint/no-explicit-any\n\n\nexport class InSiteWebSocket extends EventEmitter {\n\tconstructor(url: string, options: Options = {}) {\n\t\tsuper();\n\t\t\n\t\tthis.url = url;\n\t\t\n\t\tconst {\n\t\t\tname = (i++).toString(),\n\t\t\tprotocols,\n\t\t\timmediately = true,\n\t\t\tautoReconnect = true,\n\t\t\ton\n\t\t} = options;\n\t\t\n\t\tthis.name = name;\n\t\t\n\t\tthis.protocols = protocols;\n\t\t\n\t\tthis.autoReconnect = !!autoReconnect;\n\t\t\n\t\tthis.on(`message:${requestHeaders.request}`, this.handleRequest);\n\t\t\n\t\tif (on)\n\t\t\tfor (const eventName in on)\n\t\t\t\tif (on[eventName])\n\t\t\t\t\tthis.on(eventName, on[eventName]);\n\t\t\n\t\tif (this.url && immediately)\n\t\t\tthis.open().catch(noop);\n\t\t\n\t}\n\t\n\treadonly isWebSocket = true;\n\treadonly isWebSocketServer = false;\n\treadonly isWebSocketServerClient = false;\n\t\n\turl;\n\t\n\treadonly name;\n\t\n\tprotocols?;\n\t\n\tautoReconnect;\n\t\n\tsend?(data: ArrayBufferLike | ArrayBufferView | Blob | string): void;\n\t\n\twebSocket: null | WebSocket = null;\n\t\n\tprivate defib = debounce(InSiteWebSocket.defib, heartbeatInterval + heartbeatGap);\n\t\n\tget isConnecting() {\n\t\treturn this.webSocket ? this.webSocket.readyState === this.webSocket.CONNECTING : null;\n\t}\n\t\n\tget isOpen() {\n\t\treturn this.webSocket ? this.webSocket.readyState === this.webSocket.OPEN : null;\n\t}\n\t\n\tget isClosing() {\n\t\treturn this.webSocket ? this.webSocket.readyState === this.webSocket.CLOSING : null;\n\t}\n\t\n\tget isClosed() {\n\t\treturn this.webSocket ? this.webSocket.readyState === this.webSocket.CLOSED : null;\n\t}\n\t\n\tprivate openResolve?: (value?: unknown) => void;\n\tprivate openReject?: (reason?: unknown) => void;\n\t\n\tprivate handleWebSocketOpen = () => {\n\t\t\n\t\tthis.openResolve!();\n\t\tthis.openResolve = undefined;\n\t\tthis.openReject = undefined;\n\t\t\n\t\tthis.emit(\"open\");\n\t\t\n\t\tthis.defib();\n\t\t\n\t};\n\t\n\tprivate handleWebSocketMessage = ({ data: message }: MessageEvent) => {\n\t\t\n\t\tthis.defib();\n\t\t\n\t\tif (message)\n\t\t\ttry {\n\t\t\t\tconst [ kind, ...rest ] = JSON.parse(message);\n\t\t\t\t\n\t\t\t\tthis.emit(\"message\", kind, ...rest);\n\t\t\t\tthis.emit(`message:${kind}`, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tthis.handleWebSocketError(error as Error);\n\t\t\t}\n\t\telse\n\t\t\tthis.webSocket!.send(\"\");\n\t\t\n\t};\n\t\n\tprivate handleWebSocketError = (error: Error | Event | undefined) => {\n\t\tif (error instanceof Event)\n\t\t\terror = undefined;\n\t\t\n\t\tif (this.openReject) {\n\t\t\tthis.openReject(error);\n\t\t\tthis.openResolve = undefined;\n\t\t\tthis.openReject = undefined;\n\t\t}\n\t\t\n\t\tthis.emit(\"error\", error);\n\t\t\n\t};\n\t\n\tprivate reconnectTimeout?: number;\n\t\n\tprivate handleWebSocketClose = (event: CloseEvent) => {\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\tconsole.info(`WebSocket ${this.name} is closed with code ${event.code} and reason \"${event.reason}\"`);\n\t\t\n\t\tthis.defib.clear();\n\t\t\n\t\tthis.emit(\"close\", event);\n\t\t\n\t\tif (this.autoReconnect && ![ 1002, 3500, 4000 ].includes(event.code)) {\n\t\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\t\tconsole.info(`WebSocket ${this.name} will try to reconnect in 2 sec\u2026`);\n\t\t\t\n\t\t\tthis.reconnectTimeout = setTimeout(() => this.open().catch(noop), reconnectTimeout) as unknown as number;\n\t\t}\n\t\t\n\t};\n\t\n\tasync open(options: Options = {}) {\n\t\t\n\t\tclearTimeout(this.reconnectTimeout);\n\t\t\n\t\tawait this.close(4000, \"reopen\");\n\t\t\n\t\tif (options.url)\n\t\t\tthis.url = options.url;\n\t\t\n\t\tif (options.protocols)\n\t\t\tthis.protocols = options.protocols;\n\t\t\n\t\tif (this.webSocket && webSocketUrlMap.get(this.webSocket) !== this.url)\n\t\t\tthis.emit(\"server-change\");\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.openResolve = resolve;\n\t\t\tthis.openReject = reject;\n\t\t\t\n\t\t\tthis.webSocket = new WebSocket(this.url, this.protocols);\n\t\t\t\n\t\t\tthis.webSocket.addEventListener(\"open\", this.handleWebSocketOpen);\n\t\t\tthis.webSocket.addEventListener(\"message\", this.handleWebSocketMessage);\n\t\t\tthis.webSocket.addEventListener(\"error\", this.handleWebSocketError);\n\t\t\tthis.webSocket.addEventListener(\"close\", this.handleWebSocketClose);\n\t\t\t\n\t\t\tthis.send = this.webSocket.send.bind(this.webSocket);\n\t\t\t\n\t\t\twebSocketUrlMap.set(this.webSocket, this.url);\n\t\t\t\n\t\t\tthis.emit(\"connecting\");\n\t\t\t\n\t\t});\n\t}\n\t\n\tconnect = this.open;\n\t\n\tclose(code = 3500, reason = \"manual\") {\n\t\t\n\t\tclearTimeout(this.reconnectTimeout);\n\t\t\n\t\treturn new Promise(resolve => {\n\t\t\tif (this.isConnecting || this.isOpen) {\n\t\t\t\tthis.webSocket!.addEventListener(\"close\", resolve);\n\t\t\t\tthis.webSocket!.close(code, reason);\n\t\t\t} else\n\t\t\t\tresolve(null);\n\t\t\t\n\t\t});\n\t}\n\t\n\tdisconnect = this.close;\n\t\n\tprivate queue: string[] = [];\n\t\n\tprivate releaseQueue = () => {\n\t\t\n\t\tfor (const message of this.queue)\n\t\t\tthis.webSocket!.send(message);\n\t\t\n\t\tthis.queue.length = 0;\n\t\t\n\t};\n\t\n\tsendMessage(...args: unknown[]) {\n\t\tconst message = JSON.stringify(args);\n\t\t\n\t\tif (this.isOpen)\n\t\t\tthis.webSocket!.send(message);\n\t\telse {\n\t\t\tif (!this.queue.length)\n\t\t\t\tthis.once(\"open\", this.releaseQueue);\n\t\t\t\n\t\t\tthis.queue.push(message);\n\t\t}\n\t\t\n\t}\n\t\n\tsendRequest(...args: unknown[]) {\n\t\t\n\t\tconst id = uid();\n\t\tconst eventName = `message:${requestHeaders.response}-${id}`;\n\t\t\n\t\tif (typeof args.at(-1) == \"function\") {\n\t\t\tthis.once(eventName, args.splice(-1, 1)[0] as () => void);\n\t\t\tthis.sendMessage(requestHeaders.request, id, ...args);\n\t\t\t\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t\n\t\t\tthis.once(eventName, (error, result) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tconst { message, ...restProps } = error;\n\t\t\t\t\treject(Object.assign(new Error(message), restProps));\n\t\t\t\t} else\n\t\t\t\t\tresolve(result);\n\t\t\t\t\n\t\t\t});\n\t\t\tthis.sendMessage(requestHeaders.request, id, ...args);\n\t\t\t\n\t\t});\n\t}\n\t\n\tprivate requestListeners = new Map<string, RequestListener>();\n\t\n\taddRequestListener(kind: string, listener: RequestListener) {\n\t\tthis.requestListeners.set(kind, listener);\n\t\t\n\t\treturn this;\n\t}\n\t\n\tonRequest = this.addRequestListener;\n\t\n\tremoveRequestListener(kind: string) {\n\t\tthis.requestListeners.delete(kind);\n\t\t\n\t\treturn this;\n\t}\n\t\n\toffRequest = this.removeRequestListener;\n\t\n\tprivate handleRequest = async (id: string, kind: string, ...rest: unknown[]) => {\n\t\tconst listener = this.requestListeners.get(kind);\n\t\t\n\t\tlet result;\n\t\tlet requestError = null;\n\t\t\n\t\tif (listener)\n\t\t\ttry {\n\t\t\t\tresult = await listener.apply(this, rest);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\tconst { message, ...restProps } = error;\n\t\t\t\t\trequestError = { message, ...restProps };\n\t\t\t\t}\n\t\t\t}\n\t\telse\n\t\t\trequestError = { message: `Unknown request kind \"${kind}\"` };\n\t\t\n\t\tthis.sendMessage(`${requestHeaders.response}-${id}`, requestError, result);\n\t\t\n\t};\n\t\n\t\n\tstatic defib(this: InSiteWebSocket) {\n\t\t\n\t\tif (this.isOpen) {\n\t\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\t\tconsole.info(`WebSocket ${this.name} has no heartbeat - going offline`);\n\t\t\t\n\t\t\tthis.webSocket!.close();\n\t\t}\n\t\t\n\t}\n\t\n}\n", "export const heartbeatInterval = 5_000;\nexport const heartbeatGap = 60_000;\n\nexport const requestHeaders = {\n\trequest: \"~r-q\",\n\tresponse: \"~r-s\"\n};\n"],
5
- "mappings": "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",
6
- "names": ["EventEmitter", "debounce", "noop", "uid", "requestHeaders", "reconnectTimeout", "i", "webSocketUrlMap", "InSiteWebSocket", "_InSiteWebSocket", "EventEmitter", "url", "options", "__publicField", "debounce", "message", "kind", "rest", "error", "event", "noop", "id", "listener", "result", "requestError", "restProps", "requestHeaders", "name", "protocols", "immediately", "autoReconnect", "on", "eventName", "resolve", "reject", "code", "reason", "args", "uid"]
3
+ "sources": ["../../src/client/WebSocket.ts", "../../../../../@nesvet/npm/n/src/noop.ts", "../../../../../@nesvet/npm/n/src/debounce.ts", "../../../../../@nesvet/npm/n/src/howmuch.ts", "../../../../../@nesvet/npm/n/src/StatefulPromise.ts", "../../../../../@nesvet/npm/n/src/uid.ts", "../../src/common.ts"],
4
+ "sourcesContent": ["import EventEmitter from \"eventemitter3\";\nimport {\n\tdebounce,\n\tnoop,\n\tStatefulPromise,\n\tuid\n} from \"@nesvet/n\";\nimport { heartbeatGap, heartbeatInterval, requestHeaders } from \"../common\";\n\n\nlet i = 0;\n\nexport type Options = {\n\turl?: string | URL;\n\tname?: string;\n\tprotocols?: string[];\n\timmediately?: boolean;\n\treconnectAfter?: null | number;\n\ton?: Record<string, (...args: any[]) => void>;// eslint-disable-line @typescript-eslint/no-explicit-any\n\tquiet?: boolean;\n};\n\ntype RequestListener = (...args: any[]) => any | Promise<any>;// eslint-disable-line @typescript-eslint/no-explicit-any\n\n\nexport class InSiteWebSocket extends EventEmitter {\n\tconstructor(options: Options = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\turl,\n\t\t\tname = (i++).toString(),\n\t\t\tprotocols,\n\t\t\timmediately = true,\n\t\t\treconnectAfter = 2000,\n\t\t\ton,\n\t\t\tquiet = false\n\t\t} = options;\n\t\t\n\t\tthis.url = url;\n\t\tthis.name = name;\n\t\t\n\t\tthis.protocols = protocols;\n\t\t\n\t\tthis.reconnectAfter = reconnectAfter;\n\t\t\n\t\tthis.on(`message:${requestHeaders.request}`, this.#handleRequest);\n\t\t\n\t\tif (on)\n\t\t\tfor (const eventName in on)\n\t\t\t\tif (on[eventName])\n\t\t\t\t\tthis.on(eventName, on[eventName]);\n\t\t\n\t\tthis.#isQuiet = quiet;\n\t\t\n\t\tif (this.url && immediately)\n\t\t\tthis.open().catch(noop);\n\t\t\n\t}\n\t\n\treadonly isWebSocket = true;\n\treadonly isWebSocketServer = false;\n\treadonly isWebSocketServerClient = false;\n\t\n\turl;\n\t\n\treadonly name;\n\t\n\tprotocols?;\n\t\n\treconnectAfter;\n\t\n\t#isQuiet;\n\t\n\tisUsed = false;\n\tisAutoReconnecting = false;\n\t\n\tsend?(data: ArrayBufferLike | ArrayBufferView | Blob | string): void;\n\t\n\twebSocket: null | WebSocket = null;\n\t\n\t#defib = debounce(InSiteWebSocket.defib, heartbeatInterval + heartbeatGap);\n\t\n\tget isConnecting() {\n\t\treturn this.webSocket ? this.webSocket.readyState === WebSocket.CONNECTING : null;\n\t}\n\t\n\tget isOpen() {\n\t\treturn this.webSocket ? this.webSocket.readyState === WebSocket.OPEN : null;\n\t}\n\t\n\tget isClosing() {\n\t\treturn this.webSocket ? this.webSocket.readyState === WebSocket.CLOSING : null;\n\t}\n\t\n\tget isClosed() {\n\t\treturn !this.webSocket || this.webSocket.readyState === WebSocket.CLOSED;\n\t}\n\t\n\t#openPromise?: StatefulPromise<void>;\n\t\n\t#handleWebSocketOpen = () => {\n\t\t\n\t\tthis.#openPromise!.resolve();\n\t\t\n\t\tthis.emit(\"open\");\n\t\t\n\t\tthis.#defib();\n\t\t\n\t};\n\t\n\t#handleWebSocketMessage = ({ data: message }: MessageEvent) => {\n\t\t\n\t\tthis.#defib();\n\t\t\n\t\tif (message)\n\t\t\ttry {\n\t\t\t\tconst [ kind, ...rest ] = JSON.parse(message);\n\t\t\t\t\n\t\t\t\tthis.emit(\"message\", kind, ...rest);\n\t\t\t\tthis.emit(`message:${kind}`, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tthis.#handleWebSocketError(error as Error);\n\t\t\t}\n\t\telse\n\t\t\tthis.webSocket!.send(\"\");\n\t\t\n\t};\n\t\n\t#handleWebSocketError = (error: Error | Event | undefined) => {\n\t\tif (error instanceof Event)\n\t\t\terror = undefined;\n\t\t\n\t\tif (this.#openPromise!.isPending)\n\t\t\tthis.#openPromise!.reject(error);\n\t\t\n\t\tthis.emit(\"error\", error);\n\t\t\n\t};\n\t\n\t#reconnectTimeout?: number;\n\t\n\t#handleWebSocketClose = (event: CloseEvent) => {\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\" && !this.#isQuiet)\n\t\t\tconsole.info(`WebSocket ${this.name} is closed with code ${event.code} and reason \"${event.reason}\"`);\n\t\t\n\t\tthis.#defib.clear();\n\t\t\n\t\tconst webSocket = this.webSocket!;\n\t\t\n\t\twebSocket.removeEventListener(\"open\", this.#handleWebSocketOpen);\n\t\twebSocket.removeEventListener(\"message\", this.#handleWebSocketMessage);\n\t\twebSocket.removeEventListener(\"error\", this.#handleWebSocketError);\n\t\twebSocket.removeEventListener(\"close\", this.#handleWebSocketClose);\n\t\t\n\t\tdelete this.send;\n\t\t\n\t\tthis.emit(\"close\", event);\n\t\t\n\t\tthis.webSocket = null;\n\t\t\n\t\tif (this.reconnectAfter && ![ 1002, 3500, 4000 ].includes(event.code)) {\n\t\t\tif (process.env.NODE_ENV === \"development\" && !this.#isQuiet)\n\t\t\t\tconsole.info(`WebSocket ${this.name} will try to reconnect in 2 sec\u2026`);\n\t\t\t\n\t\t\tthis.#reconnectTimeout = setTimeout(() => this.open().catch(noop), this.reconnectAfter) as unknown as number;\n\t\t}\n\t\t\n\t};\n\t\n\t\n\tasync open(options: Pick<Options, \"protocols\" | \"url\"> = {}): Promise<void> {\n\t\t\n\t\tclearTimeout(this.#reconnectTimeout);\n\t\t\n\t\tthis.isUsed = true;\n\t\tthis.isAutoReconnecting = !!this.reconnectAfter;\n\t\t\n\t\tawait this.close(4000, \"reopen\");\n\t\t\n\t\tlet prevURL: string | undefined | URL;\n\t\tif (options.url && this.url !== options.url) {\n\t\t\tprevURL = this.url;\n\t\t\tthis.url = options.url;\n\t\t}\n\t\t\n\t\tif (options.protocols)\n\t\t\tthis.protocols = options.protocols;\n\t\t\n\t\tthis.#openPromise = new StatefulPromise((resolve, reject) => {\n\t\t\t\n\t\t\tif (this.url) {\n\t\t\t\tconst webSocket = new WebSocket(this.url, this.protocols);\n\t\t\t\t\n\t\t\t\twebSocket.addEventListener(\"open\", this.#handleWebSocketOpen);\n\t\t\t\twebSocket.addEventListener(\"message\", this.#handleWebSocketMessage);\n\t\t\t\twebSocket.addEventListener(\"error\", this.#handleWebSocketError);\n\t\t\t\twebSocket.addEventListener(\"close\", this.#handleWebSocketClose, { once: true });\n\t\t\t\t\n\t\t\t\tthis.send = webSocket.send.bind(webSocket);\n\t\t\t\t\n\t\t\t\tthis.webSocket = webSocket;\n\t\t\t\t\n\t\t\t\tif (prevURL)\n\t\t\t\t\tthis.emit(\"server-change\", this.url, prevURL);\n\t\t\t\t\n\t\t\t\tthis.emit(\"connecting\");\n\t\t\t} else {\n\t\t\t\tthis.webSocket = null;\n\t\t\t\tdelete this.send;\n\t\t\t\treject(new Error(\"url prop is not set\"));\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\treturn this.#openPromise;\n\t}\n\t\n\tconnect = this.open;\n\t\n\tclose(code = 3500, reason = \"manual\") {\n\t\t\n\t\tclearTimeout(this.#reconnectTimeout);\n\t\t\n\t\tif (reason === \"manual\")\n\t\t\tthis.isAutoReconnecting = false;\n\t\t\n\t\treturn new Promise<void>(resolve => {\n\t\t\t\n\t\t\tif (this.isConnecting || this.isOpen) {\n\t\t\t\tthis.webSocket!.addEventListener(\"close\", () => resolve(), { once: true });\n\t\t\t\tthis.webSocket!.close(code, reason);\n\t\t\t} else\n\t\t\t\tresolve();\n\t\t\t\n\t\t});\n\t}\n\t\n\tdisconnect = this.close;\n\t\n\t#queue: string[] = [];\n\t\n\t#releaseQueue = () => {\n\t\t\n\t\tfor (const message of this.#queue)\n\t\t\tthis.webSocket!.send(message);\n\t\t\n\t\tthis.#queue.length = 0;\n\t\t\n\t};\n\t\n\tsendMessage(...args: unknown[]) {\n\t\tconst message = JSON.stringify(args);\n\t\t\n\t\tif (this.isOpen)\n\t\t\tthis.webSocket!.send(message);\n\t\telse {\n\t\t\tif (!this.#queue.length)\n\t\t\t\tthis.once(\"open\", this.#releaseQueue);\n\t\t\t\n\t\t\tthis.#queue.push(message);\n\t\t}\n\t\t\n\t}\n\t\n\tsendRequest(...args: unknown[]) {\n\t\t\n\t\tconst id = uid();\n\t\tconst eventName = `message:${requestHeaders.response}-${id}`;\n\t\t\n\t\tif (typeof args.at(-1) == \"function\") {\n\t\t\tthis.once(eventName, args.splice(-1, 1)[0] as () => void);\n\t\t\tthis.sendMessage(requestHeaders.request, id, ...args);\n\t\t\t\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t\n\t\t\tthis.once(eventName, (error, result) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tconst { message, ...restProps } = error;\n\t\t\t\t\treject(Object.assign(new Error(message), restProps));\n\t\t\t\t} else\n\t\t\t\t\tresolve(result);\n\t\t\t\t\n\t\t\t});\n\t\t\tthis.sendMessage(requestHeaders.request, id, ...args);\n\t\t\t\n\t\t});\n\t}\n\t\n\t#requestListeners = new Map<string, RequestListener>();\n\t\n\taddRequestListener(kind: string, listener: RequestListener) {\n\t\tthis.#requestListeners.set(kind, listener);\n\t\t\n\t\treturn this;\n\t}\n\t\n\tonRequest = this.addRequestListener;\n\t\n\tremoveRequestListener(kind: string) {\n\t\tthis.#requestListeners.delete(kind);\n\t\t\n\t\treturn this;\n\t}\n\t\n\toffRequest = this.removeRequestListener;\n\t\n\t#handleRequest = async (id: string, kind: string, ...rest: unknown[]) => {\n\t\tconst listener = this.#requestListeners.get(kind);\n\t\t\n\t\tlet result;\n\t\tlet requestError = null;\n\t\t\n\t\tif (listener)\n\t\t\ttry {\n\t\t\t\tresult = await listener.apply(this, rest);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\tconst { message, ...restProps } = error;\n\t\t\t\t\trequestError = { message, ...restProps };\n\t\t\t\t}\n\t\t\t}\n\t\telse\n\t\t\trequestError = { message: `Unknown request kind \"${kind}\"` };\n\t\t\n\t\tthis.sendMessage(`${requestHeaders.response}-${id}`, requestError, result);\n\t\t\n\t};\n\t\n\t\n\tstatic defib(this: InSiteWebSocket) {\n\t\t\n\t\tif (this.isOpen) {\n\t\t\tif (process.env.NODE_ENV === \"development\" && !this.#isQuiet)\n\t\t\t\tconsole.info(`WebSocket ${this.name} has no heartbeat - going offline`);\n\t\t\t\n\t\t\tthis.webSocket!.close();\n\t\t}\n\t\t\n\t}\n\t\n}\n", "export function noop() { /**/ }\n", "import { noop } from \"./noop.js\";\n\n\ntype Callback<Result> = (...args: unknown[]) => Result;\ntype FunctionOrBoolean = (() => unknown) | boolean;\ntype Options = { leading?: FunctionOrBoolean; maxWait?: number; trailing?: FunctionOrBoolean };\ntype NumberOrUndefined = number | undefined;\n\ntype DebouncedFunction<Result> = {\n\t(this: unknown, ..._args: unknown[]): Promise<Result>;\n};\n\nexport type Debounced<Result> = {\n\tcallback: Callback<Result>;\n\tpromise: {\n\t\tisResolved: boolean;\n\t} & Promise<unknown>;\n\tresolve: (value: Result) => void;\n\trun(): Promise<Result>;\n\tclear(shouldRun?: boolean): Promise<void>;\n} & DebouncedFunction<Result>;\n\n\nexport function debounce<Result>(callback: Callback<Result>, limit = 0, options: Options = {}) {\n\tlet { leading = false, trailing = true } = options;\n\tconst { maxWait = Infinity } = options;\n\t\n\tlet timeout: NumberOrUndefined;\n\tlet maxWaitTimeout: NumberOrUndefined;\n\tlet end: NumberOrUndefined;\n\tlet context: unknown;\n\tlet args: unknown[];\n\tlet initial: FunctionOrBoolean;\n\tlet final: FunctionOrBoolean;\n\tlet result: Result;\n\t\n\tconst expired = async () => {\n\t\t\n\t\tconst n = Date.now();\n\t\t\n\t\tif (n >= end!) {\n\t\t\ttimeout = undefined;\n\t\t\tend = undefined;\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\tif (typeof final == \"function\")\n\t\t\t\tawait final();\n\t\t\tdebounced.resolve(result);\n\t\t\tdebounced.promise.isResolved = true;\n\t\t\tinitial = leading;\n\t\t} else {\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = setTimeout(expired, end! - n);\n\t\t}\n\t\t\n\t};\n\t\n\tconst maxWaitExpired = Number.isFinite(maxWait) ? () => {\n\t\t\n\t\tif (final === run)\n\t\t\tfinal = false;\n\t\trun();\n\t\tmaxWaitTimeout = setTimeout(maxWaitExpired as TimerHandler, maxWait);\n\t\t\n\t} : null;\n\t\n\tasync function run() {\n\t\treturn (result = await callback.apply(context, args));\n\t}\n\t\n\tif (leading && typeof leading == \"boolean\")\n\t\tleading = run;\n\tinitial = leading;\n\t\n\tif (trailing && typeof trailing == \"boolean\")\n\t\ttrailing = run;\n\tfinal = trailing;\n\t\n\tconst debounced: Debounced<Result> = Object.assign(function (..._args) {\n\t\targs = _args;\n\t\tcontext = this;// eslint-disable-line no-invalid-this\n\t\t\n\t\tend = Date.now() + limit;\n\t\tfinal = trailing;\n\t\t\n\t\tif (debounced.promise.isResolved)\n\t\t\tdebounced.promise = Object.assign(new Promise(resolve => {\n\t\t\t\tdebounced.resolve = resolve;\n\t\t\t\t\n\t\t\t\tif (typeof initial == \"function\") {\n\t\t\t\t\tinitial();\n\t\t\t\t\tinitial = false;\n\t\t\t\t\tif (final === run)\n\t\t\t\t\t\tfinal = false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!timeout) {\n\t\t\t\t\ttimeout = setTimeout(expired, limit);\n\t\t\t\t\tif (maxWaitExpired)\n\t\t\t\t\t\tmaxWaitTimeout = setTimeout(maxWaitExpired, maxWait);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}), {\n\t\t\t\tisResolved: false\n\t\t\t});\n\t\t\n\t\treturn debounced.promise;\n\t} as DebouncedFunction<Result>, {\n\t\tcallback,\n\t\tpromise: Object.assign(Promise.resolve(), {\n\t\t\tisResolved: true\n\t\t}),\n\t\tresolve: noop,\n\t\trun,\n\t\tclear: async (shouldRun?: boolean) => {\n\t\t\t\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = undefined;\n\t\t\t\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\t\n\t\t\tdebounced.promise.isResolved = true;\n\t\t\tdebounced.resolve(shouldRun ? await run() : result);\n\t\t\t\n\t\t}\n\t});\n\t\n\treturn debounced;\n}\n\n\ndebounce.noop = Object.assign(() => { /**/ }, {\n\tcallback: noop,\n\tpromise: Object.assign(Promise.resolve(), {\n\t\tisResolved: true\n\t}),\n\tresolve: noop,\n\trun: noop,\n\tclear: noop\n}) as unknown as Debounced<void>;\n\n\nexport function throttle<Result>(callback: Callback<Result>, limit?: number, options?: Options) {\n\treturn debounce(callback, limit, {\n\t\tmaxWait: limit,\n\t\tleading: true,\n\t\ttrailing: true,\n\t\t...options\n\t});\n}\n", "export function howmuch(number: [] | number, one: string, two: string, five: boolean | string, shouldPrintNumber = true) {\n\tif (Array.isArray(number))\n\t\tnumber = number.length;\n\t\n\tif (typeof five != \"string\") {\n\t\tshouldPrintNumber = five ?? true;\n\t\tfive = two;\n\t}\n\t\n\t\n\treturn (shouldPrintNumber ? `${number}\u00A0` : \"\") + howmuch.raw(number, one, two, five);\n}\n\nhowmuch.raw = (number: number, one: string, two: string, five = two) => {\n\tnumber = Math.abs(number);\n\tconst u = number % 10;\n\tconst d = number % 100;\n\t\n\treturn (\n\t\t(u === 1 && d !== 11) ?\n\t\t\tone :\n\t\t\t((u >= 2 && u <= 4) && !(d >= 12 && d <= 15)) ?\n\t\t\t\ttwo :\n\t\t\t\tfive\n\t);\n};\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype Value<T> = PromiseLike<T> | T;\ntype Resolve<T> = (value: Value<T>) => void;\ntype Reject = (reason?: any) => void;\n\nconst nativesMap = new WeakMap<StatefulPromise<any>, { resolve: Resolve<any>; reject: Reject }>();\n\n\nexport class StatefulPromise<T> extends Promise<T> {\n\tconstructor(executor?: (resolve: Resolve<T>, reject: Reject) => void) {\n\t\t\n\t\tlet nativeResolve: Resolve<T>;\n\t\tlet nativeReject: Reject;\n\t\t\n\t\tsuper((resolve, reject) => {\n\t\t\tnativeResolve = resolve;\n\t\t\tnativeReject = reject;\n\t\t\t\n\t\t});\n\t\t\n\t\tnativesMap.set(this, { resolve: nativeResolve!, reject: nativeReject! });\n\t\t\n\t\texecutor?.(this.resolve, this.reject);\n\t\t\n\t}\n\t\n\tisPending = true;\n\tisFulfilled = false;\n\tisRejected = false;\n\t\n\tstate: \"fulfilled\" | \"pending\" | \"rejected\" = \"pending\";\n\t\n\tresult?: any;\n\t\n\tresolve = (value: Value<T>) => {\n\t\t\n\t\tif (this.isPending) {\n\t\t\tthis.isPending = false;\n\t\t\tthis.isFulfilled = true;\n\t\t\tthis.state = \"fulfilled\";\n\t\t\tthis.result = value;\n\t\t\t\n\t\t\tconst native = nativesMap.get(this);\n\t\t\t\n\t\t\tif (native) {\n\t\t\t\tnative.resolve.call(this, value);\n\t\t\t\tnativesMap.delete(this);\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n\treject = (reason?: any) => {\n\t\t\n\t\tif (this.isPending) {\n\t\t\tthis.isPending = false;\n\t\t\tthis.isRejected = true;\n\t\t\tthis.state = \"rejected\";\n\t\t\tthis.result = reason;\n\t\t\t\n\t\t\tconst native = nativesMap.get(this);\n\t\t\t\n\t\t\tif (native) {\n\t\t\t\tnative.reject.call(this, reason);\n\t\t\t\tnativesMap.delete(this);\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n}\n", "export function uid(prefix: string | undefined = \"\", postfix: string | undefined = \"\") {\n\treturn `${prefix}${Date.now().toString(36)}${Math.round(Math.random() * Number.MAX_SAFE_INTEGER).toString(36)}${postfix}`;\n}\n", "export const heartbeatInterval = 5_000;\nexport const heartbeatGap = 60_000;\n\nexport const requestHeaders = {\n\trequest: \"~r-q\",\n\tresponse: \"~r-s\"\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["EventEmitter", "noop", "debounce", "callback", "limit", "options", "leading", "trailing", "maxWait", "timeout", "maxWaitTimeout", "end", "context", "args", "initial", "final", "result", "expired", "n", "debounced", "maxWaitExpired", "run", "_args", "resolve", "noop", "shouldRun", "howmuch", "number", "one", "two", "five", "shouldPrintNumber", "u", "d", "nativesMap", "StatefulPromise", "executor", "nativeResolve", "nativeReject", "resolve", "reject", "__publicField", "value", "native", "reason", "uid", "prefix", "postfix", "requestHeaders", "i", "_isQuiet", "_defib", "_openPromise", "_handleWebSocketOpen", "_handleWebSocketMessage", "_handleWebSocketError", "_reconnectTimeout", "_handleWebSocketClose", "_queue", "_releaseQueue", "_requestListeners", "_handleRequest", "_InSiteWebSocket", "EventEmitter", "options", "__publicField", "__privateAdd", "debounce", "__privateGet", "message", "kind", "rest", "error", "event", "webSocket", "__privateSet", "noop", "id", "listener", "result", "requestError", "restProps", "requestHeaders", "url", "name", "protocols", "immediately", "reconnectAfter", "on", "quiet", "eventName", "prevURL", "StatefulPromise", "resolve", "reject", "code", "reason", "args", "uid", "InSiteWebSocket"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocketServer.d.ts","sourceRoot":"","sources":["../../src/server/WebSocketServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WebSocketServer.d.ts","sourceRoot":"","sources":["../../src/server/WebSocketServer.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import m from"node:fs";import k from"node:http";import I from"node:https";import{WebSocketServer as q}from"ws";var S={request:"~r-q",response:"~r-s"};var h=Symbol("heartbeatInterval"),l=Symbol("defib"),c=Symbol("pingTs");import{WebSocket as C}from"ws";import{debounce as f,uid as W}from"@nesvet/n";var s=class p extends C{on(e,t){return super.on(e,t)}get isConnecting(){return this.readyState===this.CONNECTING}get isOpen(){return this.readyState===this.OPEN}get isClosing(){return this.readyState===this.CLOSING}get isClosed(){return this.readyState===this.CLOSED}isWebSocketServerClient=!0;isWebSocketServer=!1;isWebSocket=!1;wss;userAgent="";remoteAddress="";[l]=p.makeDefib.call(this);latency=0;[c];[h]=p.makeHeartbeatInterval.call(this);sendMessage(...e){return this.send(JSON.stringify(e))}sendRequest(...e){let t=W(),n=`message:${S.response}-${t}`;return typeof e.at(-1)=="function"?(this.once(n,e.splice(-1,1)[0]),this.sendMessage(S.request,t,...e),this):new Promise((r,i)=>{this.once(n,(o,a)=>{if(o){let{message:d,...v}=o;i(Object.assign(new Error(d),v))}else r(a)}),this.sendMessage(S.request,t,...e)})}static makeDefib(){return f(()=>this.terminate(),65e3)}static makeHeartbeatInterval(){return setInterval(()=>{this[c]=Date.now(),this.send("")},5e3)}};var b=class extends q{constructor(e,t,n){let{ssl:r,port:i,...o}=e;if(r){if(typeof r.cert=="string"&&!/^-{3,}BEGIN/.test(r.cert))try{r.cert=m.readFileSync(r.cert)}catch{}if(typeof r.key=="string"&&!/^-{3,}BEGIN/.test(r.key))try{r.key=m.readFileSync(r.key)}catch{}}let{server:a=r?I.createServer({...r}):k.createServer()}=o;super({WebSocket:s,...o,server:a}),this.port=typeof i=="string"?Number.parseInt(i):i,t&&(typeof t=="function"?n=t:Object.assign(this,t)),this.on("connection",this.handleConnection),this.on(`client-message:${S.request}`,this.handleRequest),a.listen(this.port,n)}on(e,t){return super.on(e,t)}isWebSocketServer=!0;isWebSocketServerClient=!1;isWebSocket=!1;port;requestListeners=new Map;addRequestListener(e,t){return this.requestListeners.set(e,t),this}onRequest=this.addRequestListener;removeRequestListener(e){return this.requestListeners.delete(e),this}offRequest=this.removeRequestListener;handleRequest=async(e,t,n,...r)=>{let i=this.requestListeners.get(n),o,a=null;if(i)try{o=await i.call(this,e,...r)}catch(d){if(d instanceof Error){let{message:v,...y}=d;a={message:v,...y}}}else a={message:`Unknown request kind "${n}"`};e.sendMessage(`${S.response}-${t}`,a,o)};handleConnection(e,t){if(!(e instanceof s)){Object.defineProperties(e,{isConnecting:{get:Object.getOwnPropertyDescriptor(s.prototype,"isConnecting").get},isOpen:{get:Object.getOwnPropertyDescriptor(s.prototype,"isOpen").get},isClosing:{get:Object.getOwnPropertyDescriptor(s.prototype,"isClosing").get},isClosed:{get:Object.getOwnPropertyDescriptor(s.prototype,"isClosed").get}});let{terminate:n}=e;Object.assign(e,{isWebSocketServerClient:!0,isWebSocketServer:!1,isWebSocket:!1,[l]:s.makeDefib.call(e),latency:0,[h]:s.makeHeartbeatInterval.call(e),sendMessage:s.prototype.sendMessage,sendRequest:s.prototype.sendRequest,terminate(){try{n.call(e)}catch(r){console.error(r)}}})}Object.assign(e,{wss:this,userAgent:t.headers["user-agent"]??"",remoteAddress:t.headers["x-real-ip"]??t.headers["x-forwarded-for"]??""}),e[l](),e.on("message",n=>this.handleClientMessage(e,n)),e.on("error",n=>this.handleClientError(e,n)),e.on("close",(...n)=>this.handleClientClose(e,...n)),this.emit("client-connect",e,t)}handleClientMessage(e,t){let n=t.toString();if(e[l](),n)try{let[r,...i]=JSON.parse(n);e.emit(`message:${r}`,...i),this.emit("client-message",e,r,...i),this.emit(`client-message:${r}`,e,...i)}catch(r){this.handleClientError(e,r)}else e[c]&&(e.latency=Date.now()-e[c],delete e[c])}handleClientError(e,t){t instanceof Event&&(t=void 0),process.env.NODE_ENV==="development"&&console.error("WebSocketServer Client error",t),this.emit("client-error",e,t)}handleClientClose(e,...t){process.env.NODE_ENV==="development"&&console.info("WebSocketServer Client closed",...t),e[l].clear(),clearInterval(e[h]),this.emit("client-close",e),this.emit("client-closed",e)}};export{b as InSiteWebSocketServer,s as InSiteWebSocketServerClient};
1
+ import q from"node:fs";import D from"node:http";import B from"node:https";import{WebSocketServer as L}from"ws";var d={request:"~r-q",response:"~r-s"};var y=Symbol("heartbeatInterval"),m=Symbol("defib"),h=Symbol("pingTs");var P=["forwarded","x-forwarded","forwarded-for","x-forwarded-for","x-real-ip","cf-connecting-ip","do-connecting-ip","x-appengine-user-ip","true-client-ip","fastly-client-ip","client-ip","x-client-ip","x-proxyuser-ip","x-cluster-client-ip"],b,O=/^.*?((?:\d{1,3}\.){3}\d{1,3}).*$/;function R(o){if(b===void 0){for(let e of P){let t=o.headers[e];typeof t=="string"&&O.test(t)&&(b=e)}b??=o.socket.remoteAddress&&O.test(o.socket.remoteAddress)?!0:null}switch(b){case!0:return o.socket.remoteAddress;case null:return"127.0.0.1";default:return o.headers[b].replace(O,"$1")}}import{WebSocket as N}from"ws";function g(){}function I(o,e=0,t={}){let{leading:r=!1,trailing:n=!0}=t,{maxWait:s=1/0}=t,i,l,a,S,W,v,u,C,$=async()=>{let x=Date.now();x>=a?(i=void 0,a=void 0,clearTimeout(l),typeof u=="function"&&await u(),f.resolve(C),f.promise.isResolved=!0,v=r):(clearTimeout(i),i=setTimeout($,a-x))},k=Number.isFinite(s)?()=>{u===p&&(u=!1),p(),l=setTimeout(k,s)}:null;async function p(){return C=await o.apply(S,W)}r&&typeof r=="boolean"&&(r=p),v=r,n&&typeof n=="boolean"&&(n=p),u=n;let f=Object.assign(function(...x){return W=x,S=this,a=Date.now()+e,u=n,f.promise.isResolved&&(f.promise=Object.assign(new Promise(A=>{f.resolve=A,typeof v=="function"&&(v(),v=!1,u===p&&(u=!1)),i||(i=setTimeout($,e),k&&(l=setTimeout(k,s)))}),{isResolved:!1})),f.promise},{callback:o,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:g,run:p,clear:async x=>{clearTimeout(i),i=void 0,clearTimeout(l),f.promise.isResolved=!0,f.resolve(x?await p():C)}});return f}I.noop=Object.assign(()=>{},{callback:g,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:g,run:g,clear:g});function M(o,e,t,r,n=!0){return Array.isArray(o)&&(o=o.length),typeof r!="string"&&(n=r??!0,r=t),(n?`${o}\xA0`:"")+M.raw(o,e,t,r)}M.raw=(o,e,t,r=t)=>{o=Math.abs(o);let n=o%10,s=o%100;return n===1&&s!==11?e:n>=2&&n<=4&&!(s>=12&&s<=15)?t:r};function E(o="",e=""){return`${o}${Date.now().toString(36)}${Math.round(Math.random()*Number.MAX_SAFE_INTEGER).toString(36)}${e}`}var c=class o extends N{on(e,t){return super.on(e,t)}get isConnecting(){return this.readyState===this.CONNECTING}get isOpen(){return this.readyState===this.OPEN}get isClosing(){return this.readyState===this.CLOSING}get isClosed(){return this.readyState===this.CLOSED}isWebSocketServerClient=!0;isWebSocketServer=!1;isWebSocket=!1;wss;userAgent="";remoteAddress="";[m]=o.makeDefib.call(this);latency=0;[h];[y]=o.makeHeartbeatInterval.call(this);sendMessage(...e){return this.send(JSON.stringify(e))}sendRequest(...e){let t=E(),r=`message:${d.response}-${t}`;return typeof e.at(-1)=="function"?(this.once(r,e.splice(-1,1)[0]),this.sendMessage(d.request,t,...e),this):new Promise((n,s)=>{this.once(r,(i,l)=>{if(i){let{message:a,...S}=i;s(Object.assign(new Error(a),S))}else n(l)}),this.sendMessage(d.request,t,...e)})}static makeDefib(){return I(()=>this.terminate(),65e3)}static makeHeartbeatInterval(){return setInterval(()=>{this[h]=Date.now(),this.send("")},5e3)}};var w=class extends L{constructor(e,t,r){let{ssl:n,port:s,...i}=e;if(n){if(typeof n.cert=="string"&&!/^-{3,}BEGIN/.test(n.cert))try{n.cert=q.readFileSync(n.cert)}catch{}if(typeof n.key=="string"&&!/^-{3,}BEGIN/.test(n.key))try{n.key=q.readFileSync(n.key)}catch{}}let{server:l=n?B.createServer({...n}):D.createServer()}=i;super({WebSocket:c,...i,server:l}),this.port=typeof s=="string"?Number.parseInt(s):s,t&&(typeof t=="function"?r=t:Object.assign(this,t)),this.on("connection",this.handleConnection),this.on(`client-message:${d.request}`,this.handleRequest),l.listen(this.port,r)}on(e,t){return super.on(e,t)}isWebSocketServer=!0;isWebSocketServerClient=!1;isWebSocket=!1;port;requestListeners=new Map;addRequestListener(e,t){return this.requestListeners.set(e,t),this}onRequest=this.addRequestListener;removeRequestListener(e){return this.requestListeners.delete(e),this}offRequest=this.removeRequestListener;handleRequest=async(e,t,r,...n)=>{let s=this.requestListeners.get(r),i,l=null;if(s)try{i=await s.call(this,e,...n)}catch(a){if(a instanceof Error){let{message:S,...W}=a;l={message:S,...W}}process.env.NODE_ENV==="development"&&console.error(`WebSocketServer request "${r}" (${t}) error: `,a)}else l={message:`Unknown request kind "${r}"`};e.sendMessage(`${d.response}-${t}`,l,i)};handleConnection(e,t){if(!(e instanceof c)){Object.defineProperties(e,{isConnecting:{get:Object.getOwnPropertyDescriptor(c.prototype,"isConnecting").get},isOpen:{get:Object.getOwnPropertyDescriptor(c.prototype,"isOpen").get},isClosing:{get:Object.getOwnPropertyDescriptor(c.prototype,"isClosing").get},isClosed:{get:Object.getOwnPropertyDescriptor(c.prototype,"isClosed").get}});let{terminate:r}=e;Object.assign(e,{isWebSocketServerClient:!0,isWebSocketServer:!1,isWebSocket:!1,[m]:c.makeDefib.call(e),latency:0,[y]:c.makeHeartbeatInterval.call(e),sendMessage:c.prototype.sendMessage,sendRequest:c.prototype.sendRequest,terminate(){try{r.call(e)}catch(n){console.error(n)}}})}Object.assign(e,{wss:this,userAgent:t.headers["user-agent"]??"",remoteAddress:R(t)}),e[m](),e.on("message",r=>this.handleClientMessage(e,r)),e.on("error",r=>this.handleClientError(e,r)),e.on("close",(...r)=>this.handleClientClose(e,...r)),this.emit("client-connect",e,t)}handleClientMessage(e,t){let r=t.toString();if(e[m](),r)try{let[n,...s]=JSON.parse(r);e.emit(`message:${n}`,...s),this.emit("client-message",e,n,...s),this.emit(`client-message:${n}`,e,...s)}catch(n){this.handleClientError(e,n)}else e[h]&&(e.latency=Date.now()-e[h],delete e[h])}handleClientError(e,t){t instanceof Event&&(t=void 0),process.env.NODE_ENV==="development"&&console.error("WebSocketServer Client error",t),this.emit("client-error",e,t)}handleClientClose(e,t,r){process.env.NODE_ENV==="development"&&console.info(`WebSocketServer Client closed ${t?`with code ${t}`:""} ${t&&r?"and ":""}${r?`reason "${r.toString()}"`:""}`),e[m].clear(),clearInterval(e[y]),this.emit("client-close",e),this.emit("client-closed",e)}};export{w as InSiteWebSocketServer,c as InSiteWebSocketServerClient};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/server/WebSocketServer.ts", "../../src/common.ts", "../../src/server/symbols.ts", "../../src/server/WebSocketServerClient.ts"],
4
- "sourcesContent": ["import fs from \"node:fs\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport { type RawData, type WebSocket, WebSocketServer } from \"ws\";\nimport { requestHeaders } from \"../common\";\nimport { defibSymbol, heartbeatIntervalSymbol, pingTsSymbol } from \"./symbols\";\nimport { InSiteWebSocketServerClient } from \"./WebSocketServerClient\";\nimport type { Options } from \"./types\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\ntype RequestListener<WSSC extends InSiteWebSocketServerClient> = (wscc: WSSC, ...args: any[]) => any | Promise<any>;\n\n\nexport class InSiteWebSocketServer<WSSC extends InSiteWebSocketServerClient = InSiteWebSocketServerClient> extends WebSocketServer<typeof InSiteWebSocketServerClient> {\n\tconstructor(options: Options<WSSC>, props?: Record<string, unknown>, handleListen?: (() => void)) {\n\t\tconst {\n\t\t\tssl,\n\t\t\tport,\n\t\t\t...wssOptions\n\t\t} = options;\n\t\t\n\t\tif (ssl) {\n\t\t\tif (typeof ssl.cert == \"string\" && !/^-{3,}BEGIN/.test(ssl.cert))\n\t\t\t\ttry {\n\t\t\t\t\tssl.cert = fs.readFileSync(ssl.cert);\n\t\t\t\t} catch {}\n\t\t\tif (typeof ssl.key == \"string\" && !/^-{3,}BEGIN/.test(ssl.key))\n\t\t\t\ttry {\n\t\t\t\t\tssl.key = fs.readFileSync(ssl.key);\n\t\t\t\t} catch {}\n\t\t}\n\t\t\n\t\tconst {\n\t\t\tserver = ssl ? https.createServer({ ...ssl }) : http.createServer()\n\t\t} = wssOptions;\n\t\t\n\t\tsuper({\n\t\t\tWebSocket: InSiteWebSocketServerClient<WSSC>,\n\t\t\t...wssOptions,\n\t\t\tserver\n\t\t});\n\t\t\n\t\tthis.port = typeof port == \"string\" ? Number.parseInt(port) : port;\n\t\t\n\t\tif (props)\n\t\t\tif (typeof props == \"function\")\n\t\t\t\thandleListen = props;\n\t\t\telse\n\t\t\t\tObject.assign(this, props);\n\t\t\n\t\tthis.on(\"connection\", this.handleConnection);\n\t\t\n\t\tthis.on(`client-message:${requestHeaders.request}`, this.handleRequest);\n\t\t\n\t\tserver.listen(this.port, handleListen);\n\t\t\n\t}\n\t\n\ton(event: \"connection\", callback: (this: InSiteWebSocketServer<WSSC>, socket: WSSC, request: http.IncomingMessage) => void): this;\n\ton(event: \"error\", callback: (this: InSiteWebSocketServer<WSSC>, error: Error) => void): this;\n\ton(event: \"headers\", callback: (this: InSiteWebSocketServer<WSSC>, headers: string[], request: http.IncomingMessage) => void): this;\n\ton(event: \"close\" | \"listening\", callback: (this: InSiteWebSocketServer<WSSC>) => void): this;\n\t\n\ton(event: \"client-connect\", listener: (this: InSiteWebSocketServer<WSSC>, wscc: WSSC, request: http.IncomingMessage) => void): this;\n\ton(event: \"client-error\", listener: (this: InSiteWebSocketServer<WSSC>, wscc: WSSC, error: Error | undefined) => void): this;\n\ton(event: `client-${string}`, listener: (this: InSiteWebSocketServer<WSSC>, wscc: WSSC, ...args: any[]) => void): this;\n\t\n\ton(event: string | symbol, listener: (this: InSiteWebSocketServer<WSSC>, ...args: any[]) => void): this;\n\ton(event: string | symbol, listener: (this: InSiteWebSocketServer<WSSC>, ...args: any[]) => void): this {\n\t\treturn super.on(event, listener as unknown as (this: WebSocketServer, ...args: any[]) => void);\n\t}\n\t\n\treadonly isWebSocketServer = true;\n\treadonly isWebSocketServerClient = false;\n\treadonly isWebSocket = false;\n\t\n\treadonly port;\n\t\n\tprivate readonly requestListeners = new Map<string, RequestListener<WSSC>>();\n\t\n\taddRequestListener(kind: string, listener: RequestListener<WSSC>) {\n\t\tthis.requestListeners.set(kind, listener);\n\t\t\n\t\treturn this;\n\t}\n\t\n\tonRequest = this.addRequestListener;\n\t\n\tremoveRequestListener(kind: string) {\n\t\tthis.requestListeners.delete(kind);\n\t\t\n\t\treturn this;\n\t}\n\t\n\toffRequest = this.removeRequestListener;\n\t\n\tprivate handleRequest = async (wssc: WSSC, id: string, kind: string, ...rest: unknown[]) => {\n\t\tconst listener = this.requestListeners.get(kind);\n\t\t\n\t\tlet result;\n\t\tlet requestError = null;\n\t\t\n\t\tif (listener)\n\t\t\ttry {\n\t\t\t\tresult = await listener.call(this, wssc, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\tconst { message, ...restProps } = error;\n\t\t\t\t\trequestError = { message, ...restProps };\n\t\t\t\t}\n\t\t\t}\n\t\telse\n\t\t\trequestError = { message: `Unknown request kind \"${kind}\"` };\n\t\t\n\t\twssc.sendMessage(`${requestHeaders.response}-${id}`, requestError, result);\n\t\t\n\t};\n\t\n\tprivate handleConnection(wssc: WSSC, request: http.IncomingMessage) {\n\t\tif (!(wssc instanceof InSiteWebSocketServerClient)) { /* Compatibility with Bun */\n\t\t\tObject.defineProperties(wssc, {\n\t\t\t\tisConnecting: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isConnecting\")!.get\n\t\t\t\t},\n\t\t\t\tisOpen: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isOpen\")!.get\n\t\t\t\t},\n\t\t\t\tisClosing: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isClosing\")!.get\n\t\t\t\t},\n\t\t\t\tisClosed: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isClosed\")!.get\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tconst { terminate } = wssc as WebSocket;\n\t\t\t\n\t\t\tObject.assign(wssc, {\n\t\t\t\tisWebSocketServerClient: true,\n\t\t\t\tisWebSocketServer: false,\n\t\t\t\tisWebSocket: false,\n\t\t\t\t[defibSymbol]: InSiteWebSocketServerClient.makeDefib.call(wssc),\n\t\t\t\tlatency: 0,\n\t\t\t\t[heartbeatIntervalSymbol]: InSiteWebSocketServerClient.makeHeartbeatInterval.call(wssc),\n\t\t\t\tsendMessage: InSiteWebSocketServerClient.prototype.sendMessage,\n\t\t\t\tsendRequest: InSiteWebSocketServerClient.prototype.sendRequest,\n\t\t\t\tterminate() { /* Workaround Bun's WebSocket#terminate bug */\n\t\t\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\tterminate.call(wssc);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\tObject.assign(wssc, {\n\t\t\twss: this,\n\t\t\tuserAgent: request.headers[\"user-agent\"] ?? \"\",\n\t\t\tremoteAddress: request.headers[\"x-real-ip\"] ?? request.headers[\"x-forwarded-for\"] ?? \"\"\n\t\t});\n\t\t\n\t\twssc[defibSymbol]();\n\t\t\n\t\twssc.on(\"message\", data => this.handleClientMessage(wssc, data));\n\t\twssc.on(\"error\", error => this.handleClientError(wssc, error));\n\t\twssc.on(\"close\", (...args) => this.handleClientClose(wssc, ...args));\n\t\t\n\t\tthis.emit(\"client-connect\", wssc, request);\n\t\t\n\t}\n\t\n\t\n\tprivate handleClientMessage(wssc: WSSC, data: RawData) {\n\t\tconst message = data.toString();\n\t\t\n\t\twssc[defibSymbol]();\n\t\t\n\t\tif (message)\n\t\t\ttry {\n\t\t\t\tconst [ kind, ...rest ] = JSON.parse(message);\n\t\t\t\t\n\t\t\t\twssc.emit(`message:${kind}`, ...rest);\n\t\t\t\tthis.emit(\"client-message\", wssc, kind, ...rest);\n\t\t\t\tthis.emit(`client-message:${kind}`, wssc, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tthis.handleClientError(wssc, error as Error);\n\t\t\t}\n\t\telse if (wssc[pingTsSymbol]) {\n\t\t\twssc.latency = Date.now() - wssc[pingTsSymbol];\n\t\t\tdelete wssc[pingTsSymbol];\n\t\t}\n\t\t\n\t}\n\t\n\tprivate handleClientError(wssc: WSSC, error: Error | Event | undefined) {\n\t\tif (error instanceof Event)\n\t\t\terror = undefined;\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\tconsole.error(\"WebSocketServer Client error\", error);\n\t\t\n\t\tthis.emit(\"client-error\", wssc, error);\n\t\t\n\t}\n\t\n\tprivate handleClientClose(wssc: WSSC, ...args: unknown[]) {\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\tconsole.info(\"WebSocketServer Client closed\", ...args);\n\t\t\n\t\twssc[defibSymbol].clear();\n\t\tclearInterval(wssc[heartbeatIntervalSymbol]);\n\t\t\n\t\tthis.emit(\"client-close\", wssc);\n\t\tthis.emit(\"client-closed\", wssc);\n\t\t\n\t}\n\t\n}\n", "export const heartbeatInterval = 5_000;\nexport const heartbeatGap = 60_000;\n\nexport const requestHeaders = {\n\trequest: \"~r-q\",\n\tresponse: \"~r-s\"\n};\n", "export const heartbeatIntervalSymbol = Symbol(\"heartbeatInterval\");\nexport const defibSymbol = Symbol(\"defib\");\nexport const pingTsSymbol = Symbol(\"pingTs\");\n", "import { ClientRequest, IncomingMessage } from \"node:http\";\nimport { RawData, WebSocket } from \"ws\";\nimport { debounce, uid } from \"@nesvet/n\";\nimport { heartbeatGap, heartbeatInterval, requestHeaders } from \"../common\";\nimport { defibSymbol, heartbeatIntervalSymbol, pingTsSymbol } from \"./symbols\";\nimport { InSiteWebSocketServer } from \"./WebSocketServer\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\nexport class InSiteWebSocketServerClient<WSSC extends InSiteWebSocketServerClient = any> extends WebSocket {\n\ton(event: \"close\", listener: (this: WSSC, code: number, reason: Buffer) => void): this;\n\ton(event: \"error\", listener: (this: WSSC, error: Error) => void): this;\n\ton(event: \"upgrade\", listener: (this: WSSC, request: IncomingMessage) => void): this;\n\ton(event: \"message\", listener: (this: WSSC, data: RawData, isBinary: boolean) => void): this;\n\ton(event: \"open\", listener: (this: WSSC) => void): this;\n\ton(event: \"ping\" | \"pong\", listener: (this: WSSC, data: Buffer) => void): this;\n\ton(event: \"unexpected-response\", listener: (this: WSSC, request: ClientRequest, response: IncomingMessage) => void): this;\n\ton(event: string | symbol, listener: (this: WSSC, ...args: any[]) => void): this;\n\ton(event: string | symbol, listener: (this: WSSC, ...args: any[]) => void): this {\n\t\treturn super.on(event, listener as (this: WebSocket, ...args: any[]) => void);\n\t}\n\t\n\tget isConnecting() {\n\t\treturn this.readyState === this.CONNECTING;\n\t}\n\t\n\tget isOpen() {\n\t\treturn this.readyState === this.OPEN;\n\t}\n\t\n\tget isClosing() {\n\t\treturn this.readyState === this.CLOSING;\n\t}\n\t\n\tget isClosed() {\n\t\treturn this.readyState === this.CLOSED;\n\t}\n\t\n\treadonly isWebSocketServerClient = true;\n\treadonly isWebSocketServer = false;\n\treadonly isWebSocket = false;\n\t\n\twss!: InSiteWebSocketServer<WSSC>;\n\t\n\tuserAgent = \"\";\n\t\n\tremoteAddress = \"\";\n\t\n\t[defibSymbol] = InSiteWebSocketServerClient.makeDefib.call(this);\n\t\n\tlatency = 0;\n\t\n\t[pingTsSymbol]?: number;\n\t\n\t[heartbeatIntervalSymbol] = InSiteWebSocketServerClient.makeHeartbeatInterval.call(this);\n\t\n\tsendMessage(...args: unknown[]) {\n\t\treturn this.send(JSON.stringify(args));\n\t}\n\t\n\tsendRequest(...args: unknown[]) {\n\t\t\n\t\tconst id = uid();\n\t\tconst eventName = `message:${requestHeaders.response}-${id}`;\n\t\t\n\t\tif (typeof args.at(-1) == \"function\") {\n\t\t\tthis.once(eventName, args.splice(-1, 1)[0] as () => void);\n\t\t\tthis.sendMessage(requestHeaders.request, id, ...args);\n\t\t\t\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t\n\t\t\tthis.once(eventName, (error, result) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tconst { message, ...restProps } = error;\n\t\t\t\t\treject(Object.assign(new Error(message), restProps));\n\t\t\t\t} else\n\t\t\t\t\tresolve(result);\n\t\t\t\t\n\t\t\t});\n\t\t\tthis.sendMessage(requestHeaders.request, id, ...args);\n\t\t\t\n\t\t});\n\t}\n\t\n\t\n\tstatic makeDefib(this: InSiteWebSocketServerClient<any>) {\n\t\treturn debounce(() => this.terminate(), heartbeatInterval + heartbeatGap);\n\t}\n\t\n\tstatic makeHeartbeatInterval(this: InSiteWebSocketServerClient<any>) {\n\t\treturn setInterval(() => {\n\t\t\t\n\t\t\tthis[pingTsSymbol] = Date.now();\n\t\t\tthis.send(\"\");\n\t\t\t\n\t\t}, heartbeatInterval);\n\t}\n\t\n}\n"],
5
- "mappings": "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",
6
- "names": ["fs", "http", "https", "WebSocketServer", "requestHeaders", "heartbeatIntervalSymbol", "defibSymbol", "pingTsSymbol", "WebSocket", "debounce", "uid", "InSiteWebSocketServerClient", "_InSiteWebSocketServerClient", "WebSocket", "event", "listener", "defibSymbol", "pingTsSymbol", "heartbeatIntervalSymbol", "args", "id", "uid", "eventName", "requestHeaders", "resolve", "reject", "error", "result", "message", "restProps", "debounce", "InSiteWebSocketServer", "WebSocketServer", "options", "props", "handleListen", "ssl", "port", "wssOptions", "fs", "server", "https", "http", "InSiteWebSocketServerClient", "requestHeaders", "event", "listener", "kind", "wssc", "id", "rest", "result", "requestError", "error", "message", "restProps", "request", "terminate", "defibSymbol", "heartbeatIntervalSymbol", "data", "args", "pingTsSymbol"]
3
+ "sources": ["../../src/server/WebSocketServer.ts", "../../src/common.ts", "../../src/server/symbols.ts", "../../src/server/utils.ts", "../../src/server/WebSocketServerClient.ts", "../../../../../@nesvet/npm/n/src/noop.ts", "../../../../../@nesvet/npm/n/src/debounce.ts", "../../../../../@nesvet/npm/n/src/howmuch.ts", "../../../../../@nesvet/npm/n/src/uid.ts"],
4
+ "sourcesContent": ["import fs from \"node:fs\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport { type RawData, type WebSocket, WebSocketServer } from \"ws\";\nimport { requestHeaders } from \"../common\";\nimport { defibSymbol, heartbeatIntervalSymbol, pingTsSymbol } from \"./symbols\";\nimport { getRemoteAddress } from \"./utils\";\nimport { InSiteWebSocketServerClient } from \"./WebSocketServerClient\";\nimport type { Options } from \"./types\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\ntype RequestListener<WSSC extends InSiteWebSocketServerClient> = (wscc: WSSC, ...args: any[]) => any | Promise<any>;\n\n\nexport class InSiteWebSocketServer<WSSC extends InSiteWebSocketServerClient = InSiteWebSocketServerClient> extends WebSocketServer<typeof InSiteWebSocketServerClient> {\n\tconstructor(options: Options<WSSC>, props?: Record<string, unknown>, handleListen?: (() => void)) {\n\t\tconst {\n\t\t\tssl,\n\t\t\tport,\n\t\t\t...wssOptions\n\t\t} = options;\n\t\t\n\t\tif (ssl) {\n\t\t\tif (typeof ssl.cert == \"string\" && !/^-{3,}BEGIN/.test(ssl.cert))\n\t\t\t\ttry {\n\t\t\t\t\tssl.cert = fs.readFileSync(ssl.cert);\n\t\t\t\t} catch {}\n\t\t\tif (typeof ssl.key == \"string\" && !/^-{3,}BEGIN/.test(ssl.key))\n\t\t\t\ttry {\n\t\t\t\t\tssl.key = fs.readFileSync(ssl.key);\n\t\t\t\t} catch {}\n\t\t}\n\t\t\n\t\tconst {\n\t\t\tserver = ssl ? https.createServer({ ...ssl }) : http.createServer()\n\t\t} = wssOptions;\n\t\t\n\t\tsuper({\n\t\t\tWebSocket: InSiteWebSocketServerClient<WSSC>,\n\t\t\t...wssOptions,\n\t\t\tserver\n\t\t});\n\t\t\n\t\tthis.port = typeof port == \"string\" ? Number.parseInt(port) : port;\n\t\t\n\t\tif (props)\n\t\t\tif (typeof props == \"function\")\n\t\t\t\thandleListen = props;\n\t\t\telse\n\t\t\t\tObject.assign(this, props);\n\t\t\n\t\tthis.on(\"connection\", this.handleConnection);\n\t\t\n\t\tthis.on(`client-message:${requestHeaders.request}`, this.handleRequest);\n\t\t\n\t\tserver.listen(this.port, handleListen);\n\t\t\n\t}\n\t\n\ton(event: \"connection\", callback: (this: InSiteWebSocketServer<WSSC>, socket: WSSC, request: http.IncomingMessage) => void): this;\n\ton(event: \"error\", callback: (this: InSiteWebSocketServer<WSSC>, error: Error) => void): this;\n\ton(event: \"headers\", callback: (this: InSiteWebSocketServer<WSSC>, headers: string[], request: http.IncomingMessage) => void): this;\n\ton(event: \"close\" | \"listening\", callback: (this: InSiteWebSocketServer<WSSC>) => void): this;\n\t\n\ton(event: \"client-connect\", listener: (this: InSiteWebSocketServer<WSSC>, wscc: WSSC, request: http.IncomingMessage) => void): this;\n\ton(event: \"client-error\", listener: (this: InSiteWebSocketServer<WSSC>, wscc: WSSC, error: Error | undefined) => void): this;\n\ton(event: `client-${string}`, listener: (this: InSiteWebSocketServer<WSSC>, wscc: WSSC, ...args: any[]) => void): this;\n\t\n\ton(event: string | symbol, listener: (this: InSiteWebSocketServer<WSSC>, ...args: any[]) => void): this;\n\ton(event: string | symbol, listener: (this: InSiteWebSocketServer<WSSC>, ...args: any[]) => void): this {\n\t\treturn super.on(event, listener as unknown as (this: WebSocketServer, ...args: any[]) => void);\n\t}\n\t\n\treadonly isWebSocketServer = true;\n\treadonly isWebSocketServerClient = false;\n\treadonly isWebSocket = false;\n\t\n\treadonly port;\n\t\n\tprivate readonly requestListeners = new Map<string, RequestListener<WSSC>>();\n\t\n\taddRequestListener(kind: string, listener: RequestListener<WSSC>) {\n\t\tthis.requestListeners.set(kind, listener);\n\t\t\n\t\treturn this;\n\t}\n\t\n\tonRequest = this.addRequestListener;\n\t\n\tremoveRequestListener(kind: string) {\n\t\tthis.requestListeners.delete(kind);\n\t\t\n\t\treturn this;\n\t}\n\t\n\toffRequest = this.removeRequestListener;\n\t\n\tprivate handleRequest = async (wssc: WSSC, id: string, kind: string, ...rest: unknown[]) => {\n\t\tconst listener = this.requestListeners.get(kind);\n\t\t\n\t\tlet result;\n\t\tlet requestError = null;\n\t\t\n\t\tif (listener)\n\t\t\ttry {\n\t\t\t\tresult = await listener.call(this, wssc, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\tconst { message, ...restProps } = error;\n\t\t\t\t\trequestError = { message, ...restProps };\n\t\t\t\t}\n\t\t\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\t\t\tconsole.error(`WebSocketServer request \"${kind}\" (${id}) error: `, error);\n\t\t\t}\n\t\telse\n\t\t\trequestError = { message: `Unknown request kind \"${kind}\"` };\n\t\t\n\t\twssc.sendMessage(`${requestHeaders.response}-${id}`, requestError, result);\n\t\t\n\t};\n\t\n\tprivate handleConnection(wssc: WSSC, request: http.IncomingMessage) {\n\t\tif (!(wssc instanceof InSiteWebSocketServerClient)) { /* Compatibility with Bun */\n\t\t\tObject.defineProperties(wssc, {\n\t\t\t\tisConnecting: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isConnecting\")!.get\n\t\t\t\t},\n\t\t\t\tisOpen: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isOpen\")!.get\n\t\t\t\t},\n\t\t\t\tisClosing: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isClosing\")!.get\n\t\t\t\t},\n\t\t\t\tisClosed: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isClosed\")!.get\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tconst { terminate } = wssc as WebSocket;\n\t\t\t\n\t\t\tObject.assign(wssc, {\n\t\t\t\tisWebSocketServerClient: true,\n\t\t\t\tisWebSocketServer: false,\n\t\t\t\tisWebSocket: false,\n\t\t\t\t[defibSymbol]: InSiteWebSocketServerClient.makeDefib.call(wssc),\n\t\t\t\tlatency: 0,\n\t\t\t\t[heartbeatIntervalSymbol]: InSiteWebSocketServerClient.makeHeartbeatInterval.call(wssc),\n\t\t\t\tsendMessage: InSiteWebSocketServerClient.prototype.sendMessage,\n\t\t\t\tsendRequest: InSiteWebSocketServerClient.prototype.sendRequest,\n\t\t\t\tterminate() { /* Workaround Bun's WebSocket#terminate bug */\n\t\t\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\tterminate.call(wssc);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\tObject.assign(wssc, {\n\t\t\twss: this,\n\t\t\tuserAgent: request.headers[\"user-agent\"] ?? \"\",\n\t\t\tremoteAddress: getRemoteAddress(request)\n\t\t});\n\t\t\n\t\twssc[defibSymbol]();\n\t\t\n\t\twssc.on(\"message\", data => this.handleClientMessage(wssc, data));\n\t\twssc.on(\"error\", error => this.handleClientError(wssc, error));\n\t\twssc.on(\"close\", (...args) => this.handleClientClose(wssc, ...args));\n\t\t\n\t\tthis.emit(\"client-connect\", wssc, request);\n\t\t\n\t}\n\t\n\t\n\tprivate handleClientMessage(wssc: WSSC, data: RawData) {\n\t\tconst message = data.toString();\n\t\t\n\t\twssc[defibSymbol]();\n\t\t\n\t\tif (message)\n\t\t\ttry {\n\t\t\t\tconst [ kind, ...rest ] = JSON.parse(message);\n\t\t\t\t\n\t\t\t\twssc.emit(`message:${kind}`, ...rest);\n\t\t\t\tthis.emit(\"client-message\", wssc, kind, ...rest);\n\t\t\t\tthis.emit(`client-message:${kind}`, wssc, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tthis.handleClientError(wssc, error as Error);\n\t\t\t}\n\t\telse if (wssc[pingTsSymbol]) {\n\t\t\twssc.latency = Date.now() - wssc[pingTsSymbol];\n\t\t\tdelete wssc[pingTsSymbol];\n\t\t}\n\t\t\n\t}\n\t\n\tprivate handleClientError(wssc: WSSC, error: Error | Event | undefined) {\n\t\tif (error instanceof Event)\n\t\t\terror = undefined;\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\tconsole.error(\"WebSocketServer Client error\", error);\n\t\t\n\t\tthis.emit(\"client-error\", wssc, error);\n\t\t\n\t}\n\t\n\tprivate handleClientClose(wssc: WSSC, code: number, reason: Buffer) {\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\tconsole.info(`WebSocketServer Client closed ${code ? `with code ${code}` : \"\"} ${code && reason ? \"and \" : \"\"}${reason ? `reason \"${reason.toString()}\"` : \"\"}`);\n\t\t\n\t\twssc[defibSymbol].clear();\n\t\tclearInterval(wssc[heartbeatIntervalSymbol]);\n\t\t\n\t\tthis.emit(\"client-close\", wssc);\n\t\tthis.emit(\"client-closed\", wssc);\n\t\t\n\t}\n\t\n}\n", "export const heartbeatInterval = 5_000;\nexport const heartbeatGap = 60_000;\n\nexport const requestHeaders = {\n\trequest: \"~r-q\",\n\tresponse: \"~r-s\"\n};\n", "export const heartbeatIntervalSymbol = Symbol(\"heartbeatInterval\");\nexport const defibSymbol = Symbol(\"defib\");\nexport const pingTsSymbol = Symbol(\"pingTs\");\n", "import type { IncomingMessage } from \"node:http\";\n\n\nconst headersThatMayContainRemoteAddress = [\n\t\"forwarded\",\n\t\"x-forwarded\",\n\t\"forwarded-for\",\n\t\"x-forwarded-for\",\n\t\"x-real-ip\",\n\t\"cf-connecting-ip\",\n\t\"do-connecting-ip\",\n\t\"x-appengine-user-ip\",\n\t\"true-client-ip\",\n\t\"fastly-client-ip\",\n\t\"client-ip\",\n\t\"x-client-ip\",\n\t\"x-proxyuser-ip\",\n\t\"x-cluster-client-ip\"\n] as const;\n\nlet headerWithRemoteAddress: null | true | typeof headersThatMayContainRemoteAddress[number] | undefined;\n\nconst remoteAddressRegExp = /^.*?((?:\\d{1,3}\\.){3}\\d{1,3}).*$/;\n\nexport function getRemoteAddress(request: IncomingMessage) {\n\t\n\tif (headerWithRemoteAddress === undefined) {\n\t\tfor (const headerName of headersThatMayContainRemoteAddress) {\n\t\t\tconst header = request.headers[headerName];\n\t\t\tif (typeof header == \"string\" && remoteAddressRegExp.test(header))\n\t\t\t\theaderWithRemoteAddress = headerName;\n\t\t}\n\t\theaderWithRemoteAddress ??=\n\t\t\trequest.socket.remoteAddress && remoteAddressRegExp.test(request.socket.remoteAddress) ?\n\t\t\t\ttrue :\n\t\t\t\tnull;\n\t}\n\t\n\tswitch (headerWithRemoteAddress) {\n\t\tcase true:\n\t\t\treturn request.socket.remoteAddress;\n\t\t\n\t\tcase null:\n\t\t\treturn \"127.0.0.1\";\n\t\t\n\t\tdefault:\n\t\t\treturn (request.headers[headerWithRemoteAddress] as string).replace(remoteAddressRegExp, \"$1\");\n\t}\n}\n", "import { ClientRequest, IncomingMessage } from \"node:http\";\nimport { RawData, WebSocket } from \"ws\";\nimport { debounce, uid } from \"@nesvet/n\";\nimport { heartbeatGap, heartbeatInterval, requestHeaders } from \"../common\";\nimport { defibSymbol, heartbeatIntervalSymbol, pingTsSymbol } from \"./symbols\";\nimport { InSiteWebSocketServer } from \"./WebSocketServer\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\nexport class InSiteWebSocketServerClient<WSSC extends InSiteWebSocketServerClient = any> extends WebSocket {\n\ton(event: \"close\", listener: (this: WSSC, code: number, reason: Buffer) => void): this;\n\ton(event: \"error\", listener: (this: WSSC, error: Error) => void): this;\n\ton(event: \"upgrade\", listener: (this: WSSC, request: IncomingMessage) => void): this;\n\ton(event: \"message\", listener: (this: WSSC, data: RawData, isBinary: boolean) => void): this;\n\ton(event: \"open\", listener: (this: WSSC) => void): this;\n\ton(event: \"ping\" | \"pong\", listener: (this: WSSC, data: Buffer) => void): this;\n\ton(event: \"unexpected-response\", listener: (this: WSSC, request: ClientRequest, response: IncomingMessage) => void): this;\n\ton(event: string | symbol, listener: (this: WSSC, ...args: any[]) => void): this;\n\ton(event: string | symbol, listener: (this: WSSC, ...args: any[]) => void): this {\n\t\treturn super.on(event, listener as (this: WebSocket, ...args: any[]) => void);\n\t}\n\t\n\tget isConnecting() {\n\t\treturn this.readyState === this.CONNECTING;\n\t}\n\t\n\tget isOpen() {\n\t\treturn this.readyState === this.OPEN;\n\t}\n\t\n\tget isClosing() {\n\t\treturn this.readyState === this.CLOSING;\n\t}\n\t\n\tget isClosed() {\n\t\treturn this.readyState === this.CLOSED;\n\t}\n\t\n\treadonly isWebSocketServerClient = true;\n\treadonly isWebSocketServer = false;\n\treadonly isWebSocket = false;\n\t\n\twss!: InSiteWebSocketServer<WSSC>;\n\t\n\tuserAgent = \"\";\n\t\n\tremoteAddress = \"\";\n\t\n\t[defibSymbol] = InSiteWebSocketServerClient.makeDefib.call(this);\n\t\n\tlatency = 0;\n\t\n\t[pingTsSymbol]?: number;\n\t\n\t[heartbeatIntervalSymbol] = InSiteWebSocketServerClient.makeHeartbeatInterval.call(this);\n\t\n\tsendMessage(...args: unknown[]) {\n\t\treturn this.send(JSON.stringify(args));\n\t}\n\t\n\tsendRequest(...args: unknown[]) {\n\t\t\n\t\tconst id = uid();\n\t\tconst eventName = `message:${requestHeaders.response}-${id}`;\n\t\t\n\t\tif (typeof args.at(-1) == \"function\") {\n\t\t\tthis.once(eventName, args.splice(-1, 1)[0] as () => void);\n\t\t\tthis.sendMessage(requestHeaders.request, id, ...args);\n\t\t\t\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t\n\t\t\tthis.once(eventName, (error, result) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tconst { message, ...restProps } = error;\n\t\t\t\t\treject(Object.assign(new Error(message), restProps));\n\t\t\t\t} else\n\t\t\t\t\tresolve(result);\n\t\t\t\t\n\t\t\t});\n\t\t\tthis.sendMessage(requestHeaders.request, id, ...args);\n\t\t\t\n\t\t});\n\t}\n\t\n\t\n\tstatic makeDefib(this: InSiteWebSocketServerClient<any>) {\n\t\treturn debounce(() => this.terminate(), heartbeatInterval + heartbeatGap);\n\t}\n\t\n\tstatic makeHeartbeatInterval(this: InSiteWebSocketServerClient<any>) {\n\t\treturn setInterval(() => {\n\t\t\t\n\t\t\tthis[pingTsSymbol] = Date.now();\n\t\t\tthis.send(\"\");\n\t\t\t\n\t\t}, heartbeatInterval);\n\t}\n\t\n}\n", "export function noop() { /**/ }\n", "import { noop } from \"./noop.js\";\n\n\ntype Callback<Result> = (...args: unknown[]) => Result;\ntype FunctionOrBoolean = (() => unknown) | boolean;\ntype Options = { leading?: FunctionOrBoolean; maxWait?: number; trailing?: FunctionOrBoolean };\ntype NumberOrUndefined = number | undefined;\n\ntype DebouncedFunction<Result> = {\n\t(this: unknown, ..._args: unknown[]): Promise<Result>;\n};\n\nexport type Debounced<Result> = {\n\tcallback: Callback<Result>;\n\tpromise: {\n\t\tisResolved: boolean;\n\t} & Promise<unknown>;\n\tresolve: (value: Result) => void;\n\trun(): Promise<Result>;\n\tclear(shouldRun?: boolean): Promise<void>;\n} & DebouncedFunction<Result>;\n\n\nexport function debounce<Result>(callback: Callback<Result>, limit = 0, options: Options = {}) {\n\tlet { leading = false, trailing = true } = options;\n\tconst { maxWait = Infinity } = options;\n\t\n\tlet timeout: NumberOrUndefined;\n\tlet maxWaitTimeout: NumberOrUndefined;\n\tlet end: NumberOrUndefined;\n\tlet context: unknown;\n\tlet args: unknown[];\n\tlet initial: FunctionOrBoolean;\n\tlet final: FunctionOrBoolean;\n\tlet result: Result;\n\t\n\tconst expired = async () => {\n\t\t\n\t\tconst n = Date.now();\n\t\t\n\t\tif (n >= end!) {\n\t\t\ttimeout = undefined;\n\t\t\tend = undefined;\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\tif (typeof final == \"function\")\n\t\t\t\tawait final();\n\t\t\tdebounced.resolve(result);\n\t\t\tdebounced.promise.isResolved = true;\n\t\t\tinitial = leading;\n\t\t} else {\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = setTimeout(expired, end! - n);\n\t\t}\n\t\t\n\t};\n\t\n\tconst maxWaitExpired = Number.isFinite(maxWait) ? () => {\n\t\t\n\t\tif (final === run)\n\t\t\tfinal = false;\n\t\trun();\n\t\tmaxWaitTimeout = setTimeout(maxWaitExpired as TimerHandler, maxWait);\n\t\t\n\t} : null;\n\t\n\tasync function run() {\n\t\treturn (result = await callback.apply(context, args));\n\t}\n\t\n\tif (leading && typeof leading == \"boolean\")\n\t\tleading = run;\n\tinitial = leading;\n\t\n\tif (trailing && typeof trailing == \"boolean\")\n\t\ttrailing = run;\n\tfinal = trailing;\n\t\n\tconst debounced: Debounced<Result> = Object.assign(function (..._args) {\n\t\targs = _args;\n\t\tcontext = this;// eslint-disable-line no-invalid-this\n\t\t\n\t\tend = Date.now() + limit;\n\t\tfinal = trailing;\n\t\t\n\t\tif (debounced.promise.isResolved)\n\t\t\tdebounced.promise = Object.assign(new Promise(resolve => {\n\t\t\t\tdebounced.resolve = resolve;\n\t\t\t\t\n\t\t\t\tif (typeof initial == \"function\") {\n\t\t\t\t\tinitial();\n\t\t\t\t\tinitial = false;\n\t\t\t\t\tif (final === run)\n\t\t\t\t\t\tfinal = false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!timeout) {\n\t\t\t\t\ttimeout = setTimeout(expired, limit);\n\t\t\t\t\tif (maxWaitExpired)\n\t\t\t\t\t\tmaxWaitTimeout = setTimeout(maxWaitExpired, maxWait);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}), {\n\t\t\t\tisResolved: false\n\t\t\t});\n\t\t\n\t\treturn debounced.promise;\n\t} as DebouncedFunction<Result>, {\n\t\tcallback,\n\t\tpromise: Object.assign(Promise.resolve(), {\n\t\t\tisResolved: true\n\t\t}),\n\t\tresolve: noop,\n\t\trun,\n\t\tclear: async (shouldRun?: boolean) => {\n\t\t\t\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = undefined;\n\t\t\t\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\t\n\t\t\tdebounced.promise.isResolved = true;\n\t\t\tdebounced.resolve(shouldRun ? await run() : result);\n\t\t\t\n\t\t}\n\t});\n\t\n\treturn debounced;\n}\n\n\ndebounce.noop = Object.assign(() => { /**/ }, {\n\tcallback: noop,\n\tpromise: Object.assign(Promise.resolve(), {\n\t\tisResolved: true\n\t}),\n\tresolve: noop,\n\trun: noop,\n\tclear: noop\n}) as unknown as Debounced<void>;\n\n\nexport function throttle<Result>(callback: Callback<Result>, limit?: number, options?: Options) {\n\treturn debounce(callback, limit, {\n\t\tmaxWait: limit,\n\t\tleading: true,\n\t\ttrailing: true,\n\t\t...options\n\t});\n}\n", "export function howmuch(number: [] | number, one: string, two: string, five: boolean | string, shouldPrintNumber = true) {\n\tif (Array.isArray(number))\n\t\tnumber = number.length;\n\t\n\tif (typeof five != \"string\") {\n\t\tshouldPrintNumber = five ?? true;\n\t\tfive = two;\n\t}\n\t\n\t\n\treturn (shouldPrintNumber ? `${number}\u00A0` : \"\") + howmuch.raw(number, one, two, five);\n}\n\nhowmuch.raw = (number: number, one: string, two: string, five = two) => {\n\tnumber = Math.abs(number);\n\tconst u = number % 10;\n\tconst d = number % 100;\n\t\n\treturn (\n\t\t(u === 1 && d !== 11) ?\n\t\t\tone :\n\t\t\t((u >= 2 && u <= 4) && !(d >= 12 && d <= 15)) ?\n\t\t\t\ttwo :\n\t\t\t\tfive\n\t);\n};\n", "export function uid(prefix: string | undefined = \"\", postfix: string | undefined = \"\") {\n\treturn `${prefix}${Date.now().toString(36)}${Math.round(Math.random() * Number.MAX_SAFE_INTEGER).toString(36)}${postfix}`;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["fs", "http", "https", "WebSocketServer", "requestHeaders", "heartbeatIntervalSymbol", "defibSymbol", "pingTsSymbol", "headersThatMayContainRemoteAddress", "headerWithRemoteAddress", "remoteAddressRegExp", "getRemoteAddress", "request", "headerName", "header", "WebSocket", "noop", "debounce", "callback", "limit", "options", "leading", "trailing", "maxWait", "timeout", "maxWaitTimeout", "end", "context", "args", "initial", "final", "result", "expired", "n", "debounced", "maxWaitExpired", "run", "_args", "resolve", "noop", "shouldRun", "howmuch", "number", "one", "two", "five", "shouldPrintNumber", "u", "d", "uid", "prefix", "postfix", "InSiteWebSocketServerClient", "_InSiteWebSocketServerClient", "WebSocket", "event", "listener", "defibSymbol", "pingTsSymbol", "heartbeatIntervalSymbol", "args", "id", "uid", "eventName", "requestHeaders", "resolve", "reject", "error", "result", "message", "restProps", "debounce", "InSiteWebSocketServer", "WebSocketServer", "options", "props", "handleListen", "ssl", "port", "wssOptions", "fs", "server", "https", "http", "InSiteWebSocketServerClient", "requestHeaders", "event", "listener", "kind", "wssc", "id", "rest", "result", "requestError", "error", "message", "restProps", "request", "terminate", "defibSymbol", "heartbeatIntervalSymbol", "getRemoteAddress", "data", "args", "pingTsSymbol", "code", "reason"]
7
7
  }
@@ -0,0 +1,3 @@
1
+ import type { IncomingMessage } from "node:http";
2
+ export declare function getRemoteAddress(request: IncomingMessage): string | undefined;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAwBjD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,sBAwBxD"}
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "insite-ws",
3
- "version": "2.0.16",
3
+ "version": "2.0.18",
4
4
  "description": "inSite WebSockets",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  "./server": "./dist/server/index.js",
8
8
  "./client": "./dist/client/index.js"
9
9
  },
10
- "packageManager": "bun@1.1.25",
10
+ "packageManager": "bun@1.1.36",
11
11
  "scripts": {
12
12
  "test": "echo \"Error: no test specified\" && exit 1",
13
- "build": "bun .conveyer.ts",
13
+ "build": "bun .conveyer.js",
14
14
  "postbuild": "tsc -p ."
15
15
  },
16
16
  "repository": {
@@ -25,15 +25,15 @@
25
25
  "author": "Eugene Nesvetaev <dev@nesvet.dev> (https://nesvet.dev/)",
26
26
  "license": "MIT",
27
27
  "dependencies": {
28
- "@nesvet/n": "^1.1.3",
28
+ "@nesvet/n": "^1.1.7",
29
29
  "eventemitter3": "^5.0.1",
30
30
  "ws": "^8.18.0"
31
31
  },
32
32
  "devDependencies": {
33
- "@nesvet/conveyer": "^2.2.4",
34
- "@nesvet/eslint-config": "^2.0.24",
35
- "@types/node": "^22.5.0",
36
- "@types/ws": "^8.5.12",
37
- "typescript": "^5.5.4"
33
+ "@nesvet/conveyer": "^2.2.5",
34
+ "@nesvet/eslint-config": "^2.0.34",
35
+ "@types/node": "^22.10.2",
36
+ "@types/ws": "^8.5.13",
37
+ "typescript": "^5.7.2"
38
38
  }
39
39
  }
package/.conveyer.ts DELETED
@@ -1,37 +0,0 @@
1
- import path from "node:path";
2
- import { Conveyer, ESBuild } from "@nesvet/conveyer";
3
-
4
-
5
- const distDir = "dist";
6
-
7
- const common = {
8
- format: "esm",
9
- sourcemap: true
10
- };
11
-
12
-
13
- new Conveyer([
14
-
15
- new ESBuild({
16
- title: "Server",
17
- entryPoints: [ "src/server/index.ts" ],
18
- outfile: path.resolve(distDir, "server/index.js"),
19
- external: [ true, "insite-*" ],
20
- platform: "node",
21
- target: "node20",
22
- ...common
23
- }),
24
-
25
- new ESBuild({
26
- title: "Client",
27
- entryPoints: [ "src/client/index.ts" ],
28
- outfile: path.resolve(distDir, "client/index.js"),
29
- external: true,
30
- platform: "neutral",
31
- target: "es2020",
32
- ...common
33
- })
34
-
35
- ], {
36
- initialCleanup: distDir
37
- });