insite-ws 2.3.2 → 2.3.5

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,2 +1,7 @@
1
- import{WebSocketServer as N}from"ws";import{createServer as x,getRemoteAddress as w,resolveSSL as k,showServerListeningMessage as O}from"insite-common/backend";var o=Symbol("isQuiet"),c=Symbol("requestListeners"),v=Symbol("heartbeatInterval"),p=Symbol("heartbeatTimeout"),S=Symbol("defib"),m=Symbol("heartbeatTs"),u=Symbol("requestCounter");import{WebSocket as T}from"ws";import{handleMongoError as W}from"@nesvet/n";var y=Number.MAX_SAFE_INTEGER/2,b={NORMAL:1e3,PROTOCOL_ERROR:1002,ABNORMAL:1006,NO_HEARTBEAT:3e3,OFFLINE:3001,MANUAL:3500,REOPEN:4e3},A=[b.PROTOCOL_ERROR,b.MANUAL,b.REOPEN],d={REQUEST:"~r-q",RESPONSE:"~r-s"};var h=class r extends T{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="";[p];[S](){clearTimeout(this[p]),this[p]=setTimeout(()=>this.terminate(),35e3)}latency=0;[m];[v]=r.makeHeartbeatInterval.call(this);sendMessage(...e){return this.send(JSON.stringify(e))}[u]=0;sendRequest(...e){let t=this[u]++;this[u]>=y&&(this[u]=0);let s=`message:${d.RESPONSE}-${t}`;return typeof e.at(-1)=="function"?(this.once(s,e.splice(-1,1)[0]),this.sendMessage(d.REQUEST,t,...e),this):new Promise((i,l)=>{this.once(s,(a,n)=>{if(a){let{message:g,...E}=a;l(Object.assign(new Error(g),E))}else i(n)}),this.sendMessage(d.REQUEST,t,...e)})}static makeHeartbeatInterval(){return setInterval(()=>{this[m]=Date.now(),this.send("")},5e3)}static extend(){Object.defineProperties(this,{isConnecting:{get:Object.getOwnPropertyDescriptor(r.prototype,"isConnecting").get},isOpen:{get:Object.getOwnPropertyDescriptor(r.prototype,"isOpen").get},isClosing:{get:Object.getOwnPropertyDescriptor(r.prototype,"isClosing").get},isClosed:{get:Object.getOwnPropertyDescriptor(r.prototype,"isClosed").get}});let{terminate:e}=this;Object.assign(this,{isWebSocketServerClient:!0,isWebSocketServer:!1,isWebSocket:!1,[S]:r.prototype[S],latency:0,[v]:r.makeHeartbeatInterval.call(this),sendMessage:r.prototype.sendMessage,sendRequest:r.prototype.sendRequest,terminate(){try{e.call(this)}catch(t){console.error(t)}}})}static handleConnect(){this.on("message",r.handleMessage),this.on("error",r.handleError),this.on("close",r.handleClose),this[S]()}static handleMessage(e){let t=e.toString();if(this[S](),t)if(t==="?")this.send("!");else try{let[s,...i]=JSON.parse(t);switch(s){case d.REQUEST:r.handleRequest.call(this,...i);break;default:this.emit(`message:${s}`,...i),this.wss.emit("client-message",this,s,...i),this.wss.emit(`client-message:${s}`,this,...i)}}catch(s){r.handleError.call(this,s)}else this[m]&&(this.latency=Date.now()-this[m],this[m]=void 0)}static async handleRequest(e,t,...s){let i=this.wss[c].get(t),l,a=null;if(i)try{l=await i.call(this.wss,this,...s)}catch(n){if(process.env.NODE_ENV==="development"&&W(n),n instanceof Error){let{message:g,...E}=n;a={message:g,...E}}process.env.NODE_ENV==="development"&&!this.wss[o]&&console.error(`${this.wss.icon}\u2757\uFE0F WS Server request "${t}" (${e}):`,n)}else a={message:`Unknown request kind "${t}"`};this.sendMessage(`${d.RESPONSE}-${e}`,a,l)}static handleError(e){e instanceof Event&&(e=void 0),this.wss[o]||console.error(`${this.wss.icon}\u2757\uFE0F WS Server client`,"user"in this?`\x1B[1m${this.user.email}\x1B[0m:`:"\x1B[3manonymous\x1B[0m:",e),this.wss.emit("client-error",this,e)}static handleClose(e,t){if(process.env.NODE_ENV==="development"){let s=t.toString();this.wss[o]||console.info(`${this.wss.icon} WS Server:`,"user"in this?`\x1B[1m${this.user.email}\x1B[0m`:"\x1B[3manonymous\x1B[0m",`disconnected ${e?`with code ${e}`:""} ${e&&s?"and ":""}${s?`reason "${s}"`:""}`)}clearTimeout(this[p]),clearInterval(this[v]),this.wss.emit("client-close",this),this.wss.emit("client-closed",this)}};var R=class r extends N{constructor(e){let{ssl:t,port:s,server:i=x(r.makeProps(e)),quiet:l=!1,...a}=e;super({WebSocket:h,...a,server:i}),this.server=i,e.server?new Promise(n=>void(i.listening?n():i.on("listening",n))).then(()=>O(this)):this.server.listen(typeof s=="string"?Number.parseInt(s):s??(this.isS?443:80),()=>O(this)),this[o]=l,this.on("connection",this.#e),this[o]||(this.on("error",n=>console.error(`${this.icon}\u2757\uFE0F WS Server:`,n)),this.on("close",()=>console.error(`${this.icon}\u2757\uFE0F WS Server closed`)))}on(e,t){return super.on(e,t)}isWebSocketServer=!0;isWebSocketServerClient=!1;isWebSocket=!1;icon="\u{1F50C}";name="WS";get protocol(){return`ws${this.isS?"s":""}`}server;get isS(){return"setSecureContext"in this.server}[o];[c]=new Map;addRequestListener(e,t){return this[c].set(e,t),this}onRequest=this.addRequestListener;removeRequestListener(e){return this[c].delete(e),this}offRequest=this.removeRequestListener;#e(e,t){e instanceof h||h.extend.call(e),Object.assign(e,{wss:this,userAgent:t.headers["user-agent"]??"",remoteAddress:w(t)}),h.handleConnect.call(e),this.emit("client-connect",e,t),process.env.NODE_ENV==="development"&&!this[o]&&console.info(`${this.icon} WS Server:`,"user"in e?`\x1B[1m${e.user.email}\x1B[0m`:"\x1B[3manonymous\x1B[0m","connected")}static makeProps({ssl:e}){return{...k(e)}}};export{R as WSServer,h as WSServerClient};
1
+ import{WebSocketServer as V}from"ws";import{createServer as Q,getRemoteAddress as H,resolveSSL as J,showServerListeningMessage as D}from"insite-common/backend";var A=Number.MAX_SAFE_INTEGER/2,x={NORMAL:1e3,PROTOCOL_ERROR:1002,ABNORMAL:1006,NO_HEARTBEAT:3e3,OFFLINE:3001,MANUAL:3500,REOPEN:4e3},G=[x.PROTOCOL_ERROR,x.MANUAL,x.REOPEN],g={REQUEST:"~r-q",RESPONSE:"~r-s"};var h=Symbol("isQuiet"),y=Symbol("requestListeners"),C=Symbol("heartbeatInterval"),O=Symbol("heartbeatTimeout"),E=Symbol("defib"),v=Symbol("heartbeatTs"),T=Symbol("requestCounter");import{WebSocket as U}from"ws";function m(){}var $=new WeakMap,b=class r extends Promise{constructor(e,t){let n,o;if(super((s,i)=>{n=s,o=i}),$.set(this,{resolve:n,reject:o}),t?.signal)if(t.signal.aborted)this.reject(new DOMException("Aborted","AbortError"));else{let s=()=>this.reject(new DOMException("Aborted","AbortError"));t.signal.addEventListener("abort",s),this.finally(()=>t.signal?.removeEventListener("abort",s))}if(typeof t?.timeout=="number"&&Number.isFinite(t.timeout)){let s=setTimeout(()=>this.reject(new DOMException("Timeout exceeded","TimeoutError")),t.timeout);this.finally(()=>clearTimeout(s))}e?.(this.resolve,this.reject)}isPending=!0;isFulfilled=!1;isRejected=!1;state="pending";result;resolve=e=>{if(this.isPending){this.isPending=!1,this.isFulfilled=!0,this.state="fulfilled",this.result=e;let t=$.get(this);t&&(t.resolve.call(this,e),$.delete(this))}};reject=e=>{if(this.isPending){this.isPending=!1,this.isRejected=!0,this.state="rejected",this.result=e;let t=$.get(this);t&&(t.reject.call(this,e),$.delete(this))}};static resolved(e){return new r(t=>t(e))}static rejected(e){return new r((t,n)=>n(e))}};function _(r,e=0,t={}){let{leading:n=!1,trailing:o=!0}=t,{maxWait:s=1/0}=t,i,c,a,l,M,w,p,k,j=async()=>{let f=Date.now();f>=a?(i=void 0,a=void 0,clearTimeout(c),c=void 0,typeof p=="function"&&await p(),u.resolve(k),w=n):(clearTimeout(i),i=setTimeout(j,a-f))},R=Number.isFinite(s)?()=>{p===d&&(p=!1),d(),c=setTimeout(R,s)}:null;async function d(){try{return k=await r.apply(l,M),k}catch(f){throw u.reject(f),f}}n&&typeof n=="boolean"&&(n=d),w=n,o&&typeof o=="boolean"&&(o=d),p=o;let u=Object.assign(function(...f){return M=f,l=this,a=Date.now()+e,p=o,u.promise.isPending||(u.promise=new b((B,q)=>{u.resolve=B,u.reject=q,typeof w=="function"&&(w(),w=!1,p===d&&(p=!1)),i||(i=setTimeout(j,e),R&&(c=setTimeout(R,s)))})),u.promise},{callback:r,promise:b.resolved(void 0),resolve:m,reject:m,run:d,clear:async f=>{clearTimeout(i),i=void 0,clearTimeout(c),c=void 0,u.resolve(f?await d():k)}});return u}_.noop=Object.assign(()=>{},{callback:m,promise:b.resolved(void 0),resolve:m,reject:m,run:m,clear:m});function N(r,e=" ",t=1){if(!r)return r;let n=e.repeat(t);return r.split(`
2
+ `).map(o=>`${n}${o}`).join(`
3
+ `)}function W(r){try{let e=("writeErrors"in r?r.writeErrors:[r.errorResponse]).filter(t=>t.errmsg==="Document failed validation");e.length&&(r.message+=`
4
+ ${e.map(t=>N(`failingDocumentId: ${t.errInfo?.failingDocumentId}
5
+ schemaRulesNotSatisfied: ${JSON.stringify(t.errInfo?.details?.schemaRulesNotSatisfied,null," ")}`," ")).join(`
6
+ `)}`),r.isMongoServerError=!0}catch{}return r}function I(r,e,t,n,o=!0){return Array.isArray(r)&&(r=r.length),typeof n!="string"&&(o=n??!0,n=t),(o?`${r}\xA0`:"")+I.raw(r,e,t,n)}I.raw=(r,e,t,n=t)=>{r=Math.abs(r);let o=r%10,s=r%100;return o===1&&s!==11?e:o>=2&&o<=4&&!(s>=12&&s<=15)?t:n};var S=class r extends U{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="";[O];[E](){clearTimeout(this[O]),this[O]=setTimeout(()=>this.terminate(),35e3)}latency=0;[v];[C]=r.makeHeartbeatInterval.call(this);sendMessage(...e){return this.send(JSON.stringify(e))}[T]=0;sendRequest(...e){let t=this[T]++;this[T]>=A&&(this[T]=0);let n=`message:${g.RESPONSE}-${t}`;return typeof e.at(-1)=="function"?(this.once(n,e.splice(-1,1)[0]),this.sendMessage(g.REQUEST,t,...e),this):new Promise((o,s)=>{this.once(n,(i,c)=>{if(i){let{message:a,...l}=i;s(Object.assign(new Error(a),l))}else o(c)}),this.sendMessage(g.REQUEST,t,...e)})}static makeHeartbeatInterval(){return setInterval(()=>{this[v]=Date.now(),this.send("")},5e3)}static extend(){Object.defineProperties(this,{isConnecting:{get:Object.getOwnPropertyDescriptor(r.prototype,"isConnecting").get},isOpen:{get:Object.getOwnPropertyDescriptor(r.prototype,"isOpen").get},isClosing:{get:Object.getOwnPropertyDescriptor(r.prototype,"isClosing").get},isClosed:{get:Object.getOwnPropertyDescriptor(r.prototype,"isClosed").get}});let{terminate:e}=this;Object.assign(this,{isWebSocketServerClient:!0,isWebSocketServer:!1,isWebSocket:!1,[E]:r.prototype[E],latency:0,[C]:r.makeHeartbeatInterval.call(this),sendMessage:r.prototype.sendMessage,sendRequest:r.prototype.sendRequest,terminate(){try{e.call(this)}catch(t){console.error(t)}}})}static handleConnect(){this.on("message",r.handleMessage),this.on("error",r.handleError),this.on("close",r.handleClose),this[E]()}static handleMessage(e){let t=e.toString();if(this[E](),t)if(t==="?")this.send("!");else try{let[n,...o]=JSON.parse(t);switch(n){case g.REQUEST:r.handleRequest.call(this,...o);break;default:this.emit(`message:${n}`,...o),this.wss.emit("client-message",this,n,...o),this.wss.emit(`client-message:${n}`,this,...o)}}catch(n){r.handleError.call(this,n)}else this[v]&&(this.latency=Date.now()-this[v],this[v]=void 0)}static async handleRequest(e,t,...n){let o=this.wss[y].get(t),s,i=null;if(o)try{s=await o.call(this.wss,this,...n)}catch(c){if(process.env.NODE_ENV==="development"&&W(c),c instanceof Error){let{message:a,...l}=c;i={message:a,...l}}process.env.NODE_ENV==="development"&&!this.wss[h]&&console.error(`${this.wss.icon}\u2757\uFE0F WS Server request "${t}" (${e}):`,c)}else i={message:`Unknown request kind "${t}"`};this.sendMessage(`${g.RESPONSE}-${e}`,i,s)}static handleError(e){e instanceof Event&&(e=void 0),this.wss[h]||console.error(`${this.wss.icon}\u2757\uFE0F WS Server client`,"user"in this?`\x1B[1m${this.user.email}\x1B[0m:`:"\x1B[3manonymous\x1B[0m:",e),this.wss.emit("client-error",this,e)}static handleClose(e,t){if(process.env.NODE_ENV==="development"){let n=t.toString();this.wss[h]||console.info(`${this.wss.icon} WS Server:`,"user"in this?`\x1B[1m${this.user.email}\x1B[0m`:"\x1B[3manonymous\x1B[0m",`disconnected ${e?`with code ${e}`:""} ${e&&n?"and ":""}${n?`reason "${n}"`:""}`)}clearTimeout(this[O]),clearInterval(this[C]),this.wss.emit("client-close",this)}static CLOSE_CODES=x};var L=class r extends V{constructor(e){let{icon:t="\u{1F50C}",name:n="WS",ssl:o,port:s,server:i=Q(r.makeProps(e)),quiet:c=!1,...a}=e;super({WebSocket:S,...a,server:i}),this.icon=t,this.name=n,this.server=i,e.server?new Promise(l=>void(i.listening?l():i.on("listening",l))).then(()=>D(this)):this.server.listen(typeof s=="string"?Number.parseInt(s):s??(this.isS?443:80),()=>D(this)),this[h]=c,this.on("connection",this.#e),this[h]||(this.on("error",l=>console.error(`${this.icon}\u2757\uFE0F WS Server:`,l)),this.on("close",()=>console.error(`${this.icon}\u2757\uFE0F WS Server closed`)))}on(e,t){return super.on(e,t)}isWebSocketServer=!0;isWebSocketServerClient=!1;isWebSocket=!1;icon;name;get protocol(){return`ws${this.isS?"s":""}`}server;get isS(){return"setSecureContext"in this.server}[h];[y]=new Map;addRequestListener(e,t){return this[y].set(e,t),this}onRequest=this.addRequestListener;removeRequestListener(e){return this[y].delete(e),this}offRequest=this.removeRequestListener;#e(e,t){e instanceof S||S.extend.call(e),Object.assign(e,{wss:this,userAgent:t.headers["user-agent"]??"",remoteAddress:H(t)}),S.handleConnect.call(e),this.emit("client-connect",e,t),process.env.NODE_ENV==="development"&&!this[h]&&console.info(`${this.icon} WS Server:`,"user"in e?`\x1B[1m${e.user.email}\x1B[0m`:"\x1B[3manonymous\x1B[0m","connected")}static makeProps({ssl:e}){return{...J(e)}}static CLOSE_CODES=x};export{L as WSServer,S as WSServerClient};
2
7
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/server/WSServer.ts", "../../src/server/symbols.ts", "../../src/server/WSServerClient.ts", "../../src/common.ts"],
4
- "sourcesContent": ["import type http from \"node:http\";\nimport type https from \"node:https\";\nimport { WebSocketServer } from \"ws\";\nimport {\n\tcreateServer,\n\tgetRemoteAddress,\n\tresolveSSL,\n\tshowServerListeningMessage\n} from \"insite-common/backend\";\nimport { isQuietSymbol, requestListenersSymbol } from \"./symbols\";\nimport { WSServerClient } from \"./WSServerClient\";\nimport type { Options, RequestListener } from \"./types\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\nexport class WSServer<WSSC extends WSServerClient = WSServerClient> extends WebSocketServer<typeof WSServerClient> {\n\tconstructor(options: Options<WSSC>) {\n\t\tconst {\n\t\t\tssl: _,\n\t\t\tport,\n\t\t\tserver = createServer(WSServer.makeProps(options)),\n\t\t\tquiet = false,\n\t\t\t...wssOptions\n\t\t} = options;\n\t\t\n\t\tsuper({\n\t\t\tWebSocket: WSServerClient,\n\t\t\t...wssOptions,\n\t\t\tserver\n\t\t});\n\t\t\n\t\tthis.server = server;\n\t\t\n\t\tif (options.server)\n\t\t\tvoid new Promise<void>(resolve => void (\n\t\t\t\tserver.listening ?\n\t\t\t\t\tresolve() :\n\t\t\t\t\tserver.on(\"listening\", resolve)\n\t\t\t)).then(() => showServerListeningMessage(this));\n\t\telse\n\t\t\tthis.server.listen(\n\t\t\t\ttypeof port == \"string\" ?\n\t\t\t\t\tNumber.parseInt(port) :\n\t\t\t\t\tport ?? (this.isS ? 443 : 80),\n\t\t\t\t() => showServerListeningMessage(this)\n\t\t\t);\n\t\t\n\t\tthis[isQuietSymbol] = quiet;\n\t\t\n\t\tthis.on(\"connection\", this.#handleConnection);\n\t\t\n\t\tif (!this[isQuietSymbol]) {\n\t\t\tthis.on(\"error\", (error: Error) => console.error(`${this.icon}\u2757\uFE0F WS Server:`, error));\n\t\t\t\n\t\t\tthis.on(\"close\", () => console.error(`${this.icon}\u2757\uFE0F WS Server closed`));\n\t\t}\n\t\t\n\t}\n\t\n\ton(event: \"connection\", callback: (this: this, socket: WSSC, request: http.IncomingMessage) => void): this;\n\ton(event: \"error\", callback: (this: this, error: Error) => void): this;\n\ton(event: \"headers\", callback: (this: this, headers: string[], request: http.IncomingMessage) => void): this;\n\ton(event: \"close\" | \"listening\", callback: (this: this) => void): this;\n\t\n\ton(event: \"client-connect\", listener: (this: this, wscc: WSSC, request: http.IncomingMessage) => void): this;\n\ton(event: \"client-error\", listener: (this: this, wscc: WSSC, error: Error | undefined) => void): this;\n\ton(event: `client-${string}`, listener: (this: this, wscc: WSSC, ...args: any[]) => void): this;\n\t\n\ton(event: string | symbol, listener: (this: this, ...args: any[]) => void): this;\n\ton(event: string | symbol, listener: (this: this, ...args: any[]) => void): this {\n\t\treturn super.on(event, listener 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\ticon = \"\uD83D\uDD0C\";\n\tname = \"WS\";\n\tget protocol() {\n\t\treturn `ws${this.isS ? \"s\" : \"\"}`;\n\t}\n\t\n\tserver;\n\t\n\tget isS() {\n\t\treturn \"setSecureContext\" in this.server;\n\t}\n\t\n\t[isQuietSymbol]: boolean;\n\t\n\t[requestListenersSymbol] = new Map<string, RequestListener<WSSC>>();\n\t\n\taddRequestListener(kind: string, listener: RequestListener<WSSC>) {\n\t\tthis[requestListenersSymbol].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[requestListenersSymbol].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#handleConnection(wssc: WSSC, request: http.IncomingMessage) {\n\t\t\n\t\t/* Compatibility with Bun */\n\t\tif (!(wssc instanceof WSServerClient))\n\t\t\tWSServerClient.extend.call(wssc);\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\tWSServerClient.handleConnect.call(wssc);\n\t\t\n\t\tthis.emit(\"client-connect\", wssc, request);\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\" && !this[isQuietSymbol])\n\t\t\tconsole.info(\n\t\t\t\t`${this.icon} WS Server:`,\n\t\t\t\t\"user\" in wssc ? `\\x1B[1m${(wssc.user as { email: string }).email}\\x1B[0m` : \"\\x1B[3manonymous\\x1B[0m\",\n\t\t\t\t\"connected\"\n\t\t\t);\n\t\t\n\t}\n\t\n\t\n\tstatic makeProps<SWSSC extends WSServerClient>({ ssl }: Options<SWSSC>): http.ServerOptions | https.ServerOptions {\n\t\treturn {\n\t\t\t...resolveSSL(ssl)\n\t\t};\n\t}\n\t\n}\n", "export const isQuietSymbol = Symbol(\"isQuiet\");\nexport const requestListenersSymbol = Symbol(\"requestListeners\");\nexport const heartbeatIntervalSymbol = Symbol(\"heartbeatInterval\");\nexport const heartbeatTimeoutSymbol = Symbol(\"heartbeatTimeout\");\nexport const defibSymbol = Symbol(\"defib\");\nexport const heartbeatTsSymbol = Symbol(\"heartbeatTs\");\nexport const requestCounterSymbol = Symbol(\"requestCounter\");\n", "import { ClientRequest, IncomingMessage } from \"node:http\";\nimport { RawData, WebSocket } from \"ws\";\nimport { handleMongoError } from \"@nesvet/n\";\nimport {\n\tHEARTBEAT_GAP,\n\tHEARTBEAT_INTERVAL,\n\tREQUEST_COUNTER_LIMIT,\n\tREQUEST_HEADERS\n} from \"../common\";\nimport {\n\tdefibSymbol,\n\theartbeatIntervalSymbol,\n\theartbeatTimeoutSymbol,\n\theartbeatTsSymbol,\n\tisQuietSymbol,\n\trequestCounterSymbol,\n\trequestListenersSymbol\n} from \"./symbols\";\nimport { WSServer } from \"./WSServer\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\nexport class WSServerClient extends WebSocket {\n\ton(event: \"close\", listener: (this: this, code: number, reason: Buffer) => void): this;\n\ton(event: \"error\", listener: (this: this, error: Error) => void): this;\n\ton(event: \"upgrade\", listener: (this: this, request: IncomingMessage) => void): this;\n\ton(event: \"message\", listener: (this: this, data: RawData, isBinary: boolean) => void): this;\n\ton(event: \"open\", listener: (this: this) => void): this;\n\ton(event: \"unexpected-response\", listener: (this: this, request: ClientRequest, response: IncomingMessage) => void): this;\n\ton(event: string | symbol, listener: (this: this, ...args: any[]) => void): this;\n\ton(event: string | symbol, listener: (this: this, ...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!: WSServer<this>;\n\t\n\tuserAgent = \"\";\n\t\n\tremoteAddress = \"\";\n\t\n\t[heartbeatTimeoutSymbol]?: ReturnType<typeof setTimeout>;\n\t\n\t[defibSymbol]() {\n\t\t\n\t\tclearTimeout(this[heartbeatTimeoutSymbol]);\n\t\t\n\t\tthis[heartbeatTimeoutSymbol] = setTimeout(\n\t\t\t() => this.terminate(),\n\t\t\tHEARTBEAT_INTERVAL + HEARTBEAT_GAP\n\t\t);\n\t\t\n\t}\n\t\n\tlatency = 0;\n\t\n\t[heartbeatTsSymbol]?: number;\n\t\n\t[heartbeatIntervalSymbol] = WSServerClient.makeHeartbeatInterval.call(this);\n\t\n\tsendMessage(...args: unknown[]) {\n\t\treturn this.send(JSON.stringify(args));\n\t}\n\t\n\t[requestCounterSymbol]: number = 0;\n\t\n\tsendRequest(...args: unknown[]) {\n\t\t\n\t\tconst id = this[requestCounterSymbol]++;\n\t\t\n\t\tif (this[requestCounterSymbol] >= REQUEST_COUNTER_LIMIT)\n\t\t\tthis[requestCounterSymbol] = 0;\n\t\t\n\t\tconst eventName = `message:${REQUEST_HEADERS.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\t\n\t\t\tthis.sendMessage(REQUEST_HEADERS.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) 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\n\tstatic makeHeartbeatInterval(this: WSServerClient) {\n\t\treturn setInterval(() => {\n\t\t\t\n\t\t\tthis[heartbeatTsSymbol] = Date.now();\n\t\t\t\n\t\t\tthis.send(\"\");\n\t\t\t\n\t\t}, HEARTBEAT_INTERVAL);\n\t}\n\t\n\t/* Compatibility with Bun */\n\tstatic extend(this: WSServerClient) {\n\t\t\n\t\tObject.defineProperties(this, {\n\t\t\tisConnecting: {\n\t\t\t\tget: Object.getOwnPropertyDescriptor(WSServerClient.prototype, \"isConnecting\")!.get\n\t\t\t},\n\t\t\tisOpen: {\n\t\t\t\tget: Object.getOwnPropertyDescriptor(WSServerClient.prototype, \"isOpen\")!.get\n\t\t\t},\n\t\t\tisClosing: {\n\t\t\t\tget: Object.getOwnPropertyDescriptor(WSServerClient.prototype, \"isClosing\")!.get\n\t\t\t},\n\t\t\tisClosed: {\n\t\t\t\tget: Object.getOwnPropertyDescriptor(WSServerClient.prototype, \"isClosed\")!.get\n\t\t\t}\n\t\t});\n\t\t\n\t\tconst { terminate } = this;\n\t\t\n\t\tObject.assign(this, {\n\t\t\tisWebSocketServerClient: true,\n\t\t\tisWebSocketServer: false,\n\t\t\tisWebSocket: false,\n\t\t\t[defibSymbol]: WSServerClient.prototype[defibSymbol],\n\t\t\tlatency: 0,\n\t\t\t[heartbeatIntervalSymbol]: WSServerClient.makeHeartbeatInterval.call(this),\n\t\t\tsendMessage: WSServerClient.prototype.sendMessage,\n\t\t\tsendRequest: WSServerClient.prototype.sendRequest,\n\t\t\tterminate() { /* Workaround Bun's WebSocket#terminate bug */\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\tterminate.call(this);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t\n\t}\n\t\n\tstatic handleConnect(this: WSServerClient) {\n\t\t\n\t\tthis.on(\"message\", WSServerClient.handleMessage);\n\t\tthis.on(\"error\", WSServerClient.handleError);\n\t\tthis.on(\"close\", WSServerClient.handleClose);\n\t\t\n\t\tthis[defibSymbol]();\n\t\t\n\t}\n\t\n\tstatic handleMessage(this: WSServerClient, data: RawData) {\n\t\tconst message = data.toString();// eslint-disable-line @typescript-eslint/no-base-to-string\n\t\t\n\t\tthis[defibSymbol]();\n\t\t\n\t\tif (message)\n\t\t\tif (message === \"?\")\n\t\t\t\tthis.send(\"!\");\n\t\t\telse\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 WSServerClient.handleRequest.call(this, ...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.wss.emit(\"client-message\", this, kind, ...rest);\n\t\t\t\t\t\t\tthis.wss.emit(`client-message:${kind}`, this, ...rest);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tWSServerClient.handleError.call(this, error as Error);\n\t\t\t\t}\n\t\telse if (this[heartbeatTsSymbol]) {\n\t\t\tthis.latency = Date.now() - this[heartbeatTsSymbol];\n\t\t\tthis[heartbeatTsSymbol] = undefined;\n\t\t}\n\t\t\n\t}\n\t\n\tstatic async handleRequest(this: WSServerClient, id: number, kind: string, ...rest: unknown[]) {\n\t\tconst listener = this.wss[requestListenersSymbol].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.wss, this, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\t\t\thandleMongoError(error);\n\t\t\t\t\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\t\n\t\t\t\tif (process.env.NODE_ENV === \"development\" && !this.wss[isQuietSymbol])\n\t\t\t\t\tconsole.error(`${this.wss.icon}\u2757\uFE0F WS Server request \"${kind}\" (${id}):`, error);\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\tstatic handleError(this: WSServerClient, error: Error | Event | undefined) {\n\t\tif (error instanceof Event)\n\t\t\terror = undefined;\n\t\t\n\t\tif (!this.wss[isQuietSymbol])\n\t\t\tconsole.error(\n\t\t\t\t`${this.wss.icon}\u2757\uFE0F WS Server client`,\n\t\t\t\t\"user\" in this ? `\\x1B[1m${(this.user as { email: string }).email}\\x1B[0m:` : \"\\x1B[3manonymous\\x1B[0m:\",\n\t\t\t\terror\n\t\t\t);\n\t\t\n\t\tthis.wss.emit(\"client-error\", this, error);\n\t\t\n\t}\n\t\n\tstatic handleClose(this: WSServerClient, code: number, reason: Buffer) {\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\") {\n\t\t\tconst reasonString = reason.toString();\n\t\t\t\n\t\t\tif (!this.wss[isQuietSymbol])\n\t\t\t\tconsole.info(\n\t\t\t\t\t`${this.wss.icon} WS Server:`,\n\t\t\t\t\t\"user\" in this ? `\\x1B[1m${(this.user as { email: string }).email}\\x1B[0m` : \"\\x1B[3manonymous\\x1B[0m\",\n\t\t\t\t\t`disconnected ${code ? `with code ${code}` : \"\"} ${code && reasonString ? \"and \" : \"\"}${reasonString ? `reason \"${reasonString}\"` : \"\"}`\n\t\t\t\t);\n\t\t}\n\t\t\n\t\tclearTimeout(this[heartbeatTimeoutSymbol]);\n\t\tclearInterval(this[heartbeatIntervalSymbol]);\n\t\t\n\t\tthis.wss.emit(\"client-close\", this);\n\t\tthis.wss.emit(\"client-closed\", this);\n\t\t\n\t}\n\t\n}\n", "export const 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": ["WebSocketServer", "createServer", "getRemoteAddress", "resolveSSL", "showServerListeningMessage", "isQuietSymbol", "requestListenersSymbol", "heartbeatIntervalSymbol", "heartbeatTimeoutSymbol", "defibSymbol", "heartbeatTsSymbol", "requestCounterSymbol", "WebSocket", "handleMongoError", "REQUEST_COUNTER_LIMIT", "CODES", "NON_RECONNECTABLE_CODES", "REQUEST_HEADERS", "WSServerClient", "_WSServerClient", "WebSocket", "event", "listener", "heartbeatTimeoutSymbol", "defibSymbol", "heartbeatTsSymbol", "heartbeatIntervalSymbol", "args", "requestCounterSymbol", "id", "REQUEST_COUNTER_LIMIT", "eventName", "REQUEST_HEADERS", "resolve", "reject", "error", "result", "message", "restProps", "terminate", "data", "kind", "rest", "requestListenersSymbol", "requestError", "handleMongoError", "isQuietSymbol", "code", "reason", "reasonString", "WSServer", "_WSServer", "WebSocketServer", "options", "_", "port", "server", "createServer", "quiet", "wssOptions", "WSServerClient", "resolve", "showServerListeningMessage", "isQuietSymbol", "#handleConnection", "error", "event", "listener", "requestListenersSymbol", "kind", "wssc", "request", "getRemoteAddress", "ssl", "resolveSSL"]
3
+ "sources": ["../../src/server/WSServer.ts", "../../src/common.ts", "../../src/server/symbols.ts", "../../src/server/WSServerClient.ts", "../../../../../@nesvet/npm/n/src/noop.ts", "../../../../../@nesvet/npm/n/src/StatefulPromise.ts", "../../../../../@nesvet/npm/n/src/debounce.ts", "../../../../../@nesvet/npm/n/src/indent.ts", "../../../../../@nesvet/npm/n/src/handleMongoError.ts", "../../../../../@nesvet/npm/n/src/howmuch.ts"],
4
+ "sourcesContent": ["import type http from \"node:http\";\nimport type https from \"node:https\";\nimport { WebSocketServer } from \"ws\";\nimport {\n\tcreateServer,\n\tgetRemoteAddress,\n\tresolveSSL,\n\tshowServerListeningMessage\n} from \"insite-common/backend\";\nimport { CODES } from \"../common\";\nimport { isQuietSymbol, requestListenersSymbol } from \"./symbols\";\nimport { WSServerClient } from \"./WSServerClient\";\nimport type { Options, RequestListener } from \"./types\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\nexport class WSServer<WSSC extends WSServerClient = WSServerClient> extends WebSocketServer<typeof WSServerClient> {\n\tconstructor(options: Options<WSSC>) {\n\t\tconst {\n\t\t\ticon = \"\uD83D\uDD0C\",\n\t\t\tname = \"WS\",\n\t\t\tssl: _,\n\t\t\tport,\n\t\t\tserver = createServer(WSServer.makeProps(options)),\n\t\t\tquiet = false,\n\t\t\t...wssOptions\n\t\t} = options;\n\t\t\n\t\tsuper({\n\t\t\tWebSocket: WSServerClient,\n\t\t\t...wssOptions,\n\t\t\tserver\n\t\t});\n\t\t\n\t\tthis.icon = icon;\n\t\tthis.name = name;\n\t\t\n\t\tthis.server = server;\n\t\t\n\t\tif (options.server)\n\t\t\tvoid new Promise<void>(resolve => void (\n\t\t\t\tserver.listening ?\n\t\t\t\t\tresolve() :\n\t\t\t\t\tserver.on(\"listening\", resolve)\n\t\t\t)).then(() => showServerListeningMessage(this));\n\t\telse\n\t\t\tthis.server.listen(\n\t\t\t\ttypeof port == \"string\" ?\n\t\t\t\t\tNumber.parseInt(port) :\n\t\t\t\t\tport ?? (this.isS ? 443 : 80),\n\t\t\t\t() => showServerListeningMessage(this)\n\t\t\t);\n\t\t\n\t\tthis[isQuietSymbol] = quiet;\n\t\t\n\t\tthis.on(\"connection\", this.#handleConnection);\n\t\t\n\t\tif (!this[isQuietSymbol]) {\n\t\t\tthis.on(\"error\", (error: Error) => console.error(`${this.icon}\u2757\uFE0F WS Server:`, error));\n\t\t\t\n\t\t\tthis.on(\"close\", () => console.error(`${this.icon}\u2757\uFE0F WS Server closed`));\n\t\t}\n\t\t\n\t}\n\t\n\ton(event: \"connection\", callback: (this: this, socket: WSSC, request: http.IncomingMessage) => void): this;\n\ton(event: \"error\", callback: (this: this, error: Error) => void): this;\n\ton(event: \"headers\", callback: (this: this, headers: string[], request: http.IncomingMessage) => void): this;\n\ton(event: \"close\" | \"listening\", callback: (this: this) => void): this;\n\t\n\ton(event: \"client-connect\", listener: (this: this, wscc: WSSC, request: http.IncomingMessage) => void): this;\n\ton(event: \"client-error\", listener: (this: this, wscc: WSSC, error: Error | undefined) => void): this;\n\ton(event: `client-${string}`, listener: (this: this, wscc: WSSC, ...args: any[]) => void): this;\n\ton(event: \"client-close\", listener: (this: this, wscc: WSSC) => void): this;\n\t\n\ton(event: string | symbol, listener: (this: this, ...args: any[]) => void): this;\n\ton(event: string | symbol, listener: (this: this, ...args: any[]) => void): this {\n\t\treturn super.on(event, listener 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\ticon;\n\tname;\n\tget protocol() {\n\t\treturn `ws${this.isS ? \"s\" : \"\"}`;\n\t}\n\t\n\tserver;\n\t\n\tget isS() {\n\t\treturn \"setSecureContext\" in this.server;\n\t}\n\t\n\t[isQuietSymbol]: boolean;\n\t\n\t[requestListenersSymbol] = new Map<string, RequestListener<WSSC>>();\n\t\n\taddRequestListener(kind: string, listener: RequestListener<WSSC>) {\n\t\tthis[requestListenersSymbol].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[requestListenersSymbol].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#handleConnection(wssc: WSSC, request: http.IncomingMessage) {\n\t\t\n\t\t/* Compatibility with Bun */\n\t\tif (!(wssc instanceof WSServerClient))\n\t\t\tWSServerClient.extend.call(wssc);\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\tWSServerClient.handleConnect.call(wssc);\n\t\t\n\t\tthis.emit(\"client-connect\", wssc, request);\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\" && !this[isQuietSymbol])\n\t\t\tconsole.info(\n\t\t\t\t`${this.icon} WS Server:`,\n\t\t\t\t\"user\" in wssc ? `\\x1B[1m${(wssc.user as { email: string }).email}\\x1B[0m` : \"\\x1B[3manonymous\\x1B[0m\",\n\t\t\t\t\"connected\"\n\t\t\t);\n\t\t\n\t}\n\t\n\t\n\tstatic makeProps<SWSSC extends WSServerClient>({ ssl }: Options<SWSSC>): http.ServerOptions | https.ServerOptions {\n\t\treturn {\n\t\t\t...resolveSSL(ssl)\n\t\t};\n\t}\n\t\n\tstatic CLOSE_CODES = CODES;\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", "export const isQuietSymbol = Symbol(\"isQuiet\");\nexport const requestListenersSymbol = Symbol(\"requestListeners\");\nexport const heartbeatIntervalSymbol = Symbol(\"heartbeatInterval\");\nexport const heartbeatTimeoutSymbol = Symbol(\"heartbeatTimeout\");\nexport const defibSymbol = Symbol(\"defib\");\nexport const heartbeatTsSymbol = Symbol(\"heartbeatTs\");\nexport const requestCounterSymbol = Symbol(\"requestCounter\");\n", "import { ClientRequest, IncomingMessage } from \"node:http\";\nimport { RawData, WebSocket } from \"ws\";\nimport { handleMongoError } from \"@nesvet/n\";\nimport {\n\tCODES,\n\tHEARTBEAT_GAP,\n\tHEARTBEAT_INTERVAL,\n\tREQUEST_COUNTER_LIMIT,\n\tREQUEST_HEADERS\n} from \"../common\";\nimport {\n\tdefibSymbol,\n\theartbeatIntervalSymbol,\n\theartbeatTimeoutSymbol,\n\theartbeatTsSymbol,\n\tisQuietSymbol,\n\trequestCounterSymbol,\n\trequestListenersSymbol\n} from \"./symbols\";\nimport { WSServer } from \"./WSServer\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\nexport class WSServerClient extends WebSocket {\n\ton(event: \"close\", listener: (this: this, code: number, reason: Buffer) => void): this;\n\ton(event: \"error\", listener: (this: this, error: Error) => void): this;\n\ton(event: \"upgrade\", listener: (this: this, request: IncomingMessage) => void): this;\n\ton(event: \"message\", listener: (this: this, data: RawData, isBinary: boolean) => void): this;\n\ton(event: \"open\", listener: (this: this) => void): this;\n\ton(event: \"unexpected-response\", listener: (this: this, request: ClientRequest, response: IncomingMessage) => void): this;\n\ton(event: string | symbol, listener: (this: this, ...args: any[]) => void): this;\n\ton(event: string | symbol, listener: (this: this, ...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!: WSServer<this>;\n\t\n\tuserAgent = \"\";\n\t\n\tremoteAddress = \"\";\n\t\n\t[heartbeatTimeoutSymbol]?: ReturnType<typeof setTimeout>;\n\t\n\t[defibSymbol]() {\n\t\t\n\t\tclearTimeout(this[heartbeatTimeoutSymbol]);\n\t\t\n\t\tthis[heartbeatTimeoutSymbol] = setTimeout(\n\t\t\t() => this.terminate(),\n\t\t\tHEARTBEAT_INTERVAL + HEARTBEAT_GAP\n\t\t);\n\t\t\n\t}\n\t\n\tlatency = 0;\n\t\n\t[heartbeatTsSymbol]?: number;\n\t\n\t[heartbeatIntervalSymbol] = WSServerClient.makeHeartbeatInterval.call(this);\n\t\n\tsendMessage(...args: unknown[]) {\n\t\treturn this.send(JSON.stringify(args));\n\t}\n\t\n\t[requestCounterSymbol]: number = 0;\n\t\n\tsendRequest(...args: unknown[]) {\n\t\t\n\t\tconst id = this[requestCounterSymbol]++;\n\t\t\n\t\tif (this[requestCounterSymbol] >= REQUEST_COUNTER_LIMIT)\n\t\t\tthis[requestCounterSymbol] = 0;\n\t\t\n\t\tconst eventName = `message:${REQUEST_HEADERS.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\t\n\t\t\tthis.sendMessage(REQUEST_HEADERS.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) 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\n\tstatic makeHeartbeatInterval(this: WSServerClient) {\n\t\treturn setInterval(() => {\n\t\t\t\n\t\t\tthis[heartbeatTsSymbol] = Date.now();\n\t\t\t\n\t\t\tthis.send(\"\");\n\t\t\t\n\t\t}, HEARTBEAT_INTERVAL);\n\t}\n\t\n\t/* Compatibility with Bun */\n\tstatic extend(this: WSServerClient) {\n\t\t\n\t\tObject.defineProperties(this, {\n\t\t\tisConnecting: {\n\t\t\t\tget: Object.getOwnPropertyDescriptor(WSServerClient.prototype, \"isConnecting\")!.get\n\t\t\t},\n\t\t\tisOpen: {\n\t\t\t\tget: Object.getOwnPropertyDescriptor(WSServerClient.prototype, \"isOpen\")!.get\n\t\t\t},\n\t\t\tisClosing: {\n\t\t\t\tget: Object.getOwnPropertyDescriptor(WSServerClient.prototype, \"isClosing\")!.get\n\t\t\t},\n\t\t\tisClosed: {\n\t\t\t\tget: Object.getOwnPropertyDescriptor(WSServerClient.prototype, \"isClosed\")!.get\n\t\t\t}\n\t\t});\n\t\t\n\t\tconst { terminate } = this;\n\t\t\n\t\tObject.assign(this, {\n\t\t\tisWebSocketServerClient: true,\n\t\t\tisWebSocketServer: false,\n\t\t\tisWebSocket: false,\n\t\t\t[defibSymbol]: WSServerClient.prototype[defibSymbol],\n\t\t\tlatency: 0,\n\t\t\t[heartbeatIntervalSymbol]: WSServerClient.makeHeartbeatInterval.call(this),\n\t\t\tsendMessage: WSServerClient.prototype.sendMessage,\n\t\t\tsendRequest: WSServerClient.prototype.sendRequest,\n\t\t\tterminate() { /* Workaround Bun's WebSocket#terminate bug */\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\tterminate.call(this);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t\n\t}\n\t\n\tstatic handleConnect(this: WSServerClient) {\n\t\t\n\t\tthis.on(\"message\", WSServerClient.handleMessage);\n\t\tthis.on(\"error\", WSServerClient.handleError);\n\t\tthis.on(\"close\", WSServerClient.handleClose);\n\t\t\n\t\tthis[defibSymbol]();\n\t\t\n\t}\n\t\n\tstatic handleMessage(this: WSServerClient, data: RawData) {\n\t\tconst message = data.toString();// eslint-disable-line @typescript-eslint/no-base-to-string\n\t\t\n\t\tthis[defibSymbol]();\n\t\t\n\t\tif (message)\n\t\t\tif (message === \"?\")\n\t\t\t\tthis.send(\"!\");\n\t\t\telse\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 WSServerClient.handleRequest.call(this, ...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.wss.emit(\"client-message\", this, kind, ...rest);\n\t\t\t\t\t\t\tthis.wss.emit(`client-message:${kind}`, this, ...rest);\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tWSServerClient.handleError.call(this, error as Error);\n\t\t\t\t}\n\t\telse if (this[heartbeatTsSymbol]) {\n\t\t\tthis.latency = Date.now() - this[heartbeatTsSymbol];\n\t\t\tthis[heartbeatTsSymbol] = undefined;\n\t\t}\n\t\t\n\t}\n\t\n\tstatic async handleRequest(this: WSServerClient, id: number, kind: string, ...rest: unknown[]) {\n\t\tconst listener = this.wss[requestListenersSymbol].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.wss, this, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\t\t\thandleMongoError(error);\n\t\t\t\t\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\t\n\t\t\t\tif (process.env.NODE_ENV === \"development\" && !this.wss[isQuietSymbol])\n\t\t\t\t\tconsole.error(`${this.wss.icon}\u2757\uFE0F WS Server request \"${kind}\" (${id}):`, error);\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\tstatic handleError(this: WSServerClient, error: Error | Event | undefined) {\n\t\tif (error instanceof Event)\n\t\t\terror = undefined;\n\t\t\n\t\tif (!this.wss[isQuietSymbol])\n\t\t\tconsole.error(\n\t\t\t\t`${this.wss.icon}\u2757\uFE0F WS Server client`,\n\t\t\t\t\"user\" in this ? `\\x1B[1m${(this.user as { email: string }).email}\\x1B[0m:` : \"\\x1B[3manonymous\\x1B[0m:\",\n\t\t\t\terror\n\t\t\t);\n\t\t\n\t\tthis.wss.emit(\"client-error\", this, error);\n\t\t\n\t}\n\t\n\tstatic handleClose(this: WSServerClient, code: number, reason: Buffer) {\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\") {\n\t\t\tconst reasonString = reason.toString();\n\t\t\t\n\t\t\tif (!this.wss[isQuietSymbol])\n\t\t\t\tconsole.info(\n\t\t\t\t\t`${this.wss.icon} WS Server:`,\n\t\t\t\t\t\"user\" in this ? `\\x1B[1m${(this.user as { email: string }).email}\\x1B[0m` : \"\\x1B[3manonymous\\x1B[0m\",\n\t\t\t\t\t`disconnected ${code ? `with code ${code}` : \"\"} ${code && reasonString ? \"and \" : \"\"}${reasonString ? `reason \"${reasonString}\"` : \"\"}`\n\t\t\t\t);\n\t\t}\n\t\t\n\t\tclearTimeout(this[heartbeatTimeoutSymbol]);\n\t\tclearInterval(this[heartbeatIntervalSymbol]);\n\t\t\n\t\tthis.wss.emit(\"client-close\", this);\n\t\t\n\t}\n\t\n\tstatic CLOSE_CODES = CODES;\n\t\n}\n", "export function noop() { /**/ }\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\ntype Options = {\n\tsignal?: AbortSignal;\n\ttimeout?: number;\n};\n\nconst nativesMap = new WeakMap<StatefulPromise<any>, { resolve: Resolve<any>; reject: Reject }>();\n\n\nexport class StatefulPromise<T> extends Promise<T> {\n\tconstructor(\n\t\texecutor?: (resolve: Resolve<T>, reject: Reject) => void,\n\t\toptions?: Options\n\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\tif (options?.signal)\n\t\t\tif (options.signal.aborted)\n\t\t\t\tthis.reject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\telse {\n\t\t\t\tconst abortListener = () => this.reject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\t\t\n\t\t\t\toptions.signal.addEventListener(\"abort\", abortListener);\n\t\t\t\t\n\t\t\t\tthis.finally(() => options.signal?.removeEventListener(\"abort\", abortListener));\n\t\t\t}\n\t\t\n\t\tif (typeof options?.timeout === \"number\" && Number.isFinite(options.timeout)) {\n\t\t\tconst timeout = setTimeout(() => this.reject(new DOMException(\"Timeout exceeded\", \"TimeoutError\")), options.timeout);\n\t\t\t\n\t\t\tthis.finally(() => clearTimeout(timeout));\n\t\t}\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?: T | unknown;\n\t\n\treadonly resolve = (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\treadonly reject = (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\t\n\tstatic resolved<U>(value: U): StatefulPromise<U> {\n\t\treturn new StatefulPromise<U>(resolve => resolve(value));\n\t}\n\t\n\tstatic rejected(reason: unknown): StatefulPromise<never> {\n\t\treturn new StatefulPromise((_, reject) => reject(reason));\n\t}\n\t\n}\n", "import { noop } from \"./noop.js\";\nimport { StatefulPromise } from \"./StatefulPromise.js\";\n\n\ntype Callback = (...args: any[]) => unknown;// eslint-disable-line @typescript-eslint/no-explicit-any\ntype FunctionOrBoolean = (() => unknown) | boolean;\ntype Options = { leading?: FunctionOrBoolean; maxWait?: number; trailing?: FunctionOrBoolean };\n\ntype DebouncedFunction<C extends Callback> = {\n\t(this: ThisParameterType<C>, ...args: Parameters<C>): Promise<Awaited<ReturnType<C>>>;\n};\n\nexport type Debounced<C extends Callback, R extends ReturnType<C>> = DebouncedFunction<C> & {\n\tcallback: C;\n\tpromise: StatefulPromise<R>;\n\tresolve: (value: R) => void;\n\treject: (reason?: unknown) => void;\n\trun(): Promise<R>;\n\tclear(shouldRun?: boolean): Promise<void>;\n};\n\n\nexport function debounce<C extends Callback, R extends ReturnType<C>>(callback: C, limit = 0, options: Options = {}) {\n\tlet { leading = false, trailing = true } = options;\n\tconst { maxWait = Infinity } = options;\n\t\n\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\tlet maxWaitTimeout: ReturnType<typeof setTimeout> | undefined;\n\tlet end: number | undefined;\n\tlet context: ThisParameterType<C>;\n\tlet args: unknown[];\n\tlet initial: FunctionOrBoolean;\n\tlet final: FunctionOrBoolean;\n\tlet result: R;\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\t\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\tmaxWaitTimeout = undefined;\n\t\t\t\n\t\t\tif (typeof final == \"function\")\n\t\t\t\tawait final();\n\t\t\t\n\t\t\tdebounced.resolve(result);\n\t\t\t\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\t\n\t\trun();\n\t\t\n\t\tmaxWaitTimeout = setTimeout(maxWaitExpired as TimerHandler, maxWait);\n\t\t\n\t} : null;\n\t\n\tasync function run() {\n\t\ttry {\n\t\t\tresult = await callback.apply(context, args) as R;\n\t\t\t\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tdebounced.reject(error);\n\t\t\t\n\t\t\tthrow error;\n\t\t}\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<C, R> = 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.isPending)\n\t\t\tdebounced.promise = new StatefulPromise<R>((resolve, reject) => {\n\t\t\t\tdebounced.resolve = resolve;\n\t\t\t\tdebounced.reject = reject;\n\t\t\t\t\n\t\t\t\tif (typeof initial == \"function\") {\n\t\t\t\t\tinitial();\n\t\t\t\t\t\n\t\t\t\t\tinitial = false;\n\t\t\t\t\t\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\t\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\n\t\treturn debounced.promise;\n\t} as DebouncedFunction<C>, {\n\t\tcallback,\n\t\tpromise: StatefulPromise.resolved(undefined as unknown as R),\n\t\tresolve: noop,\n\t\treject: 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\tmaxWaitTimeout = undefined;\n\t\t\t\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: StatefulPromise.resolved(undefined), // eslint-disable-line unicorn/no-useless-undefined\n\tresolve: noop,\n\treject: noop,\n\trun: noop,\n\tclear: noop\n}) as Debounced<() => void, void>;\n\n\nexport function throttle(callback: Callback, 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 indent(string: string, indentation: string = \"\\t\", times: number = 1): string {\n\tif (!string)\n\t\treturn string;\n\t\n\tconst prefix = indentation.repeat(times);\n\t\n\treturn string.split(\"\\n\").map(line => `${prefix}${line}`).join(\"\\n\");\n}\n", "import { indent } from \"./indent.js\";\n\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\ntype MongoServerError = {\n\terrorResponse: {\n\t\terrmsg: string;\n\t\terrInfo?: {\n\t\t\t[key: string]: any;\n\t\t};\n\t};\n\tisMongoServerError?: true;\n\t[key: string]: any;\n};\n\nexport function handleMongoError<E extends MongoServerError>(error: E): E;\nexport function handleMongoError(error: any): any;\nexport function handleMongoError(error: any) {\n\t\n\ttry {\n\t\tconst documentFailedValidationResponses =\n\t\t\t(\"writeErrors\" in error ? error.writeErrors : [ error.errorResponse ])\n\t\t\t\t.filter((errorResponse: MongoServerError[\"errorResponse\"]) => errorResponse.errmsg === \"Document failed validation\");\n\t\t\n\t\tif (documentFailedValidationResponses.length)\n\t\t\terror.message += `\\n${\n\t\t\t\tdocumentFailedValidationResponses.map(\n\t\t\t\t\t(errorResponse: MongoServerError[\"errorResponse\"]) =>\n\t\t\t\t\t\tindent(\n\t\t\t\t\t\t\t`failingDocumentId: ${errorResponse.errInfo?.failingDocumentId}\\n` +\n\t\t\t\t\t\t\t`schemaRulesNotSatisfied: ${JSON.stringify(errorResponse.errInfo?.details?.schemaRulesNotSatisfied, null, \" \")}`,\n\t\t\t\t\t\t\t\" \"\n\t\t\t\t\t\t)\n\t\t\t\t).join(\"\\n\")\n\t\t\t}`;\n\t\t\n\t\terror.isMongoServerError = true;\n\t} catch {}\n\t\n\treturn error;\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"],
5
+ "mappings": "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",
6
+ "names": ["WebSocketServer", "createServer", "getRemoteAddress", "resolveSSL", "showServerListeningMessage", "REQUEST_COUNTER_LIMIT", "CODES", "NON_RECONNECTABLE_CODES", "REQUEST_HEADERS", "isQuietSymbol", "requestListenersSymbol", "heartbeatIntervalSymbol", "heartbeatTimeoutSymbol", "defibSymbol", "heartbeatTsSymbol", "requestCounterSymbol", "WebSocket", "noop", "nativesMap", "StatefulPromise", "_StatefulPromise", "executor", "options", "nativeResolve", "nativeReject", "resolve", "reject", "abortListener", "timeout", "value", "native", "reason", "_", "debounce", "callback", "limit", "options", "leading", "trailing", "maxWait", "timeout", "maxWaitTimeout", "end", "context", "args", "initial", "final", "result", "expired", "n", "debounced", "maxWaitExpired", "run", "error", "_args", "StatefulPromise", "resolve", "reject", "noop", "shouldRun", "indent", "string", "indentation", "times", "prefix", "line", "handleMongoError", "error", "documentFailedValidationResponses", "errorResponse", "indent", "howmuch", "number", "one", "two", "five", "shouldPrintNumber", "u", "d", "WSServerClient", "_WSServerClient", "WebSocket", "event", "listener", "heartbeatTimeoutSymbol", "defibSymbol", "heartbeatTsSymbol", "heartbeatIntervalSymbol", "args", "requestCounterSymbol", "id", "REQUEST_COUNTER_LIMIT", "eventName", "REQUEST_HEADERS", "resolve", "reject", "error", "result", "message", "restProps", "terminate", "data", "kind", "rest", "requestListenersSymbol", "requestError", "handleMongoError", "isQuietSymbol", "code", "reason", "reasonString", "CODES", "WSServer", "_WSServer", "WebSocketServer", "options", "icon", "name", "_", "port", "server", "createServer", "quiet", "wssOptions", "WSServerClient", "resolve", "showServerListeningMessage", "isQuietSymbol", "#handleConnection", "error", "event", "listener", "requestListenersSymbol", "kind", "wssc", "request", "getRemoteAddress", "ssl", "resolveSSL", "CODES"]
7
7
  }
@@ -1,6 +1,16 @@
1
1
  import type { ServerOptions } from "ws";
2
2
  import type { WSServerClient } from "./WSServerClient";
3
3
  export type Options<WSSC extends WSServerClient> = Omit<ServerOptions<typeof WSServerClient>, "port"> & {
4
+ /**
5
+ * Icon for console logs
6
+ * @default "🔌"
7
+ */
8
+ icon?: string;
9
+ /**
10
+ * Name
11
+ * @default "WS"
12
+ */
13
+ name?: string;
4
14
  ssl?: {
5
15
  cert: Buffer | string;
6
16
  key: Buffer | string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMvD,MAAM,MAAM,OAAO,CAAC,IAAI,SAAS,cAAc,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,cAAc,CAAC,EAAE,MAAM,CAAC,GAAG;IACvG,GAAG,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;QACtB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;KACrB,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,cAAc,GAAG;QACnC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;KAC3B,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,IAAI,SAAS,cAAc,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;AAE/F,MAAM,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMvD,MAAM,MAAM,OAAO,CAAC,IAAI,SAAS,cAAc,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,cAAc,CAAC,EAAE,MAAM,CAAC,GAAG;IAEvG;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,GAAG,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;QACtB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;KACrB,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,cAAc,GAAG;QACnC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;KAC3B,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,IAAI,SAAS,cAAc,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC;AAE/F,MAAM,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "insite-ws",
3
- "version": "2.3.2",
3
+ "version": "2.3.5",
4
4
  "description": "inSite WebSockets",
5
5
  "type": "module",
6
6
  "exports": {
@@ -8,7 +8,7 @@
8
8
  "./client": "./dist/client/index.js",
9
9
  "./client/node": "./dist/client/node/index.js"
10
10
  },
11
- "packageManager": "bun@1.2.13",
11
+ "packageManager": "bun@1.2.21",
12
12
  "scripts": {
13
13
  "test": "echo \"Error: no test specified\" && exit 1",
14
14
  "build": "bun .conveyer.js",
@@ -26,16 +26,16 @@
26
26
  "author": "Eugene Nesvetaev <dev@nesvet.dev> (https://nesvet.dev/)",
27
27
  "license": "MIT",
28
28
  "dependencies": {
29
- "@nesvet/n": "^1.2.0",
29
+ "@nesvet/n": "^1.2.1",
30
30
  "eventemitter3": "^5.0.1",
31
- "insite-common": "^2.3.0",
32
- "ws": "^8.18.2"
31
+ "insite-common": "^2.3.5",
32
+ "ws": "^8.18.3"
33
33
  },
34
34
  "devDependencies": {
35
- "@nesvet/conveyer": "^2.5.2",
36
- "@nesvet/eslint-config": "^2.1.1",
37
- "@types/node": "^22.15.18",
35
+ "@nesvet/eslint-config": "^2.1.2",
36
+ "@types/node": "^24.3.1",
38
37
  "@types/ws": "^8.18.1",
39
- "typescript": "^5.8.3"
38
+ "cnvr": "^2.7.2",
39
+ "typescript": "^5.9.2"
40
40
  }
41
41
  }