@resolveio/server-lib 20.12.17 → 20.12.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -24,8 +24,8 @@ var WebSocketManager = /** @class */ (function () {
24
24
  WebSocketManager.create = function (mainServer, maxMessageSize, messageDelay, chunkThresholdBytes, chunkSizeBytes) {
25
25
  if (maxMessageSize === void 0) { maxMessageSize = 20480; }
26
26
  if (messageDelay === void 0) { messageDelay = 25; }
27
- if (chunkThresholdBytes === void 0) { chunkThresholdBytes = 3 * 1024 * 1024; }
28
- if (chunkSizeBytes === void 0) { chunkSizeBytes = 4 * 1024 * 1024; }
27
+ if (chunkThresholdBytes === void 0) { chunkThresholdBytes = 512 * 1024; }
28
+ if (chunkSizeBytes === void 0) { chunkSizeBytes = 1024 * 1024; }
29
29
  var websocketManager = new WebSocketManager();
30
30
  websocketManager.initialize(mainServer, maxMessageSize, messageDelay, chunkThresholdBytes, chunkSizeBytes);
31
31
  return websocketManager;
@@ -82,7 +82,8 @@ var WebSocketManager = /** @class */ (function () {
82
82
  }
83
83
  };
84
84
  WebSocketManager.prototype.sendPackedBuffer = function (ws, messageId, hasError, packedData, encoding) {
85
- var _a, _b, _c;
85
+ var _a;
86
+ var _this = this;
86
87
  if (encoding === void 0) { encoding = 'msgpack'; }
87
88
  if (!ws || ws.readyState !== ws.OPEN || !packedData || !packedData.byteLength) {
88
89
  return;
@@ -108,16 +109,33 @@ var WebSocketManager = /** @class */ (function () {
108
109
  _a)
109
110
  };
110
111
  this.transmitBatch(ws, [startMessage], useBinary);
111
- for (var index = 0; index < totalChunks; index++) {
112
+ var sendChunk = function (index) {
113
+ var _a, _b;
114
+ if (!ws || ws.readyState !== ws.OPEN) {
115
+ return;
116
+ }
117
+ if (index >= totalChunks) {
118
+ var endMessage = {
119
+ messageId: messageId,
120
+ hasError: hasError,
121
+ data: (_a = {},
122
+ _a[_this._chunkMetaFlag] = true,
123
+ _a.chunkId = chunkId,
124
+ _a.chunkStatus = 'end',
125
+ _a)
126
+ };
127
+ _this.transmitBatch(ws, [endMessage], useBinary);
128
+ return;
129
+ }
112
130
  var start = index * chunkSize;
113
131
  var end = Math.min(packedData.byteLength, start + chunkSize);
114
132
  var slice = packedData.subarray(start, end);
115
- var payload = encoding === 'msgpack' ? slice : this.toBase64(slice);
133
+ var payload = encoding === 'msgpack' ? slice : _this.toBase64(slice);
116
134
  var chunkMessage = {
117
135
  messageId: messageId,
118
136
  hasError: hasError,
119
137
  data: (_b = {},
120
- _b[this._chunkMetaFlag] = true,
138
+ _b[_this._chunkMetaFlag] = true,
121
139
  _b.chunkId = chunkId,
122
140
  _b.chunkStatus = 'chunk',
123
141
  _b.chunkIndex = index,
@@ -125,18 +143,10 @@ var WebSocketManager = /** @class */ (function () {
125
143
  _b.encoding = encoding,
126
144
  _b)
127
145
  };
128
- this.transmitBatch(ws, [chunkMessage], useBinary);
129
- }
130
- var endMessage = {
131
- messageId: messageId,
132
- hasError: hasError,
133
- data: (_c = {},
134
- _c[this._chunkMetaFlag] = true,
135
- _c.chunkId = chunkId,
136
- _c.chunkStatus = 'end',
137
- _c)
146
+ _this.transmitBatch(ws, [chunkMessage], useBinary);
147
+ setImmediate(function () { return sendChunk(index + 1); });
138
148
  };
139
- this.transmitBatch(ws, [endMessage], useBinary);
149
+ setImmediate(function () { return sendChunk(0); });
140
150
  };
141
151
  WebSocketManager.prototype.flushMessages = function (ws) {
142
152
  var wsId = ws['id_socket'];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/managers/websocket.manager.ts"],"names":[],"mappings":"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","file":"websocket.manager.js","sourcesContent":["import { randomBytes } from 'crypto';\nimport { pack } from 'msgpackr';\nimport { WebSocket } from 'ws';\n\ninterface ServerResponseModel {\n\tmessageId: number;\n\thasError: boolean;\n\tdata: any;\n}\n\nexport class WebSocketManager {\n\tprivate _mainServer;\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\tprivate _chunkThresholdBytes: number;\n\tprivate _chunkSizeBytes: number;\n\tprivate readonly _chunkMetaFlag = '__chunked';\n\n\tconstructor() {}\n\t\n\tstatic create(mainServer, maxMessageSize: number = 20480, messageDelay: number = 25, chunkThresholdBytes: number = 3 * 1024 * 1024, chunkSizeBytes: number = 4 * 1024 * 1024) {\n\t\tconst websocketManager = new WebSocketManager();\n\t\twebsocketManager.initialize(mainServer, maxMessageSize, messageDelay, chunkThresholdBytes, chunkSizeBytes);\n\t\treturn websocketManager;\n\t}\n\n\tpublic initialize(mainServer, maxMessageSize: number = 20480, messageDelay: number = 25, chunkThresholdBytes: number = 3 * 1024 * 1024, chunkSizeBytes: number = 4 * 1024 * 1024) {\n\t\tthis._mainServer = mainServer;\n\t\tthis._maxMessageSize = maxMessageSize;\n\t\tthis._messageDelay = messageDelay;\n\t\tthis._chunkThresholdBytes = chunkThresholdBytes;\n\t\tthis._chunkSizeBytes = chunkSizeBytes;\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\tconst supportsBinary = ws['supportsBinary'] === true;\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\tconst chunkContext = this.prepareChunkContext(data, supportsBinary);\n\t\t\tif (chunkContext) {\n\t\t\t\tthis.flushMessages(ws);\n\t\t\t\tthis.sendChunkSequence(ws, data, chunkContext, supportsBinary);\n\t\t\t\treturn;\n\t\t\t}\n\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\tpublic sendPackedBuffer(ws: WebSocket, messageId: number, hasError: boolean, packedData: Uint8Array | Buffer, encoding: 'msgpack' | 'json' = 'msgpack'): void {\n\t\tif (!ws || ws.readyState !== ws.OPEN || !packedData || !packedData.byteLength) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst supportsBinary = ws['supportsBinary'] === true;\n\t\tconst useBinary = supportsBinary && encoding === 'msgpack';\n\t\tconst chunkId = this.generateChunkId();\n\t\tconst totalChunks = Math.max(1, Math.ceil(packedData.byteLength / this._chunkSizeBytes));\n\t\tconst chunkSize = this._chunkSizeBytes;\n\n\t\t// Flush any buffered messages so the chunk stream starts immediately.\n\t\tthis.flushMessages(ws);\n\n\t\tconst startMessage: ServerResponseModel = {\n\t\t\tmessageId: messageId,\n\t\t\thasError: hasError,\n\t\t\tdata: {\n\t\t\t\t[this._chunkMetaFlag]: true,\n\t\t\t\tchunkId: chunkId,\n\t\t\t\tchunkStatus: 'start',\n\t\t\t\ttotalChunks: totalChunks,\n\t\t\t\ttotalBytes: packedData.byteLength,\n\t\t\t\tchunkSize: chunkSize,\n\t\t\t\tencoding: encoding\n\t\t\t}\n\t\t};\n\n\t\tthis.transmitBatch(ws, [startMessage], useBinary);\n\n\t\tfor (let index = 0; index < totalChunks; index++) {\n\t\t\tconst start = index * chunkSize;\n\t\t\tconst end = Math.min(packedData.byteLength, start + chunkSize);\n\t\t\tconst slice = packedData.subarray(start, end);\n\t\t\tconst payload = encoding === 'msgpack' ? slice : this.toBase64(slice);\n\n\t\t\tconst chunkMessage: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: hasError,\n\t\t\t\tdata: {\n\t\t\t\t\t[this._chunkMetaFlag]: true,\n\t\t\t\t\tchunkId: chunkId,\n\t\t\t\t\tchunkStatus: 'chunk',\n\t\t\t\t\tchunkIndex: index,\n\t\t\t\t\tpayload: payload,\n\t\t\t\t\tencoding: encoding\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.transmitBatch(ws, [chunkMessage], useBinary);\n\t\t}\n\n\t\tconst endMessage: ServerResponseModel = {\n\t\t\tmessageId: messageId,\n\t\t\thasError: hasError,\n\t\t\tdata: {\n\t\t\t\t[this._chunkMetaFlag]: true,\n\t\t\t\tchunkId: chunkId,\n\t\t\t\tchunkStatus: 'end'\n\t\t\t}\n\t\t};\n\n\t\tthis.transmitBatch(ws, [endMessage], useBinary);\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\t\tconst supportsBinary = ws['supportsBinary'] === true;\n\n\t\tif (messages && messages.length > 0) {\n\t\t\t// Combine messages into one payload\n\t\t\tthis.transmitBatch(ws, messages, supportsBinary);\n\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 sendMessagesInChunksBinary(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 packedMessage = pack([message]);\n\t\t\tconst messageSize = packedMessage.byteLength;\n\n\t\t\tif (chunkSize + messageSize > this._maxMessageSize) {\n\t\t\t\tconst packedChunk = pack(chunk);\n\t\t\t\tws.send(packedChunk, (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\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\tif (chunk.length > 0) {\n\t\t\tconst packedChunk = pack(chunk);\n\t\t\tws.send(packedChunk, (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\tif (this._mainServer.getSubscriptionManager()) {\n\t\t\t// Handle send error, e.g., unsubscribe, close connection\n\t\t\tif (this._mainServer.getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'WebSocketManager', 'Unsub WS', ws['user'], ws['id_socket'], error);\n\t\t\t}\n\t\t\tthis._mainServer.getSubscriptionManager().unsubscribeAll(ws);\n\t\t\tthis.removeWebSocket(ws);\n\t\t}\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\n\tprivate prepareChunkContext(message: ServerResponseModel, supportsBinary: boolean): { buffer: Buffer, encoding: 'msgpack' | 'json' } | null {\n\t\tif (!message || message.hasError) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst data = message.data;\n\t\tif (data === undefined || data === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tif (supportsBinary) {\n\t\t\t\tconst packed = Buffer.from(<any>pack(data));\n\t\t\t\tif (packed.byteLength > this._chunkThresholdBytes) {\n\t\t\t\t\treturn { buffer: packed, encoding: 'msgpack' };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (err) {\n\t\t\t// Fall back to JSON chunking if msgpack encoding fails\n\t\t\tif (this._mainServer.getSubscriptionManager()?.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'WebSocketManager', 'Chunking pack failed, falling back to JSON', err?.message || err);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst jsonString = JSON.stringify(data);\n\t\t\tconst jsonBytes = Buffer.byteLength(jsonString, 'utf8');\n\n\t\t\tif (jsonBytes > this._chunkThresholdBytes) {\n\t\t\t\treturn { buffer: Buffer.from(jsonString, 'utf8'), encoding: 'json' };\n\t\t\t}\n\t\t}\n\t\tcatch {\n\t\t\t// Ignore JSON stringify errors; fallback to normal send\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate sendChunkSequence(ws: WebSocket, original: ServerResponseModel, chunkContext: { buffer: Buffer, encoding: 'msgpack' | 'json' }, supportsBinary: boolean): void {\n\t\tconst chunkId = this.generateChunkId();\n\t\tconst totalChunks = Math.ceil(chunkContext.buffer.byteLength / this._chunkSizeBytes);\n\t\tconst useBinary = supportsBinary && chunkContext.encoding === 'msgpack';\n\n\t\tconst startMessage: ServerResponseModel = {\n\t\t\tmessageId: original.messageId,\n\t\t\thasError: original.hasError,\n\t\t\tdata: {\n\t\t\t\t[this._chunkMetaFlag]: true,\n\t\t\t\tchunkId: chunkId,\n\t\t\t\tchunkStatus: 'start',\n\t\t\t\ttotalChunks: totalChunks,\n\t\t\t\ttotalBytes: chunkContext.buffer.byteLength,\n\t\t\t\tchunkSize: this._chunkSizeBytes,\n\t\t\t\tencoding: chunkContext.encoding\n\t\t\t}\n\t\t};\n\n\t\tthis.transmitBatch(ws, [startMessage], useBinary);\n\n\t\tfor (let index = 0; index < totalChunks; index++) {\n\t\t\tconst start = index * this._chunkSizeBytes;\n\t\t\tconst end = Math.min(chunkContext.buffer.byteLength, start + this._chunkSizeBytes);\n\t\t\tconst slice = chunkContext.buffer.subarray(start, end);\n\t\t\tconst chunkPayload = chunkContext.encoding === 'msgpack' ? slice : slice.toString('base64');\n\n\t\t\tconst chunkMessage: ServerResponseModel = {\n\t\t\t\tmessageId: original.messageId,\n\t\t\t\thasError: original.hasError,\n\t\t\t\tdata: {\n\t\t\t\t\t[this._chunkMetaFlag]: true,\n\t\t\t\t\tchunkId: chunkId,\n\t\t\t\t\tchunkStatus: 'chunk',\n\t\t\t\t\tchunkIndex: index,\n\t\t\t\t\tpayload: chunkPayload,\n\t\t\t\t\tencoding: chunkContext.encoding\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.transmitBatch(ws, [chunkMessage], useBinary);\n\t\t}\n\n\t\tconst endMessage: ServerResponseModel = {\n\t\t\tmessageId: original.messageId,\n\t\t\thasError: original.hasError,\n\t\t\tdata: {\n\t\t\t\t[this._chunkMetaFlag]: true,\n\t\t\t\tchunkId: chunkId,\n\t\t\t\tchunkStatus: 'end'\n\t\t\t}\n\t\t};\n\n\t\tthis.transmitBatch(ws, [endMessage], useBinary);\n\t}\n\n\tprivate transmitBatch(ws: WebSocket, batch: ServerResponseModel[], useBinary: boolean): void {\n\t\tif (!batch || !batch.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isChunkEnvelope = batch.length === 1 && batch[0]?.data && typeof batch[0].data === 'object' && batch[0].data[this._chunkMetaFlag];\n\n\t\tif (useBinary) {\n\t\t\tconst packedData = pack(batch);\n\t\t\tconst dataSize = packedData.byteLength;\n\n\t\t\tif (!isChunkEnvelope && dataSize > this._maxMessageSize) {\n\t\t\t\tthis.sendMessagesInChunksBinary(ws, batch);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tws.send(packedData, (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\t\t}\n\t\telse {\n\t\t\tconst combinedData = JSON.stringify(batch);\n\t\t\tconst dataSize = Buffer.byteLength(combinedData, 'utf8');\n\n\t\t\tif (!isChunkEnvelope && dataSize > this._maxMessageSize) {\n\t\t\t\tthis.sendMessagesInChunks(ws, batch);\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\t\t}\n\t}\n\n\tprivate generateChunkId(): string {\n\t\treturn randomBytes(8).toString('hex');\n\t}\n\n\tprivate toBase64(data: Uint8Array | Buffer): string {\n\t\tif (Buffer.isBuffer(data)) {\n\t\t\treturn data.toString('base64');\n\t\t}\n\n\t\treturn Buffer.from(data).toString('base64');\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../src/managers/websocket.manager.ts"],"names":[],"mappings":"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","file":"websocket.manager.js","sourcesContent":["import { randomBytes } from 'crypto';\nimport { pack } from 'msgpackr';\nimport { WebSocket } from 'ws';\n\ninterface ServerResponseModel {\n\tmessageId: number;\n\thasError: boolean;\n\tdata: any;\n}\n\nexport class WebSocketManager {\n\tprivate _mainServer;\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\tprivate _chunkThresholdBytes: number;\n\tprivate _chunkSizeBytes: number;\n\tprivate readonly _chunkMetaFlag = '__chunked';\n\n\tconstructor() {}\n\t\n\tstatic create(mainServer, maxMessageSize: number = 20480, messageDelay: number = 25, chunkThresholdBytes: number = 512 * 1024, chunkSizeBytes: number = 1024 * 1024) {\n\t\tconst websocketManager = new WebSocketManager();\n\t\twebsocketManager.initialize(mainServer, maxMessageSize, messageDelay, chunkThresholdBytes, chunkSizeBytes);\n\t\treturn websocketManager;\n\t}\n\n\tpublic initialize(mainServer, maxMessageSize: number = 20480, messageDelay: number = 25, chunkThresholdBytes: number = 3 * 1024 * 1024, chunkSizeBytes: number = 4 * 1024 * 1024) {\n\t\tthis._mainServer = mainServer;\n\t\tthis._maxMessageSize = maxMessageSize;\n\t\tthis._messageDelay = messageDelay;\n\t\tthis._chunkThresholdBytes = chunkThresholdBytes;\n\t\tthis._chunkSizeBytes = chunkSizeBytes;\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\tconst supportsBinary = ws['supportsBinary'] === true;\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\tconst chunkContext = this.prepareChunkContext(data, supportsBinary);\n\t\t\tif (chunkContext) {\n\t\t\t\tthis.flushMessages(ws);\n\t\t\t\tthis.sendChunkSequence(ws, data, chunkContext, supportsBinary);\n\t\t\t\treturn;\n\t\t\t}\n\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\tpublic sendPackedBuffer(ws: WebSocket, messageId: number, hasError: boolean, packedData: Uint8Array | Buffer, encoding: 'msgpack' | 'json' = 'msgpack'): void {\n\t\tif (!ws || ws.readyState !== ws.OPEN || !packedData || !packedData.byteLength) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst supportsBinary = ws['supportsBinary'] === true;\n\t\tconst useBinary = supportsBinary && encoding === 'msgpack';\n\t\tconst chunkId = this.generateChunkId();\n\t\tconst totalChunks = Math.max(1, Math.ceil(packedData.byteLength / this._chunkSizeBytes));\n\t\tconst chunkSize = this._chunkSizeBytes;\n\n\t\t// Flush any buffered messages so the chunk stream starts immediately.\n\t\tthis.flushMessages(ws);\n\n\t\tconst startMessage: ServerResponseModel = {\n\t\t\tmessageId: messageId,\n\t\t\thasError: hasError,\n\t\t\tdata: {\n\t\t\t\t[this._chunkMetaFlag]: true,\n\t\t\t\tchunkId: chunkId,\n\t\t\t\tchunkStatus: 'start',\n\t\t\t\ttotalChunks: totalChunks,\n\t\t\t\ttotalBytes: packedData.byteLength,\n\t\t\t\tchunkSize: chunkSize,\n\t\t\t\tencoding: encoding\n\t\t\t}\n\t\t};\n\n\t\tthis.transmitBatch(ws, [startMessage], useBinary);\n\n\t\tconst sendChunk = (index: number) => {\n\t\t\tif (!ws || ws.readyState !== ws.OPEN) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (index >= totalChunks) {\n\t\t\t\tconst endMessage: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: hasError,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\t[this._chunkMetaFlag]: true,\n\t\t\t\t\t\tchunkId: chunkId,\n\t\t\t\t\t\tchunkStatus: 'end'\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tthis.transmitBatch(ws, [endMessage], useBinary);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst start = index * chunkSize;\n\t\t\tconst end = Math.min(packedData.byteLength, start + chunkSize);\n\t\t\tconst slice = packedData.subarray(start, end);\n\t\t\tconst payload = encoding === 'msgpack' ? slice : this.toBase64(slice);\n\n\t\t\tconst chunkMessage: ServerResponseModel = {\n\t\t\t\tmessageId: messageId,\n\t\t\t\thasError: hasError,\n\t\t\t\tdata: {\n\t\t\t\t\t[this._chunkMetaFlag]: true,\n\t\t\t\t\tchunkId: chunkId,\n\t\t\t\t\tchunkStatus: 'chunk',\n\t\t\t\t\tchunkIndex: index,\n\t\t\t\t\tpayload: payload,\n\t\t\t\t\tencoding: encoding\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.transmitBatch(ws, [chunkMessage], useBinary);\n\n\t\t\tsetImmediate(() => sendChunk(index + 1));\n\t\t};\n\n\t\tsetImmediate(() => sendChunk(0));\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\t\tconst supportsBinary = ws['supportsBinary'] === true;\n\n\t\tif (messages && messages.length > 0) {\n\t\t\t// Combine messages into one payload\n\t\t\tthis.transmitBatch(ws, messages, supportsBinary);\n\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 sendMessagesInChunksBinary(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 packedMessage = pack([message]);\n\t\t\tconst messageSize = packedMessage.byteLength;\n\n\t\t\tif (chunkSize + messageSize > this._maxMessageSize) {\n\t\t\t\tconst packedChunk = pack(chunk);\n\t\t\t\tws.send(packedChunk, (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\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\tif (chunk.length > 0) {\n\t\t\tconst packedChunk = pack(chunk);\n\t\t\tws.send(packedChunk, (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\tif (this._mainServer.getSubscriptionManager()) {\n\t\t\t// Handle send error, e.g., unsubscribe, close connection\n\t\t\tif (this._mainServer.getSubscriptionManager().getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'WebSocketManager', 'Unsub WS', ws['user'], ws['id_socket'], error);\n\t\t\t}\n\t\t\tthis._mainServer.getSubscriptionManager().unsubscribeAll(ws);\n\t\t\tthis.removeWebSocket(ws);\n\t\t}\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\n\tprivate prepareChunkContext(message: ServerResponseModel, supportsBinary: boolean): { buffer: Buffer, encoding: 'msgpack' | 'json' } | null {\n\t\tif (!message || message.hasError) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst data = message.data;\n\t\tif (data === undefined || data === null) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tif (supportsBinary) {\n\t\t\t\tconst packed = Buffer.from(<any>pack(data));\n\t\t\t\tif (packed.byteLength > this._chunkThresholdBytes) {\n\t\t\t\t\treturn { buffer: packed, encoding: 'msgpack' };\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcatch (err) {\n\t\t\t// Fall back to JSON chunking if msgpack encoding fails\n\t\t\tif (this._mainServer.getSubscriptionManager()?.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'WebSocketManager', 'Chunking pack failed, falling back to JSON', err?.message || err);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst jsonString = JSON.stringify(data);\n\t\t\tconst jsonBytes = Buffer.byteLength(jsonString, 'utf8');\n\n\t\t\tif (jsonBytes > this._chunkThresholdBytes) {\n\t\t\t\treturn { buffer: Buffer.from(jsonString, 'utf8'), encoding: 'json' };\n\t\t\t}\n\t\t}\n\t\tcatch {\n\t\t\t// Ignore JSON stringify errors; fallback to normal send\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate sendChunkSequence(ws: WebSocket, original: ServerResponseModel, chunkContext: { buffer: Buffer, encoding: 'msgpack' | 'json' }, supportsBinary: boolean): void {\n\t\tconst chunkId = this.generateChunkId();\n\t\tconst totalChunks = Math.ceil(chunkContext.buffer.byteLength / this._chunkSizeBytes);\n\t\tconst useBinary = supportsBinary && chunkContext.encoding === 'msgpack';\n\n\t\tconst startMessage: ServerResponseModel = {\n\t\t\tmessageId: original.messageId,\n\t\t\thasError: original.hasError,\n\t\t\tdata: {\n\t\t\t\t[this._chunkMetaFlag]: true,\n\t\t\t\tchunkId: chunkId,\n\t\t\t\tchunkStatus: 'start',\n\t\t\t\ttotalChunks: totalChunks,\n\t\t\t\ttotalBytes: chunkContext.buffer.byteLength,\n\t\t\t\tchunkSize: this._chunkSizeBytes,\n\t\t\t\tencoding: chunkContext.encoding\n\t\t\t}\n\t\t};\n\n\t\tthis.transmitBatch(ws, [startMessage], useBinary);\n\n\t\tfor (let index = 0; index < totalChunks; index++) {\n\t\t\tconst start = index * this._chunkSizeBytes;\n\t\t\tconst end = Math.min(chunkContext.buffer.byteLength, start + this._chunkSizeBytes);\n\t\t\tconst slice = chunkContext.buffer.subarray(start, end);\n\t\t\tconst chunkPayload = chunkContext.encoding === 'msgpack' ? slice : slice.toString('base64');\n\n\t\t\tconst chunkMessage: ServerResponseModel = {\n\t\t\t\tmessageId: original.messageId,\n\t\t\t\thasError: original.hasError,\n\t\t\t\tdata: {\n\t\t\t\t\t[this._chunkMetaFlag]: true,\n\t\t\t\t\tchunkId: chunkId,\n\t\t\t\t\tchunkStatus: 'chunk',\n\t\t\t\t\tchunkIndex: index,\n\t\t\t\t\tpayload: chunkPayload,\n\t\t\t\t\tencoding: chunkContext.encoding\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.transmitBatch(ws, [chunkMessage], useBinary);\n\t\t}\n\n\t\tconst endMessage: ServerResponseModel = {\n\t\t\tmessageId: original.messageId,\n\t\t\thasError: original.hasError,\n\t\t\tdata: {\n\t\t\t\t[this._chunkMetaFlag]: true,\n\t\t\t\tchunkId: chunkId,\n\t\t\t\tchunkStatus: 'end'\n\t\t\t}\n\t\t};\n\n\t\tthis.transmitBatch(ws, [endMessage], useBinary);\n\t}\n\n\tprivate transmitBatch(ws: WebSocket, batch: ServerResponseModel[], useBinary: boolean): void {\n\t\tif (!batch || !batch.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isChunkEnvelope = batch.length === 1 && batch[0]?.data && typeof batch[0].data === 'object' && batch[0].data[this._chunkMetaFlag];\n\n\t\tif (useBinary) {\n\t\t\tconst packedData = pack(batch);\n\t\t\tconst dataSize = packedData.byteLength;\n\n\t\t\tif (!isChunkEnvelope && dataSize > this._maxMessageSize) {\n\t\t\t\tthis.sendMessagesInChunksBinary(ws, batch);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tws.send(packedData, (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\t\t}\n\t\telse {\n\t\t\tconst combinedData = JSON.stringify(batch);\n\t\t\tconst dataSize = Buffer.byteLength(combinedData, 'utf8');\n\n\t\t\tif (!isChunkEnvelope && dataSize > this._maxMessageSize) {\n\t\t\t\tthis.sendMessagesInChunks(ws, batch);\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\t\t}\n\t}\n\n\tprivate generateChunkId(): string {\n\t\treturn randomBytes(8).toString('hex');\n\t}\n\n\tprivate toBase64(data: Uint8Array | Buffer): string {\n\t\tif (Buffer.isBuffer(data)) {\n\t\t\treturn data.toString('base64');\n\t\t}\n\n\t\treturn Buffer.from(data).toString('base64');\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolveio/server-lib",
3
- "version": "20.12.17",
3
+ "version": "20.12.18",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "package": "./build_package.sh",