@coherentglobal/wasm-runner 0.0.103 → 0.1.19

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 (54) hide show
  1. package/README.md +137 -222
  2. package/dist/CancellationToken.js.map +1 -1
  3. package/dist/browser/logger.js.map +1 -1
  4. package/dist/browser/template/main.template.js +1 -1
  5. package/dist/browser/template/main.template.js.map +1 -1
  6. package/dist/browser/template/runtime.template.js.map +1 -1
  7. package/dist/browser/template/worker.template.js +7 -4
  8. package/dist/browser/template/worker.template.js.map +1 -1
  9. package/dist/browser/template.js +1 -1
  10. package/dist/browser/template.js.map +1 -1
  11. package/dist/browser.d.ts +2 -2
  12. package/dist/browser.js +6 -6
  13. package/dist/browser.js.map +1 -1
  14. package/dist/constants.d.ts +5 -0
  15. package/dist/constants.js +14 -0
  16. package/dist/constants.js.map +1 -0
  17. package/dist/error.d.ts +5 -0
  18. package/dist/error.js +13 -3
  19. package/dist/error.js.map +1 -1
  20. package/dist/mockConstants.d.ts +5 -0
  21. package/dist/mockConstants.js +14 -0
  22. package/dist/mockConstants.js.map +1 -0
  23. package/dist/node/logger.d.ts +1 -4
  24. package/dist/node/logger.js +1 -1
  25. package/dist/node/logger.js.map +1 -1
  26. package/dist/node/logger.ts +1 -1
  27. package/dist/node/template/main.template.ejs +126 -86
  28. package/dist/node/threads/mockWorkerThread.d.ts +28 -0
  29. package/dist/node/threads/mockWorkerThread.js +89 -0
  30. package/dist/node/threads/mockWorkerThread.js.map +1 -0
  31. package/dist/node/threads/workerPool.d.ts +17 -0
  32. package/dist/node/threads/workerPool.js +27 -0
  33. package/dist/node/threads/workerPool.js.map +1 -0
  34. package/dist/node/threads/workerPool.ts +38 -0
  35. package/dist/node/threads/workerThread.d.ts +31 -0
  36. package/dist/node/threads/workerThread.js +91 -0
  37. package/dist/node/threads/workerThread.js.map +1 -0
  38. package/dist/node/threads/workerThread.ts +92 -0
  39. package/dist/node.d.ts +36 -26
  40. package/dist/node.js +334 -62
  41. package/dist/node.js.map +1 -1
  42. package/dist/responseTimeMetric.d.ts +16 -0
  43. package/dist/responseTimeMetric.js +56 -0
  44. package/dist/responseTimeMetric.js.map +1 -0
  45. package/dist/serializer/columnarSerializer.d.ts +3 -2
  46. package/dist/serializer/columnarSerializer.js +10 -1
  47. package/dist/serializer/columnarSerializer.js.map +1 -1
  48. package/dist/types.d.ts +41 -2
  49. package/dist/types.js +8 -0
  50. package/dist/types.js.map +1 -1
  51. package/dist/utils.d.ts +27 -0
  52. package/dist/utils.js +49 -13
  53. package/dist/utils.js.map +1 -1
  54. package/package.json +8 -5
