@loaders.gl/worker-utils 4.2.0-alpha.3 → 4.2.0-alpha.5

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 (73) hide show
  1. package/dist/index.cjs +172 -63
  2. package/dist/index.cjs.map +7 -0
  3. package/dist/index.d.ts +18 -18
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +19 -8
  6. package/dist/lib/async-queue/async-queue.js +80 -68
  7. package/dist/lib/env-utils/assert.js +10 -4
  8. package/dist/lib/env-utils/globals.js +19 -7
  9. package/dist/lib/env-utils/version.js +20 -11
  10. package/dist/lib/library-utils/library-utils.js +148 -73
  11. package/dist/lib/node/require-utils.node.js +72 -43
  12. package/dist/lib/node/worker_threads-browser.js +9 -2
  13. package/dist/lib/node/worker_threads.js +4 -2
  14. package/dist/lib/process-utils/child-process-proxy.js +101 -93
  15. package/dist/lib/process-utils/process-utils.js +28 -23
  16. package/dist/lib/worker-api/create-worker.d.ts +1 -1
  17. package/dist/lib/worker-api/create-worker.d.ts.map +1 -1
  18. package/dist/lib/worker-api/create-worker.js +77 -74
  19. package/dist/lib/worker-api/get-worker-url.d.ts +1 -1
  20. package/dist/lib/worker-api/get-worker-url.d.ts.map +1 -1
  21. package/dist/lib/worker-api/get-worker-url.js +52 -26
  22. package/dist/lib/worker-api/process-on-worker.d.ts +1 -1
  23. package/dist/lib/worker-api/process-on-worker.d.ts.map +1 -1
  24. package/dist/lib/worker-api/process-on-worker.js +70 -67
  25. package/dist/lib/worker-api/validate-worker-version.d.ts +1 -1
  26. package/dist/lib/worker-api/validate-worker-version.d.ts.map +1 -1
  27. package/dist/lib/worker-api/validate-worker-version.js +29 -14
  28. package/dist/lib/worker-farm/worker-body.d.ts +1 -1
  29. package/dist/lib/worker-farm/worker-body.d.ts.map +1 -1
  30. package/dist/lib/worker-farm/worker-body.js +106 -68
  31. package/dist/lib/worker-farm/worker-farm.d.ts +1 -1
  32. package/dist/lib/worker-farm/worker-farm.d.ts.map +1 -1
  33. package/dist/lib/worker-farm/worker-farm.js +77 -62
  34. package/dist/lib/worker-farm/worker-job.d.ts +2 -2
  35. package/dist/lib/worker-farm/worker-job.d.ts.map +1 -1
  36. package/dist/lib/worker-farm/worker-job.js +44 -32
  37. package/dist/lib/worker-farm/worker-pool.d.ts +3 -3
  38. package/dist/lib/worker-farm/worker-pool.d.ts.map +1 -1
  39. package/dist/lib/worker-farm/worker-pool.js +151 -111
  40. package/dist/lib/worker-farm/worker-thread.d.ts +1 -1
  41. package/dist/lib/worker-farm/worker-thread.d.ts.map +1 -1
  42. package/dist/lib/worker-farm/worker-thread.js +120 -94
  43. package/dist/lib/worker-utils/get-loadable-worker-url.js +54 -24
  44. package/dist/lib/worker-utils/get-transfer-list.js +79 -44
  45. package/dist/lib/worker-utils/remove-nontransferable-options.js +23 -14
  46. package/dist/types.js +3 -1
  47. package/dist/workers/null-worker.js +6 -3
  48. package/package.json +4 -4
  49. package/dist/index.js.map +0 -1
  50. package/dist/lib/async-queue/async-queue.js.map +0 -1
  51. package/dist/lib/env-utils/assert.js.map +0 -1
  52. package/dist/lib/env-utils/globals.js.map +0 -1
  53. package/dist/lib/env-utils/version.js.map +0 -1
  54. package/dist/lib/library-utils/library-utils.js.map +0 -1
  55. package/dist/lib/node/require-utils.node.js.map +0 -1
  56. package/dist/lib/node/worker_threads-browser.js.map +0 -1
  57. package/dist/lib/node/worker_threads.js.map +0 -1
  58. package/dist/lib/process-utils/child-process-proxy.js.map +0 -1
  59. package/dist/lib/process-utils/process-utils.js.map +0 -1
  60. package/dist/lib/worker-api/create-worker.js.map +0 -1
  61. package/dist/lib/worker-api/get-worker-url.js.map +0 -1
  62. package/dist/lib/worker-api/process-on-worker.js.map +0 -1
  63. package/dist/lib/worker-api/validate-worker-version.js.map +0 -1
  64. package/dist/lib/worker-farm/worker-body.js.map +0 -1
  65. package/dist/lib/worker-farm/worker-farm.js.map +0 -1
  66. package/dist/lib/worker-farm/worker-job.js.map +0 -1
  67. package/dist/lib/worker-farm/worker-pool.js.map +0 -1
  68. package/dist/lib/worker-farm/worker-thread.js.map +0 -1
  69. package/dist/lib/worker-utils/get-loadable-worker-url.js.map +0 -1
  70. package/dist/lib/worker-utils/get-transfer-list.js.map +0 -1
  71. package/dist/lib/worker-utils/remove-nontransferable-options.js.map +0 -1
  72. package/dist/types.js.map +0 -1
  73. package/dist/workers/null-worker.js.map +0 -1
