nestworker 2.0.8 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +388 -117
  2. package/dist/core/worker.interfaces.d.ts +89 -10
  3. package/dist/core/worker.module.d.ts +21 -11
  4. package/dist/core/worker.module.js +38 -10
  5. package/dist/core/worker.module.js.map +1 -1
  6. package/dist/core/worker.pool.d.ts +26 -6
  7. package/dist/core/worker.pool.js +288 -103
  8. package/dist/core/worker.pool.js.map +1 -1
  9. package/dist/core/worker.service.d.ts +28 -74
  10. package/dist/core/worker.service.js +132 -79
  11. package/dist/core/worker.service.js.map +1 -1
  12. package/dist/decorators/worker-task.decorator.d.ts +7 -25
  13. package/dist/decorators/worker-task.decorator.js +5 -26
  14. package/dist/decorators/worker-task.decorator.js.map +1 -1
  15. package/dist/discovery/discovery.service.d.ts +2 -9
  16. package/dist/discovery/discovery.service.js +86 -21
  17. package/dist/discovery/discovery.service.js.map +1 -1
  18. package/dist/example/bench.d.ts +13 -0
  19. package/dist/example/bench.js +85 -0
  20. package/dist/example/bench.js.map +1 -0
  21. package/dist/example/main.js +14 -2
  22. package/dist/example/main.js.map +1 -1
  23. package/dist/health/worker.health.d.ts +46 -0
  24. package/dist/health/worker.health.js +77 -0
  25. package/dist/health/worker.health.js.map +1 -0
  26. package/dist/index.d.ts +6 -1
  27. package/dist/index.js +10 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/metrics/worker.metrics.d.ts +65 -0
  30. package/dist/metrics/worker.metrics.js +122 -0
  31. package/dist/metrics/worker.metrics.js.map +1 -0
  32. package/dist/worker/worker-runtime.js +139 -29
  33. package/dist/worker/worker-runtime.js.map +1 -1
  34. package/package.json +2 -1
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.WorkerPool = void 0;
7
7
  const node_worker_threads_1 = require("node:worker_threads");
8
+ const node_events_1 = require("node:events");
8
9
  const node_os_1 = __importDefault(require("node:os"));
9
10
  const node_path_1 = __importDefault(require("node:path"));