@@ -0,0 +1,91 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const worker_threads_1 = require("worker_threads");
13
+ const poolifier_1 = require("poolifier");
14
+ const constants_1 = require("../../constants");
15
+ const activeListeners = new Map();
16
+ class WorkerThread extends poolifier_1.ThreadWorker {
17
+ constructor(taskFunctions, opts) {
18
+ super(taskFunctions, opts);
19
+ this.cleanupListener = (eventId) => {
20
+ setTimeout(() => {
21
+ const listener = activeListeners.get(eventId);
22
+ if (listener) {
23
+ worker_threads_1.parentPort.off("message", listener);
24
+ activeListeners.delete(eventId);
25
+ }
26
+ });
27
+ };
28
+ }
29
+ /**
30
+ * Sends message back to the main thread.
31
+ *
32
+ * @param {EventRequestData} message
33
+ */
34
+ postMessage(message) {
35
+ if (worker_threads_1.isMainThread) {
36
+ throw Error("Failed to post message using main thread.");
37
+ }
38
+ else {
39
+ worker_threads_1.parentPort.postMessage(message);
40
+ }
41
+ }
42
+ /**
43
+ * Receives message from the main thread or other threads.
44
+ *
45
+ * @param {Function} callback
46
+ * Function to receive the message data.
47
+ */
48
+ onMessage(callback) {
49
+ if (worker_threads_1.isMainThread) {
50
+ throw Error("Failed to receive message using main thread.");
51
+ }
52
+ else {
53
+ worker_threads_1.parentPort.on("message", callback);
54
+ }
55
+ }
56
+ /**
57
+ * Sends a request to the main thread and waits for a response.
58
+ *
59
+ * @param {Object} payload
60
+ * Object or details that needs to be passed to main thread as `payload`.
61
+ *
62
+ * @returns {Promise<Object>}
63
+ * Response from main thread.
64
+ */
65
+ requestMessage(payload, context) {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ return new Promise((resolve, reject) => {
68
+ // Send the request to parent
69
+ this.postMessage({
70
+ payload,
71
+ context,
72
+ type: constants_1.THREAD_EVENT_TYPES.REQUEST_EXECUTE,
73
+ threadId: worker_threads_1.threadId,
74
+ });
75
+ // Receive the response from parent once ready
76
+ const messageListener = (message) => {
77
+ worker_threads_1.parentPort.off("message", messageListener);
78
+ if ((message === null || message === void 0 ? void 0 : message.type) === constants_1.THREAD_EVENT_TYPES.RESPONSE) {
79
+ resolve(message === null || message === void 0 ? void 0 : message.payload);
80
+ }
81
+ else if ((message === null || message === void 0 ? void 0 : message.type) === constants_1.THREAD_EVENT_TYPES.ERROR) {
82
+ reject(message === null || message === void 0 ? void 0 : message.payload);
83
+ }
84
+ };
85
+ this.onMessage(messageListener);
86
+ });
87
+ });
88
+ }
89
+ }
90
+ exports.default = WorkerThread;
91
+ //# sourceMappingURL=workerThread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerThread.js","sourceRoot":"","sources":["../../../src/node/threads/workerThread.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,mDAAoE;AAEpE,yCAAyC;AACzC,+CAAqD;AAKrD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC;AAElC,MAAM,YAAa,SAAQ,wBAAY;IACrC,YACE,aAEoC,EACpC,IAAoB;QAEpB,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QA8BrB,oBAAe,GAAG,CAAC,OAAO,EAAE,EAAE;YACpC,UAAU,CAAC,GAAG,EAAE;gBACd,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC9C,IAAI,QAAQ,EAAE,CAAC;oBACb,2BAAU,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;oBACpC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;IArCF,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;IAYD;;;;;;;;OAQG;IACG,cAAc,CAAC,OAAY,EAAE,OAAY;;YAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,6BAA6B;gBAC7B,IAAI,CAAC,WAAW,CAAC;oBACf,OAAO;oBACP,OAAO;oBACP,IAAI,EAAE,8BAAkB,CAAC,eAA6B;oBACtD,QAAQ,EAAR,yBAAQ;iBACT,CAAC,CAAC;gBAEH,8CAA8C;gBAC9C,MAAM,eAAe,GAAG,CAAC,OAAyB,EAAE,EAAE;oBACpD,2BAAU,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;oBAC3C,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,MAAK,8BAAkB,CAAC,QAAQ,EAAE,CAAC;wBAClD,OAAO,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,CAAC;oBAC5B,CAAC;yBAAM,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,MAAK,8BAAkB,CAAC,KAAK,EAAE,CAAC;wBACtD,MAAM,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,CAAC;oBAC3B,CAAC;gBAEH,CAAC,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAClC,CAAC,CAAC,CAAC;QACL,CAAC;KAAA;CACF;AAED,kBAAe,YAAY,CAAC"}
@@ -0,0 +1,92 @@
1
+ import { isMainThread, parentPort, threadId } from "worker_threads";
2
+ import { createId as cuid } from "@paralleldrive/cuid2";
3
+ import { ThreadWorker } from "poolifier";
4
+ import { THREAD_EVENT_TYPES } from "../../constants";
5
+
6
+ import type { TaskFunctions, TaskFunction, WorkerOptions } from "poolifier";
7
+ import type { EVENT_TYPE, EventRequestData } from "../../types";
8
+
9
+ const activeListeners = new Map();
10
+
11
+ class WorkerThread extends ThreadWorker {
12
+ constructor(
13
+ taskFunctions:
14
+ | TaskFunction<unknown, Response>
15
+ | TaskFunctions<unknown, Response>,
16
+ opts?: WorkerOptions
17
+ ) {
18
+ super(taskFunctions, opts);
19
+ }
20
+
21
+ /**
22
+ * Sends message back to the main thread.
23
+ *
24
+ * @param {EventRequestData} message
25
+ */
26
+ postMessage(message: EventRequestData) {
27
+ if (isMainThread) {
28
+ throw Error("Failed to post message using main thread.");
29
+ } else {
30
+ parentPort.postMessage(message);
31
+ }
32
+ }
33
+
34
+ /**
35
+ * Receives message from the main thread or other threads.
36
+ *
37
+ * @param {Function} callback
38
+ * Function to receive the message data.
39
+ */
40
+ onMessage(callback: (value?: any) => void) {
41
+ if (isMainThread) {
42
+ throw Error("Failed to receive message using main thread.");
43
+ } else {
44
+ parentPort.on("message", callback);
45
+ }
46
+ }
47
+
48
+ private cleanupListener = (eventId) => {
49
+ setTimeout(() => {
50
+ const listener = activeListeners.get(eventId);
51
+ if (listener) {
52
+ parentPort.off("message", listener);
53
+ activeListeners.delete(eventId);
54
+ }
55
+ });
56
+ };
57
+
58
+ /**
59
+ * Sends a request to the main thread and waits for a response.
60
+ *
61
+ * @param {Object} payload
62
+ * Object or details that needs to be passed to main thread as `payload`.
63
+ *
64
+ * @returns {Promise<Object>}
65
+ * Response from main thread.
66
+ */
67
+ async requestMessage(payload: any, context: any) {
68
+ return new Promise((resolve, reject) => {
69
+ // Send the request to parent
70
+ this.postMessage({
71
+ payload,
72
+ context,
73
+ type: THREAD_EVENT_TYPES.REQUEST_EXECUTE as EVENT_TYPE,
74
+ threadId,
75
+ });
76
+
77
+ // Receive the response from parent once ready
78
+ const messageListener = (message: EventRequestData) => {
79
+ parentPort.off("message", messageListener);
80
+ if (message?.type === THREAD_EVENT_TYPES.RESPONSE) {
81
+ resolve(message?.payload);
82
+ } else if (message?.type === THREAD_EVENT_TYPES.ERROR) {
83
+ reject(message?.payload);
84
+ }
85
+
86
+ };
87
+ this.onMessage(messageListener);
88
+ });
89
+ }
90
+ }
91
+
92
+ export default WorkerThread;
package/dist/node.d.ts CHANGED
@@ -1,22 +1,9 @@
1
1
  import tmp from "tmp";
