@loaders.gl/worker-utils 4.2.0-alpha.4 → 4.2.0-alpha.6

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 (81) hide show
  1. package/dist/index.cjs +225 -86
  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 +83 -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.d.ts +1 -3
  15. package/dist/lib/process-utils/child-process-proxy.d.ts.map +1 -1
  16. package/dist/lib/process-utils/child-process-proxy.js +103 -93
  17. package/dist/lib/process-utils/process-utils.js +28 -23
  18. package/dist/lib/worker-api/create-worker.d.ts +1 -1
  19. package/dist/lib/worker-api/create-worker.d.ts.map +1 -1
  20. package/dist/lib/worker-api/create-worker.js +77 -74
  21. package/dist/lib/worker-api/get-worker-url.d.ts +1 -1
  22. package/dist/lib/worker-api/get-worker-url.d.ts.map +1 -1
  23. package/dist/lib/worker-api/get-worker-url.js +52 -26
  24. package/dist/lib/worker-api/process-on-worker.d.ts +1 -1
  25. package/dist/lib/worker-api/process-on-worker.d.ts.map +1 -1
  26. package/dist/lib/worker-api/process-on-worker.js +70 -67
  27. package/dist/lib/worker-api/validate-worker-version.d.ts +1 -1
  28. package/dist/lib/worker-api/validate-worker-version.d.ts.map +1 -1
  29. package/dist/lib/worker-api/validate-worker-version.js +29 -14
  30. package/dist/lib/worker-farm/worker-body.d.ts +1 -1
  31. package/dist/lib/worker-farm/worker-body.d.ts.map +1 -1
  32. package/dist/lib/worker-farm/worker-body.js +109 -68
  33. package/dist/lib/worker-farm/worker-farm.d.ts +1 -1
  34. package/dist/lib/worker-farm/worker-farm.d.ts.map +1 -1
  35. package/dist/lib/worker-farm/worker-farm.js +80 -62
  36. package/dist/lib/worker-farm/worker-job.d.ts +2 -2
  37. package/dist/lib/worker-farm/worker-job.d.ts.map +1 -1
  38. package/dist/lib/worker-farm/worker-job.js +48 -32
  39. package/dist/lib/worker-farm/worker-pool.d.ts +3 -3
  40. package/dist/lib/worker-farm/worker-pool.d.ts.map +1 -1
  41. package/dist/lib/worker-farm/worker-pool.js +153 -111
  42. package/dist/lib/worker-farm/worker-thread.d.ts +1 -1
  43. package/dist/lib/worker-farm/worker-thread.d.ts.map +1 -1
  44. package/dist/lib/worker-farm/worker-thread.js +126 -94
  45. package/dist/lib/worker-utils/get-loadable-worker-url.js +54 -24
  46. package/dist/lib/worker-utils/get-transfer-list.js +79 -44
  47. package/dist/lib/worker-utils/remove-nontransferable-options.js +23 -14
  48. package/dist/null-worker-node.js +6 -1
  49. package/dist/null-worker-node.js.map +2 -2
  50. package/dist/null-worker.js +3 -1
  51. package/dist/null-worker.js.map +2 -2
  52. package/dist/types.js +3 -1
  53. package/dist/workers/null-worker.js +6 -3
  54. package/package.json +11 -11
  55. package/src/lib/process-utils/child-process-proxy.ts +1 -1
  56. package/src/lib/worker-farm/worker-body.ts +7 -2
  57. package/dist/index.js.map +0 -1
  58. package/dist/lib/async-queue/async-queue.js.map +0 -1
  59. package/dist/lib/env-utils/assert.js.map +0 -1
  60. package/dist/lib/env-utils/globals.js.map +0 -1
  61. package/dist/lib/env-utils/version.js.map +0 -1
  62. package/dist/lib/library-utils/library-utils.js.map +0 -1
  63. package/dist/lib/node/require-utils.node.js.map +0 -1
  64. package/dist/lib/node/worker_threads-browser.js.map +0 -1
  65. package/dist/lib/node/worker_threads.js.map +0 -1
  66. package/dist/lib/process-utils/child-process-proxy.js.map +0 -1
  67. package/dist/lib/process-utils/process-utils.js.map +0 -1
  68. package/dist/lib/worker-api/create-worker.js.map +0 -1
  69. package/dist/lib/worker-api/get-worker-url.js.map +0 -1
  70. package/dist/lib/worker-api/process-on-worker.js.map +0 -1
  71. package/dist/lib/worker-api/validate-worker-version.js.map +0 -1
  72. package/dist/lib/worker-farm/worker-body.js.map +0 -1
  73. package/dist/lib/worker-farm/worker-farm.js.map +0 -1
  74. package/dist/lib/worker-farm/worker-job.js.map +0 -1
  75. package/dist/lib/worker-farm/worker-pool.js.map +0 -1
  76. package/dist/lib/worker-farm/worker-thread.js.map +0 -1
  77. package/dist/lib/worker-utils/get-loadable-worker-url.js.map +0 -1
  78. package/dist/lib/worker-utils/get-transfer-list.js.map +0 -1
  79. package/dist/lib/worker-utils/remove-nontransferable-options.js.map +0 -1
  80. package/dist/types.js.map +0 -1
  81. package/dist/workers/null-worker.js.map +0 -1
