@coherentglobal/wasm-runner 0.1.4 → 0.2.4

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 (55) hide show
  1. package/README.md +137 -222
  2. package/dist/CancellationToken.js +2 -0
  3. package/dist/CancellationToken.js.map +1 -1
  4. package/dist/browser/logger.js +6 -2
  5. package/dist/browser/logger.js.map +1 -1
  6. package/dist/browser/template/main.template.js +1 -1
  7. package/dist/browser/template/main.template.js.map +1 -1
  8. package/dist/browser/template/worker.template.js +117 -108
  9. package/dist/browser/template/worker.template.js.map +1 -1
  10. package/dist/browser/template.js +2 -2
  11. package/dist/browser/template.js.map +1 -1
  12. package/dist/browser.d.ts +5 -5
  13. package/dist/browser.js +242 -257
  14. package/dist/browser.js.map +1 -1
  15. package/dist/constants.d.ts +1 -0
  16. package/dist/constants.js +2 -0
  17. package/dist/constants.js.map +1 -1
  18. package/dist/defaultExternalResolver.js +6 -15
  19. package/dist/defaultExternalResolver.js.map +1 -1
  20. package/dist/error.d.ts +5 -0
  21. package/dist/error.js +23 -5
  22. package/dist/error.js.map +1 -1
  23. package/dist/node/logger.d.ts +2 -1
  24. package/dist/node/logger.js +2 -2
  25. package/dist/node/logger.js.map +1 -1
  26. package/dist/node/logger.ts +2 -2
  27. package/dist/node/mockLogger.d.ts +2 -1
  28. package/dist/node/template/main.template.ejs +108 -69
  29. package/dist/node/threads/mockWorkerThread.d.ts +1 -0
  30. package/dist/node/threads/mockWorkerThread.js +10 -3
  31. package/dist/node/threads/mockWorkerThread.js.map +1 -1
  32. package/dist/node/threads/workerPool.d.ts +4 -5
  33. package/dist/node/threads/workerPool.js +8 -11
  34. package/dist/node/threads/workerPool.js.map +1 -1
  35. package/dist/node/threads/workerPool.ts +15 -10
  36. package/dist/node/threads/workerThread.d.ts +2 -2
  37. package/dist/node/threads/workerThread.js +36 -35
  38. package/dist/node/threads/workerThread.js.map +1 -1
  39. package/dist/node/threads/workerThread.ts +28 -25
  40. package/dist/node.d.ts +32 -7
  41. package/dist/node.js +602 -331
  42. package/dist/node.js.map +1 -1
  43. package/dist/responseTimeMetric.d.ts +20 -0
  44. package/dist/responseTimeMetric.js +159 -0
  45. package/dist/responseTimeMetric.js.map +1 -0
  46. package/dist/serializer/columnarSerializer.d.ts +9 -0
  47. package/dist/serializer/columnarSerializer.js +59 -30
  48. package/dist/serializer/columnarSerializer.js.map +1 -1
  49. package/dist/types.d.ts +36 -2
  50. package/dist/types.js +8 -0
  51. package/dist/types.js.map +1 -1
  52. package/dist/utils.d.ts +3 -1
  53. package/dist/utils.js +53 -59
  54. package/dist/utils.js.map +1 -1
  55. package/package.json +74 -60
@@ -4,8 +4,8 @@
4
4
  /* eslint-disable no-param-reassign */
5
5
  /* eslint-disable no-underscore-dangle */
6
6
  const WorkerThread = require('<%= modules.workerThread %>').default;
7
+ const { threadId } = require('worker_threads');
7
8
  const model = require('<%= runtime %>');
8
- const externalResolver = require('<%= modules.externalResolver %>');
9
9
  const { logger } = require('<%= modules.logger %>');
10
10
  const metadata = <%- metadata %>;
11
11
  const formspec = <%- formspec %>;
@@ -26,6 +26,7 @@ let wb;
26
26
  let isReady = false;
27
27
  let execute = () => { return Promise.resolve(false) };
28
28
  let _execute = () => { return Promise.resolve(false) };
29
+ const requestQueue = [];
29
30
  let modelIsBusy = false;
30
31
 
31
32
  /**
@@ -34,6 +35,43 @@ let modelIsBusy = false;
34
35
  */
35
36
  let workerThreadInstance = null;
36
37
 
