insite-ws 2.0.10 → 2.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bun.lockb +0 -0
- package/dist/client/WebSocket.d.ts +14 -3
- package/dist/client/WebSocket.d.ts.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +3 -3
- package/dist/common.d.ts +0 -1
- package/dist/common.d.ts.map +1 -1
- package/dist/server/WebSocketServer.d.ts +24 -12
- package/dist/server/WebSocketServer.d.ts.map +1 -1
- package/dist/server/WebSocketServerClient.d.ts +17 -5
- package/dist/server/WebSocketServerClient.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +3 -3
- package/dist/server/types.d.ts +7 -3
- package/dist/server/types.d.ts.map +1 -1
- package/package.json +2 -2
package/bun.lockb
CHANGED
|
Binary file
|
|
@@ -1,32 +1,43 @@
|
|
|
1
1
|
import EventEmitter from "eventemitter3";
|
|
2
|
-
import { type RequestListener } from "../common";
|
|
3
2
|
import { Options } from "./types";
|
|
3
|
+
export type RequestListener = (...args: any[]) => any | Promise<any>;
|
|
4
4
|
export declare class InSiteWebSocket extends EventEmitter {
|
|
5
|
-
#private;
|
|
6
5
|
constructor(url: string, options?: Options);
|
|
7
6
|
readonly isWebSocket = true;
|
|
8
7
|
readonly isWebSocketServer = false;
|
|
9
8
|
readonly isWebSocketServerClient = false;
|
|
10
9
|
url: string;
|
|
11
|
-
name: string;
|
|
10
|
+
readonly name: string;
|
|
12
11
|
protocols?: string[] | undefined;
|
|
13
12
|
autoReconnect: boolean;
|
|
14
13
|
send?(data: ArrayBufferLike | ArrayBufferView | Blob | string): void;
|
|
15
14
|
webSocket: null | WebSocket;
|
|
15
|
+
private defib;
|
|
16
16
|
get isConnecting(): boolean | null;
|
|
17
17
|
get isOpen(): boolean | null;
|
|
18
18
|
get isClosing(): boolean | null;
|
|
19
19
|
get isClosed(): boolean | null;
|
|
20
|
+
private openResolve?;
|
|
21
|
+
private openReject?;
|
|
22
|
+
private handleWebSocketOpen;
|
|
23
|
+
private handleWebSocketMessage;
|
|
24
|
+
private handleWebSocketError;
|
|
25
|
+
private reconnectTimeout?;
|
|
26
|
+
private handleWebSocketClose;
|
|
20
27
|
open(options?: Options): Promise<unknown>;
|
|
21
28
|
connect: (options?: Options) => Promise<unknown>;
|
|
22
29
|
close(code?: number, reason?: string): Promise<unknown>;
|
|
23
30
|
disconnect: (code?: number, reason?: string) => Promise<unknown>;
|
|
31
|
+
private queue;
|
|
32
|
+
private releaseQueue;
|
|
24
33
|
sendMessage(...args: unknown[]): void;
|
|
25
34
|
sendRequest(...args: unknown[]): this | Promise<unknown>;
|
|
35
|
+
private requestListeners;
|
|
26
36
|
addRequestListener(kind: string, listener: RequestListener): this;
|
|
27
37
|
onRequest: (kind: string, listener: RequestListener) => this;
|
|
28
38
|
removeRequestListener(kind: string): this;
|
|
29
39
|
offRequest: (kind: string) => this;
|
|
40
|
+
private handleRequest;
|
|
30
41
|
static defib(this: InSiteWebSocket): void;
|
|
31
42
|
}
|
|
32
43
|
//# 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;
|
|
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"}
|
package/dist/client/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
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};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/client/index.js.map
CHANGED
|
@@ -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 {
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["EventEmitter", "debounce", "noop", "uid", "requestHeaders", "reconnectTimeout", "i", "webSocketUrlMap", "
|
|
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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",
|
|
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/dist/common.d.ts
CHANGED
package/dist/common.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AACvC,eAAO,MAAM,YAAY,QAAS,CAAC;AAEnC,eAAO,MAAM,cAAc;;;CAG1B,CAAC
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AACvC,eAAO,MAAM,YAAY,QAAS,CAAC;AAEnC,eAAO,MAAM,cAAc;;;CAG1B,CAAC"}
|
|
@@ -1,22 +1,34 @@
|
|
|
1
1
|
import http from "node:http";
|
|
2
|
-
import
|
|
3
|
-
import { type RequestListener } from "../common";
|
|
4
|
-
import { Options } from "./types";
|
|
2
|
+
import type { WebSocketServer } from "ws";
|
|
5
3
|
import { InSiteWebSocketServerClient } from "./WebSocketServerClient";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
import type { Options } from "./types";
|
|
5
|
+
type RequestListener<WSSC extends InSiteWebSocketServerClient> = (wscc: WSSC, ...args: any[]) => any | Promise<any>;
|
|
6
|
+
declare abstract class PrepareWebSocketServer<WSSC extends InSiteWebSocketServerClient> extends WebSocketServer<typeof InSiteWebSocketServerClient> {
|
|
7
|
+
on(event: "connection", callback: (this: InSiteWebSocketServer<WSSC>, socket: WSSC, request: http.IncomingMessage) => void): this;
|
|
8
|
+
on(event: "error", callback: (this: InSiteWebSocketServer<WSSC>, error: Error) => void): this;
|
|
9
|
+
on(event: "headers", callback: (this: InSiteWebSocketServer<WSSC>, headers: string[], request: http.IncomingMessage) => void): this;
|
|
10
|
+
on(event: "close" | "listening", callback: (this: InSiteWebSocketServer<WSSC>) => void): this;
|
|
11
|
+
on(event: "client-connect", listener: (this: InSiteWebSocketServer<WSSC>, wscc: WSSC, request: http.IncomingMessage) => void): this;
|
|
12
|
+
on(event: "client-error", listener: (this: InSiteWebSocketServer<WSSC>, wscc: WSSC, error: Error | undefined) => void): this;
|
|
13
|
+
on(event: `client-${string}`, listener: (this: InSiteWebSocketServer<WSSC>, wscc: WSSC, ...args: any[]) => void): this;
|
|
14
|
+
on(event: string | symbol, listener: (this: InSiteWebSocketServer<WSSC>, ...args: any[]) => void): this;
|
|
15
|
+
}
|
|
16
|
+
export declare class InSiteWebSocketServer<WSSC extends InSiteWebSocketServerClient = InSiteWebSocketServerClient> extends PrepareWebSocketServer<WSSC> {
|
|
17
|
+
constructor(options: Options<WSSC>, props?: Record<string, unknown>, handleListen?: (() => void));
|
|
9
18
|
readonly isWebSocketServer = true;
|
|
10
19
|
readonly isWebSocketServerClient = false;
|
|
11
20
|
readonly isWebSocket = false;
|
|
12
21
|
readonly port: number;
|
|
13
|
-
|
|
14
|
-
|
|
22
|
+
private readonly requestListeners;
|
|
23
|
+
addRequestListener(kind: string, listener: RequestListener<WSSC>): this;
|
|
24
|
+
onRequest: (kind: string, listener: RequestListener<WSSC>) => this;
|
|
15
25
|
removeRequestListener(kind: string): this;
|
|
16
26
|
offRequest: (kind: string) => this;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
27
|
+
private handleRequest;
|
|
28
|
+
private handleConnection;
|
|
29
|
+
private handleClientMessage;
|
|
30
|
+
private handleClientError;
|
|
31
|
+
private handleClientClose;
|
|
21
32
|
}
|
|
33
|
+
export {};
|
|
22
34
|
//# sourceMappingURL=WebSocketServer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketServer.d.ts","sourceRoot":"","sources":["../../src/server/WebSocketServer.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,
|
|
1
|
+
{"version":3,"file":"WebSocketServer.d.ts","sourceRoot":"","sources":["../../src/server/WebSocketServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ClientRequest, IncomingMessage } from "node:http";
|
|
2
|
+
import { RawData, WebSocket } from "ws";
|
|
2
3
|
import { defibSymbol, heartbeatIntervalSymbol, pingTsSymbol } from "./symbols";
|
|
3
4
|
import { InSiteWebSocketServer } from "./WebSocketServer";
|
|
4
|
-
|
|
5
|
+
declare abstract class PrepareWebSocket<WSSC extends InSiteWebSocketServerClient = InSiteWebSocketServerClient> extends WebSocket {
|
|
6
|
+
on(event: "close", listener: (this: WSSC, code: number, reason: Buffer) => void): this;
|
|
7
|
+
on(event: "error", listener: (this: WSSC, error: Error) => void): this;
|
|
8
|
+
on(event: "upgrade", listener: (this: WSSC, request: IncomingMessage) => void): this;
|
|
9
|
+
on(event: "message", listener: (this: WSSC, data: RawData, isBinary: boolean) => void): this;
|
|
10
|
+
on(event: "open", listener: (this: WSSC) => void): this;
|
|
11
|
+
on(event: "ping" | "pong", listener: (this: WSSC, data: Buffer) => void): this;
|
|
12
|
+
on(event: "unexpected-response", listener: (this: WSSC, request: ClientRequest, response: IncomingMessage) => void): this;
|
|
13
|
+
on(event: string | symbol, listener: (this: WSSC, ...args: unknown[]) => void): this;
|
|
14
|
+
}
|
|
15
|
+
export declare class InSiteWebSocketServerClient<WSSC extends InSiteWebSocketServerClient = any> extends PrepareWebSocket<WSSC> {
|
|
5
16
|
get isConnecting(): boolean;
|
|
6
17
|
get isOpen(): boolean;
|
|
7
18
|
get isClosing(): boolean;
|
|
@@ -9,7 +20,7 @@ export declare class InSiteWebSocketServerClient extends WebSocket {
|
|
|
9
20
|
readonly isWebSocketServerClient = true;
|
|
10
21
|
readonly isWebSocketServer = false;
|
|
11
22
|
readonly isWebSocket = false;
|
|
12
|
-
wss: InSiteWebSocketServer
|
|
23
|
+
wss: InSiteWebSocketServer<WSSC>;
|
|
13
24
|
userAgent: string;
|
|
14
25
|
remoteAddress: string;
|
|
15
26
|
[defibSymbol]: import("@nesvet/n").Debounced<void>;
|
|
@@ -18,7 +29,8 @@ export declare class InSiteWebSocketServerClient extends WebSocket {
|
|
|
18
29
|
[heartbeatIntervalSymbol]: NodeJS.Timeout;
|
|
19
30
|
sendMessage(...args: unknown[]): void;
|
|
20
31
|
sendRequest(...args: unknown[]): Promise<unknown> | this;
|
|
21
|
-
static makeDefib(this: InSiteWebSocketServerClient): import("@nesvet/n").Debounced<void>;
|
|
22
|
-
static makeHeartbeatInterval(this: InSiteWebSocketServerClient): NodeJS.Timeout;
|
|
32
|
+
static makeDefib(this: InSiteWebSocketServerClient<any>): import("@nesvet/n").Debounced<void>;
|
|
33
|
+
static makeHeartbeatInterval(this: InSiteWebSocketServerClient<any>): NodeJS.Timeout;
|
|
23
34
|
}
|
|
35
|
+
export {};
|
|
24
36
|
//# sourceMappingURL=WebSocketServerClient.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketServerClient.d.ts","sourceRoot":"","sources":["../../src/server/WebSocketServerClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"WebSocketServerClient.d.ts","sourceRoot":"","sources":["../../src/server/WebSocketServerClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAGxC,OAAO,EAAE,WAAW,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,OAAO,CAAC,QAAQ,OAAO,gBAAgB,CAAC,IAAI,SAAS,2BAA2B,GAAG,2BAA2B,CAAE,SAAQ,SAAS;IAChI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IACtF,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IACtE,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI;IACpF,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAC5F,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI;IACvD,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAC9E,EAAE,CACD,KAAK,EAAE,qBAAqB,EAC5B,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,eAAe,KAAK,IAAI,GAC/E,IAAI;IACP,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,IAAI;CACpF;AAGD,qBAAa,2BAA2B,CAAC,IAAI,SAAS,2BAA2B,GAAG,GAAG,CAAE,SAAQ,gBAAgB,CAAC,IAAI,CAAC;IAEtH,IAAI,YAAY,YAEf;IAED,IAAI,MAAM,YAET;IAED,IAAI,SAAS,YAEZ;IAED,IAAI,QAAQ,YAEX;IAED,QAAQ,CAAC,uBAAuB,QAAQ;IACxC,QAAQ,CAAC,iBAAiB,SAAS;IACnC,QAAQ,CAAC,WAAW,SAAS;IAE7B,GAAG,EAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAElC,SAAS,SAAM;IAEf,aAAa,SAAM;IAEnB,CAAC,WAAW,CAAC,sCAAoD;IAEjE,OAAO,SAAK;IAEZ,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC;IAExB,CAAC,uBAAuB,CAAC,iBAAgE;IAEzF,WAAW,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IAI9B,WAAW,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IA4B9B,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,2BAA2B,CAAC,GAAG,CAAC;IAIvD,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,2BAA2B,CAAC,GAAG,CAAC;CASnE"}
|
package/dist/server/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import
|
|
1
|
+
import m from"node:fs";import f from"node:http";import k from"node:https";var S={request:"~r-q",response:"~r-s"};var h=Symbol("heartbeatInterval"),l=Symbol("defib"),c=Symbol("pingTs");import{debounce as y,uid as u}from"@nesvet/n";var s=class p extends PrepareWebSocket{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=u(),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 y(()=>this.terminate(),65e3)}static makeHeartbeatInterval(){return setInterval(()=>{this[c]=Date.now(),this.send("")},5e3)}};var g=class extends PrepareWebSocketServer{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?k.createServer({...r}):f.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)}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,...C}=d;a={message:v,...C}}}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{g as InSiteWebSocketServer,s as InSiteWebSocketServerClient};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/server/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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 WebSocket, { WebSocketServer } from \"ws\";\nimport { requestHeaders, type RequestListener } from \"../common\";\nimport { defibSymbol, heartbeatIntervalSymbol, pingTsSymbol } from \"./symbols\";\nimport { CompatibleListener, Options } from \"./types\";\nimport { InSiteWebSocketServerClient } from \"./WebSocketServerClient\";\n\n\nexport class InSiteWebSocketServer extends WebSocketServer<typeof InSiteWebSocketServerClient> {\n\tconstructor(options: Options, 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\t...wssOptions,\n\t\t\tserver,\n\t\t\tWebSocket: InSiteWebSocketServerClient\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\", InSiteWebSocketServer.handleConnection as CompatibleListener);\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\treadonly isWebSocketServer = true;\n\treadonly isWebSocketServerClient = false;\n\treadonly isWebSocket = false;\n\t\n\treadonly port;\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 (wssc: InSiteWebSocketServerClient, 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\t\n\tstatic handleConnection(this: InSiteWebSocketServer, wssc: InSiteWebSocketServerClient | WebSocket, 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;\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 as InSiteWebSocketServerClient),\n\t\t\t\tlatency: 0,\n\t\t\t\t[heartbeatIntervalSymbol]: InSiteWebSocketServerClient.makeHeartbeatInterval.call(wssc as InSiteWebSocketServerClient),\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\t(wssc as InSiteWebSocketServerClient)[defibSymbol]();\n\t\t\n\t\twssc.on(\"message\", InSiteWebSocketServer.handleClientMessage as CompatibleListener);\n\t\twssc.on(\"error\", InSiteWebSocketServer.handleClientError as CompatibleListener);\n\t\twssc.on(\"close\", InSiteWebSocketServer.handleClientClose as CompatibleListener);\n\t\t\n\t\tthis.emit(\"client-connect\", wssc, request);\n\t\t\n\t}\n\t\n\t\n\tstatic handleClientMessage(this: InSiteWebSocketServerClient, data: WebSocket.RawData) {\n\t\tconst message = data.toString();\n\t\t\n\t\tthis[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\tthis.emit(`message:${kind}`, ...rest);\n\t\t\t\tthis.wss.emit(\"client-message\", this, kind, ...rest);\n\t\t\t\tthis.wss.emit(`client-message:${kind}`, this, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tInSiteWebSocketServer.handleClientError.call(this, error as Error);\n\t\t\t}\n\t\telse if (this[pingTsSymbol]) {\n\t\t\tthis.latency = Date.now() - this[pingTsSymbol];\n\t\t\tdelete this[pingTsSymbol];\n\t\t}\n\t\t\n\t}\n\t\n\tstatic handleClientError(this: InSiteWebSocketServerClient, 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.wss.emit(\"client-error\", this, error);\n\t\t\n\t}\n\t\n\tstatic handleClientClose(this: InSiteWebSocketServerClient, ...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\tthis[defibSymbol].clear();\n\t\tclearInterval(this[heartbeatIntervalSymbol]);\n\t\t\n\t\tthis.wss.emit(\"client-close\", this);\n\t\tthis.wss.emit(\"client-closed\", this);\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\nexport type RequestListener = (...args: any[]) => any | Promise<any>;// eslint-disable-line @typescript-eslint/no-explicit-any\n", "export const heartbeatIntervalSymbol = Symbol(\"heartbeatInterval\");\nexport const defibSymbol = Symbol(\"defib\");\nexport const pingTsSymbol = Symbol(\"pingTs\");\n", "import { 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\nexport class InSiteWebSocketServerClient extends WebSocket {\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;\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) {\n\t\treturn debounce(() => this.terminate(), heartbeatInterval + heartbeatGap);\n\t}\n\t\n\tstatic makeHeartbeatInterval(this: InSiteWebSocketServerClient) {\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": "AAAA,OAAOA,MAAQ,UACf,OAAOC,MAAU,YACjB,OAAOC,MAAW,
|
|
6
|
-
"names": ["fs", "http", "https", "
|
|
4
|
+
"sourcesContent": ["import fs from \"node:fs\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport type { RawData, 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\ntype RequestListener<WSSC extends InSiteWebSocketServerClient> = (wscc: WSSC, ...args: any[]) => any | Promise<any>;// eslint-disable-line @typescript-eslint/no-explicit-any\n\ndeclare abstract class PrepareWebSocketServer<WSSC extends InSiteWebSocketServerClient> extends WebSocketServer<typeof InSiteWebSocketServerClient> {\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;// eslint-disable-line @typescript-eslint/no-explicit-any\n\t\n\ton(event: string | symbol, listener: (this: InSiteWebSocketServer<WSSC>, ...args: any[]) => void): this;// eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\n\nexport class InSiteWebSocketServer<WSSC extends InSiteWebSocketServerClient = InSiteWebSocketServerClient> extends PrepareWebSocketServer<WSSC> {\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\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\ndeclare abstract class PrepareWebSocket<WSSC extends InSiteWebSocketServerClient = InSiteWebSocketServerClient> 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(\n\t\tevent: \"unexpected-response\",\n\t\tlistener: (this: WSSC, request: ClientRequest, response: IncomingMessage) => void,\n\t): this;\n\ton(event: string | symbol, listener: (this: WSSC, ...args: unknown[]) => void): this;\n}\n\n\nexport class InSiteWebSocketServerClient<WSSC extends InSiteWebSocketServerClient = any> extends PrepareWebSocket<WSSC> {// eslint-disable-line @typescript-eslint/no-explicit-any\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>) { // eslint-disable-line @typescript-eslint/no-explicit-any\n\t\treturn debounce(() => this.terminate(), heartbeatInterval + heartbeatGap);\n\t}\n\t\n\tstatic makeHeartbeatInterval(this: InSiteWebSocketServerClient<any>) { // eslint-disable-line @typescript-eslint/no-explicit-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": "AAAA,OAAOA,MAAQ,UACf,OAAOC,MAAU,YACjB,OAAOC,MAAW,aCCX,IAAMC,EAAiB,CAC7B,QAAS,OACT,SAAU,MACX,ECNO,IAAMC,EAA0B,OAAO,mBAAmB,EACpDC,EAAc,OAAO,OAAO,EAC5BC,EAAe,OAAO,QAAQ,ECA3C,OAAS,YAAAC,EAAU,OAAAC,MAAW,YAqBvB,IAAMC,EAAN,MAAMC,UAAoF,gBAAuB,CAEvH,IAAI,cAAe,CAClB,OAAO,KAAK,aAAe,KAAK,UACjC,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,aAAe,KAAK,IACjC,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,aAAe,KAAK,OACjC,CAEA,IAAI,UAAW,CACd,OAAO,KAAK,aAAe,KAAK,MACjC,CAES,wBAA0B,GAC1B,kBAAoB,GACpB,YAAc,GAEvB,IAEA,UAAY,GAEZ,cAAgB,GAEhB,CAACC,CAAW,EAAID,EAA4B,UAAU,KAAK,IAAI,EAE/D,QAAU,EAEV,CAACE,CAAY,EAEb,CAACC,CAAuB,EAAIH,EAA4B,sBAAsB,KAAK,IAAI,EAEvF,eAAeI,EAAiB,CAC/B,OAAO,KAAK,KAAK,KAAK,UAAUA,CAAI,CAAC,CACtC,CAEA,eAAeA,EAAiB,CAE/B,IAAMC,EAAKC,EAAI,EACTC,EAAY,WAAWC,EAAe,QAAQ,IAAIH,CAAE,GAE1D,OAAI,OAAOD,EAAK,GAAG,EAAE,GAAK,YACzB,KAAK,KAAKG,EAAWH,EAAK,OAAO,GAAI,CAAC,EAAE,CAAC,CAAe,EACxD,KAAK,YAAYI,EAAe,QAASH,EAAI,GAAGD,CAAI,EAE7C,MAGD,IAAI,QAAQ,CAACK,EAASC,IAAW,CAEvC,KAAK,KAAKH,EAAW,CAACI,EAAOC,IAAW,CACvC,GAAID,EAAO,CACV,GAAM,CAAE,QAAAE,EAAS,GAAGC,CAAU,EAAIH,EAClCD,EAAO,OAAO,OAAO,IAAI,MAAMG,CAAO,EAAGC,CAAS,CAAC,CACpD,MACCL,EAAQG,CAAM,CAEhB,CAAC,EACD,KAAK,YAAYJ,EAAe,QAASH,EAAI,GAAGD,CAAI,CAErD,CAAC,CACF,CAGA,OAAO,WAAkD,CACxD,OAAOW,EAAS,IAAM,KAAK,UAAU,EAAG,IAAgC,CACzE,CAEA,OAAO,uBAA8D,CACpE,OAAO,YAAY,IAAM,CAExB,KAAKb,CAAY,EAAI,KAAK,IAAI,EAC9B,KAAK,KAAK,EAAE,CAEb,EAAG,GAAiB,CACrB,CAED,EH9EO,IAAMc,EAAN,cAA4G,sBAA6B,CAC/I,YAAYC,EAAwBC,EAAiCC,EAA6B,CACjG,GAAM,CACL,IAAAC,EACA,KAAAC,EACA,GAAGC,CACJ,EAAIL,EAEJ,GAAIG,EAAK,CACR,GAAI,OAAOA,EAAI,MAAQ,UAAY,CAAC,cAAc,KAAKA,EAAI,IAAI,EAC9D,GAAI,CACHA,EAAI,KAAOG,EAAG,aAAaH,EAAI,IAAI,CACpC,MAAQ,CAAC,CACV,GAAI,OAAOA,EAAI,KAAO,UAAY,CAAC,cAAc,KAAKA,EAAI,GAAG,EAC5D,GAAI,CACHA,EAAI,IAAMG,EAAG,aAAaH,EAAI,GAAG,CAClC,MAAQ,CAAC,CACX,CAEA,GAAM,CACL,OAAAI,EAASJ,EAAMK,EAAM,aAAa,CAAE,GAAGL,CAAI,CAAC,EAAIM,EAAK,aAAa,CACnE,EAAIJ,EAEJ,MAAM,CACL,UAAWK,EACX,GAAGL,EACH,OAAAE,CACD,CAAC,EAED,KAAK,KAAO,OAAOH,GAAQ,SAAW,OAAO,SAASA,CAAI,EAAIA,EAE1DH,IACC,OAAOA,GAAS,WACnBC,EAAeD,EAEf,OAAO,OAAO,KAAMA,CAAK,GAE3B,KAAK,GAAG,aAAc,KAAK,gBAAgB,EAE3C,KAAK,GAAG,kBAAkBU,EAAe,OAAO,GAAI,KAAK,aAAa,EAEtEJ,EAAO,OAAO,KAAK,KAAML,CAAY,CAEtC,CAES,kBAAoB,GACpB,wBAA0B,GAC1B,YAAc,GAEd,KAEQ,iBAAmB,IAAI,IAExC,mBAAmBU,EAAcC,EAAiC,CACjE,YAAK,iBAAiB,IAAID,EAAMC,CAAQ,EAEjC,IACR,CAEA,UAAY,KAAK,mBAEjB,sBAAsBD,EAAc,CACnC,YAAK,iBAAiB,OAAOA,CAAI,EAE1B,IACR,CAEA,WAAa,KAAK,sBAEV,cAAgB,MAAOE,EAAYC,EAAYH,KAAiBI,IAAoB,CAC3F,IAAMH,EAAW,KAAK,iBAAiB,IAAID,CAAI,EAE3CK,EACAC,EAAe,KAEnB,GAAIL,EACH,GAAI,CACHI,EAAS,MAAMJ,EAAS,KAAK,KAAMC,EAAM,GAAGE,CAAI,CACjD,OAASG,EAAO,CACf,GAAIA,aAAiB,MAAO,CAC3B,GAAM,CAAE,QAAAC,EAAS,GAAGC,CAAU,EAAIF,EAClCD,EAAe,CAAE,QAAAE,EAAS,GAAGC,CAAU,CACxC,CACD,MAEAH,EAAe,CAAE,QAAS,yBAAyBN,CAAI,GAAI,EAE5DE,EAAK,YAAY,GAAGH,EAAe,QAAQ,IAAII,CAAE,GAAIG,EAAcD,CAAM,CAE1E,EAEQ,iBAAiBH,EAAYQ,EAA+B,CACnE,GAAI,EAAER,aAAgBJ,GAA8B,CACnD,OAAO,iBAAiBI,EAAM,CAC7B,aAAc,CACb,IAAK,OAAO,yBAAyBJ,EAA4B,UAAW,cAAc,EAAG,GAC9F,EACA,OAAQ,CACP,IAAK,OAAO,yBAAyBA,EAA4B,UAAW,QAAQ,EAAG,GACxF,EACA,UAAW,CACV,IAAK,OAAO,yBAAyBA,EAA4B,UAAW,WAAW,EAAG,GAC3F,EACA,SAAU,CACT,IAAK,OAAO,yBAAyBA,EAA4B,UAAW,UAAU,EAAG,GAC1F,CACD,CAAC,EAED,GAAM,CAAE,UAAAa,CAAU,EAAIT,EAEtB,OAAO,OAAOA,EAAM,CACnB,wBAAyB,GACzB,kBAAmB,GACnB,YAAa,GACb,CAACU,CAAW,EAAGd,EAA4B,UAAU,KAAKI,CAAI,EAC9D,QAAS,EACT,CAACW,CAAuB,EAAGf,EAA4B,sBAAsB,KAAKI,CAAI,EACtF,YAAaJ,EAA4B,UAAU,YACnD,YAAaA,EAA4B,UAAU,YACnD,WAAY,CAEX,GAAI,CACHa,EAAU,KAAKT,CAAI,CACpB,OAASK,EAAO,CACf,QAAQ,MAAMA,CAAK,CACpB,CAED,CACD,CAAC,CACF,CAEA,OAAO,OAAOL,EAAM,CACnB,IAAK,KACL,UAAWQ,EAAQ,QAAQ,YAAY,GAAK,GAC5C,cAAeA,EAAQ,QAAQ,WAAW,GAAKA,EAAQ,QAAQ,iBAAiB,GAAK,EACtF,CAAC,EAEDR,EAAKU,CAAW,EAAE,EAElBV,EAAK,GAAG,UAAWY,GAAQ,KAAK,oBAAoBZ,EAAMY,CAAI,CAAC,EAC/DZ,EAAK,GAAG,QAASK,GAAS,KAAK,kBAAkBL,EAAMK,CAAK,CAAC,EAC7DL,EAAK,GAAG,QAAS,IAAIa,IAAS,KAAK,kBAAkBb,EAAM,GAAGa,CAAI,CAAC,EAEnE,KAAK,KAAK,iBAAkBb,EAAMQ,CAAO,CAE1C,CAGQ,oBAAoBR,EAAYY,EAAe,CACtD,IAAMN,EAAUM,EAAK,SAAS,EAI9B,GAFAZ,EAAKU,CAAW,EAAE,EAEdJ,EACH,GAAI,CACH,GAAM,CAAER,EAAM,GAAGI,CAAK,EAAI,KAAK,MAAMI,CAAO,EAE5CN,EAAK,KAAK,WAAWF,CAAI,GAAI,GAAGI,CAAI,EACpC,KAAK,KAAK,iBAAkBF,EAAMF,EAAM,GAAGI,CAAI,EAC/C,KAAK,KAAK,kBAAkBJ,CAAI,GAAIE,EAAM,GAAGE,CAAI,CAClD,OAASG,EAAO,CACf,KAAK,kBAAkBL,EAAMK,CAAc,CAC5C,MACQL,EAAKc,CAAY,IACzBd,EAAK,QAAU,KAAK,IAAI,EAAIA,EAAKc,CAAY,EAC7C,OAAOd,EAAKc,CAAY,EAG1B,CAEQ,kBAAkBd,EAAYK,EAAkC,CACnEA,aAAiB,QACpBA,EAAQ,QAEL,QAAQ,IAAI,WAAa,eAC5B,QAAQ,MAAM,+BAAgCA,CAAK,EAEpD,KAAK,KAAK,eAAgBL,EAAMK,CAAK,CAEtC,CAEQ,kBAAkBL,KAAea,EAAiB,CAErD,QAAQ,IAAI,WAAa,eAC5B,QAAQ,KAAK,gCAAiC,GAAGA,CAAI,EAEtDb,EAAKU,CAAW,EAAE,MAAM,EACxB,cAAcV,EAAKW,CAAuB,CAAC,EAE3C,KAAK,KAAK,eAAgBX,CAAI,EAC9B,KAAK,KAAK,gBAAiBA,CAAI,CAEhC,CAED",
|
|
6
|
+
"names": ["fs", "http", "https", "requestHeaders", "heartbeatIntervalSymbol", "defibSymbol", "pingTsSymbol", "debounce", "uid", "InSiteWebSocketServerClient", "_InSiteWebSocketServerClient", "defibSymbol", "pingTsSymbol", "heartbeatIntervalSymbol", "args", "id", "uid", "eventName", "requestHeaders", "resolve", "reject", "error", "result", "message", "restProps", "debounce", "InSiteWebSocketServer", "options", "props", "handleListen", "ssl", "port", "wssOptions", "fs", "server", "https", "http", "InSiteWebSocketServerClient", "requestHeaders", "kind", "listener", "wssc", "id", "rest", "result", "requestError", "error", "message", "restProps", "request", "terminate", "defibSymbol", "heartbeatIntervalSymbol", "data", "args", "pingTsSymbol"]
|
|
7
7
|
}
|
package/dist/server/types.d.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import type { ServerOptions } from "ws";
|
|
2
|
+
import type { InSiteWebSocketServerClient } from "./WebSocketServerClient";
|
|
3
|
+
export type Options<WSSC extends InSiteWebSocketServerClient> = {
|
|
3
4
|
port: number | string;
|
|
4
5
|
ssl?: {
|
|
5
6
|
cert: Buffer | string;
|
|
6
7
|
key: Buffer | string;
|
|
7
8
|
};
|
|
8
|
-
|
|
9
|
+
WebSocket?: {
|
|
10
|
+
new (...args: any[]): WSSC;
|
|
11
|
+
} & typeof InSiteWebSocketServerClient;
|
|
12
|
+
} & Omit<ServerOptions, "port">;
|
|
9
13
|
export type CompatibleListener = () => void;
|
|
10
14
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAG3E,MAAM,MAAM,OAAO,CAAC,IAAI,SAAS,2BAA2B,IAAI;IAC/D,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;QACtB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;KACrB,CAAC;IACF,SAAS,CAAC,EAAE;QACX,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;KAC3B,GAAG,OAAO,2BAA2B,CAAC;CACvC,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAEhC,MAAM,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "insite-ws",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.12",
|
|
4
4
|
"description": "inSite WebSockets",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@nesvet/conveyer": "^2.2.1",
|
|
34
34
|
"@nesvet/eslint-config": "^2.0.24",
|
|
35
|
-
"@types/node": "^20.14.
|
|
35
|
+
"@types/node": "^20.14.14",
|
|
36
36
|
"@types/ws": "^8.5.12",
|
|
37
37
|
"typescript": "^5.5.4"
|
|
38
38
|
}
|