@resolveio/server-lib 22.1.17 → 22.1.19
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/managers/websocket.manager.d.ts +4 -0
- package/managers/websocket.manager.js +21 -0
- package/managers/websocket.manager.js.map +1 -1
- package/package.json +1 -1
- package/server-app.d.ts +33 -0
- package/server-app.js +1000 -293
- package/server-app.js.map +1 -1
|
@@ -50,8 +50,12 @@ export declare class WebSocketManager {
|
|
|
50
50
|
private getBufferedAmount;
|
|
51
51
|
private logWsSend;
|
|
52
52
|
addWebSocket(ws: WebSocket): void;
|
|
53
|
+
private isSocketActive;
|
|
53
54
|
removeWebSocket(ws: WebSocket): void;
|
|
54
55
|
getWebSocket(id_socket: string): WebSocket | undefined;
|
|
56
|
+
getAllWebSockets(): WebSocket[];
|
|
57
|
+
getActiveWebSocketCount(): number;
|
|
58
|
+
getUserWebSockets(id_user: string): WebSocket[];
|
|
55
59
|
send(ws: WebSocket, data: ServerResponseModel | string): void;
|
|
56
60
|
sendPackedBuffer(ws: WebSocket, messageId: number, hasError: boolean, packedData: Uint8Array | Buffer, encoding?: 'msgpack' | 'json', options?: PackedSendOptions): void;
|
|
57
61
|
private flushMessages;
|
|
@@ -258,6 +258,12 @@ var WebSocketManager = /** @class */ (function () {
|
|
|
258
258
|
var wsId = ws['id_socket'];
|
|
259
259
|
this._webSockets.set(wsId, ws);
|
|
260
260
|
};
|
|
261
|
+
WebSocketManager.prototype.isSocketActive = function (ws) {
|
|
262
|
+
if (!ws) {
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
return ws.readyState === ws_1.WebSocket.OPEN || ws.readyState === ws_1.WebSocket.CONNECTING;
|
|
266
|
+
};
|
|
261
267
|
WebSocketManager.prototype.removeWebSocket = function (ws) {
|
|
262
268
|
var wsId = ws['id_socket'];
|
|
263
269
|
this._webSockets.delete(wsId);
|
|
@@ -267,6 +273,21 @@ var WebSocketManager = /** @class */ (function () {
|
|
|
267
273
|
WebSocketManager.prototype.getWebSocket = function (id_socket) {
|
|
268
274
|
return this._webSockets.get(id_socket);
|
|
269
275
|
};
|
|
276
|
+
WebSocketManager.prototype.getAllWebSockets = function () {
|
|
277
|
+
return Array.from(this._webSockets.values());
|
|
278
|
+
};
|
|
279
|
+
WebSocketManager.prototype.getActiveWebSocketCount = function () {
|
|
280
|
+
var _this = this;
|
|
281
|
+
return this.getAllWebSockets().filter(function (ws) { return _this.isSocketActive(ws); }).length;
|
|
282
|
+
};
|
|
283
|
+
WebSocketManager.prototype.getUserWebSockets = function (id_user) {
|
|
284
|
+
var _this = this;
|
|
285
|
+
var targetUser = "".concat(id_user || '').trim();
|
|
286
|
+
if (!targetUser) {
|
|
287
|
+
return [];
|
|
288
|
+
}
|
|
289
|
+
return this.getAllWebSockets().filter(function (ws) { return _this.isSocketActive(ws) && "".concat((ws === null || ws === void 0 ? void 0 : ws['id_user']) || '').trim() === targetUser; });
|
|
290
|
+
};
|
|
270
291
|
WebSocketManager.prototype.send = function (ws, data) {
|
|
271
292
|
var _this = this;
|
|
272
293
|
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, unpack } from 'msgpackr';\nimport { TextDecoder } from 'util';\nimport { WebSocket } from 'ws';\n\ninterface ServerResponseModel {\n\tmessageId: number;\n\thasError: boolean;\n\tdata: any;\n}\n\ninterface PackedSendOptions {\n\tpassThrough?: boolean;\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\tprivate _chunkingEnabled: boolean;\n\tprivate readonly _textDecoder = new TextDecoder();\n\tprivate _wsSendDebug = false;\n\tprivate _wsSendLogThresholdMs = 2000;\n\tprivate _wsSendLogBytes = 2 * 1024 * 1024;\n\tprivate _wsSendLogBufferedBytes = 4 * 1024 * 1024;\n\tprivate _packedChunkMinBytes = 64 * 1024;\n\tprivate _sendQueues: Map<string, ServerResponseModel[][]> = new Map();\n\tprivate _sendQueueTimers: Map<string, NodeJS.Timeout> = new Map();\n\tprivate _sendThrottleMs = 0;\n\tprivate _sendBackpressureBytes = 0;\n\tprivate _sendMaxBatchesPerTick = 10;\n\tprivate _aiWorkerDebug = false;\n\tprivate _wsBackpressureLogAt: Map<string, number> = new Map();\n\tprivate _wsBackpressureLogCooldownMs = 2000;\n\n\tconstructor() {}\n\t\n\tstatic create(mainServer, maxMessageSize: number = 256 * 1024, 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 = this.parsePositiveInt(process.env.WS_MAX_MESSAGE_SIZE_BYTES, maxMessageSize);\n\t\tthis._messageDelay = messageDelay;\n\t\tthis._chunkingEnabled = this.parseBoolean(process.env.WS_CHUNKING_ENABLED, true);\n\t\tthis._chunkThresholdBytes = this.parsePositiveInt(process.env.WS_CHUNK_THRESHOLD_BYTES, chunkThresholdBytes);\n\t\tthis._chunkSizeBytes = this.parsePositiveInt(process.env.WS_CHUNK_SIZE_BYTES, chunkSizeBytes);\n\t\tthis._wsSendDebug = this.parseDebugFlag(process.env.WS_SEND_DEBUG);\n\t\tthis._aiWorkerDebug = this.parseDebugFlag(process.env.AI_ASSISTANT_WORKER_DEBUG);\n\t\tthis._wsSendLogThresholdMs = this.parsePositiveInt(process.env.WS_SEND_LOG_THRESHOLD_MS, this._wsSendLogThresholdMs);\n\t\tthis._wsSendLogBytes = this.parsePositiveInt(process.env.WS_SEND_LOG_BYTES, this._wsSendLogBytes);\n\t\tthis._wsSendLogBufferedBytes = this.parsePositiveInt(process.env.WS_SEND_LOG_BUFFERED_BYTES, this._wsSendLogBufferedBytes);\n\t\tconst packedChunkFallback = Math.min(this._chunkThresholdBytes, this._packedChunkMinBytes);\n\t\tconst packedChunkRaw = process.env.WS_PACKED_CHUNK_MIN_BYTES;\n\t\tthis._packedChunkMinBytes = packedChunkRaw === '0'\n\t\t\t? 0\n\t\t\t: this.parsePositiveInt(packedChunkRaw, packedChunkFallback);\n\t\tthis._sendThrottleMs = this.parsePositiveInt(process.env.WS_SEND_THROTTLE_MS, this._sendThrottleMs);\n\t\tconst backpressureRaw = process.env.WS_SEND_BACKPRESSURE_BYTES;\n\t\tif (backpressureRaw === '0') {\n\t\t\tthis._sendBackpressureBytes = 0;\n\t\t}\n\t\telse if (backpressureRaw === undefined || backpressureRaw === null || backpressureRaw === '') {\n\t\t\tthis._sendBackpressureBytes = this._wsSendLogBufferedBytes;\n\t\t}\n\t\telse {\n\t\t\tthis._sendBackpressureBytes = this.parsePositiveInt(backpressureRaw, this._sendBackpressureBytes);\n\t\t}\n\t\tthis._sendMaxBatchesPerTick = this.parsePositiveInt(process.env.WS_SEND_MAX_BATCHES_PER_TICK, this._sendMaxBatchesPerTick);\n\t}\n\n\tprivate parseDebugFlag(value: any): boolean {\n\t\tif (value === true) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (value === false || value === null || value === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (typeof value === 'number') {\n\t\t\treturn value === 1;\n\t\t}\n\n\t\tif (typeof value === 'string') {\n\t\t\tconst normalized = value.trim().toLowerCase();\n\t\t\treturn ['1', 'true', 'yes', 'y', 'on'].includes(normalized);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate parseBoolean(value: any, fallback: boolean): boolean {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn fallback;\n\t\t}\n\n\t\treturn this.parseDebugFlag(value);\n\t}\n\n\tprivate parsePositiveInt(value: any, fallback: number): number {\n\t\tconst parsed = parseInt(value ?? '', 10);\n\t\tif (Number.isNaN(parsed) || parsed <= 0) {\n\t\t\treturn fallback;\n\t\t}\n\t\treturn parsed;\n\t}\n\n\tprivate isBackpressured(ws: WebSocket): boolean {\n\t\tif (this._sendBackpressureBytes <= 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst buffered = this.getBufferedAmount(ws);\n\t\treturn buffered !== null && buffered >= this._sendBackpressureBytes;\n\t}\n\n\tprivate shouldQueueSend(ws: WebSocket): boolean {\n\t\treturn this._sendThrottleMs > 0 || this.isBackpressured(ws);\n\t}\n\n\tprivate maybeLogBackpressure(ws: WebSocket, batchSize: number): void {\n\t\tif (!this._aiWorkerDebug) {\n\t\t\treturn;\n\t\t}\n\t\tconst wsId = ws ? ws['id_socket'] : null;\n\t\tif (!wsId) {\n\t\t\treturn;\n\t\t}\n\t\tconst now = Date.now();\n\t\tconst last = this._wsBackpressureLogAt.get(wsId) || 0;\n\t\tif (now - last < this._wsBackpressureLogCooldownMs) {\n\t\t\treturn;\n\t\t}\n\t\tthis._wsBackpressureLogAt.set(wsId, now);\n\t\tconst bufferedAmount = this.getBufferedAmount(ws);\n\t\tconst queueDepth = this._sendQueues.get(wsId)?.length ?? 0;\n\t\tconst backpressured = this.isBackpressured(ws);\n\t\tconst reason = backpressured ? 'backpressure' : (this._sendThrottleMs > 0 ? 'throttle' : 'queued');\n\t\tconsole.warn(new Date(), '[AI Worker Debug] wsSendQueued', {\n\t\t\treason,\n\t\t\tid_ws: wsId,\n\t\t\tuser: ws ? ws['user'] : null,\n\t\t\tbatchSize,\n\t\t\tqueueDepth,\n\t\t\tbufferedAmount,\n\t\t\tbackpressureBytes: this._sendBackpressureBytes,\n\t\t\tsendThrottleMs: this._sendThrottleMs\n\t\t});\n\t}\n\n\tprivate getQueueDelayMs(ws: WebSocket): number {\n\t\tif (this._sendThrottleMs > 0) {\n\t\t\treturn this._sendThrottleMs;\n\t\t}\n\n\t\tif (this.isBackpressured(ws)) {\n\t\t\treturn 25;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\tprivate enqueueSend(ws: WebSocket, batch: ServerResponseModel[]): void {\n\t\tif (!batch || !batch.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst wsId = ws['id_socket'];\n\t\tlet queue = this._sendQueues.get(wsId);\n\t\tif (!queue) {\n\t\t\tqueue = [];\n\t\t\tthis._sendQueues.set(wsId, queue);\n\t\t}\n\n\t\tqueue.push(batch);\n\t\tthis.maybeLogBackpressure(ws, batch.length);\n\t\tthis.scheduleSendDrain(ws);\n\t}\n\n\tprivate scheduleSendDrain(ws: WebSocket): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tif (this._sendQueueTimers.has(wsId)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst delay = this.getQueueDelayMs(ws);\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis._sendQueueTimers.delete(wsId);\n\t\t\tthis.drainSendQueue(ws);\n\t\t}, delay);\n\n\t\tthis._sendQueueTimers.set(wsId, timer);\n\t}\n\n\tprivate drainSendQueue(ws: WebSocket): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tconst queue = this._sendQueues.get(wsId);\n\t\tif (!queue || !queue.length) {\n\t\t\tthis._sendQueues.delete(wsId);\n\t\t\treturn;\n\t\t}\n\n\t\tlet sent = 0;\n\t\twhile (queue.length > 0 && sent < this._sendMaxBatchesPerTick && !this.isBackpressured(ws)) {\n\t\t\tconst batch = queue.shift();\n\t\t\tif (batch && batch.length) {\n\t\t\t\tthis.transmitBatchNow(ws, batch);\n\t\t\t}\n\t\t\tsent += 1;\n\t\t}\n\n\t\tif (queue.length > 0) {\n\t\t\tthis.scheduleSendDrain(ws);\n\t\t}\n\t\telse {\n\t\t\tthis._sendQueues.delete(wsId);\n\t\t}\n\t}\n\n\tprivate scheduleNextChunk(ws: WebSocket, next: () => void): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tconst queueSize = this._sendQueues.get(wsId)?.length ?? 0;\n\t\tconst baseDelay = this.getQueueDelayMs(ws);\n\t\tconst delay = queueSize >= this._sendMaxBatchesPerTick ? Math.max(baseDelay, 25) : baseDelay;\n\t\tif (delay > 0) {\n\t\t\tsetTimeout(next, delay);\n\t\t}\n\t\telse {\n\t\t\tsetImmediate(next);\n\t\t}\n\t}\n\n\tprivate shouldLogSend(durationMs: number | null, totalBytes: number | null, bufferedAmount: number | null): boolean {\n\t\tif (this._wsSendDebug) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (durationMs !== null && durationMs >= this._wsSendLogThresholdMs) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (totalBytes !== null && totalBytes >= this._wsSendLogBytes) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (bufferedAmount !== null && bufferedAmount >= this._wsSendLogBufferedBytes) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate getBufferedAmount(ws: WebSocket): number | null {\n\t\tif (!ws) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst buffered = (ws as any).bufferedAmount;\n\t\treturn typeof buffered === 'number' ? buffered : null;\n\t}\n\n\tprivate logWsSend(event: string, ws: WebSocket, details: Record<string, any>): void {\n\t\tif (!this._wsSendDebug) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = Object.assign({\n\t\t\tts: new Date().toISOString(),\n\t\t\tevent,\n\t\t\tid_ws: ws ? ws['id_socket'] : null,\n\t\t\tuser: ws ? ws['user'] : null\n\t\t}, details);\n\n\t\tconsole.log(JSON.stringify(payload));\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._wsBackpressureLogAt.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\tif (ws && ws.readyState === WebSocket.OPEN) {\n\t\t\t\tws.send(data, (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\treturn;\n\t\t}\n\t\telse {\n\t\t\t// Handle string messages like 'ping' or 'pong'\n\t\t\tconst chunkContext = this.prepareChunkContext(data);\n\t\t\tif (chunkContext) {\n\t\t\t\tthis.flushMessages(ws);\n\t\t\t\tthis.sendChunkSequence(ws, data, chunkContext);\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(\n\t\tws: WebSocket,\n\t\tmessageId: number,\n\t\thasError: boolean,\n\t\tpackedData: Uint8Array | Buffer,\n\t\tencoding: 'msgpack' | 'json' = 'msgpack',\n\t\toptions: PackedSendOptions = {}\n\t): void {\n\t\tif (!ws || ws.readyState !== WebSocket.OPEN || !packedData || !packedData.byteLength) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst passThrough = !!options.passThrough;\n\t\tconst preferPackedChunk = this._packedChunkMinBytes > 0 && packedData.byteLength >= this._packedChunkMinBytes;\n\t\tconst canChunk = this._chunkingEnabled;\n\t\tconst shouldChunk = passThrough\n\t\t\t? canChunk\n\t\t\t: (canChunk && (packedData.byteLength > this._chunkThresholdBytes || preferPackedChunk));\n\t\tif (!shouldChunk) {\n\t\t\tconst decoded = this.decodePackedPayload(packedData, encoding);\n\t\t\tif (decoded !== undefined) {\n\t\t\t\tthis.send(ws, { messageId, hasError, data: decoded });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this._chunkingEnabled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (!canChunk) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst sendStartMs = Date.now();\n\t\tconst bufferedStart = this.getBufferedAmount(ws);\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\tif (this.shouldLogSend(null, packedData.byteLength, bufferedStart)) {\n\t\t\tthis.logWsSend('wsSendStart', ws, {\n\t\t\t\tmessageId,\n\t\t\t\ttotalBytes: packedData.byteLength,\n\t\t\t\ttotalChunks,\n\t\t\t\tchunkSize,\n\t\t\t\tencoding,\n\t\t\t\tbufferedAmount: bufferedStart\n\t\t\t});\n\t\t}\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]);\n\n\t\tconst sendChunk = (index: number) => {\n\t\t\tif (!ws || ws.readyState !== WebSocket.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]);\n\t\t\t\tconst durationMs = Date.now() - sendStartMs;\n\t\t\t\tconst bufferedEnd = this.getBufferedAmount(ws);\n\t\t\t\tif (this.shouldLogSend(durationMs, packedData.byteLength, bufferedEnd)) {\n\t\t\t\t\tthis.logWsSend('wsSendEnd', ws, {\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\ttotalBytes: packedData.byteLength,\n\t\t\t\t\t\ttotalChunks,\n\t\t\t\t\t\tchunkSize,\n\t\t\t\t\t\tencoding,\n\t\t\t\t\t\tdurationMs,\n\t\t\t\t\t\tbufferedAmount: bufferedEnd\n\t\t\t\t\t});\n\t\t\t\t}\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]);\n\n\t\t\tthis.scheduleNextChunk(ws, () => sendChunk(index + 1));\n\t\t};\n\n\t\tthis.scheduleNextChunk(ws, () => 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\n\t\tif (messages && messages.length > 0) {\n\t\t\t// Combine messages into one payload\n\t\t\tthis.transmitBatch(ws, messages);\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 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 = Buffer.from(<any>pack([message]));\n\t\t\tconst messageSize = packedMessage.byteLength;\n\n\t\t\tif (chunkSize + messageSize > this._maxMessageSize) {\n\t\t\t\tconst packedChunk = Buffer.from(<any>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 = Buffer.from(<any>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\t\tthis._sendQueues.delete(wsId);\n\t\tif (this._sendQueueTimers.has(wsId)) {\n\t\t\tclearTimeout(this._sendQueueTimers.get(wsId));\n\t\t\tthis._sendQueueTimers.delete(wsId);\n\t\t}\n\t\tthis._wsBackpressureLogAt.delete(wsId);\n \n process.nextTick(() => {\n if ([WebSocket.OPEN, WebSocket.CLOSING].includes(<any>ws.readyState)) {\n // Socket still hangs, hard close\n ws.terminate();\n }\n });\n\t}\n\n\tprivate prepareChunkContext(message: ServerResponseModel): { buffer: Buffer, encoding: 'msgpack' | 'json' } | null {\n\t\tif (!this._chunkingEnabled) {\n\t\t\treturn null;\n\t\t}\n\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\tconst packed = Buffer.from(<any>pack(data));\n\t\t\tif (packed.byteLength > this._chunkThresholdBytes) {\n\t\t\t\treturn { buffer: packed, encoding: 'msgpack' };\n\t\t\t}\n\t\t}\n\t\tcatch (err) {\n\t\t\tif (this._mainServer.getSubscriptionManager()?.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'WebSocketManager', 'Chunking pack failed', err?.message || err);\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate decodePackedPayload(packedData: Uint8Array | Buffer, encoding: 'msgpack' | 'json'): any | undefined {\n\t\ttry {\n\t\t\tconst source = packedData as Uint8Array;\n\t\t\tif (encoding === 'msgpack') {\n\t\t\t\treturn unpack(source);\n\t\t\t}\n\n\t\t\tconst text = this._textDecoder.decode(source);\n\t\t\treturn JSON.parse(text);\n\t\t}\n\t\tcatch (err) {\n\t\t\tif (this._mainServer.getSubscriptionManager()?.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'WebSocketManager', 'Packed decode failed', err?.message || err);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate sendChunkSequence(ws: WebSocket, original: ServerResponseModel, chunkContext: { buffer: Buffer, encoding: 'msgpack' | 'json' }): void {\n\t\tconst chunkId = this.generateChunkId();\n\t\tconst totalChunks = Math.ceil(chunkContext.buffer.byteLength / this._chunkSizeBytes);\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]);\n\n\t\tconst sendChunk = (index: number) => {\n\t\t\tif (!ws || ws.readyState !== WebSocket.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: original.messageId,\n\t\t\t\t\thasError: original.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]);\n\t\t\t\treturn;\n\t\t\t}\n\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 = slice;\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]);\n\t\t\tthis.scheduleNextChunk(ws, () => sendChunk(index + 1));\n\t\t};\n\n\t\tthis.scheduleNextChunk(ws, () => sendChunk(0));\n\t}\n\n\tprivate transmitBatch(ws: WebSocket, batch: ServerResponseModel[]): void {\n\t\tif (!batch || !batch.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst wsId = ws['id_socket'];\n\t\tif (this.shouldQueueSend(ws) || this._sendQueues.has(wsId)) {\n\t\t\tthis.enqueueSend(ws, batch);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.transmitBatchNow(ws, batch);\n\t}\n\n\tprivate transmitBatchNow(ws: WebSocket, batch: ServerResponseModel[]): 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\tconst packedData = Buffer.from(<any>pack(batch));\n\t\tconst dataSize = packedData.byteLength;\n\t\tconst bufferedAmount = this.getBufferedAmount(ws);\n\n\t\tif (!isChunkEnvelope && dataSize > this._maxMessageSize) {\n\t\t\tthis.sendMessagesInChunksBinary(ws, batch);\n\t\t}\n\t\telse {\n\t\t\tws.send(packedData, (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\n\t\tif (this.shouldLogSend(null, dataSize, bufferedAmount)) {\n\t\t\tthis.logWsSend('wsBatchSend', ws, {\n\t\t\t\tbatchSize: batch.length,\n\t\t\t\tdataSize,\n\t\t\t\tisChunkEnvelope,\n\t\t\t\tbufferedAmount\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, unpack } from 'msgpackr';\nimport { TextDecoder } from 'util';\nimport { WebSocket } from 'ws';\n\ninterface ServerResponseModel {\n\tmessageId: number;\n\thasError: boolean;\n\tdata: any;\n}\n\ninterface PackedSendOptions {\n\tpassThrough?: boolean;\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\tprivate _chunkingEnabled: boolean;\n\tprivate readonly _textDecoder = new TextDecoder();\n\tprivate _wsSendDebug = false;\n\tprivate _wsSendLogThresholdMs = 2000;\n\tprivate _wsSendLogBytes = 2 * 1024 * 1024;\n\tprivate _wsSendLogBufferedBytes = 4 * 1024 * 1024;\n\tprivate _packedChunkMinBytes = 64 * 1024;\n\tprivate _sendQueues: Map<string, ServerResponseModel[][]> = new Map();\n\tprivate _sendQueueTimers: Map<string, NodeJS.Timeout> = new Map();\n\tprivate _sendThrottleMs = 0;\n\tprivate _sendBackpressureBytes = 0;\n\tprivate _sendMaxBatchesPerTick = 10;\n\tprivate _aiWorkerDebug = false;\n\tprivate _wsBackpressureLogAt: Map<string, number> = new Map();\n\tprivate _wsBackpressureLogCooldownMs = 2000;\n\n\tconstructor() {}\n\t\n\tstatic create(mainServer, maxMessageSize: number = 256 * 1024, 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 = this.parsePositiveInt(process.env.WS_MAX_MESSAGE_SIZE_BYTES, maxMessageSize);\n\t\tthis._messageDelay = messageDelay;\n\t\tthis._chunkingEnabled = this.parseBoolean(process.env.WS_CHUNKING_ENABLED, true);\n\t\tthis._chunkThresholdBytes = this.parsePositiveInt(process.env.WS_CHUNK_THRESHOLD_BYTES, chunkThresholdBytes);\n\t\tthis._chunkSizeBytes = this.parsePositiveInt(process.env.WS_CHUNK_SIZE_BYTES, chunkSizeBytes);\n\t\tthis._wsSendDebug = this.parseDebugFlag(process.env.WS_SEND_DEBUG);\n\t\tthis._aiWorkerDebug = this.parseDebugFlag(process.env.AI_ASSISTANT_WORKER_DEBUG);\n\t\tthis._wsSendLogThresholdMs = this.parsePositiveInt(process.env.WS_SEND_LOG_THRESHOLD_MS, this._wsSendLogThresholdMs);\n\t\tthis._wsSendLogBytes = this.parsePositiveInt(process.env.WS_SEND_LOG_BYTES, this._wsSendLogBytes);\n\t\tthis._wsSendLogBufferedBytes = this.parsePositiveInt(process.env.WS_SEND_LOG_BUFFERED_BYTES, this._wsSendLogBufferedBytes);\n\t\tconst packedChunkFallback = Math.min(this._chunkThresholdBytes, this._packedChunkMinBytes);\n\t\tconst packedChunkRaw = process.env.WS_PACKED_CHUNK_MIN_BYTES;\n\t\tthis._packedChunkMinBytes = packedChunkRaw === '0'\n\t\t\t? 0\n\t\t\t: this.parsePositiveInt(packedChunkRaw, packedChunkFallback);\n\t\tthis._sendThrottleMs = this.parsePositiveInt(process.env.WS_SEND_THROTTLE_MS, this._sendThrottleMs);\n\t\tconst backpressureRaw = process.env.WS_SEND_BACKPRESSURE_BYTES;\n\t\tif (backpressureRaw === '0') {\n\t\t\tthis._sendBackpressureBytes = 0;\n\t\t}\n\t\telse if (backpressureRaw === undefined || backpressureRaw === null || backpressureRaw === '') {\n\t\t\tthis._sendBackpressureBytes = this._wsSendLogBufferedBytes;\n\t\t}\n\t\telse {\n\t\t\tthis._sendBackpressureBytes = this.parsePositiveInt(backpressureRaw, this._sendBackpressureBytes);\n\t\t}\n\t\tthis._sendMaxBatchesPerTick = this.parsePositiveInt(process.env.WS_SEND_MAX_BATCHES_PER_TICK, this._sendMaxBatchesPerTick);\n\t}\n\n\tprivate parseDebugFlag(value: any): boolean {\n\t\tif (value === true) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (value === false || value === null || value === undefined) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (typeof value === 'number') {\n\t\t\treturn value === 1;\n\t\t}\n\n\t\tif (typeof value === 'string') {\n\t\t\tconst normalized = value.trim().toLowerCase();\n\t\t\treturn ['1', 'true', 'yes', 'y', 'on'].includes(normalized);\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate parseBoolean(value: any, fallback: boolean): boolean {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn fallback;\n\t\t}\n\n\t\treturn this.parseDebugFlag(value);\n\t}\n\n\tprivate parsePositiveInt(value: any, fallback: number): number {\n\t\tconst parsed = parseInt(value ?? '', 10);\n\t\tif (Number.isNaN(parsed) || parsed <= 0) {\n\t\t\treturn fallback;\n\t\t}\n\t\treturn parsed;\n\t}\n\n\tprivate isBackpressured(ws: WebSocket): boolean {\n\t\tif (this._sendBackpressureBytes <= 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst buffered = this.getBufferedAmount(ws);\n\t\treturn buffered !== null && buffered >= this._sendBackpressureBytes;\n\t}\n\n\tprivate shouldQueueSend(ws: WebSocket): boolean {\n\t\treturn this._sendThrottleMs > 0 || this.isBackpressured(ws);\n\t}\n\n\tprivate maybeLogBackpressure(ws: WebSocket, batchSize: number): void {\n\t\tif (!this._aiWorkerDebug) {\n\t\t\treturn;\n\t\t}\n\t\tconst wsId = ws ? ws['id_socket'] : null;\n\t\tif (!wsId) {\n\t\t\treturn;\n\t\t}\n\t\tconst now = Date.now();\n\t\tconst last = this._wsBackpressureLogAt.get(wsId) || 0;\n\t\tif (now - last < this._wsBackpressureLogCooldownMs) {\n\t\t\treturn;\n\t\t}\n\t\tthis._wsBackpressureLogAt.set(wsId, now);\n\t\tconst bufferedAmount = this.getBufferedAmount(ws);\n\t\tconst queueDepth = this._sendQueues.get(wsId)?.length ?? 0;\n\t\tconst backpressured = this.isBackpressured(ws);\n\t\tconst reason = backpressured ? 'backpressure' : (this._sendThrottleMs > 0 ? 'throttle' : 'queued');\n\t\tconsole.warn(new Date(), '[AI Worker Debug] wsSendQueued', {\n\t\t\treason,\n\t\t\tid_ws: wsId,\n\t\t\tuser: ws ? ws['user'] : null,\n\t\t\tbatchSize,\n\t\t\tqueueDepth,\n\t\t\tbufferedAmount,\n\t\t\tbackpressureBytes: this._sendBackpressureBytes,\n\t\t\tsendThrottleMs: this._sendThrottleMs\n\t\t});\n\t}\n\n\tprivate getQueueDelayMs(ws: WebSocket): number {\n\t\tif (this._sendThrottleMs > 0) {\n\t\t\treturn this._sendThrottleMs;\n\t\t}\n\n\t\tif (this.isBackpressured(ws)) {\n\t\t\treturn 25;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\tprivate enqueueSend(ws: WebSocket, batch: ServerResponseModel[]): void {\n\t\tif (!batch || !batch.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst wsId = ws['id_socket'];\n\t\tlet queue = this._sendQueues.get(wsId);\n\t\tif (!queue) {\n\t\t\tqueue = [];\n\t\t\tthis._sendQueues.set(wsId, queue);\n\t\t}\n\n\t\tqueue.push(batch);\n\t\tthis.maybeLogBackpressure(ws, batch.length);\n\t\tthis.scheduleSendDrain(ws);\n\t}\n\n\tprivate scheduleSendDrain(ws: WebSocket): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tif (this._sendQueueTimers.has(wsId)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst delay = this.getQueueDelayMs(ws);\n\t\tconst timer = setTimeout(() => {\n\t\t\tthis._sendQueueTimers.delete(wsId);\n\t\t\tthis.drainSendQueue(ws);\n\t\t}, delay);\n\n\t\tthis._sendQueueTimers.set(wsId, timer);\n\t}\n\n\tprivate drainSendQueue(ws: WebSocket): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tconst queue = this._sendQueues.get(wsId);\n\t\tif (!queue || !queue.length) {\n\t\t\tthis._sendQueues.delete(wsId);\n\t\t\treturn;\n\t\t}\n\n\t\tlet sent = 0;\n\t\twhile (queue.length > 0 && sent < this._sendMaxBatchesPerTick && !this.isBackpressured(ws)) {\n\t\t\tconst batch = queue.shift();\n\t\t\tif (batch && batch.length) {\n\t\t\t\tthis.transmitBatchNow(ws, batch);\n\t\t\t}\n\t\t\tsent += 1;\n\t\t}\n\n\t\tif (queue.length > 0) {\n\t\t\tthis.scheduleSendDrain(ws);\n\t\t}\n\t\telse {\n\t\t\tthis._sendQueues.delete(wsId);\n\t\t}\n\t}\n\n\tprivate scheduleNextChunk(ws: WebSocket, next: () => void): void {\n\t\tconst wsId = ws['id_socket'];\n\t\tconst queueSize = this._sendQueues.get(wsId)?.length ?? 0;\n\t\tconst baseDelay = this.getQueueDelayMs(ws);\n\t\tconst delay = queueSize >= this._sendMaxBatchesPerTick ? Math.max(baseDelay, 25) : baseDelay;\n\t\tif (delay > 0) {\n\t\t\tsetTimeout(next, delay);\n\t\t}\n\t\telse {\n\t\t\tsetImmediate(next);\n\t\t}\n\t}\n\n\tprivate shouldLogSend(durationMs: number | null, totalBytes: number | null, bufferedAmount: number | null): boolean {\n\t\tif (this._wsSendDebug) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (durationMs !== null && durationMs >= this._wsSendLogThresholdMs) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (totalBytes !== null && totalBytes >= this._wsSendLogBytes) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (bufferedAmount !== null && bufferedAmount >= this._wsSendLogBufferedBytes) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate getBufferedAmount(ws: WebSocket): number | null {\n\t\tif (!ws) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst buffered = (ws as any).bufferedAmount;\n\t\treturn typeof buffered === 'number' ? buffered : null;\n\t}\n\n\tprivate logWsSend(event: string, ws: WebSocket, details: Record<string, any>): void {\n\t\tif (!this._wsSendDebug) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst payload = Object.assign({\n\t\t\tts: new Date().toISOString(),\n\t\t\tevent,\n\t\t\tid_ws: ws ? ws['id_socket'] : null,\n\t\t\tuser: ws ? ws['user'] : null\n\t\t}, details);\n\n\t\tconsole.log(JSON.stringify(payload));\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\tprivate isSocketActive(ws: WebSocket): boolean {\n\t\tif (!ws) {\n\t\t\treturn false;\n\t\t}\n\t\treturn ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING;\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._wsBackpressureLogAt.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 getAllWebSockets(): WebSocket[] {\n\t\treturn Array.from(this._webSockets.values());\n\t}\n\n\tpublic getActiveWebSocketCount(): number {\n\t\treturn this.getAllWebSockets().filter(ws => this.isSocketActive(ws)).length;\n\t}\n\n\tpublic getUserWebSockets(id_user: string): WebSocket[] {\n\t\tconst targetUser = `${id_user || ''}`.trim();\n\t\tif (!targetUser) {\n\t\t\treturn [];\n\t\t}\n\t\treturn this.getAllWebSockets().filter(ws => this.isSocketActive(ws) && `${ws?.['id_user'] || ''}`.trim() === targetUser);\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\tif (ws && ws.readyState === WebSocket.OPEN) {\n\t\t\t\tws.send(data, (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\treturn;\n\t\t}\n\t\telse {\n\t\t\t// Handle string messages like 'ping' or 'pong'\n\t\t\tconst chunkContext = this.prepareChunkContext(data);\n\t\t\tif (chunkContext) {\n\t\t\t\tthis.flushMessages(ws);\n\t\t\t\tthis.sendChunkSequence(ws, data, chunkContext);\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(\n\t\tws: WebSocket,\n\t\tmessageId: number,\n\t\thasError: boolean,\n\t\tpackedData: Uint8Array | Buffer,\n\t\tencoding: 'msgpack' | 'json' = 'msgpack',\n\t\toptions: PackedSendOptions = {}\n\t): void {\n\t\tif (!ws || ws.readyState !== WebSocket.OPEN || !packedData || !packedData.byteLength) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst passThrough = !!options.passThrough;\n\t\tconst preferPackedChunk = this._packedChunkMinBytes > 0 && packedData.byteLength >= this._packedChunkMinBytes;\n\t\tconst canChunk = this._chunkingEnabled;\n\t\tconst shouldChunk = passThrough\n\t\t\t? canChunk\n\t\t\t: (canChunk && (packedData.byteLength > this._chunkThresholdBytes || preferPackedChunk));\n\t\tif (!shouldChunk) {\n\t\t\tconst decoded = this.decodePackedPayload(packedData, encoding);\n\t\t\tif (decoded !== undefined) {\n\t\t\t\tthis.send(ws, { messageId, hasError, data: decoded });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this._chunkingEnabled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (!canChunk) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst sendStartMs = Date.now();\n\t\tconst bufferedStart = this.getBufferedAmount(ws);\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\tif (this.shouldLogSend(null, packedData.byteLength, bufferedStart)) {\n\t\t\tthis.logWsSend('wsSendStart', ws, {\n\t\t\t\tmessageId,\n\t\t\t\ttotalBytes: packedData.byteLength,\n\t\t\t\ttotalChunks,\n\t\t\t\tchunkSize,\n\t\t\t\tencoding,\n\t\t\t\tbufferedAmount: bufferedStart\n\t\t\t});\n\t\t}\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]);\n\n\t\tconst sendChunk = (index: number) => {\n\t\t\tif (!ws || ws.readyState !== WebSocket.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]);\n\t\t\t\tconst durationMs = Date.now() - sendStartMs;\n\t\t\t\tconst bufferedEnd = this.getBufferedAmount(ws);\n\t\t\t\tif (this.shouldLogSend(durationMs, packedData.byteLength, bufferedEnd)) {\n\t\t\t\t\tthis.logWsSend('wsSendEnd', ws, {\n\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\ttotalBytes: packedData.byteLength,\n\t\t\t\t\t\ttotalChunks,\n\t\t\t\t\t\tchunkSize,\n\t\t\t\t\t\tencoding,\n\t\t\t\t\t\tdurationMs,\n\t\t\t\t\t\tbufferedAmount: bufferedEnd\n\t\t\t\t\t});\n\t\t\t\t}\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]);\n\n\t\t\tthis.scheduleNextChunk(ws, () => sendChunk(index + 1));\n\t\t};\n\n\t\tthis.scheduleNextChunk(ws, () => 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\n\t\tif (messages && messages.length > 0) {\n\t\t\t// Combine messages into one payload\n\t\t\tthis.transmitBatch(ws, messages);\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 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 = Buffer.from(<any>pack([message]));\n\t\t\tconst messageSize = packedMessage.byteLength;\n\n\t\t\tif (chunkSize + messageSize > this._maxMessageSize) {\n\t\t\t\tconst packedChunk = Buffer.from(<any>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 = Buffer.from(<any>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\t\tthis._sendQueues.delete(wsId);\n\t\tif (this._sendQueueTimers.has(wsId)) {\n\t\t\tclearTimeout(this._sendQueueTimers.get(wsId));\n\t\t\tthis._sendQueueTimers.delete(wsId);\n\t\t}\n\t\tthis._wsBackpressureLogAt.delete(wsId);\n \n process.nextTick(() => {\n if ([WebSocket.OPEN, WebSocket.CLOSING].includes(<any>ws.readyState)) {\n // Socket still hangs, hard close\n ws.terminate();\n }\n });\n\t}\n\n\tprivate prepareChunkContext(message: ServerResponseModel): { buffer: Buffer, encoding: 'msgpack' | 'json' } | null {\n\t\tif (!this._chunkingEnabled) {\n\t\t\treturn null;\n\t\t}\n\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\tconst packed = Buffer.from(<any>pack(data));\n\t\t\tif (packed.byteLength > this._chunkThresholdBytes) {\n\t\t\t\treturn { buffer: packed, encoding: 'msgpack' };\n\t\t\t}\n\t\t}\n\t\tcatch (err) {\n\t\t\tif (this._mainServer.getSubscriptionManager()?.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'WebSocketManager', 'Chunking pack failed', err?.message || err);\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate decodePackedPayload(packedData: Uint8Array | Buffer, encoding: 'msgpack' | 'json'): any | undefined {\n\t\ttry {\n\t\t\tconst source = packedData as Uint8Array;\n\t\t\tif (encoding === 'msgpack') {\n\t\t\t\treturn unpack(source);\n\t\t\t}\n\n\t\t\tconst text = this._textDecoder.decode(source);\n\t\t\treturn JSON.parse(text);\n\t\t}\n\t\tcatch (err) {\n\t\t\tif (this._mainServer.getSubscriptionManager()?.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'WebSocketManager', 'Packed decode failed', err?.message || err);\n\t\t\t}\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate sendChunkSequence(ws: WebSocket, original: ServerResponseModel, chunkContext: { buffer: Buffer, encoding: 'msgpack' | 'json' }): void {\n\t\tconst chunkId = this.generateChunkId();\n\t\tconst totalChunks = Math.ceil(chunkContext.buffer.byteLength / this._chunkSizeBytes);\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]);\n\n\t\tconst sendChunk = (index: number) => {\n\t\t\tif (!ws || ws.readyState !== WebSocket.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: original.messageId,\n\t\t\t\t\thasError: original.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]);\n\t\t\t\treturn;\n\t\t\t}\n\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 = slice;\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]);\n\t\t\tthis.scheduleNextChunk(ws, () => sendChunk(index + 1));\n\t\t};\n\n\t\tthis.scheduleNextChunk(ws, () => sendChunk(0));\n\t}\n\n\tprivate transmitBatch(ws: WebSocket, batch: ServerResponseModel[]): void {\n\t\tif (!batch || !batch.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst wsId = ws['id_socket'];\n\t\tif (this.shouldQueueSend(ws) || this._sendQueues.has(wsId)) {\n\t\t\tthis.enqueueSend(ws, batch);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.transmitBatchNow(ws, batch);\n\t}\n\n\tprivate transmitBatchNow(ws: WebSocket, batch: ServerResponseModel[]): 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\tconst packedData = Buffer.from(<any>pack(batch));\n\t\tconst dataSize = packedData.byteLength;\n\t\tconst bufferedAmount = this.getBufferedAmount(ws);\n\n\t\tif (!isChunkEnvelope && dataSize > this._maxMessageSize) {\n\t\t\tthis.sendMessagesInChunksBinary(ws, batch);\n\t\t}\n\t\telse {\n\t\t\tws.send(packedData, (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\n\t\tif (this.shouldLogSend(null, dataSize, bufferedAmount)) {\n\t\t\tthis.logWsSend('wsBatchSend', ws, {\n\t\t\t\tbatchSize: batch.length,\n\t\t\t\tdataSize,\n\t\t\t\tisChunkEnvelope,\n\t\t\t\tbufferedAmount\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
package/server-app.d.ts
CHANGED
|
@@ -58,9 +58,16 @@ export declare class ResolveIOMainServer {
|
|
|
58
58
|
private _isWorkersEnabled;
|
|
59
59
|
private _isWorkerInstance;
|
|
60
60
|
private _safeShutdown;
|
|
61
|
+
private _dynamicAppGatewayEnabled;
|
|
62
|
+
private _dynamicAppGatewayCache;
|
|
63
|
+
private _socketTier;
|
|
64
|
+
private _maxClientSockets;
|
|
65
|
+
private _singleIpPerUser;
|
|
66
|
+
private _socketPolicyUpgradeUrl;
|
|
61
67
|
private readonly _clientHeartbeatIntervalMs;
|
|
62
68
|
private readonly _clientHeartbeatInitialDelayMs;
|
|
63
69
|
private readonly _clientHeartbeatBackpressureBytes;
|
|
70
|
+
private readonly _dynamicAppGatewayCacheMs;
|
|
64
71
|
constructor();
|
|
65
72
|
static create(): Promise<ResolveIOMainServer>;
|
|
66
73
|
private initialize;
|
|
@@ -68,6 +75,18 @@ export declare class ResolveIOMainServer {
|
|
|
68
75
|
private closeHttpServerGracefully;
|
|
69
76
|
private closeWebSocketServerGracefully;
|
|
70
77
|
private startServerInstance;
|
|
78
|
+
private installDynamicAppGatewayMiddleware;
|
|
79
|
+
private resolveDynamicAppGatewayEnabled;
|
|
80
|
+
private extractDynamicAppGatewayId;
|
|
81
|
+
private resolveDynamicAppGatewayToken;
|
|
82
|
+
private normalizeHeaderValue;
|
|
83
|
+
private normalizeHostname;
|
|
84
|
+
private resolveOriginHostname;
|
|
85
|
+
private isLocalHostname;
|
|
86
|
+
private resolveDynamicAppControlHosts;
|
|
87
|
+
private resolveDynamicAppAllowedHosts;
|
|
88
|
+
private applyDynamicAppGatewayCorsHeaders;
|
|
89
|
+
private resolveCachedDynamicAppGatewayApp;
|
|
71
90
|
private safeShutdown;
|
|
72
91
|
getIsWorkersEnabled(): boolean;
|
|
73
92
|
getIsWorkerInstance(): boolean;
|
|
@@ -115,6 +134,20 @@ export declare class ResolveIOMainServer {
|
|
|
115
134
|
private stopCpuProfile;
|
|
116
135
|
private resolveWritableProfileDir;
|
|
117
136
|
private parseDebugFlag;
|
|
137
|
+
private parseOptionalBoolean;
|
|
138
|
+
private parseNonNegativeInt;
|
|
139
|
+
private resolveSocketTier;
|
|
140
|
+
private resolveSocketTierKeySuffix;
|
|
141
|
+
private resolveMaxClientSockets;
|
|
142
|
+
private resolveSingleIpPerUserPolicy;
|
|
143
|
+
private resolveSocketPolicyUpgradeUrl;
|
|
144
|
+
private resolveSocketUpgradeUrlWithAppId;
|
|
145
|
+
private normalizeIpAddress;
|
|
146
|
+
private resolveClientIp;
|
|
147
|
+
private buildSocketLimitMessage;
|
|
148
|
+
private buildSocketLimitCloseReason;
|
|
149
|
+
private disconnectUserSocketsFromDifferentIps;
|
|
150
|
+
private evaluateClientSocketAdmission;
|
|
118
151
|
private logConnectDebug;
|
|
119
152
|
private triggerClientHeartbeat;
|
|
120
153
|
private shouldDeferHeartbeat;
|