@loaders.gl/core 5.0.0-alpha.13 → 5.0.0-alpha.14

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 (105) hide show
  1. package/dist/dist.dev.js +190 -63
  2. package/dist/dist.min.js +3 -3
  3. package/dist/index.cjs +205 -72
  4. package/dist/index.cjs.map +2 -2
  5. package/dist/lib/api/parse-file.js +2 -0
  6. package/dist/lib/api/parse-file.js.map +1 -1
  7. package/dist/lib/api/parse-in-batches.d.ts.map +1 -1
  8. package/dist/lib/api/parse-in-batches.js +5 -4
  9. package/dist/lib/api/parse-in-batches.js.map +1 -1
  10. package/dist/lib/api/parse.js +4 -2
  11. package/dist/lib/api/parse.js.map +1 -1
  12. package/dist/lib/init.js +1 -1
  13. package/dist/lib/loader-utils/get-fetch-function.d.ts.map +1 -1
  14. package/dist/lib/loader-utils/get-fetch-function.js +3 -1
  15. package/dist/lib/loader-utils/get-fetch-function.js.map +1 -1
  16. package/dist/lib/loader-utils/loader-context.d.ts.map +1 -1
  17. package/dist/lib/loader-utils/loader-context.js +4 -0
  18. package/dist/lib/loader-utils/loader-context.js.map +1 -1
  19. package/dist/lib/loader-utils/option-defaults.d.ts.map +1 -1
  20. package/dist/lib/loader-utils/option-defaults.js +1 -0
  21. package/dist/lib/loader-utils/option-defaults.js.map +1 -1
  22. package/dist/lib/loader-utils/option-utils.js +1 -1
  23. package/dist/lib/loader-utils/option-utils.js.map +1 -1
  24. package/dist/loader-utils/index.cjs +231 -92
  25. package/dist/loader-utils/index.cjs.map +2 -2
  26. package/dist/loader-utils/index.d.ts +1 -1
  27. package/dist/loader-utils/index.d.ts.map +1 -1
  28. package/dist/loader-utils/index.js +1 -1
  29. package/dist/loader-utils/index.js.map +1 -1
  30. package/dist/loader-utils/json-loader.d.ts +1 -1
  31. package/dist/loader-utils/json-loader.js +2 -2
  32. package/dist/loader-utils/lib/log-utils/log.js +1 -1
  33. package/dist/loader-utils/lib/request-utils/request-credentials.d.ts +3 -1
  34. package/dist/loader-utils/lib/request-utils/request-credentials.d.ts.map +1 -1
  35. package/dist/loader-utils/lib/request-utils/request-credentials.js +10 -16
  36. package/dist/loader-utils/lib/request-utils/request-credentials.js.map +1 -1
  37. package/dist/loader-utils/lib/worker-loader-utils/create-loader-worker.d.ts +3 -0
  38. package/dist/loader-utils/lib/worker-loader-utils/create-loader-worker.d.ts.map +1 -1
  39. package/dist/loader-utils/lib/worker-loader-utils/create-loader-worker.js +13 -12
  40. package/dist/loader-utils/lib/worker-loader-utils/create-loader-worker.js.map +1 -1
  41. package/dist/loader-utils/lib/worker-loader-utils/parse-with-worker.d.ts +6 -0
  42. package/dist/loader-utils/lib/worker-loader-utils/parse-with-worker.d.ts.map +1 -1
  43. package/dist/loader-utils/lib/worker-loader-utils/parse-with-worker.js +38 -7
  44. package/dist/loader-utils/lib/worker-loader-utils/parse-with-worker.js.map +1 -1
  45. package/dist/loader-utils/loader-types.d.ts +12 -4
  46. package/dist/loader-utils/loader-types.d.ts.map +1 -1
  47. package/dist/loader-utils/loader-types.js.map +1 -1
  48. package/dist/null-loader.js +1 -1
  49. package/dist/null-worker-node.js +60 -15
  50. package/dist/null-worker.js +59 -15
  51. package/dist/schema-utils/lib/table/tables/convert-table.d.ts +1 -1
  52. package/dist/schema-utils/lib/table/tables/convert-table.js +1 -1
  53. package/dist/worker-utils/index.cjs +170 -49
  54. package/dist/worker-utils/index.cjs.map +2 -2
  55. package/dist/worker-utils/index.d.ts +2 -2
  56. package/dist/worker-utils/index.d.ts.map +1 -1
  57. package/dist/worker-utils/index.js +1 -1
  58. package/dist/worker-utils/index.js.map +1 -1
  59. package/dist/worker-utils/lib/env-utils/version.js +2 -2
  60. package/dist/worker-utils/lib/worker-api/create-worker.d.ts.map +1 -1
  61. package/dist/worker-utils/lib/worker-api/create-worker.js +40 -2
  62. package/dist/worker-utils/lib/worker-api/create-worker.js.map +1 -1
  63. package/dist/worker-utils/lib/worker-api/get-worker-url.d.ts +2 -0
  64. package/dist/worker-utils/lib/worker-api/get-worker-url.d.ts.map +1 -1
  65. package/dist/worker-utils/lib/worker-api/get-worker-url.js +7 -11
  66. package/dist/worker-utils/lib/worker-api/get-worker-url.js.map +1 -1
  67. package/dist/worker-utils/lib/worker-api/process-on-worker.d.ts +6 -0
  68. package/dist/worker-utils/lib/worker-api/process-on-worker.d.ts.map +1 -1
  69. package/dist/worker-utils/lib/worker-api/process-on-worker.js +64 -27
  70. package/dist/worker-utils/lib/worker-api/process-on-worker.js.map +1 -1
  71. package/dist/worker-utils/lib/worker-farm/worker-job.d.ts.map +1 -1
  72. package/dist/worker-utils/lib/worker-farm/worker-job.js +3 -2
  73. package/dist/worker-utils/lib/worker-farm/worker-job.js.map +1 -1
  74. package/dist/worker-utils/lib/worker-farm/worker-pool.d.ts +1 -1
  75. package/dist/worker-utils/lib/worker-farm/worker-pool.d.ts.map +1 -1
  76. package/dist/worker-utils/lib/worker-farm/worker-pool.js +65 -12
  77. package/dist/worker-utils/lib/worker-farm/worker-pool.js.map +1 -1
  78. package/dist/worker-utils/null-worker-node.js +36 -2
  79. package/dist/worker-utils/null-worker-node.js.map +2 -2
  80. package/dist/worker-utils/null-worker.js +36 -2
  81. package/dist/worker-utils/null-worker.js.map +2 -2
  82. package/dist/worker-utils/types.d.ts +25 -4
  83. package/dist/worker-utils/types.d.ts.map +1 -1
  84. package/package.json +4 -4
  85. package/src/lib/api/parse-file.ts +2 -0
  86. package/src/lib/api/parse-in-batches.ts +5 -5
  87. package/src/lib/api/parse.ts +4 -2
  88. package/src/lib/loader-utils/get-fetch-function.ts +4 -2
  89. package/src/lib/loader-utils/loader-context.ts +4 -0
  90. package/src/lib/loader-utils/option-defaults.ts +1 -0
  91. package/src/lib/loader-utils/option-utils.ts +1 -1
  92. package/src/loader-utils/index.ts +1 -0
  93. package/src/loader-utils/json-loader.ts +1 -1
  94. package/src/loader-utils/lib/request-utils/request-credentials.ts +10 -12
  95. package/src/loader-utils/lib/worker-loader-utils/create-loader-worker.ts +38 -15
  96. package/src/loader-utils/lib/worker-loader-utils/parse-with-worker.ts +52 -7
  97. package/src/loader-utils/loader-types.ts +16 -4
  98. package/src/schema-utils/lib/table/tables/convert-table.ts +1 -1
  99. package/src/worker-utils/index.ts +3 -1
  100. package/src/worker-utils/lib/worker-api/create-worker.ts +41 -2
  101. package/src/worker-utils/lib/worker-api/get-worker-url.ts +13 -14
  102. package/src/worker-utils/lib/worker-api/process-on-worker.ts +128 -73
  103. package/src/worker-utils/lib/worker-farm/worker-job.ts +4 -2
  104. package/src/worker-utils/lib/worker-farm/worker-pool.ts +65 -12
  105. package/src/worker-utils/types.ts +26 -3
