@loaders.gl/pointclouds 5.0.0-beta.1 → 5.0.0-beta.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.
Files changed (152) hide show
  1. package/README.md +4 -0
  2. package/dist/dist.dev.js +39 -15
  3. package/dist/dist.min.js +19 -19
  4. package/dist/las/las-copc-loader-types.cjs +1 -1
  5. package/dist/las/las-copc-loader-types.cjs.map +2 -2
  6. package/dist/las/las-copc-loader-types.js +1 -1
  7. package/dist/las/las-copc-loader-types.js.map +1 -1
  8. package/dist/las/las-loader-shared.cjs +1 -1
  9. package/dist/las/las-loader-shared.js +1 -1
  10. package/dist/las/las-loader-types.cjs +1 -1
  11. package/dist/las/las-loader-types.cjs.map +2 -2
  12. package/dist/las/las-loader-types.js +1 -1
  13. package/dist/las/las-loader-types.js.map +1 -1
  14. package/dist/las/las-writer.cjs +1 -1
  15. package/dist/las/las-writer.js +1 -1
  16. package/dist/las/laz-rs-loader-types.cjs +1 -1
  17. package/dist/las/laz-rs-loader-types.cjs.map +2 -2
  18. package/dist/las/laz-rs-loader-types.js +1 -1
  19. package/dist/las/laz-rs-loader-types.js.map +1 -1
  20. package/dist/las/lazperf-loader-types.cjs +1 -1
  21. package/dist/las/lazperf-loader-types.cjs.map +2 -2
  22. package/dist/las/lazperf-loader-types.js +1 -1
  23. package/dist/las/lazperf-loader-types.js.map +1 -1
  24. package/dist/las-copc-loader-types.cjs +51 -0
  25. package/dist/las-copc-loader-types.cjs.map +7 -0
  26. package/dist/las-copc-loader-types.d.ts +2 -0
  27. package/dist/las-copc-loader-types.d.ts.map +1 -0
  28. package/dist/las-copc-loader-types.js +2 -0
  29. package/dist/las-copc-loader-types.js.map +1 -0
  30. package/dist/las-copc-loader.cjs +59 -0
  31. package/dist/las-copc-loader.cjs.map +7 -0
  32. package/dist/las-copc-loader.d.ts +2 -0
  33. package/dist/las-copc-loader.d.ts.map +1 -0
  34. package/dist/las-copc-loader.js +2 -0
  35. package/dist/las-copc-loader.js.map +1 -0
  36. package/dist/las-loader-types.cjs +56 -0
  37. package/dist/las-loader-types.cjs.map +7 -0
  38. package/dist/las-loader-types.d.ts +2 -0
  39. package/dist/las-loader-types.d.ts.map +1 -0
  40. package/dist/las-loader-types.js +2 -0
  41. package/dist/las-loader-types.js.map +1 -0
  42. package/dist/las-loader.cjs +82 -0
  43. package/dist/las-loader.cjs.map +7 -0
  44. package/dist/las-loader.d.ts +2 -0
  45. package/dist/las-loader.d.ts.map +1 -0
  46. package/dist/las-loader.js +2 -0
  47. package/dist/las-loader.js.map +1 -0
  48. package/dist/las-worker.js +170 -59
  49. package/dist/las-writer.cjs +1056 -0
  50. package/dist/las-writer.cjs.map +7 -0
  51. package/dist/las-writer.d.ts +2 -0
  52. package/dist/las-writer.d.ts.map +1 -0
  53. package/dist/las-writer.js +2 -0
  54. package/dist/las-writer.js.map +1 -0
  55. package/dist/laz-rs-loader-types.cjs +51 -0
  56. package/dist/laz-rs-loader-types.cjs.map +7 -0
  57. package/dist/laz-rs-loader-types.d.ts +2 -0
  58. package/dist/laz-rs-loader-types.d.ts.map +1 -0
  59. package/dist/laz-rs-loader-types.js +2 -0
  60. package/dist/laz-rs-loader-types.js.map +1 -0
  61. package/dist/laz-rs-loader.cjs +274 -0
  62. package/dist/laz-rs-loader.cjs.map +7 -0
  63. package/dist/laz-rs-loader.d.ts +2 -0
  64. package/dist/laz-rs-loader.d.ts.map +1 -0
  65. package/dist/laz-rs-loader.js +2 -0
  66. package/dist/laz-rs-loader.js.map +1 -0
  67. package/dist/lazperf-loader-types.cjs +51 -0
  68. package/dist/lazperf-loader-types.cjs.map +7 -0
  69. package/dist/lazperf-loader-types.d.ts +2 -0
  70. package/dist/lazperf-loader-types.d.ts.map +1 -0
  71. package/dist/lazperf-loader-types.js +2 -0
  72. package/dist/lazperf-loader-types.js.map +1 -0
  73. package/dist/lazperf-loader.cjs +62 -0
  74. package/dist/lazperf-loader.cjs.map +7 -0
  75. package/dist/lazperf-loader.d.ts +2 -0
  76. package/dist/lazperf-loader.d.ts.map +1 -0
  77. package/dist/lazperf-loader.js +2 -0
  78. package/dist/lazperf-loader.js.map +1 -0
  79. package/dist/pcd/pcd-loader-types.cjs +2 -2
  80. package/dist/pcd/pcd-loader-types.cjs.map +2 -2
  81. package/dist/pcd/pcd-loader-types.js +2 -2
  82. package/dist/pcd/pcd-loader-types.js.map +1 -1
  83. package/dist/pcd/pcd-writer.cjs +1 -1
  84. package/dist/pcd/pcd-writer.js +1 -1
  85. package/dist/pcd-loader-types.cjs +66 -0
  86. package/dist/pcd-loader-types.cjs.map +7 -0
  87. package/dist/pcd-loader-types.d.ts +2 -0
  88. package/dist/pcd-loader-types.d.ts.map +1 -0
  89. package/dist/pcd-loader-types.js +2 -0
  90. package/dist/pcd-loader-types.js.map +1 -0
  91. package/dist/pcd-loader.cjs +146 -0
  92. package/dist/pcd-loader.cjs.map +7 -0
  93. package/dist/pcd-loader.d.ts +2 -0
  94. package/dist/pcd-loader.d.ts.map +1 -0
  95. package/dist/pcd-loader.js +2 -0
  96. package/dist/pcd-loader.js.map +1 -0
  97. package/dist/pcd-worker.js +204 -71
  98. package/dist/pcd-writer.cjs +136 -0
  99. package/dist/pcd-writer.cjs.map +7 -0
  100. package/dist/pcd-writer.d.ts +2 -0
  101. package/dist/pcd-writer.d.ts.map +1 -0
  102. package/dist/pcd-writer.js +2 -0
  103. package/dist/pcd-writer.js.map +1 -0
  104. package/dist/ply/ply-loader-types.cjs +2 -2
  105. package/dist/ply/ply-loader-types.cjs.map +2 -2
  106. package/dist/ply/ply-loader-types.js +2 -2
  107. package/dist/ply/ply-loader-types.js.map +1 -1
  108. package/dist/ply/ply-writer.cjs +1 -1
  109. package/dist/ply/ply-writer.js +1 -1
  110. package/dist/ply-loader-types.cjs +67 -0
  111. package/dist/ply-loader-types.cjs.map +7 -0
  112. package/dist/ply-loader-types.d.ts +2 -0
  113. package/dist/ply-loader-types.d.ts.map +1 -0
  114. package/dist/ply-loader-types.js +2 -0
  115. package/dist/ply-loader-types.js.map +1 -0
  116. package/dist/ply-loader.cjs +136 -0
  117. package/dist/ply-loader.cjs.map +7 -0
  118. package/dist/ply-loader.d.ts +2 -0
  119. package/dist/ply-loader.d.ts.map +1 -0
  120. package/dist/ply-loader.js +2 -0
  121. package/dist/ply-loader.js.map +1 -0
  122. package/dist/ply-worker.js +204 -71
  123. package/dist/ply-writer.cjs +177 -0
  124. package/dist/ply-writer.cjs.map +7 -0
  125. package/dist/ply-writer.d.ts +2 -0
  126. package/dist/ply-writer.d.ts.map +1 -0
  127. package/dist/ply-writer.js +2 -0
  128. package/dist/ply-writer.js.map +1 -0
  129. package/package.json +73 -70
  130. package/src/las/las-copc-loader-types.ts +1 -1
  131. package/src/las/las-loader-types.ts +1 -1
  132. package/src/las/laz-rs-loader-types.ts +1 -1
  133. package/src/las/lazperf-loader-types.ts +1 -1
  134. package/src/las/libs/laz-rs-wasm/README.md +5 -0
  135. package/src/las/libs/laz-rs-wasm/package.json +6 -0
  136. package/src/las-copc-loader-types.ts +1 -0
  137. package/src/las-copc-loader.ts +1 -0
  138. package/src/las-loader-types.ts +1 -0
  139. package/src/las-loader.ts +1 -0
  140. package/src/las-writer.ts +1 -0
  141. package/src/laz-rs-loader-types.ts +1 -0
  142. package/src/laz-rs-loader.ts +1 -0
  143. package/src/lazperf-loader-types.ts +1 -0
  144. package/src/lazperf-loader.ts +1 -0
  145. package/src/pcd/pcd-loader-types.ts +1 -1
  146. package/src/pcd-loader-types.ts +1 -0
  147. package/src/pcd-loader.ts +1 -0
  148. package/src/pcd-writer.ts +1 -0
  149. package/src/ply/ply-loader-types.ts +1 -1
  150. package/src/ply-loader-types.ts +1 -0
  151. package/src/ply-loader.ts +1 -0
  152. package/src/ply-writer.ts +1 -0
