insite-ws 2.2.3 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,22 +1,16 @@
1
1
  import EventEmitter from "eventemitter3";
2
- declare global {
3
- var __insite: {
4
- wss_url?: string;
5
- } | undefined;
6
- }
7
- export type Options = {
8
- url?: URL | string;
9
- name?: string;
10
- protocols?: string[];
11
- immediately?: boolean;
12
- reconnectAfter?: number | null;
13
- on?: Record<string, (...args: any[]) => void>;
14
- quiet?: boolean;
15
- };
16
- type RequestListener = (...args: any[]) => Promise<any> | any;
2
+ import type { ConnectionQuality, Options, RequestListener } from "./types";
17
3
  export declare class WS extends EventEmitter {
18
4
  #private;
19
5
  constructor(options?: Options);
6
+ on(event: "connecting" | "destroy" | "open" | "responsive" | "unresponsive", callback: (this: this) => void): this;
7
+ on<T extends unknown[]>(event: "message", callback: (this: this, kind: string, ...rest: T) => void): this;
8
+ on<T extends unknown[]>(event: `message:${string}`, callback: (this: this, ...rest: T) => void): this;
9
+ on(event: "connection-quality-change", callback: (this: this, connectionQuality: ConnectionQuality, prevConnectionQuality: ConnectionQuality) => void): this;
10
+ on(event: "close", callback: (this: this, closeEvent: CloseEvent) => void): this;
11
+ on(event: "server-change", callback: (this: this, url: string, prevURL: string) => void): this;
12
+ on(event: "error", callback: (this: this, error: Error) => void): this;
13
+ on<T extends string | symbol>(event: T, fn: (...args: any[]) => void): this;
20
14
  readonly isWebSocket = true;
21
15
  readonly isWebSocketServer = false;
22
16
  readonly isWebSocketServerClient = false;
@@ -25,24 +19,45 @@ export declare class WS extends EventEmitter {
25
19
  protocols?: string[] | undefined;
26
20
  reconnectAfter: number | null;
27
21
  isUsed: boolean;
28
- isAutoReconnecting: boolean;
29
- send?(data: ArrayBufferLike | ArrayBufferView | Blob | string): void;
22
+ connectionQuality: ConnectionQuality;
30
23
  webSocket: WebSocket | null;
31
- get isConnecting(): boolean | null;
32
- get isOpen(): boolean | null;
33
- get isClosing(): boolean | null;
24
+ get state(): "connecting" | "open" | "unresponsive" | "closed" | "closing";
25
+ get isConnecting(): boolean;
26
+ get isOpen(): boolean;
27
+ get isClosing(): boolean;
34
28
  get isClosed(): boolean;
29
+ isDestroyed: boolean;
35
30
  open(options?: Pick<Options, "protocols" | "url">): Promise<void>;
31
+ /**
32
+ * Alias for `open()`
33
+ */
36
34
  connect: (options?: Pick<Options, "protocols" | "url">) => Promise<void>;
37
- close(code?: number, reason?: string): Promise<void>;
38
- disconnect: (code?: number, reason?: string) => Promise<void>;
35
+ close(code?: number, reason?: string, wasClean?: boolean): void;
36
+ /**
37
+ * Alias for `close()`
38
+ */
39
+ disconnect: (code?: number, reason?: string, wasClean?: boolean) => void;
40
+ send(data: ArrayBufferLike | ArrayBufferView | Blob | string): void;
39
41
  sendMessage(...args: unknown[]): void;
40
- sendRequest(...args: unknown[]): this | Promise<unknown>;
42
+ sendRequest<T>(...args: [...unknown[], callback: (error: Error | null, result: T) => void]): this;
43
+ sendRequest<T>(...args: unknown[]): Promise<T>;
41
44
  addRequestListener(kind: string, listener: RequestListener): this;
45
+ /**
46
+ * Alias for `addRequestListener()`
47
+ */
42
48
  onRequest: (kind: string, listener: RequestListener) => this;
43
49
  removeRequestListener(kind: string): this;
50
+ /**
51
+ * Alias for `removeRequestListener()`
52
+ */
44
53
  offRequest: (kind: string) => this;
45
- static defib(this: WS): void;
54
+ destroy(): void;
55
+ static CONNECTION_QUALITY: {
56
+ readonly CLOSED: 0;
57
+ readonly RECONNECTING: 1;
58
+ readonly UNRESPONSIVE: 2;
59
+ readonly CHECKING_RESPONSIVENESS: 3;
60
+ readonly OPEN: 4;
61
+ };
46
62
  }
47
- export {};
48
63
  //# sourceMappingURL=WS.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WS.d.ts","sourceRoot":"","sources":["../../src/client/WS.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAUzC,OAAO,CAAC,MAAM,CAAC;IACd,IAAI,QAAQ,EAAE;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,SAAS,CAAC;CACd;AAID,MAAM,MAAM,OAAO,GAAG;IACrB,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,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,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AAG9D,qBAAa,EAAG,SAAQ,YAAY;;gBACvB,OAAO,GAAE,OAAY;IAoCjC,QAAQ,CAAC,WAAW,QAAQ;IAC5B,QAAQ,CAAC,iBAAiB,SAAS;IACnC,QAAQ,CAAC,uBAAuB,SAAS;IAEzC,GAAG,eAAC;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,SAAS,GAAG,IAAI,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;CAWrB"}
1
+ {"version":3,"file":"WS.d.ts","sourceRoot":"","sources":["../../src/client/WS.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,eAAe,CAAC;AAYzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAS3E,qBAAa,EAAG,SAAQ,YAAY;;gBACvB,OAAO,GAAE,OAAY;IAuCjC,EAAE,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,cAAc,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAAG,IAAI;IAClH,EAAE,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI;IACzG,EAAE,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,IAAI,GAAG,IAAI;IACrG,EAAE,CAAC,KAAK,EAAE,2BAA2B,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,iBAAiB,KAAK,IAAI,GAAG,IAAI;IAC5J,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAChF,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAC9F,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAEtE,EAAE,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI;IAK3E,QAAQ,CAAC,WAAW,QAAQ;IAC5B,QAAQ,CAAC,iBAAiB,SAAS;IACnC,QAAQ,CAAC,uBAAuB,SAAS;IAEzC,GAAG,eAAC;IAEJ,QAAQ,CAAC,IAAI,SAAC;IAEd,SAAS,CAAC,uBAAC;IAEX,cAAc,gBAAC;IAMf,MAAM,UAAS;IAEf,iBAAiB,EAAE,iBAAiB,CAAK;IAYzC,SAAS,EAAE,SAAS,GAAG,IAAI,CAAQ;IAwCnC,IAAI,KAAK,kEAiBR;IAED,IAAI,YAAY,YAEf;IAED,IAAI,MAAM,YAET;IAED,IAAI,SAAS,YAEZ;IAED,IAAI,QAAQ,YAEX;IAED,WAAW,UAAS;IAuJd,IAAI,CAAC,OAAO,GAAE,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,KAAK,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuD3E;;OAEG;IACH,OAAO,aA1Da,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,KAAK,CAAC,KAAQ,OAAO,CAAC,IAAI,CAAC,CA0DvD;IAEpB,KAAK,CAAC,IAAI,GAAE,MAAqB,EAAE,MAAM,SAAW,EAAE,QAAQ,GAAE,OAAc;IAkB9E;;OAEG;IACH,UAAU,UArBE,MAAM,8BAA8C,OAAO,UAqB/C;IAaxB,IAAI,CAAC,IAAI,EAAE,eAAe,GAAG,eAAe,GAAG,IAAI,GAAG,MAAM;IAa5D,WAAW,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IAM9B,WAAW,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,IAAI;IACjG,WAAW,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAsC9C,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe;IAM1D;;OAEG;IACH,SAAS,SATgB,MAAM,YAAY,eAAe,UAStB;IAEpC,qBAAqB,CAAC,IAAI,EAAE,MAAM;IAMlC;;OAEG;IACH,UAAU,SATkB,MAAM,UASM;IAuDxC,OAAO;IAiBP,MAAM,CAAC,kBAAkB;;;;;;MAMd;CAEX"}
@@ -1,2 +1,3 @@
1
+ export type { Options } from "./types";
1
2
  export * from "./WS";
2
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,cAAc,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,cAAc,MAAM,CAAC"}
@@ -1,2 +1,2 @@
1
- var H=Object.defineProperty;var D=o=>{throw TypeError(o)};var K=(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)=>K(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)),p=(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),A=(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 h(){}function _(o,r=0,e={}){let{leading:t=!1,trailing:s=!0}=e,{maxWait:l=1/0}=e,i,u,f,d,a,R,x,I,B=async()=>{let b=Date.now();b>=f?(i=void 0,f=void 0,clearTimeout(u),typeof x=="function"&&await x(),m.resolve(I),m.promise.isResolved=!0,R=t):(clearTimeout(i),i=setTimeout(B,f-b))},N=Number.isFinite(l)?()=>{x===S&&(x=!1),S(),u=setTimeout(N,l)}:null;async function S(){return I=await o.apply(d,a)}t&&typeof t=="boolean"&&(t=S),R=t,s&&typeof s=="boolean"&&(s=S),x=s;let m=Object.assign(function(...b){return a=b,d=this,f=Date.now()+r,x=s,m.promise.isResolved&&(m.promise=Object.assign(new Promise(J=>{m.resolve=J,typeof R=="function"&&(R(),R=!1,x===S&&(x=!1)),i||(i=setTimeout(B,r),N&&(u=setTimeout(N,l)))}),{isResolved:!1})),m.promise},{callback:o,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:h,run:S,clear:async b=>{clearTimeout(i),i=void 0,clearTimeout(u),m.promise.isResolved=!0,m.resolve(b?await S():I)}});return m}_.noop=Object.assign(()=>{},{callback:h,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:h,run:h,clear:h});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 T=new WeakMap,q=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=T.get(this);t&&(t.resolve.call(this,e),T.delete(this))}});c(this,"reject",e=>{if(this.isPending){this.isPending=!1,this.isRejected=!0,this.state="rejected",this.result=e;let t=T.get(this);t&&(t.reject.call(this,e),T.delete(this))}});T.set(this,{resolve:t,reject:s}),e?.(this.resolve,this.reject)}};function V(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,w,k,g,P,M,$,O,j,v,L,E,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");p(this,w);c(this,"isUsed",!1);c(this,"isAutoReconnecting",!1);c(this,"webSocket",null);p(this,k,_(C.defib,65e3));p(this,g);p(this,P,()=>{n(this,g).resolve(),this.emit("open"),n(this,k).call(this)});p(this,M,({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,$).call(this,t)}else this.webSocket.send("")});p(this,$,e=>{e instanceof Event&&(e=void 0),n(this,g).isPending&&n(this,g).reject(e),this.emit("error",e)});p(this,O);p(this,j,e=>{process.env.NODE_ENV==="development"&&!n(this,w)&&console.info(`\u{1F50C} WS ${this.name} is closed ${e.code?`with code ${e.code}`:""} ${e.code&&e.reason?"and ":""}${e.reason?`reason "${e.reason}"`:""}`),n(this,k).clear();let t=this.webSocket;t.removeEventListener("open",n(this,P)),t.removeEventListener("message",n(this,M)),t.removeEventListener("error",n(this,$)),t.removeEventListener("close",n(this,j)),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,w)&&console.info(`\u{1F50C} WS ${this.name} will try to reconnect in 2 seconds`),A(this,O,setTimeout(()=>this.open().catch(h),this.reconnectAfter)))});c(this,"connect",this.open);c(this,"disconnect",this.close);p(this,v,[]);p(this,L,()=>{for(let e of n(this,v))this.webSocket.send(e);n(this,v).length=0});p(this,E,new Map);c(this,"onRequest",this.addRequestListener);c(this,"offRequest",this.removeRequestListener);p(this,W,async(e,t,...s)=>{let l=n(this,E).get(t),i,u=null;if(l)try{i=await l.apply(this,s)}catch(f){if(f instanceof Error){let{message:d,...a}=f;u={message:d,...a}}}else u={message:`Unknown request kind "${t}"`};this.sendMessage(`${y.response}-${e}`,u,i)});let{url:t=globalThis.__insite?.wss_url??"/",name:s=(Y++).toString(),protocols:l,immediately:i=!0,reconnectAfter:u=2e3,on:f,quiet:d=!1}=e;if(this.url=t,this.name=s,this.protocols=l,this.reconnectAfter=u,this.on(`message:${y.request}`,n(this,W)),f)for(let a in f)f[a]&&this.on(a,f[a]);A(this,w,d),this.url&&i&&this.open().catch(h),this.on("error",a=>a&&console.error("\u{1F50C}\u2757\uFE0F WS",`${this.name}:`,a))}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),A(this,g,new q((s,l)=>{if(this.url){let i=new WebSocket(this.url,this.protocols);i.addEventListener("open",n(this,P)),i.addEventListener("message",n(this,M)),i.addEventListener("error",n(this,$)),i.addEventListener("close",n(this,j),{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,v).length||this.once("open",n(this,L)),n(this,v).push(t))}sendRequest(...e){let t=V(),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,(u,f)=>{if(u){let{message:d,...a}=u;i(Object.assign(new Error(d),a))}else l(f)}),this.sendMessage(y.request,t,...e)})}addRequestListener(e,t){return n(this,E).set(e,t),this}removeRequestListener(e){return n(this,E).delete(e),this}static defib(){this.isOpen&&(process.env.NODE_ENV==="development"&&!n(this,w)&&console.info(`\u{1F50C} WS ${this.name} has no heartbeat, going offline`),this.webSocket.close())}};w=new WeakMap,k=new WeakMap,g=new WeakMap,P=new WeakMap,M=new WeakMap,$=new WeakMap,O=new WeakMap,j=new WeakMap,v=new WeakMap,L=new WeakMap,E=new WeakMap,W=new WeakMap;var G=C;export{G as WS};
1
+ var Z=Object.defineProperty;var F=i=>{throw TypeError(i)};var ee=(i,n,e)=>n in i?Z(i,n,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[n]=e;var c=(i,n,e)=>ee(i,typeof n!="symbol"?n+"":n,e),$=(i,n,e)=>n.has(i)||F("Cannot "+e);var t=(i,n,e)=>($(i,n,"read from private field"),e?e.call(i):n.get(i)),r=(i,n,e)=>n.has(i)?F("Cannot add the same private member more than once"):n instanceof WeakSet?n.add(i):n.set(i,e),o=(i,n,e,s)=>($(i,n,"write to private field"),s?s.call(i,e):n.set(i,e),e),N=(i,n,e)=>($(i,n,"access private method"),e);var Y=(i,n,e,s)=>({set _(h){o(i,n,h,e)},get _(){return t(i,n,s)}});import ne from"eventemitter3";import{noop as X,StatefulPromise as oe}from"@nesvet/n";var j=Number.MAX_SAFE_INTEGER/2,f={NORMAL:1e3,PROTOCOL_ERROR:1002,ABNORMAL:1006,NO_HEARTBEAT:3e3,OFFLINE:3001,MANUAL:3500,REOPEN:4e3},J=[f.PROTOCOL_ERROR,f.MANUAL,f.REOPEN],A={REQUEST:"~r-q",RESPONSE:"~r-s"};var re=0,C,y,u,L,v,V,S,g,O,p,E,w,q,x,I,k,H,_,B,R,W,P,U,G,D,m=class m extends ne{constructor(e={}){super();r(this,u);c(this,"isWebSocket",!0);c(this,"isWebSocketServer",!1);c(this,"isWebSocketServerClient",!1);c(this,"url");c(this,"name");c(this,"protocols");c(this,"reconnectAfter");r(this,C);r(this,y);c(this,"isUsed",!1);c(this,"connectionQuality",0);c(this,"webSocket",null);r(this,v);r(this,S);r(this,g,!1);r(this,O);r(this,p,!1);c(this,"isDestroyed",!1);r(this,E);r(this,w,!1);r(this,q,()=>{o(this,w,!0),t(this,E).resolve(),N(this,u,V).call(this),this.emit("open")});r(this,x,({data:e})=>{if(N(this,u,V).call(this),e){if(e!=="!")try{let[s,...h]=JSON.parse(e);switch(s){case A.REQUEST:t(this,G).call(this,...h);break;default:this.emit("message",s,...h),this.emit(`message:${s}`,...h)}}catch(s){t(this,I).call(this,s)}}else this.webSocket.send("")});r(this,I,e=>{e instanceof Event&&(e=void 0),t(this,E)?.isPending&&t(this,E).reject(e),this.emit("error",e)});r(this,k);r(this,_,e=>{let{code:s,reason:h,wasClean:d}=e;if(t(this,v)&&(clearTimeout(t(this,v)),o(this,v,void 0)),t(this,S)&&(clearTimeout(t(this,S)),o(this,S,void 0)),o(this,g,!1),t(this,O)&&(clearTimeout(t(this,O)),o(this,O,void 0)),o(this,p,!1),t(this,E)?.isPending&&t(this,E).reject(new Error("Closed")),process.env.NODE_ENV==="development"&&!t(this,C)){let a=`\u{1F50C} WS ${this.name} is closed`;switch(s&&(a+=` with code ${s}`),s&&h&&(a+=" and"),h&&(a+=` reason "${h}"`),h){case"no-heartbeat":a+=". Going offline"}!d||s===f.ABNORMAL?(a+=" [UNEXPECTED]",console.warn(a)):console.info(a)}let l=this.webSocket;l.removeEventListener("open",t(this,q)),l.removeEventListener("message",t(this,x)),l.removeEventListener("error",t(this,I)),t(this,w)&&(this.emit("close",e),o(this,w,!1)),this.webSocket=null,N(this,u,H).call(this,s),"navigator"in globalThis&&"addEventListener"in globalThis&&globalThis.removeEventListener("offline",t(this,D))});r(this,B,()=>t(this,E)?.isPending&&t(this,E).reject(new DOMException("Operation aborted","AbortError")));c(this,"connect",this.open);c(this,"disconnect",this.close);r(this,R,[]);r(this,W,()=>{for(let e of t(this,R))this.webSocket.send(e);t(this,R).length=0});r(this,P,0);r(this,U,new Map);c(this,"onRequest",this.addRequestListener);c(this,"offRequest",this.removeRequestListener);r(this,G,async(e,s,...h)=>{let d=t(this,U).get(s),l,a=null;if(d)try{l=await d.apply(this,h)}catch(T){if(T instanceof Error){let{message:Q,...M}=T;a={message:Q,...M}}}else a={message:`Unknown request kind "${s}"`};this.sendMessage(`${A.RESPONSE}-${e}`,a,l)});r(this,D,()=>{this.isOpen&&!t(this,g)&&(o(this,g,!0),N(this,u,L).call(this,m.CONNECTION_QUALITY.CHECKING_RESPONSIVENESS),o(this,S,setTimeout(()=>{o(this,g,!1),o(this,p,!0),N(this,u,L).call(this,m.CONNECTION_QUALITY.UNRESPONSIVE),this.emit("unresponsive"),o(this,O,setTimeout(()=>{o(this,p,!1),this.close(f.OFFLINE,"offline",!1)},4e3))},1e3)),this.webSocket.send("?"))});let{url:s=globalThis.__insite?.wss_url||"/",name:h=(re++).toString(),protocols:d,immediately:l=!0,reconnectAfter:a=2e3,on:T,quiet:Q=!1,signal:M}=e;if(this.url=s,this.name=h,this.protocols=d,this.reconnectAfter=a,T)for(let b in T)T[b]&&this.on(b,T[b]);o(this,C,Q),o(this,y,M),t(this,y)?.addEventListener("abort",t(this,B),{once:!0}),this.url&&l&&this.open().catch(X),t(this,C)||this.on("error",b=>b&&console.error("\u{1F50C}\u2757\uFE0F WS",`${this.name}:`,b))}on(e,s){return super.on(e,s)}get state(){if(!this.webSocket)return"closed";switch(this.webSocket.readyState){case WebSocket.CONNECTING:return"connecting";case WebSocket.OPEN:return t(this,p)?"unresponsive":"open";case WebSocket.CLOSING:return"closing"}return"closed"}get isConnecting(){return this.webSocket?.readyState===WebSocket.CONNECTING}get isOpen(){return this.webSocket?.readyState===WebSocket.OPEN}get isClosing(){return this.webSocket?.readyState===WebSocket.CLOSING}get isClosed(){return!this.webSocket}async open(e={}){if(this.isDestroyed)throw new Error("WS has been destroyed");if(t(this,y)?.aborted)throw new DOMException("Operation aborted","AbortError");if(t(this,E)?.isPending)return t(this,E);this.isUsed?this.close(f.REOPEN,"reopen"):this.isUsed=!0;let s;return e.url&&this.url!==e.url&&(s=this.url,this.url=e.url),e.protocols&&(this.protocols=e.protocols),o(this,E,new oe((h,d)=>{if(this.url){let l=new WebSocket(this.url,this.protocols);l.addEventListener("open",t(this,q),{once:!0}),l.addEventListener("message",t(this,x)),l.addEventListener("error",t(this,I)),l.addEventListener("close",t(this,_),{once:!0}),this.webSocket=l,s&&this.emit("server-change",this.url,s),this.emit("connecting"),"navigator"in globalThis&&"addEventListener"in globalThis&&globalThis.addEventListener("offline",t(this,D))}else this.webSocket=null,d(new Error("url prop is not set"))})),t(this,E)}close(e=f.MANUAL,s="manual",h=!0){this.isClosed?N(this,u,H).call(this,e):(this.webSocket.removeEventListener("close",t(this,_)),this.webSocket.close(e,s),t(this,_).call(this,Object.assign(new Event("close"),{code:e,reason:s,wasClean:h})))}send(e){this.isOpen?this.webSocket.send(e):(t(this,R).length||this.once("open",t(this,W)),t(this,R).push(e))}sendMessage(...e){return this.send(JSON.stringify(e))}sendRequest(...e){let s=Y(this,P)._++;t(this,P)>=j&&o(this,P,0);let h=`message:${A.RESPONSE}-${s}`,d=e.at(-1);return typeof d=="function"?(this.once(h,d),this.sendMessage(A.REQUEST,s,...e.slice(0,-1)),this):new Promise((l,a)=>{this.once(h,(T,Q)=>{if(T){let{message:M,...b}=T;a(Object.assign(new Error(M),b))}else l(Q)}),this.sendMessage(A.REQUEST,s,...e)})}addRequestListener(e,s){return t(this,U).set(e,s),this}removeRequestListener(e){return t(this,U).delete(e),this}destroy(){this.isDestroyed=!0,t(this,R).length=0,this.close(f.NORMAL,"destroy"),this.removeAllListeners(),t(this,y)?.removeEventListener("abort",t(this,B)),this.emit("destroy")}};C=new WeakMap,y=new WeakMap,u=new WeakSet,L=function(e){if(e!==this.connectionQuality){let s=this.connectionQuality;this.connectionQuality=e,this.emit("connection-quality-change",this.connectionQuality,s)}},v=new WeakMap,V=function(){clearTimeout(t(this,v)),o(this,v,setTimeout(()=>this.close(f.NO_HEARTBEAT,"no-heartbeat",!1),35e3)),t(this,S)&&(clearTimeout(t(this,S)),o(this,S,void 0)),o(this,g,!1),t(this,O)&&(clearTimeout(t(this,O)),o(this,O,void 0)),t(this,p)&&(o(this,p,!1),this.emit("responsive")),N(this,u,L).call(this,m.CONNECTION_QUALITY.OPEN)},S=new WeakMap,g=new WeakMap,O=new WeakMap,p=new WeakMap,E=new WeakMap,w=new WeakMap,q=new WeakMap,x=new WeakMap,I=new WeakMap,k=new WeakMap,H=function(e){t(this,k)&&clearTimeout(t(this,k)),this.reconnectAfter&&!J.includes(e)?(process.env.NODE_ENV==="development"&&!t(this,C)&&console.info(`\u{1F50C} WS ${this.name} will try to reconnect in ${Math.round(this.reconnectAfter/1e3)} seconds`),o(this,k,setTimeout(()=>this.open().catch(X),this.reconnectAfter)),N(this,u,L).call(this,m.CONNECTION_QUALITY.RECONNECTING)):(o(this,k,void 0),N(this,u,L).call(this,e===f.REOPEN?m.CONNECTION_QUALITY.RECONNECTING:m.CONNECTION_QUALITY.CLOSED))},_=new WeakMap,B=new WeakMap,R=new WeakMap,W=new WeakMap,P=new WeakMap,U=new WeakMap,G=new WeakMap,D=new WeakMap,c(m,"CONNECTION_QUALITY",{CLOSED:0,RECONNECTING:1,UNRESPONSIVE:2,CHECKING_RESPONSIVENESS:3,OPEN:4});var z=m;export{z as WS};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/client/WS.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\ndeclare global {\n\tvar __insite: { // eslint-disable-line no-var\n\t\twss_url?: string;\n\t} | undefined;\n}\n\nlet i = 0;\n\nexport type Options = {\n\turl?: URL | string;\n\tname?: string;\n\tprotocols?: string[];\n\timmediately?: boolean;\n\treconnectAfter?: number | null;\n\ton?: Record<string, (...args: any[]) => void>;// eslint-disable-line @typescript-eslint/no-explicit-any\n\tquiet?: boolean;\n};\n\ntype RequestListener = (...args: any[]) => Promise<any> | any;// eslint-disable-line @typescript-eslint/no-explicit-any\n\n\nexport class WS extends EventEmitter {\n\tconstructor(options: Options = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\turl = globalThis.__insite?.wss_url ?? \"/\",\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\tthis.on(\"error\", (error: Error) => error && console.error(\"\uD83D\uDD0C\u2757\uFE0F WS\", `${this.name}:`, error));\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: WebSocket | null = null;\n\t\n\t#defib = debounce(WS.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(`\uD83D\uDD0C WS ${this.name} is closed ${event.code ? `with code ${event.code}` : \"\"} ${event.code && event.reason ? \"and \" : \"\"}${event.reason ? `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(`\uD83D\uDD0C WS ${this.name} will try to reconnect in 2 seconds`);\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: URL | string | undefined;\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: WS) {\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(`\uD83D\uDD0C WS ${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", "_WS", "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", "WS"]
3
+ "sources": ["../../src/client/WS.ts", "../../src/common.ts"],
4
+ "sourcesContent": ["import EventEmitter from \"eventemitter3\";\nimport { noop, StatefulPromise } from \"@nesvet/n\";\nimport {\n\tCODES,\n\tHEARTBEAT_GAP,\n\tHEARTBEAT_INTERVAL,\n\tNON_RECONNECTABLE_CODES,\n\tOFFLINE_TIMEOUT,\n\tREQUEST_COUNTER_LIMIT,\n\tREQUEST_HEADERS,\n\tRESPONSIVENESS_TIMEOUT\n} from \"../common\";\nimport type { ConnectionQuality, Options, RequestListener } from \"./types\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\nlet i = 0;\n\n\nexport class WS extends EventEmitter {\n\tconstructor(options: Options = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\turl = globalThis.__insite?.wss_url || \"/\",\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\tsignal\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\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\tthis.#abortSignal = signal;\n\t\tthis.#abortSignal?.addEventListener(\"abort\", this.#handleAbortSignalAbort, { once: true });\n\t\t\n\t\tif (this.url && immediately)\n\t\t\tthis.open().catch(noop);\n\t\t\n\t\tif (!this.#isQuiet)\n\t\t\tthis.on(\"error\", (error: Error) => error && console.error(\"\uD83D\uDD0C\u2757\uFE0F WS\", `${this.name}:`, error));\n\t\t\n\t}\n\t\n\ton(event: \"connecting\" | \"destroy\" | \"open\" | \"responsive\" | \"unresponsive\", callback: (this: this) => void): this;\n\ton<T extends unknown[]>(event: \"message\", callback: (this: this, kind: string, ...rest: T) => void): this;\n\ton<T extends unknown[]>(event: `message:${string}`, callback: (this: this, ...rest: T) => void): this;\n\ton(event: \"connection-quality-change\", callback: (this: this, connectionQuality: ConnectionQuality, prevConnectionQuality: ConnectionQuality) => void): this;\n\ton(event: \"close\", callback: (this: this, closeEvent: CloseEvent) => void): this;\n\ton(event: \"server-change\", callback: (this: this, url: string, prevURL: string) => void): this;\n\ton(event: \"error\", callback: (this: this, error: Error) => void): this;\n\t\n\ton<T extends string | symbol>(event: T, fn: (...args: any[]) => void): this;\n\ton(event: string | symbol, listener: (this: this, ...args: any[]) => void): this {\n\t\treturn super.on(event, listener);\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\t#abortSignal?: AbortSignal;\n\t\n\tisUsed = false;\n\t\n\tconnectionQuality: ConnectionQuality = 0;\n\t\n\t#updateConnectionQuality(connectionQuality: ConnectionQuality) {\n\t\tif (connectionQuality !== this.connectionQuality) {\n\t\t\tconst prevConnectionQuality = this.connectionQuality;\n\t\t\tthis.connectionQuality = connectionQuality;\n\t\t\t\n\t\t\tthis.emit(\"connection-quality-change\", this.connectionQuality, prevConnectionQuality);\n\t\t}\n\t\t\n\t}\n\t\n\twebSocket: WebSocket | null = null;\n\t\n\t#heartbeatTimeout?: ReturnType<typeof setTimeout>;\n\t\n\t#defib() {\n\t\t\n\t\tclearTimeout(this.#heartbeatTimeout);\n\t\tthis.#heartbeatTimeout = setTimeout(\n\t\t\t() => this.close(CODES.NO_HEARTBEAT, \"no-heartbeat\", false),\n\t\t\tHEARTBEAT_INTERVAL + HEARTBEAT_GAP\n\t\t);\n\t\t\n\t\tif (this.#unresponsiveTimeout) {\n\t\t\tclearTimeout(this.#unresponsiveTimeout);\n\t\t\tthis.#unresponsiveTimeout = undefined;\n\t\t}\n\t\t\n\t\tthis.#isCheckingResponsiveness = false;\n\t\t\n\t\tif (this.#offlineTimeout) {\n\t\t\tclearTimeout(this.#offlineTimeout);\n\t\t\tthis.#offlineTimeout = undefined;\n\t\t}\n\t\t\n\t\tif (this.#isUnresponsive) {\n\t\t\tthis.#isUnresponsive = false;\n\t\t\t\n\t\t\tthis.emit(\"responsive\");\n\t\t}\n\t\t\n\t\tthis.#updateConnectionQuality(WS.CONNECTION_QUALITY.OPEN);\n\t\t\n\t}\n\t\n\t#unresponsiveTimeout?: ReturnType<typeof setTimeout>;\n\t#isCheckingResponsiveness = false;\n\t\n\t#offlineTimeout?: ReturnType<typeof setTimeout>;\n\t#isUnresponsive = false;\n\t\n\tget state() {\n\t\t\n\t\tif (!this.webSocket)\n\t\t\treturn \"closed\";\n\t\t\n\t\tswitch (this.webSocket.readyState) {\n\t\t\tcase WebSocket.CONNECTING:\n\t\t\t\treturn \"connecting\";\n\t\t\t\n\t\t\tcase WebSocket.OPEN:\n\t\t\t\treturn this.#isUnresponsive ? \"unresponsive\" : \"open\";\n\t\t\t\n\t\t\tcase WebSocket.CLOSING:\n\t\t\t\treturn \"closing\";\n\t\t}\n\t\t\n\t\treturn \"closed\";\n\t}\n\t\n\tget isConnecting() {\n\t\treturn this.webSocket?.readyState === WebSocket.CONNECTING;\n\t}\n\t\n\tget isOpen() {\n\t\treturn this.webSocket?.readyState === WebSocket.OPEN;\n\t}\n\t\n\tget isClosing() {\n\t\treturn this.webSocket?.readyState === WebSocket.CLOSING;\n\t}\n\t\n\tget isClosed() {\n\t\treturn !this.webSocket;\n\t}\n\t\n\tisDestroyed = false;\n\t\n\t#openPromise?: StatefulPromise<void>;\n\t\n\t#wasOpened = false;\n\t\n\t#handleWebSocketOpen = () => {\n\t\t\n\t\tthis.#wasOpened = true;\n\t\t\n\t\tthis.#openPromise!.resolve();\n\t\t\n\t\tthis.#defib();\n\t\t\n\t\tthis.emit(\"open\");\n\t\t\n\t};\n\t\n\t#handleWebSocketMessage = ({ data: message }: MessageEvent<string>) => {\n\t\t\n\t\tthis.#defib();\n\t\t\n\t\tif (message) {\n\t\t\tif (message !== \"!\")\n\t\t\t\ttry {\n\t\t\t\t\tconst [ kind, ...rest ] = JSON.parse(message);\n\t\t\t\t\t\n\t\t\t\t\tswitch (kind) {\n\t\t\t\t\t\tcase REQUEST_HEADERS.REQUEST:\n\t\t\t\t\t\t\tvoid this.#handleRequest(...rest as [ id: number, kind: string, ...rest: unknown[] ]);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthis.emit(\"message\", kind, ...rest);\n\t\t\t\t\t\t\tthis.emit(`message:${kind}`, ...rest);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.#handleWebSocketError(error as Error);\n\t\t\t\t}\n\t\t} else\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 as Error);\n\t\t\n\t\tthis.emit(\"error\", error);\n\t\t\n\t};\n\t\n\t#reconnectTimeout?: ReturnType<typeof setTimeout>;\n\t\n\t#decideReconnect(code: number) {\n\t\t\n\t\tif (this.#reconnectTimeout)\n\t\t\tclearTimeout(this.#reconnectTimeout);\n\t\t\n\t\tif (this.reconnectAfter && !NON_RECONNECTABLE_CODES.includes(code as typeof NON_RECONNECTABLE_CODES[number])) {\n\t\t\tif (process.env.NODE_ENV === \"development\" && !this.#isQuiet)\n\t\t\t\tconsole.info(`\uD83D\uDD0C WS ${this.name} will try to reconnect in ${Math.round(this.reconnectAfter / 1000)} seconds`);\n\t\t\t\n\t\t\tthis.#reconnectTimeout = setTimeout(() => this.open().catch(noop), this.reconnectAfter);\n\t\t\t\n\t\t\tthis.#updateConnectionQuality(WS.CONNECTION_QUALITY.RECONNECTING);\n\t\t} else {\n\t\t\tthis.#reconnectTimeout = undefined;\n\t\t\t\n\t\t\tthis.#updateConnectionQuality(code === CODES.REOPEN ? WS.CONNECTION_QUALITY.RECONNECTING : WS.CONNECTION_QUALITY.CLOSED);\n\t\t}\n\t\t\n\t}\n\t\n\t#handleWebSocketClose = (event: CloseEvent) => {\n\t\tconst { code, reason, wasClean } = event;\n\t\t\n\t\tif (this.#heartbeatTimeout) {\n\t\t\tclearTimeout(this.#heartbeatTimeout);\n\t\t\tthis.#heartbeatTimeout = undefined;\n\t\t}\n\t\t\n\t\tif (this.#unresponsiveTimeout) {\n\t\t\tclearTimeout(this.#unresponsiveTimeout);\n\t\t\tthis.#unresponsiveTimeout = undefined;\n\t\t}\n\t\t\n\t\tthis.#isCheckingResponsiveness = false;\n\t\t\n\t\tif (this.#offlineTimeout) {\n\t\t\tclearTimeout(this.#offlineTimeout);\n\t\t\tthis.#offlineTimeout = undefined;\n\t\t}\n\t\t\n\t\tthis.#isUnresponsive = false;\n\t\t\n\t\tif (this.#openPromise?.isPending)\n\t\t\tthis.#openPromise.reject(new Error(\"Closed\"));\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\" && !this.#isQuiet) {\n\t\t\tlet message = `\uD83D\uDD0C WS ${this.name} is closed`;\n\t\t\t\n\t\t\tif (code)\n\t\t\t\tmessage += ` with code ${code}`;\n\t\t\t\n\t\t\tif (code && reason)\n\t\t\t\tmessage += \" and\";\n\t\t\t\n\t\t\tif (reason)\n\t\t\t\tmessage += ` reason \"${reason}\"`;\n\t\t\t\n\t\t\tswitch (reason) {\n\t\t\t\tcase \"no-heartbeat\":\n\t\t\t\t\tmessage += \". Going offline\";\n\t\t\t}\n\t\t\t\n\t\t\tif (!wasClean || code === CODES.ABNORMAL) {\n\t\t\t\tmessage += \" [UNEXPECTED]\";\n\t\t\t\tconsole.warn(message);\n\t\t\t} else\n\t\t\t\tconsole.info(message);\n\t\t}\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\t\n\t\tif (this.#wasOpened) {\n\t\t\tthis.emit(\"close\", event);\n\t\t\t\n\t\t\tthis.#wasOpened = false;\n\t\t}\n\t\t\n\t\tthis.webSocket = null;\n\t\t\n\t\tthis.#decideReconnect(code);\n\t\t\n\t\tif (\"navigator\" in globalThis && \"addEventListener\" in globalThis)\n\t\t\tglobalThis.removeEventListener(\"offline\", this.#handleOffline);\n\t\t\n\t};\n\t\n\t#handleAbortSignalAbort = () =>\n\t\tthis.#openPromise?.isPending &&\n\t\tthis.#openPromise.reject(new DOMException(\"Operation aborted\", \"AbortError\"));\n\t\n\tasync open(options: Pick<Options, \"protocols\" | \"url\"> = {}): Promise<void> {\n\t\t\n\t\tif (this.isDestroyed)\n\t\t\tthrow new Error(\"WS has been destroyed\");\n\t\t\n\t\tif (this.#abortSignal?.aborted)\n\t\t\tthrow new DOMException(\"Operation aborted\", \"AbortError\");\n\t\t\n\t\tif (this.#openPromise?.isPending)\n\t\t\treturn this.#openPromise;\n\t\t\n\t\tif (this.isUsed)\n\t\t\tthis.close(CODES.REOPEN, \"reopen\");\n\t\telse\n\t\t\tthis.isUsed = true;\n\t\t\n\t\tlet prevURL: URL | string | undefined;\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((_, 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, { once: true });\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.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\t\n\t\t\t\tif (\"navigator\" in globalThis && \"addEventListener\" in globalThis)\n\t\t\t\t\tglobalThis.addEventListener(\"offline\", this.#handleOffline);\n\t\t\t} else {\n\t\t\t\tthis.webSocket = null;\n\t\t\t\t\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\t/**\n\t * Alias for `open()`\n\t */\n\tconnect = this.open;\n\t\n\tclose(code: number = CODES.MANUAL, reason = \"manual\", wasClean: boolean = true) {\n\t\t\n\t\tif (this.isClosed)\n\t\t\tthis.#decideReconnect(code);\n\t\telse {\n\t\t\tthis.webSocket!.removeEventListener(\"close\", this.#handleWebSocketClose);\n\t\t\t\n\t\t\tthis.webSocket!.close(code, reason);\n\t\t\t\n\t\t\tthis.#handleWebSocketClose(Object.assign(new Event(\"close\"), {\n\t\t\t\tcode,\n\t\t\t\treason,\n\t\t\t\twasClean\n\t\t\t}));\n\t\t}\n\t\t\n\t}\n\t\n\t/**\n\t * Alias for `close()`\n\t */\n\tdisconnect = this.close;\n\t\n\t#queue: (ArrayBufferLike | ArrayBufferView | Blob | 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\tsend(data: ArrayBufferLike | ArrayBufferView | Blob | string) {\n\t\t\n\t\tif (this.isOpen)\n\t\t\tthis.webSocket!.send(data);\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(data);\n\t\t}\n\t\t\n\t}\n\t\n\tsendMessage(...args: unknown[]) {\n\t\treturn this.send(JSON.stringify(args));\n\t}\n\t\n\t#requestCounter = 0;\n\t\n\tsendRequest<T>(...args: [...unknown[], callback: (error: Error | null, result: T) => void]): this;\n\tsendRequest<T>(...args: unknown[]): Promise<T>;\n\tsendRequest<T>(...args: unknown[]) {\n\t\t\n\t\tconst id = this.#requestCounter++;\n\t\t\n\t\tif (this.#requestCounter >= REQUEST_COUNTER_LIMIT)\n\t\t\tthis.#requestCounter = 0;\n\t\t\n\t\tconst eventName = `message:${REQUEST_HEADERS.RESPONSE}-${id}`;\n\t\t\n\t\tconst lastArg = args.at(-1);\n\t\t\n\t\tif (typeof lastArg == \"function\") {\n\t\t\tthis.once(eventName, lastArg as (error: Error, result: T) => void);\n\t\t\t\n\t\t\tthis.sendMessage(REQUEST_HEADERS.REQUEST, id, ...args.slice(0, -1));\n\t\t\t\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\treturn new Promise<T>((resolve, reject) => {\n\t\t\t\n\t\t\tthis.once(eventName, (error, result: T) => {\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) as Error);\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\t\n\t\t\tthis.sendMessage(REQUEST_HEADERS.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\t/**\n\t * Alias for `addRequestListener()`\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\t/**\n\t * Alias for `removeRequestListener()`\n\t */\n\toffRequest = this.removeRequestListener;\n\t\n\t#handleRequest = async (id: number, 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(`${REQUEST_HEADERS.RESPONSE}-${id}`, requestError, result);\n\t\t\n\t};\n\t\n\t#handleOffline = () => {\n\t\t\n\t\tif (this.isOpen && !this.#isCheckingResponsiveness) {\n\t\t\tthis.#isCheckingResponsiveness = true;\n\t\t\t\n\t\t\tthis.#updateConnectionQuality(WS.CONNECTION_QUALITY.CHECKING_RESPONSIVENESS);\n\t\t\t\n\t\t\tthis.#unresponsiveTimeout = setTimeout(() => {\n\t\t\t\t\n\t\t\t\tthis.#isCheckingResponsiveness = false;\n\t\t\t\tthis.#isUnresponsive = true;\n\t\t\t\t\n\t\t\t\tthis.#updateConnectionQuality(WS.CONNECTION_QUALITY.UNRESPONSIVE);\n\t\t\t\t\n\t\t\t\tthis.emit(\"unresponsive\");\n\t\t\t\t\n\t\t\t\tthis.#offlineTimeout = setTimeout(() => {\n\t\t\t\t\t\n\t\t\t\t\tthis.#isUnresponsive = false;\n\t\t\t\t\t\n\t\t\t\t\tthis.close(CODES.OFFLINE, \"offline\", false);\n\t\t\t\t\t\n\t\t\t\t}, OFFLINE_TIMEOUT - RESPONSIVENESS_TIMEOUT);\n\t\t\t\t\n\t\t\t}, RESPONSIVENESS_TIMEOUT);\n\t\t\t\n\t\t\tthis.webSocket!.send(\"?\");\n\t\t}\n\t\t\n\t};\n\t\n\tdestroy() {\n\t\t\n\t\tthis.isDestroyed = true;\n\t\t\n\t\tthis.#queue.length = 0;\n\t\t\n\t\tthis.close(CODES.NORMAL, \"destroy\");\n\t\t\n\t\tthis.removeAllListeners();\n\t\t\n\t\tthis.#abortSignal?.removeEventListener(\"abort\", this.#handleAbortSignalAbort);\n\t\t\n\t\tthis.emit(\"destroy\");\n\t\t\n\t}\n\t\n\t\n\tstatic CONNECTION_QUALITY = {\n\t\tCLOSED: 0,\n\t\tRECONNECTING: 1,\n\t\tUNRESPONSIVE: 2,\n\t\tCHECKING_RESPONSIVENESS: 3,\n\t\tOPEN: 4\n\t} as const;\n\t\n}\n", "export const HEARTBEAT_INTERVAL = 5_000;\nexport const HEARTBEAT_GAP = 30_000;\nexport const RESPONSIVENESS_TIMEOUT = 1000;\nexport const OFFLINE_TIMEOUT = 5000;\nexport const REQUEST_COUNTER_LIMIT = Number.MAX_SAFE_INTEGER / 2;\n\nexport const CODES = {\n\tNORMAL: 1000,\n\tPROTOCOL_ERROR: 1002,\n\tABNORMAL: 1006,\n\tNO_HEARTBEAT: 3000,\n\tOFFLINE: 3001,\n\tMANUAL: 3500,\n\tREOPEN: 4000\n} as const;\n\nexport const NON_RECONNECTABLE_CODES = [\n\tCODES.PROTOCOL_ERROR,\n\tCODES.MANUAL,\n\tCODES.REOPEN\n];\n\nexport const REQUEST_HEADERS = {\n\tREQUEST: \"~r-q\",\n\tRESPONSE: \"~r-s\"\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["EventEmitter", "noop", "StatefulPromise", "REQUEST_COUNTER_LIMIT", "CODES", "NON_RECONNECTABLE_CODES", "REQUEST_HEADERS", "i", "_isQuiet", "_abortSignal", "_WS_instances", "updateConnectionQuality_fn", "_heartbeatTimeout", "defib_fn", "_unresponsiveTimeout", "_isCheckingResponsiveness", "_offlineTimeout", "_isUnresponsive", "_openPromise", "_wasOpened", "_handleWebSocketOpen", "_handleWebSocketMessage", "_handleWebSocketError", "_reconnectTimeout", "decideReconnect_fn", "_handleWebSocketClose", "_handleAbortSignalAbort", "_queue", "_releaseQueue", "_requestCounter", "_requestListeners", "_handleRequest", "_handleOffline", "_WS", "EventEmitter", "options", "__privateAdd", "__publicField", "__privateSet", "__privateGet", "__privateMethod", "message", "kind", "rest", "REQUEST_HEADERS", "error", "event", "code", "reason", "wasClean", "CODES", "webSocket", "id", "listener", "result", "requestError", "restProps", "url", "name", "protocols", "immediately", "reconnectAfter", "on", "quiet", "signal", "eventName", "noop", "prevURL", "StatefulPromise", "_", "reject", "data", "args", "__privateWrapper", "REQUEST_COUNTER_LIMIT", "lastArg", "resolve", "connectionQuality", "prevConnectionQuality", "NON_RECONNECTABLE_CODES", "WS"]
7
7
  }
@@ -0,0 +1,5 @@
1
+ declare global {
2
+ var WebSocket: typeof WebSocket;
3
+ }
4
+ export {};
5
+ //# sourceMappingURL=global.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../../../src/client/node/global.ts"],"names":[],"mappings":"AAGA,OAAO,CAAC,MAAM,CAAC;IACd,IAAI,SAAS,EAAE,OAAO,SAAS,CAAC;CAChC"}
@@ -0,0 +1,3 @@
1
+ import "./global";
2
+ export * from "..";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,CAAC;AAGlB,cAAc,IAAI,CAAC"}
@@ -0,0 +1,2 @@
1
+ import O from"ws";globalThis.WebSocket=O;import g from"eventemitter3";import{noop as N,StatefulPromise as v}from"@nesvet/n";var d=Number.MAX_SAFE_INTEGER/2,r={NORMAL:1e3,PROTOCOL_ERROR:1002,ABNORMAL:1006,NO_HEARTBEAT:3e3,OFFLINE:3001,MANUAL:3500,REOPEN:4e3},f=[r.PROTOCOL_ERROR,r.MANUAL,r.REOPEN],a={REQUEST:"~r-q",RESPONSE:"~r-s"};var R=0,S=class l extends g{constructor(e={}){super();let{url:t=globalThis.__insite?.wss_url||"/",name:s=(R++).toString(),protocols:o,immediately:i=!0,reconnectAfter:n=2e3,on:h,quiet:E=!1,signal:u}=e;if(this.url=t,this.name=s,this.protocols=o,this.reconnectAfter=n,h)for(let c in h)h[c]&&this.on(c,h[c]);this.#c=E,this.#l=u,this.#l?.addEventListener("abort",this.#p,{once:!0}),this.url&&i&&this.open().catch(N),this.#c||this.on("error",c=>c&&console.error("\u{1F50C}\u2757\uFE0F WS",`${this.name}:`,c))}on(e,t){return super.on(e,t)}isWebSocket=!0;isWebSocketServer=!1;isWebSocketServerClient=!1;url;name;protocols;reconnectAfter;#c;#l;isUsed=!1;connectionQuality=0;#n(e){if(e!==this.connectionQuality){let t=this.connectionQuality;this.connectionQuality=e,this.emit("connection-quality-change",this.connectionQuality,t)}}webSocket=null;#o;#N(){clearTimeout(this.#o),this.#o=setTimeout(()=>this.close(r.NO_HEARTBEAT,"no-heartbeat",!1),35e3),this.#t&&(clearTimeout(this.#t),this.#t=void 0),this.#r=!1,this.#s&&(clearTimeout(this.#s),this.#s=void 0),this.#i&&(this.#i=!1,this.emit("responsive")),this.#n(l.CONNECTION_QUALITY.OPEN)}#t;#r=!1;#s;#i=!1;get state(){if(!this.webSocket)return"closed";switch(this.webSocket.readyState){case WebSocket.CONNECTING:return"connecting";case WebSocket.OPEN:return this.#i?"unresponsive":"open";case WebSocket.CLOSING:return"closing"}return"closed"}get isConnecting(){return this.webSocket?.readyState===WebSocket.CONNECTING}get isOpen(){return this.webSocket?.readyState===WebSocket.OPEN}get isClosing(){return this.webSocket?.readyState===WebSocket.CLOSING}get isClosed(){return!this.webSocket}isDestroyed=!1;#e;#E=!1;#S=()=>{this.#E=!0,this.#e.resolve(),this.#N(),this.emit("open")};#O=({data:e})=>{if(this.#N(),e){if(e!=="!")try{let[t,...s]=JSON.parse(e);switch(t){case a.REQUEST:this.#v(...s);break;default:this.emit("message",t,...s),this.emit(`message:${t}`,...s)}}catch(t){this.#u(t)}}else this.webSocket.send("")};#u=e=>{e instanceof Event&&(e=void 0),this.#e?.isPending&&this.#e.reject(e),this.emit("error",e)};#a;#m(e){this.#a&&clearTimeout(this.#a),this.reconnectAfter&&!f.includes(e)?(process.env.NODE_ENV==="development"&&!this.#c&&console.info(`\u{1F50C} WS ${this.name} will try to reconnect in ${Math.round(this.reconnectAfter/1e3)} seconds`),this.#a=setTimeout(()=>this.open().catch(N),this.reconnectAfter),this.#n(l.CONNECTION_QUALITY.RECONNECTING)):(this.#a=void 0,this.#n(e===r.REOPEN?l.CONNECTION_QUALITY.RECONNECTING:l.CONNECTION_QUALITY.CLOSED))}#d=e=>{let{code:t,reason:s,wasClean:o}=e;if(this.#o&&(clearTimeout(this.#o),this.#o=void 0),this.#t&&(clearTimeout(this.#t),this.#t=void 0),this.#r=!1,this.#s&&(clearTimeout(this.#s),this.#s=void 0),this.#i=!1,this.#e?.isPending&&this.#e.reject(new Error("Closed")),process.env.NODE_ENV==="development"&&!this.#c){let n=`\u{1F50C} WS ${this.name} is closed`;switch(t&&(n+=` with code ${t}`),t&&s&&(n+=" and"),s&&(n+=` reason "${s}"`),s){case"no-heartbeat":n+=". Going offline"}!o||t===r.ABNORMAL?(n+=" [UNEXPECTED]",console.warn(n)):console.info(n)}let i=this.webSocket;i.removeEventListener("open",this.#S),i.removeEventListener("message",this.#O),i.removeEventListener("error",this.#u),this.#E&&(this.emit("close",e),this.#E=!1),this.webSocket=null,this.#m(t),"navigator"in globalThis&&"addEventListener"in globalThis&&globalThis.removeEventListener("offline",this.#b)};#p=()=>this.#e?.isPending&&this.#e.reject(new DOMException("Operation aborted","AbortError"));async open(e={}){if(this.isDestroyed)throw new Error("WS has been destroyed");if(this.#l?.aborted)throw new DOMException("Operation aborted","AbortError");if(this.#e?.isPending)return this.#e;this.isUsed?this.close(r.REOPEN,"reopen"):this.isUsed=!0;let t;return e.url&&this.url!==e.url&&(t=this.url,this.url=e.url),e.protocols&&(this.protocols=e.protocols),this.#e=new v((s,o)=>{if(this.url){let i=new WebSocket(this.url,this.protocols);i.addEventListener("open",this.#S,{once:!0}),i.addEventListener("message",this.#O),i.addEventListener("error",this.#u),i.addEventListener("close",this.#d,{once:!0}),this.webSocket=i,t&&this.emit("server-change",this.url,t),this.emit("connecting"),"navigator"in globalThis&&"addEventListener"in globalThis&&globalThis.addEventListener("offline",this.#b)}else this.webSocket=null,o(new Error("url prop is not set"))}),this.#e}connect=this.open;close(e=r.MANUAL,t="manual",s=!0){this.isClosed?this.#m(e):(this.webSocket.removeEventListener("close",this.#d),this.webSocket.close(e,t),this.#d(Object.assign(new Event("close"),{code:e,reason:t,wasClean:s})))}disconnect=this.close;#h=[];#g=()=>{for(let e of this.#h)this.webSocket.send(e);this.#h.length=0};send(e){this.isOpen?this.webSocket.send(e):(this.#h.length||this.once("open",this.#g),this.#h.push(e))}sendMessage(...e){return this.send(JSON.stringify(e))}#f=0;sendRequest(...e){let t=this.#f++;this.#f>=d&&(this.#f=0);let s=`message:${a.RESPONSE}-${t}`,o=e.at(-1);return typeof o=="function"?(this.once(s,o),this.sendMessage(a.REQUEST,t,...e.slice(0,-1)),this):new Promise((i,n)=>{this.once(s,(h,E)=>{if(h){let{message:u,...c}=h;n(Object.assign(new Error(u),c))}else i(E)}),this.sendMessage(a.REQUEST,t,...e)})}#T=new Map;addRequestListener(e,t){return this.#T.set(e,t),this}onRequest=this.addRequestListener;removeRequestListener(e){return this.#T.delete(e),this}offRequest=this.removeRequestListener;#v=async(e,t,...s)=>{let o=this.#T.get(t),i,n=null;if(o)try{i=await o.apply(this,s)}catch(h){if(h instanceof Error){let{message:E,...u}=h;n={message:E,...u}}}else n={message:`Unknown request kind "${t}"`};this.sendMessage(`${a.RESPONSE}-${e}`,n,i)};#b=()=>{this.isOpen&&!this.#r&&(this.#r=!0,this.#n(l.CONNECTION_QUALITY.CHECKING_RESPONSIVENESS),this.#t=setTimeout(()=>{this.#r=!1,this.#i=!0,this.#n(l.CONNECTION_QUALITY.UNRESPONSIVE),this.emit("unresponsive"),this.#s=setTimeout(()=>{this.#i=!1,this.close(r.OFFLINE,"offline",!1)},4e3)},1e3),this.webSocket.send("?"))};destroy(){this.isDestroyed=!0,this.#h.length=0,this.close(r.NORMAL,"destroy"),this.removeAllListeners(),this.#l?.removeEventListener("abort",this.#p),this.emit("destroy")}static CONNECTION_QUALITY={CLOSED:0,RECONNECTING:1,UNRESPONSIVE:2,CHECKING_RESPONSIVENESS:3,OPEN:4}};export{S as WS};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/client/node/global.ts", "../../../src/client/WS.ts", "../../../src/common.ts"],
4
+ "sourcesContent": ["import WebSocket from \"ws\";\n\n\ndeclare global {\n\tvar WebSocket: typeof WebSocket;// eslint-disable-line no-var, @typescript-eslint/naming-convention, no-shadow\n}\n\nglobalThis.WebSocket = WebSocket as any;// eslint-disable-line @typescript-eslint/no-explicit-any\n", "import EventEmitter from \"eventemitter3\";\nimport { noop, StatefulPromise } from \"@nesvet/n\";\nimport {\n\tCODES,\n\tHEARTBEAT_GAP,\n\tHEARTBEAT_INTERVAL,\n\tNON_RECONNECTABLE_CODES,\n\tOFFLINE_TIMEOUT,\n\tREQUEST_COUNTER_LIMIT,\n\tREQUEST_HEADERS,\n\tRESPONSIVENESS_TIMEOUT\n} from \"../common\";\nimport type { ConnectionQuality, Options, RequestListener } from \"./types\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\nlet i = 0;\n\n\nexport class WS extends EventEmitter {\n\tconstructor(options: Options = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\turl = globalThis.__insite?.wss_url || \"/\",\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\tsignal\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\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\tthis.#abortSignal = signal;\n\t\tthis.#abortSignal?.addEventListener(\"abort\", this.#handleAbortSignalAbort, { once: true });\n\t\t\n\t\tif (this.url && immediately)\n\t\t\tthis.open().catch(noop);\n\t\t\n\t\tif (!this.#isQuiet)\n\t\t\tthis.on(\"error\", (error: Error) => error && console.error(\"\uD83D\uDD0C\u2757\uFE0F WS\", `${this.name}:`, error));\n\t\t\n\t}\n\t\n\ton(event: \"connecting\" | \"destroy\" | \"open\" | \"responsive\" | \"unresponsive\", callback: (this: this) => void): this;\n\ton<T extends unknown[]>(event: \"message\", callback: (this: this, kind: string, ...rest: T) => void): this;\n\ton<T extends unknown[]>(event: `message:${string}`, callback: (this: this, ...rest: T) => void): this;\n\ton(event: \"connection-quality-change\", callback: (this: this, connectionQuality: ConnectionQuality, prevConnectionQuality: ConnectionQuality) => void): this;\n\ton(event: \"close\", callback: (this: this, closeEvent: CloseEvent) => void): this;\n\ton(event: \"server-change\", callback: (this: this, url: string, prevURL: string) => void): this;\n\ton(event: \"error\", callback: (this: this, error: Error) => void): this;\n\t\n\ton<T extends string | symbol>(event: T, fn: (...args: any[]) => void): this;\n\ton(event: string | symbol, listener: (this: this, ...args: any[]) => void): this {\n\t\treturn super.on(event, listener);\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\t#abortSignal?: AbortSignal;\n\t\n\tisUsed = false;\n\t\n\tconnectionQuality: ConnectionQuality = 0;\n\t\n\t#updateConnectionQuality(connectionQuality: ConnectionQuality) {\n\t\tif (connectionQuality !== this.connectionQuality) {\n\t\t\tconst prevConnectionQuality = this.connectionQuality;\n\t\t\tthis.connectionQuality = connectionQuality;\n\t\t\t\n\t\t\tthis.emit(\"connection-quality-change\", this.connectionQuality, prevConnectionQuality);\n\t\t}\n\t\t\n\t}\n\t\n\twebSocket: WebSocket | null = null;\n\t\n\t#heartbeatTimeout?: ReturnType<typeof setTimeout>;\n\t\n\t#defib() {\n\t\t\n\t\tclearTimeout(this.#heartbeatTimeout);\n\t\tthis.#heartbeatTimeout = setTimeout(\n\t\t\t() => this.close(CODES.NO_HEARTBEAT, \"no-heartbeat\", false),\n\t\t\tHEARTBEAT_INTERVAL + HEARTBEAT_GAP\n\t\t);\n\t\t\n\t\tif (this.#unresponsiveTimeout) {\n\t\t\tclearTimeout(this.#unresponsiveTimeout);\n\t\t\tthis.#unresponsiveTimeout = undefined;\n\t\t}\n\t\t\n\t\tthis.#isCheckingResponsiveness = false;\n\t\t\n\t\tif (this.#offlineTimeout) {\n\t\t\tclearTimeout(this.#offlineTimeout);\n\t\t\tthis.#offlineTimeout = undefined;\n\t\t}\n\t\t\n\t\tif (this.#isUnresponsive) {\n\t\t\tthis.#isUnresponsive = false;\n\t\t\t\n\t\t\tthis.emit(\"responsive\");\n\t\t}\n\t\t\n\t\tthis.#updateConnectionQuality(WS.CONNECTION_QUALITY.OPEN);\n\t\t\n\t}\n\t\n\t#unresponsiveTimeout?: ReturnType<typeof setTimeout>;\n\t#isCheckingResponsiveness = false;\n\t\n\t#offlineTimeout?: ReturnType<typeof setTimeout>;\n\t#isUnresponsive = false;\n\t\n\tget state() {\n\t\t\n\t\tif (!this.webSocket)\n\t\t\treturn \"closed\";\n\t\t\n\t\tswitch (this.webSocket.readyState) {\n\t\t\tcase WebSocket.CONNECTING:\n\t\t\t\treturn \"connecting\";\n\t\t\t\n\t\t\tcase WebSocket.OPEN:\n\t\t\t\treturn this.#isUnresponsive ? \"unresponsive\" : \"open\";\n\t\t\t\n\t\t\tcase WebSocket.CLOSING:\n\t\t\t\treturn \"closing\";\n\t\t}\n\t\t\n\t\treturn \"closed\";\n\t}\n\t\n\tget isConnecting() {\n\t\treturn this.webSocket?.readyState === WebSocket.CONNECTING;\n\t}\n\t\n\tget isOpen() {\n\t\treturn this.webSocket?.readyState === WebSocket.OPEN;\n\t}\n\t\n\tget isClosing() {\n\t\treturn this.webSocket?.readyState === WebSocket.CLOSING;\n\t}\n\t\n\tget isClosed() {\n\t\treturn !this.webSocket;\n\t}\n\t\n\tisDestroyed = false;\n\t\n\t#openPromise?: StatefulPromise<void>;\n\t\n\t#wasOpened = false;\n\t\n\t#handleWebSocketOpen = () => {\n\t\t\n\t\tthis.#wasOpened = true;\n\t\t\n\t\tthis.#openPromise!.resolve();\n\t\t\n\t\tthis.#defib();\n\t\t\n\t\tthis.emit(\"open\");\n\t\t\n\t};\n\t\n\t#handleWebSocketMessage = ({ data: message }: MessageEvent<string>) => {\n\t\t\n\t\tthis.#defib();\n\t\t\n\t\tif (message) {\n\t\t\tif (message !== \"!\")\n\t\t\t\ttry {\n\t\t\t\t\tconst [ kind, ...rest ] = JSON.parse(message);\n\t\t\t\t\t\n\t\t\t\t\tswitch (kind) {\n\t\t\t\t\t\tcase REQUEST_HEADERS.REQUEST:\n\t\t\t\t\t\t\tvoid this.#handleRequest(...rest as [ id: number, kind: string, ...rest: unknown[] ]);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthis.emit(\"message\", kind, ...rest);\n\t\t\t\t\t\t\tthis.emit(`message:${kind}`, ...rest);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.#handleWebSocketError(error as Error);\n\t\t\t\t}\n\t\t} else\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 as Error);\n\t\t\n\t\tthis.emit(\"error\", error);\n\t\t\n\t};\n\t\n\t#reconnectTimeout?: ReturnType<typeof setTimeout>;\n\t\n\t#decideReconnect(code: number) {\n\t\t\n\t\tif (this.#reconnectTimeout)\n\t\t\tclearTimeout(this.#reconnectTimeout);\n\t\t\n\t\tif (this.reconnectAfter && !NON_RECONNECTABLE_CODES.includes(code as typeof NON_RECONNECTABLE_CODES[number])) {\n\t\t\tif (process.env.NODE_ENV === \"development\" && !this.#isQuiet)\n\t\t\t\tconsole.info(`\uD83D\uDD0C WS ${this.name} will try to reconnect in ${Math.round(this.reconnectAfter / 1000)} seconds`);\n\t\t\t\n\t\t\tthis.#reconnectTimeout = setTimeout(() => this.open().catch(noop), this.reconnectAfter);\n\t\t\t\n\t\t\tthis.#updateConnectionQuality(WS.CONNECTION_QUALITY.RECONNECTING);\n\t\t} else {\n\t\t\tthis.#reconnectTimeout = undefined;\n\t\t\t\n\t\t\tthis.#updateConnectionQuality(code === CODES.REOPEN ? WS.CONNECTION_QUALITY.RECONNECTING : WS.CONNECTION_QUALITY.CLOSED);\n\t\t}\n\t\t\n\t}\n\t\n\t#handleWebSocketClose = (event: CloseEvent) => {\n\t\tconst { code, reason, wasClean } = event;\n\t\t\n\t\tif (this.#heartbeatTimeout) {\n\t\t\tclearTimeout(this.#heartbeatTimeout);\n\t\t\tthis.#heartbeatTimeout = undefined;\n\t\t}\n\t\t\n\t\tif (this.#unresponsiveTimeout) {\n\t\t\tclearTimeout(this.#unresponsiveTimeout);\n\t\t\tthis.#unresponsiveTimeout = undefined;\n\t\t}\n\t\t\n\t\tthis.#isCheckingResponsiveness = false;\n\t\t\n\t\tif (this.#offlineTimeout) {\n\t\t\tclearTimeout(this.#offlineTimeout);\n\t\t\tthis.#offlineTimeout = undefined;\n\t\t}\n\t\t\n\t\tthis.#isUnresponsive = false;\n\t\t\n\t\tif (this.#openPromise?.isPending)\n\t\t\tthis.#openPromise.reject(new Error(\"Closed\"));\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\" && !this.#isQuiet) {\n\t\t\tlet message = `\uD83D\uDD0C WS ${this.name} is closed`;\n\t\t\t\n\t\t\tif (code)\n\t\t\t\tmessage += ` with code ${code}`;\n\t\t\t\n\t\t\tif (code && reason)\n\t\t\t\tmessage += \" and\";\n\t\t\t\n\t\t\tif (reason)\n\t\t\t\tmessage += ` reason \"${reason}\"`;\n\t\t\t\n\t\t\tswitch (reason) {\n\t\t\t\tcase \"no-heartbeat\":\n\t\t\t\t\tmessage += \". Going offline\";\n\t\t\t}\n\t\t\t\n\t\t\tif (!wasClean || code === CODES.ABNORMAL) {\n\t\t\t\tmessage += \" [UNEXPECTED]\";\n\t\t\t\tconsole.warn(message);\n\t\t\t} else\n\t\t\t\tconsole.info(message);\n\t\t}\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\t\n\t\tif (this.#wasOpened) {\n\t\t\tthis.emit(\"close\", event);\n\t\t\t\n\t\t\tthis.#wasOpened = false;\n\t\t}\n\t\t\n\t\tthis.webSocket = null;\n\t\t\n\t\tthis.#decideReconnect(code);\n\t\t\n\t\tif (\"navigator\" in globalThis && \"addEventListener\" in globalThis)\n\t\t\tglobalThis.removeEventListener(\"offline\", this.#handleOffline);\n\t\t\n\t};\n\t\n\t#handleAbortSignalAbort = () =>\n\t\tthis.#openPromise?.isPending &&\n\t\tthis.#openPromise.reject(new DOMException(\"Operation aborted\", \"AbortError\"));\n\t\n\tasync open(options: Pick<Options, \"protocols\" | \"url\"> = {}): Promise<void> {\n\t\t\n\t\tif (this.isDestroyed)\n\t\t\tthrow new Error(\"WS has been destroyed\");\n\t\t\n\t\tif (this.#abortSignal?.aborted)\n\t\t\tthrow new DOMException(\"Operation aborted\", \"AbortError\");\n\t\t\n\t\tif (this.#openPromise?.isPending)\n\t\t\treturn this.#openPromise;\n\t\t\n\t\tif (this.isUsed)\n\t\t\tthis.close(CODES.REOPEN, \"reopen\");\n\t\telse\n\t\t\tthis.isUsed = true;\n\t\t\n\t\tlet prevURL: URL | string | undefined;\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((_, 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, { once: true });\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.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\t\n\t\t\t\tif (\"navigator\" in globalThis && \"addEventListener\" in globalThis)\n\t\t\t\t\tglobalThis.addEventListener(\"offline\", this.#handleOffline);\n\t\t\t} else {\n\t\t\t\tthis.webSocket = null;\n\t\t\t\t\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\t/**\n\t * Alias for `open()`\n\t */\n\tconnect = this.open;\n\t\n\tclose(code: number = CODES.MANUAL, reason = \"manual\", wasClean: boolean = true) {\n\t\t\n\t\tif (this.isClosed)\n\t\t\tthis.#decideReconnect(code);\n\t\telse {\n\t\t\tthis.webSocket!.removeEventListener(\"close\", this.#handleWebSocketClose);\n\t\t\t\n\t\t\tthis.webSocket!.close(code, reason);\n\t\t\t\n\t\t\tthis.#handleWebSocketClose(Object.assign(new Event(\"close\"), {\n\t\t\t\tcode,\n\t\t\t\treason,\n\t\t\t\twasClean\n\t\t\t}));\n\t\t}\n\t\t\n\t}\n\t\n\t/**\n\t * Alias for `close()`\n\t */\n\tdisconnect = this.close;\n\t\n\t#queue: (ArrayBufferLike | ArrayBufferView | Blob | 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\tsend(data: ArrayBufferLike | ArrayBufferView | Blob | string) {\n\t\t\n\t\tif (this.isOpen)\n\t\t\tthis.webSocket!.send(data);\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(data);\n\t\t}\n\t\t\n\t}\n\t\n\tsendMessage(...args: unknown[]) {\n\t\treturn this.send(JSON.stringify(args));\n\t}\n\t\n\t#requestCounter = 0;\n\t\n\tsendRequest<T>(...args: [...unknown[], callback: (error: Error | null, result: T) => void]): this;\n\tsendRequest<T>(...args: unknown[]): Promise<T>;\n\tsendRequest<T>(...args: unknown[]) {\n\t\t\n\t\tconst id = this.#requestCounter++;\n\t\t\n\t\tif (this.#requestCounter >= REQUEST_COUNTER_LIMIT)\n\t\t\tthis.#requestCounter = 0;\n\t\t\n\t\tconst eventName = `message:${REQUEST_HEADERS.RESPONSE}-${id}`;\n\t\t\n\t\tconst lastArg = args.at(-1);\n\t\t\n\t\tif (typeof lastArg == \"function\") {\n\t\t\tthis.once(eventName, lastArg as (error: Error, result: T) => void);\n\t\t\t\n\t\t\tthis.sendMessage(REQUEST_HEADERS.REQUEST, id, ...args.slice(0, -1));\n\t\t\t\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\treturn new Promise<T>((resolve, reject) => {\n\t\t\t\n\t\t\tthis.once(eventName, (error, result: T) => {\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) as Error);\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\t\n\t\t\tthis.sendMessage(REQUEST_HEADERS.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\t/**\n\t * Alias for `addRequestListener()`\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\t/**\n\t * Alias for `removeRequestListener()`\n\t */\n\toffRequest = this.removeRequestListener;\n\t\n\t#handleRequest = async (id: number, 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(`${REQUEST_HEADERS.RESPONSE}-${id}`, requestError, result);\n\t\t\n\t};\n\t\n\t#handleOffline = () => {\n\t\t\n\t\tif (this.isOpen && !this.#isCheckingResponsiveness) {\n\t\t\tthis.#isCheckingResponsiveness = true;\n\t\t\t\n\t\t\tthis.#updateConnectionQuality(WS.CONNECTION_QUALITY.CHECKING_RESPONSIVENESS);\n\t\t\t\n\t\t\tthis.#unresponsiveTimeout = setTimeout(() => {\n\t\t\t\t\n\t\t\t\tthis.#isCheckingResponsiveness = false;\n\t\t\t\tthis.#isUnresponsive = true;\n\t\t\t\t\n\t\t\t\tthis.#updateConnectionQuality(WS.CONNECTION_QUALITY.UNRESPONSIVE);\n\t\t\t\t\n\t\t\t\tthis.emit(\"unresponsive\");\n\t\t\t\t\n\t\t\t\tthis.#offlineTimeout = setTimeout(() => {\n\t\t\t\t\t\n\t\t\t\t\tthis.#isUnresponsive = false;\n\t\t\t\t\t\n\t\t\t\t\tthis.close(CODES.OFFLINE, \"offline\", false);\n\t\t\t\t\t\n\t\t\t\t}, OFFLINE_TIMEOUT - RESPONSIVENESS_TIMEOUT);\n\t\t\t\t\n\t\t\t}, RESPONSIVENESS_TIMEOUT);\n\t\t\t\n\t\t\tthis.webSocket!.send(\"?\");\n\t\t}\n\t\t\n\t};\n\t\n\tdestroy() {\n\t\t\n\t\tthis.isDestroyed = true;\n\t\t\n\t\tthis.#queue.length = 0;\n\t\t\n\t\tthis.close(CODES.NORMAL, \"destroy\");\n\t\t\n\t\tthis.removeAllListeners();\n\t\t\n\t\tthis.#abortSignal?.removeEventListener(\"abort\", this.#handleAbortSignalAbort);\n\t\t\n\t\tthis.emit(\"destroy\");\n\t\t\n\t}\n\t\n\t\n\tstatic CONNECTION_QUALITY = {\n\t\tCLOSED: 0,\n\t\tRECONNECTING: 1,\n\t\tUNRESPONSIVE: 2,\n\t\tCHECKING_RESPONSIVENESS: 3,\n\t\tOPEN: 4\n\t} as const;\n\t\n}\n", "export const HEARTBEAT_INTERVAL = 5_000;\nexport const HEARTBEAT_GAP = 30_000;\nexport const RESPONSIVENESS_TIMEOUT = 1000;\nexport const OFFLINE_TIMEOUT = 5000;\nexport const REQUEST_COUNTER_LIMIT = Number.MAX_SAFE_INTEGER / 2;\n\nexport const CODES = {\n\tNORMAL: 1000,\n\tPROTOCOL_ERROR: 1002,\n\tABNORMAL: 1006,\n\tNO_HEARTBEAT: 3000,\n\tOFFLINE: 3001,\n\tMANUAL: 3500,\n\tREOPEN: 4000\n} as const;\n\nexport const NON_RECONNECTABLE_CODES = [\n\tCODES.PROTOCOL_ERROR,\n\tCODES.MANUAL,\n\tCODES.REOPEN\n];\n\nexport const REQUEST_HEADERS = {\n\tREQUEST: \"~r-q\",\n\tRESPONSE: \"~r-s\"\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["WebSocket", "EventEmitter", "noop", "StatefulPromise", "REQUEST_COUNTER_LIMIT", "CODES", "NON_RECONNECTABLE_CODES", "REQUEST_HEADERS", "i", "WS", "_WS", "EventEmitter", "options", "url", "name", "protocols", "immediately", "reconnectAfter", "on", "quiet", "signal", "eventName", "#isQuiet", "#abortSignal", "#handleAbortSignalAbort", "noop", "error", "event", "listener", "#updateConnectionQuality", "connectionQuality", "prevConnectionQuality", "#heartbeatTimeout", "#defib", "CODES", "#unresponsiveTimeout", "#isCheckingResponsiveness", "#offlineTimeout", "#isUnresponsive", "#openPromise", "#wasOpened", "#handleWebSocketOpen", "#handleWebSocketMessage", "message", "kind", "rest", "REQUEST_HEADERS", "#handleRequest", "#handleWebSocketError", "#reconnectTimeout", "#decideReconnect", "code", "NON_RECONNECTABLE_CODES", "#handleWebSocketClose", "reason", "wasClean", "webSocket", "#handleOffline", "prevURL", "StatefulPromise", "_", "reject", "#queue", "#releaseQueue", "data", "args", "#requestCounter", "id", "REQUEST_COUNTER_LIMIT", "lastArg", "resolve", "result", "restProps", "#requestListeners", "requestError"]
7
+ }
@@ -0,0 +1,19 @@
1
+ import type { WS } from "./WS";
2
+ declare global {
3
+ var __insite: {
4
+ wss_url?: string;
5
+ } | undefined;
6
+ }
7
+ export type Options = {
8
+ url?: URL | string;
9
+ name?: string;
10
+ protocols?: string[];
11
+ immediately?: boolean;
12
+ reconnectAfter?: number | null;
13
+ on?: Record<string, (...args: any[]) => void>;
14
+ quiet?: boolean;
15
+ signal?: AbortSignal;
16
+ };
17
+ export type RequestListener = (...args: any[]) => unknown;
18
+ export type ConnectionQuality = typeof WS["CONNECTION_QUALITY"][keyof typeof WS["CONNECTION_QUALITY"]];
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/client/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAM/B,OAAO,CAAC,MAAM,CAAC;IACd,IAAI,QAAQ,EAAE;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,SAAS,CAAC;CACd;AAED,MAAM,MAAM,OAAO,GAAG;IACrB,GAAG,CAAC,EAAE,GAAG,GAAG,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,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;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG,OAAO,EAAE,CAAC,oBAAoB,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC"}
package/dist/common.d.ts CHANGED
@@ -1,7 +1,20 @@
1
- export declare const heartbeatInterval = 5000;
2
- export declare const heartbeatGap = 60000;
3
- export declare const requestHeaders: {
4
- request: string;
5
- response: string;
1
+ export declare const HEARTBEAT_INTERVAL = 5000;
2
+ export declare const HEARTBEAT_GAP = 30000;
3
+ export declare const RESPONSIVENESS_TIMEOUT = 1000;
4
+ export declare const OFFLINE_TIMEOUT = 5000;
5
+ export declare const REQUEST_COUNTER_LIMIT: number;
6
+ export declare const CODES: {
7
+ readonly NORMAL: 1000;
8
+ readonly PROTOCOL_ERROR: 1002;
9
+ readonly ABNORMAL: 1006;
10
+ readonly NO_HEARTBEAT: 3000;
11
+ readonly OFFLINE: 3001;
12
+ readonly MANUAL: 3500;
13
+ readonly REOPEN: 4000;
14
+ };
15
+ export declare const NON_RECONNECTABLE_CODES: (1002 | 3500 | 4000)[];
16
+ export declare const REQUEST_HEADERS: {
17
+ REQUEST: string;
18
+ RESPONSE: string;
6
19
  };
7
20
  //# sourceMappingURL=common.d.ts.map
@@ -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,kBAAkB,OAAQ,CAAC;AACxC,eAAO,MAAM,aAAa,QAAS,CAAC;AACpC,eAAO,MAAM,sBAAsB,OAAO,CAAC;AAC3C,eAAO,MAAM,eAAe,OAAO,CAAC;AACpC,eAAO,MAAM,qBAAqB,QAA8B,CAAC;AAEjE,eAAO,MAAM,KAAK;;;;;;;;CAQR,CAAC;AAEX,eAAO,MAAM,uBAAuB,wBAInC,CAAC;AAEF,eAAO,MAAM,eAAe;;;CAG3B,CAAC"}