@loaders.gl/core 3.1.8 → 3.2.0-alpha.3

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 (78) hide show
  1. package/dist/dist.min.js +234 -60
  2. package/dist/es5/index.js +8 -2
  3. package/dist/es5/index.js.map +1 -1
  4. package/dist/es5/lib/api/encode.js +75 -50
  5. package/dist/es5/lib/api/encode.js.map +1 -1
  6. package/dist/es5/lib/api/loader-options.js +20 -0
  7. package/dist/es5/lib/api/loader-options.js.map +1 -0
  8. package/dist/es5/lib/api/parse.js +36 -17
  9. package/dist/es5/lib/api/parse.js.map +1 -1
  10. package/dist/es5/lib/api/select-loader.js.map +1 -1
  11. package/dist/es5/lib/init.js +1 -1
  12. package/dist/es5/lib/init.js.map +1 -1
  13. package/dist/es5/lib/loader-utils/option-defaults.js +4 -1
  14. package/dist/es5/lib/loader-utils/option-defaults.js.map +1 -1
  15. package/dist/es5/lib/loader-utils/option-utils.js +3 -0
  16. package/dist/es5/lib/loader-utils/option-utils.js.map +1 -1
  17. package/dist/es5/lib/utils/response-utils.js +2 -2
  18. package/dist/es5/lib/utils/response-utils.js.map +1 -1
  19. package/dist/es5/null-loader.js +22 -11
  20. package/dist/es5/null-loader.js.map +1 -1
  21. package/dist/esm/index.js +1 -1
  22. package/dist/esm/index.js.map +1 -1
  23. package/dist/esm/lib/api/encode.js +12 -0
  24. package/dist/esm/lib/api/encode.js.map +1 -1
  25. package/dist/esm/lib/api/loader-options.js +3 -0
  26. package/dist/esm/lib/api/loader-options.js.map +1 -0
  27. package/dist/esm/lib/api/parse.js +24 -0
  28. package/dist/esm/lib/api/parse.js.map +1 -1
  29. package/dist/esm/lib/api/select-loader.js.map +1 -1
  30. package/dist/esm/lib/init.js +1 -1
  31. package/dist/esm/lib/init.js.map +1 -1
  32. package/dist/esm/lib/loader-utils/option-defaults.js +3 -1
  33. package/dist/esm/lib/loader-utils/option-defaults.js.map +1 -1
  34. package/dist/esm/lib/loader-utils/option-utils.js +1 -3
  35. package/dist/esm/lib/loader-utils/option-utils.js.map +1 -1
  36. package/dist/esm/lib/utils/response-utils.js +2 -2
  37. package/dist/esm/lib/utils/response-utils.js.map +1 -1
  38. package/dist/esm/null-loader.js +19 -6
  39. package/dist/esm/null-loader.js.map +1 -1
  40. package/dist/index.d.ts +1 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +5 -4
  43. package/dist/lib/api/encode.d.ts +1 -1
  44. package/dist/lib/api/encode.d.ts.map +1 -1
  45. package/dist/lib/api/encode.js +13 -5
  46. package/dist/lib/api/loader-options.d.ts +3 -0
  47. package/dist/lib/api/loader-options.d.ts.map +1 -0
  48. package/dist/lib/api/loader-options.js +7 -0
  49. package/dist/lib/api/parse.d.ts.map +1 -1
  50. package/dist/lib/api/parse.js +8 -0
  51. package/dist/lib/api/select-loader.js +1 -0
  52. package/dist/lib/loader-utils/option-defaults.d.ts.map +1 -1
  53. package/dist/lib/loader-utils/option-defaults.js +3 -1
  54. package/dist/lib/loader-utils/option-utils.d.ts +8 -0
  55. package/dist/lib/loader-utils/option-utils.d.ts.map +1 -1
  56. package/dist/lib/loader-utils/option-utils.js +10 -6
  57. package/dist/lib/utils/response-utils.js +2 -2
  58. package/dist/null-loader.d.ts.map +1 -1
  59. package/dist/null-loader.js +17 -5
  60. package/dist/null-worker.js +61 -21
  61. package/package.json +6 -4
  62. package/src/index.ts +1 -1
  63. package/src/lib/api/encode.ts +9 -1
  64. package/src/lib/api/loader-options.ts +2 -0
  65. package/src/lib/api/parse.ts +9 -0
  66. package/src/lib/api/select-loader.ts +1 -0
  67. package/src/lib/loader-utils/option-defaults.ts +3 -1
  68. package/src/lib/loader-utils/option-utils.ts +6 -3
  69. package/src/lib/utils/response-utils.ts +2 -2
  70. package/src/null-loader.ts +17 -5
  71. package/dist/es5/lib/api/set-loader-options.js +0 -13
  72. package/dist/es5/lib/api/set-loader-options.js.map +0 -1
  73. package/dist/esm/lib/api/set-loader-options.js +0 -5
  74. package/dist/esm/lib/api/set-loader-options.js.map +0 -1
  75. package/dist/lib/api/set-loader-options.d.ts +0 -6
  76. package/dist/lib/api/set-loader-options.d.ts.map +0 -1
  77. package/dist/lib/api/set-loader-options.js +0 -12
  78. package/src/lib/api/set-loader-options.ts +0 -9