@@ -6,23 +6,36 @@
6
6
  __defProp(target, name, { get: all[name], enumerable: true });
7
7
  };
8
8
 
9
- // ../core/src/worker-utils/lib/node/worker_threads-browser.ts
9
+ // ../../node_modules/@math.gl/core/dist/worker-utils/lib/node/worker_threads-browser.js
10
10
  var parentPort = null;
11
11
 
12
- // ../core/src/worker-utils/lib/worker-utils/get-transfer-list.ts
12
+ // ../../node_modules/@math.gl/core/dist/worker-utils/lib/worker-utils/get-transfer-list.js
13
13
  function getTransferList(object, recursive = true, transfers) {
14
14
  const transfersSet = transfers || /* @__PURE__ */ new Set();
15
- if (!object) {
16
- } else if (isTransferable(object)) {
17
- transfersSet.add(object);
18
- } else if (isTransferable(object.buffer)) {
19
- transfersSet.add(object.buffer);
20
- } else if (ArrayBuffer.isView(object)) {
21
- } else if (recursive && typeof object === "object") {
22
- for (const key in object) {
23
- getTransferList(object[key], recursive, transfersSet);
24
- }
25
- }
15
+ const seen = /* @__PURE__ */ new Set();
16
+ function visit(value) {
17
+ if (!value || typeof value !== "object" || seen.has(value))
18
+ return;
19
+ seen.add(value);
20
+ if (isTransferable(value))
21
+ transfersSet.add(value);
22
+ else if (ArrayBuffer.isView(value)) {
23
+ if (isTransferable(value.buffer))
24
+ transfersSet.add(value.buffer);
25
+ } else if (recursive && value instanceof Map) {
26
+ for (const [key, item] of value) {
27
+ visit(key);
28
+ visit(item);
29
+ }
30
+ } else if (recursive && value instanceof Set) {
31
+ for (const item of value)
32
+ visit(item);
33
+ } else if (recursive) {
34
+ for (const key of Object.keys(value))
35
+ visit(value[key]);
36
+ }
37
+ }
38
+ visit(object);
26
39
  return transfers === void 0 ? Array.from(transfersSet) : [];
27
40
  }
