@coherentglobal/wasm-runner 0.1.19 → 0.3.2
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 +16 -0
- 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/worker.template.js +113 -105
- package/dist/browser/template/worker.template.js.map +1 -1
- package/dist/browser/template.js +1 -1
- package/dist/browser.d.ts +10 -3
- package/dist/browser.js +255 -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.js +10 -2
- package/dist/error.js.map +1 -1
- package/dist/node/logger.d.ts +2 -1
- package/dist/node/logger.js +1 -1
- package/dist/node/logger.js.map +1 -1
- package/dist/node/logger.ts +1 -1
- package/dist/node/mockLogger.d.ts +2 -1
- package/dist/node/template/main.template.ejs +60 -29
- 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 +2 -1
- package/dist/node/threads/workerPool.js +7 -6
- package/dist/node/threads/workerPool.js.map +1 -1
- package/dist/node/threads/workerPool.ts +10 -7
- package/dist/node/threads/workerThread.d.ts +1 -2
- package/dist/node/threads/workerThread.js +35 -42
- package/dist/node/threads/workerThread.js.map +1 -1
- package/dist/node/threads/workerThread.ts +8 -12
- package/dist/node.d.ts +26 -8
- package/dist/node.js +596 -437
- package/dist/node.js.map +1 -1
- package/dist/responseTimeMetric.d.ts +7 -3
- package/dist/responseTimeMetric.js +131 -28
- package/dist/responseTimeMetric.js.map +1 -1
- package/dist/serializer/columnarSerializer.d.ts +11 -3
- package/dist/serializer/columnarSerializer.js +49 -29
- package/dist/serializer/columnarSerializer.js.map +1 -1
- package/dist/types.d.ts +4 -1
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +3 -2
- package/dist/utils.js +38 -48
- package/dist/utils.js.map +1 -1
- package/package.json +70 -59
package/dist/browser.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/* istanbul ignore file */
|
|
2
3
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
4
|
if (k2 === undefined) k2 = k;
|
|
4
5
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
@@ -15,69 +16,67 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
16
|
}) : function(o, v) {
|
|
16
17
|
o["default"] = v;
|
|
17
18
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
};
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
34
36
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
35
37
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
36
38
|
};
|
|
37
39
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
40
|
exports.WasmRunner = exports.ModelExecuteCancelled = exports.CancellationToken = exports.ColumnarSerializer = void 0;
|
|
39
|
-
/* istanbul ignore file */
|
|
40
|
-
/* eslint-disable no-undef */
|
|
41
|
-
/* eslint-disable camelcase */
|
|
42
|
-
/* eslint-disable prefer-destructuring */
|
|
43
|
-
/* eslint-disable no-param-reassign */
|
|
44
|
-
/* eslint-disable no-underscore-dangle */
|
|
45
|
-
/* eslint-disable import/prefer-default-export */
|
|
46
41
|
const cuid2_1 = require("@paralleldrive/cuid2");
|
|
47
|
-
const
|
|
42
|
+
const is_buffer_1 = __importDefault(require("is-buffer"));
|
|
43
|
+
const unzipit = __importStar(require("unzipit"));
|
|
48
44
|
const utils = __importStar(require("./utils"));
|
|
49
45
|
const logger_1 = __importStar(require("./browser/logger"));
|
|
50
46
|
const template_1 = __importDefault(require("./browser/template"));
|
|
51
|
-
const is_buffer_1 = __importDefault(require("is-buffer"));
|
|
52
47
|
const error_1 = __importDefault(require("./error"));
|
|
53
|
-
|
|
48
|
+
// Browser-compatible path.extname replacement
|
|
49
|
+
const getExtname = (filePath) => {
|
|
50
|
+
const lastDot = filePath.lastIndexOf(".");
|
|
51
|
+
if (lastDot === -1 || lastDot === 0)
|
|
52
|
+
return "";
|
|
53
|
+
return filePath.substring(lastDot);
|
|
54
|
+
};
|
|
54
55
|
var columnarSerializer_1 = require("./serializer/columnarSerializer");
|
|
55
56
|
Object.defineProperty(exports, "ColumnarSerializer", { enumerable: true, get: function () { return columnarSerializer_1.ColumnarSerializer; } });
|
|
56
57
|
var CancellationToken_1 = require("./CancellationToken");
|
|
57
58
|
Object.defineProperty(exports, "CancellationToken", { enumerable: true, get: function () { return CancellationToken_1.CancellationToken; } });
|
|
58
59
|
var error_2 = require("./error");
|
|
59
60
|
Object.defineProperty(exports, "ModelExecuteCancelled", { enumerable: true, get: function () { return error_2.ModelExecuteCancelled; } });
|
|
60
|
-
const unzipFile = (zipURL) =>
|
|
61
|
+
const unzipFile = async (zipURL) => {
|
|
61
62
|
try {
|
|
62
|
-
let js;
|
|
63
63
|
let jsPath;
|
|
64
|
-
let wasm;
|
|
65
64
|
let wasmPath;
|
|
66
65
|
let dataPath;
|
|
67
66
|
let data;
|
|
68
67
|
let metadata;
|
|
69
68
|
let metadataPath;
|
|
70
69
|
// USING UNZIPIT PACKAGE
|
|
71
|
-
const { entries } =
|
|
70
|
+
const { entries } = await unzipit.unzip(zipURL);
|
|
72
71
|
Object.keys(entries).forEach((entry) => {
|
|
73
72
|
if (entry.indexOf("__MACOSX") === -1) {
|
|
74
|
-
if (
|
|
73
|
+
if (getExtname(entry) === ".js") {
|
|
75
74
|
jsPath = entry;
|
|
76
75
|
}
|
|
77
|
-
if (
|
|
76
|
+
if (getExtname(entry) === ".wasm") {
|
|
78
77
|
wasmPath = entry;
|
|
79
78
|
}
|
|
80
|
-
if (
|
|
79
|
+
if (getExtname(entry) === ".data") {
|
|
81
80
|
dataPath = entry;
|
|
82
81
|
}
|
|
83
82
|
if (entry.toLowerCase().indexOf("_static.json") > -1) {
|
|
@@ -89,8 +88,8 @@ const unzipFile = (zipURL) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
89
88
|
throw new Error("Missing runtime file");
|
|
90
89
|
if (!wasmPath)
|
|
91
90
|
throw new Error("Missing engine file");
|
|
92
|
-
js =
|
|
93
|
-
wasm =
|
|
91
|
+
const js = await entries[jsPath].text();
|
|
92
|
+
const wasm = await entries[wasmPath].arrayBuffer();
|
|
94
93
|
const response = {
|
|
95
94
|
js: {
|
|
96
95
|
url: URL.createObjectURL(new Blob([js], { type: "text/javascript" })),
|
|
@@ -102,14 +101,14 @@ const unzipFile = (zipURL) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
102
101
|
},
|
|
103
102
|
};
|
|
104
103
|
if (dataPath) {
|
|
105
|
-
data =
|
|
104
|
+
data = await entries[dataPath].arrayBuffer();
|
|
106
105
|
response.data = {
|
|
107
106
|
url: URL.createObjectURL(new Blob([data], { type: "application/octet-stream" })),
|
|
108
107
|
path: dataPath,
|
|
109
108
|
};
|
|
110
109
|
}
|
|
111
110
|
if (metadataPath) {
|
|
112
|
-
metadata =
|
|
111
|
+
metadata = await entries[metadataPath].text();
|
|
113
112
|
response.metadata = {
|
|
114
113
|
url: URL.createObjectURL(new Blob([metadata], { type: "application/json" })),
|
|
115
114
|
path: metadataPath,
|
|
@@ -120,8 +119,8 @@ const unzipFile = (zipURL) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
120
119
|
catch (err) {
|
|
121
120
|
throw new Error(err);
|
|
122
121
|
}
|
|
123
|
-
}
|
|
124
|
-
const unzipBuffer = (model) =>
|
|
122
|
+
};
|
|
123
|
+
const unzipBuffer = async (model) => {
|
|
125
124
|
let js;
|
|
126
125
|
let jsPath;
|
|
127
126
|
let wasm;
|
|
@@ -133,16 +132,16 @@ const unzipBuffer = (model) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
133
132
|
const modelToBlob = new Blob([new Uint8Array(model)]);
|
|
134
133
|
// USING UNZIPIT
|
|
135
134
|
try {
|
|
136
|
-
const { entries } =
|
|
135
|
+
const { entries } = await unzipit.unzip(modelToBlob);
|
|
137
136
|
Object.keys(entries).forEach((entry) => {
|
|
138
137
|
if (entry.indexOf("__MACOSX") === -1) {
|
|
139
|
-
if (
|
|
138
|
+
if (getExtname(entry) === ".js") {
|
|
140
139
|
jsPath = entry;
|
|
141
140
|
}
|
|
142
|
-
if (
|
|
141
|
+
if (getExtname(entry) === ".wasm") {
|
|
143
142
|
wasmPath = entry;
|
|
144
143
|
}
|
|
145
|
-
if (
|
|
144
|
+
if (getExtname(entry) === ".data") {
|
|
146
145
|
dataPath = entry;
|
|
147
146
|
}
|
|
148
147
|
if (entry.toLowerCase().indexOf("_static.json") > -1) {
|
|
@@ -154,8 +153,8 @@ const unzipBuffer = (model) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
154
153
|
throw new Error("Missing runtime file");
|
|
155
154
|
if (!wasmPath)
|
|
156
155
|
throw new Error("Missing engine file");
|
|
157
|
-
js =
|
|
158
|
-
wasm =
|
|
156
|
+
js = await entries[jsPath].text();
|
|
157
|
+
wasm = await entries[wasmPath].arrayBuffer();
|
|
159
158
|
const response = {
|
|
160
159
|
wasm: {
|
|
161
160
|
url: URL.createObjectURL(new Blob([wasm], { type: "application/wasm" })),
|
|
@@ -167,14 +166,14 @@ const unzipBuffer = (model) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
167
166
|
},
|
|
168
167
|
};
|
|
169
168
|
if (dataPath) {
|
|
170
|
-
data =
|
|
169
|
+
data = await entries[dataPath].arrayBuffer();
|
|
171
170
|
response.data = {
|
|
172
171
|
url: URL.createObjectURL(new Blob([data], { type: "application/octet-stream" })),
|
|
173
172
|
path: dataPath,
|
|
174
173
|
};
|
|
175
174
|
}
|
|
176
175
|
if (metadataPath) {
|
|
177
|
-
metadata =
|
|
176
|
+
metadata = await entries[metadataPath].text();
|
|
178
177
|
response.metadata = {
|
|
179
178
|
url: URL.createObjectURL(new Blob([metadata], { type: "application/json" })),
|
|
180
179
|
path: metadataPath,
|
|
@@ -185,8 +184,8 @@ const unzipBuffer = (model) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
185
184
|
catch (err) {
|
|
186
185
|
throw new Error(err);
|
|
187
186
|
}
|
|
188
|
-
}
|
|
189
|
-
const unzipppedModel = (model) =>
|
|
187
|
+
};
|
|
188
|
+
const unzipppedModel = async (model) => {
|
|
190
189
|
const { servicename, wasm, js, data, metadata } = model;
|
|
191
190
|
const response = {
|
|
192
191
|
wasm: utils.isFilePath(wasm, "wasm")
|
|
@@ -231,11 +230,11 @@ const unzipppedModel = (model) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
231
230
|
};
|
|
232
231
|
}
|
|
233
232
|
return response;
|
|
234
|
-
}
|
|
235
|
-
const getRuntimeContent =
|
|
233
|
+
};
|
|
234
|
+
const getRuntimeContent = async (js, wasm, data = undefined) => {
|
|
236
235
|
if (data) {
|
|
237
|
-
const runtime =
|
|
238
|
-
.then((res) =>
|
|
236
|
+
const runtime = await fetch(js.url)
|
|
237
|
+
.then(async (res) => res.text())
|
|
239
238
|
.then((text) => text
|
|
240
239
|
.replace(wasm.path, wasm.url)
|
|
241
240
|
.replace(`"${data.path}"`, `"${data.url}"`)
|
|
@@ -244,14 +243,14 @@ const getRuntimeContent = (js_1, wasm_1, ...args_1) => __awaiter(void 0, [js_1,
|
|
|
244
243
|
.replace(`'${data.path}'`, `'${data.url}'`));
|
|
245
244
|
return runtime;
|
|
246
245
|
}
|
|
247
|
-
const runtime =
|
|
248
|
-
.then((res) =>
|
|
246
|
+
const runtime = await fetch(js.url)
|
|
247
|
+
.then(async (res) => res.text())
|
|
249
248
|
.then((text) => text.replace(wasm.path, wasm.url));
|
|
250
249
|
return runtime;
|
|
251
|
-
}
|
|
252
|
-
const defaultCallback = () =>
|
|
250
|
+
};
|
|
251
|
+
const defaultCallback = async () => {
|
|
253
252
|
logger_1.logger.info("CALLBACK NOT IMPLEMENTED");
|
|
254
|
-
}
|
|
253
|
+
};
|
|
255
254
|
const safeJsonParser = (data) => {
|
|
256
255
|
try {
|
|
257
256
|
const result = JSON.parse(data);
|
|
@@ -281,6 +280,10 @@ const safeJsonParser = (data) => {
|
|
|
281
280
|
* @classdesc WasmRunner class, responsible for managing model and it's lifecycle
|
|
282
281
|
*/
|
|
283
282
|
class WasmRunner {
|
|
283
|
+
license;
|
|
284
|
+
models;
|
|
285
|
+
callback;
|
|
286
|
+
_logger;
|
|
284
287
|
/**
|
|
285
288
|
* Create new Wasm Runner instance
|
|
286
289
|
*
|
|
@@ -318,129 +321,123 @@ class WasmRunner {
|
|
|
318
321
|
* @async
|
|
319
322
|
* @function initialize
|
|
320
323
|
*/
|
|
321
|
-
initialize() {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
yield Promise.all(this.models.map((m) => __awaiter(this, void 0, void 0, function* () { return this._initializeModelInstance(m, this.license); })));
|
|
327
|
-
});
|
|
324
|
+
async initialize(license = "") {
|
|
325
|
+
if (!utils.isEmpty(license)) {
|
|
326
|
+
this.license = license;
|
|
327
|
+
}
|
|
328
|
+
await Promise.all(this.models.map(async (m) => this._initializeModelInstance(m, this.license)));
|
|
328
329
|
}
|
|
329
|
-
_initializeModelInstance(m, license) {
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
330
|
+
async _initializeModelInstance(m, license) {
|
|
331
|
+
const start = Date.now();
|
|
332
|
+
logger_1.logger.debug({ modelid: m.id, ts: start }, "_initializeModelInstance");
|
|
333
|
+
const modelUrl = m.url;
|
|
334
|
+
const isDataBuffer = (0, is_buffer_1.default)(modelUrl);
|
|
335
|
+
const isObject = typeof modelUrl === "object";
|
|
336
|
+
let js;
|
|
337
|
+
let wasm;
|
|
338
|
+
let data;
|
|
339
|
+
let metadata;
|
|
340
|
+
if (isDataBuffer) {
|
|
341
|
+
const bufferModel = await unzipBuffer(modelUrl);
|
|
342
|
+
js = bufferModel.js;
|
|
343
|
+
wasm = bufferModel.wasm;
|
|
344
|
+
data = bufferModel.data;
|
|
345
|
+
metadata = bufferModel.metadata;
|
|
346
|
+
}
|
|
347
|
+
else if (isObject) {
|
|
348
|
+
const unzipModelFile = await unzipppedModel(modelUrl);
|
|
349
|
+
js = unzipModelFile.js;
|
|
350
|
+
wasm = unzipModelFile.wasm;
|
|
351
|
+
data = unzipModelFile.data;
|
|
352
|
+
metadata = unzipModelFile.metadata;
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
const unzipped = await unzipFile(modelUrl);
|
|
356
|
+
js = unzipped.js;
|
|
357
|
+
wasm = unzipped.wasm;
|
|
358
|
+
data = unzipped.data;
|
|
359
|
+
metadata = unzipped.metadata;
|
|
360
|
+
}
|
|
361
|
+
const metadataJSON = metadata
|
|
362
|
+
? await fetch(metadata.url).then((response) => response.json())
|
|
363
|
+
: undefined;
|
|
364
|
+
const runtime = await getRuntimeContent(js, wasm, data);
|
|
365
|
+
logger_1.logger.debug({ modelid: m.id, timespent: Date.now() - start }, "_initializeModelInstance.createWorker");
|
|
366
|
+
logger_1.logger.debug({
|
|
367
|
+
message: utils.jsString2workerURL((0, template_1.default)(runtime, m.id, license, metadataJSON)),
|
|
368
|
+
});
|
|
369
|
+
m.parents = this;
|
|
370
|
+
m.worker = new Worker(utils.jsString2workerURL((0, template_1.default)(runtime, m.id, license, metadataJSON)));
|
|
371
|
+
const loggerInt = this._logger;
|
|
372
|
+
/* istanbul ignore next */
|
|
373
|
+
m.worker.onmessage = function (oEvent) {
|
|
374
|
+
if (!Array.isArray(oEvent.data) && oEvent.data === "Initialized") {
|
|
375
|
+
m.ready = true;
|
|
360
376
|
}
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
/* istanbul ignore next */
|
|
387
|
-
const fn = () => __awaiter(this, void 0, void 0, function* () {
|
|
388
|
-
try {
|
|
389
|
-
const option = {
|
|
377
|
+
else if (!Array.isArray(oEvent.data) && oEvent.data?.type === "stall") {
|
|
378
|
+
const requestData = oEvent.data.requestData;
|
|
379
|
+
const input = typeof requestData.request_body === "string"
|
|
380
|
+
? JSON.parse(requestData.request_body)
|
|
381
|
+
: requestData.request_body;
|
|
382
|
+
const serviceUri = requestData.service_uri;
|
|
383
|
+
const folderName = requestData.folder_name;
|
|
384
|
+
const serviceName = requestData.service_name;
|
|
385
|
+
/* istanbul ignore next */
|
|
386
|
+
const fn = async () => {
|
|
387
|
+
try {
|
|
388
|
+
const option = {
|
|
389
|
+
service_uri: serviceUri,
|
|
390
|
+
folder_name: folderName,
|
|
391
|
+
service_name: serviceName,
|
|
392
|
+
context: oEvent.data.context,
|
|
393
|
+
// version_id: versionId
|
|
394
|
+
};
|
|
395
|
+
const modelVersionId = await m.parents.callback(option);
|
|
396
|
+
if (!input.request_meta)
|
|
397
|
+
input.request_meta = {};
|
|
398
|
+
input.request_meta.version_id = modelVersionId;
|
|
399
|
+
const results = await m.parents.execute(input, modelVersionId);
|
|
400
|
+
m.worker.postMessage([
|
|
401
|
+
{
|
|
390
402
|
service_uri: serviceUri,
|
|
391
403
|
folder_name: folderName,
|
|
392
404
|
service_name: serviceName,
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
input.request_meta = {};
|
|
399
|
-
input.request_meta.version_id = modelVersionId;
|
|
400
|
-
const results = yield m.parents.execute(input, modelVersionId);
|
|
401
|
-
m.worker.postMessage([
|
|
402
|
-
{
|
|
403
|
-
service_uri: serviceUri,
|
|
404
|
-
folder_name: folderName,
|
|
405
|
-
service_name: serviceName,
|
|
406
|
-
response: results,
|
|
407
|
-
},
|
|
408
|
-
"",
|
|
409
|
-
"dispatch",
|
|
410
|
-
]);
|
|
411
|
-
}
|
|
412
|
-
catch (err) {
|
|
413
|
-
loggerInt.error(Object.assign(Object.assign({}, err), { message: err.message }), "CHILD MODEL ERROR");
|
|
414
|
-
}
|
|
415
|
-
});
|
|
416
|
-
fn();
|
|
417
|
-
}
|
|
418
|
-
else if (Array.isArray(oEvent.data)) {
|
|
419
|
-
if (utils.isEmpty(m.results)) {
|
|
420
|
-
m.results = {};
|
|
405
|
+
response: results,
|
|
406
|
+
},
|
|
407
|
+
"",
|
|
408
|
+
"dispatch",
|
|
409
|
+
]);
|
|
421
410
|
}
|
|
422
|
-
|
|
411
|
+
catch (err) {
|
|
412
|
+
loggerInt.error({ ...err, message: err.message }, "CHILD MODEL ERROR");
|
|
413
|
+
}
|
|
414
|
+
};
|
|
415
|
+
fn();
|
|
416
|
+
}
|
|
417
|
+
else if (Array.isArray(oEvent.data)) {
|
|
418
|
+
if (utils.isEmpty(m.results)) {
|
|
419
|
+
m.results = {};
|
|
423
420
|
}
|
|
421
|
+
m.results[oEvent.data[1]] = oEvent.data[0];
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
return new Promise((resolve, _reject) => {
|
|
425
|
+
const checkModelStatus = () => {
|
|
426
|
+
setTimeout(() => {
|
|
427
|
+
if (!m.ready) {
|
|
428
|
+
checkModelStatus();
|
|
429
|
+
}
|
|
430
|
+
else {
|
|
431
|
+
logger_1.logger.debug({ modelid: m.id, timespent: Date.now() - start }, "_initializeModelInstance.complete");
|
|
432
|
+
resolve();
|
|
433
|
+
}
|
|
434
|
+
}, 2);
|
|
424
435
|
};
|
|
425
|
-
|
|
426
|
-
const checkModelStatus = () => {
|
|
427
|
-
setTimeout(() => {
|
|
428
|
-
if (!m.ready) {
|
|
429
|
-
checkModelStatus();
|
|
430
|
-
}
|
|
431
|
-
else {
|
|
432
|
-
logger_1.logger.debug({ modelid: m.id, timespent: Date.now() - start }, "_initializeModelInstance.complete");
|
|
433
|
-
resolve();
|
|
434
|
-
}
|
|
435
|
-
}, 2);
|
|
436
|
-
};
|
|
437
|
-
checkModelStatus();
|
|
438
|
-
});
|
|
436
|
+
checkModelStatus();
|
|
439
437
|
});
|
|
440
438
|
}
|
|
441
439
|
_parseError(rawResponse) {
|
|
442
|
-
|
|
443
|
-
let errors = (_a = rawResponse.response_data) === null || _a === void 0 ? void 0 : _a.errors.reduce((prev, curr) => {
|
|
440
|
+
let errors = rawResponse.response_data?.errors.reduce((prev, curr) => {
|
|
444
441
|
const { source_path } = curr;
|
|
445
442
|
if (!source_path) {
|
|
446
443
|
return prev;
|
|
@@ -502,7 +499,7 @@ class WasmRunner {
|
|
|
502
499
|
const res = !!this._getModel(id);
|
|
503
500
|
return res;
|
|
504
501
|
}
|
|
505
|
-
catch (
|
|
502
|
+
catch (_err) {
|
|
506
503
|
return false;
|
|
507
504
|
}
|
|
508
505
|
}
|
|
@@ -511,37 +508,33 @@ class WasmRunner {
|
|
|
511
508
|
* @param {string} id Model id
|
|
512
509
|
* @returns Promise
|
|
513
510
|
*/
|
|
514
|
-
remove(id) {
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
}
|
|
525
|
-
});
|
|
511
|
+
async remove(id) {
|
|
512
|
+
if (this.isExist(id)) {
|
|
513
|
+
this.models = this.models.filter((m) => {
|
|
514
|
+
if (m.id === id) {
|
|
515
|
+
m.worker.terminate();
|
|
516
|
+
return false;
|
|
517
|
+
}
|
|
518
|
+
return m.id !== id;
|
|
519
|
+
});
|
|
520
|
+
}
|
|
526
521
|
}
|
|
527
522
|
/**
|
|
528
523
|
* Append and initialized new model to runner
|
|
529
524
|
* @param {RunnerConfig} modelConfig
|
|
530
525
|
* @returns Promise
|
|
531
526
|
*/
|
|
532
|
-
append(modelConfig) {
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
this.models.push(model);
|
|
544
|
-
});
|
|
527
|
+
async append(modelConfig) {
|
|
528
|
+
if (this.isExist(modelConfig.id)) {
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
const model = {
|
|
532
|
+
id: modelConfig.id,
|
|
533
|
+
url: modelConfig.url,
|
|
534
|
+
meta: {},
|
|
535
|
+
};
|
|
536
|
+
await this._initializeModelInstance(model, this.license);
|
|
537
|
+
this.models.push(model);
|
|
545
538
|
}
|
|
546
539
|
/**
|
|
547
540
|
* Perform calculation. The runner will use request_meta.version_uuid of input argument to locate model
|
|
@@ -549,73 +542,78 @@ class WasmRunner {
|
|
|
549
542
|
* @param {InputObject} input - Input data for calculation
|
|
550
543
|
* @returns {Promise<Object>} - Response model data
|
|
551
544
|
*/
|
|
552
|
-
execute(
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
545
|
+
async execute(input, id = undefined, raw, cancelToken) {
|
|
546
|
+
const version_uuid = id || input?.request_meta?.version_id || input.request_meta?.version_uuid;
|
|
547
|
+
if (!input?.request_meta) {
|
|
548
|
+
input.request_meta = {};
|
|
549
|
+
}
|
|
550
|
+
if (id) {
|
|
551
|
+
input.request_meta.version_id = version_uuid;
|
|
552
|
+
}
|
|
553
|
+
this._logger.trace(input, `EXECUTING: ${id}`);
|
|
554
|
+
const token = cancelToken ? cancelToken.getToken() : undefined;
|
|
555
|
+
if (version_uuid) {
|
|
556
|
+
console.log("version_uuid:", version_uuid, "meta:", input?.request_meta, "id:", id);
|
|
557
|
+
const model = this._getModel(version_uuid);
|
|
558
|
+
const callid = (0, cuid2_1.createId)();
|
|
559
|
+
if (token) {
|
|
560
|
+
token.throwIfCancelled(version_uuid, input);
|
|
561
561
|
}
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
}
|
|
571
|
-
model.worker.postMessage([JSON.stringify(input), callid]);
|
|
572
|
-
return new Promise((resolve, reject) => {
|
|
573
|
-
let counter = 0;
|
|
574
|
-
const getResult = () => {
|
|
575
|
-
setTimeout(() => {
|
|
576
|
-
var _a, _b;
|
|
577
|
-
try {
|
|
578
|
-
if (token) {
|
|
579
|
-
token.throwIfCancelled(version_uuid, input);
|
|
580
|
-
}
|
|
562
|
+
model.worker.postMessage([JSON.stringify(input), callid]);
|
|
563
|
+
return new Promise((resolve, reject) => {
|
|
564
|
+
let counter = 0;
|
|
565
|
+
const getResult = () => {
|
|
566
|
+
setTimeout(() => {
|
|
567
|
+
try {
|
|
568
|
+
if (token) {
|
|
569
|
+
token.throwIfCancelled(version_uuid, input);
|
|
581
570
|
}
|
|
582
|
-
|
|
583
|
-
|
|
571
|
+
}
|
|
572
|
+
catch (err) {
|
|
573
|
+
reject(err);
|
|
574
|
+
}
|
|
575
|
+
if (model.results?.[callid]) {
|
|
576
|
+
const tryParsingResult = safeJsonParser(model.results?.[callid]);
|
|
577
|
+
if (tryParsingResult) {
|
|
578
|
+
model.results[callid] = undefined;
|
|
579
|
+
resolve(tryParsingResult);
|
|
584
580
|
}
|
|
585
|
-
if (
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
resolve(tryParsingResult);
|
|
590
|
-
}
|
|
591
|
-
else {
|
|
592
|
-
if (counter < 5000) {
|
|
593
|
-
// Increase timeout into 20s
|
|
594
|
-
counter++;
|
|
595
|
-
getResult();
|
|
596
|
-
}
|
|
597
|
-
else {
|
|
598
|
-
reject(new Error("Execution timeout"));
|
|
599
|
-
}
|
|
600
|
-
}
|
|
581
|
+
else if (counter < 5000) {
|
|
582
|
+
// Increase timeout into 20s
|
|
583
|
+
counter++;
|
|
584
|
+
getResult();
|
|
601
585
|
}
|
|
602
586
|
else {
|
|
603
|
-
|
|
604
|
-
// Increase timeout into 20s
|
|
605
|
-
counter++;
|
|
606
|
-
getResult();
|
|
607
|
-
}
|
|
608
|
-
else {
|
|
609
|
-
reject(new Error("Execution timeout"));
|
|
610
|
-
}
|
|
587
|
+
reject(new Error("Execution timeout"));
|
|
611
588
|
}
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
589
|
+
}
|
|
590
|
+
else if (counter < 5000) {
|
|
591
|
+
// Increase timeout into 20s
|
|
592
|
+
counter++;
|
|
593
|
+
getResult();
|
|
594
|
+
}
|
|
595
|
+
else {
|
|
596
|
+
reject(new Error("Execution timeout"));
|
|
597
|
+
}
|
|
598
|
+
}, 10);
|
|
599
|
+
};
|
|
600
|
+
getResult();
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
throw new error_1.default.ParameterRequiredError("request_meta.version_id", input);
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* Dispose all resources: terminate all running workers.
|
|
607
|
+
*
|
|
608
|
+
* @async
|
|
609
|
+
* @returns {Promise<void>}
|
|
610
|
+
*/
|
|
611
|
+
async dispose() {
|
|
612
|
+
this._logger.debug({}, "Disposing all resources");
|
|
613
|
+
// Terminate all running models
|
|
614
|
+
const modelIds = this.models.map((model) => model.id);
|
|
615
|
+
await Promise.all(modelIds.map((id) => this.remove(id)));
|
|
616
|
+
this._logger.debug({}, "All resources disposed");
|
|
619
617
|
}
|
|
620
618
|
}
|
|
621
619
|
exports.WasmRunner = WasmRunner;
|