@@ -35,16 +35,33 @@
35
35
  }
36
36
 
37
37
  // ../worker-utils/src/lib/worker-farm/worker-body.ts
38
+ function getParentPort() {
39
+ let parentPort;
40
+ try {
41
+ eval("globalThis.parentPort = require('worker_threads').parentPort");
42
+ parentPort = globalThis.parentPort;
43
+ } catch {
44
+ }
45
+ return parentPort;
46
+ }
38
47
  var onMessageWrapperMap = new Map();
39
48
  var WorkerBody = class {
49
+ static inWorkerThread() {
50
+ return typeof self !== "undefined" || Boolean(getParentPort());
51
+ }
40
52
  static set onmessage(onMessage) {
41
- self.onmessage = (message) => {
42
- if (!isKnownMessage(message)) {
43
- return;
44
- }
45
- const { type, payload } = message.data;
53
+ function handleMessage(message) {
54
+ const parentPort3 = getParentPort();
55
+ const { type, payload } = parentPort3 ? message : message.data;
46
56
  onMessage(type, payload);
47
- };
57
+ }
58
+ const parentPort2 = getParentPort();
59
+ if (parentPort2) {
60
+ parentPort2.on("message", handleMessage);
61
+ parentPort2.on("exit", () => console.debug("Node worker closing"));
62
+ } else {
63
+ globalThis.onmessage = handleMessage;
64
+ }
48
65
  }
49
66
  static addEventListener(onMessage) {
50
67
  let onMessageWrapper = onMessageWrapperMap.get(onMessage);
@@ -53,22 +70,36 @@
53
70
  if (!isKnownMessage(message)) {
54
71
  return;
55
72
  }
56
- const { type, payload } = message.data;
73
+ const parentPort3 = getParentPort();
74
+ const { type, payload } = parentPort3 ? message : message.data;
57
75
  onMessage(type, payload);
58
76
  };
59
77
  }
60
- self.addEventListener("message", onMessageWrapper);
78
+ const parentPort2 = getParentPort();
79
+ if (parentPort2) {
80
+ console.error("not implemented");
81
+ } else {
82
+ globalThis.addEventListener("message", onMessageWrapper);
83
+ }
61
84
  }
62
85
  static removeEventListener(onMessage) {
63
86
  const onMessageWrapper = onMessageWrapperMap.get(onMessage);
64
87
  onMessageWrapperMap.delete(onMessage);
65
- self.removeEventListener("message", onMessageWrapper);
88
+ const parentPort2 = getParentPort();
89
+ if (parentPort2) {
90
+ console.error("not implemented");
91
+ } else {
92
+ globalThis.removeEventListener("message", onMessageWrapper);
93
+ }
66
94
  }