@@ -45,6 +45,7 @@ __export(index_exports, {
45
45
  bindColumnarPredicateParameters: () => bindColumnarPredicateParameters,
46
46
  canEncodeWithWorker: () => canEncodeWithWorker,
47
47
  canParseWithWorker: () => canParseWithWorker,
48
+ canParseWithWorkerInBatches: () => canParseWithWorkerInBatches,
48
49
  canReuseRasterCoverage: () => canReuseRasterCoverage,
49
50
  checkJSModule: () => checkJSModule,
50
51
  compareArrayBuffers: () => compareArrayBuffers,
@@ -242,7 +243,7 @@ var nodeVersion = matches && parseFloat(matches[1]) || 0;
242
243
 
243
244
  // dist/loader-utils/lib/log-utils/log.js
244
245
  var import_log = require("probe.gl/log");
245
- var VERSION = true ? "5.0.0-alpha.13" : "latest";
246
+ var VERSION = true ? "5.0.0-alpha.14" : "latest";
246
247
  var version = VERSION[0] >= "0" && VERSION[0] <= "9" ? `v${VERSION}` : "";
247
248
  function createLog() {
248
249
  const log2 = new import_log.Log({ id: "loaders.gl" });
@@ -424,6 +425,7 @@ var WorkerJob = class {
424
425
  * @param data any data structure, ideally consisting mostly of transferrable objects
425
426
  */
426
427
  postMessage(type, payload) {
428
+ if (!this.isRunning) return;
427
429
  this.workerThread.postMessage({
428
430
  source: "loaders.gl",
429
431
  // Lets worker ignore unrelated messages
@@ -459,9 +461,10 @@ var WorkerJob = class {
459
461
  if (!this.isRunning) {
460
462
  return;
461
463
  }
462
- const error = reason ?? createAbortError(`Worker job "${this.name}" was aborted`);
463
464
  this.workerThread.destroy();
464
- this.error(error);
465
+ this.error(
466
+ arguments.length ? reason : createAbortError(`Worker job "${this.name}" was aborted`)
467
+ );
465
468
  }
466
469
  };
467
470
  function createAbortError(message) {
@@ -767,9 +770,13 @@ var WorkerPool = class {
767
770
  * @note Can free up significant memory
768
771
  */
769
772
  destroy(reason = new Error("Worker pool was destroyed")) {
773
+ this.isDestroyed = true;
770
774
  this.activeJobs.forEach((job) => job.abort(reason));
771
775
  const queuedJobs = this.jobQueue.splice(0);
772
- queuedJobs.forEach((queuedJob) => queuedJob.onReject(reason));
776
+ queuedJobs.forEach((queuedJob) => {
777
+ queuedJob.removeAbortListener();
778
+ queuedJob.onReject(reason);
779
+ });
773
780
  this.idleQueue.forEach((worker) => worker.destroy());
774
781
  this.isDestroyed = true;
775
782
  }
@@ -791,12 +798,33 @@ var WorkerPool = class {
791
798
  this.onDebug = props.onDebug;
792
799
  }
793
800
  }
794
- async startJob(name, onMessage2 = (job, type, data) => job.done(data), onError = (job, error) => job.error(error)) {
801
+ async startJob(name, onMessage2 = (job, type, data) => job.done(data), onError = (job, error) => job.error(error), signal) {
802
+ if (signal == null ? void 0 : signal.aborted) {
803
+ throw signal.reason;
804
+ }
795
805
  if (this.isDestroyed) {
796
806
  return Promise.reject(new Error("Worker pool was destroyed"));
797
807
  }
798
808
  const startPromise = new Promise((onStart, onReject) => {
799
- this.jobQueue.push({ name, onMessage: onMessage2, onError, onStart, onReject });
809
+ const abortQueuedJob = () => {
810
+ const index = this.jobQueue.indexOf(queuedJob);
811
+ if (index >= 0) {
812
+ this.jobQueue.splice(index, 1);
813
+ queuedJob.removeAbortListener();
814
+ onReject(signal == null ? void 0 : signal.reason);
815
+ }
816
+ };
817
+ const queuedJob = {
818
+ name,
819
+ onMessage: onMessage2,
820
+ onError,
821
+ onStart,
822
+ onReject,
823
+ signal,
824
+ removeAbortListener: () => signal == null ? void 0 : signal.removeEventListener("abort", abortQueuedJob)
825
+ };
826
+ this.jobQueue.push(queuedJob);
827
+ signal == null ? void 0 : signal.addEventListener("abort", abortQueuedJob, { once: true });
800
828
  return this;
801
829
  });
802
830
  this._startQueuedJob();
@@ -808,10 +836,20 @@ var WorkerPool = class {
808
836
  * Called when job is started and whenever a worker returns to the idleQueue
809
837
  */
810
838
  async _startQueuedJob() {
839
+ var _a, _b, _c;
811
840
  if (!this.jobQueue.length) {
812
841
  return;
813
842
  }
814
- const workerThread = this._getAvailableWorker();
843
+ let workerThread;
844
+ try {
845
+ workerThread = this._getAvailableWorker();
846
+ } catch (error) {
847
+ const queuedJob2 = this.jobQueue.shift();
848
+ queuedJob2 == null ? void 0 : queuedJob2.removeAbortListener();
849
+ queuedJob2 == null ? void 0 : queuedJob2.onReject(error);
850
+ void this._startQueuedJob();
851
+ return;
852
+ }
815
853
  if (!workerThread) {
816
854
  return;
817
855
  }
@@ -824,18 +862,30 @@ var WorkerPool = class {
824
862
  backlog: this.jobQueue.length
825
863
  });
826
864
  const job = new WorkerJob(queuedJob.name, workerThread);
865
+ queuedJob.removeAbortListener();
866
+ const abortJob = () => {
867
+ var _a2;
868
+ return job.abort((_a2 = queuedJob.signal) == null ? void 0 : _a2.reason);
869
+ };
870
+ (_a = queuedJob.signal) == null ? void 0 : _a.addEventListener("abort", abortJob, { once: true });
871
+ if ((_b = queuedJob.signal) == null ? void 0 : _b.aborted) abortJob();
827
872
  this.activeJobs.add(job);
828
873
  workerThread.ref();
829
- workerThread.onMessage = (data) => queuedJob.onMessage(job, data.type, data.payload);
874
+ workerThread.onMessage = (data) => {
875
+ if (job.isRunning) queuedJob.onMessage(job, data.type, data.payload);
876
+ };
830
877
  workerThread.onError = (error) => queuedJob.onError(job, error);
831
878
  queuedJob.onStart(job);
832
879
  try {
833
880
  await job.result;
834
881
  } catch {
835
882
  } finally {
883
+ (_c = queuedJob.signal) == null ? void 0 : _c.removeEventListener("abort", abortJob);
836
884
  this.activeJobs.delete(job);
837
885
  this.returnWorkerToQueue(workerThread);
838
886
  }
887
+ } else {
888
+ this.returnWorkerToQueue(workerThread);
839
889
  }
840
890
  }
841
891
  /**
@@ -877,13 +927,18 @@ var WorkerPool = class {
877
927
  if (this.count < this._getMaxConcurrency()) {
878
928
  this.count++;
879
929
  const name = `${this.name.toLowerCase()} (#${this.count} of ${this.maxConcurrency})`;
880
- return new WorkerThread({
881
- name,
882
- source: this.source,
883
- url: this.url,
884
- getUrl: this.getUrl,
885
- loadWorker: this.loadWorker
886
- });
930
+ try {
931
+ return new WorkerThread({
932
+ name,
933
+ source: this.source,
934
+ url: this.url,
935
+ getUrl: this.getUrl,
936
+ loadWorker: this.loadWorker
937
+ });
938
+ } catch (error) {
939
+ this.count--;
940
+ throw error;
941
+ }
887
942
  }
888
943
  return null;
889
944
  }
@@ -1160,12 +1215,8 @@ function getWorkerName(worker) {
1160
1215
  }
1161
1216
  function getCustomWorkerURL(worker, options = {}) {
1162
1217
  var _a, _b;
1163
- const workerOptions = options[worker.id] || {};
1164
1218
  const workerFile = isBrowser2 ? worker.workerFile || `${worker.id}-worker.js` : worker.workerNode || `${worker.id}-worker-node.js`;
1165
- let url = workerOptions.workerUrl;
1166
- if (!url && worker.id === "compression") {
1167
- url = options.workerUrl;
1168
- }
1219
+ let url = getConfiguredWorkerURL(worker, options);
1169
1220
  const workerType = options._workerType || ((_a = options == null ? void 0 : options.core) == null ? void 0 : _a._workerType);
1170
1221
  if (!url && workerType === "test") {
1171
1222
  if (isBrowser2) {
@@ -1178,6 +1229,10 @@ function getCustomWorkerURL(worker, options = {}) {
1178
1229
  }
1179
1230
  return url || null;
1180
1231
  }
1232
+ function getConfiguredWorkerURL(worker, options = {}) {
1233
+ const workerOptions = options[worker.id] || {};
1234
+ return workerOptions.workerUrl || (worker.id === "compression" ? options.workerUrl : null) || null;
1235
+ }
1181
1236
  function getWorkerURL(worker, options = {}) {
1182
1237
  const customWorkerUrl = getCustomWorkerURL(worker, options);
1183
1238
  const descriptorWorkerUrl = typeof worker.worker === "string" ? worker.worker : null;
@@ -1222,8 +1277,15 @@ function canProcessOnWorker(worker, options) {
1222
1277
  (worker.worker || worker.loadWorker || (workerOptions == null ? void 0 : workerOptions.workerUrl)) && (options == null ? void 0 : options.worker)
1223
1278
  );
1224
1279
  }
1280
+ function canProcessOnWorkerInBatches(worker, options = {}) {
1281
+ if (!canProcessOnWorker(worker, options)) return false;
1282
+ if (options.workerInBatches !== void 0) return options.workerInBatches;
1283
+ return Boolean(
1284
+ worker.workerInBatches && !options.source && !getConfiguredWorkerURL(worker, options)
1285
+ );
1286
+ }
1225
1287
  async function processOnWorker(worker, data, options = {}, context = {}, jobContext = {}) {
1226
- var _a, _b, _c;
1288
+ var _a;
1227
1289
  throwIfAborted(options.signal);
1228
1290
  const name = getWorkerName(worker);
1229
1291
  const workerFarm = WorkerFarm.getWorkerFarm(options);
@@ -1232,15 +1294,13 @@ async function processOnWorker(worker, data, options = {}, context = {}, jobCont
1232
1294
  const job = await workerPool.startJob(
1233
1295
  jobName,
1234
1296
  // eslint-disable-next-line
1235
- onMessage.bind(null, context)
1297
+ onMessage.bind(null, context, options),
1298
+ void 0,
1299
+ options.signal
1236
1300
  );
1237
- const abortJob = () => job.abort(getAbortReason(options.signal));
1238
- (_a = options.signal) == null ? void 0 : _a.addEventListener("abort", abortJob, { once: true });
1239
- if ((_b = options.signal) == null ? void 0 : _b.aborted) {
1240
- abortJob();
1241
- }
1242
1301
  try {
1243
- const { signal: _signal, ...workerOptions } = options;
1302
+ if ((_a = options.signal) == null ? void 0 : _a.aborted) job.abort(getAbortReason(options.signal));
1303
+ const { signal: _signal, onProgress: _onProgress, ...workerOptions } = options;
1244
1304
  const transferableOptions = getTransferListForWriter(workerOptions);
1245
1305
  const transferableContext = getTransferListForWriter(jobContext);
1246
1306
  if (job.isRunning) {
@@ -1252,15 +1312,15 @@ async function processOnWorker(worker, data, options = {}, context = {}, jobCont
1252
1312
  }
1253
1313
  const result = await job.result;
1254
1314
  return result.result;
1255
- } finally {
1256
- (_c = options.signal) == null ? void 0 : _c.removeEventListener("abort", abortJob);
1315
+ } catch (error) {
1316
+ job.abort(error);
1317
+ throw error;
1257
1318
  }
1258
1319
  }
1259
1320
  function processOnWorkerInBatches(worker, input, options = {}, context = {}, jobContext = {}) {
1260
1321
  return processOnWorkerInBatchesIterator(worker, input, options, context, jobContext);
1261
1322
  }
1262
1323
  async function* processOnWorkerInBatchesIterator(worker, input, options, context, jobContext) {
1263
- var _a, _b, _c;
1264
1324
  throwIfAborted(options.signal);
1265
1325
  const name = getWorkerName(worker);
1266
1326
  const workerFarm = WorkerFarm.getWorkerFarm(options);
@@ -1269,8 +1329,15 @@ async function* processOnWorkerInBatchesIterator(worker, input, options, context
1269
1329
  const inputIterator = getAsyncIterator(input);
1270
1330
  let outputFinished = false;
1271
1331
  let inputFinished = false;
1332
+ let inputCleanupRequested = false;
1272
1333
  let inputRequest = Promise.resolve();
1273
1334
  const batchJobFailed = new Error("Worker batch job failed");
1335
+ const closeJobInput = () => {
1336
+ if (!inputFinished && !inputCleanupRequested) {
1337
+ inputCleanupRequested = true;
1338
+ closeInputIterator(inputIterator);
1339
+ }
1340
+ };
1274
1341
  const finishOutput = () => {
1275
1342
  if (!outputFinished) {
1276
1343
  outputFinished = true;
@@ -1288,8 +1355,12 @@ async function* processOnWorkerInBatchesIterator(worker, input, options, context
1288
1355
  options.jobName || worker.name,
1289
1356
  (activeJob, type, payload) => {
1290
1357
  switch (type) {
1358
+ case "progress":
1359
+ reportProgress(activeJob, options, payload);
1360
+ break;
1291
1361
  case "input-request":
1292
1362
  inputRequest = inputRequest.then(async () => {
1363
+ if (!activeJob.isRunning) return;
1293
1364
  const nextBatch = await inputIterator.next();
1294
1365
  if (!activeJob.isRunning) {
1295
1366
  return;
@@ -1316,7 +1387,7 @@ async function* processOnWorkerInBatchesIterator(worker, input, options, context
1316
1387
  break;
1317
1388
  }
1318
1389
  case "process":
1319
- void onMessage(context, activeJob, type, payload);
1390
+ void onMessage(context, options, activeJob, type, payload);
1320
1391
  break;
1321
1392
  default: {
1322
1393
  const error = new Error(`Unexpected worker batch message: ${type}`);
@@ -1325,16 +1396,19 @@ async function* processOnWorkerInBatchesIterator(worker, input, options, context
1325
1396
  break;
1326
1397
  }
1327
1398
  }
1328
- }
1329
- );
1330
- const abortJob = () => job.abort(getAbortReason(options.signal));
1331
- (_a = options.signal) == null ? void 0 : _a.addEventListener("abort", abortJob, { once: true });
1332
- if ((_b = options.signal) == null ? void 0 : _b.aborted) {
1333
- abortJob();
1334
- }
1335
- void job.result.catch(failOutput);
1399
+ },
1400
+ void 0,
1401
+ options.signal
1402
+ ).catch((error) => {
1403
+ closeJobInput();
1404
+ throw error;
1405
+ });
1406
+ void job.result.catch((error) => {
1407
+ failOutput(error);
1408
+ closeJobInput();
1409
+ });
1336
1410
  try {
1337
- const { signal: _signal, ...workerOptions } = options;
1411
+ const { signal: _signal, onProgress: _onProgress, ...workerOptions } = options;
1338
1412
  if (job.isRunning) {
1339
1413
  job.postMessage("process-in-batches", {
1340
1414
  options: getTransferListForWriter(workerOptions),
@@ -1356,13 +1430,10 @@ async function* processOnWorkerInBatchesIterator(worker, input, options, context
1356
1430
  }
1357
1431
  await job.result;
1358
1432
  } finally {
1359
- (_c = options.signal) == null ? void 0 : _c.removeEventListener("abort", abortJob);
1360
1433
  if (job.isRunning) {
1361
1434
  job.abort(createAbortError2("Worker batch iterator was closed"));
1362
1435
  }
1363
- if (!inputFinished) {
1364
- closeInputIterator(inputIterator);
1365
- }
1436
+ closeJobInput();
1366
1437
  }
1367
1438
  }
1368
1439
  function throwIfAborted(signal) {
@@ -1372,7 +1443,7 @@ function throwIfAborted(signal) {
1372
1443
  throw getAbortReason(signal);
1373
1444
  }
1374
1445
  function getAbortReason(signal) {
1375
- return (signal == null ? void 0 : signal.reason) ?? createAbortError2("Worker job was aborted");
1446
+ return signal ? signal.reason : createAbortError2("Worker job was aborted");
1376
1447
  }
1377
1448
  function createAbortError2(message) {
1378
1449
  const error = new Error(message);
@@ -1412,8 +1483,11 @@ function getWorkerPoolTarget(worker, options, name) {
1412
1483
  }
1413
1484
  return { name, url: getWorkerURL(worker, options) };
1414
1485
  }
1415
- async function onMessage(context, job, type, payload) {
1486
+ async function onMessage(context, options, job, type, payload) {
1416
1487
  switch (type) {
1488
+ case "progress":
1489
+ reportProgress(job, options, payload);
1490
+ break;
1417
1491
  case "done":
1418
1492
  job.done(payload);
1419
1493
  break;
@@ -1421,13 +1495,18 @@ async function onMessage(context, job, type, payload) {
1421
1495
  job.error(new Error(payload.error));
1422
1496
  break;
1423
1497
  case "process":
1424
- const { id, input, options } = payload;
1498
+ const { id, input, options: processOptions } = payload;
1425
1499
  try {
1426
1500
  if (!context.process) {
1427
1501
  job.postMessage("error", { id, error: "Worker not set up to process on main thread" });
1428
1502
  return;
1429
1503
  }
1430
- const result = await context.process(input, options, void 0, payload.context || {});
1504
+ const result = await context.process(
1505
+ input,
1506
+ { ...processOptions, signal: options.signal, onProgress: options.onProgress },
1507
+ void 0,
1508
+ payload.context || {}
1509
+ );
1431
1510
  job.postMessage("done", { id, result });
1432
1511
  } catch (error) {
1433
1512
  const message = error instanceof Error ? error.message : "unknown error";
@@ -1438,6 +1517,15 @@ async function onMessage(context, job, type, payload) {
1438
1517
  console.warn(`process-on-worker: unknown message ${type}`);
1439
1518
  }
1440
1519
  }
1520
+ function reportProgress(job, options, payload) {
1521
+ var _a;
1522
+ if (!job.isRunning || !payload.progress) return;
1523
+ try {
1524
+ (_a = options.onProgress) == null ? void 0 : _a.call(options, payload.progress);
1525
+ } catch (error) {
1526
+ job.abort(error);
1527
+ }
1528
+ }
1441
1529
 
1442
1530
  // src/worker-utils/lib/worker-api/create-worker.ts
1443
1531
  var requestId = 0;
@@ -1451,6 +1539,8 @@ async function createWorker(process2, processInBatches) {
1451
1539
  process: processOnMainThread
1452
1540
  };
1453
1541
  WorkerBody.onmessage = async (type, payload) => {
1542
+ const reporter = type === "process" || type === "process-in-batches" ? createProgressReporter() : void 0;
1543
+ const jobContext = { ...context, reportProgress: reporter == null ? void 0 : reporter.report };
1454
1544
  try {
1455
1545
  switch (type) {
1456
1546
  case "preload":
@@ -1463,9 +1553,10 @@ async function createWorker(process2, processInBatches) {
1463
1553
  const result = await process2(
1464
1554
  payload.input,
1465
1555
  payload.options || {},
1466
- context,
1556
+ jobContext,
1467
1557
  payload.context || {}
1468
1558
  );
1559
+ reporter == null ? void 0 : reporter.finish();
1469
1560
  WorkerBody.postMessage("done", { result });
1470
1561
  break;
1471
1562
  case "process-in-batches":
@@ -1480,13 +1571,14 @@ async function createWorker(process2, processInBatches) {
1480
1571
  const resultIterator = processInBatches(
1481
1572
  createDemandDrivenIterator(inputBatches),
1482
1573
  payload.options || {},
1483
- context,
1574
+ jobContext,
1484
1575
  payload.context || {}
1485
1576
  );
1486
1577
  for await (const batch of resultIterator) {
1487
1578
  await WorkerBody.postMessage("output-batch", { result: batch });
1488
1579
  await outputAcknowledgements.next();
1489
1580
  }
1581
+ reporter == null ? void 0 : reporter.finish();
1490
1582
  await WorkerBody.postMessage("done", {});
1491
1583
  } finally {
1492
1584
  activeInputBatches = null;
@@ -1514,6 +1606,7 @@ async function createWorker(process2, processInBatches) {
1514
1606
  default:
1515
1607
  }
1516
1608
  } catch (error) {
1609
+ reporter == null ? void 0 : reporter.finish();
1517
1610
  const message = error instanceof Error ? error.message : "";
1518
1611
  WorkerBody.postMessage("error", { error: message });
1519
1612
  }
@@ -1553,6 +1646,35 @@ function processOnMainThread(arrayBuffer, options = {}, jobContext = {}) {
1553
1646
  WorkerBody.postMessage("process", payload);
1554
1647
  });
1555
1648
  }
1649
+ function createProgressReporter() {
1650
+ let pending;
1651
+ let finished = false;
1652
+ let scheduled = false;
1653
+ const flush = () => {
1654
+ scheduled = false;
1655
+ if (pending) {
1656
+ WorkerBody.postMessage("progress", { progress: pending });
1657
+ pending = void 0;
1658
+ }
1659
+ };
1660
+ return {
1661
+ /** Records progress while retaining phase transitions. */
1662
+ report(progress) {
1663
+ if (finished) return;
1664
+ if (pending && pending.phase !== progress.phase) flush();
1665
+ pending = { ...progress };
1666
+ if (!scheduled) {
1667
+ scheduled = true;
1668
+ setTimeout(flush, 0);
1669
+ }
1670
+ },
1671
+ /** Flushes final progress and suppresses reports from stale callbacks. */
1672
+ finish() {
1673
+ flush();
1674
+ finished = true;
1675
+ }
1676
+ };
1677
+ }
1556
1678
 
1557
1679
  // dist/loader-utils/lib/worker-loader-utils/create-loader-worker.js
1558
1680
  async function createLoaderWorker(loader, selectLoader = () => loader) {
@@ -1565,6 +1687,7 @@ async function processLoaderWorkerData(loader, input, options = {}, workerContex
1565
1687
  options,
1566
1688
  context: {
1567
1689
  ...loaderContext,
1690
+ reportProgress: workerContext == null ? void 0 : workerContext.reportProgress,
1568
1691
  coreApi: createWorkerCoreApi(),
1569
1692
  _parse: createParseOnMainThread(workerContext == null ? void 0 : workerContext.process)
1570
1693
  }
@@ -1575,8 +1698,10 @@ async function* processLoaderWorkerBatches(loader, inputIterator, options = {},
1575
1698
  if (!loader.parseInBatches) {
1576
1699
  throw new Error(`${loader.id} loader does not support batched parsing`);
1577
1700
  }
1578
- const resultIterator = loader.parseInBatches(inputIterator, options, {
1701
+ const parserOptions = getWorkerLoaderOptions(loader, options);
1702
+ const resultIterator = loader.parseInBatches(inputIterator, parserOptions, {
1579
1703
  ...loaderContext,
1704
+ reportProgress: workerContext == null ? void 0 : workerContext.reportProgress,
1580
1705
  coreApi: createWorkerCoreApi(),
1581
1706
  _parse: createParseOnMainThread(workerContext == null ? void 0 : workerContext.process)
1582
1707
  });
@@ -1632,7 +1757,7 @@ function getSerializableLoaderContext(context) {
1632
1757
  if (!context) {
1633
1758
  return void 0;
1634
1759
  }
1635
- const { fetch: fetch2, loaders, coreApi, _parse, _parseSync, _parseInBatches, ...serializableContext } = context;
1760
+ const { fetch: fetch2, loaders, coreApi, signal, reportProgress: reportProgress2, _parse, _parseSync, _parseInBatches, ...serializableContext } = context;
1636
1761
  return JSON.parse(JSON.stringify(serializableContext));
1637
1762
  }
1638
1763
  async function parseData({ loader, arrayBuffer, options, context }) {
@@ -1648,18 +1773,16 @@ async function parseData({ loader, arrayBuffer, options, context }) {
1648
1773
  } else {
1649
1774
  throw new Error(`Could not load data with ${loader.name} loader`);
1650
1775
  }
1651
- options = {
1776
+ options = getWorkerLoaderOptions(loader, options);
1777
+ return await parser(data, { ...options }, context, loader);
1778
+ }
1779
+ function getWorkerLoaderOptions(loader, options) {
1780
+ var _a;
1781
+ return {
1652
1782
  ...options,
1653
- modules: {
1654
- ...loader && loader.options && loader.options.modules || {},
1655
- ...options.modules || {}
1656
- },
1657
- core: {
1658
- ...options.core,
1659
- worker: false
1660
- }
1783
+ modules: { ...(_a = loader.options) == null ? void 0 : _a.modules, ...options.modules },
1784
+ core: { ...options.core, worker: false }
1661
1785
  };
1662
- return await parser(data, { ...options }, context, loader);
1663
1786
  }
1664
1787
 
1665
1788
  // dist/loader-utils/lib/worker-loader-utils/parse-with-worker.js
@@ -1683,6 +1806,13 @@ function canParseWithWorker(loader, options) {
1683
1806
  }
1684
1807
  return Boolean(canProcessOnWorker(loader, workerOptions));
1685
1808
  }
1809
+ function canParseWithWorkerInBatches(loader, options) {
1810
+ const parquetOptions = options == null ? void 0 : options.parquet;
1811
+ if (loader.id === "parquet" && typeof (parquetOptions == null ? void 0 : parquetOptions.keyRetriever) === "function") {
1812
+ return false;
1813
+ }
1814
+ return Boolean(loader.workerInBatches && canParseWithWorker(loader, options) && canProcessOnWorkerInBatches(loader, getWorkerOptions(options)));
1815
+ }
1686
1816
  function shouldParseWithWorker(loader, data, options, context, estimateLoader = loader) {
1687
1817
  var _a, _b;
1688
1818
  if (!canParseWithWorker(loader, options)) {
@@ -1702,8 +1832,12 @@ function shouldParseWithWorker(loader, data, options, context, estimateLoader =
1702
1832
  }
1703
1833
  }
1704
1834
  async function parseWithWorker(loader, data, options, context, parseOnMainThread, signal) {
1705
- const workerSignal = signal || getWorkerAbortSignal(options);
1706
- const result = await processOnWorker(loader, data, { ...getWorkerOptions(options, loader), signal: workerSignal }, {
1835
+ const workerSignal = signal || getWorkerAbortSignal(options) || (context == null ? void 0 : context.signal);
1836
+ const result = await processOnWorker(loader, data, {
1837
+ ...getWorkerOptions(options, loader),
1838
+ signal: workerSignal,
1839
+ onProgress: (options == null ? void 0 : options.onProgress) || (context == null ? void 0 : context.reportProgress)
1840
+ }, {
1707
1841
  process: async (input, processOptions, _workerContext, parseContext) => {
1708
1842
  if (!parseOnMainThread) {
1709
1843
  throw new Error("Worker not set up to parse on main thread");
@@ -1716,8 +1850,12 @@ async function parseWithWorker(loader, data, options, context, parseOnMainThread
1716
1850
  return isLoaderWithWorkerResultDeserializer(loader) ? loader.deserializeWorkerResult(result, options, context) : result;
1717
1851
  }
1718
1852
  async function* parseWithWorkerInBatches(loader, inputIterator, options, context, parseOnMainThread, signal) {
1719
- const workerSignal = signal || getWorkerAbortSignal(options);
1720
- const outputIterator = processOnWorkerInBatches(loader, inputIterator, { ...getWorkerOptions(options), signal: workerSignal }, {
1853
+ const workerSignal = signal || getWorkerAbortSignal(options) || (context == null ? void 0 : context.signal);
1854
+ const outputIterator = processOnWorkerInBatches(loader, inputIterator, {
1855
+ ...getWorkerOptions(options, loader),
1856
+ signal: workerSignal,
1857
+ onProgress: (options == null ? void 0 : options.onProgress) || (context == null ? void 0 : context.reportProgress)
1858
+ }, {
1721
1859
  process: async (input, processOptions, _workerContext, parseContext) => {
1722
1860
  if (!parseOnMainThread) {
1723
1861
  throw new Error("Worker not set up to parse on main thread");
@@ -1733,6 +1871,8 @@ async function* parseWithWorkerInBatches(loader, inputIterator, options, context
1733
1871
  }
1734
1872
  function getWorkerAbortSignal(options) {
1735
1873
  var _a;
1874
+ if (options == null ? void 0 : options.signal)
1875
+ return options.signal;
1736
1876
  const parquetSignal = (_a = options == null ? void 0 : options.parquet) == null ? void 0 : _a.signal;
1737
1877
  if (typeof AbortSignal !== "undefined" && parquetSignal instanceof AbortSignal) {
1738
1878
  return parquetSignal;
@@ -1777,9 +1917,15 @@ function resolveWorkerLoaders(loader, loaderIds, loaderIsArray, context, options
1777
1917
  function getWorkerOptions(options = {}, loader) {
1778
1918
  const optionsToSerialize = {
1779
1919
  ...options,
1920
+ signal: void 0,
1921
+ onProgress: void 0,
1780
1922
  ...options.core ? { core: { ...options.core, authentications: void 0 } } : {}
1781
1923
  };
1782
- const serializedOptions = JSON.parse(JSON.stringify(optionsToSerialize, (_key, value) => typeof value === "bigint" ? null : value));
1924
+ const serializedOptions = JSON.parse(JSON.stringify(optionsToSerialize, (_key, value) => {
1925
+ if (typeof AbortSignal !== "undefined" && value instanceof AbortSignal)
1926
+ return void 0;
1927
+ return typeof value === "bigint" ? null : value;
1928
+ }));
1783
1929
  restoreBigIntOptions(optionsToSerialize, serializedOptions);
1784
1930
  const workerOptions = {
1785
1931
  ...serializedOptions.core,
@@ -1808,7 +1954,7 @@ function getSerializableLoaderContext2(context) {
1808
1954
  if (!context) {
1809
1955
  return {};
1810
1956
  }
1811
- const { fetch: fetch2, loaders, coreApi, _parse, _parseSync, _parseInBatches, ...serializableContext } = context;
1957
+ const { fetch: fetch2, loaders, coreApi, signal, reportProgress: reportProgress2, _parse, _parseSync, _parseInBatches, ...serializableContext } = context;
1812
1958
  return JSON.parse(JSON.stringify(serializableContext));
1813
1959
  }
1814
1960
  function shouldParseCSVWithWorker(options) {
@@ -2894,8 +3040,7 @@ function createAuthenticatedFetch(options) {
2894
3040
  const authenticatedFetch = async (url, requestOptions = {}) => {
2895
3041
  var _a, _b, _c, _d, _e, _f, _g;
2896
3042
  requestOptions = mergeFetchOptions(fetchOptions, requestOptions);
2897
- if ((_a = requestOptions.signal) == null ? void 0 : _a.aborted)
2898
- throw createAbortError4();
3043
+ (_a = requestOptions.signal) == null ? void 0 : _a.throwIfAborted();
2899
3044
  if (!credentials.length)
2900
3045
  return baseFetch(url, requestOptions);
2901
3046
  const resolvedURL = parseHTTPURL(url);
@@ -2914,8 +3059,7 @@ function createAuthenticatedFetch(options) {
2914
3059
  });
2915
3060
  if (!refreshableCredentials.length && !shouldRetrySignature)
2916
3061
  return response;
2917
- if ((_e = requestOptions.signal) == null ? void 0 : _e.aborted)
2918
- throw createAbortError4();
3062
+ (_e = requestOptions.signal) == null ? void 0 : _e.throwIfAborted();
2919
3063
  const refreshedTokens = /* @__PURE__ */ new Map();
2920
3064
  await Promise.all(refreshableCredentials.map(async ({ credential }) => {
2921
3065
  const token = await refreshCredential(credential, url, response);
@@ -2926,8 +3070,7 @@ function createAuthenticatedFetch(options) {
2926
3070
  return response;
2927
3071
  await ((_f = response.body) == null ? void 0 : _f.cancel().catch(() => {
2928
3072
  }));
2929
- if ((_g = requestOptions.signal) == null ? void 0 : _g.aborted)
2930
- throw createAbortError4();
3073
+ (_g = requestOptions.signal) == null ? void 0 : _g.throwIfAborted();
2931
3074
  const replayAuthorization = resolvedURL ? await authorizeRequest(resolvedURL, requestOptions, tokenCredentials, refreshedTokens, authorization.credentials) : { url, options: requestOptions };
2932
3075
  const replayRequest = await authenticateRequest(replayAuthorization, requestCredentials, "retry", response);
2933
3076
  return baseFetch(replayRequest.url, replayRequest.options);
@@ -2951,9 +3094,10 @@ function getAuthenticatedFetch(options = {}) {
2951
3094
  } else {
2952
3095
  fetchFunction = (url, requestOptions) => fetch(url, requestOptions);
2953
3096
  }
3097
+ const fetchOptions = typeof fetchOption === "object" && fetchOption ? fetchOption : void 0;
2954
3098
  return createAuthenticatedFetch({
2955
3099
  fetch: fetchFunction,
2956
- fetchOptions: typeof fetchOption === "object" && fetchOption ? fetchOption : void 0,
3100
+ fetchOptions: options.signal ? { ...fetchOptions, signal: options.signal } : fetchOptions,
2957
3101
  credentials: ((_b = options.core) == null ? void 0 : _b.credentials) || [],
2958
3102
  authentications: (_c = options.core) == null ? void 0 : _c.authentications
2959
3103
  });
@@ -2990,8 +3134,7 @@ async function authenticateRequest(request, credentials, reason, response) {
2990
3134
  const origin = getRequestOrigin(request.url);
2991
3135
  if (!origin || !normalizeRequestOrigins(credential.origins).includes(origin))
2992
3136
  continue;
2993
- if (signal == null ? void 0 : signal.aborted)
2994
- throw createAbortError4();
3137
+ signal == null ? void 0 : signal.throwIfAborted();
2995
3138
  const authenticatedRequest = await credential.authenticate({
2996
3139
  url: request.url,
2997
3140
  options: { ...request.options, headers: new Headers(request.options.headers) },
@@ -3007,8 +3150,7 @@ async function authenticateRequest(request, credentials, reason, response) {
3007
3150
  };
3008
3151
  appliedCredentials.push(credential);
3009
3152
  }
3010
- if (signal == null ? void 0 : signal.aborted)
3011
- throw createAbortError4();
3153
+ signal == null ? void 0 : signal.throwIfAborted();
3012
3154
  return { ...request, credentials: appliedCredentials };
3013
3155
  }
3014
3156
  function getRequestOrigin(url) {
@@ -3110,9 +3252,6 @@ function isReplayableRequest(options) {
3110
3252
  return false;
3111
3253
  return !(options.body && typeof ReadableStream !== "undefined" && options.body instanceof ReadableStream);
3112
3254
  }
3113
- function createAbortError4() {
3114
- return new DOMException("The operation was aborted.", "AbortError");
3115
- }
3116
3255
 
3117
3256
  // dist/loader-utils/lib/request-utils/range-request-scheduler.js
3118
3257
  var import_stats2 = require("probe.gl/stats");
@@ -3209,7 +3348,7 @@ var RangeRequestScheduler = class {
3209
3348
  return Promise.reject(new Error("Byte range length cannot be negative"));
3210
3349
  }
3211
3350
  if ((_a = request.signal) == null ? void 0 : _a.aborted) {
3212
- return Promise.reject(request.signal.reason ?? createAbortError5());
3351
+ return Promise.reject(request.signal.reason ?? createAbortError4());
3213
3352
  }
3214
3353
  if (request.length === 0) {
3215
3354
  return Promise.resolve(new ArrayBuffer(0));
@@ -3474,7 +3613,7 @@ var RangeRequestScheduler = class {
3474
3613
  }
3475
3614
  }
3476
3615
  this.transportQueue = this.transportQueue.filter((group) => group.requests.length > 0);
3477
- request.reject(((_a = request.signal) == null ? void 0 : _a.reason) ?? createAbortError5());
3616
+ request.reject(((_a = request.signal) == null ? void 0 : _a.reason) ?? createAbortError4());
3478
3617
  this.trackEvent({
3479
3618
  type: "abort",
3480
3619
  sourceId: request.sourceId,
@@ -3705,7 +3844,7 @@ function getTimestamp() {
3705
3844
  var _a;
3706
3845
  return ((_a = globalThis.performance) == null ? void 0 : _a.now()) ?? Date.now();
3707
3846
  }
3708
- function createAbortError5() {
3847
+ function createAbortError4() {
3709
3848
  if (typeof DOMException !== "undefined") {
3710
3849
  return new DOMException("Request aborted", "AbortError");
3711
3850
  }
@@ -3787,7 +3926,7 @@ var RangeRequestCache = class {
3787
3926
  (_a = this.onEvent) == null ? void 0 : _a.call(this, { type: "miss", sourceId, offset, length });
3788
3927
  if (this.cache.maxEntries === 0 || length > this.cache.maxBytes) {
3789
3928
  if (signal == null ? void 0 : signal.aborted) {
3790
- throw createAbortError6();
3929
+ throw createAbortError5();
3791
3930
  }
3792
3931
  const arrayBuffer = await fetchRange(offset, length, signal || new AbortController().signal);
3793
3932
  validateResponseLength(arrayBuffer, length);
@@ -3898,7 +4037,7 @@ function validateResponseLength(arrayBuffer, expectedLength) {
3898
4037
  throw new Error(`Range request returned ${arrayBuffer.byteLength} bytes; expected ${expectedLength}`);
3899
4038
  }
3900
4039
  }
3901
- function createAbortError6() {
4040
+ function createAbortError5() {
3902
4041
  const error = new Error("Request aborted");
3903
4042
  error.name = "AbortError";
3904
4043
  return error;
@@ -9797,7 +9936,7 @@ var CachedUriResolver = class {
9797
9936
  };
9798
9937
 
9799
9938
  // dist/loader-utils/json-loader.js
9800
- var VERSION3 = true ? "5.0.0-alpha.13" : "latest";
9939
+ var VERSION3 = true ? "5.0.0-alpha.14" : "latest";
9801
9940
  var JSONLoader = {
9802
9941
  dataType: null,
9803
9942
  batchType: null,
@@ -10315,7 +10454,7 @@ var HttpFile = class _HttpFile {
10315
10454
  async open(signal) {
10316
10455
  this.assertOpen();
10317
10456
  if (signal == null ? void 0 : signal.aborted) {
10318
- const error = createAbortError7();
10457
+ const error = createAbortError6();
10319
10458
  this.transport.trackFailure(error);
10320
10459
  throw error;
10321
10460
  }
@@ -10357,7 +10496,7 @@ var HttpFile = class _HttpFile {
10357
10496
  async read(offset = 0, length = 0, signal) {
10358
10497
  this.assertOpen();
10359
10498
  if (signal == null ? void 0 : signal.aborted) {
10360
- const error = createAbortError7();
10499
+ const error = createAbortError6();
10361
10500
  this.transport.trackFailure(error);
10362
10501
  throw error;
10363
10502
  }
@@ -10465,7 +10604,7 @@ function validateRange2(offset, length, byteLength) {
10465
10604
  throw new Error("HTTP byte range extends beyond the end of the file");
10466
10605
  }
10467
10606
  }
10468
- function createAbortError7() {
10607
+ function createAbortError6() {
10469
10608
  if (typeof DOMException !== "undefined") {
10470
10609
  return new DOMException("Request aborted", "AbortError");
10471
10610
  }