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