67
95
  static postMessage(type, payload) {
68
- if (self) {
69
- const data = { source: "loaders.gl", type, payload };
70
- const transferList = getTransferList(payload);
71
- self.postMessage(data, transferList);
96
+ const data = { source: "loaders.gl", type, payload };
97
+ const transferList = getTransferList(payload);
98
+ const parentPort2 = getParentPort();
99
+ if (parentPort2) {
100
+ parentPort2.postMessage(data, transferList);
101
+ } else {
102
+ globalThis.postMessage(data, transferList);
72
103
  }
73
104
  }
74
105
  };
@@ -80,19 +111,20 @@
80
111
  // ../loader-utils/src/lib/worker-loader-utils/create-loader-worker.ts
81
112
  var requestId = 0;
82
113
  function createLoaderWorker(loader) {
83
- if (typeof self === "undefined") {
114
+ if (!WorkerBody.inWorkerThread()) {
84
115
  return;
85
116
  }
86
117
  WorkerBody.onmessage = async (type, payload) => {
87
118
  switch (type) {
88
119
  case "process":
89
120
  try {
90
- const { input, options = {} } = payload;
121
+ const { input, options = {}, context = {} } = payload;
91
122
  const result = await parseData({
92
123
  loader,
93
124
  arrayBuffer: input,
94
125
  options,
95
126
  context: {
127
+ ...context,
96
128
  parse: parseOnMainThread
97
129
  }
98
130
  });
@@ -152,7 +184,13 @@
152
184
  }
153
185
 
154
186
  // src/null-loader.ts
155
- var VERSION = true ? "3.1.8" : "latest";
187
+ var VERSION = true ? "3.2.0-alpha.3" : "latest";
188
+ function parseSync(arrayBuffer, options, context) {
189
+ if (!options.null.echoParameters)
190
+ return null;
191
+ context = context && JSON.parse(JSON.stringify(context));
192
+ return { arrayBuffer, options, context };
193
+ }
156
194
  var NullLoader = {
157
195
  name: "Null loader",
158
196
  id: "null",
@@ -160,16 +198,18 @@
160
198
  version: VERSION,
161
199
  mimeTypes: ["application/x.empty"],
162
200
  extensions: ["null"],
163
- parse: async (arrayBuffer) => arrayBuffer,
164
- parseSync: (arrayBuffer) => arrayBuffer,
165
- parseInBatches: async function* generator(asyncIterator) {
201
+ parse: async (arrayBuffer, options, context) => parseSync(arrayBuffer, options, context),
202
+ parseSync,
203
+ parseInBatches: async function* generator(asyncIterator, options, context) {
166
204
  for await (const batch of asyncIterator) {
167
- yield batch;
205
+ yield parseSync(batch, options, context);
168
206
  }
169
207
  },
170
208
  tests: [() => false],
171
209
  options: {
172
- null: {}
210
+ null: {
211
+ echoParameters: false
212
+ }
173
213
  }
174
214
  };
175
215
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/core",
3
- "version": "3.1.8",
3
+ "version": "3.2.0-alpha.3",
4
4
  "description": "Framework-independent loaders for 3D graphics formats",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -25,6 +25,8 @@
25
25
  "fs": false,
26
26
  "stream": false,
27
27
  "./src/iterators/make-stream/make-node-stream.ts": "./src/iterators/make-stream/make-dom-stream.ts",
28
+ "./src/iterators/make-stream/make-node-stream.js": "./src/iterators/make-stream/make-dom-stream.js",
29
+ "./dist/iterators/make-stream/make-node-stream.js": "./dist/iterators/make-stream/make-dom-stream.js",
28
30
  "./dist/es5/iterators/make-stream/make-node-stream.js": "./dist/es5/iterators/make-stream/make-dom-stream.js",
29
31
  "./dist/esm/iterators/make-stream/make-node-stream.js": "./dist/esm/iterators/make-stream/make-dom-stream.js"
30
32
  },
@@ -40,10 +42,10 @@
40
42
  },
41
43
  "dependencies": {
42
44
  "@babel/runtime": "^7.3.1",
43
- "@loaders.gl/loader-utils": "3.1.8",
44
- "@loaders.gl/worker-utils": "3.1.8",
45
+ "@loaders.gl/loader-utils": "3.2.0-alpha.3",
46
+ "@loaders.gl/worker-utils": "3.2.0-alpha.3",
45
47
  "@probe.gl/log": "^3.5.0",
46
48
  "probe.gl": "^3.4.0"
47
49
  },
48
- "gitHead": "0ef07b4e9fc20f5a882224cf241c6fd1bad898d8"
50
+ "gitHead": "f0d4b801efeb7094283106352ee759eccfb21f10"
49
51
  }
package/src/index.ts CHANGED
@@ -6,7 +6,7 @@ export {readFileSync} from './lib/fetch/read-file';
6
6
  export {writeFile, writeFileSync} from './lib/fetch/write-file';
7
7
 
8
8
  // CONFIGURATION
9
- export {setLoaderOptions} from './lib/api/set-loader-options';
9
+ export {setLoaderOptions, getLoaderOptions} from './lib/api/loader-options';
10
10
  export {registerLoaders} from './lib/api/register-loaders';
11
11
  export {selectLoader, selectLoaderSync} from './lib/api/select-loader';
12
12
 
@@ -1,8 +1,10 @@
1
- import type {Writer, LoaderOptions} from '@loaders.gl/loader-utils';
1
+ import {Writer, LoaderOptions, canEncodeWithWorker} from '@loaders.gl/loader-utils';
2
+ import {processOnWorker} from '@loaders.gl/worker-utils';
2
3
  import {concatenateArrayBuffers, resolvePath} from '@loaders.gl/loader-utils';
3
4
  import {isBrowser} from '@loaders.gl/loader-utils';
4
5
  import {writeFile} from '../fetch/write-file';
5
6
  import {fetchFile} from '../fetch/fetch-file';
7
+ import {getLoaderOptions} from './loader-options';
6
8
 
7
9
  /**
8
10
  * Encode loaded data into a binary ArrayBuffer using the specified Writer.
@@ -12,6 +14,12 @@ export async function encode(
12
14
  writer: Writer,
13
15
  options?: LoaderOptions
14
16
  ): Promise<ArrayBuffer> {
17
+ const globalOptions = getLoaderOptions();
18
+ options = {...globalOptions, ...options};
19
+ if (canEncodeWithWorker(writer, options)) {
20
+ return await processOnWorker(writer, data, options);
21
+ }
22
+
15
23
  // TODO Merge default writer options with options argument like it is done in load module.
16
24
  if (writer.encode) {
17
25
  return await writer.encode(data, options);
@@ -0,0 +1,2 @@
1
+ export {setGlobalOptions as setLoaderOptions} from '../loader-utils/option-utils';
2
+ export {getGlobalLoaderOptions as getLoaderOptions} from '../loader-utils/option-utils';
@@ -2,6 +2,7 @@ import type {DataType, Loader, LoaderContext, LoaderOptions} from '@loaders.gl/l
2
2
  import {assert, validateWorkerVersion} from '@loaders.gl/worker-utils';
3
3
  import {parseWithWorker, canParseWithWorker} from '@loaders.gl/loader-utils';
4
4
  import {isLoaderObject} from '../loader-utils/normalize-loader';
5
+ import {isResponse} from '../../javascript-utils/is-type';
5
6
  import {normalizeOptions} from '../loader-utils/option-utils';
6
7
  import {getArrayBufferOrStringFromData} from '../loader-utils/get-data';
7
8
  import {getLoaderContext, getLoadersFromContext} from '../loader-utils/loader-context';
@@ -62,6 +63,14 @@ export async function parse(
62
63
  async function parseWithLoader(loader, data, options, context) {
63
64
  validateWorkerVersion(loader);
64
65
 
66
+ if (isResponse(data)) {
67
+ // Serialize to support passing the response to web worker
68
+ const response = data as Response;
69
+ const {ok, redirected, status, statusText, type, url} = response;
70
+ const headers = Object.fromEntries(response.headers.entries());
71
+ context.response = {headers, ok, redirected, status, statusText, type, url};
72
+ }
73
+
65
74
  data = await getArrayBufferOrStringFromData(data, loader, options);
66
75
 
67
76
  // First check for synchronous text parser, wrap results in promises
@@ -104,6 +104,7 @@ export function selectLoaderSync(
104
104
  }
105
105
 
106
106
  /** Implements loaders selection logic */
107
+ // eslint-disable-next-line complexity
107
108
  function selectLoaderInternal(
108
109
  data: Response | Blob | ArrayBuffer | string,
109
110
  loaders: Loader[],
@@ -1,4 +1,5 @@
1
1
  import type {LoaderOptions} from '@loaders.gl/loader-utils';
2
+ import {isBrowser} from '@loaders.gl/loader-utils';
2
3
  import {ConsoleLog} from './loggers';
3
4
 
4
5
  export const DEFAULT_LOADER_OPTIONS: LoaderOptions = {
@@ -12,7 +13,8 @@ export const DEFAULT_LOADER_OPTIONS: LoaderOptions = {
12
13
  worker: true, // By default, use worker if provided by loader.
13
14
  maxConcurrency: 3, // How many worker instances should be created for each loader.
14
15
  maxMobileConcurrency: 1, // How many worker instances should be created for each loader on mobile devices.
15
- reuseWorkers: true, // By default reuse workers,
16
+ reuseWorkers: isBrowser, // By default reuse workers in browser (Node.js refuses to terminate if browsers are running)
17
+ _nodeWorkers: false, // By default do not support node workers
16
18
  _workerType: '', // 'test' to use locally generated workers
17
19
 
18
20
  limit: 0,
@@ -26,9 +26,12 @@ export function getGlobalLoaderState(): GlobalLoaderState {
26
26
  return loaders._state;
27
27
  }
28
28
 
29
- // Store global loader options on the global object to increase chances of cross loaders-version interoperability
30
- // NOTE: This use case is not reliable but can help when testing new versions of loaders.gl with existing frameworks
31
- const getGlobalLoaderOptions = () => {
29
+ /**
30
+ * Store global loader options on the global object to increase chances of cross loaders-version interoperability
31
+ * NOTE: This use case is not reliable but can help when testing new versions of loaders.gl with existing frameworks
32
+ * @returns global loader options merged with default loader options
33
+ */
34
+ export const getGlobalLoaderOptions = () => {
32
35
  const state = getGlobalLoaderState();
33
36
  // Ensure all default loader options from this library are mentioned
34
37
  state.globalOptions = state.globalOptions || {...DEFAULT_LOADER_OPTIONS};
@@ -65,7 +65,7 @@ export async function checkResponse(response: Response): Promise<void> {
65
65
  export function checkResponseSync(response: Response): void {
66
66
  if (!response.ok) {
67
67
  let message = `${response.status} ${response.statusText}`;
68
- message = message.length > 60 ? `${message.slice(60)}...` : message;
68
+ message = message.length > 60 ? `${message.slice(0, 60)}...` : message;
69
69
  throw new Error(message);
70
70
  }
71
71
  }
@@ -81,7 +81,7 @@ async function getResponseError(response): Promise<string> {
81
81
  text += ` ${await response.text()}`;
82
82
  }
83
83
  message += text;
84
- message = message.length > 60 ? `${message.slice(60)}...` : message;
84
+ message = message.length > 60 ? `${message.slice(0, 60)}...` : message;
85
85
  } catch (error) {
86
86
  // eslint forbids return in a finally statement, so we just catch here
87
87
  }
@@ -21,6 +21,16 @@ export const NullWorkerLoader: Loader = {
21
21
  }
22
22
  };
23
23
 
24
+ /**
25
+ * Returns arguments passed to the parse API in a format that can be transfered to a
26
+ * web worker. The `context` parameter is stripped using JSON.stringify & parse.
27
+ */
28
+ function parseSync(arrayBuffer, options, context) {
29
+ if (!options.null.echoParameters) return null;
30
+ context = context && JSON.parse(JSON.stringify(context));
31
+ return {arrayBuffer, options, context};
32
+ }
33
+
24
34
  /**
25
35
  * Loads any data and returns null (or optionally passes through data unparsed)
26
36
  */
@@ -31,15 +41,17 @@ export const NullLoader: LoaderWithParser = {
31
41
  version: VERSION,
32
42
  mimeTypes: ['application/x.empty'],
33
43
  extensions: ['null'],
34
- parse: async (arrayBuffer) => arrayBuffer,
35
- parseSync: (arrayBuffer) => arrayBuffer,
36
- parseInBatches: async function* generator(asyncIterator) {
44
+ parse: async (arrayBuffer, options, context) => parseSync(arrayBuffer, options, context),
45
+ parseSync,
46
+ parseInBatches: async function* generator(asyncIterator, options, context) {
37
47
  for await (const batch of asyncIterator) {
38
- yield batch;
48
+ yield parseSync(batch, options, context);
39
49
  }
40
50
  },
41
51
  tests: [() => false],
42
52
  options: {
43
- null: {}
53
+ null: {
54
+ echoParameters: false
55
+ }
44
56
  }
45
57
  };
@@ -1,13 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.setLoaderOptions = setLoaderOptions;
7
-
8
- var _optionUtils = require("../loader-utils/option-utils");
9
-
10
- function setLoaderOptions(options) {
11
- (0, _optionUtils.setGlobalOptions)(options);
12
- }
13
- //# sourceMappingURL=set-loader-options.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/lib/api/set-loader-options.ts"],"names":["setLoaderOptions","options"],"mappings":";;;;;;;AAAA;;AAMO,SAASA,gBAAT,CAA0BC,OAA1B,EAAiD;AACtD,qCAAiBA,OAAjB;AACD","sourcesContent":["import {setGlobalOptions} from '../loader-utils/option-utils';\n\n/**\n * Set global loader options\n * @param options\n */\nexport function setLoaderOptions(options: object): void {\n setGlobalOptions(options);\n}\n"],"file":"set-loader-options.js"}
@@ -1,5 +0,0 @@
1
- import { setGlobalOptions } from '../loader-utils/option-utils';
2
- export function setLoaderOptions(options) {
3
- setGlobalOptions(options);
4
- }
5
- //# sourceMappingURL=set-loader-options.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/lib/api/set-loader-options.ts"],"names":["setGlobalOptions","setLoaderOptions","options"],"mappings":"AAAA,SAAQA,gBAAR,QAA+B,8BAA/B;AAMA,OAAO,SAASC,gBAAT,CAA0BC,OAA1B,EAAiD;AACtDF,EAAAA,gBAAgB,CAACE,OAAD,CAAhB;AACD","sourcesContent":["import {setGlobalOptions} from '../loader-utils/option-utils';\n\n/**\n * Set global loader options\n * @param options\n */\nexport function setLoaderOptions(options: object): void {\n setGlobalOptions(options);\n}\n"],"file":"set-loader-options.js"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Set global loader options
3
- * @param options
4
- */
5
- export declare function setLoaderOptions(options: object): void;
6
- //# sourceMappingURL=set-loader-options.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"set-loader-options.d.ts","sourceRoot":"","sources":["../../../src/lib/api/set-loader-options.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEtD"}
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.setLoaderOptions = void 0;
4
- const option_utils_1 = require("../loader-utils/option-utils");
5
- /**
6
- * Set global loader options
7
- * @param options
8
- */
9
- function setLoaderOptions(options) {
10
- (0, option_utils_1.setGlobalOptions)(options);
11
- }
12
- exports.setLoaderOptions = setLoaderOptions;
@@ -1,9 +0,0 @@
1
- import {setGlobalOptions} from '../loader-utils/option-utils';
2
-
3
- /**
4
- * Set global loader options
5
- * @param options
6
- */
7
- export function setLoaderOptions(options: object): void {
8
- setGlobalOptions(options);
9
- }