@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.
- package/README.md +137 -222
- package/dist/CancellationToken.js +2 -0
- package/dist/CancellationToken.js.map +1 -1
- package/dist/browser/logger.js +6 -2
- package/dist/browser/logger.js.map +1 -1
- package/dist/browser/template/main.template.js +1 -1
- package/dist/browser/template/main.template.js.map +1 -1
- package/dist/browser/template/worker.template.js +117 -108
- package/dist/browser/template/worker.template.js.map +1 -1
- package/dist/browser/template.js +2 -2
- package/dist/browser/template.js.map +1 -1
- package/dist/browser.d.ts +5 -5
- package/dist/browser.js +242 -257
- package/dist/browser.js.map +1 -1
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -1
- package/dist/defaultExternalResolver.js +6 -15
- package/dist/defaultExternalResolver.js.map +1 -1
- package/dist/error.d.ts +5 -0
- package/dist/error.js +23 -5
- package/dist/error.js.map +1 -1
- package/dist/node/logger.d.ts +2 -1
- package/dist/node/logger.js +2 -2
- package/dist/node/logger.js.map +1 -1
- package/dist/node/logger.ts +2 -2
- package/dist/node/mockLogger.d.ts +2 -1
- package/dist/node/template/main.template.ejs +108 -69
- package/dist/node/threads/mockWorkerThread.d.ts +1 -0
- package/dist/node/threads/mockWorkerThread.js +10 -3
- package/dist/node/threads/mockWorkerThread.js.map +1 -1
- package/dist/node/threads/workerPool.d.ts +4 -5
- package/dist/node/threads/workerPool.js +8 -11
- package/dist/node/threads/workerPool.js.map +1 -1
- package/dist/node/threads/workerPool.ts +15 -10
- package/dist/node/threads/workerThread.d.ts +2 -2
- package/dist/node/threads/workerThread.js +36 -35
- package/dist/node/threads/workerThread.js.map +1 -1
- package/dist/node/threads/workerThread.ts +28 -25
- package/dist/node.d.ts +32 -7
- package/dist/node.js +602 -331
- package/dist/node.js.map +1 -1
- package/dist/responseTimeMetric.d.ts +20 -0
- package/dist/responseTimeMetric.js +159 -0
- package/dist/responseTimeMetric.js.map +1 -0
- package/dist/serializer/columnarSerializer.d.ts +9 -0
- package/dist/serializer/columnarSerializer.js +59 -30
- package/dist/serializer/columnarSerializer.js.map +1 -1
- package/dist/types.d.ts +36 -2
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +3 -1
- package/dist/utils.js +53 -59
- package/dist/utils.js.map +1 -1
- 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
|
-
|
|
70
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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({},
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
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
|
|
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
|
-
|
|
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":"
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
|
20
|
-
if (
|
|
21
|
-
this.workerNodes
|
|
22
|
-
|
|
23
|
-
|
|
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;
|
|
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:
|
|
25
|
-
if (
|
|
26
|
-
this.workerNodes
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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":"
|
|
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"}
|