@resolveio/server-lib 20.4.0 → 20.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.WebSocketManager=void 0;var WebSocketManager=function(){function WebSocketManager(e,t,s){void 0===t&&(t=20480),void 0===s&&(s=
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.WebSocketManager=void 0;var WebSocketManager=function(){function WebSocketManager(e,t,s){void 0===t&&(t=20480),void 0===s&&(s=25),this._messageBuffers=new Map,this._batchingTimers=new Map,this._webSockets=new Map,this._mainServer=e,this._maxMessageSize=t,this._messageDelay=s}return WebSocketManager.prototype.addWebSocket=function(e){var t=e.id_socket;this._webSockets.set(t,e)},WebSocketManager.prototype.removeWebSocket=function(e){var t=e.id_socket;this._webSockets.delete(t),this.closeConnection(e)},WebSocketManager.prototype.getWebSocket=function(e){return this._webSockets.get(e)},WebSocketManager.prototype.send=function(e,t){var s=this,n=e.id_socket;this._messageBuffers.has(n)||this._messageBuffers.set(n,[]),"string"==typeof t?this._messageBuffers.get(n).push({messageId:null,hasError:!1,data:t}):this._messageBuffers.get(n).push(t),this._batchingTimers.has(n)||(t=setTimeout(function(){s.flushMessages(e)},this._messageDelay),this._batchingTimers.set(n,t))},WebSocketManager.prototype.flushMessages=function(t){var e,s=this,n=t.id_socket,i=this._messageBuffers.get(n);i&&0<i.length&&(e=JSON.stringify(i),Buffer.byteLength(e,"utf8")>this._maxMessageSize?this.sendMessagesInChunks(t,i):t.send(e,function(e){e&&s.handleSendError(t,e)}),this._messageBuffers.delete(n),clearTimeout(this._batchingTimers.get(n)),this._batchingTimers.delete(n))},WebSocketManager.prototype.sendMessagesInChunks=function(t,e){for(var s=this,n=[],i=0,r=0,a=e;r<a.length;r++){var o=a[r],c=JSON.stringify([o]),c=Buffer.byteLength(c,"utf8");i+c>this._maxMessageSize?(t.send(JSON.stringify(n),function(e){e&&s.handleSendError(t,e)}),n=[o],i=c):(n.push(o),i+=c)}0<n.length&&t.send(JSON.stringify(n),function(e){e&&s.handleSendError(t,e)})},WebSocketManager.prototype.handleSendError=function(e,t){this._mainServer.getSubscriptionManager().getEnableDebug()&&console.log(new Date,"WebSocketManager","Unsub WS",e.user,e.id_socket,t),this._mainServer.getSubscriptionManager().unsubscribeAll(e),this.removeWebSocket(e)},WebSocketManager.prototype.closeConnection=function(e){e.close();var t=e.id_socket;this._messageBuffers.delete(t),this._batchingTimers.has(t)&&(clearTimeout(this._batchingTimers.get(t)),this._batchingTimers.delete(t)),process.nextTick(function(){[e.OPEN,e.CLOSING].includes(e.readyState)&&e.terminate()})},WebSocketManager}();exports.WebSocketManager=WebSocketManager;
|
|
2
2
|
//# sourceMappingURL=websocket.manager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/managers/websocket.manager.ts"],"names":["WebSocketManager","mainServer","maxMessageSize","messageDelay","this","_messageBuffers","Map","_batchingTimers","_webSockets","_mainServer","_maxMessageSize","_messageDelay","prototype","addWebSocket","ws","wsId","set","removeWebSocket","delete","closeConnection","getWebSocket","id_socket","get","send","data","_this","has","push","messageId","hasError","timer","setTimeout","flushMessages","combinedData","messages","length","JSON","stringify","Buffer","byteLength","sendMessagesInChunks","error","handleSendError","clearTimeout","chunk","chunkSize","_i","messages_1","message","messageData","messageSize","getSubscriptionManager","getEnableDebug","console","log","Date","unsubscribeAll","close","process","nextTick","OPEN","CLOSING","includes","readyState","terminate","exports"],"mappings":"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","file":"websocket.manager.js","sourcesContent":["import { WebSocket } from 'ws';\nimport { ResolveIOServer } from '../index';\nimport ResolveIOMainServer from '../server-app';\n\ninterface ServerResponseModel {\n\tmessageId: number;\n\thasError: boolean;\n\tdata: any;\n}\n\nexport class WebSocketManager {\n\tprivate _mainServer: ResolveIOMainServer;\n\tprivate _messageBuffers: Map<string, ServerResponseModel[]> = new Map();\n\tprivate _batchingTimers: Map<string, NodeJS.Timeout> = new Map();\n\tprivate _maxMessageSize: number;\n\tprivate _messageDelay: number;\n\tprivate _webSockets: Map<string, WebSocket> = new Map();\n\n\tconstructor(mainServer: ResolveIOMainServer, maxMessageSize: number = 20480, messageDelay: number =
|
|
1
|
+
{"version":3,"sources":["../../src/managers/websocket.manager.ts"],"names":["WebSocketManager","mainServer","maxMessageSize","messageDelay","this","_messageBuffers","Map","_batchingTimers","_webSockets","_mainServer","_maxMessageSize","_messageDelay","prototype","addWebSocket","ws","wsId","set","removeWebSocket","delete","closeConnection","getWebSocket","id_socket","get","send","data","_this","has","push","messageId","hasError","timer","setTimeout","flushMessages","combinedData","messages","length","JSON","stringify","Buffer","byteLength","sendMessagesInChunks","error","handleSendError","clearTimeout","chunk","chunkSize","_i","messages_1","message","messageData","messageSize","getSubscriptionManager","getEnableDebug","console","log","Date","unsubscribeAll","close","process","nextTick","OPEN","CLOSING","includes","readyState","terminate","exports"],"mappings":"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","file":"websocket.manager.js","sourcesContent":["import { WebSocket } from 'ws';\nimport { ResolveIOServer } from '../index';\nimport ResolveIOMainServer from '../server-app';\n\ninterface ServerResponseModel {\n\tmessageId: number;\n\thasError: boolean;\n\tdata: any;\n}\n\nexport class WebSocketManager {\n\tprivate _mainServer: ResolveIOMainServer;\n\tprivate _messageBuffers: Map<string, ServerResponseModel[]> = new Map();\n\tprivate _batchingTimers: Map<string, NodeJS.Timeout> = new Map();\n\tprivate _maxMessageSize: number;\n\tprivate _messageDelay: number;\n\tprivate _webSockets: Map<string, WebSocket> = new Map();\n\n\tconstructor(mainServer: ResolveIOMainServer, maxMessageSize: number = 20480, messageDelay: number = 25) {\n\t\tthis._mainServer = mainServer;\n\t\tthis._maxMessageSize = maxMessageSize;\n\t\tthis._messageDelay = messageDelay;\n\t}\n\n\tpublic addWebSocket(ws: WebSocket): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tthis._webSockets.set(wsId, ws);\n\t}\n\n\tpublic removeWebSocket(ws: WebSocket): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tthis._webSockets.delete(wsId);\n\t\tthis.closeConnection(ws);\n\t}\n\n\tpublic getWebSocket(id_socket: string): WebSocket | undefined {\n\t\treturn this._webSockets.get(id_socket);\n\t}\n\n\tpublic send(ws: WebSocket, data: ServerResponseModel | string): void {\n\t\tconst wsId = ws['id_socket'];\n\n\t\tif (!this._messageBuffers.has(wsId)) {\n\t\t\tthis._messageBuffers.set(wsId, []);\n\t\t}\n\n\t\tif (typeof data === 'string') {\n\t\t\t// Handle string messages like 'ping' or 'pong'\n\t\t\tthis._messageBuffers.get(wsId).push({ messageId: null, hasError: false, data: data });\n\t\t}\n\t\telse {\n\t\t\tthis._messageBuffers.get(wsId).push(data);\n\t\t}\n\n\t\tif (!this._batchingTimers.has(wsId)) {\n\t\t\t// Set a timer to send the batch after a short delay\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis.flushMessages(ws);\n\t\t\t}, this._messageDelay);\n\t\t\tthis._batchingTimers.set(wsId, timer);\n\t\t}\n\t}\n\n\tprivate flushMessages(ws: WebSocket): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tconst messages = this._messageBuffers.get(wsId);\n\n\t\tif (messages && messages.length > 0) {\n\t\t\t// Combine messages into one payload\n\t\t\tconst combinedData = JSON.stringify(messages);\n\t\t\tconst dataSize = Buffer.byteLength(combinedData, 'utf8');\n\n\t\t\tif (dataSize > this._maxMessageSize) {\n\t\t\t\t// Split messages to ensure each does not exceed max size\n\t\t\t\tthis.sendMessagesInChunks(ws, messages);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tws.send(combinedData, (error) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tthis.handleSendError(ws, error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Clear the buffer and timer\n\t\t\tthis._messageBuffers.delete(wsId);\n\t\t\tclearTimeout(this._batchingTimers.get(wsId));\n\t\t\tthis._batchingTimers.delete(wsId);\n\t\t}\n\t}\n\n\tprivate sendMessagesInChunks(ws: WebSocket, messages: ServerResponseModel[]): void {\n\t\tlet chunk: ServerResponseModel[] = [];\n\t\tlet chunkSize = 0;\n\n\t\tfor (const message of messages) {\n\t\t\tconst messageData = JSON.stringify([message]); // Wrap message in array for consistency\n\t\t\tconst messageSize = Buffer.byteLength(messageData, 'utf8');\n\n\t\t\tif (chunkSize + messageSize > this._maxMessageSize) {\n\t\t\t\t// Send current chunk\n\t\t\t\tws.send(JSON.stringify(chunk), (error) => {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tthis.handleSendError(ws, error);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Start new chunk\n\t\t\t\tchunk = [message];\n\t\t\t\tchunkSize = messageSize;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tchunk.push(message);\n\t\t\t\tchunkSize += messageSize;\n\t\t\t}\n\t\t}\n\n\t\t// Send any remaining messages\n\t\tif (chunk.length > 0) {\n\t\t\tws.send(JSON.stringify(chunk), (error) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tthis.handleSendError(ws, error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate handleSendError(ws: WebSocket, error: Error): void {\n\t\t// Handle send error, e.g., unsubscribe, close connection\n\t\tif (this._mainServer.getSubscriptionManager().getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'WebSocketManager', 'Unsub WS', ws['user'], ws['id_socket'], error);\n\t\t}\n\t\tthis._mainServer.getSubscriptionManager().unsubscribeAll(ws);\n\t\tthis.removeWebSocket(ws);\n\t}\n\n\tpublic closeConnection(ws: WebSocket): void {\n\t\tws.close();\n\t\tconst wsId = ws['id_socket'];\n\t\t// Clean up buffers and timers\n\t\tthis._messageBuffers.delete(wsId);\n\t\tif (this._batchingTimers.has(wsId)) {\n\t\t\tclearTimeout(this._batchingTimers.get(wsId));\n\t\t\tthis._batchingTimers.delete(wsId);\n\t\t}\n \n process.nextTick(() => {\n if ([ws.OPEN, ws.CLOSING].includes(<any>ws.readyState)) {\n // Socket still hangs, hard close\n ws.terminate();\n }\n });\n\t}\n}"]}
|