insite-ws 2.0.9 → 2.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bun.lockb CHANGED
Binary file
@@ -9,6 +9,7 @@ export declare class InSiteWebSocketServer extends WebSocketServer<typeof InSite
9
9
  readonly isWebSocketServer = true;
10
10
  readonly isWebSocketServerClient = false;
11
11
  readonly isWebSocket = false;
12
+ readonly port: number;
12
13
  addRequestListener(kind: string, listener: RequestListener): this;
13
14
  onRequest: (kind: string, listener: RequestListener) => this;
14
15
  removeRequestListener(kind: string): this;
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocketServer.d.ts","sourceRoot":"","sources":["../../src/server/WebSocketServer.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,SAAS,EAAE,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAAsB,OAAO,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAGtE,qBAAa,qBAAsB,SAAQ,eAAe,CAAC,OAAO,2BAA2B,CAAC;;gBACjF,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC;IA4B1F,QAAQ,CAAC,iBAAiB,QAAQ;IAClC,QAAQ,CAAC,uBAAuB,SAAS;IACzC,QAAQ,CAAC,WAAW,SAAS;IAI7B,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,gBAAgB,CAAC,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,2BAA2B,GAAG,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe;IAyDjI,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO;IAsBrF,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS;IAW5F,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,2BAA2B,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;CAa9E"}
1
+ {"version":3,"file":"WebSocketServer.d.ts","sourceRoot":"","sources":["../../src/server/WebSocketServer.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,SAAS,EAAE,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAAsB,OAAO,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAC;AAGtE,qBAAa,qBAAsB,SAAQ,eAAe,CAAC,OAAO,2BAA2B,CAAC;;gBACjF,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC;IA4C1F,QAAQ,CAAC,iBAAiB,QAAQ;IAClC,QAAQ,CAAC,uBAAuB,SAAS;IACzC,QAAQ,CAAC,WAAW,SAAS;IAE7B,QAAQ,CAAC,IAAI,SAAC;IAId,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,gBAAgB,CAAC,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,2BAA2B,GAAG,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe;IAyDjI,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,2BAA2B,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO;IAsBrF,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS;IAW5F,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,2BAA2B,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;CAa9E"}
@@ -1,2 +1,2 @@
1
- import k from"node:http";import W from"node:https";import{WebSocketServer as O}from"ws";var l={request:"~r-q",response:"~r-s"};var p=Symbol("heartbeatInterval"),c=Symbol("defib"),S=Symbol("pingTs");import{WebSocket as y}from"ws";import{debounce as v,uid as C}from"@nesvet/n";var r=class i extends y{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="";[c]=i.makeDefib.call(this);latency=0;[S];[p]=i.makeHeartbeatInterval.call(this);sendMessage(...e){return this.send(JSON.stringify(e))}sendRequest(...e){let t=C(),s=`message:${l.response}-${t}`;return typeof e.at(-1)=="function"?(this.once(s,e.splice(-1,1)[0]),this.sendMessage(l.request,t,...e),this):new Promise((n,h)=>{this.once(s,(o,a)=>{if(o){let{message:m,...b}=o;h(Object.assign(new Error(m),b))}else n(a)}),this.sendMessage(l.request,t,...e)})}static makeDefib(){return v(()=>this.terminate(),65e3)}static makeHeartbeatInterval(){return setInterval(()=>{this[S]=Date.now(),this.send("")},5e3)}};var g=class i extends O{constructor(e,t,s){let{ssl:n,port:h,server:o=n?W.createServer({...n}):k.createServer(),...a}=e;super({...a,WebSocket:r,server:o}),t&&(typeof t=="function"?s=t:Object.assign(this,t)),this.on("connection",i.handleConnection),this.on(`client-message:${l.request}`,this.#t),o.listen(h,s)}isWebSocketServer=!0;isWebSocketServerClient=!1;isWebSocket=!1;#e=new Map;addRequestListener(e,t){return this.#e.set(e,t),this}onRequest=this.addRequestListener;removeRequestListener(e){return this.#e.delete(e),this}offRequest=this.removeRequestListener;#t=async(e,t,s,...n)=>{let h=this.#e.get(s),o,a=null;if(h)try{o=await h.call(this,e,...n)}catch(m){if(m instanceof Error){let{message:b,...f}=m;a={message:b,...f}}}else a={message:`Unknown request kind "${s}"`};e.sendMessage(`${l.response}-${t}`,a,o)};static handleConnection(e,t){if(!(e instanceof r)){Object.defineProperties(e,{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:s}=e;Object.assign(e,{isWebSocketServerClient:!0,isWebSocketServer:!1,isWebSocket:!1,[c]:r.makeDefib.call(e),latency:0,[p]:r.makeHeartbeatInterval.call(e),sendMessage:r.prototype.sendMessage,sendRequest:r.prototype.sendRequest,terminate(){try{s.call(e)}catch(n){console.error(n)}}})}Object.assign(e,{wss:this,userAgent:t.headers["user-agent"]??"",remoteAddress:t.headers["x-real-ip"]??t.headers["x-forwarded-for"]??""}),e[c](),e.on("message",i.handleClientMessage),e.on("error",i.handleClientError),e.on("close",i.handleClientClose),this.emit("client-connect",e,t)}static handleClientMessage(e){let t=e.toString();if(this[c](),t)try{let[s,...n]=JSON.parse(t);this.emit(`message:${s}`,...n),this.wss.emit("client-message",this,s,...n),this.wss.emit(`client-message:${s}`,this,...n)}catch(s){i.handleClientError.call(this,s)}else this[S]&&(this.latency=Date.now()-this[S],delete this[S])}static handleClientError(e){e instanceof Event&&(e=void 0),process.env.NODE_ENV==="development"&&console.error("WebSocketServer Client error",e),this.wss.emit("client-error",this,e)}static handleClientClose(...e){process.env.NODE_ENV==="development"&&console.info("WebSocketServer Client closed",...e),this[c].clear(),clearInterval(this[p]),this.wss.emit("client-close",this),this.wss.emit("client-closed",this)}};export{g as InSiteWebSocketServer,r as InSiteWebSocketServerClient};
1
+ import f from"node:fs";import I from"node:http";import W from"node:https";import{WebSocketServer as O}from"ws";var c={request:"~r-q",response:"~r-s"};var h=Symbol("heartbeatInterval"),p=Symbol("defib"),S=Symbol("pingTs");import{WebSocket as k}from"ws";import{debounce as v,uid as C}from"@nesvet/n";var n=class i extends k{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]=i.makeDefib.call(this);latency=0;[S];[h]=i.makeHeartbeatInterval.call(this);sendMessage(...e){return this.send(JSON.stringify(e))}sendRequest(...e){let r=C(),s=`message:${c.response}-${r}`;return typeof e.at(-1)=="function"?(this.once(s,e.splice(-1,1)[0]),this.sendMessage(c.request,r,...e),this):new Promise((t,o)=>{this.once(s,(a,l)=>{if(a){let{message:m,...b}=a;o(Object.assign(new Error(m),b))}else t(l)}),this.sendMessage(c.request,r,...e)})}static makeDefib(){return v(()=>this.terminate(),65e3)}static makeHeartbeatInterval(){return setInterval(()=>{this[S]=Date.now(),this.send("")},5e3)}};var g=class i extends O{constructor(e,r,s){let{ssl:t,port:o,...a}=e;if(t){if(typeof t.cert=="string"&&!/^-{3,}BEGIN/.test(t.cert))try{t.cert=f.readFileSync(t.cert)}catch{}if(typeof t.key=="string"&&!/^-{3,}BEGIN/.test(t.key))try{t.key=f.readFileSync(t.key)}catch{}}let{server:l=t?W.createServer({...t}):I.createServer()}=a;super({...a,server:l,WebSocket:n}),this.port=typeof o=="string"?Number.parseInt(o):o,r&&(typeof r=="function"?s=r:Object.assign(this,r)),this.on("connection",i.handleConnection),this.on(`client-message:${c.request}`,this.#t),l.listen(this.port,s)}isWebSocketServer=!0;isWebSocketServerClient=!1;isWebSocket=!1;port;#e=new Map;addRequestListener(e,r){return this.#e.set(e,r),this}onRequest=this.addRequestListener;removeRequestListener(e){return this.#e.delete(e),this}offRequest=this.removeRequestListener;#t=async(e,r,s,...t)=>{let o=this.#e.get(s),a,l=null;if(o)try{a=await o.call(this,e,...t)}catch(m){if(m instanceof Error){let{message:b,...y}=m;l={message:b,...y}}}else l={message:`Unknown request kind "${s}"`};e.sendMessage(`${c.response}-${r}`,l,a)};static handleConnection(e,r){if(!(e instanceof n)){Object.defineProperties(e,{isConnecting:{get:Object.getOwnPropertyDescriptor(n.prototype,"isConnecting").get},isOpen:{get:Object.getOwnPropertyDescriptor(n.prototype,"isOpen").get},isClosing:{get:Object.getOwnPropertyDescriptor(n.prototype,"isClosing").get},isClosed:{get:Object.getOwnPropertyDescriptor(n.prototype,"isClosed").get}});let{terminate:s}=e;Object.assign(e,{isWebSocketServerClient:!0,isWebSocketServer:!1,isWebSocket:!1,[p]:n.makeDefib.call(e),latency:0,[h]:n.makeHeartbeatInterval.call(e),sendMessage:n.prototype.sendMessage,sendRequest:n.prototype.sendRequest,terminate(){try{s.call(e)}catch(t){console.error(t)}}})}Object.assign(e,{wss:this,userAgent:r.headers["user-agent"]??"",remoteAddress:r.headers["x-real-ip"]??r.headers["x-forwarded-for"]??""}),e[p](),e.on("message",i.handleClientMessage),e.on("error",i.handleClientError),e.on("close",i.handleClientClose),this.emit("client-connect",e,r)}static handleClientMessage(e){let r=e.toString();if(this[p](),r)try{let[s,...t]=JSON.parse(r);this.emit(`message:${s}`,...t),this.wss.emit("client-message",this,s,...t),this.wss.emit(`client-message:${s}`,this,...t)}catch(s){i.handleClientError.call(this,s)}else this[S]&&(this.latency=Date.now()-this[S],delete this[S])}static handleClientError(e){e instanceof Event&&(e=void 0),process.env.NODE_ENV==="development"&&console.error("WebSocketServer Client error",e),this.wss.emit("client-error",this,e)}static handleClientClose(...e){process.env.NODE_ENV==="development"&&console.info("WebSocketServer Client closed",...e),this[p].clear(),clearInterval(this[h]),this.wss.emit("client-close",this),this.wss.emit("client-closed",this)}};export{g as InSiteWebSocketServer,n as InSiteWebSocketServerClient};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/server/WebSocketServer.ts", "../../src/common.ts", "../../src/server/symbols.ts", "../../src/server/WebSocketServerClient.ts"],
4
- "sourcesContent": ["import http from \"node:http\";\nimport https from \"node:https\";\nimport WebSocket, { WebSocketServer } from \"ws\";\nimport { requestHeaders, type RequestListener } from \"../common\";\nimport { defibSymbol, heartbeatIntervalSymbol, pingTsSymbol } from \"./symbols\";\nimport { CompatibleListener, Options } from \"./types\";\nimport { InSiteWebSocketServerClient } from \"./WebSocketServerClient\";\n\n\nexport class InSiteWebSocketServer extends WebSocketServer<typeof InSiteWebSocketServerClient> {\n\tconstructor(options: Options, props?: Record<string, unknown>, handleListen?: (() => void)) {\n\t\tconst {\n\t\t\tssl,\n\t\t\tport,\n\t\t\tserver = ssl ? https.createServer({ ...ssl }) : http.createServer(),\n\t\t\t...wssOptions\n\t\t} = options;\n\t\t\n\t\tsuper({\n\t\t\t...wssOptions,\n\t\t\tWebSocket: InSiteWebSocketServerClient,\n\t\t\tserver\n\t\t});\n\t\t\n\t\tif (props)\n\t\t\tif (typeof props == \"function\")\n\t\t\t\thandleListen = props;\n\t\t\telse\n\t\t\t\tObject.assign(this, props);\n\t\t\n\t\tthis.on(\"connection\", InSiteWebSocketServer.handleConnection as CompatibleListener);\n\t\t\n\t\tthis.on(`client-message:${requestHeaders.request}`, this.#handleRequest);\n\t\t\n\t\tserver.listen(port, handleListen);\n\t\t\n\t}\n\t\n\treadonly isWebSocketServer = true;\n\treadonly isWebSocketServerClient = false;\n\treadonly isWebSocket = false;\n\t\n\t#requestListeners = new Map<string, RequestListener>();\n\t\n\taddRequestListener(kind: string, listener: RequestListener) {\n\t\tthis.#requestListeners.set(kind, listener);\n\t\t\n\t\treturn this;\n\t}\n\t\n\tonRequest = this.addRequestListener;\n\t\n\tremoveRequestListener(kind: string) {\n\t\tthis.#requestListeners.delete(kind);\n\t\t\n\t\treturn this;\n\t}\n\t\n\toffRequest = this.removeRequestListener;\n\t\n\t#handleRequest = async (wssc: InSiteWebSocketServerClient, id: string, kind: string, ...rest: unknown[]) => {\n\t\tconst listener = this.#requestListeners.get(kind);\n\t\t\n\t\tlet result;\n\t\tlet requestError = null;\n\t\t\n\t\tif (listener)\n\t\t\ttry {\n\t\t\t\tresult = await listener.call(this, wssc, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\tconst { message, ...restProps } = error;\n\t\t\t\t\trequestError = { message, ...restProps };\n\t\t\t\t}\n\t\t\t}\n\t\telse\n\t\t\trequestError = { message: `Unknown request kind \"${kind}\"` };\n\t\t\n\t\twssc.sendMessage(`${requestHeaders.response}-${id}`, requestError, result);\n\t\t\n\t};\n\t\n\t\n\tstatic handleConnection(this: InSiteWebSocketServer, wssc: InSiteWebSocketServerClient | WebSocket, request: http.IncomingMessage) {\n\t\tif (!(wssc instanceof InSiteWebSocketServerClient)) { /* Compatibility with Bun */\n\t\t\tObject.defineProperties(wssc, {\n\t\t\t\tisConnecting: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isConnecting\")!.get\n\t\t\t\t},\n\t\t\t\tisOpen: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isOpen\")!.get\n\t\t\t\t},\n\t\t\t\tisClosing: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isClosing\")!.get\n\t\t\t\t},\n\t\t\t\tisClosed: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isClosed\")!.get\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tconst { terminate } = wssc;\n\t\t\t\n\t\t\tObject.assign(wssc, {\n\t\t\t\tisWebSocketServerClient: true,\n\t\t\t\tisWebSocketServer: false,\n\t\t\t\tisWebSocket: false,\n\t\t\t\t[defibSymbol]: InSiteWebSocketServerClient.makeDefib.call(wssc as InSiteWebSocketServerClient),\n\t\t\t\tlatency: 0,\n\t\t\t\t[heartbeatIntervalSymbol]: InSiteWebSocketServerClient.makeHeartbeatInterval.call(wssc as InSiteWebSocketServerClient),\n\t\t\t\tsendMessage: InSiteWebSocketServerClient.prototype.sendMessage,\n\t\t\t\tsendRequest: InSiteWebSocketServerClient.prototype.sendRequest,\n\t\t\t\tterminate() { /* Workaround Bun's WebSocket#terminate bug */\n\t\t\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\tterminate.call(wssc);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\tObject.assign(wssc, {\n\t\t\twss: this,\n\t\t\tuserAgent: request.headers[\"user-agent\"] ?? \"\",\n\t\t\tremoteAddress: request.headers[\"x-real-ip\"] ?? request.headers[\"x-forwarded-for\"] ?? \"\"\n\t\t});\n\t\t\n\t\t(wssc as InSiteWebSocketServerClient)[defibSymbol]();\n\t\t\n\t\twssc.on(\"message\", InSiteWebSocketServer.handleClientMessage as CompatibleListener);\n\t\twssc.on(\"error\", InSiteWebSocketServer.handleClientError as CompatibleListener);\n\t\twssc.on(\"close\", InSiteWebSocketServer.handleClientClose as CompatibleListener);\n\t\t\n\t\tthis.emit(\"client-connect\", wssc, request);\n\t\t\n\t}\n\t\n\t\n\tstatic handleClientMessage(this: InSiteWebSocketServerClient, data: WebSocket.RawData) {\n\t\tconst message = data.toString();\n\t\t\n\t\tthis[defibSymbol]();\n\t\t\n\t\tif (message)\n\t\t\ttry {\n\t\t\t\tconst [ kind, ...rest ] = JSON.parse(message);\n\t\t\t\t\n\t\t\t\tthis.emit(`message:${kind}`, ...rest);\n\t\t\t\tthis.wss.emit(\"client-message\", this, kind, ...rest);\n\t\t\t\tthis.wss.emit(`client-message:${kind}`, this, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tInSiteWebSocketServer.handleClientError.call(this, error as Error);\n\t\t\t}\n\t\telse if (this[pingTsSymbol]) {\n\t\t\tthis.latency = Date.now() - this[pingTsSymbol];\n\t\t\tdelete this[pingTsSymbol];\n\t\t}\n\t\t\n\t}\n\t\n\tstatic handleClientError(this: InSiteWebSocketServerClient, error: Error | Event | undefined) {\n\t\tif (error instanceof Event)\n\t\t\terror = undefined;\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\tconsole.error(\"WebSocketServer Client error\", error);\n\t\t\n\t\tthis.wss.emit(\"client-error\", this, error);\n\t\t\n\t}\n\t\n\tstatic handleClientClose(this: InSiteWebSocketServerClient, ...args: unknown[]) {\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\tconsole.info(\"WebSocketServer Client closed\", ...args);\n\t\t\n\t\tthis[defibSymbol].clear();\n\t\tclearInterval(this[heartbeatIntervalSymbol]);\n\t\t\n\t\tthis.wss.emit(\"client-close\", this);\n\t\tthis.wss.emit(\"client-closed\", this);\n\t\t\n\t}\n\t\n}\n", "export const heartbeatInterval = 5_000;\nexport const heartbeatGap = 60_000;\n\nexport const requestHeaders = {\n\trequest: \"~r-q\",\n\tresponse: \"~r-s\"\n};\n\nexport type RequestListener = (...args: any[]) => any | Promise<any>;// eslint-disable-line @typescript-eslint/no-explicit-any\n", "export const heartbeatIntervalSymbol = Symbol(\"heartbeatInterval\");\nexport const defibSymbol = Symbol(\"defib\");\nexport const pingTsSymbol = Symbol(\"pingTs\");\n", "import { WebSocket } from \"ws\";\nimport { debounce, uid } from \"@nesvet/n\";\nimport { heartbeatGap, heartbeatInterval, requestHeaders } from \"../common\";\nimport { defibSymbol, heartbeatIntervalSymbol, pingTsSymbol } from \"./symbols\";\nimport { InSiteWebSocketServer } from \"./WebSocketServer\";\n\n\nexport class InSiteWebSocketServerClient extends WebSocket {\n\t\n\tget isConnecting() {\n\t\treturn this.readyState === this.CONNECTING;\n\t}\n\t\n\tget isOpen() {\n\t\treturn this.readyState === this.OPEN;\n\t}\n\t\n\tget isClosing() {\n\t\treturn this.readyState === this.CLOSING;\n\t}\n\t\n\tget isClosed() {\n\t\treturn this.readyState === this.CLOSED;\n\t}\n\t\n\treadonly isWebSocketServerClient = true;\n\treadonly isWebSocketServer = false;\n\treadonly isWebSocket = false;\n\t\n\twss!: InSiteWebSocketServer;\n\t\n\tuserAgent = \"\";\n\t\n\tremoteAddress = \"\";\n\t\n\t[defibSymbol] = InSiteWebSocketServerClient.makeDefib.call(this);\n\t\n\tlatency = 0;\n\t\n\t[pingTsSymbol]?: number;\n\t\n\t[heartbeatIntervalSymbol] = InSiteWebSocketServerClient.makeHeartbeatInterval.call(this);\n\t\n\tsendMessage(...args: unknown[]) {\n\t\treturn this.send(JSON.stringify(args));\n\t}\n\t\n\tsendRequest(...args: unknown[]) {\n\t\t\n\t\tconst id = uid();\n\t\tconst eventName = `message:${requestHeaders.response}-${id}`;\n\t\t\n\t\tif (typeof args.at(-1) == \"function\") {\n\t\t\tthis.once(eventName, args.splice(-1, 1)[0] as () => void);\n\t\t\tthis.sendMessage(requestHeaders.request, id, ...args);\n\t\t\t\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t\n\t\t\tthis.once(eventName, (error, result) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tconst { message, ...restProps } = error;\n\t\t\t\t\treject(Object.assign(new Error(message), restProps));\n\t\t\t\t} else\n\t\t\t\t\tresolve(result);\n\t\t\t\t\n\t\t\t});\n\t\t\tthis.sendMessage(requestHeaders.request, id, ...args);\n\t\t\t\n\t\t});\n\t}\n\t\n\t\n\tstatic makeDefib(this: InSiteWebSocketServerClient) {\n\t\treturn debounce(() => this.terminate(), heartbeatInterval + heartbeatGap);\n\t}\n\t\n\tstatic makeHeartbeatInterval(this: InSiteWebSocketServerClient) {\n\t\treturn setInterval(() => {\n\t\t\t\n\t\t\tthis[pingTsSymbol] = Date.now();\n\t\t\tthis.send(\"\");\n\t\t\t\n\t\t}, heartbeatInterval);\n\t}\n\t\n}\n"],
5
- "mappings": "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",
6
- "names": ["http", "https", "WebSocketServer", "requestHeaders", "heartbeatIntervalSymbol", "defibSymbol", "pingTsSymbol", "WebSocket", "debounce", "uid", "InSiteWebSocketServerClient", "_InSiteWebSocketServerClient", "WebSocket", "defibSymbol", "pingTsSymbol", "heartbeatIntervalSymbol", "args", "id", "uid", "eventName", "requestHeaders", "resolve", "reject", "error", "result", "message", "restProps", "debounce", "InSiteWebSocketServer", "_InSiteWebSocketServer", "WebSocketServer", "options", "props", "handleListen", "ssl", "port", "server", "https", "http", "wssOptions", "InSiteWebSocketServerClient", "requestHeaders", "#handleRequest", "#requestListeners", "kind", "listener", "wssc", "id", "rest", "result", "requestError", "error", "message", "restProps", "request", "terminate", "defibSymbol", "heartbeatIntervalSymbol", "data", "pingTsSymbol", "args"]
4
+ "sourcesContent": ["import fs from \"node:fs\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport WebSocket, { WebSocketServer } from \"ws\";\nimport { requestHeaders, type RequestListener } from \"../common\";\nimport { defibSymbol, heartbeatIntervalSymbol, pingTsSymbol } from \"./symbols\";\nimport { CompatibleListener, Options } from \"./types\";\nimport { InSiteWebSocketServerClient } from \"./WebSocketServerClient\";\n\n\nexport class InSiteWebSocketServer extends WebSocketServer<typeof InSiteWebSocketServerClient> {\n\tconstructor(options: Options, props?: Record<string, unknown>, handleListen?: (() => void)) {\n\t\tconst {\n\t\t\tssl,\n\t\t\tport,\n\t\t\t...wssOptions\n\t\t} = options;\n\t\t\n\t\tif (ssl) {\n\t\t\tif (typeof ssl.cert == \"string\" && !/^-{3,}BEGIN/.test(ssl.cert))\n\t\t\t\ttry {\n\t\t\t\t\tssl.cert = fs.readFileSync(ssl.cert);\n\t\t\t\t} catch {}\n\t\t\tif (typeof ssl.key == \"string\" && !/^-{3,}BEGIN/.test(ssl.key))\n\t\t\t\ttry {\n\t\t\t\t\tssl.key = fs.readFileSync(ssl.key);\n\t\t\t\t} catch {}\n\t\t}\n\t\t\n\t\tconst {\n\t\t\tserver = ssl ? https.createServer({ ...ssl }) : http.createServer()\n\t\t} = wssOptions;\n\t\t\n\t\tsuper({\n\t\t\t...wssOptions,\n\t\t\tserver,\n\t\t\tWebSocket: InSiteWebSocketServerClient\n\t\t});\n\t\t\n\t\tthis.port = typeof port == \"string\" ? Number.parseInt(port) : port;\n\t\t\n\t\tif (props)\n\t\t\tif (typeof props == \"function\")\n\t\t\t\thandleListen = props;\n\t\t\telse\n\t\t\t\tObject.assign(this, props);\n\t\t\n\t\tthis.on(\"connection\", InSiteWebSocketServer.handleConnection as CompatibleListener);\n\t\t\n\t\tthis.on(`client-message:${requestHeaders.request}`, this.#handleRequest);\n\t\t\n\t\tserver.listen(this.port, handleListen);\n\t\t\n\t}\n\t\n\treadonly isWebSocketServer = true;\n\treadonly isWebSocketServerClient = false;\n\treadonly isWebSocket = false;\n\t\n\treadonly port;\n\t\n\t#requestListeners = new Map<string, RequestListener>();\n\t\n\taddRequestListener(kind: string, listener: RequestListener) {\n\t\tthis.#requestListeners.set(kind, listener);\n\t\t\n\t\treturn this;\n\t}\n\t\n\tonRequest = this.addRequestListener;\n\t\n\tremoveRequestListener(kind: string) {\n\t\tthis.#requestListeners.delete(kind);\n\t\t\n\t\treturn this;\n\t}\n\t\n\toffRequest = this.removeRequestListener;\n\t\n\t#handleRequest = async (wssc: InSiteWebSocketServerClient, id: string, kind: string, ...rest: unknown[]) => {\n\t\tconst listener = this.#requestListeners.get(kind);\n\t\t\n\t\tlet result;\n\t\tlet requestError = null;\n\t\t\n\t\tif (listener)\n\t\t\ttry {\n\t\t\t\tresult = await listener.call(this, wssc, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\tconst { message, ...restProps } = error;\n\t\t\t\t\trequestError = { message, ...restProps };\n\t\t\t\t}\n\t\t\t}\n\t\telse\n\t\t\trequestError = { message: `Unknown request kind \"${kind}\"` };\n\t\t\n\t\twssc.sendMessage(`${requestHeaders.response}-${id}`, requestError, result);\n\t\t\n\t};\n\t\n\t\n\tstatic handleConnection(this: InSiteWebSocketServer, wssc: InSiteWebSocketServerClient | WebSocket, request: http.IncomingMessage) {\n\t\tif (!(wssc instanceof InSiteWebSocketServerClient)) { /* Compatibility with Bun */\n\t\t\tObject.defineProperties(wssc, {\n\t\t\t\tisConnecting: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isConnecting\")!.get\n\t\t\t\t},\n\t\t\t\tisOpen: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isOpen\")!.get\n\t\t\t\t},\n\t\t\t\tisClosing: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isClosing\")!.get\n\t\t\t\t},\n\t\t\t\tisClosed: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isClosed\")!.get\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tconst { terminate } = wssc;\n\t\t\t\n\t\t\tObject.assign(wssc, {\n\t\t\t\tisWebSocketServerClient: true,\n\t\t\t\tisWebSocketServer: false,\n\t\t\t\tisWebSocket: false,\n\t\t\t\t[defibSymbol]: InSiteWebSocketServerClient.makeDefib.call(wssc as InSiteWebSocketServerClient),\n\t\t\t\tlatency: 0,\n\t\t\t\t[heartbeatIntervalSymbol]: InSiteWebSocketServerClient.makeHeartbeatInterval.call(wssc as InSiteWebSocketServerClient),\n\t\t\t\tsendMessage: InSiteWebSocketServerClient.prototype.sendMessage,\n\t\t\t\tsendRequest: InSiteWebSocketServerClient.prototype.sendRequest,\n\t\t\t\tterminate() { /* Workaround Bun's WebSocket#terminate bug */\n\t\t\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\tterminate.call(wssc);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\tObject.assign(wssc, {\n\t\t\twss: this,\n\t\t\tuserAgent: request.headers[\"user-agent\"] ?? \"\",\n\t\t\tremoteAddress: request.headers[\"x-real-ip\"] ?? request.headers[\"x-forwarded-for\"] ?? \"\"\n\t\t});\n\t\t\n\t\t(wssc as InSiteWebSocketServerClient)[defibSymbol]();\n\t\t\n\t\twssc.on(\"message\", InSiteWebSocketServer.handleClientMessage as CompatibleListener);\n\t\twssc.on(\"error\", InSiteWebSocketServer.handleClientError as CompatibleListener);\n\t\twssc.on(\"close\", InSiteWebSocketServer.handleClientClose as CompatibleListener);\n\t\t\n\t\tthis.emit(\"client-connect\", wssc, request);\n\t\t\n\t}\n\t\n\t\n\tstatic handleClientMessage(this: InSiteWebSocketServerClient, data: WebSocket.RawData) {\n\t\tconst message = data.toString();\n\t\t\n\t\tthis[defibSymbol]();\n\t\t\n\t\tif (message)\n\t\t\ttry {\n\t\t\t\tconst [ kind, ...rest ] = JSON.parse(message);\n\t\t\t\t\n\t\t\t\tthis.emit(`message:${kind}`, ...rest);\n\t\t\t\tthis.wss.emit(\"client-message\", this, kind, ...rest);\n\t\t\t\tthis.wss.emit(`client-message:${kind}`, this, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tInSiteWebSocketServer.handleClientError.call(this, error as Error);\n\t\t\t}\n\t\telse if (this[pingTsSymbol]) {\n\t\t\tthis.latency = Date.now() - this[pingTsSymbol];\n\t\t\tdelete this[pingTsSymbol];\n\t\t}\n\t\t\n\t}\n\t\n\tstatic handleClientError(this: InSiteWebSocketServerClient, error: Error | Event | undefined) {\n\t\tif (error instanceof Event)\n\t\t\terror = undefined;\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\tconsole.error(\"WebSocketServer Client error\", error);\n\t\t\n\t\tthis.wss.emit(\"client-error\", this, error);\n\t\t\n\t}\n\t\n\tstatic handleClientClose(this: InSiteWebSocketServerClient, ...args: unknown[]) {\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\tconsole.info(\"WebSocketServer Client closed\", ...args);\n\t\t\n\t\tthis[defibSymbol].clear();\n\t\tclearInterval(this[heartbeatIntervalSymbol]);\n\t\t\n\t\tthis.wss.emit(\"client-close\", this);\n\t\tthis.wss.emit(\"client-closed\", this);\n\t\t\n\t}\n\t\n}\n", "export const heartbeatInterval = 5_000;\nexport const heartbeatGap = 60_000;\n\nexport const requestHeaders = {\n\trequest: \"~r-q\",\n\tresponse: \"~r-s\"\n};\n\nexport type RequestListener = (...args: any[]) => any | Promise<any>;// eslint-disable-line @typescript-eslint/no-explicit-any\n", "export const heartbeatIntervalSymbol = Symbol(\"heartbeatInterval\");\nexport const defibSymbol = Symbol(\"defib\");\nexport const pingTsSymbol = Symbol(\"pingTs\");\n", "import { WebSocket } from \"ws\";\nimport { debounce, uid } from \"@nesvet/n\";\nimport { heartbeatGap, heartbeatInterval, requestHeaders } from \"../common\";\nimport { defibSymbol, heartbeatIntervalSymbol, pingTsSymbol } from \"./symbols\";\nimport { InSiteWebSocketServer } from \"./WebSocketServer\";\n\n\nexport class InSiteWebSocketServerClient extends WebSocket {\n\t\n\tget isConnecting() {\n\t\treturn this.readyState === this.CONNECTING;\n\t}\n\t\n\tget isOpen() {\n\t\treturn this.readyState === this.OPEN;\n\t}\n\t\n\tget isClosing() {\n\t\treturn this.readyState === this.CLOSING;\n\t}\n\t\n\tget isClosed() {\n\t\treturn this.readyState === this.CLOSED;\n\t}\n\t\n\treadonly isWebSocketServerClient = true;\n\treadonly isWebSocketServer = false;\n\treadonly isWebSocket = false;\n\t\n\twss!: InSiteWebSocketServer;\n\t\n\tuserAgent = \"\";\n\t\n\tremoteAddress = \"\";\n\t\n\t[defibSymbol] = InSiteWebSocketServerClient.makeDefib.call(this);\n\t\n\tlatency = 0;\n\t\n\t[pingTsSymbol]?: number;\n\t\n\t[heartbeatIntervalSymbol] = InSiteWebSocketServerClient.makeHeartbeatInterval.call(this);\n\t\n\tsendMessage(...args: unknown[]) {\n\t\treturn this.send(JSON.stringify(args));\n\t}\n\t\n\tsendRequest(...args: unknown[]) {\n\t\t\n\t\tconst id = uid();\n\t\tconst eventName = `message:${requestHeaders.response}-${id}`;\n\t\t\n\t\tif (typeof args.at(-1) == \"function\") {\n\t\t\tthis.once(eventName, args.splice(-1, 1)[0] as () => void);\n\t\t\tthis.sendMessage(requestHeaders.request, id, ...args);\n\t\t\t\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t\n\t\t\tthis.once(eventName, (error, result) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tconst { message, ...restProps } = error;\n\t\t\t\t\treject(Object.assign(new Error(message), restProps));\n\t\t\t\t} else\n\t\t\t\t\tresolve(result);\n\t\t\t\t\n\t\t\t});\n\t\t\tthis.sendMessage(requestHeaders.request, id, ...args);\n\t\t\t\n\t\t});\n\t}\n\t\n\t\n\tstatic makeDefib(this: InSiteWebSocketServerClient) {\n\t\treturn debounce(() => this.terminate(), heartbeatInterval + heartbeatGap);\n\t}\n\t\n\tstatic makeHeartbeatInterval(this: InSiteWebSocketServerClient) {\n\t\treturn setInterval(() => {\n\t\t\t\n\t\t\tthis[pingTsSymbol] = Date.now();\n\t\t\tthis.send(\"\");\n\t\t\t\n\t\t}, heartbeatInterval);\n\t}\n\t\n}\n"],
5
+ "mappings": "AAAA,OAAOA,MAAQ,UACf,OAAOC,MAAU,YACjB,OAAOC,MAAW,aAClB,OAAoB,mBAAAC,MAAuB,KCApC,IAAMC,EAAiB,CAC7B,QAAS,OACT,SAAU,MACX,ECNO,IAAMC,EAA0B,OAAO,mBAAmB,EACpDC,EAAc,OAAO,OAAO,EAC5BC,EAAe,OAAO,QAAQ,ECF3C,OAAS,aAAAC,MAAiB,KAC1B,OAAS,YAAAC,EAAU,OAAAC,MAAW,YAMvB,IAAMC,EAAN,MAAMC,UAAoCC,CAAU,CAE1D,IAAI,cAAe,CAClB,OAAO,KAAK,aAAe,KAAK,UACjC,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,aAAe,KAAK,IACjC,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,aAAe,KAAK,OACjC,CAEA,IAAI,UAAW,CACd,OAAO,KAAK,aAAe,KAAK,MACjC,CAES,wBAA0B,GAC1B,kBAAoB,GACpB,YAAc,GAEvB,IAEA,UAAY,GAEZ,cAAgB,GAEhB,CAACC,CAAW,EAAIF,EAA4B,UAAU,KAAK,IAAI,EAE/D,QAAU,EAEV,CAACG,CAAY,EAEb,CAACC,CAAuB,EAAIJ,EAA4B,sBAAsB,KAAK,IAAI,EAEvF,eAAeK,EAAiB,CAC/B,OAAO,KAAK,KAAK,KAAK,UAAUA,CAAI,CAAC,CACtC,CAEA,eAAeA,EAAiB,CAE/B,IAAMC,EAAKC,EAAI,EACTC,EAAY,WAAWC,EAAe,QAAQ,IAAIH,CAAE,GAE1D,OAAI,OAAOD,EAAK,GAAG,EAAE,GAAK,YACzB,KAAK,KAAKG,EAAWH,EAAK,OAAO,GAAI,CAAC,EAAE,CAAC,CAAe,EACxD,KAAK,YAAYI,EAAe,QAASH,EAAI,GAAGD,CAAI,EAE7C,MAGD,IAAI,QAAQ,CAACK,EAASC,IAAW,CAEvC,KAAK,KAAKH,EAAW,CAACI,EAAOC,IAAW,CACvC,GAAID,EAAO,CACV,GAAM,CAAE,QAAAE,EAAS,GAAGC,CAAU,EAAIH,EAClCD,EAAO,OAAO,OAAO,IAAI,MAAMG,CAAO,EAAGC,CAAS,CAAC,CACpD,MACCL,EAAQG,CAAM,CAEhB,CAAC,EACD,KAAK,YAAYJ,EAAe,QAASH,EAAI,GAAGD,CAAI,CAErD,CAAC,CACF,CAGA,OAAO,WAA6C,CACnD,OAAOW,EAAS,IAAM,KAAK,UAAU,EAAG,IAAgC,CACzE,CAEA,OAAO,uBAAyD,CAC/D,OAAO,YAAY,IAAM,CAExB,KAAKb,CAAY,EAAI,KAAK,IAAI,EAC9B,KAAK,KAAK,EAAE,CAEb,EAAG,GAAiB,CACrB,CAED,EH9EO,IAAMc,EAAN,MAAMC,UAA8BC,CAAoD,CAC9F,YAAYC,EAAkBC,EAAiCC,EAA6B,CAC3F,GAAM,CACL,IAAAC,EACA,KAAAC,EACA,GAAGC,CACJ,EAAIL,EAEJ,GAAIG,EAAK,CACR,GAAI,OAAOA,EAAI,MAAQ,UAAY,CAAC,cAAc,KAAKA,EAAI,IAAI,EAC9D,GAAI,CACHA,EAAI,KAAOG,EAAG,aAAaH,EAAI,IAAI,CACpC,MAAQ,CAAC,CACV,GAAI,OAAOA,EAAI,KAAO,UAAY,CAAC,cAAc,KAAKA,EAAI,GAAG,EAC5D,GAAI,CACHA,EAAI,IAAMG,EAAG,aAAaH,EAAI,GAAG,CAClC,MAAQ,CAAC,CACX,CAEA,GAAM,CACL,OAAAI,EAASJ,EAAMK,EAAM,aAAa,CAAE,GAAGL,CAAI,CAAC,EAAIM,EAAK,aAAa,CACnE,EAAIJ,EAEJ,MAAM,CACL,GAAGA,EACH,OAAAE,EACA,UAAWG,CACZ,CAAC,EAED,KAAK,KAAO,OAAON,GAAQ,SAAW,OAAO,SAASA,CAAI,EAAIA,EAE1DH,IACC,OAAOA,GAAS,WACnBC,EAAeD,EAEf,OAAO,OAAO,KAAMA,CAAK,GAE3B,KAAK,GAAG,aAAcH,EAAsB,gBAAsC,EAElF,KAAK,GAAG,kBAAkBa,EAAe,OAAO,GAAI,KAAKC,EAAc,EAEvEL,EAAO,OAAO,KAAK,KAAML,CAAY,CAEtC,CAES,kBAAoB,GACpB,wBAA0B,GAC1B,YAAc,GAEd,KAETW,GAAoB,IAAI,IAExB,mBAAmBC,EAAcC,EAA2B,CAC3D,YAAKF,GAAkB,IAAIC,EAAMC,CAAQ,EAElC,IACR,CAEA,UAAY,KAAK,mBAEjB,sBAAsBD,EAAc,CACnC,YAAKD,GAAkB,OAAOC,CAAI,EAE3B,IACR,CAEA,WAAa,KAAK,sBAElBF,GAAiB,MAAOI,EAAmCC,EAAYH,KAAiBI,IAAoB,CAC3G,IAAMH,EAAW,KAAKF,GAAkB,IAAIC,CAAI,EAE5CK,EACAC,EAAe,KAEnB,GAAIL,EACH,GAAI,CACHI,EAAS,MAAMJ,EAAS,KAAK,KAAMC,EAAM,GAAGE,CAAI,CACjD,OAASG,EAAO,CACf,GAAIA,aAAiB,MAAO,CAC3B,GAAM,CAAE,QAAAC,EAAS,GAAGC,CAAU,EAAIF,EAClCD,EAAe,CAAE,QAAAE,EAAS,GAAGC,CAAU,CACxC,CACD,MAEAH,EAAe,CAAE,QAAS,yBAAyBN,CAAI,GAAI,EAE5DE,EAAK,YAAY,GAAGL,EAAe,QAAQ,IAAIM,CAAE,GAAIG,EAAcD,CAAM,CAE1E,EAGA,OAAO,iBAA8CH,EAA+CQ,EAA+B,CAClI,GAAI,EAAER,aAAgBN,GAA8B,CACnD,OAAO,iBAAiBM,EAAM,CAC7B,aAAc,CACb,IAAK,OAAO,yBAAyBN,EAA4B,UAAW,cAAc,EAAG,GAC9F,EACA,OAAQ,CACP,IAAK,OAAO,yBAAyBA,EAA4B,UAAW,QAAQ,EAAG,GACxF,EACA,UAAW,CACV,IAAK,OAAO,yBAAyBA,EAA4B,UAAW,WAAW,EAAG,GAC3F,EACA,SAAU,CACT,IAAK,OAAO,yBAAyBA,EAA4B,UAAW,UAAU,EAAG,GAC1F,CACD,CAAC,EAED,GAAM,CAAE,UAAAe,CAAU,EAAIT,EAEtB,OAAO,OAAOA,EAAM,CACnB,wBAAyB,GACzB,kBAAmB,GACnB,YAAa,GACb,CAACU,CAAW,EAAGhB,EAA4B,UAAU,KAAKM,CAAmC,EAC7F,QAAS,EACT,CAACW,CAAuB,EAAGjB,EAA4B,sBAAsB,KAAKM,CAAmC,EACrH,YAAaN,EAA4B,UAAU,YACnD,YAAaA,EAA4B,UAAU,YACnD,WAAY,CAEX,GAAI,CACHe,EAAU,KAAKT,CAAI,CACpB,OAASK,EAAO,CACf,QAAQ,MAAMA,CAAK,CACpB,CAED,CACD,CAAC,CACF,CAEA,OAAO,OAAOL,EAAM,CACnB,IAAK,KACL,UAAWQ,EAAQ,QAAQ,YAAY,GAAK,GAC5C,cAAeA,EAAQ,QAAQ,WAAW,GAAKA,EAAQ,QAAQ,iBAAiB,GAAK,EACtF,CAAC,EAEAR,EAAqCU,CAAW,EAAE,EAEnDV,EAAK,GAAG,UAAWlB,EAAsB,mBAAyC,EAClFkB,EAAK,GAAG,QAASlB,EAAsB,iBAAuC,EAC9EkB,EAAK,GAAG,QAASlB,EAAsB,iBAAuC,EAE9E,KAAK,KAAK,iBAAkBkB,EAAMQ,CAAO,CAE1C,CAGA,OAAO,oBAAuDI,EAAyB,CACtF,IAAMN,EAAUM,EAAK,SAAS,EAI9B,GAFA,KAAKF,CAAW,EAAE,EAEdJ,EACH,GAAI,CACH,GAAM,CAAER,EAAM,GAAGI,CAAK,EAAI,KAAK,MAAMI,CAAO,EAE5C,KAAK,KAAK,WAAWR,CAAI,GAAI,GAAGI,CAAI,EACpC,KAAK,IAAI,KAAK,iBAAkB,KAAMJ,EAAM,GAAGI,CAAI,EACnD,KAAK,IAAI,KAAK,kBAAkBJ,CAAI,GAAI,KAAM,GAAGI,CAAI,CACtD,OAASG,EAAO,CACfvB,EAAsB,kBAAkB,KAAK,KAAMuB,CAAc,CAClE,MACQ,KAAKQ,CAAY,IACzB,KAAK,QAAU,KAAK,IAAI,EAAI,KAAKA,CAAY,EAC7C,OAAO,KAAKA,CAAY,EAG1B,CAEA,OAAO,kBAAqDR,EAAkC,CACzFA,aAAiB,QACpBA,EAAQ,QAEL,QAAQ,IAAI,WAAa,eAC5B,QAAQ,MAAM,+BAAgCA,CAAK,EAEpD,KAAK,IAAI,KAAK,eAAgB,KAAMA,CAAK,CAE1C,CAEA,OAAO,qBAAwDS,EAAiB,CAE3E,QAAQ,IAAI,WAAa,eAC5B,QAAQ,KAAK,gCAAiC,GAAGA,CAAI,EAEtD,KAAKJ,CAAW,EAAE,MAAM,EACxB,cAAc,KAAKC,CAAuB,CAAC,EAE3C,KAAK,IAAI,KAAK,eAAgB,IAAI,EAClC,KAAK,IAAI,KAAK,gBAAiB,IAAI,CAEpC,CAED",
6
+ "names": ["fs", "http", "https", "WebSocketServer", "requestHeaders", "heartbeatIntervalSymbol", "defibSymbol", "pingTsSymbol", "WebSocket", "debounce", "uid", "InSiteWebSocketServerClient", "_InSiteWebSocketServerClient", "WebSocket", "defibSymbol", "pingTsSymbol", "heartbeatIntervalSymbol", "args", "id", "uid", "eventName", "requestHeaders", "resolve", "reject", "error", "result", "message", "restProps", "debounce", "InSiteWebSocketServer", "_InSiteWebSocketServer", "WebSocketServer", "options", "props", "handleListen", "ssl", "port", "wssOptions", "fs", "server", "https", "http", "InSiteWebSocketServerClient", "requestHeaders", "#handleRequest", "#requestListeners", "kind", "listener", "wssc", "id", "rest", "result", "requestError", "error", "message", "restProps", "request", "terminate", "defibSymbol", "heartbeatIntervalSymbol", "data", "pingTsSymbol", "args"]
7
7
  }
@@ -1,13 +1,10 @@
1
- import http from "node:http";
2
- import https from "node:https";
3
1
  import WebSocket from "ws";
4
2
  export type Options = {
3
+ port: number | string;
5
4
  ssl?: {
6
- cert: string;
7
- key: string;
5
+ cert: Buffer | string;
6
+ key: Buffer | string;
8
7
  };
9
- port: number;
10
- server?: http.Server | https.Server;
11
8
  } & WebSocket.ServerOptions;
12
9
  export type CompatibleListener = () => void;
13
10
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,SAAS,MAAM,IAAI,CAAC;AAG3B,MAAM,MAAM,OAAO,GAAG;IACrB,GAAG,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;CACpC,GAAG,SAAS,CAAC,aAAa,CAAC;AAE5B,MAAM,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAG3B,MAAM,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;QACtB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;KACrB,CAAC;CACF,GAAG,SAAS,CAAC,aAAa,CAAC;AAE5B,MAAM,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "insite-ws",
3
- "version": "2.0.9",
3
+ "version": "2.0.10",
4
4
  "description": "inSite WebSockets",
5
5
  "type": "module",
6
6
  "exports": {
@@ -25,7 +25,7 @@
25
25
  "author": "Eugene Nesvetaev <dev@nesvet.dev> (https://nesvet.dev/)",
26
26
  "license": "MIT",
27
27
  "dependencies": {
28
- "@nesvet/n": "^1.1.0",
28
+ "@nesvet/n": "^1.1.1",
29
29
  "eventemitter3": "^5.0.1",
30
30
  "ws": "^8.18.0"
31
31
  },