@@ -1,34 +1,60 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
1
4
  import { assert } from "../env-utils/assert.js";
2
5
  import { isBrowser } from "../env-utils/globals.js";
3
6
  import { VERSION, NPM_TAG } from "../env-utils/version.js";
7
+ /**
8
+ * Gets worker object's name (for debugging in Chrome thread inspector window)
9
+ */
4
10
  export function getWorkerName(worker) {
5
- const warning = worker.version !== VERSION ? ` (worker-utils@${VERSION})` : '';
6
- return `${worker.name}@${worker.version}${warning}`;
11
+ const warning = worker.version !== VERSION ? ` (worker-utils@${VERSION})` : '';
12
+ return `${worker.name}@${worker.version}${warning}`;
7
13
  }
8
- export function getWorkerURL(worker) {
9
- let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
10
- const workerOptions = options[worker.id] || {};
11
- const workerFile = isBrowser ? `${worker.id}-worker.js` : `${worker.id}-worker-node.js`;
12
- let url = workerOptions.workerUrl;
13
- if (!url && worker.id === 'compression') {
14
- url = options.workerUrl;
15
- }
16
- if (options._workerType === 'test') {
17
- if (isBrowser) {
18
- url = `modules/${worker.module}/dist/${workerFile}`;
19
- } else {
20
- url = `modules/${worker.module}/src/workers/${worker.id}-worker-node.ts`;
14
+ /**
15
+ * Generate a worker URL based on worker object and options
16
+ * @returns A URL to one of the following:
17
+ * - a published worker on unpkg CDN
18
+ * - a local test worker
19
+ * - a URL provided by the user in options
20
+ */
21
+ export function getWorkerURL(worker, options = {}) {
22
+ const workerOptions = options[worker.id] || {};
23
+ const workerFile = isBrowser ? `${worker.id}-worker.js` : `${worker.id}-worker-node.js`;
24
+ let url = workerOptions.workerUrl;
25
+ // HACK: Allow for non-nested workerUrl for the CompressionWorker.
26
+ // For the compression worker, workerOptions is currently not nested correctly. For most loaders,
27
+ // you'd have options within an object, i.e. `{mvt: {coordinates: ...}}` but the CompressionWorker
28
+ // puts options at the top level, not within a `compression` key (its `id`). For this reason, the
29
+ // above `workerOptions` will always be a string (i.e. `'gzip'`) for the CompressionWorker. To not
30
+ // break backwards compatibility, we allow the CompressionWorker to have options at the top level.
31
+ if (!url && worker.id === 'compression') {
32
+ url = options.workerUrl;
21
33
  }
22
- }
23
- if (!url) {
24
- let version = worker.version;
25
- if (version === 'latest') {
26
- version = NPM_TAG;
34
+ // If URL is test, generate local loaders.gl url
35
+ // @ts-ignore _workerType
36
+ if (options._workerType === 'test') {
37
+ if (isBrowser) {
38
+ url = `modules/${worker.module}/dist/${workerFile}`;
39
+ }
40
+ else {
41
+ // In the test environment the ts-node loader requires TypeScript code
42
+ url = `modules/${worker.module}/src/workers/${worker.id}-worker-node.ts`;
43
+ }
27
44
  }
28
- const versionTag = version ? `@${version}` : '';
29
- url = `https://unpkg.com/@loaders.gl/${worker.module}${versionTag}/dist/${workerFile}`;
30
- }
31
- assert(url);
32
- return url;
45
+ // If url override is not provided, generate a URL to published version on npm CDN unpkg.com
46
+ if (!url) {
47
+ // GENERATE
48
+ let version = worker.version;
49
+ // On master we need to load npm alpha releases published with the `beta` tag
50
+ if (version === 'latest') {
51
+ // throw new Error('latest worker version specified');
52
+ version = NPM_TAG;
53
+ }
54
+ const versionTag = version ? `@${version}` : '';
55
+ url = `https://unpkg.com/@loaders.gl/${worker.module}${versionTag}/dist/${workerFile}`;
56
+ }
57
+ assert(url);
58
+ // Allow user to override location
59
+ return url;
33
60
  }
34
- //# sourceMappingURL=get-worker-url.js.map
@@ -1,4 +1,4 @@
1
- import type { WorkerObject, WorkerOptions, WorkerContext } from '../../types';
1
+ import type { WorkerObject, WorkerOptions, WorkerContext } from "../../types.js";
2
2
  /** Options for worker processing */
3
3
  export type ProcessOnWorkerOptions = WorkerOptions & {
4
4
  jobName?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"process-on-worker.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-api/process-on-worker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EAGd,MAAM,aAAa,CAAC;AAMrB,oCAAoC;AACpC,MAAM,MAAM,sBAAsB,GAAG,aAAa,GAAG;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,aAAa,4BAM/E;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,GAAG,EACT,OAAO,GAAE,sBAA2B,EACpC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,GAAG,CAAC,CAwBd"}
1
+ {"version":3,"file":"process-on-worker.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-api/process-on-worker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EAGd,uBAAoB;AAMrB,oCAAoC;AACpC,MAAM,MAAM,sBAAsB,GAAG,aAAa,GAAG;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,aAAa,4BAM/E;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,GAAG,EACT,OAAO,GAAE,sBAA2B,EACpC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,GAAG,CAAC,CAwBd"}
@@ -1,75 +1,78 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
1
4
  import WorkerFarm from "../worker-farm/worker-farm.js";
2
5
  import { getWorkerURL, getWorkerName } from "./get-worker-url.js";
3
6
  import { getTransferListForWriter } from "../worker-utils/get-transfer-list.js";
7
+ /**
8
+ * Determines if we can parse with worker
9
+ * @param loader
10
+ * @param data
11
+ * @param options
12
+ */
4
13
  export function canProcessOnWorker(worker, options) {
5
- if (!WorkerFarm.isSupported()) {
6
- return false;
7
- }
8
- return worker.worker && (options === null || options === void 0 ? void 0 : options.worker);
14
+ if (!WorkerFarm.isSupported()) {
15
+ return false;
16
+ }
17
+ return worker.worker && options?.worker;
9
18
  }
10
- export async function processOnWorker(worker, data) {
11
- let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
12
- let context = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
13
- const name = getWorkerName(worker);
14
- const workerFarm = WorkerFarm.getWorkerFarm(options);
15
- const {
16
- source
17
- } = options;
18
- const workerPoolProps = {
19
- name,
20
- source
21
- };
22
- if (!source) {
23
- workerPoolProps.url = getWorkerURL(worker, options);
24
- }
25
- const workerPool = workerFarm.getWorkerPool(workerPoolProps);
26
- const jobName = options.jobName || worker.name;
27
- const job = await workerPool.startJob(jobName, onMessage.bind(null, context));
28
- const transferableOptions = getTransferListForWriter(options);
29
- job.postMessage('process', {
30
- input: data,
31
- options: transferableOptions
32
- });
33
- const result = await job.result;
34
- return result.result;
19
+ /**
20
+ * This function expects that the worker thread sends certain messages,
21
+ * Creating such a worker can be automated if the worker is wrapper by a call to
22
+ * createWorker in @loaders.gl/worker-utils.
23
+ */
24
+ export async function processOnWorker(worker, data, options = {}, context = {}) {
25
+ const name = getWorkerName(worker);
26
+ const workerFarm = WorkerFarm.getWorkerFarm(options);
27
+ const { source } = options;
28
+ const workerPoolProps = { name, source };
29
+ if (!source) {
30
+ workerPoolProps.url = getWorkerURL(worker, options);
31
+ }
32
+ const workerPool = workerFarm.getWorkerPool(workerPoolProps);
33
+ const jobName = options.jobName || worker.name;
34
+ const job = await workerPool.startJob(jobName,
35
+ // eslint-disable-next-line
36
+ onMessage.bind(null, context));
37
+ // Kick off the processing in the worker
38
+ const transferableOptions = getTransferListForWriter(options);
39
+ job.postMessage('process', { input: data, options: transferableOptions });
40
+ const result = await job.result;
41
+ return result.result;
35
42
  }
43
+ /**
44
+ * Job completes when we receive the result
45
+ * @param job
46
+ * @param message
47
+ */
36
48
  async function onMessage(context, job, type, payload) {
37
- switch (type) {
38
- case 'done':
39
- job.done(payload);
40
- break;
41
- case 'error':
42
- job.error(new Error(payload.error));
43
- break;
44
- case 'process':
45
- const {
46
- id,
47
- input,
48
- options
49
- } = payload;
50
- try {
51
- if (!context.process) {
52
- job.postMessage('error', {
53
- id,
54
- error: 'Worker not set up to process on main thread'
55
- });
56
- return;
57
- }
58
- const result = await context.process(input, options);
59
- job.postMessage('done', {
60
- id,
61
- result
62
- });
63
- } catch (error) {
64
- const message = error instanceof Error ? error.message : 'unknown error';
65
- job.postMessage('error', {
66
- id,
67
- error: message
68
- });
69
- }
70
- break;
71
- default:
72
- console.warn(`process-on-worker: unknown message ${type}`);
73
- }
49
+ switch (type) {
50
+ case 'done':
51
+ // Worker is done
52
+ job.done(payload);
53
+ break;
54
+ case 'error':
55
+ // Worker encountered an error
56
+ job.error(new Error(payload.error));
57
+ break;
58
+ case 'process':
59
+ // Worker is asking for us (main thread) to process something
60
+ const { id, input, options } = payload;
61
+ try {
62
+ if (!context.process) {
63
+ job.postMessage('error', { id, error: 'Worker not set up to process on main thread' });
64
+ return;
65
+ }
66
+ const result = await context.process(input, options);
67
+ job.postMessage('done', { id, result });
68
+ }
69
+ catch (error) {
70
+ const message = error instanceof Error ? error.message : 'unknown error';
71
+ job.postMessage('error', { id, error: message });
72
+ }
73
+ break;
74
+ default:
75
+ // eslint-disable-next-line
76
+ console.warn(`process-on-worker: unknown message ${type}`);
77
+ }
74
78
  }
75
- //# sourceMappingURL=process-on-worker.js.map
@@ -1,4 +1,4 @@
1
- import type { WorkerObject } from '../../types';
1
+ import type { WorkerObject } from "../../types.js";
2
2
  /**
3
3
  * Check if worker is compatible with this library version
4
4
  * @param worker
@@ -1 +1 @@
1
- {"version":3,"file":"validate-worker-version.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-api/validate-worker-version.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AAI9C;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,WAAW,GAAE,MAAgB,GAC5B,OAAO,CAmBT"}
1
+ {"version":3,"file":"validate-worker-version.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-api/validate-worker-version.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,YAAY,EAAC,uBAAoB;AAI9C;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,YAAY,EACpB,WAAW,GAAE,MAAgB,GAC5B,OAAO,CAmBT"}
@@ -1,19 +1,34 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
1
4
  import { assert } from "../env-utils/assert.js";
2
5
  import { VERSION } from "../env-utils/version.js";
3
- export function validateWorkerVersion(worker) {
4
- let coreVersion = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : VERSION;
5
- assert(worker, 'no worker provided');
6
- const workerVersion = worker.version;
7
- if (!coreVersion || !workerVersion) {
8
- return false;
9
- }
10
- return true;
6
+ /**
7
+ * Check if worker is compatible with this library version
8
+ * @param worker
9
+ * @param libVersion
10
+ * @returns `true` if the two versions are compatible
11
+ */
12
+ export function validateWorkerVersion(worker, coreVersion = VERSION) {
13
+ assert(worker, 'no worker provided');
14
+ const workerVersion = worker.version;
15
+ if (!coreVersion || !workerVersion) {
16
+ return false;
17
+ }
18
+ // TODO enable when fix the __version__ injection
19
+ // const coreVersions = parseVersion(coreVersion);
20
+ // const workerVersions = parseVersion(workerVersion);
21
+ // assert(
22
+ // coreVersion.major === workerVersion.major && coreVersion.minor <= workerVersion.minor,
23
+ // `worker: ${worker.name} is not compatible. ${coreVersion.major}.${
24
+ // coreVersion.minor
25
+ // }+ is required.`
26
+ // );
27
+ return true;
11
28
  }
29
+ // @ts-ignore
30
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
12
31
  function parseVersion(version) {
13
- const parts = version.split('.').map(Number);
14
- return {
15
- major: parts[0],
16
- minor: parts[1]
17
- };
32
+ const parts = version.split('.').map(Number);
33
+ return { major: parts[0], minor: parts[1] };
18
34
  }
19
- //# sourceMappingURL=validate-worker-version.js.map
@@ -1,4 +1,4 @@
1
- import type { WorkerMessageType, WorkerMessagePayload } from '../../types';
1
+ import type { WorkerMessageType, WorkerMessagePayload } from "../../types.js";
2
2
  /**
3
3
  * Type safe wrapper for worker code
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"worker-body.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-farm/worker-body.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,aAAa,CAAC;AA2B5F;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,oDAAoD;WACvC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAO/C,MAAM,KAAK,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB,KAAK,GAAG,EAsB9F;WAEY,gBAAgB,CAC3B,SAAS,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB,KAAK,GAAG;WAyB/D,mBAAmB,CAC9B,SAAS,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB,KAAK,GAAG;IAY5E;;;;OAIG;WACU,WAAW,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBhG"}
1
+ {"version":3,"file":"worker-body.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-farm/worker-body.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAoB,iBAAiB,EAAE,oBAAoB,EAAC,uBAAoB;AA2B5F;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,oDAAoD;WACvC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAO/C,MAAM,KAAK,SAAS,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB,KAAK,GAAG,EAsB9F;WAEY,gBAAgB,CAC3B,SAAS,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB,KAAK,GAAG;WAyB/D,mBAAmB,CAC9B,SAAS,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB,KAAK,GAAG;IAY5E;;;;OAIG;WACU,WAAW,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBhG"}
@@ -1,83 +1,121 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
1
4
  import { getTransferList } from "../worker-utils/get-transfer-list.js";
2
5
  import { parentPort } from "../node/worker_threads.js";
6
+ /** Vile hack to defeat over-zealous bundlers from stripping out the require */
3
7
  async function getParentPort() {
4
- return parentPort;
8
+ // const isNode = globalThis.process;
9
+ // let parentPort;
10
+ // try {
11
+ // // prettier-ignore
12
+ // eval('globalThis.parentPort = require(\'worker_threads\').parentPort'); // eslint-disable-line no-eval
13
+ // parentPort = globalThis.parentPort;
14
+ // } catch {
15
+ // try {
16
+ // // prettier-ignore
17
+ // eval('globalThis.workerThreadsPromise = import(\'worker_threads\')'); // eslint-disable-line no-eval
18
+ // const workerThreads = await globalThis.workerThreadsPromise;
19
+ // parentPort = workerThreads.parentPort;
20
+ // } catch (error) {
21
+ // console.error((error as Error).message); // eslint-disable-line no-console
22
+ // }
23
+ // }
24
+ return parentPort;
5
25
  }
6
26
  const onMessageWrapperMap = new Map();
27
+ /**
28
+ * Type safe wrapper for worker code
29
+ */
7
30
  export default class WorkerBody {
8
- static async inWorkerThread() {
9
- return typeof self !== 'undefined' || Boolean(await getParentPort());
10
- }
11
- static set onmessage(onMessage) {
12
- async function handleMessage(message) {
13
- const parentPort = await getParentPort();
14
- const {
15
- type,
16
- payload
17
- } = parentPort ? message : message.data;
18
- onMessage(type, payload);
31
+ /** Check that we are actually in a worker thread */
32
+ static async inWorkerThread() {
33
+ return typeof self !== 'undefined' || Boolean(await getParentPort());
19
34
  }
20
- getParentPort().then(parentPort => {
21
- if (parentPort) {
22
- parentPort.on('message', handleMessage);
23
- parentPort.on('exit', () => console.debug('Node worker closing'));
24
- } else {
25
- globalThis.onmessage = handleMessage;
26
- }
27
- });
28
- }
29
- static async addEventListener(onMessage) {
30
- let onMessageWrapper = onMessageWrapperMap.get(onMessage);
31
- if (!onMessageWrapper) {
32
- onMessageWrapper = async message => {
33
- if (!isKnownMessage(message)) {
34
- return;
35
+ /*
36
+ * (type: WorkerMessageType, payload: WorkerMessagePayload) => any
37
+ */
38
+ static set onmessage(onMessage) {
39
+ async function handleMessage(message) {
40
+ const parentPort = await getParentPort();
41
+ // Confusingly the message itself also has a 'type' field which is always set to 'message'
42
+ const { type, payload } = parentPort ? message : message.data;
43
+ // if (!isKnownMessage(message)) {
44
+ // return;
45
+ // }
46
+ onMessage(type, payload);
35
47
  }
36
- const parentPort = await getParentPort();
37
- const {
38
- type,
39
- payload
40
- } = parentPort ? message : message.data;
41
- onMessage(type, payload);
42
- };
48
+ getParentPort().then((parentPort) => {
49
+ if (parentPort) {
50
+ parentPort.on('message', handleMessage);
51
+ // if (message == 'exit') { parentPort.unref(); }
52
+ // eslint-disable-next-line
53
+ parentPort.on('exit', () => console.debug('Node worker closing'));
54
+ }
55
+ else {
56
+ // eslint-disable-next-line no-restricted-globals
57
+ globalThis.onmessage = handleMessage;
58
+ }
59
+ });
43
60
  }
44
- const parentPort = await getParentPort();
45
- if (parentPort) {
46
- console.error('not implemented');
47
- } else {
48
- globalThis.addEventListener('message', onMessageWrapper);
61
+ static async addEventListener(onMessage) {
62
+ let onMessageWrapper = onMessageWrapperMap.get(onMessage);
63
+ if (!onMessageWrapper) {
64
+ onMessageWrapper = async (message) => {
65
+ if (!isKnownMessage(message)) {
66
+ return;
67
+ }
68
+ const parentPort = await getParentPort();
69
+ // Confusingly in the browser, the message itself also has a 'type' field which is always set to 'message'
70
+ const { type, payload } = parentPort ? message : message.data;
71
+ onMessage(type, payload);
72
+ };
73
+ }
74
+ const parentPort = await getParentPort();
75
+ if (parentPort) {
76
+ console.error('not implemented'); // eslint-disable-line
77
+ }
78
+ else {
79
+ globalThis.addEventListener('message', onMessageWrapper);
80
+ }
49
81
  }
50
- }
51
- static async removeEventListener(onMessage) {
52
- const onMessageWrapper = onMessageWrapperMap.get(onMessage);
53
- onMessageWrapperMap.delete(onMessage);
54
- const parentPort = await getParentPort();
55
- if (parentPort) {
56
- console.error('not implemented');
57
- } else {
58
- globalThis.removeEventListener('message', onMessageWrapper);
82
+ static async removeEventListener(onMessage) {
83
+ const onMessageWrapper = onMessageWrapperMap.get(onMessage);
84
+ onMessageWrapperMap.delete(onMessage);
85
+ const parentPort = await getParentPort();
86
+ if (parentPort) {
87
+ console.error('not implemented'); // eslint-disable-line
88
+ }
89
+ else {
90
+ globalThis.removeEventListener('message', onMessageWrapper);
91
+ }
59
92
  }
60
- }
61
- static async postMessage(type, payload) {
62
- const data = {
63
- source: 'loaders.gl',
64
- type,
65
- payload
66
- };
67
- const transferList = getTransferList(payload);
68
- const parentPort = await getParentPort();
69
- if (parentPort) {
70
- parentPort.postMessage(data, transferList);
71
- } else {
72
- globalThis.postMessage(data, transferList);
93
+ /**
94
+ * Send a message from a worker to creating thread (main thread)
95
+ * @param type
96
+ * @param payload
97
+ */
98
+ static async postMessage(type, payload) {
99
+ const data = { source: 'loaders.gl', type, payload };
100
+ // console.log('posting message', data);
101
+ // Cast to Node compatible transfer list
102
+ const transferList = getTransferList(payload);
103
+ const parentPort = await getParentPort();
104
+ if (parentPort) {
105
+ parentPort.postMessage(data, transferList);
106
+ // console.log('posted message', data);
107
+ }
108
+ else {
109
+ // @ts-expect-error Outside of worker scopes this call has a third parameter
110
+ globalThis.postMessage(data, transferList);
111
+ }
73
112
  }
74
- }
75
113
  }
114
+ // Filter out noise messages sent to workers
76
115
  function isKnownMessage(message) {
77
- const {
78
- type,
79
- data
80
- } = message;
81
- return type === 'message' && data && typeof data.source === 'string' && data.source.startsWith('loaders.gl');
116
+ const { type, data } = message;
117
+ return (type === 'message' &&
118
+ data &&
119
+ typeof data.source === 'string' &&
120
+ data.source.startsWith('loaders.gl'));
82
121
  }
83
- //# sourceMappingURL=worker-body.js.map
@@ -1,4 +1,4 @@
1
- import WorkerPool from './worker-pool';
1
+ import WorkerPool from "./worker-pool.js";
2
2
  /**
3
3
  * @param maxConcurrency - max count of workers
4
4
  * @param maxMobileConcurrency - max count of workers on mobile
@@ -1 +1 @@
1
- {"version":3,"file":"worker-farm.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-farm/worker-farm.ts"],"names":[],"mappings":"AAIA,OAAO,UAAU,MAAM,eAAe,CAAC;AAGvC;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AASF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,WAAW,CAAiC;IAEpD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAa;IAExC,uDAAuD;IACvD,MAAM,CAAC,WAAW,IAAI,OAAO;IAI7B,2DAA2D;IAC3D,MAAM,CAAC,aAAa,CAAC,KAAK,GAAE,eAAoB,GAAG,UAAU;IAM7D,0DAA0D;IAC1D,OAAO;IAOP;;;OAGG;IACH,OAAO,IAAI,IAAI;IAOf;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAQtC;;;;;;;;OAQG;IACH,aAAa,CAAC,OAAO,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,UAAU;IAejF,mBAAmB;;;;;;CAQpB"}
1
+ {"version":3,"file":"worker-farm.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-farm/worker-farm.ts"],"names":[],"mappings":"AAIA,OAAO,UAAU,yBAAsB;AAGvC;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AASF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,UAAU;IAC7B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,WAAW,CAAiC;IAEpD,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAa;IAExC,uDAAuD;IACvD,MAAM,CAAC,WAAW,IAAI,OAAO;IAI7B,2DAA2D;IAC3D,MAAM,CAAC,aAAa,CAAC,KAAK,GAAE,eAAoB,GAAG,UAAU;IAM7D,0DAA0D;IAC1D,OAAO;IAOP;;;OAGG;IACH,OAAO,IAAI,IAAI;IAOf;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAQtC;;;;;;;;OAQG;IACH,aAAa,CAAC,OAAO,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAC,GAAG,UAAU;IAejF,mBAAmB;;;;;;CAQpB"}