28
41
  function isTransferable(object) {
@@ -44,7 +57,7 @@
44
57
  return false;
45
58
  }
46
59
 
47
- // ../core/src/worker-utils/lib/worker-farm/worker-body.ts
60
+ // ../../node_modules/@math.gl/core/dist/worker-utils/lib/worker-farm/worker-body.js
48
61
  async function getParentPort() {
49
62
  return parentPort;
50
63
  }
@@ -52,7 +65,8 @@
52
65
  var WorkerBody = class {
53
66
  /** Check that we are actually in a worker thread */
54
67
  static async inWorkerThread() {
55
- return typeof self !== "undefined" || Boolean(await getParentPort());
68
+ const workerGlobalScope = globalThis.WorkerGlobalScope;
69
+ return typeof workerGlobalScope === "function" && globalThis instanceof workerGlobalScope || Boolean(await getParentPort());
56
70
  }
57
71
  /*
58
72
  * (type: WorkerMessageType, payload: WorkerMessagePayload) => any
@@ -130,11 +144,8 @@
130
144
  return messageData && typeof messageData.source === "string" && messageData.source.startsWith("loaders.gl") ? messageData : null;
131
145
  }
132
146
 
133
- // ../core/src/worker-utils/lib/async-queue/async-queue.ts
147
+ // ../../node_modules/@math.gl/core/dist/worker-utils/lib/async-queue/async-queue.js
134
148
  var AsyncQueue = class {
135
- _values;
136
- _settlers;
137
- _closed;
138
149
  constructor() {
139
150
  this._values = [];
140
151
  this._settlers = [];
@@ -200,8 +211,48 @@
200
211
  }
201
212
  };
202
213
 
203
- // ../core/src/worker-utils/lib/worker-api/create-worker.ts
214
+ // ../../node_modules/@math.gl/core/dist/worker-utils/lib/worker-api/shared-state.js
215
+ var SharedWorkerState = class {
216
+ constructor(buffer) {
217
+ if (typeof SharedArrayBuffer === "undefined" || !(buffer instanceof SharedArrayBuffer) || buffer.byteLength !== 16)
218
+ throw new Error("Expected a 16-byte shared worker control buffer");
219
+ this.buffer = buffer;
220
+ this.values = new Int32Array(buffer);
221
+ }
222
+ get snapshot() {
223
+ return {
224
+ cancelled: Atomics.load(this.values, 0) !== 0,
225
+ completed: Atomics.load(this.values, 1),
226
+ total: Atomics.load(this.values, 2),
227
+ revision: Atomics.load(this.values, 3)
228
+ };
229
+ }
230
+ cancel() {
231
+ Atomics.store(this.values, 0, 1);
232
+ Atomics.add(this.values, 3, 1);
233
+ Atomics.notify(this.values, 0);
234
+ }
235
+ throwIfCancelled() {
236
+ if (Atomics.load(this.values, 0) !== 0) {
237
+ const error = new Error("Shared worker task was cancelled");
238
+ error.name = "AbortError";
239
+ throw error;
240
+ }
241
+ }
242
+ /** Integer counters for application-defined work; messages still carry phase names and units. */
243
+ setProgress(completed, total = -1) {
244
+ if (!Number.isInteger(completed) || completed < 0 || completed > 2147483647 || !Number.isInteger(total) || total < -1 || total > 2147483647) {
245
+ throw new RangeError("Shared progress requires nonnegative int32 counts (or total -1)");
246
+ }
247
+ Atomics.store(this.values, 1, completed);
248
+ Atomics.store(this.values, 2, total);
249
+ Atomics.add(this.values, 3, 1);
250
+ }
251
+ };
252
+
253
+ // ../../node_modules/@math.gl/core/dist/worker-utils/lib/worker-api/create-worker.js
204
254
  var requestId = 0;
