@resolveio/server-lib 20.15.9 → 20.16.0

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,6 +31,11 @@ export declare class WorkerDispatcherManager {
31
31
  private _taskTimings;
32
32
  private _dispatchRetryTimer;
33
33
  private _dispatchRetryDelayMs;
34
+ private _nonCodexReserve;
35
+ private _publicationWorkerIndexes;
36
+ private _publicationWorkerInstances;
37
+ private _codexWorkerIndexes;
38
+ private _codexWorkerInstances;
34
39
  private MAX_CONCURRENCY;
35
40
  private WORKER_TASK_LOG_THRESHOLD_MS;
36
41
  private WORKER_PUBLICATION_SLOW_MS;
@@ -39,6 +44,11 @@ export declare class WorkerDispatcherManager {
39
44
  static create(websocketManager: WebSocketManager, methodManager: MethodManager): WorkerDispatcherManager;
40
45
  initialize(websocketManager: WebSocketManager, methodManager: MethodManager): void;
41
46
  private parseDebugFlag;
47
+ private parsePositiveInt;
48
+ private parseWorkerSelector;
49
+ private hasWorkerSelector;
50
+ private workerMatchesSelector;
51
+ private resolveTaskQueue;
42
52
  private summarizePublicationValue;
43
53
  private getPublicationLogInfo;
44
54
  isSafeShutdown(): boolean;
@@ -36,6 +36,11 @@ var WorkerDispatcherManager = /** @class */ (function () {
36
36
  this._taskTimings = new Map();
37
37
  this._dispatchRetryTimer = null;
38
38
  this._dispatchRetryDelayMs = 25;
39
+ this._nonCodexReserve = 0;
40
+ this._publicationWorkerIndexes = null;
41
+ this._publicationWorkerInstances = null;
42
+ this._codexWorkerIndexes = null;
43
+ this._codexWorkerInstances = null;
39
44
  this.MAX_CONCURRENCY = 10;
40
45
  this.WORKER_TASK_LOG_THRESHOLD_MS = 200;
41
46
  this.WORKER_PUBLICATION_SLOW_MS = 20000;
@@ -47,7 +52,7 @@ var WorkerDispatcherManager = /** @class */ (function () {
47
52
  return workerDispatcherManager;
48
53
  };
49
54
  WorkerDispatcherManager.prototype.initialize = function (websocketManager, methodManager) {
50
- var _a, _b;
55
+ var _a, _b, _c;
51
56
  this._websocketManager = websocketManager;
52
57
  this._methodManager = methodManager;
53
58
  this._workerTaskDebug = this.parseDebugFlag((_a = process.env.WORKER_TASK_DEBUG) !== null && _a !== void 0 ? _a : process.env.WORKER_DISPATCH_DEBUG);
@@ -55,6 +60,19 @@ var WorkerDispatcherManager = /** @class */ (function () {
55
60
  if (!Number.isNaN(slowPublicationMs) && slowPublicationMs > 0) {
56
61
  this.WORKER_PUBLICATION_SLOW_MS = slowPublicationMs;
57
62
  }
63
+ this._nonCodexReserve = this.parsePositiveInt((_c = process.env.WORKER_NON_CODEX_RESERVE) !== null && _c !== void 0 ? _c : process.env.WORKER_RESERVED_SLOTS, 0);
64
+ this._publicationWorkerIndexes = this.parseWorkerSelector(process.env.PUBLICATION_WORKER_INDEX
65
+ || process.env.SUBSCRIPTION_WORKER_INDEX
66
+ || process.env.WORKER_PUBLICATION_INDEX);
67
+ this._publicationWorkerInstances = this.parseWorkerSelector(process.env.PUBLICATION_WORKER_INSTANCE
68
+ || process.env.SUBSCRIPTION_WORKER_INSTANCE
69
+ || process.env.WORKER_PUBLICATION_INSTANCE);
70
+ this._codexWorkerIndexes = this.parseWorkerSelector(process.env.AI_ASSISTANT_CODEX_WORKER_INDEX
71
+ || process.env.CODEX_WORKER_INDEX
72
+ || process.env.WORKER_CODEX_INDEX);
73
+ this._codexWorkerInstances = this.parseWorkerSelector(process.env.AI_ASSISTANT_CODEX_WORKER_INSTANCE
74
+ || process.env.CODEX_WORKER_INSTANCE
75
+ || process.env.WORKER_CODEX_INSTANCE);
58
76
  };
59
77
  WorkerDispatcherManager.prototype.parseDebugFlag = function (value) {
60
78
  if (value === true) {
@@ -72,6 +90,96 @@ var WorkerDispatcherManager = /** @class */ (function () {
72
90
  }
73
91
  return false;
74
92
  };
93
+ WorkerDispatcherManager.prototype.parsePositiveInt = function (value, fallback) {
94
+ var parsed = parseInt(value !== null && value !== void 0 ? value : '', 10);
95
+ if (Number.isNaN(parsed) || parsed < 0) {
96
+ return fallback;
97
+ }
98
+ return parsed;
99
+ };
100
+ WorkerDispatcherManager.prototype.parseWorkerSelector = function (value) {
101
+ var e_1, _a, e_2, _b, e_3, _c;
102
+ if (value === null || value === undefined) {
103
+ return null;
104
+ }
105
+ var parts = [];
106
+ if (Array.isArray(value)) {
107
+ try {
108
+ for (var value_1 = __values(value), value_1_1 = value_1.next(); !value_1_1.done; value_1_1 = value_1.next()) {
109
+ var item = value_1_1.value;
110
+ var entry = String(item !== null && item !== void 0 ? item : '').split(',');
111
+ try {
112
+ for (var entry_1 = (e_2 = void 0, __values(entry)), entry_1_1 = entry_1.next(); !entry_1_1.done; entry_1_1 = entry_1.next()) {
113
+ var chunk = entry_1_1.value;
114
+ var trimmed = String(chunk !== null && chunk !== void 0 ? chunk : '').trim();
115
+ if (trimmed) {
116
+ parts.push(trimmed);
117
+ }
118
+ }
119
+ }
120
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
121
+ finally {
122
+ try {
123
+ if (entry_1_1 && !entry_1_1.done && (_b = entry_1.return)) _b.call(entry_1);
124
+ }
125
+ finally { if (e_2) throw e_2.error; }
126
+ }
127
+ }
128
+ }
129
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
130
+ finally {
131
+ try {
132
+ if (value_1_1 && !value_1_1.done && (_a = value_1.return)) _a.call(value_1);
133
+ }
134
+ finally { if (e_1) throw e_1.error; }
135
+ }
136
+ }
137
+ else {
138
+ var entry = String(value !== null && value !== void 0 ? value : '').split(',');
139
+ try {
140
+ for (var entry_2 = __values(entry), entry_2_1 = entry_2.next(); !entry_2_1.done; entry_2_1 = entry_2.next()) {
141
+ var chunk = entry_2_1.value;
142
+ var trimmed = String(chunk !== null && chunk !== void 0 ? chunk : '').trim();
143
+ if (trimmed) {
144
+ parts.push(trimmed);
145
+ }
146
+ }
147
+ }
148
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
149
+ finally {
150
+ try {
151
+ if (entry_2_1 && !entry_2_1.done && (_c = entry_2.return)) _c.call(entry_2);
152
+ }
153
+ finally { if (e_3) throw e_3.error; }
154
+ }
155
+ }
156
+ if (!parts.length) {
157
+ return null;
158
+ }
159
+ return new Set(parts);
160
+ };
161
+ WorkerDispatcherManager.prototype.hasWorkerSelector = function (indexes, instances) {
162
+ return !!(indexes && indexes.size) || !!(instances && instances.size);
163
+ };
164
+ WorkerDispatcherManager.prototype.workerMatchesSelector = function (worker, indexes, instances) {
165
+ if (!this.hasWorkerSelector(indexes, instances)) {
166
+ return false;
167
+ }
168
+ var normalizedIndex = this.normalizeWorkerIndex(worker.workerIndex);
169
+ var normalizedInstance = this.normalizeWorkerIndex(worker.workerInstance);
170
+ var indexMatch = indexes ? (normalizedIndex ? indexes.has(normalizedIndex) : false) : true;
171
+ var instanceMatch = instances ? (normalizedInstance ? instances.has(normalizedInstance) : false) : true;
172
+ return indexMatch && instanceMatch;
173
+ };
174
+ WorkerDispatcherManager.prototype.resolveTaskQueue = function (methodName) {
175
+ var _a;
176
+ var method = (_a = this._methodManager) === null || _a === void 0 ? void 0 : _a.getMethod(methodName);
177
+ var queue = method === null || method === void 0 ? void 0 : method.workerQueue;
178
+ if (queue === 'publication' || queue === 'codex') {
179
+ return queue;
180
+ }
181
+ return 'default';
182
+ };
75
183
  WorkerDispatcherManager.prototype.summarizePublicationValue = function (value) {
76
184
  if (value === null || value === undefined) {
77
185
  return value;
@@ -374,41 +482,51 @@ var WorkerDispatcherManager = /** @class */ (function () {
374
482
  * The main loop that assigns tasks from _taskQueue to any worker that has capacity.
375
483
  */
376
484
  WorkerDispatcherManager.prototype.dispatchQueue = function () {
485
+ var e_4, _a;
486
+ var _this = this;
377
487
  if (!this._taskQueue.length) {
378
488
  return;
379
489
  }
380
490
  if (!this._workers.length) {
381
491
  return;
382
492
  }
493
+ var priorityMatchers = [
494
+ function (task) { return _this.resolveTaskQueue(task.method) === 'publication'; },
495
+ function (task) { return _this.resolveTaskQueue(task.method) === 'default'; },
496
+ function (task) { return _this.resolveTaskQueue(task.method) === 'codex'; }
497
+ ];
498
+ var tryAssignTask = function (matcher) {
499
+ for (var i = 0; i < _this._taskQueue.length; i++) {
500
+ var task = _this._taskQueue[i];
501
+ if (!matcher(task)) {
502
+ continue;
503
+ }
504
+ var targetWorker = _this.findWorkerForTask(task);
505
+ if (targetWorker) {
506
+ _this._taskQueue.splice(i, 1);
507
+ _this.assignTaskToWorker(targetWorker, task);
508
+ return true;
509
+ }
510
+ }
511
+ return false;
512
+ };
383
513
  while (this._taskQueue.length > 0) {
384
514
  var assigned = false;
385
- var hasPublicationTask = this._taskQueue.some(function (task) { return task.method === 'runPublication'; });
386
- if (hasPublicationTask) {
387
- for (var i = 0; i < this._taskQueue.length; i++) {
388
- var task = this._taskQueue[i];
389
- if (task.method !== 'runPublication') {
390
- continue;
391
- }
392
- var targetWorker = this.findWorkerForTask(task);
393
- if (targetWorker) {
394
- this._taskQueue.splice(i, 1);
395
- this.assignTaskToWorker(targetWorker, task);
515
+ try {
516
+ for (var priorityMatchers_1 = (e_4 = void 0, __values(priorityMatchers)), priorityMatchers_1_1 = priorityMatchers_1.next(); !priorityMatchers_1_1.done; priorityMatchers_1_1 = priorityMatchers_1.next()) {
517
+ var matcher = priorityMatchers_1_1.value;
518
+ if (tryAssignTask(matcher)) {
396
519
  assigned = true;
397
520
  break;
398
521
  }
399
522
  }
400
523
  }
401
- if (!assigned) {
402
- for (var i = 0; i < this._taskQueue.length; i++) {
403
- var task = this._taskQueue[i];
404
- var targetWorker = this.findWorkerForTask(task);
405
- if (targetWorker) {
406
- this._taskQueue.splice(i, 1);
407
- this.assignTaskToWorker(targetWorker, task);
408
- assigned = true;
409
- break;
410
- }
524
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
525
+ finally {
526
+ try {
527
+ if (priorityMatchers_1_1 && !priorityMatchers_1_1.done && (_a = priorityMatchers_1.return)) _a.call(priorityMatchers_1);
411
528
  }
529
+ finally { if (e_4) throw e_4.error; }
412
530
  }
413
531
  if (!assigned) {
414
532
  this.logNoWorkerAvailability();
@@ -437,14 +555,42 @@ var WorkerDispatcherManager = /** @class */ (function () {
437
555
  WorkerDispatcherManager.prototype.findWorkerForTask = function (task) {
438
556
  var _this = this;
439
557
  var method = this._methodManager.getMethod(task.method);
558
+ var taskQueue = this.resolveTaskQueue(task.method);
440
559
  var methodLimit = method && method.maxConcurrency && method.maxConcurrency > 0 ? method.maxConcurrency : null;
441
560
  var methodLimitPerInstance = method && method.maxConcurrencyPerInstance && method.maxConcurrencyPerInstance > 0
442
561
  ? method.maxConcurrencyPerInstance
443
562
  : null;
444
563
  var targetWorkerIndex = this.normalizeWorkerIndex(method === null || method === void 0 ? void 0 : method.targetWorkerIndex);
445
564
  var targetWorkerInstance = this.normalizeWorkerIndex(method === null || method === void 0 ? void 0 : method.targetWorkerInstance);
565
+ var hasExplicitTarget = !!targetWorkerIndex || !!targetWorkerInstance;
446
566
  var preferNonZero = !targetWorkerIndex;
447
567
  var candidates = this._workers.filter(function (x) { return x.activeTasks.length < _this.MAX_CONCURRENCY; });
568
+ var hasPublicationSelector = this.hasWorkerSelector(this._publicationWorkerIndexes, this._publicationWorkerInstances);
569
+ if (hasPublicationSelector && !hasExplicitTarget) {
570
+ if (taskQueue === 'publication') {
571
+ candidates = candidates.filter(function (worker) {
572
+ return _this.workerMatchesSelector(worker, _this._publicationWorkerIndexes, _this._publicationWorkerInstances);
573
+ });
574
+ }
575
+ else {
576
+ candidates = candidates.filter(function (worker) {
577
+ return !_this.workerMatchesSelector(worker, _this._publicationWorkerIndexes, _this._publicationWorkerInstances);
578
+ });
579
+ }
580
+ }
581
+ var hasCodexSelector = this.hasWorkerSelector(this._codexWorkerIndexes, this._codexWorkerInstances);
582
+ if (hasCodexSelector) {
583
+ if (taskQueue === 'codex') {
584
+ candidates = candidates.filter(function (worker) {
585
+ return _this.workerMatchesSelector(worker, _this._codexWorkerIndexes, _this._codexWorkerInstances);
586
+ });
587
+ }
588
+ else if (!hasExplicitTarget) {
589
+ candidates = candidates.filter(function (worker) {
590
+ return !_this.workerMatchesSelector(worker, _this._codexWorkerIndexes, _this._codexWorkerInstances);
591
+ });
592
+ }
593
+ }
448
594
  if (targetWorkerIndex) {
449
595
  candidates = candidates.filter(function (worker) { return _this.normalizeWorkerIndex(worker.workerIndex) === targetWorkerIndex; });
450
596
  }
@@ -481,6 +627,12 @@ var WorkerDispatcherManager = /** @class */ (function () {
481
627
  if (!eligible.length) {
482
628
  return null;
483
629
  }
630
+ if (taskQueue === 'codex' && this._nonCodexReserve > 0) {
631
+ eligible = eligible.filter(function (worker) { return (_this.MAX_CONCURRENCY - worker.activeTasks.length) > _this._nonCodexReserve; });
632
+ }
633
+ if (!eligible.length) {
634
+ return null;
635
+ }
484
636
  eligible.sort(function (x, y) {
485
637
  var totalX = _this.getWorkerLoad(x);
486
638
  var totalY = _this.getWorkerLoad(y);
@@ -643,7 +795,7 @@ var WorkerDispatcherManager = /** @class */ (function () {
643
795
  }
644
796
  };
645
797
  WorkerDispatcherManager.prototype.logNoWorkerAvailability = function () {
646
- var e_1, _a;
798
+ var e_5, _a;
647
799
  var _this = this;
648
800
  if (!this.shouldDebug()) {
649
801
  return;
@@ -686,12 +838,12 @@ var WorkerDispatcherManager = /** @class */ (function () {
686
838
  _loop_1(task);
687
839
  }
688
840
  }
689
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
841
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
690
842
  finally {
691
843
  try {
692
844
  if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
693
845
  }
694
- finally { if (e_1) throw e_1.error; }
846
+ finally { if (e_5) throw e_5.error; }
695
847
  }
696
848
  };
697
849
  WorkerDispatcherManager.prototype.shouldDebug = function () {
@@ -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\tparams?: any[];\n\t}> = new Map();\n\tprivate _dispatchRetryTimer: NodeJS.Timeout | null = null;\n\tprivate _dispatchRetryDelayMs = 25;\n\n\tprivate MAX_CONCURRENCY = 10;\n\tprivate WORKER_TASK_LOG_THRESHOLD_MS = 200;\n\tprivate WORKER_PUBLICATION_SLOW_MS = 20000;\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\tconst slowPublicationMs = parseInt(process.env.WORKER_PUBLICATION_SLOW_MS ?? '', 10);\n\t\tif (!Number.isNaN(slowPublicationMs) && slowPublicationMs > 0) {\n\t\t\tthis.WORKER_PUBLICATION_SLOW_MS = slowPublicationMs;\n\t\t}\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 summarizePublicationValue(value: any): any {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn value;\n\t\t}\n\n\t\tconst valueType = typeof value;\n\t\tif (valueType === 'string' || valueType === 'number' || valueType === 'boolean') {\n\t\t\treturn value;\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\treturn `[Array(${value.length})]`;\n\t\t}\n\n\t\tif (valueType === 'object') {\n\t\t\treturn `[Object keys=${Object.keys(value).length}]`;\n\t\t}\n\n\t\treturn `[${valueType}]`;\n\t}\n\n\tprivate getPublicationLogInfo(method?: string, params?: any[]): Record<string, any> | null {\n\t\tif (method !== 'runPublication' || !Array.isArray(params)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst publication = typeof params[0] === 'string' ? params[0] : null;\n\t\tconst subscriptionData = Array.isArray(params[1]) ? params[1] : [];\n\t\tconst userId = typeof params[2] === 'string' ? params[2] : null;\n\t\tconst subscriptionDataPreview = subscriptionData.slice(0, 3).map((item) => this.summarizePublicationValue(item));\n\n\t\treturn {\n\t\t\tpublication,\n\t\t\tsubscriptionDataCount: subscriptionData.length,\n\t\t\tsubscriptionDataPreview,\n\t\t\tuserId\n\t\t};\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\tparams\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\tconst publicationInfo = this.getPublicationLogInfo(method, params);\n\t\t\tconst logPayload: Record<string, any> = {\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\tif (publicationInfo) {\n\t\t\t\tObject.assign(logPayload, publicationInfo);\n\t\t\t}\n\t\t\tthis.logWorkerEvent('workerTaskQueued', logPayload);\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\tparams\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\tconst publicationInfo = this.getPublicationLogInfo(method, params);\n\t\t\t\tconst logPayload: Record<string, any> = {\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\tif (publicationInfo) {\n\t\t\t\t\tObject.assign(logPayload, publicationInfo);\n\t\t\t\t}\n\t\t\t\tthis.logWorkerEvent('workerTaskQueued', logPayload);\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\tparams\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\tconst publicationInfo = this.getPublicationLogInfo(method, params);\n\t\t\t\tconst logPayload: Record<string, any> = {\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\tif (publicationInfo) {\n\t\t\t\t\tObject.assign(logPayload, publicationInfo);\n\t\t\t\t}\n\t\t\t\tthis.logWorkerEvent('workerTaskQueued', logPayload);\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\tparams\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\tconst publicationInfo = this.getPublicationLogInfo(method, params);\n\t\t\tconst logPayload: Record<string, any> = {\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\tif (publicationInfo) {\n\t\t\t\tObject.assign(logPayload, publicationInfo);\n\t\t\t}\n\t\t\tthis.logWorkerEvent('workerTaskQueued', logPayload);\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\t\tif (!this._workers.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\tthis.scheduleDispatchRetry();\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\tprivate scheduleDispatchRetry(delayMs: number = this._dispatchRetryDelayMs) {\n\t\tif (this._dispatchRetryTimer) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._dispatchRetryTimer = setTimeout(() => {\n\t\t\tthis._dispatchRetryTimer = null;\n\t\t\tthis.dispatchQueue();\n\t\t}, delayMs);\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\tif (!timing.params) {\n\t\t\ttiming.params = task.params;\n\t\t}\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\tconst publicationInfo = this.getPublicationLogInfo(task.method, task.params);\n\t\t\tconst logPayload: Record<string, any> = {\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\tif (publicationInfo) {\n\t\t\t\tObject.assign(logPayload, publicationInfo);\n\t\t\t}\n\t\t\tthis.logWorkerEvent('workerTaskAssigned', logPayload);\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\tconst publicationInfo = this.getPublicationLogInfo(task.method, task.params);\n\t\t\tconst logPayload: Record<string, any> = {\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\t\t\tif (publicationInfo) {\n\t\t\t\tObject.assign(logPayload, publicationInfo);\n\t\t\t}\n\t\t\tthis.logWorkerEvent('workerTaskTimeout', logPayload);\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\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\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(\n\t\t\t\t\t\t\tclientReqWS,\n\t\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tdata['packedResult'],\n\t\t\t\t\t\t\tdata['encoding'] || 'msgpack',\n\t\t\t\t\t\t\t{ passThrough: true }\n\t\t\t\t\t\t);\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 !== WebSocket.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\n// eslint-disable-next-line no-unused-vars\ntype TaskMatcher = (task: TaskPayload) => boolean;\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\tparams?: any[];\n\t}> = new Map();\n\tprivate _dispatchRetryTimer: NodeJS.Timeout | null = null;\n\tprivate _dispatchRetryDelayMs = 25;\n\tprivate _nonCodexReserve = 0;\n\tprivate _publicationWorkerIndexes: Set<string> | null = null;\n\tprivate _publicationWorkerInstances: Set<string> | null = null;\n\tprivate _codexWorkerIndexes: Set<string> | null = null;\n\tprivate _codexWorkerInstances: Set<string> | null = null;\n\n\tprivate MAX_CONCURRENCY = 10;\n\tprivate WORKER_TASK_LOG_THRESHOLD_MS = 200;\n\tprivate WORKER_PUBLICATION_SLOW_MS = 20000;\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\tconst slowPublicationMs = parseInt(process.env.WORKER_PUBLICATION_SLOW_MS ?? '', 10);\n\t\tif (!Number.isNaN(slowPublicationMs) && slowPublicationMs > 0) {\n\t\t\tthis.WORKER_PUBLICATION_SLOW_MS = slowPublicationMs;\n\t\t}\n\t\tthis._nonCodexReserve = this.parsePositiveInt(\n\t\t\tprocess.env.WORKER_NON_CODEX_RESERVE ?? process.env.WORKER_RESERVED_SLOTS,\n\t\t\t0\n\t\t);\n\t\tthis._publicationWorkerIndexes = this.parseWorkerSelector(\n\t\t\tprocess.env.PUBLICATION_WORKER_INDEX\n\t\t\t|| process.env.SUBSCRIPTION_WORKER_INDEX\n\t\t\t|| process.env.WORKER_PUBLICATION_INDEX\n\t\t);\n\t\tthis._publicationWorkerInstances = this.parseWorkerSelector(\n\t\t\tprocess.env.PUBLICATION_WORKER_INSTANCE\n\t\t\t|| process.env.SUBSCRIPTION_WORKER_INSTANCE\n\t\t\t|| process.env.WORKER_PUBLICATION_INSTANCE\n\t\t);\n\t\tthis._codexWorkerIndexes = this.parseWorkerSelector(\n\t\t\tprocess.env.AI_ASSISTANT_CODEX_WORKER_INDEX\n\t\t\t|| process.env.CODEX_WORKER_INDEX\n\t\t\t|| process.env.WORKER_CODEX_INDEX\n\t\t);\n\t\tthis._codexWorkerInstances = this.parseWorkerSelector(\n\t\t\tprocess.env.AI_ASSISTANT_CODEX_WORKER_INSTANCE\n\t\t\t|| process.env.CODEX_WORKER_INSTANCE\n\t\t\t|| process.env.WORKER_CODEX_INSTANCE\n\t\t);\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 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 parseWorkerSelector(value: any): Set<string> | null {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst parts: string[] = [];\n\n\t\tif (Array.isArray(value)) {\n\t\t\tfor (const item of value) {\n\t\t\t\tconst entry = String(item ?? '').split(',');\n\t\t\t\tfor (const chunk of entry) {\n\t\t\t\t\tconst trimmed = String(chunk ?? '').trim();\n\t\t\t\t\tif (trimmed) {\n\t\t\t\t\t\tparts.push(trimmed);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tconst entry = String(value ?? '').split(',');\n\t\t\tfor (const chunk of entry) {\n\t\t\t\tconst trimmed = String(chunk ?? '').trim();\n\t\t\t\tif (trimmed) {\n\t\t\t\t\tparts.push(trimmed);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!parts.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn new Set(parts);\n\t}\n\n\tprivate hasWorkerSelector(indexes: Set<string> | null, instances: Set<string> | null): boolean {\n\t\treturn !!(indexes && indexes.size) || !!(instances && instances.size);\n\t}\n\n\tprivate workerMatchesSelector(worker: WorkerConnection, indexes: Set<string> | null, instances: Set<string> | null): boolean {\n\t\tif (!this.hasWorkerSelector(indexes, instances)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst normalizedIndex = this.normalizeWorkerIndex(worker.workerIndex);\n\t\tconst normalizedInstance = this.normalizeWorkerIndex(worker.workerInstance);\n\t\tconst indexMatch = indexes ? (normalizedIndex ? indexes.has(normalizedIndex) : false) : true;\n\t\tconst instanceMatch = instances ? (normalizedInstance ? instances.has(normalizedInstance) : false) : true;\n\n\t\treturn indexMatch && instanceMatch;\n\t}\n\n\tprivate resolveTaskQueue(methodName: string): 'publication' | 'codex' | 'default' {\n\t\tconst method = this._methodManager?.getMethod(methodName);\n\t\tconst queue = method?.workerQueue;\n\t\tif (queue === 'publication' || queue === 'codex') {\n\t\t\treturn queue;\n\t\t}\n\t\treturn 'default';\n\t}\n\n\tprivate summarizePublicationValue(value: any): any {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn value;\n\t\t}\n\n\t\tconst valueType = typeof value;\n\t\tif (valueType === 'string' || valueType === 'number' || valueType === 'boolean') {\n\t\t\treturn value;\n\t\t}\n\n\t\tif (Array.isArray(value)) {\n\t\t\treturn `[Array(${value.length})]`;\n\t\t}\n\n\t\tif (valueType === 'object') {\n\t\t\treturn `[Object keys=${Object.keys(value).length}]`;\n\t\t}\n\n\t\treturn `[${valueType}]`;\n\t}\n\n\tprivate getPublicationLogInfo(method?: string, params?: any[]): Record<string, any> | null {\n\t\tif (method !== 'runPublication' || !Array.isArray(params)) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst publication = typeof params[0] === 'string' ? params[0] : null;\n\t\tconst subscriptionData = Array.isArray(params[1]) ? params[1] : [];\n\t\tconst userId = typeof params[2] === 'string' ? params[2] : null;\n\t\tconst subscriptionDataPreview = subscriptionData.slice(0, 3).map((item) => this.summarizePublicationValue(item));\n\n\t\treturn {\n\t\t\tpublication,\n\t\t\tsubscriptionDataCount: subscriptionData.length,\n\t\t\tsubscriptionDataPreview,\n\t\t\tuserId\n\t\t};\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\tparams\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\tconst publicationInfo = this.getPublicationLogInfo(method, params);\n\t\t\tconst logPayload: Record<string, any> = {\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\tif (publicationInfo) {\n\t\t\t\tObject.assign(logPayload, publicationInfo);\n\t\t\t}\n\t\t\tthis.logWorkerEvent('workerTaskQueued', logPayload);\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\tparams\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\tconst publicationInfo = this.getPublicationLogInfo(method, params);\n\t\t\t\tconst logPayload: Record<string, any> = {\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\tif (publicationInfo) {\n\t\t\t\t\tObject.assign(logPayload, publicationInfo);\n\t\t\t\t}\n\t\t\t\tthis.logWorkerEvent('workerTaskQueued', logPayload);\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\tparams\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\tconst publicationInfo = this.getPublicationLogInfo(method, params);\n\t\t\t\tconst logPayload: Record<string, any> = {\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\tif (publicationInfo) {\n\t\t\t\t\tObject.assign(logPayload, publicationInfo);\n\t\t\t\t}\n\t\t\t\tthis.logWorkerEvent('workerTaskQueued', logPayload);\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\tparams\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\tconst publicationInfo = this.getPublicationLogInfo(method, params);\n\t\t\tconst logPayload: Record<string, any> = {\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\tif (publicationInfo) {\n\t\t\t\tObject.assign(logPayload, publicationInfo);\n\t\t\t}\n\t\t\tthis.logWorkerEvent('workerTaskQueued', logPayload);\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\t\tif (!this._workers.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst priorityMatchers: TaskMatcher[] = [\n\t\t\t(task) => this.resolveTaskQueue(task.method) === 'publication',\n\t\t\t(task) => this.resolveTaskQueue(task.method) === 'default',\n\t\t\t(task) => this.resolveTaskQueue(task.method) === 'codex'\n\t\t];\n\n\t\tconst tryAssignTask = (matcher: TaskMatcher): boolean => {\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\tif (!matcher(task)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\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\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t\twhile (this._taskQueue.length > 0) {\n\t\t\tlet assigned = false;\n\t\t\tfor (const matcher of priorityMatchers) {\n\t\t\t\tif (tryAssignTask(matcher)) {\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\tthis.scheduleDispatchRetry();\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\tprivate scheduleDispatchRetry(delayMs: number = this._dispatchRetryDelayMs) {\n\t\tif (this._dispatchRetryTimer) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._dispatchRetryTimer = setTimeout(() => {\n\t\t\tthis._dispatchRetryTimer = null;\n\t\t\tthis.dispatchQueue();\n\t\t}, delayMs);\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\tconst taskQueue = this.resolveTaskQueue(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 hasExplicitTarget = !!targetWorkerIndex || !!targetWorkerInstance;\n\t\tconst preferNonZero = !targetWorkerIndex;\n\n\t\tlet candidates = this._workers.filter(x => x.activeTasks.length < this.MAX_CONCURRENCY);\n\t\tconst hasPublicationSelector = this.hasWorkerSelector(this._publicationWorkerIndexes, this._publicationWorkerInstances);\n\t\tif (hasPublicationSelector && !hasExplicitTarget) {\n\t\t\tif (taskQueue === 'publication') {\n\t\t\t\tcandidates = candidates.filter(worker =>\n\t\t\t\t\tthis.workerMatchesSelector(worker, this._publicationWorkerIndexes, this._publicationWorkerInstances)\n\t\t\t\t);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcandidates = candidates.filter(worker =>\n\t\t\t\t\t!this.workerMatchesSelector(worker, this._publicationWorkerIndexes, this._publicationWorkerInstances)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst hasCodexSelector = this.hasWorkerSelector(this._codexWorkerIndexes, this._codexWorkerInstances);\n\t\tif (hasCodexSelector) {\n\t\t\tif (taskQueue === 'codex') {\n\t\t\t\tcandidates = candidates.filter(worker =>\n\t\t\t\t\tthis.workerMatchesSelector(worker, this._codexWorkerIndexes, this._codexWorkerInstances)\n\t\t\t\t);\n\t\t\t}\n\t\t\telse if (!hasExplicitTarget) {\n\t\t\t\tcandidates = candidates.filter(worker =>\n\t\t\t\t\t!this.workerMatchesSelector(worker, this._codexWorkerIndexes, this._codexWorkerInstances)\n\t\t\t\t);\n\t\t\t}\n\t\t}\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\tif (taskQueue === 'codex' && this._nonCodexReserve > 0) {\n\t\t\teligible = eligible.filter(worker => (this.MAX_CONCURRENCY - worker.activeTasks.length) > this._nonCodexReserve);\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\tif (!timing.params) {\n\t\t\ttiming.params = task.params;\n\t\t}\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\tconst publicationInfo = this.getPublicationLogInfo(task.method, task.params);\n\t\t\tconst logPayload: Record<string, any> = {\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\tif (publicationInfo) {\n\t\t\t\tObject.assign(logPayload, publicationInfo);\n\t\t\t}\n\t\t\tthis.logWorkerEvent('workerTaskAssigned', logPayload);\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\tconst publicationInfo = this.getPublicationLogInfo(task.method, task.params);\n\t\t\tconst logPayload: Record<string, any> = {\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\t\t\tif (publicationInfo) {\n\t\t\t\tObject.assign(logPayload, publicationInfo);\n\t\t\t}\n\t\t\tthis.logWorkerEvent('workerTaskTimeout', logPayload);\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\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\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(\n\t\t\t\t\t\t\tclientReqWS,\n\t\t\t\t\t\t\tmessageId,\n\t\t\t\t\t\t\tfalse,\n\t\t\t\t\t\t\tdata['packedResult'],\n\t\t\t\t\t\t\tdata['encoding'] || 'msgpack',\n\t\t\t\t\t\t\t{ passThrough: true }\n\t\t\t\t\t\t);\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 !== WebSocket.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"]}