insite-ws 2.0.15 → 2.0.16

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,6 +1,13 @@
1
1
  import EventEmitter from "eventemitter3";
2
- import { Options } from "./types";
3
- export type RequestListener = (...args: any[]) => any | Promise<any>;
2
+ export type Options = {
3
+ url?: string;
4
+ name?: string;
5
+ protocols?: string[];
6
+ immediately?: boolean;
7
+ autoReconnect?: boolean;
8
+ on?: Record<string, (...args: any[]) => void>;
9
+ };
10
+ type RequestListener = (...args: any[]) => any | Promise<any>;
4
11
  export declare class InSiteWebSocket extends EventEmitter {
5
12
  constructor(url: string, options?: Options);
6
13
  readonly isWebSocket = true;
@@ -40,4 +47,5 @@ export declare class InSiteWebSocket extends EventEmitter {
40
47
  private handleRequest;
41
48
  static defib(this: InSiteWebSocket): void;
42
49
  }
50
+ export {};
43
51
  //# sourceMappingURL=WebSocket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocket.d.ts","sourceRoot":"","sources":["../../src/client/WebSocket.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAUlC,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAGrE,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;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,2 +1,2 @@
1
- var S=Object.defineProperty;var k=(c,o,e)=>o in c?S(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 v from"eventemitter3";import{debounce as g,noop as p,uid as q}from"@nesvet/n";var u={request:"~r-q",response:"~r-s"};var E=2e3,R=0,b=new WeakMap,f=class c extends v{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",g(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),E))});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=(R++).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{f as InSiteWebSocket};
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};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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\";\nimport { Options } from \"./types\";\n\n\nconst reconnectTimeout = 2000;\n\nlet i = 0;\n\nconst webSocketUrlMap = new WeakMap<WebSocket, string>();\n\n\nexport type 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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",
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
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"]
7
7
  }
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "insite-ws",
3
- "version": "2.0.15",
3
+ "version": "2.0.16",
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.23",
10
+ "packageManager": "bun@1.1.25",
11
11
  "scripts": {
12
12
  "test": "echo \"Error: no test specified\" && exit 1",
13
13
  "build": "bun .conveyer.ts",
@@ -32,7 +32,7 @@
32
32
  "devDependencies": {
33
33
  "@nesvet/conveyer": "^2.2.4",
34
34
  "@nesvet/eslint-config": "^2.0.24",
35
- "@types/node": "^22.3.0",
35
+ "@types/node": "^22.5.0",
36
36
  "@types/ws": "^8.5.12",
37
37
  "typescript": "^5.5.4"
38
38
  }
package/bun.lockb DELETED
Binary file
@@ -1,9 +0,0 @@
1
- export type Options = {
2
- url?: string;
3
- name?: string;
4
- protocols?: string[];
5
- immediately?: boolean;
6
- autoReconnect?: boolean;
7
- on?: Record<string, (...args: unknown[]) => void>;
8
- };
9
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,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,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC;CAClD,CAAC"}