@resolveio/server-lib 20.14.22 → 20.14.23

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.
@@ -31,9 +31,11 @@ export declare class WorkerDispatcherManager {
31
31
  private _taskTimings;
32
32
  private MAX_CONCURRENCY;
33
33
  private WORKER_TASK_LOG_THRESHOLD_MS;
34
+ private _workerTaskDebug;
34
35
  constructor();
35
36
  static create(websocketManager: WebSocketManager, methodManager: MethodManager): WorkerDispatcherManager;
36
37
  initialize(websocketManager: WebSocketManager, methodManager: MethodManager): void;
38
+ private parseDebugFlag;
37
39
  isSafeShutdown(): boolean;
38
40
  addWorker(ws: WebSocket.WebSocket): void;
39
41
  disconnectWorker(workerId: string): void;
@@ -35,6 +35,7 @@ var WorkerDispatcherManager = /** @class */ (function () {
35
35
  this._taskTimings = new Map();
36
36
  this.MAX_CONCURRENCY = 10;
37
37
  this.WORKER_TASK_LOG_THRESHOLD_MS = 200;
38
+ this._workerTaskDebug = false;
38
39
  }
39
40
  WorkerDispatcherManager.create = function (websocketManager, methodManager) {
40
41
  var workerDispatcherManager = new WorkerDispatcherManager();
@@ -42,8 +43,26 @@ var WorkerDispatcherManager = /** @class */ (function () {
42
43
  return workerDispatcherManager;
43
44
  };
44
45
  WorkerDispatcherManager.prototype.initialize = function (websocketManager, methodManager) {
46
+ var _a;
45
47
  this._websocketManager = websocketManager;
46
48
  this._methodManager = methodManager;
49
+ this._workerTaskDebug = this.parseDebugFlag((_a = process.env.WORKER_TASK_DEBUG) !== null && _a !== void 0 ? _a : process.env.WORKER_DISPATCH_DEBUG);
50
+ };
51
+ WorkerDispatcherManager.prototype.parseDebugFlag = function (value) {
52
+ if (value === true) {
53
+ return true;
54
+ }
55
+ if (value === false || value === null || value === undefined) {
56
+ return false;
57
+ }
58
+ if (typeof value === 'number') {
59
+ return value === 1;
60
+ }
61
+ if (typeof value === 'string') {
62
+ var normalized = value.trim().toLowerCase();
63
+ return ['1', 'true', 'yes', 'y', 'on'].includes(normalized);
64
+ }
65
+ return false;
47
66
  };
48
67
  WorkerDispatcherManager.prototype.isSafeShutdown = function () {
49
68
  return !this._taskQueue.length && !this._pendingTasks.size;
@@ -132,6 +151,16 @@ var WorkerDispatcherManager = /** @class */ (function () {
132
151
  if (userContext && userContext.id_ws) {
133
152
  this._clientRequests[taskId] = userContext.id_ws;
134
153
  }
154
+ if (this.shouldDebug()) {
155
+ this.logWorkerEvent('workerTaskQueued', {
156
+ taskId: taskId,
157
+ method: method,
158
+ messageId: messageId,
159
+ priority: method === 'runPublication' ? 'publication' : 'method',
160
+ queueDepth: this._taskQueue.length,
161
+ userContext: userContext
162
+ });
163
+ }
135
164
  this.dispatchQueue();
136
165
  };
137
166
  /**
@@ -171,6 +200,16 @@ var WorkerDispatcherManager = /** @class */ (function () {
171
200
  if (_this._methodManager.getEnableDebug()) {
172
201
  console.log(new Date(), 'Send Internal Promise', _this._taskQueue);
173
202
  }
203
+ if (_this.shouldDebug()) {
204
+ _this.logWorkerEvent('workerTaskQueued', {
205
+ taskId: taskId,
206
+ method: method,
207
+ messageId: 0,
208
+ priority: method === 'runPublication' ? 'publication' : 'method',
209
+ queueDepth: _this._taskQueue.length,
210
+ userContext: { user: 'Internal System' }
211
+ });
212
+ }
174
213
  _this.dispatchQueue();
175
214
  });
176
215
  };
@@ -212,6 +251,16 @@ var WorkerDispatcherManager = /** @class */ (function () {
212
251
  if (_this._methodManager.getEnableDebug()) {
213
252
  console.log(new Date(), 'Send Internal Raw Promise', _this._taskQueue);
214
253
  }
254
+ if (_this.shouldDebug()) {
255
+ _this.logWorkerEvent('workerTaskQueued', {
256
+ taskId: taskId,
257
+ method: method,
258
+ messageId: 0,
259
+ priority: method === 'runPublication' ? 'publication' : 'method',
260
+ queueDepth: _this._taskQueue.length,
261
+ userContext: { user: 'Internal System' }
262
+ });
263
+ }
215
264
  _this.dispatchQueue();
216
265
  });
217
266
  };
@@ -245,6 +294,16 @@ var WorkerDispatcherManager = /** @class */ (function () {
245
294
  if (this._methodManager.getEnableDebug()) {
246
295
  console.log(new Date(), 'Send Internal Task', this._taskQueue);
247
296
  }
297
+ if (this.shouldDebug()) {
298
+ this.logWorkerEvent('workerTaskQueued', {
299
+ taskId: taskId,
300
+ method: method,
301
+ messageId: 0,
302
+ priority: method === 'runPublication' ? 'publication' : 'method',
303
+ queueDepth: this._taskQueue.length,
304
+ userContext: { user: 'Internal System' }
305
+ });
306
+ }
248
307
  this.dispatchQueue();
249
308
  };
250
309
  /**
@@ -257,14 +316,32 @@ var WorkerDispatcherManager = /** @class */ (function () {
257
316
  }
258
317
  while (this._taskQueue.length > 0) {
259
318
  var assigned = false;
260
- for (var i = 0; i < this._taskQueue.length; i++) {
261
- var task = this._taskQueue[i];
262
- var targetWorker = this.findWorkerForTask(task);
263
- if (targetWorker) {
264
- this._taskQueue.splice(i, 1);
265
- this.assignTaskToWorker(targetWorker, task);
266
- assigned = true;
267
- break;
319
+ var hasPublicationTask = this._taskQueue.some(function (task) { return task.method === 'runPublication'; });
320
+ if (hasPublicationTask) {
321
+ for (var i = 0; i < this._taskQueue.length; i++) {
322
+ var task = this._taskQueue[i];
323
+ if (task.method !== 'runPublication') {
324
+ continue;
325
+ }
326
+ var targetWorker = this.findWorkerForTask(task);
327
+ if (targetWorker) {
328
+ this._taskQueue.splice(i, 1);
329
+ this.assignTaskToWorker(targetWorker, task);
330
+ assigned = true;
331
+ break;
332
+ }
333
+ }
334
+ }
335
+ if (!assigned) {
336
+ for (var i = 0; i < this._taskQueue.length; i++) {
337
+ var task = this._taskQueue[i];
338
+ var targetWorker = this.findWorkerForTask(task);
339
+ if (targetWorker) {
340
+ this._taskQueue.splice(i, 1);
341
+ this.assignTaskToWorker(targetWorker, task);
342
+ assigned = true;
343
+ break;
344
+ }
268
345
  }
269
346
  }
270
347
  if (!assigned) {
@@ -401,6 +478,20 @@ var WorkerDispatcherManager = /** @class */ (function () {
401
478
  queuedAt: timing.queuedAt,
402
479
  dispatchedAt: dispatchedAt
403
480
  };
481
+ if (this.shouldDebug()) {
482
+ this.logWorkerEvent('workerTaskAssigned', {
483
+ taskId: task.taskId,
484
+ method: task.method,
485
+ messageId: task.messageId,
486
+ priority: task.method === 'runPublication' ? 'publication' : 'method',
487
+ worker: {
488
+ id: worker.id,
489
+ index: worker.workerIndex,
490
+ instance: worker.workerInstance
491
+ },
492
+ queueDepth: this._taskQueue.length
493
+ });
494
+ }
404
495
  var timeoutHandle = setTimeout(function () {
405
496
  var pending = _this._pendingTasks.get(task.taskId);
406
497
  var timeoutAt = Date.now();
@@ -516,7 +607,14 @@ var WorkerDispatcherManager = /** @class */ (function () {
516
607
  }
517
608
  };
518
609
  WorkerDispatcherManager.prototype.shouldDebug = function () {
519
- return this._methodManager.getEnableDebug() || process.env.WORKER_DISPATCH_DEBUG === 'true';
610
+ var _a;
611
+ if (this._methodManager.getEnableDebug()) {
612
+ return true;
613
+ }
614
+ if (this._workerTaskDebug) {
615
+ return true;
616
+ }
617
+ return this.parseDebugFlag((_a = process.env.WORKER_TASK_DEBUG) !== null && _a !== void 0 ? _a : process.env.WORKER_DISPATCH_DEBUG);
520
618
  };
521
619
  WorkerDispatcherManager.prototype.logWorkerEvent = function (event, details) {
522
620
  console.log(this.safeStringify(__assign({ ts: new Date().toISOString(), event: event }, details)));
@@ -614,7 +712,8 @@ var WorkerDispatcherManager = /** @class */ (function () {
614
712
  }
615
713
  worker.activeTasks = worker.activeTasks.filter(function (a) { return a.taskId !== taskId_1; });
616
714
  this._taskTimings.delete(taskId_1);
617
- if (error || (dispatchToCompleteMs !== null && dispatchToCompleteMs >= this.WORKER_TASK_LOG_THRESHOLD_MS)) {
715
+ var shouldLogComplete = !!error || (dispatchToCompleteMs !== null && dispatchToCompleteMs >= this.WORKER_TASK_LOG_THRESHOLD_MS);
716
+ if (shouldLogComplete) {
618
717
  this.logWorkerEvent('workerTaskComplete', {
619
718
  taskId: taskId_1,
620
719
  method: pendingTask === null || pendingTask === void 0 ? void 0 : pendingTask.method,
@@ -633,6 +732,25 @@ var WorkerDispatcherManager = /** @class */ (function () {
633
732
  queue: this.getQueueSnapshot()
634
733
  });
635
734
  }
735
+ else if (this.shouldDebug()) {
736
+ this.logWorkerEvent('workerTaskCompleteDebug', {
737
+ taskId: taskId_1,
738
+ method: pendingTask === null || pendingTask === void 0 ? void 0 : pendingTask.method,
739
+ messageId: messageId,
740
+ error: error,
741
+ dispatchToCompleteMs: dispatchToCompleteMs,
742
+ queueWaitMs: queueWaitMs,
743
+ totalMs: totalMs,
744
+ packedBytes: packedBytes,
745
+ userContext: timing === null || timing === void 0 ? void 0 : timing.userContext,
746
+ worker: {
747
+ id: worker.id,
748
+ index: worker.workerIndex,
749
+ instance: worker.workerInstance
750
+ },
751
+ queue: this.getQueueSnapshot()
752
+ });
753
+ }
636
754
  if (pendingTask) {
637
755
  if (pendingTask.promise) {
638
756
  if (error) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/managers/worker-dispatcher.manager.ts"],"names":[],"mappings":"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","file":"worker-dispatcher.manager.js","sourcesContent":["import * as WebSocket from 'ws';\nimport { ServerResponseModel, TaskPayload, TaskResponse } from '../models/server-message.model';\nimport { dateReviver, objectIdHexString, round } from '../util/common';\nimport { MethodManager } from './method.manager';\nimport { WebSocketManager } from './websocket.manager';\nimport { pack, unpack } from 'msgpackr';\n\nexport interface WorkerConnection {\n\tid: string;\n\tws: WebSocket.WebSocket;\n\tactiveTasks: {\n\t\ttaskId: string;\n\t\tweight: number;\n\t\tmethod?: string;\n\t\tstartedAt?: number;\n\t\tmessageId?: number;\n\t\tuserContext?: { id_user?: string; user?: string; id_ws?: string };\n\t}[];\n\tworkerIndex?: string;\n\tworkerInstance?: string;\n}\n\ninterface PendingTask {\n\ttimeout: NodeJS.Timeout;\n\tpromise?: {\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tresolve: (value: any) => void;\n\t\t// eslint-disable-next-line no-unused-vars\n\t\treject: (reason?: any) => void;\n\t};\n\tmethod?: string;\n\tresolveRaw?: boolean;\n}\n\nexport class WorkerDispatcherManager {\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _workers: WorkerConnection[] = [];\n\tprivate _taskQueue: TaskPayload[] = [];\n\tprivate _clientRequests: { [taskId: string]: string } = {};\n\tprivate _pendingTasks: Map<string, PendingTask> = new Map();\n\tprivate _debugNoWorkerTaskIds: Set<string> = new Set();\n\tprivate _taskTimings: Map<string, {\n\t\tqueuedAt: number;\n\t\tdispatchedAt?: number;\n\t\tmethod?: string;\n\t\tmessageId?: number;\n\t\tuserContext?: { id_user?: string; user?: string; id_ws?: string };\n\t}> = new Map();\n\n\tprivate MAX_CONCURRENCY = 10;\n\tprivate WORKER_TASK_LOG_THRESHOLD_MS = 200;\n\n\tconstructor() {}\n\n\tstatic create(websocketManager: WebSocketManager, methodManager: MethodManager) {\n\t\tconst workerDispatcherManager = new WorkerDispatcherManager();\n\t\tworkerDispatcherManager.initialize(websocketManager, methodManager);\n\t\treturn workerDispatcherManager;\n\t}\n\n\tpublic initialize(websocketManager: WebSocketManager, methodManager: MethodManager) {\n\t\tthis._websocketManager = websocketManager;\n\t\tthis._methodManager = methodManager;\n\t}\n\n\tpublic isSafeShutdown() {\n\t\treturn !this._taskQueue.length && !this._pendingTasks.size;\n\t}\n\n\tpublic addWorker(ws: WebSocket.WebSocket) {\n\t\tthis._workers.push({\n\t\t\tid: ws['id_worker'],\n\t\t\tws: ws,\n\t\t\tactiveTasks: [],\n\t\t\tworkerIndex: ws['workerIndex'],\n\t\t\tworkerInstance: ws['workerInstance']\n\t\t});\n\n\t\tsetInterval(() => {\n\t\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.log(JSON.stringify(this._workers.map(a => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: a.id,\n\t\t\t\t\t\tactiveTasks: a.activeTasks\n\t\t\t\t\t}\n\t\t\t\t}), null, 2));\n\t\t\t}\n\t\t}, 5000);\n\n\t\tif (this._taskQueue.length) {\n\t\t\tthis.dispatchQueue();\n\t\t}\n\t}\n\n\tpublic disconnectWorker(workerId: string) {\n\t\tthis._workers = this._workers.filter(w => w.id !== workerId);\n\t}\n\n\tpublic hasWorkers() {\n\t\treturn this._workers.length > 0;\n\t}\n\n\tpublic getQueueSnapshot() {\n\t\tconst activeTasks = this._workers.reduce((total, worker) => total + (worker.activeTasks ? worker.activeTasks.length : 0), 0);\n\t\treturn {\n\t\t\tqueueDepth: this._taskQueue.length,\n\t\t\tpendingTasks: this._pendingTasks.size,\n\t\t\tworkerCount: this._workers.length,\n\t\t\tactiveTasks,\n\t\t\tworkers: this._workers.map(worker => ({\n\t\t\t\tid: worker.id,\n\t\t\t\tindex: worker.workerIndex,\n\t\t\t\tinstance: worker.workerInstance,\n\t\t\t\tactiveTasks: worker.activeTasks ? worker.activeTasks.length : 0\n\t\t\t}))\n\t\t};\n\t}\n\n\tpublic hasWorkersForMethod(methodName: string) {\n\t\tif (!this._workers.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst method = this._methodManager.getMethod(methodName);\n\t\tconst targetWorkerIndex = this.normalizeWorkerIndex(method?.targetWorkerIndex);\n\t\tconst targetWorkerInstance = this.normalizeWorkerIndex(method?.targetWorkerInstance);\n\n\t\tif (!targetWorkerIndex && !targetWorkerInstance) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn this._workers.some(worker =>\n\t\t\t(!targetWorkerIndex || this.normalizeWorkerIndex(worker.workerIndex) === targetWorkerIndex) &&\n\t\t\t(!targetWorkerInstance || this.normalizeWorkerIndex(worker.workerInstance) === targetWorkerInstance)\n\t\t);\n\t}\n\n\t/**\n\t * Add a new task to our in-memory queue and try to dispatch.\n\t */\n\tpublic sendClientTask(messageId: number, method: string, params: any[], userContext?: { id_user?: string; user?: string; id_ws?: string }) {\n\t\tlet taskId = 'task-' + objectIdHexString();\n\t\tconst queuedAt = Date.now();\n\n\t\tthis._taskQueue.push({\n\t\t\ttype: 'task',\n\t\t\ttaskId,\n\t\t\tmessageId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tuserContext,\n\t\t\tqueuedAt\n\t\t});\n\n\t\tthis._taskTimings.set(taskId, {\n\t\t\tqueuedAt,\n\t\t\tmethod,\n\t\t\tmessageId,\n\t\t\tuserContext\n\t\t});\n\n\t\tif (userContext && userContext.id_ws) {\n\t\t\tthis._clientRequests[taskId] = userContext.id_ws;\n\t\t}\n\n\t\tthis.dispatchQueue();\n\t}\n\n\t/**\n\t * Same as sendInternalTask but returns a Promise so you can `await` it.\n\t */\n\tpublic sendInternalPromise(method: string, params: any[] = []): Promise<any> {\n\t\tif (!Array.isArray(params)) {\n\t\t\tparams = [params];\n\t\t}\n\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet taskId = 'task-' + objectIdHexString();\n\t\t\tconst queuedAt = Date.now();\n\n\t\t\tthis._taskQueue.push({\n\t\t\t\ttype: 'task',\n\t\t\t\ttaskId,\n\t\t\t\tmethod,\n\t\t\t\tparams,\n\t\t\t\tmessageId: 0,\n\t\t\t\tuserContext: {\n\t\t\t\t\tuser: 'Internal System'\n\t\t\t\t},\n\t\t\t\tqueuedAt\n\t\t\t});\n\n\t\t\tthis._taskTimings.set(taskId, {\n\t\t\t\tqueuedAt,\n\t\t\t\tmethod,\n\t\t\t\tmessageId: 0,\n\t\t\t\tuserContext: { user: 'Internal System' }\n\t\t\t});\n\n\t\t\tthis._pendingTasks.set(taskId, {\n\t\t\t\ttimeout: null,\n\t\t\t\tpromise: { resolve, reject }\n\t\t\t});\n\n\t\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Send Internal Promise', this._taskQueue);\n\t\t\t}\n\n\t\t\tthis.dispatchQueue();\n\t\t});\n\t}\n\n\t/**\n\t * Send a task internally and resolve with the raw TaskResponse (includes packedResult/meta).\n\t */\n\tpublic sendInternalPromiseRaw(method: string, params: any[] = []): Promise<TaskResponse> {\n\t\tif (!Array.isArray(params)) {\n\t\t\tparams = [params];\n\t\t}\n\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet taskId = 'task-' + objectIdHexString();\n\t\t\tconst queuedAt = Date.now();\n\n\t\t\tthis._taskQueue.push({\n\t\t\t\ttype: 'task',\n\t\t\t\ttaskId,\n\t\t\t\tmethod,\n\t\t\t\tparams,\n\t\t\t\tmessageId: 0,\n\t\t\t\tuserContext: {\n\t\t\t\t\tuser: 'Internal System'\n\t\t\t\t},\n\t\t\t\tqueuedAt\n\t\t\t});\n\n\t\t\tthis._taskTimings.set(taskId, {\n\t\t\t\tqueuedAt,\n\t\t\t\tmethod,\n\t\t\t\tmessageId: 0,\n\t\t\t\tuserContext: { user: 'Internal System' }\n\t\t\t});\n\n\t\t\tthis._pendingTasks.set(taskId, {\n\t\t\t\ttimeout: null,\n\t\t\t\tpromise: { resolve, reject },\n\t\t\t\tresolveRaw: true\n\t\t\t});\n\n\t\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Send Internal Raw Promise', this._taskQueue);\n\t\t\t}\n\n\t\t\tthis.dispatchQueue();\n\t\t});\n\t}\n\n\t/**\n\t * Send a task internally without returning a promise.\n\t */\n\tpublic sendInternalTask(method: string, params = []) {\n\t\tif (!Array.isArray(params)) {\n\t\t\tparams = [params];\n\t\t}\n\n\t\tlet taskId = 'task-' + objectIdHexString();\n\t\tconst queuedAt = Date.now();\n\n\t\tthis._taskQueue.push({\n\t\t\ttype: 'task',\n\t\t\ttaskId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tmessageId: 0,\n\t\t\tuserContext: {\n\t\t\t\tuser: 'Internal System'\n\t\t\t},\n\t\t\tqueuedAt\n\t\t});\n\n\t\tthis._taskTimings.set(taskId, {\n\t\t\tqueuedAt,\n\t\t\tmethod,\n\t\t\tmessageId: 0,\n\t\t\tuserContext: { user: 'Internal System' }\n\t\t});\n\n\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Send Internal Task', this._taskQueue);\n\t\t}\n\n\t\tthis.dispatchQueue();\n\t}\n\n\t/**\n\t * The main loop that assigns tasks from _taskQueue to any worker that has capacity.\n\t */\n\tprivate dispatchQueue() {\n\t\tif (!this._taskQueue.length) {\n\t\t\treturn;\n\t\t}\n\n\t\twhile (this._taskQueue.length > 0) {\n\t\t\tlet assigned = false;\n\n\t\t\tfor (let i = 0; i < this._taskQueue.length; i++) {\n\t\t\t\tlet task = this._taskQueue[i];\n\t\t\t\tlet targetWorker = this.findWorkerForTask(task);\n\n\t\t\t\tif (targetWorker) {\n\t\t\t\t\tthis._taskQueue.splice(i, 1);\n\t\t\t\t\tthis.assignTaskToWorker(targetWorker, task);\n\t\t\t\t\tassigned = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!assigned) {\n\t\t\t\tthis.logNoWorkerAvailability();\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.dispatchQueue();\n\t\t\t\t}, 25);\n\n\t\t\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'No Worker Available', JSON.stringify(this._workers, null, 2));\n\t\t\t\t}\n\n\t\t\t\treturn; // nothing can run right now due to per-worker limits\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns the worker with the fewest activeTasks that is under maxConcurrency and per-method limit.\n\t */\n\tprivate findWorkerForTask(task: TaskPayload): WorkerConnection | null {\n\t\tlet method = this._methodManager.getMethod(task.method);\n\t\tlet methodLimit = method && method.maxConcurrency && method.maxConcurrency > 0 ? method.maxConcurrency : null;\n\t\tlet methodLimitPerInstance = method && method.maxConcurrencyPerInstance && method.maxConcurrencyPerInstance > 0\n\t\t\t? method.maxConcurrencyPerInstance\n\t\t\t: null;\n\t\tlet targetWorkerIndex = this.normalizeWorkerIndex(method?.targetWorkerIndex);\n\t\tlet targetWorkerInstance = this.normalizeWorkerIndex(method?.targetWorkerInstance);\n\t\tconst preferNonZero = !targetWorkerIndex;\n\n\t\tlet candidates = this._workers.filter(x => x.activeTasks.length < this.MAX_CONCURRENCY);\n\t\tif (targetWorkerIndex) {\n\t\t\tcandidates = candidates.filter(worker => this.normalizeWorkerIndex(worker.workerIndex) === targetWorkerIndex);\n\t\t}\n\t\tif (targetWorkerInstance) {\n\t\t\tcandidates = candidates.filter(worker => this.normalizeWorkerIndex(worker.workerInstance) === targetWorkerInstance);\n\t\t}\n\t\tif (!candidates.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlet eligible = candidates.filter((worker) => {\n\t\t\tif (!methodLimit) {\n\t\t\t\tif (!methodLimitPerInstance) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (methodLimitPerInstance) {\n\t\t\t\tconst currentInstance = worker.activeTasks.filter(a => a.method === task.method).length;\n\t\t\t\tif (currentInstance >= methodLimitPerInstance) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!methodLimit) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tlet idx = worker.workerIndex || 'unknown';\n\t\t\tlet current = 0;\n\n\t\t\tthis._workers.forEach((w) => {\n\t\t\t\tif ((w.workerIndex || 'unknown') === idx) {\n\t\t\t\t\tcurrent += w.activeTasks.filter(a => a.method === task.method).length;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn current < methodLimit;\n\t\t});\n\n\t\tif (!eligible.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\teligible.sort((x, y) => {\n\t\t\tconst totalX = this.getWorkerLoad(x);\n\t\t\tconst totalY = this.getWorkerLoad(y);\n\t\t\tif (totalX !== totalY) {\n\t\t\t\treturn totalX - totalY;\n\t\t\t}\n\n\t\t\tif (preferNonZero) {\n\t\t\t\tconst xZero = this.isWorkerZero(x) ? 1 : 0;\n\t\t\t\tconst yZero = this.isWorkerZero(y) ? 1 : 0;\n\t\t\t\tif (xZero !== yZero) {\n\t\t\t\t\treturn xZero - yZero;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst idxX = this.normalizeWorkerIndex(x.workerIndex) || '';\n\t\t\tconst idxY = this.normalizeWorkerIndex(y.workerIndex) || '';\n\t\t\tconst idxCompare = idxX.localeCompare(idxY, undefined, { numeric: true, sensitivity: 'base' });\n\t\t\tif (idxCompare !== 0) {\n\t\t\t\treturn idxCompare;\n\t\t\t}\n\n\t\t\tconst instX = this.normalizeWorkerIndex(x.workerInstance) || '';\n\t\t\tconst instY = this.normalizeWorkerIndex(y.workerInstance) || '';\n\t\t\treturn instX.localeCompare(instY, undefined, { numeric: true, sensitivity: 'base' });\n\t\t});\n\n\t\treturn eligible[0];\n\t}\n\n\tprivate normalizeWorkerIndex(value?: string | number | null): string | null {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst normalized = String(value).trim();\n\t\treturn normalized.length ? normalized : null;\n\t}\n\n\tprivate getWorkerLoad(worker: WorkerConnection): number {\n\t\treturn worker.activeTasks.reduce((sum, task) => sum + task.weight, 0);\n\t}\n\n\tprivate isWorkerZero(worker: WorkerConnection): boolean {\n\t\treturn this.normalizeWorkerIndex(worker.workerIndex) === '0';\n\t}\n\n\tprivate assignTaskToWorker(worker: WorkerConnection, task: TaskPayload) {\n\t\tlet method = this._methodManager.getMethod(task.method);\n\n\t\tif (!method) {\n\t\t\tconsole.error('Failed to send task to worker - Could not find method:', task.method);\n\t\t\tthis._taskTimings.delete(task.taskId);\n\t\t\treturn;\n\t\t}\n\n\t\tconst dispatchedAt = Date.now();\n\t\tconst timing = this._taskTimings.get(task.taskId) || { queuedAt: dispatchedAt };\n\t\ttiming.dispatchedAt = dispatchedAt;\n\t\ttiming.method = task.method;\n\t\ttiming.messageId = task.messageId;\n\t\ttiming.userContext = task.userContext;\n\t\tthis._taskTimings.set(task.taskId, timing);\n\n\t\tworker.activeTasks.push({\n\t\t\ttaskId: task.taskId,\n\t\t\tweight: method && method.workerTaskWeight ? method.workerTaskWeight : 1,\n\t\t\tmethod: task.method,\n\t\t\tstartedAt: dispatchedAt,\n\t\t\tmessageId: task.messageId,\n\t\t\tuserContext: task.userContext\n\t\t});\n\t\tthis._debugNoWorkerTaskIds.delete(task.taskId);\n\n\t\tlet payload: TaskPayload = {\n\t\t\ttype: 'task',\n\t\t\ttaskId: task.taskId,\n\t\t\tmessageId: task.messageId,\n\t\t\tmethod: task.method,\n\t\t\tparams: task.params,\n\t\t\tuserContext: task.userContext || {},\n\t\t\tqueuedAt: timing.queuedAt,\n\t\t\tdispatchedAt\n\t\t};\n\n\t\tlet timeoutHandle = setTimeout(() => {\n\t\t\tlet pending = this._pendingTasks.get(task.taskId);\n\t\t\tconst timeoutAt = Date.now();\n\t\t\tconst queuedAt = timing.queuedAt;\n\t\t\tconst queueWaitMs = queuedAt ? round(dispatchedAt - queuedAt) : null;\n\t\t\tconst dispatchToTimeoutMs = round(timeoutAt - dispatchedAt);\n\n\t\t\tif (pending) {\n\t\t\t\tif (pending.promise) {\n\t\t\t\t\tpending.promise.reject('Task timed out after 2m in WorkerDispatcherManager for method: ' + task.method);\n\t\t\t\t}\n\n\t\t\t\tthis._pendingTasks.delete(task.taskId);\n\t\t\t}\n\n\t\t\tthis.logWorkerEvent('workerTaskTimeout', {\n\t\t\t\ttaskId: task.taskId,\n\t\t\t\tmethod: task.method,\n\t\t\t\tmessageId: task.messageId,\n\t\t\t\tqueueWaitMs,\n\t\t\t\tdispatchToTimeoutMs,\n\t\t\t\tuserContext: task.userContext,\n\t\t\t\tworker: {\n\t\t\t\t\tid: worker.id,\n\t\t\t\t\tindex: worker.workerIndex,\n\t\t\t\t\tinstance: worker.workerInstance\n\t\t\t\t},\n\t\t\t\tworkers: this._workers.map(a => a.activeTasks)\n\t\t\t});\n\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== task.taskId);\n\t\t\tthis._taskTimings.delete(task.taskId);\n\n\t\t\tif (task.userContext && task.userContext.id_ws) {\n\t\t\t\tlet timeoutRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: task.messageId,\n\t\t\t\t\thasError: true,\n\t\t\t\t\tdata: 'Task timed out after 2m in WorkerDispatcherManager for method: ' + task.method\n\t\t\t\t};\n\n\t\t\t\tlet clientWS = this._websocketManager.getWebSocket(task.userContext.id_ws);\n\n\t\t\t\tif (clientWS) {\n\t\t\t\t\tthis._websocketManager.send(clientWS, timeoutRes);\n\t\t\t\t}\n\t\t\t}\n\t\t}, method.timeoutOverride || (1000 * 60 * 2));\n\n\t\t// If we already stored a promise for this task (from sendInternalPromise), add the timeout now\n\t\tlet existing = this._pendingTasks.get(task.taskId);\n\t\tif (!existing) {\n\t\t\texisting = { timeout: null, method: task.method };\n\t\t}\n\t\telse {\n\t\t\texisting.method = task.method;\n\t\t}\n\n\t\texisting.timeout = timeoutHandle;\n\t\tthis._pendingTasks.set(task.taskId, existing);\n\n\t\ttry {\n\t\t\tthis.sendWorkerPayload(worker.ws, payload);\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Failed to send task to worker:', err);\n\n\t\t\tclearTimeout(timeoutHandle);\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== task.taskId);\n\n\t\t\t// Put task back in front\n\t\t\tthis._taskQueue.unshift(task);\n\t\t\tthis.dispatchQueue();\n\t\t}\n\t}\n\n\tprivate logNoWorkerAvailability() {\n\t\tif (!this.shouldDebug()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst workers = this._workers.map(worker => ({\n\t\t\tid: worker.id,\n\t\t\tindex: this.normalizeWorkerIndex(worker.workerIndex),\n\t\t\tinstance: this.normalizeWorkerIndex(worker.workerInstance),\n\t\t\tactiveTasks: worker.activeTasks.length\n\t\t}));\n\n\t\tfor (const task of this._taskQueue) {\n\t\t\tconst method = this._methodManager.getMethod(task.method);\n\t\t\tconst targetWorkerIndex = this.normalizeWorkerIndex(method?.targetWorkerIndex);\n\t\t\tconst targetWorkerInstance = this.normalizeWorkerIndex(method?.targetWorkerInstance);\n\n\t\t\tif (!targetWorkerIndex && !targetWorkerInstance) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (this._debugNoWorkerTaskIds.has(task.taskId)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst hasMatch = this._workers.some(worker =>\n\t\t\t\t(!targetWorkerIndex || this.normalizeWorkerIndex(worker.workerIndex) === targetWorkerIndex) &&\n\t\t\t\t(!targetWorkerInstance || this.normalizeWorkerIndex(worker.workerInstance) === targetWorkerInstance)\n\t\t\t);\n\n\t\t\tif (!hasMatch) {\n\t\t\t\tthis._debugNoWorkerTaskIds.add(task.taskId);\n\t\t\t\tconsole.warn(new Date(), '[WorkerDispatcher] No matching worker for task', {\n\t\t\t\t\ttaskId: task.taskId,\n\t\t\t\t\tmethod: task.method,\n\t\t\t\t\ttargetWorkerIndex,\n\t\t\t\t\ttargetWorkerInstance,\n\t\t\t\t\tworkers\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate shouldDebug(): boolean {\n\t\treturn this._methodManager.getEnableDebug() || process.env.WORKER_DISPATCH_DEBUG === 'true';\n\t}\n\n\tprivate logWorkerEvent(event: string, details: Record<string, any>) {\n\t\tconsole.log(this.safeStringify({\n\t\t\tts: new Date().toISOString(),\n\t\t\tevent,\n\t\t\t...details\n\t\t}));\n\t}\n\n\tprivate safeStringify(value: any): string {\n\t\ttry {\n\t\t\tconst seen = new WeakSet();\n\t\t\treturn JSON.stringify(value, (key, val) => {\n\t\t\t\tif (key === '__proto__') {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tif (typeof val === 'bigint') {\n\t\t\t\t\treturn val.toString();\n\t\t\t\t}\n\t\t\t\tif (val instanceof Error) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: val.name,\n\t\t\t\t\t\tmessage: val.message,\n\t\t\t\t\t\tstack: val.stack\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (val && typeof val === 'object') {\n\t\t\t\t\tif (seen.has(val)) {\n\t\t\t\t\t\treturn '[Circular]';\n\t\t\t\t\t}\n\t\t\t\t\tseen.add(val);\n\t\t\t\t}\n\t\t\t\treturn val;\n\t\t\t});\n\t\t}\n\t\tcatch (err) {\n\t\t\treturn JSON.stringify({\n\t\t\t\terror: 'safeStringifyFailed',\n\t\t\t\tmessage: err?.message || String(err)\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Handle messages coming back from a worker (like 'taskComplete').\n\t */\n\tpublic handleWorkerMessage(workerId: string, rawMessage: WebSocket.RawData) {\n\t\tlet data: TaskResponse;\n\n\t\ttry {\n\t\t\tif (typeof rawMessage === 'string') {\n\t\t\t\tdata = JSON.parse(rawMessage, dateReviver);\n\t\t\t}\n\t\t\telse if (Buffer.isBuffer(rawMessage)) {\n\t\t\t\tdata = unpack(rawMessage);\n\t\t\t}\n\t\t\telse if (Array.isArray(rawMessage)) {\n\t\t\t\tconst chunks = rawMessage as unknown as ReadonlyArray<Uint8Array>;\n\t\t\t\tdata = unpack(Buffer.concat(chunks));\n\t\t\t}\n\t\t\telse if (rawMessage instanceof ArrayBuffer) {\n\t\t\t\tdata = unpack(Buffer.from(rawMessage));\n\t\t\t}\n\t\t\telse if (ArrayBuffer.isView(rawMessage)) {\n\t\t\t\tconst view = rawMessage as NodeJS.ArrayBufferView;\n\t\t\t\tdata = unpack(Buffer.from(view.buffer, view.byteOffset, view.byteLength));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.error('Unsupported worker message type received:', typeof rawMessage);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Failed to parse worker message:', err);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.type === 'taskComplete') {\n\t\t\tlet worker = this._workers.find(x => x.id === workerId);\n\n\t\t\tif (!worker) {\n\t\t\t\tconsole.error('Unknown worker for taskComplete:', workerId);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet { taskId, messageId, error, result } = data;\n\t\t\tlet unpackedResult = result;\n\t\t\tconst timing = this._taskTimings.get(taskId);\n\t\t\tconst completedAt = Date.now();\n\t\t\tconst dispatchedAt = timing?.dispatchedAt;\n\t\t\tconst queuedAt = timing?.queuedAt;\n\t\t\tconst dispatchToCompleteMs = dispatchedAt ? round(completedAt - dispatchedAt) : null;\n\t\t\tconst queueWaitMs = queuedAt && dispatchedAt ? round(dispatchedAt - queuedAt) : null;\n\t\t\tconst totalMs = queuedAt ? round(completedAt - queuedAt) : null;\n\t\t\tconst packedBytes = data['packedResult'] ? data['packedResult'].length : null;\n\n\t\t\tlet pendingTask = this._pendingTasks.get(taskId);\n\t\t\tconst resolveRaw = !!pendingTask?.resolveRaw;\n\n\t\t\tif (!error && !resolveRaw && unpackedResult === null && data['packedResult']) {\n\t\t\t\ttry {\n\t\t\t\t\tunpackedResult = unpack(data['packedResult']);\n\t\t\t\t}\n\t\t\t\tcatch (err) {\n\t\t\t\t\tconsole.error('Failed to unpack worker result', err);\n\t\t\t\t}\n\t\t\t}\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== taskId);\n\t\t\tthis._taskTimings.delete(taskId);\n\n\t\t\tif (error || (dispatchToCompleteMs !== null && dispatchToCompleteMs >= this.WORKER_TASK_LOG_THRESHOLD_MS)) {\n\t\t\t\tthis.logWorkerEvent('workerTaskComplete', {\n\t\t\t\t\ttaskId,\n\t\t\t\t\tmethod: pendingTask?.method,\n\t\t\t\t\tmessageId,\n\t\t\t\t\terror,\n\t\t\t\t\tdispatchToCompleteMs,\n\t\t\t\t\tqueueWaitMs,\n\t\t\t\t\ttotalMs,\n\t\t\t\t\tpackedBytes,\n\t\t\t\t\tuserContext: timing?.userContext,\n\t\t\t\t\tworker: {\n\t\t\t\t\t\tid: worker.id,\n\t\t\t\t\t\tindex: worker.workerIndex,\n\t\t\t\t\t\tinstance: worker.workerInstance\n\t\t\t\t\t},\n\t\t\t\t\tqueue: this.getQueueSnapshot()\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (pendingTask) {\n\t\t\t\tif (pendingTask.promise) {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tpendingTask.promise.reject(unpackedResult);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tpendingTask.promise.resolve(resolveRaw ? data : unpackedResult);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tclearTimeout(pendingTask.timeout);\n\t\t\t\tthis._pendingTasks.delete(taskId);\n\t\t\t}\n\n\t\t\t// Look up original request if it came from a client\n\t\t\tlet clientReqId = this._clientRequests[taskId];\n\n\t\t\tif (clientReqId) {\n\t\t\t\tlet res: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: result\n\t\t\t\t};\n\n\t\t\t\tif (error) {\n\t\t\t\t\tres.hasError = true;\n\t\t\t\t\tres.data = result;\n\t\t\t\t}\n\n\t\t\t\tlet clientReqWS = this._websocketManager.getWebSocket(clientReqId);\n\n\t\t\t\tif (clientReqWS) {\n\t\t\t\t\tif (!error && data['packedResult']) {\n\t\t\t\t\t\tthis._websocketManager.sendPackedBuffer(clientReqWS, messageId, false, data['packedResult'], data['encoding'] || 'msgpack');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._websocketManager.send(clientReqWS, res);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._clientRequests[taskId]) {\n\t\t\t\t\tdelete this._clientRequests[taskId];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Try to dispatch more from the queue\n\t\t\tif (this._taskQueue.length) {\n\t\t\t\tthis.dispatchQueue();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic sendWorkerPayload(ws: WebSocket.WebSocket, payload: TaskPayload | string) {\n\t\tif (!ws) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (ws.readyState !== ws.OPEN) {\n\t\t\tif (typeof payload !== 'string') {\n\t\t\t\tconst task = payload;\n\n\t\t\t\tthis._taskQueue.unshift(task);\n\t\t\t\tthis.dispatchQueue();\n\n\t\t\t\tthis.disconnectWorker(ws['id_worker']);\n\t\t\t\tws.close();\n\n\t\t\tlet pendingTask = this._pendingTasks.get(task.taskId);\n\n\t\t\tif (pendingTask) {\n\t\t\t\tclearTimeout(pendingTask.timeout);\n\t\t\t\tthis._pendingTasks.delete(task.taskId);\n\n\t\t\t\tif (pendingTask.promise) {\n\t\t\t\t\tpendingTask.promise.reject('Worker socket not open.');\n\t\t\t\t}\n\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.disconnectWorker(ws['id_worker']);\n\t\t\t\tws.close();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (typeof payload === 'string') {\n\t\t\ttry {\n\t\t\t\tws.send(payload);\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tthis.disconnectWorker(ws['id_worker']);\n\t\t\t\tws.close();\n\t\t\t\tconsole.error('Failed to send worker payload:', err);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst task = payload;\n\t\tconst payloadBuffer = pack(task);\n\n\t\ttry {\n\t\t\tws.send(payloadBuffer);\n\t\t}\n\t\tcatch (err) {\n\t\t\tthis._taskQueue.unshift(task);\n\t\t\tthis.dispatchQueue();\n\n\t\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sending to Server', task);\n\t\t\t}\n\n\t\t\tthis.disconnectWorker(ws['id_worker']);\n\t\t\tws.close();\n\t\t\tconsole.error('Failed to send worker response:', err);\n\n\t\t\tlet pendingTask = this._pendingTasks.get(task.taskId);\n\n\t\t\tif (pendingTask) {\n\t\t\t\tclearTimeout(pendingTask.timeout);\n\t\t\t\tthis._pendingTasks.delete(task.taskId);\n\n\t\t\t\tif (pendingTask.promise) {\n\t\t\t\t\tpendingTask.promise.reject('Failed to send worker response: ' + err?.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../src/managers/worker-dispatcher.manager.ts"],"names":[],"mappings":"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","file":"worker-dispatcher.manager.js","sourcesContent":["import * as WebSocket from 'ws';\nimport { ServerResponseModel, TaskPayload, TaskResponse } from '../models/server-message.model';\nimport { dateReviver, objectIdHexString, round } from '../util/common';\nimport { MethodManager } from './method.manager';\nimport { WebSocketManager } from './websocket.manager';\nimport { pack, unpack } from 'msgpackr';\n\nexport interface WorkerConnection {\n\tid: string;\n\tws: WebSocket.WebSocket;\n\tactiveTasks: {\n\t\ttaskId: string;\n\t\tweight: number;\n\t\tmethod?: string;\n\t\tstartedAt?: number;\n\t\tmessageId?: number;\n\t\tuserContext?: { id_user?: string; user?: string; id_ws?: string };\n\t}[];\n\tworkerIndex?: string;\n\tworkerInstance?: string;\n}\n\ninterface PendingTask {\n\ttimeout: NodeJS.Timeout;\n\tpromise?: {\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tresolve: (value: any) => void;\n\t\t// eslint-disable-next-line no-unused-vars\n\t\treject: (reason?: any) => void;\n\t};\n\tmethod?: string;\n\tresolveRaw?: boolean;\n}\n\nexport class WorkerDispatcherManager {\n\tprivate _websocketManager: WebSocketManager;\n\tprivate _methodManager: MethodManager;\n\tprivate _workers: WorkerConnection[] = [];\n\tprivate _taskQueue: TaskPayload[] = [];\n\tprivate _clientRequests: { [taskId: string]: string } = {};\n\tprivate _pendingTasks: Map<string, PendingTask> = new Map();\n\tprivate _debugNoWorkerTaskIds: Set<string> = new Set();\n\tprivate _taskTimings: Map<string, {\n\t\tqueuedAt: number;\n\t\tdispatchedAt?: number;\n\t\tmethod?: string;\n\t\tmessageId?: number;\n\t\tuserContext?: { id_user?: string; user?: string; id_ws?: string };\n\t}> = new Map();\n\n\tprivate MAX_CONCURRENCY = 10;\n\tprivate WORKER_TASK_LOG_THRESHOLD_MS = 200;\n\tprivate _workerTaskDebug = false;\n\n\tconstructor() {}\n\n\tstatic create(websocketManager: WebSocketManager, methodManager: MethodManager) {\n\t\tconst workerDispatcherManager = new WorkerDispatcherManager();\n\t\tworkerDispatcherManager.initialize(websocketManager, methodManager);\n\t\treturn workerDispatcherManager;\n\t}\n\n\tpublic initialize(websocketManager: WebSocketManager, methodManager: MethodManager) {\n\t\tthis._websocketManager = websocketManager;\n\t\tthis._methodManager = methodManager;\n\t\tthis._workerTaskDebug = this.parseDebugFlag(process.env.WORKER_TASK_DEBUG ?? process.env.WORKER_DISPATCH_DEBUG);\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\tpublic isSafeShutdown() {\n\t\treturn !this._taskQueue.length && !this._pendingTasks.size;\n\t}\n\n\tpublic addWorker(ws: WebSocket.WebSocket) {\n\t\tthis._workers.push({\n\t\t\tid: ws['id_worker'],\n\t\t\tws: ws,\n\t\t\tactiveTasks: [],\n\t\t\tworkerIndex: ws['workerIndex'],\n\t\t\tworkerInstance: ws['workerInstance']\n\t\t});\n\n\t\tsetInterval(() => {\n\t\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.log(JSON.stringify(this._workers.map(a => {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: a.id,\n\t\t\t\t\t\tactiveTasks: a.activeTasks\n\t\t\t\t\t}\n\t\t\t\t}), null, 2));\n\t\t\t}\n\t\t}, 5000);\n\n\t\tif (this._taskQueue.length) {\n\t\t\tthis.dispatchQueue();\n\t\t}\n\t}\n\n\tpublic disconnectWorker(workerId: string) {\n\t\tthis._workers = this._workers.filter(w => w.id !== workerId);\n\t}\n\n\tpublic hasWorkers() {\n\t\treturn this._workers.length > 0;\n\t}\n\n\tpublic getQueueSnapshot() {\n\t\tconst activeTasks = this._workers.reduce((total, worker) => total + (worker.activeTasks ? worker.activeTasks.length : 0), 0);\n\t\treturn {\n\t\t\tqueueDepth: this._taskQueue.length,\n\t\t\tpendingTasks: this._pendingTasks.size,\n\t\t\tworkerCount: this._workers.length,\n\t\t\tactiveTasks,\n\t\t\tworkers: this._workers.map(worker => ({\n\t\t\t\tid: worker.id,\n\t\t\t\tindex: worker.workerIndex,\n\t\t\t\tinstance: worker.workerInstance,\n\t\t\t\tactiveTasks: worker.activeTasks ? worker.activeTasks.length : 0\n\t\t\t}))\n\t\t};\n\t}\n\n\tpublic hasWorkersForMethod(methodName: string) {\n\t\tif (!this._workers.length) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst method = this._methodManager.getMethod(methodName);\n\t\tconst targetWorkerIndex = this.normalizeWorkerIndex(method?.targetWorkerIndex);\n\t\tconst targetWorkerInstance = this.normalizeWorkerIndex(method?.targetWorkerInstance);\n\n\t\tif (!targetWorkerIndex && !targetWorkerInstance) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn this._workers.some(worker =>\n\t\t\t(!targetWorkerIndex || this.normalizeWorkerIndex(worker.workerIndex) === targetWorkerIndex) &&\n\t\t\t(!targetWorkerInstance || this.normalizeWorkerIndex(worker.workerInstance) === targetWorkerInstance)\n\t\t);\n\t}\n\n\t/**\n\t * Add a new task to our in-memory queue and try to dispatch.\n\t */\n\tpublic sendClientTask(messageId: number, method: string, params: any[], userContext?: { id_user?: string; user?: string; id_ws?: string }) {\n\t\tlet taskId = 'task-' + objectIdHexString();\n\t\tconst queuedAt = Date.now();\n\n\t\tthis._taskQueue.push({\n\t\t\ttype: 'task',\n\t\t\ttaskId,\n\t\t\tmessageId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tuserContext,\n\t\t\tqueuedAt\n\t\t});\n\n\t\tthis._taskTimings.set(taskId, {\n\t\t\tqueuedAt,\n\t\t\tmethod,\n\t\t\tmessageId,\n\t\t\tuserContext\n\t\t});\n\n\t\tif (userContext && userContext.id_ws) {\n\t\t\tthis._clientRequests[taskId] = userContext.id_ws;\n\t\t}\n\n\t\tif (this.shouldDebug()) {\n\t\t\tthis.logWorkerEvent('workerTaskQueued', {\n\t\t\t\ttaskId,\n\t\t\t\tmethod,\n\t\t\t\tmessageId,\n\t\t\t\tpriority: method === 'runPublication' ? 'publication' : 'method',\n\t\t\t\tqueueDepth: this._taskQueue.length,\n\t\t\t\tuserContext\n\t\t\t});\n\t\t}\n\n\t\tthis.dispatchQueue();\n\t}\n\n\t/**\n\t * Same as sendInternalTask but returns a Promise so you can `await` it.\n\t */\n\tpublic sendInternalPromise(method: string, params: any[] = []): Promise<any> {\n\t\tif (!Array.isArray(params)) {\n\t\t\tparams = [params];\n\t\t}\n\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet taskId = 'task-' + objectIdHexString();\n\t\t\tconst queuedAt = Date.now();\n\n\t\t\tthis._taskQueue.push({\n\t\t\t\ttype: 'task',\n\t\t\t\ttaskId,\n\t\t\t\tmethod,\n\t\t\t\tparams,\n\t\t\t\tmessageId: 0,\n\t\t\t\tuserContext: {\n\t\t\t\t\tuser: 'Internal System'\n\t\t\t\t},\n\t\t\t\tqueuedAt\n\t\t\t});\n\n\t\t\tthis._taskTimings.set(taskId, {\n\t\t\t\tqueuedAt,\n\t\t\t\tmethod,\n\t\t\t\tmessageId: 0,\n\t\t\t\tuserContext: { user: 'Internal System' }\n\t\t\t});\n\n\t\t\tthis._pendingTasks.set(taskId, {\n\t\t\t\ttimeout: null,\n\t\t\t\tpromise: { resolve, reject }\n\t\t\t});\n\n\t\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Send Internal Promise', this._taskQueue);\n\t\t\t}\n\n\t\t\tif (this.shouldDebug()) {\n\t\t\t\tthis.logWorkerEvent('workerTaskQueued', {\n\t\t\t\t\ttaskId,\n\t\t\t\t\tmethod,\n\t\t\t\t\tmessageId: 0,\n\t\t\t\t\tpriority: method === 'runPublication' ? 'publication' : 'method',\n\t\t\t\t\tqueueDepth: this._taskQueue.length,\n\t\t\t\t\tuserContext: { user: 'Internal System' }\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.dispatchQueue();\n\t\t});\n\t}\n\n\t/**\n\t * Send a task internally and resolve with the raw TaskResponse (includes packedResult/meta).\n\t */\n\tpublic sendInternalPromiseRaw(method: string, params: any[] = []): Promise<TaskResponse> {\n\t\tif (!Array.isArray(params)) {\n\t\t\tparams = [params];\n\t\t}\n\n\t\t// eslint-disable-next-line no-restricted-syntax\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tlet taskId = 'task-' + objectIdHexString();\n\t\t\tconst queuedAt = Date.now();\n\n\t\t\tthis._taskQueue.push({\n\t\t\t\ttype: 'task',\n\t\t\t\ttaskId,\n\t\t\t\tmethod,\n\t\t\t\tparams,\n\t\t\t\tmessageId: 0,\n\t\t\t\tuserContext: {\n\t\t\t\t\tuser: 'Internal System'\n\t\t\t\t},\n\t\t\t\tqueuedAt\n\t\t\t});\n\n\t\t\tthis._taskTimings.set(taskId, {\n\t\t\t\tqueuedAt,\n\t\t\t\tmethod,\n\t\t\t\tmessageId: 0,\n\t\t\t\tuserContext: { user: 'Internal System' }\n\t\t\t});\n\n\t\t\tthis._pendingTasks.set(taskId, {\n\t\t\t\ttimeout: null,\n\t\t\t\tpromise: { resolve, reject },\n\t\t\t\tresolveRaw: true\n\t\t\t});\n\n\t\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Send Internal Raw Promise', this._taskQueue);\n\t\t\t}\n\n\t\t\tif (this.shouldDebug()) {\n\t\t\t\tthis.logWorkerEvent('workerTaskQueued', {\n\t\t\t\t\ttaskId,\n\t\t\t\t\tmethod,\n\t\t\t\t\tmessageId: 0,\n\t\t\t\t\tpriority: method === 'runPublication' ? 'publication' : 'method',\n\t\t\t\t\tqueueDepth: this._taskQueue.length,\n\t\t\t\t\tuserContext: { user: 'Internal System' }\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.dispatchQueue();\n\t\t});\n\t}\n\n\t/**\n\t * Send a task internally without returning a promise.\n\t */\n\tpublic sendInternalTask(method: string, params = []) {\n\t\tif (!Array.isArray(params)) {\n\t\t\tparams = [params];\n\t\t}\n\n\t\tlet taskId = 'task-' + objectIdHexString();\n\t\tconst queuedAt = Date.now();\n\n\t\tthis._taskQueue.push({\n\t\t\ttype: 'task',\n\t\t\ttaskId,\n\t\t\tmethod,\n\t\t\tparams,\n\t\t\tmessageId: 0,\n\t\t\tuserContext: {\n\t\t\t\tuser: 'Internal System'\n\t\t\t},\n\t\t\tqueuedAt\n\t\t});\n\n\t\tthis._taskTimings.set(taskId, {\n\t\t\tqueuedAt,\n\t\t\tmethod,\n\t\t\tmessageId: 0,\n\t\t\tuserContext: { user: 'Internal System' }\n\t\t});\n\n\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\tconsole.log(new Date(), 'Send Internal Task', this._taskQueue);\n\t\t}\n\n\t\tif (this.shouldDebug()) {\n\t\t\tthis.logWorkerEvent('workerTaskQueued', {\n\t\t\t\ttaskId,\n\t\t\t\tmethod,\n\t\t\t\tmessageId: 0,\n\t\t\t\tpriority: method === 'runPublication' ? 'publication' : 'method',\n\t\t\t\tqueueDepth: this._taskQueue.length,\n\t\t\t\tuserContext: { user: 'Internal System' }\n\t\t\t});\n\t\t}\n\n\t\tthis.dispatchQueue();\n\t}\n\n\t/**\n\t * The main loop that assigns tasks from _taskQueue to any worker that has capacity.\n\t */\n\tprivate dispatchQueue() {\n\t\tif (!this._taskQueue.length) {\n\t\t\treturn;\n\t\t}\n\n\t\twhile (this._taskQueue.length > 0) {\n\t\t\tlet assigned = false;\n\n\t\t\tconst hasPublicationTask = this._taskQueue.some(task => task.method === 'runPublication');\n\n\t\t\tif (hasPublicationTask) {\n\t\t\t\tfor (let i = 0; i < this._taskQueue.length; i++) {\n\t\t\t\t\tlet task = this._taskQueue[i];\n\t\t\t\t\tif (task.method !== 'runPublication') {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tlet targetWorker = this.findWorkerForTask(task);\n\n\t\t\t\t\tif (targetWorker) {\n\t\t\t\t\t\tthis._taskQueue.splice(i, 1);\n\t\t\t\t\t\tthis.assignTaskToWorker(targetWorker, task);\n\t\t\t\t\t\tassigned = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!assigned) {\n\t\t\t\tfor (let i = 0; i < this._taskQueue.length; i++) {\n\t\t\t\t\tlet task = this._taskQueue[i];\n\t\t\t\t\tlet targetWorker = this.findWorkerForTask(task);\n\n\t\t\t\t\tif (targetWorker) {\n\t\t\t\t\t\tthis._taskQueue.splice(i, 1);\n\t\t\t\t\t\tthis.assignTaskToWorker(targetWorker, task);\n\t\t\t\t\t\tassigned = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!assigned) {\n\t\t\t\tthis.logNoWorkerAvailability();\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis.dispatchQueue();\n\t\t\t\t}, 25);\n\n\t\t\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\t\t\tconsole.log(new Date(), 'No Worker Available', JSON.stringify(this._workers, null, 2));\n\t\t\t\t}\n\n\t\t\t\treturn; // nothing can run right now due to per-worker limits\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns the worker with the fewest activeTasks that is under maxConcurrency and per-method limit.\n\t */\n\tprivate findWorkerForTask(task: TaskPayload): WorkerConnection | null {\n\t\tlet method = this._methodManager.getMethod(task.method);\n\t\tlet methodLimit = method && method.maxConcurrency && method.maxConcurrency > 0 ? method.maxConcurrency : null;\n\t\tlet methodLimitPerInstance = method && method.maxConcurrencyPerInstance && method.maxConcurrencyPerInstance > 0\n\t\t\t? method.maxConcurrencyPerInstance\n\t\t\t: null;\n\t\tlet targetWorkerIndex = this.normalizeWorkerIndex(method?.targetWorkerIndex);\n\t\tlet targetWorkerInstance = this.normalizeWorkerIndex(method?.targetWorkerInstance);\n\t\tconst preferNonZero = !targetWorkerIndex;\n\n\t\tlet candidates = this._workers.filter(x => x.activeTasks.length < this.MAX_CONCURRENCY);\n\t\tif (targetWorkerIndex) {\n\t\t\tcandidates = candidates.filter(worker => this.normalizeWorkerIndex(worker.workerIndex) === targetWorkerIndex);\n\t\t}\n\t\tif (targetWorkerInstance) {\n\t\t\tcandidates = candidates.filter(worker => this.normalizeWorkerIndex(worker.workerInstance) === targetWorkerInstance);\n\t\t}\n\t\tif (!candidates.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\tlet eligible = candidates.filter((worker) => {\n\t\t\tif (!methodLimit) {\n\t\t\t\tif (!methodLimitPerInstance) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (methodLimitPerInstance) {\n\t\t\t\tconst currentInstance = worker.activeTasks.filter(a => a.method === task.method).length;\n\t\t\t\tif (currentInstance >= methodLimitPerInstance) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!methodLimit) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tlet idx = worker.workerIndex || 'unknown';\n\t\t\tlet current = 0;\n\n\t\t\tthis._workers.forEach((w) => {\n\t\t\t\tif ((w.workerIndex || 'unknown') === idx) {\n\t\t\t\t\tcurrent += w.activeTasks.filter(a => a.method === task.method).length;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn current < methodLimit;\n\t\t});\n\n\t\tif (!eligible.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\teligible.sort((x, y) => {\n\t\t\tconst totalX = this.getWorkerLoad(x);\n\t\t\tconst totalY = this.getWorkerLoad(y);\n\t\t\tif (totalX !== totalY) {\n\t\t\t\treturn totalX - totalY;\n\t\t\t}\n\n\t\t\tif (preferNonZero) {\n\t\t\t\tconst xZero = this.isWorkerZero(x) ? 1 : 0;\n\t\t\t\tconst yZero = this.isWorkerZero(y) ? 1 : 0;\n\t\t\t\tif (xZero !== yZero) {\n\t\t\t\t\treturn xZero - yZero;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst idxX = this.normalizeWorkerIndex(x.workerIndex) || '';\n\t\t\tconst idxY = this.normalizeWorkerIndex(y.workerIndex) || '';\n\t\t\tconst idxCompare = idxX.localeCompare(idxY, undefined, { numeric: true, sensitivity: 'base' });\n\t\t\tif (idxCompare !== 0) {\n\t\t\t\treturn idxCompare;\n\t\t\t}\n\n\t\t\tconst instX = this.normalizeWorkerIndex(x.workerInstance) || '';\n\t\t\tconst instY = this.normalizeWorkerIndex(y.workerInstance) || '';\n\t\t\treturn instX.localeCompare(instY, undefined, { numeric: true, sensitivity: 'base' });\n\t\t});\n\n\t\treturn eligible[0];\n\t}\n\n\tprivate normalizeWorkerIndex(value?: string | number | null): string | null {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst normalized = String(value).trim();\n\t\treturn normalized.length ? normalized : null;\n\t}\n\n\tprivate getWorkerLoad(worker: WorkerConnection): number {\n\t\treturn worker.activeTasks.reduce((sum, task) => sum + task.weight, 0);\n\t}\n\n\tprivate isWorkerZero(worker: WorkerConnection): boolean {\n\t\treturn this.normalizeWorkerIndex(worker.workerIndex) === '0';\n\t}\n\n\tprivate assignTaskToWorker(worker: WorkerConnection, task: TaskPayload) {\n\t\tlet method = this._methodManager.getMethod(task.method);\n\n\t\tif (!method) {\n\t\t\tconsole.error('Failed to send task to worker - Could not find method:', task.method);\n\t\t\tthis._taskTimings.delete(task.taskId);\n\t\t\treturn;\n\t\t}\n\n\t\tconst dispatchedAt = Date.now();\n\t\tconst timing = this._taskTimings.get(task.taskId) || { queuedAt: dispatchedAt };\n\t\ttiming.dispatchedAt = dispatchedAt;\n\t\ttiming.method = task.method;\n\t\ttiming.messageId = task.messageId;\n\t\ttiming.userContext = task.userContext;\n\t\tthis._taskTimings.set(task.taskId, timing);\n\n\t\tworker.activeTasks.push({\n\t\t\ttaskId: task.taskId,\n\t\t\tweight: method && method.workerTaskWeight ? method.workerTaskWeight : 1,\n\t\t\tmethod: task.method,\n\t\t\tstartedAt: dispatchedAt,\n\t\t\tmessageId: task.messageId,\n\t\t\tuserContext: task.userContext\n\t\t});\n\t\tthis._debugNoWorkerTaskIds.delete(task.taskId);\n\n\t\tlet payload: TaskPayload = {\n\t\t\ttype: 'task',\n\t\t\ttaskId: task.taskId,\n\t\t\tmessageId: task.messageId,\n\t\t\tmethod: task.method,\n\t\t\tparams: task.params,\n\t\t\tuserContext: task.userContext || {},\n\t\t\tqueuedAt: timing.queuedAt,\n\t\t\tdispatchedAt\n\t\t};\n\n\t\tif (this.shouldDebug()) {\n\t\t\tthis.logWorkerEvent('workerTaskAssigned', {\n\t\t\t\ttaskId: task.taskId,\n\t\t\t\tmethod: task.method,\n\t\t\t\tmessageId: task.messageId,\n\t\t\t\tpriority: task.method === 'runPublication' ? 'publication' : 'method',\n\t\t\t\tworker: {\n\t\t\t\t\tid: worker.id,\n\t\t\t\t\tindex: worker.workerIndex,\n\t\t\t\t\tinstance: worker.workerInstance\n\t\t\t\t},\n\t\t\t\tqueueDepth: this._taskQueue.length\n\t\t\t});\n\t\t}\n\n\t\tlet timeoutHandle = setTimeout(() => {\n\t\t\tlet pending = this._pendingTasks.get(task.taskId);\n\t\t\tconst timeoutAt = Date.now();\n\t\t\tconst queuedAt = timing.queuedAt;\n\t\t\tconst queueWaitMs = queuedAt ? round(dispatchedAt - queuedAt) : null;\n\t\t\tconst dispatchToTimeoutMs = round(timeoutAt - dispatchedAt);\n\n\t\t\tif (pending) {\n\t\t\t\tif (pending.promise) {\n\t\t\t\t\tpending.promise.reject('Task timed out after 2m in WorkerDispatcherManager for method: ' + task.method);\n\t\t\t\t}\n\n\t\t\t\tthis._pendingTasks.delete(task.taskId);\n\t\t\t}\n\n\t\t\tthis.logWorkerEvent('workerTaskTimeout', {\n\t\t\t\ttaskId: task.taskId,\n\t\t\t\tmethod: task.method,\n\t\t\t\tmessageId: task.messageId,\n\t\t\t\tqueueWaitMs,\n\t\t\t\tdispatchToTimeoutMs,\n\t\t\t\tuserContext: task.userContext,\n\t\t\t\tworker: {\n\t\t\t\t\tid: worker.id,\n\t\t\t\t\tindex: worker.workerIndex,\n\t\t\t\t\tinstance: worker.workerInstance\n\t\t\t\t},\n\t\t\t\tworkers: this._workers.map(a => a.activeTasks)\n\t\t\t});\n\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== task.taskId);\n\t\t\tthis._taskTimings.delete(task.taskId);\n\n\t\t\tif (task.userContext && task.userContext.id_ws) {\n\t\t\t\tlet timeoutRes: ServerResponseModel = {\n\t\t\t\t\tmessageId: task.messageId,\n\t\t\t\t\thasError: true,\n\t\t\t\t\tdata: 'Task timed out after 2m in WorkerDispatcherManager for method: ' + task.method\n\t\t\t\t};\n\n\t\t\t\tlet clientWS = this._websocketManager.getWebSocket(task.userContext.id_ws);\n\n\t\t\t\tif (clientWS) {\n\t\t\t\t\tthis._websocketManager.send(clientWS, timeoutRes);\n\t\t\t\t}\n\t\t\t}\n\t\t}, method.timeoutOverride || (1000 * 60 * 2));\n\n\t\t// If we already stored a promise for this task (from sendInternalPromise), add the timeout now\n\t\tlet existing = this._pendingTasks.get(task.taskId);\n\t\tif (!existing) {\n\t\t\texisting = { timeout: null, method: task.method };\n\t\t}\n\t\telse {\n\t\t\texisting.method = task.method;\n\t\t}\n\n\t\texisting.timeout = timeoutHandle;\n\t\tthis._pendingTasks.set(task.taskId, existing);\n\n\t\ttry {\n\t\t\tthis.sendWorkerPayload(worker.ws, payload);\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Failed to send task to worker:', err);\n\n\t\t\tclearTimeout(timeoutHandle);\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== task.taskId);\n\n\t\t\t// Put task back in front\n\t\t\tthis._taskQueue.unshift(task);\n\t\t\tthis.dispatchQueue();\n\t\t}\n\t}\n\n\tprivate logNoWorkerAvailability() {\n\t\tif (!this.shouldDebug()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst workers = this._workers.map(worker => ({\n\t\t\tid: worker.id,\n\t\t\tindex: this.normalizeWorkerIndex(worker.workerIndex),\n\t\t\tinstance: this.normalizeWorkerIndex(worker.workerInstance),\n\t\t\tactiveTasks: worker.activeTasks.length\n\t\t}));\n\n\t\tfor (const task of this._taskQueue) {\n\t\t\tconst method = this._methodManager.getMethod(task.method);\n\t\t\tconst targetWorkerIndex = this.normalizeWorkerIndex(method?.targetWorkerIndex);\n\t\t\tconst targetWorkerInstance = this.normalizeWorkerIndex(method?.targetWorkerInstance);\n\n\t\t\tif (!targetWorkerIndex && !targetWorkerInstance) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (this._debugNoWorkerTaskIds.has(task.taskId)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst hasMatch = this._workers.some(worker =>\n\t\t\t\t(!targetWorkerIndex || this.normalizeWorkerIndex(worker.workerIndex) === targetWorkerIndex) &&\n\t\t\t\t(!targetWorkerInstance || this.normalizeWorkerIndex(worker.workerInstance) === targetWorkerInstance)\n\t\t\t);\n\n\t\t\tif (!hasMatch) {\n\t\t\t\tthis._debugNoWorkerTaskIds.add(task.taskId);\n\t\t\t\tconsole.warn(new Date(), '[WorkerDispatcher] No matching worker for task', {\n\t\t\t\t\ttaskId: task.taskId,\n\t\t\t\t\tmethod: task.method,\n\t\t\t\t\ttargetWorkerIndex,\n\t\t\t\t\ttargetWorkerInstance,\n\t\t\t\t\tworkers\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate shouldDebug(): boolean {\n\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (this._workerTaskDebug) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn this.parseDebugFlag(process.env.WORKER_TASK_DEBUG ?? process.env.WORKER_DISPATCH_DEBUG);\n\t}\n\n\tprivate logWorkerEvent(event: string, details: Record<string, any>) {\n\t\tconsole.log(this.safeStringify({\n\t\t\tts: new Date().toISOString(),\n\t\t\tevent,\n\t\t\t...details\n\t\t}));\n\t}\n\n\tprivate safeStringify(value: any): string {\n\t\ttry {\n\t\t\tconst seen = new WeakSet();\n\t\t\treturn JSON.stringify(value, (key, val) => {\n\t\t\t\tif (key === '__proto__') {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t\tif (typeof val === 'bigint') {\n\t\t\t\t\treturn val.toString();\n\t\t\t\t}\n\t\t\t\tif (val instanceof Error) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tname: val.name,\n\t\t\t\t\t\tmessage: val.message,\n\t\t\t\t\t\tstack: val.stack\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (val && typeof val === 'object') {\n\t\t\t\t\tif (seen.has(val)) {\n\t\t\t\t\t\treturn '[Circular]';\n\t\t\t\t\t}\n\t\t\t\t\tseen.add(val);\n\t\t\t\t}\n\t\t\t\treturn val;\n\t\t\t});\n\t\t}\n\t\tcatch (err) {\n\t\t\treturn JSON.stringify({\n\t\t\t\terror: 'safeStringifyFailed',\n\t\t\t\tmessage: err?.message || String(err)\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Handle messages coming back from a worker (like 'taskComplete').\n\t */\n\tpublic handleWorkerMessage(workerId: string, rawMessage: WebSocket.RawData) {\n\t\tlet data: TaskResponse;\n\n\t\ttry {\n\t\t\tif (typeof rawMessage === 'string') {\n\t\t\t\tdata = JSON.parse(rawMessage, dateReviver);\n\t\t\t}\n\t\t\telse if (Buffer.isBuffer(rawMessage)) {\n\t\t\t\tdata = unpack(rawMessage);\n\t\t\t}\n\t\t\telse if (Array.isArray(rawMessage)) {\n\t\t\t\tconst chunks = rawMessage as unknown as ReadonlyArray<Uint8Array>;\n\t\t\t\tdata = unpack(Buffer.concat(chunks));\n\t\t\t}\n\t\t\telse if (rawMessage instanceof ArrayBuffer) {\n\t\t\t\tdata = unpack(Buffer.from(rawMessage));\n\t\t\t}\n\t\t\telse if (ArrayBuffer.isView(rawMessage)) {\n\t\t\t\tconst view = rawMessage as NodeJS.ArrayBufferView;\n\t\t\t\tdata = unpack(Buffer.from(view.buffer, view.byteOffset, view.byteLength));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconsole.error('Unsupported worker message type received:', typeof rawMessage);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tcatch (err) {\n\t\t\tconsole.error('Failed to parse worker message:', err);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.type === 'taskComplete') {\n\t\t\tlet worker = this._workers.find(x => x.id === workerId);\n\n\t\t\tif (!worker) {\n\t\t\t\tconsole.error('Unknown worker for taskComplete:', workerId);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet { taskId, messageId, error, result } = data;\n\t\t\tlet unpackedResult = result;\n\t\t\tconst timing = this._taskTimings.get(taskId);\n\t\t\tconst completedAt = Date.now();\n\t\t\tconst dispatchedAt = timing?.dispatchedAt;\n\t\t\tconst queuedAt = timing?.queuedAt;\n\t\t\tconst dispatchToCompleteMs = dispatchedAt ? round(completedAt - dispatchedAt) : null;\n\t\t\tconst queueWaitMs = queuedAt && dispatchedAt ? round(dispatchedAt - queuedAt) : null;\n\t\t\tconst totalMs = queuedAt ? round(completedAt - queuedAt) : null;\n\t\t\tconst packedBytes = data['packedResult'] ? data['packedResult'].length : null;\n\n\t\t\tlet pendingTask = this._pendingTasks.get(taskId);\n\t\t\tconst resolveRaw = !!pendingTask?.resolveRaw;\n\n\t\t\tif (!error && !resolveRaw && unpackedResult === null && data['packedResult']) {\n\t\t\t\ttry {\n\t\t\t\t\tunpackedResult = unpack(data['packedResult']);\n\t\t\t\t}\n\t\t\t\tcatch (err) {\n\t\t\t\t\tconsole.error('Failed to unpack worker result', err);\n\t\t\t\t}\n\t\t\t}\n\t\t\tworker.activeTasks = worker.activeTasks.filter(a => a.taskId !== taskId);\n\t\t\tthis._taskTimings.delete(taskId);\n\n\t\t\tconst shouldLogComplete = !!error || (dispatchToCompleteMs !== null && dispatchToCompleteMs >= this.WORKER_TASK_LOG_THRESHOLD_MS);\n\t\t\tif (shouldLogComplete) {\n\t\t\t\tthis.logWorkerEvent('workerTaskComplete', {\n\t\t\t\t\ttaskId,\n\t\t\t\t\tmethod: pendingTask?.method,\n\t\t\t\t\tmessageId,\n\t\t\t\t\terror,\n\t\t\t\t\tdispatchToCompleteMs,\n\t\t\t\t\tqueueWaitMs,\n\t\t\t\t\ttotalMs,\n\t\t\t\t\tpackedBytes,\n\t\t\t\t\tuserContext: timing?.userContext,\n\t\t\t\t\tworker: {\n\t\t\t\t\t\tid: worker.id,\n\t\t\t\t\t\tindex: worker.workerIndex,\n\t\t\t\t\t\tinstance: worker.workerInstance\n\t\t\t\t\t},\n\t\t\t\t\tqueue: this.getQueueSnapshot()\n\t\t\t\t});\n\t\t\t}\n\t\t\telse if (this.shouldDebug()) {\n\t\t\t\tthis.logWorkerEvent('workerTaskCompleteDebug', {\n\t\t\t\t\ttaskId,\n\t\t\t\t\tmethod: pendingTask?.method,\n\t\t\t\t\tmessageId,\n\t\t\t\t\terror,\n\t\t\t\t\tdispatchToCompleteMs,\n\t\t\t\t\tqueueWaitMs,\n\t\t\t\t\ttotalMs,\n\t\t\t\t\tpackedBytes,\n\t\t\t\t\tuserContext: timing?.userContext,\n\t\t\t\t\tworker: {\n\t\t\t\t\t\tid: worker.id,\n\t\t\t\t\t\tindex: worker.workerIndex,\n\t\t\t\t\t\tinstance: worker.workerInstance\n\t\t\t\t\t},\n\t\t\t\t\tqueue: this.getQueueSnapshot()\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (pendingTask) {\n\t\t\t\tif (pendingTask.promise) {\n\t\t\t\t\tif (error) {\n\t\t\t\t\t\tpendingTask.promise.reject(unpackedResult);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tpendingTask.promise.resolve(resolveRaw ? data : unpackedResult);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tclearTimeout(pendingTask.timeout);\n\t\t\t\tthis._pendingTasks.delete(taskId);\n\t\t\t}\n\n\t\t\t// Look up original request if it came from a client\n\t\t\tlet clientReqId = this._clientRequests[taskId];\n\n\t\t\tif (clientReqId) {\n\t\t\t\tlet res: ServerResponseModel = {\n\t\t\t\t\tmessageId: messageId,\n\t\t\t\t\thasError: false,\n\t\t\t\t\tdata: result\n\t\t\t\t};\n\n\t\t\t\tif (error) {\n\t\t\t\t\tres.hasError = true;\n\t\t\t\t\tres.data = result;\n\t\t\t\t}\n\n\t\t\t\tlet clientReqWS = this._websocketManager.getWebSocket(clientReqId);\n\n\t\t\t\tif (clientReqWS) {\n\t\t\t\t\tif (!error && data['packedResult']) {\n\t\t\t\t\t\tthis._websocketManager.sendPackedBuffer(clientReqWS, messageId, false, data['packedResult'], data['encoding'] || 'msgpack');\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis._websocketManager.send(clientReqWS, res);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this._clientRequests[taskId]) {\n\t\t\t\t\tdelete this._clientRequests[taskId];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Try to dispatch more from the queue\n\t\t\tif (this._taskQueue.length) {\n\t\t\t\tthis.dispatchQueue();\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic sendWorkerPayload(ws: WebSocket.WebSocket, payload: TaskPayload | string) {\n\t\tif (!ws) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (ws.readyState !== ws.OPEN) {\n\t\t\tif (typeof payload !== 'string') {\n\t\t\t\tconst task = payload;\n\n\t\t\t\tthis._taskQueue.unshift(task);\n\t\t\t\tthis.dispatchQueue();\n\n\t\t\t\tthis.disconnectWorker(ws['id_worker']);\n\t\t\t\tws.close();\n\n\t\t\tlet pendingTask = this._pendingTasks.get(task.taskId);\n\n\t\t\tif (pendingTask) {\n\t\t\t\tclearTimeout(pendingTask.timeout);\n\t\t\t\tthis._pendingTasks.delete(task.taskId);\n\n\t\t\t\tif (pendingTask.promise) {\n\t\t\t\t\tpendingTask.promise.reject('Worker socket not open.');\n\t\t\t\t}\n\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.disconnectWorker(ws['id_worker']);\n\t\t\t\tws.close();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (typeof payload === 'string') {\n\t\t\ttry {\n\t\t\t\tws.send(payload);\n\t\t\t}\n\t\t\tcatch (err) {\n\t\t\t\tthis.disconnectWorker(ws['id_worker']);\n\t\t\t\tws.close();\n\t\t\t\tconsole.error('Failed to send worker payload:', err);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst task = payload;\n\t\tconst payloadBuffer = pack(task);\n\n\t\ttry {\n\t\t\tws.send(payloadBuffer);\n\t\t}\n\t\tcatch (err) {\n\t\t\tthis._taskQueue.unshift(task);\n\t\t\tthis.dispatchQueue();\n\n\t\t\tif (this._methodManager.getEnableDebug()) {\n\t\t\t\tconsole.log(new Date(), 'Sending to Server', task);\n\t\t\t}\n\n\t\t\tthis.disconnectWorker(ws['id_worker']);\n\t\t\tws.close();\n\t\t\tconsole.error('Failed to send worker response:', err);\n\n\t\t\tlet pendingTask = this._pendingTasks.get(task.taskId);\n\n\t\t\tif (pendingTask) {\n\t\t\t\tclearTimeout(pendingTask.timeout);\n\t\t\t\tthis._pendingTasks.delete(task.taskId);\n\n\t\t\t\tif (pendingTask.promise) {\n\t\t\t\t\tpendingTask.promise.reject('Failed to send worker response: ' + err?.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@resolveio/server-lib",
3
- "version": "20.14.22",
3
+ "version": "20.14.23",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "package": "./build_package.sh",