2
- import { StaticPool } from "node-worker-threads-pool";
3
- import { NodeModel, RunnerConfig, ModelConfig, ResponseObject } from "./types";
4
- import { CancellationToken } from './CancellationToken';
2
+ import { NodeModel, RunnerConfig, ModelConfig, ResponseObject, Compatibility, WasmOptions, ModelInstance } from "./types";
3
+ import { CancellationToken } from "./CancellationToken";
5
4
  export { ColumnarSerializer } from "./serializer/columnarSerializer";
6
- export { CancellationToken } from './CancellationToken';
5
+ export { CancellationToken } from "./CancellationToken";
7
6
  export { ModelExecuteCancelled } from "./error";
8
- /**
9
- * WASM runner config
10
- * @typedef {Object} RunnerConfig
11
- * @property {string} id - Model id or version_uuid
12
- * @property {string} url - Model url
13
- */
14
- /**
15
- * Input object
16
- * @typedef {Object} InputObject
17
- * @property {Object} request_data - Request input date
18
- * @property {Object} request_meta - Request input meta
19
- */
20
7
  /**
21
8
  * WasmRunner class, responsible for managing model and it's lifecycle
22
9
  *
@@ -28,13 +15,16 @@ export declare class WasmRunner {
28
15
  _tempModelFolder: tmp.DirResult;
29
16
  license: string;
30
17
  models: any[];
31
- externalResolverModule: string;
18
+ externalResolverModule: any;
19
+ initializingModels: string[];
20
+ options: WasmOptions;
21
+ safeCompiler: string;
32
22
  /**
33
23
  * Create new Wasm Runner instance
34
24
  *
35
25
  * @param {RunnerConfig} wasmRunnerConfig
36
26
  */