@@ -1,26 +1,31 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
1
4
  import ChildProcess from 'child_process';
2
- export function getAvailablePort() {
3
- let defaultPort = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 3000;
4
- return new Promise(resolve => {
5
- ChildProcess.exec('lsof -i -P -n | grep LISTEN', (error, stdout) => {
6
- if (error) {
7
- resolve(defaultPort);
8
- return;
9
- }
10
- const portsInUse = [];
11
- const regex = /:(\d+) \(LISTEN\)/;
12
- stdout.split('\n').forEach(line => {
13
- const match = regex.exec(line);
14
- if (match) {
15
- portsInUse.push(Number(match[1]));
16
- }
17
- });
18
- let port = defaultPort;
19
- while (portsInUse.includes(port)) {
20
- port++;
21
- }
22
- resolve(port);
5
+ // Get an available port
6
+ // Works on Unix systems
7
+ export function getAvailablePort(defaultPort = 3000) {
8
+ return new Promise((resolve) => {
9
+ // Get a list of all ports in use
10
+ ChildProcess.exec('lsof -i -P -n | grep LISTEN', (error, stdout) => {
11
+ if (error) {
12
+ // likely no permission, e.g. CI
13
+ resolve(defaultPort);
14
+ return;
15
+ }
16
+ const portsInUse = [];
17
+ const regex = /:(\d+) \(LISTEN\)/;
18
+ stdout.split('\n').forEach((line) => {
19
+ const match = regex.exec(line);
20
+ if (match) {
21
+ portsInUse.push(Number(match[1]));
22
+ }
23
+ });
24
+ let port = defaultPort;
25
+ while (portsInUse.includes(port)) {
26
+ port++;
27
+ }
28
+ resolve(port);
29
+ });
23
30
  });
24
- });
25
31
  }
26
- //# sourceMappingURL=process-utils.js.map
@@ -1,4 +1,4 @@
1
- import type { WorkerContext, Process, ProcessInBatches } from '../../types';
1
+ import type { WorkerContext, Process, ProcessInBatches } from "../../types.js";
2
2
  export type ProcessOnMainThread = (data: any, options?: {
3
3
  [key: string]: any;
4
4
  }, context?: WorkerContext) => any;
@@ -1 +1 @@
1
- {"version":3,"file":"create-worker.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-api/create-worker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAGV,aAAa,EACb,OAAO,EACP,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAUrB,MAAM,MAAM,mBAAmB,GAAG,CAChC,IAAI,EAAE,GAAG,EACT,OAAO,CAAC,EAAE;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAC,EAC9B,OAAO,CAAC,EAAE,aAAa,KACpB,GAAG,CAAC;AAET;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,CAAC,IAAI,CAAC,CAiDf"}
1
+ {"version":3,"file":"create-worker.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-api/create-worker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAGV,aAAa,EACb,OAAO,EACP,gBAAgB,EACjB,uBAAoB;AAUrB,MAAM,MAAM,mBAAmB,GAAG,CAChC,IAAI,EAAE,GAAG,EACT,OAAO,CAAC,EAAE;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAC,EAC9B,OAAO,CAAC,EAAE,aAAa,KACpB,GAAG,CAAC;AAET;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,gBAAgB,CAAC,EAAE,gBAAgB,GAClC,OAAO,CAAC,IAAI,CAAC,CAiDf"}
@@ -1,84 +1,87 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
1
4
  import AsyncQueue from "../async-queue/async-queue.js";
2
5
  import WorkerBody from "../worker-farm/worker-body.js";
6
+ // import {validateWorkerVersion} from './validate-worker-version';
7
+ /** Counter for jobs */
3
8
  let requestId = 0;
4
9
  let inputBatches;
5
10
  let options;
11
+ /**
12
+ * Set up a WebWorkerGlobalScope to talk with the main thread
13
+ */
6
14
  export async function createWorker(process, processInBatches) {
7
- if (!(await WorkerBody.inWorkerThread())) {
8
- return;
9
- }
10
- const context = {
11
- process: processOnMainThread
12
- };
13
- WorkerBody.onmessage = async (type, payload) => {
14
- try {
15
- switch (type) {
16
- case 'process':
17
- if (!process) {
18
- throw new Error('Worker does not support atomic processing');
19
- }
20
- const result = await process(payload.input, payload.options || {}, context);
21
- WorkerBody.postMessage('done', {
22
- result
23
- });
24
- break;
25
- case 'process-in-batches':
26
- if (!processInBatches) {
27
- throw new Error('Worker does not support batched processing');
28
- }
29
- inputBatches = new AsyncQueue();
30
- options = payload.options || {};
31
- const resultIterator = processInBatches(inputBatches, options, context);
32
- for await (const batch of resultIterator) {
33
- WorkerBody.postMessage('output-batch', {
34
- result: batch
35
- });
36
- }
37
- WorkerBody.postMessage('done', {});
38
- break;
39
- case 'input-batch':
40
- inputBatches.push(payload.input);
41
- break;
42
- case 'input-done':
43
- inputBatches.close();
44
- break;
45
- default:
46
- }
47
- } catch (error) {
48
- const message = error instanceof Error ? error.message : '';
49
- WorkerBody.postMessage('error', {
50
- error: message
51
- });
52
- }
53
- };
54
- }
55
- function processOnMainThread(arrayBuffer) {
56
- let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
57
- return new Promise((resolve, reject) => {
58
- const id = requestId++;
59
- const onMessage = (type, payload) => {
60
- if (payload.id !== id) {
15
+ if (!(await WorkerBody.inWorkerThread())) {
61
16
  return;
62
- }
63
- switch (type) {
64
- case 'done':
65
- WorkerBody.removeEventListener(onMessage);
66
- resolve(payload.result);
67
- break;
68
- case 'error':
69
- WorkerBody.removeEventListener(onMessage);
70
- reject(payload.error);
71
- break;
72
- default:
73
- }
17
+ }
18
+ const context = {
19
+ process: processOnMainThread
74
20
  };
75
- WorkerBody.addEventListener(onMessage);
76
- const payload = {
77
- id,
78
- input: arrayBuffer,
79
- options
21
+ // eslint-disable-next-line complexity
22
+ WorkerBody.onmessage = async (type, payload) => {
23
+ try {
24
+ switch (type) {
25
+ case 'process':
26
+ if (!process) {
27
+ throw new Error('Worker does not support atomic processing');
28
+ }
29
+ const result = await process(payload.input, payload.options || {}, context);
30
+ WorkerBody.postMessage('done', { result });
31
+ break;
32
+ case 'process-in-batches':
33
+ if (!processInBatches) {
34
+ throw new Error('Worker does not support batched processing');
35
+ }
36
+ inputBatches = new AsyncQueue();
37
+ options = payload.options || {};
38
+ const resultIterator = processInBatches(inputBatches, options, context);
39
+ for await (const batch of resultIterator) {
40
+ WorkerBody.postMessage('output-batch', { result: batch });
41
+ }
42
+ WorkerBody.postMessage('done', {});
43
+ break;
44
+ case 'input-batch':
45
+ inputBatches.push(payload.input);
46
+ break;
47
+ case 'input-done':
48
+ inputBatches.close();
49
+ break;
50
+ default:
51
+ }
52
+ }
53
+ catch (error) {
54
+ const message = error instanceof Error ? error.message : '';
55
+ WorkerBody.postMessage('error', { error: message });
56
+ }
80
57
  };
81
- WorkerBody.postMessage('process', payload);
82
- });
83
58
  }
84
- //# sourceMappingURL=create-worker.js.map
59
+ function processOnMainThread(arrayBuffer, options = {}) {
60
+ return new Promise((resolve, reject) => {
61
+ const id = requestId++;
62
+ /**
63
+ */
64
+ const onMessage = (type, payload) => {
65
+ if (payload.id !== id) {
66
+ // not ours
67
+ return;
68
+ }
69
+ switch (type) {
70
+ case 'done':
71
+ WorkerBody.removeEventListener(onMessage);
72
+ resolve(payload.result);
73
+ break;
74
+ case 'error':
75
+ WorkerBody.removeEventListener(onMessage);
76
+ reject(payload.error);
77
+ break;
78
+ default:
79
+ // ignore
80
+ }
81
+ };
82
+ WorkerBody.addEventListener(onMessage);
83
+ // Ask the main thread to decode data
84
+ const payload = { id, input: arrayBuffer, options };
85
+ WorkerBody.postMessage('process', payload);
86
+ });
87
+ }
@@ -1,4 +1,4 @@
1
- import type { WorkerObject, WorkerOptions } from '../../types';
1
+ import type { WorkerObject, WorkerOptions } from "../../types.js";
2
2
  /**
3
3
  * Gets worker object's name (for debugging in Chrome thread inspector window)
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"get-worker-url.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-api/get-worker-url.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,YAAY,EAAE,aAAa,EAAC,MAAM,aAAa,CAAC;AAK7D;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAG1D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CA6CtF"}
1
+ {"version":3,"file":"get-worker-url.d.ts","sourceRoot":"","sources":["../../../src/lib/worker-api/get-worker-url.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,YAAY,EAAE,aAAa,EAAC,uBAAoB;AAK7D;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAG1D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CA6CtF"}
@@ -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;AA8B5F;;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,EAwB9F;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"}