38
+ function sleep(ms) {
39
+ return new Promise(resolve => setTimeout(resolve, ms));
40
+ }
41
+
42
+ const start = Date.now();
43
+ let readyRes = undefined;
44
+
45
+ const REPORT_INTERVAL = 5000;
46
+
47
+ async function processQueue() {
48
+ if (modelIsBusy || requestQueue.length === 0) return;
49
+
50
+ modelIsBusy = true;
51
+ const { resolve, reject, req } = requestQueue.shift();
52
+ const start = Date.now();
53
+
54
+ try {
55
+ const payload = await execute(req);
56
+ resolve({
57
+ payload: payload,
58
+ // memoryUsage: process.memoryUsage().rss,
59
+ threadId,
60
+ time: Date.now() - start
61
+ });
62
+ } catch (err) {
63
+ reject({
64
+ error: err,
65
+ // memoryUsage: process.memoryUsage().rss,
66
+ threadId,
67
+ time: Date.now() - start
68
+ });
69
+ } finally {
70
+ modelIsBusy = false;
71
+ // Process next request if any
72
+ processQueue();
73
+ }
74
+ }
37
75
 
38
76
  try {
39
77
  logger.debug({
@@ -66,34 +104,35 @@ try {
66
104
 
67
105
  switch (service) {
68
106
  case DISPATCH_TYPE.SPARK_SERVICE: {
69
- return workerThreadInstance.requestMessage(requestData, ctx);
70
- // return result
71
- }
72
- case DISPATCH_TYPE.EXTERNAL_API: {
73
- // eslint-disable-next-line no-return-await
74
- return await externalResolver.externalApi(requestData, ctx);
107
+ const resultSparkService = await workerThreadInstance.requestMessage(requestData, ctx);
108
+ return resultSparkService;
75
109
  }
76
110
  default: {
77
111
  logger.error(
78
112
  `Not implemented for service ${service} data ${result}`
79
113
  );
114
+ return '';
80
115
  }
81
116
  }
82
117
  };
83
118
 
119
+ let interval;
84
120
  let currentParameterSetKey;
85
121
  execute = function (req) {
86
122
  try {
87
123
  if (req === "isReady") {
88
- return Promise.resolve(isReady);
124
+ return Promise.resolve(readyRes);
89
125
  }
90
126
 
91
127
  if (req === "destroy") {
128
+ if (interval) {
129
+ clearInterval(interval);
130
+ }
92
131
  instance._destroy(wb);
93
132
  return Promise.resolve(true);
94
133
  }
95
134
 
96
- if(!req.request_data) req.request_data = {}
135
+ if (!req.request_data) req.request_data = {}
97
136
 
98
137
  let rawString = false;
99
138
  if (req.request_data._raw) {
@@ -113,7 +152,7 @@ try {
113
152
  }
114
153
  }
115
154
 
116
- if(!req.request_meta) req.request_meta = {}
155
+ if (!req.request_meta) req.request_meta = {}
117
156
 
118
157
  if (req.request_meta?._ctx?.correlationId) {
119
158
  ctx.correlationId = req.request_meta._ctx.correlationId;
@@ -147,15 +186,15 @@ try {
147
186
  delete req.request_meta._ctx.servicemap;
148
187
  }
149
188
 
150
- if(req.request_meta._ctx?.xcallChainId) {
189
+ if (req.request_meta._ctx?.xcallChainId) {
151
190
  ctx.xcallChainId = req.request_meta._ctx?.xcallChainId;
152
191
  delete req.request_meta._ctx.xcallChainId;
153
192
  }
154
193
 
155
- if(req.request_meta._ctx?.callId) {
194
+ if (req.request_meta._ctx?.callId) {
156
195
  ctx.callid = req.request_meta._ctx.callId;
157
196
  delete req.request_meta._ctx.callId;
158
- } else if(req.callid) {
197
+ } else if (req.callid) {
159
198
  ctx.callid = req.callid;
160
199
  delete req.callid;
161
200
  }
@@ -164,10 +203,16 @@ try {
164
203
  req.request_meta.allow_range_address = false;
165
204
  }
166
205
 
206
+ if (req.request_meta?._ctx?.trace) {
207
+ ctx.trace = req.request_meta._ctx.trace;
208
+ delete req.request_meta._ctx.trace;
209
+ }
210
+
167
211
  const startTime = Date.now();
168
212
  logger.debug({
169
213
  TimeStamp: Date.now(),
170
214
  EventType: 'Runner.ModelThread.Execute',
215
+ Message: `Runner.ModelThread.Execute ${modelName}`,
171
216
  threadCallId: ctx.callid,
172
217
  correlationId: ctx.correlationId,
173
218
  });
@@ -189,7 +234,6 @@ try {
189
234
  let result
190
235
  if (isAsyncCheck) {
191
236
  try {
192
-
193
237
  result = instance.ccall(
194
238
  "node_calc_v3",
195
239
  "number",
@@ -206,14 +250,14 @@ try {
206
250
  instance._free(outBuffer);
207
251
  instance._free(outPtr);
208
252
 
209
- if(isMetadataSubSvc) {
253
+ if (isMetadataSubSvc) {
210
254
  result = JSON.parse(result);
211
- if(!result.response_data) {
255
+ if (!result.response_data) {
212
256
  result.response_data = {}
213
257
  }
214
258
  const hasImageOutputs = metadata?.ImageOutputs ?? []
215
- const imageOutputs = hasImageOutputs ? hasImageOutputs.reduce( (prev, curr) => {
216
- if(!curr?.ImageName) return prev
259
+ const imageOutputs = hasImageOutputs ? hasImageOutputs.reduce((prev, curr) => {
260
+ if (!curr?.ImageName) return prev
217
261
  prev[curr.ImageName] = curr?.Base64Content || ""
218
262
  return prev
219
263
  }, {}) : {}
@@ -228,14 +272,14 @@ try {
228
272
  }
229
273
 
230
274
 
231
- if(isFormSpecSubSvc) {
275
+ if (isFormSpecSubSvc) {
232
276
  result = JSON.parse(result);
233
- if(!result.response_data) {
277
+ if (!result.response_data) {
234
278
  result.response_data = {}
235
279
  }
236
280
 
237
281
  // result.response_data.outputs = Object.assign({}, result.response_data.outputs, formspec);
238
- result.response_data.outputs = formspec;
282
+ result.response_data.outputs = formspec;
239
283
  return rawString ? JSON.stringify(result) : result;
240
284
  }
241
285
 
@@ -266,14 +310,14 @@ try {
266
310
  instance._free(outBuffer);
267
311
  instance._free(outPtr);
268
312
 
269
- if(isMetadataSubSvc) {
313
+ if (isMetadataSubSvc) {
270
314
  result = JSON.parse(result);
271
- if(!result.response_data) {
315
+ if (!result.response_data) {
272
316
  result.response_data = {}
273
317
  }
274
318
  const hasImageOutputs = metadata?.ImageOutputs ?? []
275
- const imageOutputs = hasImageOutputs ? hasImageOutputs.reduce( (prev, curr) => {
276
- if(!curr?.ImageName) return prev
319
+ const imageOutputs = hasImageOutputs ? hasImageOutputs.reduce((prev, curr) => {
320
+ if (!curr?.ImageName) return prev
277
321
  prev[curr.ImageName] = curr?.Base64Content || ""
278
322
  return prev
279
323
  }, {}) : {}
@@ -282,17 +326,17 @@ try {
282
326
  ...metadata?.Outputs,
283
327
  ...imageOutputs,
284
328
  }
285
- result.response_data.outputs = Object.assign({}, metadataOutput);
329
+ result.response_data.outputs = Object.assign({}, metadataOutput);
286
330
  return rawString ? JSON.stringify(result) : result;
287
331
  }
288
332
 
289
- if(isFormSpecSubSvc) {
333
+ if (isFormSpecSubSvc) {
290
334
  result = JSON.parse(result);
291
- if(!result.response_data) {
335
+ if (!result.response_data) {
292
336
  result.response_data = {}
293
337
  }
294
338
 
295
- // result.response_data.outputs = Object.assign({}, result.response_data.outputs, formspec);
339
+ // result.response_data.outputs = Object.assign({}, result.response_data.outputs, formspec);
296
340
  result.response_data.outputs = formspec;
297
341
  return rawString ? JSON.stringify(result) : result;
298
342
  }
@@ -306,7 +350,7 @@ try {
306
350
  correlationId: ctx.correlationId,
307
351
  });
308
352
 
309
- return rawString ? result : JSON.parse(result);
353
+ return rawString ? result.concat('') : JSON.parse(result);
310
354
  });
311
355
  }
312
356
  } else {
@@ -326,14 +370,14 @@ try {
326
370
  instance._free(outPtr);
327
371
 
328
372
 
329
- if(isMetadataSubSvc) {
373
+ if (isMetadataSubSvc) {
330
374
  result = JSON.parse(result);
331
- if(!result.response_data) {
375
+ if (!result.response_data) {
332
376
  result.response_data = {}
333
377
  }
334
378
  const hasImageOutputs = metadata?.ImageOutputs ?? []
335
- const imageOutputs = hasImageOutputs ? hasImageOutputs.reduce( (prev, curr) => {
336
- if(!curr?.ImageName) return prev
379
+ const imageOutputs = hasImageOutputs ? hasImageOutputs.reduce((prev, curr) => {
380
+ if (!curr?.ImageName) return prev
337
381
  prev[curr.ImageName] = curr?.Base64Content || null
338
382
  return prev
339
383
  }, {}) : {}
@@ -346,13 +390,13 @@ try {
346
390
  return rawString ? JSON.stringify(result) : result;
347
391
  }
348
392
 
349
- if(isFormSpecSubSvc) {
393
+ if (isFormSpecSubSvc) {
350
394
  result = JSON.parse(result);
351
- if(!result.response_data) {
395
+ if (!result.response_data) {
352
396
  result.response_data = {}
353
397
  }
354
398
 
355
- //result.response_data.outputs = Object.assign({}, result.response_data.outputs, formspec);
399
+ //result.response_data.outputs = Object.assign({}, result.response_data.outputs, formspec);
356
400
  result.response_data.outputs = formspec;
357
401
  return rawString ? JSON.stringify(result) : result;
358
402
  }
@@ -366,7 +410,7 @@ try {
366
410
  correlationId: ctx.correlationId,
367
411
  });
368
412
 
369
- return rawString ? result : JSON.parse(result);
413
+ return rawString ? result.concat('') : JSON.parse(result);
370
414
  });
371
415
  }
372
416
 
@@ -377,36 +421,15 @@ try {
377
421
  }
378
422
  };
379
423
 
380
-
381
- _execute = function (req) {
382
- return new Promise((resolve, reject) => {
383
- if(!modelIsBusy) {
384
- logger.debug({
385
- TimeStamp: Date.now(),
386
- Message: `Execute ${modelName}`,
387
- EventType: 'Execute',
388
- })
389
- modelIsBusy = true;
390
- return _execute(req)
391
- .then((result) => {
392
- resolve(result);
393
- }).catch((err) => {
394
- reject(err);
395
- }).finally(() => {
396
- modelIsBusy = false
397
- });
398
- } else {
399
- setTimeout(() => {
400
- logger.debug({
401
- TimeStamp: Date.now(),
402
- Message: `Execute.wait ${modelName}`,
403
- EventType: 'Execute.wait',
404
- });
405
- execute(req)
406
- }, 1)
407
- }
408
- });
409
- }
424
+ interval = setInterval(() => {
425
+ // Delay report if model is working
426
+ if (modelIsBusy) {
427
+ return;
428
+ }
429
+ workerThreadInstance.reportStats({
430
+ memoryUsage: process.memoryUsage().rss,
431
+ })
432
+ }, REPORT_INTERVAL)
410
433
 
411
434
  logger.debug({
412
435
  TimeStamp: Date.now(),
@@ -415,6 +438,14 @@ try {
415
438
  });
416
439
 
417
440
  wb = instance._construct();
441
+
442
+ _execute = async function (req) {
443
+ return new Promise((resolve, reject) => {
444
+ requestQueue.push({ resolve, reject, req });
445
+ processQueue();
446
+ });
447
+ }
448
+
418
449
  logger.debug({
419
450
  TimeStamp: Date.now(),
420
451
  EventType: 'Runner.ModelThread.MODEL_CONSTRUCT.COMPLETE',
@@ -422,6 +453,13 @@ try {
422
453
  });
423
454
 
424
455
  isReady = true;
456
+ readyRes = {
457
+ memoryUsage: process.memoryUsage().rss,
458
+ threadId,
459
+ time: Date.now() - start,
460
+ readyTs: Date.now()
461
+ };
462
+
425
463
  return Promise.resolve();
426
464
  } catch (err) {
427
465
  instance = undefined
@@ -461,7 +499,8 @@ async function main(input) {
461
499
  throw new Error("Param must be a json string or json object");
462
500
  }
463
501
 
464
- return execute(input);
502
+ return _execute(input);
465
503
  };
466
504
 
467
505
  module.exports = new WorkerThread(main);
506
+
@@ -23,6 +23,7 @@ declare class WorkerThread extends ThreadWorker<any, any> {
23
23
  * Response from main thread.
24
24
  */
25
25
  requestMessage(payload: any, context: any): Promise<any>;
26
+ reportStats(payload: any): void;
26
27
  }
27
28
  import { ThreadWorker } from "poolifier";
28
29
  export { WorkerThread as default };
@@ -1,12 +1,11 @@
1
1
  const events = require("events");
2
- const { isMainThread, parentPort } = require("worker_threads");
2
+ const { isMainThread, parentPort, threadId } = require("worker_threads");
3
3
  const { createId } = require("@paralleldrive/cuid2");
4
4
  const { ThreadWorker } = require("poolifier");
5
- // eslint-disable-next-line import/no-unresolved, import/extensions
5
+
6
6
  const { THREAD_EVENT_TYPES } = require("../../mockConstants");
7
7
 
8
8
  class WorkerThread extends ThreadWorker {
9
- // eslint-disable-next-line no-useless-constructor
10
9
  constructor(taskFunctions, opts) {
11
10
  super(taskFunctions, opts);
12
11
  }
@@ -82,6 +81,14 @@ class WorkerThread extends ThreadWorker {
82
81
  });
83
82
  });
84
83
  }
84
+
85
+ reportStats(payload) {
86
+ this.postMessage({
87
+ payload,
88
+ type: THREAD_EVENT_TYPES.STATS_REPORT,
89
+ threadId,
90
+ });
91
+ }
85
92
  }
86
93
 
87
94
  module.exports = {
@@ -1 +1 @@
1
- {"version":3,"file":"mockWorkerThread.js","sourceRoot":"","sources":["../../../src/node/threads/mockWorkerThread.js"],"names":[],"mappings":";;;;;;;;;AAAA,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACjC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC/D,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;AACrD,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAC9C,mEAAmE;AACnE,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAE9D,MAAM,YAAa,SAAQ,YAAY;IACrC,kDAAkD;IAClD,YAAY,aAAa,EAAE,IAAI;QAC7B,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,OAAO;QACjB,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,QAAQ;QAChB,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACG,cAAc,CAAC,OAAO,EAAE,OAAO;;YACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;gBAC3B,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBAE/C,8CAA8C;gBAC9C,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE;oBACtC,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;oBACzC,IAAI,QAAQ,CAAC,IAAI,KAAK,kBAAkB,CAAC,KAAK,EAAE,CAAC;wBAC/C,MAAM,CAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,CAAC,CAAC;oBAC5B,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,6BAA6B;gBAC7B,IAAI,CAAC,WAAW,CAAC;oBACf,OAAO;oBACP,OAAO;oBACP,IAAI,EAAE,kBAAkB,CAAC,eAAe;oBACxC,OAAO;iBACR,CAAC,CAAC;gBAEH,8CAA8C;gBAC9C,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE;oBACzB,IACE,OAAO,CAAC,OAAO,KAAK,OAAO;wBAC3B,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,MAAK,kBAAkB,CAAC,QAAQ;4BAC5C,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,MAAK,kBAAkB,CAAC,KAAK,CAAC,EAC7C,CAAC;wBACD,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBACtC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;KAAA;CACF;AAED,MAAM,CAAC,OAAO,GAAG;IACf,OAAO,EAAE,YAAY;CACtB,CAAC"}
1
+ {"version":3,"file":"mockWorkerThread.js","sourceRoot":"","sources":["../../../src/node/threads/mockWorkerThread.js"],"names":[],"mappings":"AAAA,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACjC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACzE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;AACrD,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAE9C,MAAM,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAE9D,MAAM,YAAa,SAAQ,YAAY;IACrC,YAAY,aAAa,EAAE,IAAI;QAC7B,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,OAAO;QACjB,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,QAAQ;QAChB,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO;QACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;YAC3B,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YAE/C,8CAA8C;YAC9C,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE;gBACtC,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACzC,IAAI,QAAQ,CAAC,IAAI,KAAK,kBAAkB,CAAC,KAAK,EAAE,CAAC;oBAC/C,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,6BAA6B;YAC7B,IAAI,CAAC,WAAW,CAAC;gBACf,OAAO;gBACP,OAAO;gBACP,IAAI,EAAE,kBAAkB,CAAC,eAAe;gBACxC,OAAO;aACR,CAAC,CAAC;YAEH,8CAA8C;YAC9C,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE;gBACzB,IACE,OAAO,CAAC,OAAO,KAAK,OAAO;oBAC3B,CAAC,OAAO,EAAE,IAAI,KAAK,kBAAkB,CAAC,QAAQ;wBAC5C,OAAO,EAAE,IAAI,KAAK,kBAAkB,CAAC,KAAK,CAAC,EAC7C,CAAC;oBACD,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,OAAO;QACjB,IAAI,CAAC,WAAW,CAAC;YACf,OAAO;YACP,IAAI,EAAE,kBAAkB,CAAC,YAAY;YACrC,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,CAAC,OAAO,GAAG;IACf,OAAO,EAAE,YAAY;CACtB,CAAC"}
@@ -1,7 +1,9 @@
1
1
  import { FixedThreadPool } from "poolifier";
2
2
  import type { ThreadPoolOptions } from "poolifier";
3
+ import { EventResponseData } from "../../types";
3
4
  declare class WorkerPool extends FixedThreadPool {
4
- constructor(numberOfThreads: number, filePath: string, opts?: ThreadPoolOptions);
5
+ id: string;
6
+ constructor(id: string, numberOfThreads: number, filePath: string, opts?: ThreadPoolOptions, _maximumNumberOfThreads?: number);
5
7
  /**
6
8
  * Sends message to a specific worker thread or broadcasts the message
7
9
  * to all running threads.
@@ -9,11 +11,8 @@ declare class WorkerPool extends FixedThreadPool {
9
11
  * @param message
10
12
  * Any data that needs to passed to the worker.
11
13
  *
12
- * @param workerIndex
13
- * Optional. Zero base index of the worker that will receive the message. Leave
14
- * this field empty to enable the message broadcast to all workers.
15
14
  */
16
- postMessage(message: unknown, workerIndex?: number): void;
15
+ postMessage(message: EventResponseData): void;
17
16
  }
18
17
  export default WorkerPool;
19
18
  export type { FixedThreadPool };
@@ -2,8 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const poolifier_1 = require("poolifier");
4
4
  class WorkerPool extends poolifier_1.FixedThreadPool {
5
- constructor(numberOfThreads, filePath, opts) {
5
+ id;
6
+ constructor(id, numberOfThreads, filePath, opts, _maximumNumberOfThreads) {
6
7
  super(numberOfThreads, filePath, opts);
8
+ this.id = id;
7
9
  }
8
10
  /**
9
11
  * Sends message to a specific worker thread or broadcasts the message
@@ -12,17 +14,12 @@ class WorkerPool extends poolifier_1.FixedThreadPool {
12
14
  * @param message
13
15
  * Any data that needs to passed to the worker.
14
16
  *
15
- * @param workerIndex
16
- * Optional. Zero base index of the worker that will receive the message. Leave
17
- * this field empty to enable the message broadcast to all workers.
18
17
  */
19
- postMessage(message, workerIndex) {
20
- if (workerIndex && workerIndex < this.workerNodes.length) {
21
- this.workerNodes[workerIndex].worker.postMessage(message);
22
- }
23
- else {
24
- for (let i = 0; i < this.workerNodes.length; i++) {
25
- this.workerNodes[i].worker.postMessage(message);
18
+ postMessage(message) {
19
+ if (message.threadId) {
20
+ const workerIndex = this.workerNodes.findIndex((w) => w.info?.id === message.threadId);
21
+ if (this.workerNodes[workerIndex]) {
22
+ this.workerNodes[workerIndex].worker.postMessage(message);
26
23
  }
27
24
  }
28
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workerPool.js","sourceRoot":"","sources":["../../../src/node/threads/workerPool.ts"],"names":[],"mappings":";;AAAA,yCAA4C;AAG5C,MAAM,UAAW,SAAQ,2BAAe;IACtC,YACE,eAAuB,EACvB,QAAgB,EAChB,IAAwB;QAExB,KAAK,CAAC,eAAe,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IAED;;;;;;;;;;OAUG;IACH,WAAW,CAAC,OAAgB,EAAE,WAAoB;QAChD,IAAI,WAAW,IAAI,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YACzD,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACjD,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,kBAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"workerPool.js","sourceRoot":"","sources":["../../../src/node/threads/workerPool.ts"],"names":[],"mappings":";;AAAA,yCAA4C;AAI5C,MAAM,UAAW,SAAQ,2BAAe;IACtC,EAAE,CAAS;IAEX,YACE,EAAU,EACV,eAAuB,EACvB,QAAgB,EAChB,IAAwB,EACxB,uBAAgC;QAEhC,KAAK,CAAC,eAAe,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED;;;;;;;OAOG;IACH,WAAW,CAAC,OAA0B;QACpC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAC5C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,OAAO,CAAC,QAAQ,CACvC,CAAC;YAEF,IAAI,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED,kBAAe,UAAU,CAAC"}
@@ -1,13 +1,19 @@
1
1
  import { FixedThreadPool } from "poolifier";
2
2
  import type { ThreadPoolOptions } from "poolifier";
3
+ import { EventResponseData } from "../../types";
3
4
 
4
5
  class WorkerPool extends FixedThreadPool {
6
+ id: string;
7
+
5
8
  constructor(
9
+ id: string,
6
10
  numberOfThreads: number,
7
11
  filePath: string,
8
- opts?: ThreadPoolOptions
12
+ opts?: ThreadPoolOptions,
13
+ _maximumNumberOfThreads?: number,
9
14
  ) {
10
15
  super(numberOfThreads, filePath, opts);
16
+ this.id = id;
11
17
  }
12
18
 
13
19
  /**
@@ -17,16 +23,15 @@ class WorkerPool extends FixedThreadPool {
17
23
  * @param message
18
24
  * Any data that needs to passed to the worker.
19
25
  *
20
- * @param workerIndex
21
- * Optional. Zero base index of the worker that will receive the message. Leave
22
- * this field empty to enable the message broadcast to all workers.
23
26
  */
24
- postMessage(message: unknown, workerIndex?: number) {
25
- if (workerIndex && workerIndex < this.workerNodes.length) {
26
- this.workerNodes[workerIndex].worker.postMessage(message);
27
- } else {
28
- for (let i = 0; i < this.workerNodes.length; i++) {
29
- this.workerNodes[i].worker.postMessage(message);
27
+ postMessage(message: EventResponseData) {
28
+ if (message.threadId) {
29
+ const workerIndex = this.workerNodes.findIndex(
30
+ (w) => w.info?.id === message.threadId,
31
+ );
32
+
33
+ if (this.workerNodes[workerIndex]) {
34
+ this.workerNodes[workerIndex].worker.postMessage(message);
30
35
  }
31
36
  }
32
37
  }
@@ -1,8 +1,6 @@
1
1
  import { ThreadWorker } from "poolifier";
2
- import type { TaskFunctions, TaskFunction, WorkerOptions } from "poolifier";
3
2
  import type { EventRequestData } from "../../types";
4
3
  declare class WorkerThread extends ThreadWorker {
5
- constructor(taskFunctions: TaskFunction<unknown, Response> | TaskFunctions<unknown, Response>, opts?: WorkerOptions);
6
4
  /**
7
5
  * Sends message back to the main thread.
8
6
  *
@@ -16,6 +14,7 @@ declare class WorkerThread extends ThreadWorker {
16
14
  * Function to receive the message data.
17
15
  */
18
16
  onMessage(callback: (value?: any) => void): void;
17
+ private cleanupListener;
19
18
  /**
20
19
  * Sends a request to the main thread and waits for a response.
21
20
  *
@@ -26,5 +25,6 @@ declare class WorkerThread extends ThreadWorker {
26
25
  * Response from main thread.
27
26
  */
28
27
  requestMessage(payload: any, context: any): Promise<unknown>;
28
+ reportStats(payload: any): void;
29
29
  }
30
30
  export default WorkerThread;
@@ -1,22 +1,10 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  const worker_threads_1 = require("worker_threads");
13
- const cuid2_1 = require("@paralleldrive/cuid2");
14
4
  const poolifier_1 = require("poolifier");
15
5
  const constants_1 = require("../../constants");
6
+ const activeListeners = new Map();
16
7
  class WorkerThread extends poolifier_1.ThreadWorker {
17
- constructor(taskFunctions, opts) {
18
- super(taskFunctions, opts);
19
- }
20
8
  /**
21
9
  * Sends message back to the main thread.
22
10
  *
@@ -44,6 +32,15 @@ class WorkerThread extends poolifier_1.ThreadWorker {
44
32
  worker_threads_1.parentPort.on("message", callback);
45
33
  }
46
34
  }
35
+ cleanupListener = (eventId) => {
36
+ setTimeout(() => {
37
+ const listener = activeListeners.get(eventId);
38
+ if (listener) {
39
+ worker_threads_1.parentPort.off("message", listener);
40
+ activeListeners.delete(eventId);
41
+ }
42
+ });
43
+ };
47
44
  /**
48
45
  * Sends a request to the main thread and waits for a response.
49
46
  *
@@ -53,29 +50,33 @@ class WorkerThread extends poolifier_1.ThreadWorker {
53
50
  * @returns {Promise<Object>}
54
51
  * Response from main thread.
55
52
  */
56
- requestMessage(payload, context) {
57
- return __awaiter(this, void 0, void 0, function* () {
58
- return new Promise((resolve, reject) => {
59
- const eventId = (0, cuid2_1.createId)();
60
- // Send the request to parent
61
- this.postMessage({
62
- payload,
63
- context,
64
- type: constants_1.THREAD_EVENT_TYPES.REQUEST_EXECUTE,
65
- eventId,
66
- });
67
- // Receive the response from parent once ready
68
- this.onMessage((message) => {
69
- if (message.eventId === eventId &&
70
- (message === null || message === void 0 ? void 0 : message.type) === constants_1.THREAD_EVENT_TYPES.RESPONSE) {
71
- resolve(message === null || message === void 0 ? void 0 : message.payload);
72
- }
73
- else if (message.eventId === eventId &&
74
- (message === null || message === void 0 ? void 0 : message.type) === constants_1.THREAD_EVENT_TYPES.ERROR) {
75
- reject(message === null || message === void 0 ? void 0 : message.payload);
76
- }
77
- });
53
+ async requestMessage(payload, context) {
54
+ return new Promise((resolve, reject) => {
55
+ // Send the request to parent
56
+ this.postMessage({
57
+ payload,
58
+ context,
59
+ type: constants_1.THREAD_EVENT_TYPES.REQUEST_EXECUTE,
60
+ threadId: worker_threads_1.threadId,
78
61
  });
62
+ // Receive the response from parent once ready
63
+ const messageListener = (message) => {
64
+ worker_threads_1.parentPort.off("message", messageListener);
65
+ if (message?.type === constants_1.THREAD_EVENT_TYPES.RESPONSE) {
66
+ resolve(message?.payload);
67
+ }
68
+ else if (message?.type === constants_1.THREAD_EVENT_TYPES.ERROR) {
69
+ reject(message?.payload);
70
+ }
71
+ };
72
+ this.onMessage(messageListener);
73
+ });
74
+ }
75
+ reportStats(payload) {
76
+ this.postMessage({
77
+ payload,
78
+ type: constants_1.THREAD_EVENT_TYPES.STATS_REPORT,
79
+ threadId: worker_threads_1.threadId,
79
80
  });
80
81
  }
81
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"workerThread.js","sourceRoot":"","sources":["../../../src/node/threads/workerThread.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,mDAA0D;AAC1D,gDAAwD;AACxD,yCAAyC;AACzC,+CAAqD;AAKrD,MAAM,YAAa,SAAQ,wBAAY;IACrC,YACE,aAEoC,EACpC,IAAoB;QAEpB,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,OAAyB;QACnC,IAAI,6BAAY,EAAE,CAAC;YACjB,MAAM,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,2BAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,QAA+B;QACvC,IAAI,6BAAY,EAAE,CAAC;YACjB,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,2BAAU,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACG,cAAc,CAAC,OAAY,EAAE,OAAY;;YAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,MAAM,OAAO,GAAG,IAAA,gBAAI,GAAE,CAAC;gBAEvB,6BAA6B;gBAC7B,IAAI,CAAC,WAAW,CAAC;oBACf,OAAO;oBACP,OAAO;oBACP,IAAI,EAAE,8BAAkB,CAAC,eAA6B;oBACtD,OAAO;iBACR,CAAC,CAAC;gBAEH,8CAA8C;gBAC9C,IAAI,CAAC,SAAS,CAAC,CAAC,OAAyB,EAAE,EAAE;oBAC3C,IACE,OAAO,CAAC,OAAO,KAAK,OAAO;wBAC3B,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,MAAK,8BAAkB,CAAC,QAAQ,EAC7C,CAAC;wBACD,OAAO,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,CAAC;oBAC5B,CAAC;yBAAM,IACL,OAAO,CAAC,OAAO,KAAK,OAAO;wBAC3B,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,MAAK,8BAAkB,CAAC,KAAK,EAC1C,CAAC;wBACD,MAAM,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;KAAA;CACF;AAED,kBAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"workerThread.js","sourceRoot":"","sources":["../../../src/node/threads/workerThread.ts"],"names":[],"mappings":";;AAAA,mDAAoE;AACpE,yCAAyC;AACzC,+CAAqD;AAIrD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC;AAElC,MAAM,YAAa,SAAQ,wBAAY;IACrC;;;;OAIG;IACH,WAAW,CAAC,OAAyB;QACnC,IAAI,6BAAY,EAAE,CAAC;YACjB,MAAM,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,2BAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACH,SAAS,CAAC,QAA+B;QACvC,IAAI,6BAAY,EAAE,CAAC;YACjB,MAAM,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,2BAAU,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAEO,eAAe,GAAG,CAAC,OAAO,EAAE,EAAE;QACpC,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9C,IAAI,QAAQ,EAAE,CAAC;gBACb,2BAAU,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBACpC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF;;;;;;;;OAQG;IACH,KAAK,CAAC,cAAc,CAAC,OAAY,EAAE,OAAY;QAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,6BAA6B;YAC7B,IAAI,CAAC,WAAW,CAAC;gBACf,OAAO;gBACP,OAAO;gBACP,IAAI,EAAE,8BAAkB,CAAC,eAA6B;gBACtD,QAAQ,EAAR,yBAAQ;aACT,CAAC,CAAC;YAEH,8CAA8C;YAC9C,MAAM,eAAe,GAAG,CAAC,OAAyB,EAAE,EAAE;gBACpD,2BAAU,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;gBAC3C,IAAI,OAAO,EAAE,IAAI,KAAK,8BAAkB,CAAC,QAAQ,EAAE,CAAC;oBAClD,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC5B,CAAC;qBAAM,IAAI,OAAO,EAAE,IAAI,KAAK,8BAAkB,CAAC,KAAK,EAAE,CAAC;oBACtD,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,OAAY;QACtB,IAAI,CAAC,WAAW,CAAC;YACf,OAAO;YACP,IAAI,EAAE,8BAAkB,CAAC,YAA0B;YACnD,QAAQ,EAAR,yBAAQ;SACT,CAAC,CAAC;IACL,CAAC;CACF;AAED,kBAAe,YAAY,CAAC"}