@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
package/dist/dist.dev.js CHANGED
@@ -792,6 +792,7 @@ var __exports__ = (() => {
792
792
  * @param data any data structure, ideally consisting mostly of transferrable objects
793
793
  */
794
794
  postMessage(type, payload) {
795
+ if (!this.isRunning) return;
795
796
  this.workerThread.postMessage({
796
797
  source: "loaders.gl",
797
798
  // Lets worker ignore unrelated messages
@@ -827,9 +828,10 @@ var __exports__ = (() => {
827
828
  if (!this.isRunning) {
828
829
  return;
829
830
  }
830
- const error = reason ?? createAbortError(`Worker job "${this.name}" was aborted`);
831
831
  this.workerThread.destroy();
832
- this.error(error);
832
+ this.error(
833
+ arguments.length ? reason : createAbortError(`Worker job "${this.name}" was aborted`)
834
+ );
833
835
  }
834
836
  };
835
837
  function createAbortError(message) {
@@ -1132,9 +1134,13 @@ var __exports__ = (() => {
1132
1134
  * @note Can free up significant memory
1133
1135
  */
1134
1136
  destroy(reason = new Error("Worker pool was destroyed")) {
1137
+ this.isDestroyed = true;
1135
1138
  this.activeJobs.forEach((job) => job.abort(reason));
1136
1139
  const queuedJobs = this.jobQueue.splice(0);
1137
- queuedJobs.forEach((queuedJob) => queuedJob.onReject(reason));
1140
+ queuedJobs.forEach((queuedJob) => {
1141
+ queuedJob.removeAbortListener();
1142
+ queuedJob.onReject(reason);
1143
+ });
1138
1144
  this.idleQueue.forEach((worker) => worker.destroy());
1139
1145
  this.isDestroyed = true;
1140
1146
  }
@@ -1156,12 +1162,33 @@ var __exports__ = (() => {
1156
1162
  this.onDebug = props.onDebug;
1157
1163
  }
1158
1164
  }
1159
- async startJob(name, onMessage2 = (job, type, data) => job.done(data), onError = (job, error) => job.error(error)) {
1165
+ async startJob(name, onMessage2 = (job, type, data) => job.done(data), onError = (job, error) => job.error(error), signal) {
1166
+ if (signal?.aborted) {
1167
+ throw signal.reason;
1168
+ }
1160
1169
  if (this.isDestroyed) {
1161
1170
  return Promise.reject(new Error("Worker pool was destroyed"));
1162
1171
  }
1163
1172
  const startPromise = new Promise((onStart, onReject) => {
1164
- this.jobQueue.push({ name, onMessage: onMessage2, onError, onStart, onReject });
1173
+ const abortQueuedJob = () => {
1174
+ const index = this.jobQueue.indexOf(queuedJob);
1175
+ if (index >= 0) {
1176
+ this.jobQueue.splice(index, 1);
1177
+ queuedJob.removeAbortListener();
1178
+ onReject(signal?.reason);
1179
+ }
1180
+ };
1181
+ const queuedJob = {
1182
+ name,
1183
+ onMessage: onMessage2,
1184
+ onError,
1185
+ onStart,
1186
+ onReject,
1187
+ signal,
1188
+ removeAbortListener: () => signal?.removeEventListener("abort", abortQueuedJob)
1189
+ };
1190
+ this.jobQueue.push(queuedJob);
1191
+ signal?.addEventListener("abort", abortQueuedJob, { once: true });
1165
1192
  return this;
1166
1193
  });
1167
1194
  this._startQueuedJob();
@@ -1176,7 +1203,16 @@ var __exports__ = (() => {
1176
1203
  if (!this.jobQueue.length) {
1177
1204
  return;
1178
1205
  }
1179
- const workerThread = this._getAvailableWorker();
1206
+ let workerThread;
1207
+ try {
1208
+ workerThread = this._getAvailableWorker();
1209
+ } catch (error) {
1210
+ const queuedJob2 = this.jobQueue.shift();
1211
+ queuedJob2?.removeAbortListener();
1212
+ queuedJob2?.onReject(error);
1213
+ void this._startQueuedJob();
1214
+ return;
1215
+ }
1180
1216
  if (!workerThread) {
1181
1217
  return;
1182
1218
  }
@@ -1189,18 +1225,27 @@ var __exports__ = (() => {
1189
1225
  backlog: this.jobQueue.length
1190
1226
  });
1191
1227
  const job = new WorkerJob(queuedJob.name, workerThread);
1228
+ queuedJob.removeAbortListener();
1229
+ const abortJob = () => job.abort(queuedJob.signal?.reason);
1230
+ queuedJob.signal?.addEventListener("abort", abortJob, { once: true });
1231
+ if (queuedJob.signal?.aborted) abortJob();
1192
1232
  this.activeJobs.add(job);
1193
1233
  workerThread.ref();
1194
- workerThread.onMessage = (data) => queuedJob.onMessage(job, data.type, data.payload);
1234
+ workerThread.onMessage = (data) => {
1235
+ if (job.isRunning) queuedJob.onMessage(job, data.type, data.payload);
1236
+ };
1195
1237
  workerThread.onError = (error) => queuedJob.onError(job, error);
1196
1238
  queuedJob.onStart(job);
1197
1239
  try {
1198
1240
  await job.result;
1199
1241
  } catch {
1200
1242
  } finally {
1243
+ queuedJob.signal?.removeEventListener("abort", abortJob);
1201
1244
  this.activeJobs.delete(job);
1202
1245
  this.returnWorkerToQueue(workerThread);
1203
1246
  }
1247
+ } else {
1248
+ this.returnWorkerToQueue(workerThread);
1204
1249
  }
1205
1250
  }
1206
1251
  /**
@@ -1242,13 +1287,18 @@ var __exports__ = (() => {
1242
1287
  if (this.count < this._getMaxConcurrency()) {
1243
1288
  this.count++;
1244
1289
  const name = `${this.name.toLowerCase()} (#${this.count} of ${this.maxConcurrency})`;
1245
- return new WorkerThread({
1246
- name,
1247
- source: this.source,
1248
- url: this.url,
1249
- getUrl: this.getUrl,
1250
- loadWorker: this.loadWorker
1251
- });
1290
+ try {
1291
+ return new WorkerThread({
1292
+ name,
1293
+ source: this.source,
1294
+ url: this.url,
1295
+ getUrl: this.getUrl,
1296
+ loadWorker: this.loadWorker
1297
+ });
1298
+ } catch (error) {
1299
+ this.count--;
1300
+ throw error;
1301
+ }
1252
1302
  }
1253
1303
  return null;
1254
1304
  }
@@ -1438,12 +1488,8 @@ var __exports__ = (() => {
1438
1488
  return `${worker.name}@${worker.version}${warning}`;
1439
1489
  }
1440
1490
  function getCustomWorkerURL(worker, options = {}) {
1441
- const workerOptions = options[worker.id] || {};
1442
1491
  const workerFile = isBrowser3 ? worker.workerFile || `${worker.id}-worker.js` : worker.workerNode || `${worker.id}-worker-node.js`;
1443
- let url = workerOptions.workerUrl;
1444
- if (!url && worker.id === "compression") {
1445
- url = options.workerUrl;
1446
- }
1492
+ let url = getConfiguredWorkerURL(worker, options);
1447
1493
  const workerType = options._workerType || options?.core?._workerType;
1448
1494
  if (!url && workerType === "test") {
1449
1495
  if (isBrowser3) {
@@ -1456,6 +1502,10 @@ var __exports__ = (() => {
1456
1502
  }
1457
1503
  return url || null;
1458
1504
  }
1505
+ function getConfiguredWorkerURL(worker, options = {}) {
1506
+ const workerOptions = options[worker.id] || {};
1507
+ return workerOptions.workerUrl || (worker.id === "compression" ? options.workerUrl : null) || null;
1508
+ }
1459
1509
  function getWorkerURL(worker, options = {}) {
1460
1510
  const customWorkerUrl = getCustomWorkerURL(worker, options);
1461
1511
  const descriptorWorkerUrl = typeof worker.worker === "string" ? worker.worker : null;
@@ -1500,6 +1550,13 @@ var __exports__ = (() => {
1500
1550
  (worker.worker || worker.loadWorker || workerOptions?.workerUrl) && options?.worker
1501
1551
  );
1502
1552
  }
1553
+ function canProcessOnWorkerInBatches(worker, options = {}) {
1554
+ if (!canProcessOnWorker(worker, options)) return false;
1555
+ if (options.workerInBatches !== void 0) return options.workerInBatches;
1556
+ return Boolean(
1557
+ worker.workerInBatches && !options.source && !getConfiguredWorkerURL(worker, options)
1558
+ );
1559
+ }
1503
1560
  async function processOnWorker(worker, data, options = {}, context = {}, jobContext = {}) {
1504
1561
  throwIfAborted(options.signal);
1505
1562
  const name = getWorkerName(worker);
@@ -1509,15 +1566,13 @@ var __exports__ = (() => {
1509
1566
  const job = await workerPool.startJob(
1510
1567
  jobName,
1511
1568
  // eslint-disable-next-line
1512
- onMessage.bind(null, context)
1569
+ onMessage.bind(null, context, options),
1570
+ void 0,
1571
+ options.signal
1513
1572
  );
1514
- const abortJob = () => job.abort(getAbortReason(options.signal));
1515
- options.signal?.addEventListener("abort", abortJob, { once: true });
1516
- if (options.signal?.aborted) {
1517
- abortJob();
1518
- }
1519
1573
  try {
1520
- const { signal: _signal, ...workerOptions } = options;
1574
+ if (options.signal?.aborted) job.abort(getAbortReason(options.signal));
1575
+ const { signal: _signal, onProgress: _onProgress, ...workerOptions } = options;
1521
1576
  const transferableOptions = getTransferListForWriter(workerOptions);
1522
1577
  const transferableContext = getTransferListForWriter(jobContext);
1523
1578
  if (job.isRunning) {
@@ -1529,8 +1584,9 @@ var __exports__ = (() => {
1529
1584
  }
1530
1585
  const result = await job.result;
1531
1586
  return result.result;
1532
- } finally {
1533
- options.signal?.removeEventListener("abort", abortJob);
1587
+ } catch (error) {
1588
+ job.abort(error);
1589
+ throw error;
1534
1590
  }
1535
1591
  }
1536
1592
  function processOnWorkerInBatches(worker, input, options = {}, context = {}, jobContext = {}) {
@@ -1545,8 +1601,15 @@ var __exports__ = (() => {
1545
1601
  const inputIterator = getAsyncIterator(input);
1546
1602
  let outputFinished = false;
1547
1603
  let inputFinished = false;
1604
+ let inputCleanupRequested = false;
1548
1605
  let inputRequest = Promise.resolve();
1549
1606
  const batchJobFailed = new Error("Worker batch job failed");
1607
+ const closeJobInput = () => {
1608
+ if (!inputFinished && !inputCleanupRequested) {
1609
+ inputCleanupRequested = true;
1610
+ closeInputIterator(inputIterator);
1611
+ }
1612
+ };
1550
1613
  const finishOutput = () => {
1551
1614
  if (!outputFinished) {
1552
1615
  outputFinished = true;
@@ -1564,8 +1627,12 @@ var __exports__ = (() => {
1564
1627
  options.jobName || worker.name,
1565
1628
  (activeJob, type, payload) => {
1566
1629
  switch (type) {
1630
+ case "progress":
1631
+ reportProgress(activeJob, options, payload);
1632
+ break;
1567
1633
  case "input-request":
1568
1634
  inputRequest = inputRequest.then(async () => {
1635
+ if (!activeJob.isRunning) return;
1569
1636
  const nextBatch = await inputIterator.next();
1570
1637
  if (!activeJob.isRunning) {
1571
1638
  return;
@@ -1592,7 +1659,7 @@ var __exports__ = (() => {
1592
1659
  break;
1593
1660
  }
1594
1661
  case "process":
1595
- void onMessage(context, activeJob, type, payload);
1662
+ void onMessage(context, options, activeJob, type, payload);
1596
1663
  break;
1597
1664
  default: {
1598
1665
  const error = new Error(`Unexpected worker batch message: ${type}`);
@@ -1601,16 +1668,19 @@ var __exports__ = (() => {
1601
1668
  break;
1602
1669
  }
1603
1670
  }
1604
- }
1605
- );
1606
- const abortJob = () => job.abort(getAbortReason(options.signal));
1607
- options.signal?.addEventListener("abort", abortJob, { once: true });
1608
- if (options.signal?.aborted) {
1609
- abortJob();
1610
- }
1611
- void job.result.catch(failOutput);
1671
+ },
1672
+ void 0,
1673
+ options.signal
1674
+ ).catch((error) => {
1675
+ closeJobInput();
1676
+ throw error;
1677
+ });
1678
+ void job.result.catch((error) => {
1679
+ failOutput(error);
1680
+ closeJobInput();
1681
+ });
1612
1682
  try {
1613
- const { signal: _signal, ...workerOptions } = options;
1683
+ const { signal: _signal, onProgress: _onProgress, ...workerOptions } = options;
1614
1684
  if (job.isRunning) {
1615
1685
  job.postMessage("process-in-batches", {
1616
1686
  options: getTransferListForWriter(workerOptions),
@@ -1632,13 +1702,10 @@ var __exports__ = (() => {
1632
1702
  }
1633
1703
  await job.result;
1634
1704
  } finally {
1635
- options.signal?.removeEventListener("abort", abortJob);
1636
1705
  if (job.isRunning) {
1637
1706
  job.abort(createAbortError2("Worker batch iterator was closed"));
1638
1707
  }
1639
- if (!inputFinished) {
1640
- closeInputIterator(inputIterator);
1641
- }
1708
+ closeJobInput();
1642
1709
  }
1643
1710
  }
1644
1711
  function throwIfAborted(signal) {
@@ -1648,7 +1715,7 @@ var __exports__ = (() => {
1648
1715
  throw getAbortReason(signal);
1649
1716
  }
1650
1717
  function getAbortReason(signal) {
1651
- return signal?.reason ?? createAbortError2("Worker job was aborted");
1718
+ return signal ? signal.reason : createAbortError2("Worker job was aborted");
1652
1719
  }
1653
1720
  function createAbortError2(message) {
1654
1721
  const error = new Error(message);
@@ -1687,8 +1754,11 @@ var __exports__ = (() => {
1687
1754
  }
1688
1755
  return { name, url: getWorkerURL(worker, options) };
1689
1756
  }
1690
- async function onMessage(context, job, type, payload) {
1757
+ async function onMessage(context, options, job, type, payload) {
1691
1758
  switch (type) {
1759
+ case "progress":
1760
+ reportProgress(job, options, payload);
1761
+ break;
1692
1762
  case "done":
1693
1763
  job.done(payload);
1694
1764
  break;
@@ -1696,13 +1766,18 @@ var __exports__ = (() => {
1696
1766
  job.error(new Error(payload.error));
1697
1767
  break;
1698
1768
  case "process":
1699
- const { id, input, options } = payload;
1769
+ const { id, input, options: processOptions } = payload;
1700
1770
  try {
1701
1771
  if (!context.process) {
1702
1772
  job.postMessage("error", { id, error: "Worker not set up to process on main thread" });
1703
1773
  return;
1704
1774
  }
1705
- const result = await context.process(input, options, void 0, payload.context || {});
1775
+ const result = await context.process(
1776
+ input,
1777
+ { ...processOptions, signal: options.signal, onProgress: options.onProgress },
1778
+ void 0,
1779
+ payload.context || {}
1780
+ );
1706
1781
  job.postMessage("done", { id, result });
1707
1782
  } catch (error) {
1708
1783
  const message = error instanceof Error ? error.message : "unknown error";
@@ -1713,6 +1788,14 @@ var __exports__ = (() => {
1713
1788
  console.warn(`process-on-worker: unknown message ${type}`);
1714
1789
  }
1715
1790
  }
1791
+ function reportProgress(job, options, payload) {
1792
+ if (!job.isRunning || !payload.progress) return;
1793
+ try {
1794
+ options.onProgress?.(payload.progress);
1795
+ } catch (error) {
1796
+ job.abort(error);
1797
+ }
1798
+ }
1716
1799
 
1717
1800
  // src/worker-utils/lib/worker-api/validate-worker-version.ts
1718
1801
  function validateWorkerVersion(worker, coreVersion = VERSION3) {
@@ -1746,6 +1829,15 @@ var __exports__ = (() => {
1746
1829
  }
1747
1830
  return Boolean(canProcessOnWorker(loader, workerOptions));
1748
1831
  }
1832
+ function canParseWithWorkerInBatches(loader, options) {
1833
+ const parquetOptions = options?.parquet;
1834
+ if (loader.id === "parquet" && typeof parquetOptions?.keyRetriever === "function") {
1835
+ return false;
1836
+ }
1837
+ return Boolean(
1838
+ loader.workerInBatches && canParseWithWorker(loader, options) && canProcessOnWorkerInBatches(loader, getWorkerOptions(options))
1839
+ );
1840
+ }
1749
1841
  function shouldParseWithWorker(loader, data, options, context, estimateLoader = loader) {
1750
1842
  if (!canParseWithWorker(loader, options)) {
1751
1843
  return false;
@@ -1764,11 +1856,15 @@ var __exports__ = (() => {
1764
1856
  }
1765
1857
  }
1766
1858
  async function parseWithWorker(loader, data, options, context, parseOnMainThread, signal) {
1767
- const workerSignal = signal || getWorkerAbortSignal(options);
1859
+ const workerSignal = signal || getWorkerAbortSignal(options) || context?.signal;
1768
1860
  const result = await processOnWorker(
1769
1861
  loader,
1770
1862
  data,
1771
- { ...getWorkerOptions(options, loader), signal: workerSignal },
1863
+ {
1864
+ ...getWorkerOptions(options, loader),
1865
+ signal: workerSignal,
1866
+ onProgress: options?.onProgress || context?.reportProgress
1867
+ },
1772
1868
  {
1773
1869
  process: async (input, processOptions, _workerContext, parseContext) => {
1774
1870
  if (!parseOnMainThread) {
@@ -1790,11 +1886,15 @@ var __exports__ = (() => {
1790
1886
  return isLoaderWithWorkerResultDeserializer(loader) ? loader.deserializeWorkerResult(result, options, context) : result;
1791
1887
  }
1792
1888
  async function* parseWithWorkerInBatches(loader, inputIterator, options, context, parseOnMainThread, signal) {
1793
- const workerSignal = signal || getWorkerAbortSignal(options);
1889
+ const workerSignal = signal || getWorkerAbortSignal(options) || context?.signal;
1794
1890
  const outputIterator = processOnWorkerInBatches(
1795
1891
  loader,
1796
1892
  inputIterator,
1797
- { ...getWorkerOptions(options), signal: workerSignal },
1893
+ {
1894
+ ...getWorkerOptions(options, loader),
1895
+ signal: workerSignal,
1896
+ onProgress: options?.onProgress || context?.reportProgress
1897
+ },
1798
1898
  {
1799
1899
  process: async (input, processOptions, _workerContext, parseContext) => {
1800
1900
  if (!parseOnMainThread) {
@@ -1818,6 +1918,7 @@ var __exports__ = (() => {
1818
1918
  }
1819
1919
  }
1820
1920
  function getWorkerAbortSignal(options) {
1921
+ if (options?.signal) return options.signal;
1821
1922
  const parquetSignal = options?.parquet?.signal;
1822
1923
  if (typeof AbortSignal !== "undefined" && parquetSignal instanceof AbortSignal) {
1823
1924
  return parquetSignal;
@@ -1861,10 +1962,15 @@ var __exports__ = (() => {
1861
1962
  function getWorkerOptions(options = {}, loader) {
1862
1963
  const optionsToSerialize = {
1863
1964
  ...options,
1965
+ signal: void 0,
1966
+ onProgress: void 0,
1864
1967
  ...options.core ? { core: { ...options.core, authentications: void 0 } } : {}
1865
1968
  };
1866
1969
  const serializedOptions = JSON.parse(
1867
- JSON.stringify(optionsToSerialize, (_key, value) => typeof value === "bigint" ? null : value)
1970
+ JSON.stringify(optionsToSerialize, (_key, value) => {
1971
+ if (typeof AbortSignal !== "undefined" && value instanceof AbortSignal) return void 0;
1972
+ return typeof value === "bigint" ? null : value;
1973
+ })
1868
1974
  );
1869
1975
  restoreBigIntOptions(optionsToSerialize, serializedOptions);
1870
1976
  const workerOptions = {
@@ -1891,7 +1997,17 @@ var __exports__ = (() => {
1891
1997
  if (!context) {
1892
1998
  return {};
1893
1999
  }
1894
- const { fetch: fetch2, loaders, coreApi: coreApi2, _parse, _parseSync, _parseInBatches, ...serializableContext } = context;
2000
+ const {
2001
+ fetch: fetch2,
2002
+ loaders,
2003
+ coreApi: coreApi2,
2004
+ signal,
2005
+ reportProgress: reportProgress2,
2006
+ _parse,
2007
+ _parseSync,
2008
+ _parseInBatches,
2009
+ ...serializableContext
2010
+ } = context;
1895
2011
  return JSON.parse(JSON.stringify(serializableContext));
1896
2012
  }
1897
2013
  function shouldParseCSVWithWorker(options) {
@@ -2499,7 +2615,7 @@ var __exports__ = (() => {
2499
2615
  for (const credential of requestCredentials) normalizeRequestOrigins(credential.origins);
2500
2616
  const authenticatedFetch = async (url, requestOptions = {}) => {
2501
2617
  requestOptions = mergeFetchOptions(fetchOptions, requestOptions);
2502
- if (requestOptions.signal?.aborted) throw createAbortError3();
2618
+ requestOptions.signal?.throwIfAborted();
2503
2619
  if (!credentials.length) return baseFetch(url, requestOptions);
2504
2620
  const resolvedURL = parseHTTPURL(url);
2505
2621
  const authorization = resolvedURL ? await authorizeRequest(resolvedURL, requestOptions, tokenCredentials) : { url, options: requestOptions, credentials: [] };
@@ -2515,7 +2631,7 @@ var __exports__ = (() => {
2515
2631
  (credential) => credential.refreshStatusCodes?.includes(response.status)
2516
2632
  );
2517
2633
  if (!refreshableCredentials.length && !shouldRetrySignature) return response;
2518
- if (requestOptions.signal?.aborted) throw createAbortError3();
2634
+ requestOptions.signal?.throwIfAborted();
2519
2635
  const refreshedTokens = /* @__PURE__ */ new Map();
2520
2636
  await Promise.all(
2521
2637
  refreshableCredentials.map(async ({ credential }) => {
@@ -2526,7 +2642,7 @@ var __exports__ = (() => {
2526
2642
  if (!refreshedTokens.size && !shouldRetrySignature) return response;
2527
2643
  await response.body?.cancel().catch(() => {
2528
2644
  });
2529
- if (requestOptions.signal?.aborted) throw createAbortError3();
2645
+ requestOptions.signal?.throwIfAborted();
2530
2646
  const replayAuthorization = resolvedURL ? await authorizeRequest(
2531
2647
  resolvedURL,
2532
2648
  requestOptions,
@@ -2567,7 +2683,7 @@ var __exports__ = (() => {
2567
2683
  for (const credential of credentials) {
2568
2684
  const origin = getRequestOrigin(request.url);
2569
2685
  if (!origin || !normalizeRequestOrigins(credential.origins).includes(origin)) continue;
2570
- if (signal?.aborted) throw createAbortError3();
2686
+ signal?.throwIfAborted();
2571
2687
  const authenticatedRequest = await credential.authenticate({
2572
2688
  url: request.url,
2573
2689
  options: { ...request.options, headers: new Headers(request.options.headers) },
@@ -2583,7 +2699,7 @@ var __exports__ = (() => {
2583
2699
  };
2584
2700
  appliedCredentials.push(credential);
2585
2701
  }
2586
- if (signal?.aborted) throw createAbortError3();
2702
+ signal?.throwIfAborted();
2587
2703
  return { ...request, credentials: appliedCredentials };
2588
2704
  }
2589
2705
  function getRequestOrigin(url) {
@@ -2673,9 +2789,6 @@ var __exports__ = (() => {
2673
2789
  if (!["GET", "HEAD", "OPTIONS", "PUT", "DELETE"].includes(method)) return false;
2674
2790
  return !(options.body && typeof ReadableStream !== "undefined" && options.body instanceof ReadableStream);
2675
2791
  }
2676
- function createAbortError3() {
2677
- return new DOMException("The operation was aborted.", "AbortError");
2678
- }
2679
2792
 
2680
2793
  // src/loader-utils/lib/path-utils/file-aliases.ts
2681
2794
  var pathPrefix = "";
@@ -3310,6 +3423,7 @@ var __exports__ = (() => {
3310
3423
  worker: true,
3311
3424
  // By default, use worker if provided by loader.
3312
3425
  workerThreshold: 0.1,
3426
+ workerInBatches: void 0,
3313
3427
  maxConcurrency: 3,
3314
3428
  // How many worker instances should be created for each loader.
3315
3429
  maxMobileConcurrency: 1,
@@ -3485,7 +3599,7 @@ var __exports__ = (() => {
3485
3599
  const prefix = id ? `${id}.` : "";
3486
3600
  for (const key in options) {
3487
3601
  const isSubOptions = !id && isObject(options[key]);
3488
- const isBaseUriOption = key === "baseUri" && !id;
3602
+ const isBaseUriOption = !id && ["baseUri", "signal", "onProgress"].includes(key);
3489
3603
  const isWorkerUrlOption = key === "workerUrl" && id;
3490
3604
  if (!(key in defaultOptions) && !isBaseUriOption && !isWorkerUrlOption) {
3491
3605
  if (key in deprecatedOptions) {
@@ -4199,11 +4313,13 @@ var __exports__ = (() => {
4199
4313
  } else {
4200
4314
  fetchFunction = fetchFile;
4201
4315
  }
4316
+ const signal = loaderOptions.signal || context?.signal;
4317
+ const requestOptions = isObject(fetchOption) ? fetchOption : void 0;
4202
4318
  return createAuthenticatedFetch({
4203
4319
  fetch: fetchFunction,
4204
4320
  credentials: loaderOptions.core?.credentials || [],
4205
4321
  authentications: loaderOptions.core?.authentications,
4206
- fetchOptions: isObject(fetchOption) ? fetchOption : void 0
4322
+ fetchOptions: signal ? { ...requestOptions, signal } : requestOptions
4207
4323
  });
4208
4324
  }
4209
4325
 
@@ -4426,6 +4542,7 @@ var __exports__ = (() => {
4426
4542
  loaders = void 0;
4427
4543
  }
4428
4544
  options = options || {};
4545
+ (options.signal || context?.signal)?.throwIfAborted();
4429
4546
  const url = file.url || "";
4430
4547
  const typedLoaders = loaders;
4431
4548
  const candidateLoaders = getLoadersFromContext(typedLoaders, context);
@@ -4454,6 +4571,7 @@ var __exports__ = (() => {
4454
4571
  return await parseFileWithLoader(loader, file, strictOptions, context);
4455
4572
  }
4456
4573
  async function parseFileWithLoader(loader, file, options, context) {
4574
+ (options.signal || context.signal)?.throwIfAborted();
4457
4575
  validateWorkerVersion(loader);
4458
4576
  options = mergeOptions(loader.options, options);
4459
4577
  const loaderWithParser = await getLoaderImplementation(loader, options, context.url);
@@ -4535,8 +4653,10 @@ var __exports__ = (() => {
4535
4653
  options = loaders;
4536
4654
  loaders = void 0;
4537
4655
  }
4656
+ (options?.signal || context?.signal)?.throwIfAborted();
4538
4657
  data = await data;
4539
4658
  options = options || {};
4659
+ (options.signal || context?.signal)?.throwIfAborted();
4540
4660
  const url = getResourceUrl(data);
4541
4661
  const loader = await selectLoader(data, loaders, options);
4542
4662
  if (!loader) {
@@ -4586,7 +4706,7 @@ var __exports__ = (() => {
4586
4706
  options?.core?.transforms || []
4587
4707
  );
4588
4708
  if (loader.parseInBatches) {
4589
- if (loader.id === "csv" && isBrowser && canParseWithWorker(loader, options)) {
4709
+ if (canParseWithWorkerInBatches(loader, options)) {
4590
4710
  return parseWithWorkerInBatches(loader, transformedIterator, options, context, parse);
4591
4711
  }
4592
4712
  return loader.parseInBatches(transformedIterator, options, context);
@@ -4841,6 +4961,8 @@ var __exports__ = (() => {
4841
4961
  if (parentContext) {
4842
4962
  return {
4843
4963
  ...parentContext,
4964
+ signal: options.signal || parentContext.signal,
4965
+ reportProgress: options.onProgress || parentContext.reportProgress,
4844
4966
  coreApi: parentContext.coreApi || context.coreApi || coreApi,
4845
4967
  _parse: parentContext._parse || context._parse,
4846
4968
  fetch: getFetchFunction(options, parentContext)
@@ -4848,6 +4970,8 @@ var __exports__ = (() => {
4848
4970
  }
4849
4971
  const newContext = {
4850
4972
  ...context,
4973
+ signal: options.signal || context.signal,
4974
+ reportProgress: options.onProgress || context.reportProgress,
4851
4975
  fetch: getFetchFunction(options, context),
4852
4976
  coreApi: context.coreApi || coreApi
4853
4977
  };
@@ -4885,8 +5009,10 @@ var __exports__ = (() => {
4885
5009
  options = loaders;
4886
5010
  loaders = void 0;
4887
5011
  }
5012
+ (options?.signal || context?.signal)?.throwIfAborted();
4888
5013
  data = await data;
4889
5014
  options = options || {};
5015
+ (options.signal || context?.signal)?.throwIfAborted();
4890
5016
  const url = getResourceUrl(data);
4891
5017
  const typedLoaders = loaders;
4892
5018
  const candidateLoaders = getLoadersFromContext(typedLoaders, context);
@@ -4915,6 +5041,7 @@ var __exports__ = (() => {
4915
5041
  return await parseWithLoader(loader, data, strictOptions, context);
4916
5042
  }
4917
5043
  async function parseWithLoader(loader, data, options, context) {
5044
+ (options.signal || context.signal)?.throwIfAborted();
4918
5045
  validateWorkerVersion(loader);
4919
5046
  options = mergeOptions(loader.options, options);
4920
5047
  if (isResponse(data)) {