255
+ var activeController = null;
205
256
  var activeInputBatches = null;
206
257
  var activeOutputAcknowledgements = null;
207
258
  async function createWorker(process, processInBatches) {
@@ -212,27 +263,56 @@
212
263
  process: processOnMainThread
213
264
  };
214
265
  WorkerBody.onmessage = async (type, payload) => {
266
+ if (type === "cancel") {
267
+ activeController?.abort();
268
+ activeInputBatches?.close();
269
+ activeOutputAcknowledgements?.close();
270
+ return;
271
+ }
272
+ const controller = type === "process" || type === "process-in-batches" ? new AbortController() : void 0;
273
+ if (controller)
274
+ activeController = controller;
275
+ const startedAt = performance.now();
215
276
  const reporter = type === "process" || type === "process-in-batches" ? createProgressReporter() : void 0;
216
- const jobContext = { ...context, reportProgress: reporter?.report };
277
+ let sharedState;
278
+ const throwIfAborted = () => {
279
+ controller?.signal.throwIfAborted();
280
+ sharedState?.throwIfCancelled();
281
+ };
282
+ const jobContext = {
283
+ ...context,
284
+ signal: controller?.signal,
285
+ sharedState,
286
+ throwIfAborted,
287
+ reportProgress: (progress) => {
288
+ if (!controller?.signal.aborted && !sharedState?.snapshot.cancelled)
289
+ reporter?.report(progress);
290
+ }
291
+ };
217
292
  try {
293
+ if (controller && payload.options?.["sharedState"]) {
294
+ sharedState = new SharedWorkerState(payload.options["sharedState"]);
295
+ jobContext.sharedState = sharedState;
296
+ }
218
297
  switch (type) {
219
298
  case "preload":
220
299
  WorkerBody.postMessage("done", {});
221
300
  break;
222
301
  case "process":
302
+ throwIfAborted();
223
303
  if (!process) {
224
304
  throw new Error("Worker does not support atomic processing");
225
305
  }
226
- const result = await process(
227
- payload.input,
228
- payload.options || {},
229
- jobContext,
230
- payload.context || {}
231
- );
306
+ const result = await process(payload.input, payload.options || {}, jobContext, payload.context || {});
307
+ throwIfAborted();
232
308
  reporter?.finish();
233
- WorkerBody.postMessage("done", { result });
309
+ await WorkerBody.postMessage("done", {
310
+ result,
311
+ executionMs: performance.now() - startedAt
312
+ });
234
313
  break;
235
314
  case "process-in-batches":
315
+ throwIfAborted();
236
316
  if (!processInBatches) {
237
317
  throw new Error("Worker does not support batched processing");
238
318
  }
@@ -241,18 +321,15 @@
241
321
  activeInputBatches = inputBatches;
242
322
  activeOutputAcknowledgements = outputAcknowledgements;
243
323
  try {
244
- const resultIterator = processInBatches(
245
- createDemandDrivenIterator(inputBatches),
246
- payload.options || {},
247
- jobContext,
248
- payload.context || {}
249
- );
324
+ const resultIterator = processInBatches(createDemandDrivenIterator(inputBatches), payload.options || {}, jobContext, payload.context || {});
250
325
  for await (const batch of resultIterator) {
326
+ throwIfAborted();
251
327
  await WorkerBody.postMessage("output-batch", { result: batch });
252
328
  await outputAcknowledgements.next();
253
329
  }
330
+ throwIfAborted();
254
331
  reporter?.finish();
255
- await WorkerBody.postMessage("done", {});
332
+ await WorkerBody.postMessage("done", { executionMs: performance.now() - startedAt });
256
333
  } finally {
257
334
  activeInputBatches = null;
258
335
  activeOutputAcknowledgements = null;
@@ -279,11 +356,18 @@
279
356
  default:
280
357
  }
281
358
  } catch (error) {
282
- reporter?.finish();
359
+ reporter?.finish(controller?.signal.aborted || sharedState?.snapshot.cancelled);
283
360
  const message = error instanceof Error ? error.message : "";
284
- WorkerBody.postMessage("error", { error: message });
361
+ await WorkerBody.postMessage("error", {
362
+ error: message,
363
+ errorName: error instanceof Error ? error.name : "Error"
364
+ });
365
+ } finally {
366
+ if (controller && activeController === controller)
367
+ activeController = null;
285
368
  }
286
369
  };
370
+ await WorkerBody.postMessage("ready", {});
287
371
  }