37
- constructor(wasmRunnerConfig?: RunnerConfig, externalResolverModule?: string, license?: string);
27
+ constructor(wasmRunnerConfig?: RunnerConfig, externalResolverModule?: string, options?: any, license?: string);
38
28
  /**
39
29
  * Initialize wasm runner fetching model from remote server
40
30
  *
@@ -42,29 +32,46 @@ export declare class WasmRunner {
42
32
  * @function initialize
43
33
  */
44
34
  initialize(license?: string): Promise<void>;
45
- _createModelInstance(id: any, url: any, workerFolder: any, size: any): Promise<StaticPool<any, any>>;
35
+ _createModelInstance(id: any, url: any, workerFolder: any, size?: number): Promise<ModelInstance>;
46
36
  _initializeModelInstance(m: NodeModel): Promise<void>;
47
- _createModelInstanceFromURL(id: string, url: string, workerFolder: string, modelFolder: string, size: number): Promise<StaticPool<any, any>>;
37
+ _createModelInstanceFromURL(id: string, url: string, workerFolder: string, modelFolder: string, size: number): Promise<ModelInstance>;
48
38
  /**
49
- * Append and initialized new model to runner
39
+ * Append and initialize model in preparation for the `execute()`.
40
+ *
50
41
  * @param {ModelConfig} modelConfig
51
- * @returns Promise
42
+ * Model details like version_id as `id` and zip path as `url`.
43
+ *
44
+ * @returns {Promise<void>}
52
45
  */
53
46
  append(modelConfig: ModelConfig): Promise<void>;
54
47
  /**
55
- * Remove model from runner
56
- * @param {string} id Model id
57
- * @returns Promise
48
+ * Remove model from the list of initialized model useful for GC.
49
+ *
50
+ * @param {String} id
51
+ * ID of the model that needs to be removed.
52
+ *
53
+ * @returns {Promise<void>}
58
54
  */
59
55
  remove(id: string): Promise<void>;
60
56
  _parseError(rawResponse: any): Object;
61
57
  _getModel(id: string): NodeModel;
58
+ getModelSize(id: string): number;
59
+ getModelCompilerVersion(id: any): string;
62
60
  /**
63
61
  * Check if model existed
64
62
  * @param {string} id Model id
65
- * @returns boolean
63
+ * @returns {boolean}
66
64
  */
67
65
  isExist(id: string): boolean;
66
+ isModelCompatible(model: any, input: any): boolean;
67
+ getModelsStats(): {
68
+ stats: any;
69
+ busy: any;
70
+ size: any;
71
+ id: any;
72
+ }[];
73
+ private getPartiallyCompatibleMessage;
74
+ private getIncompatibleMessage;
68
75
  /**
69
76
  * Perform calculation. The runner will use request_meta.version_uuid of input argument to locate model
70
77
  * @async
@@ -72,4 +79,7 @@ export declare class WasmRunner {
72
79
  * @returns {Promise<ResponseObject>} - Response model data
73
80
  */
74
81
  execute(input: any, id?: string, raw?: boolean, cancelToken?: CancellationToken): Promise<ResponseObject>;
82
+ getNeuronCompilerVersion(logFile: any): Promise<any>;
83
+ checkCompilerVersionCompatibility(modelCompilerVersion: string): Promise<Compatibility>;
84
+ getSafeCompilerVersion(runnerVersion: string): any;
75
85
  }