10
11
  const PRIORITY_WEIGHT = {
@@ -12,89 +13,141 @@ const PRIORITY_WEIGHT = {
12
13
  NORMAL: 2,
13
14
  LOW: 1,
14
15
  };
15
- class WorkerPool {
16
+ class WorkerPool extends node_events_1.EventEmitter {
16
17
  services;
17
18
  size;
19
+ shutdownTimeout;
18
20
  workers = [];
19
21
  idle = [];
22
+ warmingUp = new Set();
20
23
  queue = [];
21
24
  destroyed = false;
22
25
  active = new Map();
23
- constructor(services, size = node_os_1.default.cpus().length) {
26
+ /** Maps abortSignalId worker currently running that job */
27
+ signalWorkerMap = new Map();
28
+ proxyMap = new Map();
29
+ constructor(services, proxyInstances, size = node_os_1.default.cpus().length, shutdownTimeout = 30_000) {
30
+ super();
24
31
  this.services = services;
25
32
  this.size = size;
33
+ this.shutdownTimeout = shutdownTimeout;
34
+ for (const { propertyKey, instance } of proxyInstances) {
35
+ this.proxyMap.set(propertyKey, instance);
36
+ }
26
37
  for (let i = 0; i < this.size; i++) {
27
- const worker = this.spawnWorker();
28
- this.workers.push(worker);
29
- this.idle.push(worker);
38
+ this.spawnWorker();
30
39
  }
31
40
  }
32
- execute(job) {
33
- if (this.destroyed) {
41
+ execute(job, signal) {
42
+ if (this.destroyed)
34
43
  return Promise.reject(new Error('WorkerPool destroyed'));
35
- }
36
- return new Promise(async (resolve, reject) => {
44
+ return new Promise((resolve, reject) => {
45
+ // Reject immediately if already aborted
46
+ if (signal?.aborted) {
47
+ reject(new DOMException('Task aborted before enqueue', 'AbortError'));
48
+ return;
49
+ }
37
50
  const task = {
38
51
  job,
39
52
  resolve: resolve,
40
53
  reject,
54
+ attempts: 0,
55
+ signal,
41
56
  };
42
- await this.preemptIfNeeded(task);
43
- // ALWAYS enqueue first
44
- // otherwise priority is bypassed
57
+ if (signal) {
58
+ signal.addEventListener('abort', () => {
59
+ // Remove from queue if not yet dispatched
60
+ const idx = this.queue.indexOf(task);
61
+ if (idx >= 0) {
62
+ this.queue.splice(idx, 1);
63
+ reject(new DOMException('Task aborted', 'AbortError'));
64
+ return;
65
+ }
66
+ // Already running — send abort signal to worker
67
+ if (job.abortSignalId) {
68
+ const worker = this.signalWorkerMap.get(job.abortSignalId);
69
+ if (worker) {
70
+ try {
71
+ worker.postMessage({ type: 'abort', abortSignalId: job.abortSignalId });
72
+ }
73
+ catch { /* worker gone */
74
+ }
75
+ }
76
+ }
77
+ }, { once: true });
78
+ }
45
79
  this.enqueue(task);
46
- // process queue
47
80
  this.schedule();
48
81
  });
49
82
  }
50
- async preemptIfNeeded(incoming) {
51
- if (incoming.job.priority !== 'HIGH') {
52
- return false;
53
- }
54
- for (const [worker, running] of this.active) {
55
- if (running.priority === 'LOW') {
56
- // stop LOW task
57
- await worker.terminate();
58
- // requeue interrupted LOW task
59
- this.enqueue(running.task);
60
- // remove dead worker
61
- this.active.delete(worker);
62
- const idx = this.workers.indexOf(worker);
63
- if (idx >= 0) {
64
- this.workers.splice(idx, 1);
83
+ stats() {
84
+ return {
85
+ poolSize: this.size,
86
+ idle: this.idle.length,
87
+ busy: this.active.size,
88
+ queued: this.queue.length,
89
+ warmingUp: this.warmingUp.size,
90
+ };
91
+ }
92
+ spawnWorker() {
93
+ const worker = new node_worker_threads_1.Worker(node_path_1.default.resolve(__dirname, '../worker/worker-runtime.js'), { workerData: { services: this.services } });
94
+ this.workers.push(worker);
95
+ this.warmingUp.add(worker);
96
+ // ── Single persistent message listener ───────────────────────────────
97
+ // We used to add/remove a listener per dispatch — that allocated several
98
+ // closures and mutated the EventEmitter's listener array on every task.
99
+ // Instead we install one listener whose behaviour switches based on
100
+ // whether this worker is currently warming up or running a task.
101
+ const onMessage = (msg) => {
102
+ const message = msg;
103
+ if (this.warmingUp.has(worker)) {
104
+ if (message?.type !== 'worker:ready')
105
+ return;
106
+ this.warmingUp.delete(worker);
107
+ if (!this.destroyed) {
108
+ this.idle.push(worker);
109
+ this.schedule();
65
110
  }
66
- // create replacement worker
67
- const replacement = this.spawnWorker();
68
- this.workers.push(replacement);
69
- // dispatch HIGH immediately
70
- this.dispatch(replacement, incoming);
71
- return true;
111
+ return;
72
112
  }
73
- }
74
- return false;
113
+ // Spurious `worker:ready` after warmup → ignore.
114
+ if (message?.type === 'worker:ready')
115
+ return;
116
+ const running = this.active.get(worker);
117
+ if (!running)
118
+ return; // late message for an aborted/timed-out task
119
+ running.handler(message);
120
+ };
121
+ worker.on('message', onMessage);
122
+ worker.once('error', (err) => this.handleWorkerError(worker, err));
123
+ worker.once('exit', (code) => this.handleWorkerExit(worker, code));
124
+ return worker;
75
125
  }
76
126
  enqueue(task) {
77
127
  const weight = PRIORITY_WEIGHT[task.job.priority];
78
- let lo = 0;
79
- let hi = this.queue.length;
128
+ const q = this.queue;
129
+ const n = q.length;
130
+ // Fast path: empty queue, or tail has >= priority → just push (O(1)).
131
+ // This is by far the most common case under steady-state load.
132
+ if (n === 0 || PRIORITY_WEIGHT[q[n - 1].job.priority] >= weight) {
133
+ q.push(task);
134
+ return;
135
+ }
136
+ let lo = 0, hi = n;
80
137
  while (lo < hi) {
81
138
  const mid = (lo + hi) >>> 1;
82
- if (PRIORITY_WEIGHT[this.queue[mid].job.priority] < weight) {
139
+ if (PRIORITY_WEIGHT[q[mid].job.priority] < weight)
83
140
  hi = mid;
84
- }
85
- else {
141
+ else
86
142
  lo = mid + 1;
87
- }
88
143
  }
89
- this.queue.splice(lo, 0, task);
144
+ q.splice(lo, 0, task);
90
145
  }
91
146
  schedule() {
92
147
  if (this.destroyed)
93
148
  return;
94
- while (this.idle.length > 0 &&
95
- this.queue.length > 0) {
149
+ while (this.idle.length > 0 && this.queue.length > 0) {
96
150
  const worker = this.idle.pop();
97
- // highest priority task first
98
151
  const task = this.queue.shift();
99
152
  this.dispatch(worker, task);
100
153
  }
@@ -102,109 +155,241 @@ class WorkerPool {
102
155
  dispatch(worker, task) {
103
156
  let settled = false;
104
157
  let timeoutHandle;
158
+ const startedAt = Date.now();
159
+ task.attempts++;
160
+ task.job.attempt = task.attempts - 1;
161
+ if (task.job.abortSignalId) {
162
+ this.signalWorkerMap.set(task.job.abortSignalId, worker);
163
+ }
105
164
  const cleanup = () => {
106
- worker.removeListener('message', onMessage);
107
- worker.removeListener('error', onError);
108
- worker.removeListener('exit', onExit);
109
- if (timeoutHandle) {
165
+ if (timeoutHandle)
110
166
  clearTimeout(timeoutHandle);
167
+ if (task.job.abortSignalId) {
168
+ this.signalWorkerMap.delete(task.job.abortSignalId);
111
169
  }
112
170
  };
113
171
  const recycle = () => {
114
172
  cleanup();
115
- if (this.destroyed)
116
- return;
117
- this.idle.push(worker);
118
- // continue processing
119
- this.schedule();
173
+ this.active.delete(worker);
174
+ if (!this.destroyed) {
175
+ this.idle.push(worker);
176
+ this.schedule();
177
+ }
120
178
  };
121
179
  const settle = (fn) => {
122
180
  if (settled)
123
181
  return;
124
182
  settled = true;
125
- Promise.resolve(fn())
126
- .catch(() => { })
127
- .finally(() => {
128
- recycle();
129
- });
183
+ fn();
184
+ recycle();
185
+ };
186
+ const handleFailure = (serializedError) => {
187
+ const { retry = 0, retryDelay = 0 } = task.job;
188
+ this.emit('taskError', task.job, serializedError);
189
+ if (task.attempts < retry + 1) {
190
+ // Re-enqueue with delay
191
+ const delay = typeof retryDelay === 'number' ? retryDelay : 0;
192
+ const scheduleRetry = () => {
193
+ this.enqueue(task);
194
+ this.schedule();
195
+ };
196
+ if (delay > 0)
197
+ setTimeout(scheduleRetry, delay);
198
+ else
199
+ scheduleRetry();
200
+ return;
201
+ }
202
+ // All attempts exhausted → dead letter
203
+ const dlEvent = {
204
+ jobId: task.job.jobId,
205
+ serviceName: task.job.serviceName,
206
+ methodName: task.job.methodName,
207
+ args: task.job.args,
208
+ attempts: task.attempts,
209
+ error: serializedError,
210
+ failedAt: new Date(),
211
+ };
212
+ this.emit('dead', dlEvent);
213
+ task.reject(deserializeError(serializedError));
130
214
  };
131
- const onMessage = (result) => {
215
+ const handler = (msg) => {
216
+ const message = msg;
217
+ // ── IPC invoke from worker ────────────────────────────────────────
218
+ if (message.type === 'ipc:invoke') {
219
+ const req = message;
220
+ const svcInstance = this.proxyMap.get(req.propertyKey);
221
+ const reply = (res) => {
222
+ try {
223
+ worker.postMessage(res);
224
+ }
225
+ catch {
226
+ try {
227
+ worker.postMessage({
228
+ type: 'ipc:result', callId: res.callId, ok: false,
229
+ error: `IPC result for "${req.propertyKey}.${req.methodName}" ` +
230
+ `is not structuredClone-compatible.`,
231
+ });
232
+ }
233
+ catch { /* worker gone */
234
+ }
235
+ }
236
+ };
237
+ if (!svcInstance) {
238
+ reply({
239
+ type: 'ipc:result', callId: req.callId, ok: false,
240
+ error: `No proxy registered for "${req.propertyKey}"`,
241
+ });
242
+ return;
243
+ }
244
+ const method = svcInstance[req.methodName];
245
+ if (typeof method !== 'function') {
246
+ reply({
247
+ type: 'ipc:result', callId: req.callId, ok: false,
248
+ error: `Method "${req.methodName}" not found on "${req.propertyKey}"`,
249
+ });
250
+ return;
251
+ }
252
+ // Invoke via svcInstance[methodName](...) to preserve `this` binding.
253
+ // Use Promise.resolve to handle both sync and async returns without
254
+ // forcing an async function allocation per call.
255
+ let p;
256
+ try {
257
+ p = svcInstance[req.methodName](...req.args);
258
+ }
259
+ catch (err) {
260
+ reply({
261
+ type: 'ipc:result', callId: req.callId, ok: false,
262
+ error: err.message ?? String(err),
263
+ });
264
+ return;
265
+ }
266
+ Promise.resolve(p).then((data) => reply({ type: 'ipc:result', callId: req.callId, ok: true, data }), (err) => reply({
267
+ type: 'ipc:result', callId: req.callId, ok: false,
268
+ error: err.message ?? String(err),
269
+ }));
270
+ return;
271
+ }
272
+ if (message.type === 'worker:ready')
273
+ return;
274
+ // ── Job result ────────────────────────────────────────────────────
275
+ const result = message;
276
+ const durationMs = Date.now() - startedAt;
132
277
  settle(() => {
133
278
  if (result.ok) {
279
+ this.emit('taskEnd', task.job, durationMs);
134
280
  task.resolve(result.data);
135
281
  }
136
282
  else {
137
- task.reject(new Error(result.error?.message ??
138
- 'Worker error'));
283
+ handleFailure(result.error ?? {
284
+ name: 'Error',
285
+ message: 'Unknown worker error',
286
+ });
139
287
  }
140
288
  });
141
289
  };
142
- const onError = async (err) => {
143
- settle(async () => {
144
- task.reject(err);
145
- await this.replaceWorker(worker);
146
- });
147
- };
148
- const onExit = async (code) => {
149
- if (this.destroyed)
150
- return;
151
- settle(async () => {
152
- task.reject(new Error(`Worker exited unexpectedly with code ${code} ` +
153
- `while running "${task.job.serviceName}.${task.job.methodName}"`));
154
- await this.replaceWorker(worker);
155
- });
156
- };
157
- worker.once('message', onMessage);
158
- worker.once('error', onError);
159
- worker.once('exit', onExit);
160
- if (task.job.timeout &&
161
- task.job.timeout > 0) {
290
+ this.active.set(worker, { task, priority: task.job.priority, startedAt, handler });
291
+ this.emit('taskStart', task.job);
292
+ if (task.job.timeout && task.job.timeout > 0) {
162
293
  timeoutHandle = setTimeout(async () => {
163
294
  if (settled)
164
295
  return;
165
296
  settled = true;
166
297
  cleanup();
167
- task.reject(new Error(`Task "${task.job.serviceName}.${task.job.methodName}" timed out after ${task.job.timeout}ms`));
298
+ this.active.delete(worker);
299
+ const serializedError = {
300
+ name: 'TimeoutError',
301
+ message: `Task "${task.job.serviceName}.${task.job.methodName}" ` +
302
+ `timed out after ${task.job.timeout}ms`,
303
+ };
304
+ handleFailure(serializedError);
168
305
  try {
169
306
  await worker.terminate();
170
307
  }
171
- catch { }
172
- await this.replaceWorker(worker);
308
+ catch {
309
+ }
310
+ this.replaceWorker(worker);
173
311
  this.schedule();
174
312
  }, task.job.timeout);
175
313
  }
176
314
  worker.postMessage(task.job);
177
315
  }
178
- spawnWorker() {
179
- return new node_worker_threads_1.Worker(node_path_1.default.resolve(__dirname, '../worker/worker-runtime.js'), {
180
- workerData: {
181
- services: this.services,
182
- },
183
- });
316
+ handleWorkerError(worker, err) {
317
+ const running = this.active.get(worker);
318
+ if (running) {
319
+ const { serviceName, methodName } = running.task.job;
320
+ const wrapped = new Error(`Worker crashed in "${serviceName}.${methodName}": ${err.message}`);
321
+ wrapped.stack = err.stack;
322
+ this.emit('error', wrapped, running.task.job);
323
+ running.task.reject(wrapped);
324
+ this.active.delete(worker);
325
+ }
326
+ this.replaceWorker(worker);
184
327
  }
185
- async replaceWorker(oldWorker) {
186
- const workerIndex = this.workers.indexOf(oldWorker);
187
- if (workerIndex >= 0) {
188
- this.workers.splice(workerIndex, 1);
328
+ handleWorkerExit(worker, code) {
329
+ if (this.destroyed)
330
+ return;
331
+ const running = this.active.get(worker);
332
+ if (running) {
333
+ running.task.reject(new Error(`Worker exited with code ${code} while running ` +
334
+ `"${running.task.job.serviceName}.${running.task.job.methodName}"`));
335
+ this.active.delete(worker);
189
336
  }
190
- const idleIndex = this.idle.indexOf(oldWorker);
191
- if (idleIndex >= 0) {
192
- this.idle.splice(idleIndex, 1);
337
+ this.replaceWorker(worker);
338
+ }
339
+ replaceWorker(oldWorker) {
340
+ const remove = (arr) => {
341
+ const i = arr.indexOf(oldWorker);
342
+ if (i >= 0)
343
+ arr.splice(i, 1);
344
+ };
345
+ remove(this.workers);
346
+ remove(this.idle);
347
+ this.warmingUp.delete(oldWorker);
348
+ if (!this.destroyed) {
349
+ this.spawnWorker();
350
+ this.schedule();
193
351
  }
194
- const newWorker = this.spawnWorker();
195
- this.workers.push(newWorker);
196
- this.idle.push(newWorker);
197
352
  }
198
353
  async destroy() {
199
354
  this.destroyed = true;
355
+ // Drain: wait for all active jobs to finish, up to shutdownTimeout
356
+ if (this.active.size > 0) {
357
+ await Promise.race([
358
+ // Wait for all active jobs to settle
359
+ Promise.allSettled(Array.from(this.active.values()).map(({ task }) => new Promise((res) => {
360
+ const orig = task.resolve;
361
+ const origRej = task.reject;
362
+ task.resolve = (v) => {
363
+ orig(v);
364
+ res();
365
+ };
366
+ task.reject = (e) => {
367
+ origRej(e);
368
+ res();
369
+ };
370
+ }))),
371
+ // Force after timeout
372
+ new Promise((res) => setTimeout(res, this.shutdownTimeout)),
373
+ ]);
374
+ }
375
+ // Reject anything still queued
200
376
  for (const queued of this.queue) {
201
377
  queued.reject(new Error('WorkerPool destroyed'));
202
378
  }
203
379
  this.queue.length = 0;
204
- await Promise.allSettled(this.workers.map((worker) => worker.terminate()));
380
+ await Promise.allSettled(this.workers.map((w) => w.terminate()));
205
381
  this.workers.length = 0;
206
382
  this.idle.length = 0;
207
383
  }
208
384
  }
209
385
  exports.WorkerPool = WorkerPool;
386
+ function deserializeError(serialized) {
387
+ const err = new Error(serialized.message);
388
+ err.name = serialized.name;
389
+ if (serialized.stack)
390
+ err.stack = serialized.stack;
391
+ if (serialized.extra)
392
+ Object.assign(err, serialized.extra);
393
+ return err;
394
+ }
210
395
  //# sourceMappingURL=worker.pool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.pool.js","sourceRoot":"","sources":["../../src/core/worker.pool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"worker.pool.js","sourceRoot":"","sources":["../../src/core/worker.pool.ts"],"names":[],"mappings":";;;;;;AAAA,6DAA6C;AAC7C,6CAA2C;AAC3C,sDAAyB;AACzB,0DAA6B;AAiB7B,MAAM,eAAe,GAAiC;IACpD,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;CACP,CAAC;AAkCF,MAAa,UAAW,SAAQ,0BAAY;IAoBvB;IAEA;IACA;IAtBF,OAAO,GAAa,EAAE,CAAC;IACvB,IAAI,GAAa,EAAE,CAAC;IACpB,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,GAAkB,EAAE,CAAC;IACnC,SAAS,GAAG,KAAK,CAAC;IACT,MAAM,GAAG,IAAI,GAAG,EAG9B,CAAC;IAEJ,6DAA6D;IAC5C,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE5C,QAAQ,GAAG,IAAI,GAAG,EAGhC,CAAC;IAEJ,YACmB,QAA6B,EAC9C,cAA+B,EACd,OAAO,iBAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EACvB,kBAAkB,MAAM;QAEzC,KAAK,EAAE,CAAC;QALS,aAAQ,GAAR,QAAQ,CAAqB;QAE7B,SAAI,GAAJ,IAAI,CAAmB;QACvB,oBAAe,GAAf,eAAe,CAAS;QAGzC,KAAK,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,cAAc,EAAE,CAAC;YACvD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,CAAc,GAAc,EAAE,MAAoB;QACvD,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAE7E,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,wCAAwC;YACxC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACpB,MAAM,CAAC,IAAI,YAAY,CAAC,6BAA6B,EAAE,YAAY,CAAC,CAAC,CAAC;gBACtE,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAgB;gBACxB,GAAG;gBACH,OAAO,EAAE,OAA+B;gBACxC,MAAM;gBACN,QAAQ,EAAE,CAAC;gBACX,MAAM;aACP,CAAC;YAEF,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;oBACpC,0CAA0C;oBAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACrC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;wBACb,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;wBAC1B,MAAM,CAAC,IAAI,YAAY,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;wBACvD,OAAO;oBACT,CAAC;oBACD,gDAAgD;oBAChD,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;wBACtB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;wBAC3D,IAAI,MAAM,EAAE,CAAC;4BACX,IAAI,CAAC;gCACH,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC;4BAC1E,CAAC;4BAAC,MAAM,CAAC,CAAC,iBAAiB;4BAC3B,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACrB,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACnB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK;QACH,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;YACtB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI;SAC/B,CAAC;IACJ,CAAC;IAEO,WAAW;QACjB,MAAM,MAAM,GAAG,IAAI,4BAAM,CACvB,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,6BAA6B,CAAC,EACtD,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAC5C,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAE3B,wEAAwE;QACxE,yEAAyE;QACzE,wEAAwE;QACxE,oEAAoE;QACpE,iEAAiE;QACjE,MAAM,SAAS,GAAG,CAAC,GAAY,EAAE,EAAE;YACjC,MAAM,OAAO,GAAG,GAAwB,CAAC;YAEzC,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/B,IAAI,OAAO,EAAE,IAAI,KAAK,cAAc;oBAAE,OAAO;gBAC7C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;oBACpB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,CAAC;gBACD,OAAO;YACT,CAAC;YAED,iDAAiD;YACjD,IAAI,OAAO,EAAE,IAAI,KAAK,cAAc;gBAAE,OAAO;YAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,CAAC,OAAO;gBAAE,OAAO,CAAC,6CAA6C;YACnE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC,CAAC;QAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,OAAO,CAAC,IAAiB;QAC/B,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACrB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QACnB,sEAAsE;QACtE,+DAA+D;QAC/D,IAAI,CAAC,KAAK,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC;YAChE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QACD,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACnB,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,MAAM;gBAAE,EAAE,GAAG,GAAG,CAAC;;gBACvD,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;QACpB,CAAC;QACD,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IAEO,QAAQ;QACd,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAG,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,MAAc,EAAE,IAAiB;QAChD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,aAAyC,CAAC;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChB,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAErC,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAC3B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QAGD,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,aAAa;gBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;YAC/C,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBAC3B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACtD,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,EAAc,EAAE,EAAE;YAChC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,EAAE,EAAE,CAAC;YACL,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,CAAC,eAAgC,EAAE,EAAE;YACzD,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC;YAC/C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YAElD,IAAI,IAAI,CAAC,QAAQ,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC9B,wBAAwB;gBACxB,MAAM,KAAK,GAAG,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9D,MAAM,aAAa,GAAG,GAAG,EAAE;oBACzB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACnB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,CAAC,CAAC;gBACF,IAAI,KAAK,GAAG,CAAC;oBAAE,UAAU,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;;oBAC3C,aAAa,EAAE,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,uCAAuC;YACvC,MAAM,OAAO,GAAoB;gBAC/B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK;gBACrB,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW;gBACjC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU;gBAC/B,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI;gBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,KAAK,EAAE,eAAe;gBACtB,QAAQ,EAAE,IAAI,IAAI,EAAE;aACrB,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,CAAC,GAAY,EAAE,EAAE;YAC/B,MAAM,OAAO,GAAG,GAA4B,CAAC;YAE7C,qEAAqE;YACrE,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,OAA2B,CAAC;gBACxC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAEvD,MAAM,KAAK,GAAG,CAAC,GAAsB,EAAE,EAAE;oBACvC,IAAI,CAAC;wBACH,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;oBAC1B,CAAC;oBAAC,MAAM,CAAC;wBACP,IAAI,CAAC;4BACH,MAAM,CAAC,WAAW,CAAC;gCACjB,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK;gCACjD,KAAK,EAAE,mBAAmB,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,IAAI;oCAC7D,oCAAoC;6BACX,CAAC,CAAC;wBACjC,CAAC;wBAAC,MAAM,CAAC,CAAC,iBAAiB;wBAC3B,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC;gBAEF,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,KAAK,CAAC;wBACJ,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK;wBACjD,KAAK,EAAE,4BAA4B,GAAG,CAAC,WAAW,GAAG;qBACtD,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBAC3C,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;oBACjC,KAAK,CAAC;wBACJ,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK;wBACjD,KAAK,EAAE,WAAW,GAAG,CAAC,UAAU,mBAAmB,GAAG,CAAC,WAAW,GAAG;qBACtE,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,sEAAsE;gBACtE,oEAAoE;gBACpE,iDAAiD;gBACjD,IAAI,CAAU,CAAC;gBACf,IAAI,CAAC;oBACH,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAI,GAAG,CAAC,IAAkB,CAAC,CAAC;gBAC9D,CAAC;gBAAC,OAAO,GAAY,EAAE,CAAC;oBACtB,KAAK,CAAC;wBACJ,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK;wBACjD,KAAK,EAAG,GAAa,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;qBAC7C,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CACrB,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAC3E,CAAC,GAAY,EAAE,EAAE,CAAC,KAAK,CAAC;oBACtB,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK;oBACjD,KAAK,EAAG,GAAa,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;iBAC7C,CAAC,CACH,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc;gBAAE,OAAO;YAE5C,qEAAqE;YACrE,MAAM,MAAM,GAAG,OAAuB,CAAC;YACvC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAE1C,MAAM,CAAC,GAAG,EAAE;gBACV,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;oBACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;oBAC3C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACN,aAAa,CAAC,MAAM,CAAC,KAAK,IAAI;wBAC5B,IAAI,EAAE,OAAO;wBACb,OAAO,EAAE,sBAAsB;qBAChC,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YAC7C,aAAa,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;gBACpC,IAAI,OAAO;oBAAE,OAAO;gBACpB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,CAAC;gBACV,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAE3B,MAAM,eAAe,GAAoB;oBACvC,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,SAAS,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI;wBAC/D,mBAAmB,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI;iBAC1C,CAAC;gBACF,aAAa,CAAC,eAAe,CAAC,CAAC;gBAE/B,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;gBAC3B,CAAC;gBAAC,MAAM,CAAC;gBACT,CAAC;gBACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QAED,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAEO,iBAAiB,CAAC,MAAc,EAAE,GAAU;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,sBAAsB,WAAW,IAAI,UAAU,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC9F,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAEO,gBAAgB,CAAC,MAAc,EAAE,IAAY;QACnD,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAC3B,2BAA2B,IAAI,iBAAiB;gBAChD,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,CACnE,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAEO,aAAa,CAAC,SAAiB;QACrC,MAAM,MAAM,GAAG,CAAC,GAAa,EAAE,EAAE;YAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/B,CAAC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,mEAAmE;QACnE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,qCAAqC;gBACrC,OAAO,CAAC,UAAU,CAChB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAClC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,GAAG,EAAE,EAAE;oBACtC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;oBAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;oBAC5B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,EAAE;wBACnB,IAAI,CAAC,CAAC,CAAC,CAAC;wBACR,GAAG,EAAE,CAAC;oBACR,CAAC,CAAC;oBACF,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE;wBAClB,OAAO,CAAC,CAAC,CAAC,CAAC;wBACX,GAAG,EAAE,CAAC;oBACR,CAAC,CAAC;gBACJ,CAAC,CAAC,CACH,CACF;gBACD,sBAAsB;gBACtB,IAAI,OAAO,CAAO,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;aAClE,CAAC,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAEtB,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACvB,CAAC;CACF;AA1ZD,gCA0ZC;AAED,SAAS,gBAAgB,CAAC,UAA2B;IACnD,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC1C,GAAG,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;IAC3B,IAAI,UAAU,CAAC,KAAK;QAAE,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;IACnD,IAAI,UAAU,CAAC,KAAK;QAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3D,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,88 +1,42 @@
1
1
  import { OnModuleDestroy, OnModuleInit } from '@nestjs/common';
2
2
  import { WorkerDiscoveryService } from '../discovery/discovery.service';
3
- import type { TaskPriority, WorkerModuleOptions } from './worker.interfaces';
4
- /**
5
- * WorkerService
6
- *
7
- * Main entry point for executing worker-thread tasks.
8
- *
9
- * Features:
10
- * - Lazy worker pool initialization
11
- * - Automatic worker discovery
12
- * - Priority queue support
13
- * - Timeout support
14
- * - Worker thread execution
15
- * - NestJS dependency integration
16
- *
17
- * Lifecycle:
18
- * 1. Discovers worker-enabled services
19
- * 2. Serializes metadata for worker runtime
20
- * 3. Creates WorkerPool
21
- * 4. Dispatches tasks to workers
22
- * 5. Handles graceful shutdown
23
- *
24
- * Example:
25
- *
26
- * ```ts
27
- * await workerService.run(
28
- * 'ImageService',
29
- * 'resizeImage',
30
- * [500],
31
- * {
32
- * priority: 'HIGH',
33
- * timeout: 5000,
34
- * },
35
- * );
36
- * ```
37
- */
3
+ import type { TaskPriority, WorkerModuleOptions, DeadLetterEvent, PoolStats, SerializedError, WorkerJob } from './worker.interfaces';
4
+ export type { DeadLetterEvent, PoolStats };
5
+ export interface RunOptions {
6
+ priority?: TaskPriority;
7
+ timeout?: number;
8
+ retry?: number;
9
+ retryDelay?: number;
10
+ signal?: AbortSignal;
11
+ }
38
12
  export declare class WorkerService implements OnModuleInit, OnModuleDestroy {
39
13
  private readonly discovery;
40
14
  private readonly options;
15
+ private readonly logger;
41
16
  private pool;
42
- private readonly taskOptions;
17
+ private readonly taskDefaults;
18
+ private readonly taskProxies;
19
+ /** Cached array of ALS storages — avoids `?? []` + entries() per call. */
20
+ private alsStorages;
43
21
  constructor(discovery: WorkerDiscoveryService, options: WorkerModuleOptions);
44
22
  onModuleInit(): void;
45
23
  private initPool;
46
24
  /**
47
- * Executes a worker task.
48
- *
49
- * Parameters:
50
- * - serviceName: target service
51
- * - methodName: target method
52
- * - args: serialized arguments
53
- * - overrides: runtime priority/timeout overrides
54
- *
55
- * Priority:
56
- * - HIGH
57
- * - NORMAL
58
- * - LOW
59
- *
60
- * Timeout:
61
- * Automatically terminates timed-out workers.
62
- *
63
- * Example:
64
- *
65
- * ```ts
66
- * await workerService.run(
67
- * 'ImageService',
68
- * 'generateThumbnail',
69
- * [1920, 1080],
70
- * {
71
- * priority: 'HIGH',
72
- * timeout: 3000,
73
- * },
74
- * );
75
- * ```
76
- */
77
- run<T = unknown>(serviceName: string, methodName: string, args?: unknown[], overrides?: {
78
- priority?: TaskPriority;
79
- timeout?: number;
80
- }): Promise<T>;
81
- /**
82
- * Gracefully shuts down worker pool.
25
+ * Run a @WorkerTask method in a worker thread.
83
26
  *
84
- * Called automatically by NestJS
85
- * during application shutdown.
27
+ * @param serviceName Class name of the @WorkerClass provider
28
+ * @param methodName Method decorated with @WorkerTask
29
+ * @param args structuredClone-compatible arguments
30
+ * @param options Optional priority / timeout / retry / AbortSignal overrides
86
31
  */
32
+ run<T = unknown>(serviceName: string, methodName: string, args?: unknown[], options?: RunOptions): Promise<T>;
33
+ /** Listen for dead-letter events (jobs that exhausted all retry attempts) */
34
+ onDead(listener: (event: DeadLetterEvent) => void): this;
35
+ /** Listen for task lifecycle events */
36
+ onTaskEnd(listener: (job: WorkerJob, durationMs: number) => void): this;
37
+ onTaskStart(listener: (job: WorkerJob) => void): this;
38
+ onTaskError(listener: (job: WorkerJob, error: SerializedError) => void): this;
39
+ /** Current pool stats — use for health checks and metrics */
40
+ stats(): PoolStats;
87
41
  onModuleDestroy(): Promise<void>;
88
42
  }