288
372
  async function* createDemandDrivenIterator(inputBatches) {
289
373
  while (true) {
@@ -296,27 +380,45 @@
296
380
  }
297
381
  }
298
382
  function processOnMainThread(arrayBuffer, options = {}, jobContext = {}) {
383
+ const signal = activeController?.signal;
384
+ signal?.throwIfAborted();
299
385
  return new Promise((resolve, reject) => {
300
386
  const id = requestId++;
301
- const onMessage = (type, payload2) => {
302
- if (payload2.id !== id) {
387
+ const cleanup = () => {
388
+ signal?.removeEventListener("abort", abort);
389
+ void WorkerBody.removeEventListener(onMessage);
390
+ };
391
+ const abort = () => {
392
+ cleanup();
393
+ reject(signal?.reason);
394
+ };
395
+ const onMessage = (type, payload) => {
396
+ if (payload.id !== id)
303
397
  return;
304
- }
305
- switch (type) {
306
- case "done":
307
- WorkerBody.removeEventListener(onMessage);
308
- resolve(payload2.result);
309
- break;
310
- case "error":
311
- WorkerBody.removeEventListener(onMessage);
312
- reject(payload2.error);
313
- break;
314
- default:
398
+ if (type === "done") {
399
+ cleanup();
400
+ resolve(payload.result);
401
+ } else if (type === "error") {
402
+ cleanup();
403
+ reject(payload.error);
315
404
  }
316
405
  };
317
- WorkerBody.addEventListener(onMessage);
318
- const payload = { id, input: arrayBuffer, options, context: jobContext };
319
- WorkerBody.postMessage("process", payload);
406
+ void WorkerBody.addEventListener(onMessage).then(async () => {
407
+ if (signal?.aborted) {
408
+ abort();
409
+ return;
410
+ }
411
+ signal?.addEventListener("abort", abort, { once: true });
412
+ await WorkerBody.postMessage("process", {
413
+ id,
414
+ input: arrayBuffer,
415
+ options,
416
+ context: jobContext
417
+ });
418
+ }).catch((error) => {
419
+ cleanup();
420
+ reject(error);
421
+ });
320
422
  });
321
423
  }
322
424
  function createProgressReporter() {
@@ -333,8 +435,10 @@
333
435
  return {
334
436
  /** Records progress while retaining phase transitions. */
335
437
  report(progress) {
336
- if (finished) return;
337
- if (pending && pending.phase !== progress.phase) flush();
438
+ if (finished)
439
+ return;
440
+ if (pending && pending.phase !== progress.phase)
441
+ flush();
338
442
  pending = { ...progress };
339
443
  if (!scheduled) {
340
444
  scheduled = true;
@@ -342,13 +446,20 @@
342
446
  }
343
447
  },
344
448
  /** Flushes final progress and suppresses reports from stale callbacks. */
345
- finish() {
449
+ finish(discard = false) {
450
+ if (discard)
451
+ pending = void 0;
346
452
  flush();
347
453
  finished = true;
348
454
  }
349
455
  };
350
456
  }
351
457
 
458
+ // ../../node_modules/@math.gl/core/dist/worker-utils/index.js
459
+ var import_meta = {};
460
+ var path = typeof __filename === "string" ? __filename.replace(/\\/g, "/") : "";
461
+ var moduleUrl = path ? `file://${path.startsWith("/") ? "" : "/"}${encodeURI(path).replace(/#/g, "%23").replace(/\?/g, "%3F")}` : import_meta.url;
462
+
352
463
  // ../core/src/loader-utils/lib/worker-loader-utils/create-loader-worker.ts
353
464
  async function createLoaderWorker(loader, selectLoader = () => loader) {
354
465
  await createWorker(
@@ -17623,8 +17734,8 @@ return true;`);
17623
17734
  return new JSONVectorLoader(body, header.nodes, header.buffers, this.dictionaries, this.schema.metadataVersion, header.variadicBufferCounts).visitMany(types);
17624
17735
  }
17625
17736
  };
17626
- function shouldAutoDestroy(self2, options) {
17627
- return options && typeof options["autoDestroy"] === "boolean" ? options["autoDestroy"] : self2["autoDestroy"];
17737
+ function shouldAutoDestroy(self, options) {
17738
+ return options && typeof options["autoDestroy"] === "boolean" ? options["autoDestroy"] : self["autoDestroy"];
17628
17739
  }
17629
17740
  function* readAllSync(source) {
17630
17741
  const reader = RecordBatchReader.from(source);
@@ -19838,7 +19949,7 @@ return true;`);
19838
19949
  };
19839
19950
 
19840
19951
  // src/las/las-loader-shared.ts
19841
- var VERSION = true ? "5.0.0-beta.1" : "latest";
19952
+ var VERSION = true ? "5.0.0-beta.2" : "latest";
19842
19953
  var DEFAULT_LAS_SHAPE = "arrow-table";
19843
19954
  function getLASShape(options) {
19844
19955
  return options?.las?.shape || DEFAULT_LAS_SHAPE;