@loaders.gl/parquet 5.0.0-alpha.5 → 5.0.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,7 +4,7 @@
4
4
  import { DeltaFormat } from "./delta-format.js";
5
5
  // __VERSION__ is injected by babel-plugin-version-inline
6
6
  // @ts-ignore TS2304: Cannot find name '__VERSION__'.
7
- const VERSION = typeof "5.0.0-alpha.5" !== 'undefined' ? "5.0.0-alpha.5" : 'latest';
7
+ const VERSION = typeof "5.0.0-alpha.6" !== 'undefined' ? "5.0.0-alpha.6" : 'latest';
8
8
  /** Loads the parser-bearing Delta source implementation on demand. */
9
9
  async function preloadDeltaSourceLoader() {
10
10
  const { DeltaSourceLoaderWithParser } = await import('@loaders.gl/parquet/delta-source');
@@ -7,7 +7,7 @@ import { PARQUET_TABLE_QUERY_CAPABILITIES } from "./parquet-source-capabilities.
7
7
  import { DeltaFormat } from "./delta-format.js";
8
8
  // __VERSION__ is injected by babel-plugin-version-inline
9
9
  // @ts-ignore TS2304: Cannot find name '__VERSION__'.
10
- const VERSION = typeof "5.0.0-alpha.5" !== 'undefined' ? "5.0.0-alpha.5" : 'latest';
10
+ const VERSION = typeof "5.0.0-alpha.6" !== 'undefined' ? "5.0.0-alpha.6" : 'latest';
11
11
  /** Lightweight Delta Lake snapshot source backed by a newline-delimited commit log. */
12
12
  export class DeltaTableSource extends DataSource {
13
13
  actionsPromises = new Map();
@@ -5,7 +5,7 @@ import { ParquetFormat } from "./parquet-format.js";
5
5
  import { PARQUET_LOADER_DEFAULT_OPTIONS } from "./parquet-loader-options.js";
6
6
  // __VERSION__ is injected by babel-plugin-version-inline
7
7
  // @ts-ignore TS2304: Cannot find name '__VERSION__'.
8
- const VERSION = typeof "5.0.0-alpha.5" !== 'undefined' ? "5.0.0-alpha.5" : 'latest';
8
+ const VERSION = typeof "5.0.0-alpha.6" !== 'undefined' ? "5.0.0-alpha.6" : 'latest';
9
9
  /** Preloads the parser-bearing GeoParquet loader implementation. */
10
10
  async function preloadGeoParquetLoader() {
11
11
  const { GeoParquetLoaderWithParser } = await import("./geoparquet-loader-with-parser.js");
package/dist/index.cjs CHANGED
@@ -73,7 +73,7 @@ var init_parquet_loader_base = __esm({
73
73
  "use strict";
74
74
  init_parquet_format();
75
75
  init_parquet_loader_options();
76
- VERSION = true ? "5.0.0-alpha.5" : "latest";
76
+ VERSION = true ? "5.0.0-alpha.6" : "latest";
77
77
  PARQUET_LOADER_BASE = {
78
78
  ...ParquetFormat,
79
79
  dataType: null,
@@ -497,6 +497,10 @@ var init_worker_thread = __esm({
497
497
  name;
498
498
  source;
499
499
  url;
500
+ /** Lazily resolves the classic worker URL used as a fallback. */
501
+ getUrl;
502
+ /** Creates a browser Worker directly. */
503
+ loadWorker;
500
504
  terminated = false;
501
505
  worker;
502
506
  onMessage;
@@ -507,11 +511,13 @@ var init_worker_thread = __esm({
507
511
  return typeof Worker !== "undefined" && isBrowser2 || typeof NodeWorker !== "undefined" && !isBrowser2;
508
512
  }
509
513
  constructor(props) {
510
- const { name, source, url } = props;
511
- assert(source || url);
514
+ const { name, source, url, getUrl, loadWorker } = props;
515
+ assert(source || url || getUrl || loadWorker);
512
516
  this.name = name;
513
517
  this.source = source;
514
518
  this.url = url;
519
+ this.getUrl = getUrl;
520
+ this.loadWorker = loadWorker;
515
521
  this.onMessage = NOOP;
516
522
  this.onError = (error) => console.log(error);
517
523
  this.worker = isBrowser2 ? this._createBrowserWorker() : this._createNodeWorker();
@@ -557,7 +563,7 @@ var init_worker_thread = __esm({
557
563
  */
558
564
  _getErrorFromErrorEvent(event) {
559
565
  let message = "Failed to load ";
560
- message += `worker ${this.name} from ${this.url}. `;
566
+ message += `worker ${this.name} from ${this.url || "built-in worker factory"}. `;
561
567
  if (event.message) {
562
568
  message += `${event.message} in `;
563
569
  }
@@ -570,8 +576,26 @@ var init_worker_thread = __esm({
570
576
  * Creates a worker thread on the browser
571
577
  */
572
578
  _createBrowserWorker() {
573
- this._loadableURL = getLoadableWorkerURL({ source: this.source, url: this.url });
579
+ var _a;
580
+ if (this.loadWorker) {
581
+ try {
582
+ const worker2 = this.loadWorker();
583
+ if (worker2) {
584
+ return this._initializeBrowserWorker(worker2);
585
+ }
586
+ } catch (error) {
587
+ if (!this.source && !this.url && !this.getUrl) {
588
+ throw error;
589
+ }
590
+ }
591
+ }
592
+ const url = this.url || ((_a = this.getUrl) == null ? void 0 : _a.call(this));
593
+ this._loadableURL = getLoadableWorkerURL({ source: this.source, url });
574
594
  const worker = new Worker(this._loadableURL, { name: this.name });
595
+ return this._initializeBrowserWorker(worker);
596
+ }
597
+ /** Attaches protocol handlers to a browser worker. */
598
+ _initializeBrowserWorker(worker) {
575
599
  worker.onmessage = (event) => {
576
600
  if (!event.data) {
577
601
  this.onError(new Error("No data received"));
@@ -630,6 +654,10 @@ var init_worker_pool = __esm({
630
654
  source;
631
655
  // | Function;
632
656
  url;
657
+ /** Lazily resolves a classic worker fallback URL. */
658
+ getUrl;
659
+ /** Creates a browser Worker directly. */
660
+ loadWorker;
633
661
  maxConcurrency = 1;
634
662
  maxMobileConcurrency = 1;
635
663
  onDebug = () => {
@@ -651,6 +679,8 @@ var init_worker_pool = __esm({
651
679
  constructor(props) {
652
680
  this.source = props.source;
653
681
  this.url = props.url;
682
+ this.getUrl = props.getUrl;
683
+ this.loadWorker = props.loadWorker;
654
684
  this.setProps(props);
655
685
  }
656
686
  /**
@@ -760,7 +790,13 @@ var init_worker_pool = __esm({
760
790
  if (this.count < this._getMaxConcurrency()) {
761
791
  this.count++;
762
792
  const name = `${this.name.toLowerCase()} (#${this.count} of ${this.maxConcurrency})`;
763
- return new WorkerThread({ name, source: this.source, url: this.url });
793
+ return new WorkerThread({
794
+ name,
795
+ source: this.source,
796
+ url: this.url,
797
+ getUrl: this.getUrl,
798
+ loadWorker: this.loadWorker
799
+ });
764
800
  }
765
801
  return null;
766
802
  }
@@ -772,7 +808,22 @@ var init_worker_pool = __esm({
772
808
  });
773
809
 
774
810
  // ../worker-utils/src/lib/worker-farm/worker-farm.ts
775
- var DEFAULT_PROPS, WorkerFarm;
811
+ function getWorkerPoolKey(options) {
812
+ const { name, source, url, urlKey, loadWorker } = options;
813
+ const sourceKey = source ? `source:${source}` : "";
814
+ const urlKeyPart = url || urlKey ? `url:${url || urlKey}` : "";
815
+ const loadWorkerKey = loadWorker ? `loadWorker:${getLoadWorkerId(loadWorker)}` : "";
816
+ return [name, sourceKey, urlKeyPart, loadWorkerKey].filter(Boolean).join("|");
817
+ }
818
+ function getLoadWorkerId(loadWorker) {
819
+ let loadWorkerId = loadWorkerIds.get(loadWorker);
820
+ if (!loadWorkerId) {
821
+ loadWorkerId = nextLoadWorkerId++;
822
+ loadWorkerIds.set(loadWorker, loadWorkerId);
823
+ }
824
+ return loadWorkerId;
825
+ }
826
+ var DEFAULT_PROPS, loadWorkerIds, nextLoadWorkerId, WorkerFarm;
776
827
  var init_worker_farm = __esm({
777
828
  "../worker-utils/src/lib/worker-farm/worker-farm.ts"() {
778
829
  "use strict";
@@ -785,6 +836,8 @@ var init_worker_farm = __esm({
785
836
  onDebug: () => {
786
837
  }
787
838
  };
839
+ loadWorkerIds = /* @__PURE__ */ new WeakMap();
840
+ nextLoadWorkerId = 1;
788
841
  WorkerFarm = class _WorkerFarm {
789
842
  props;
790
843
  workerPools = /* @__PURE__ */ new Map();
@@ -828,24 +881,28 @@ var init_worker_farm = __esm({
828
881
  }
829
882
  /**
830
883
  * Returns a worker pool for the specified worker
831
- * @param options - only used first time for a specific worker name
832
- * @param options.name - the name of the worker - used to identify worker pool
833
- * @param options.url -
834
- * @param options.source -
884
+ * @param options Worker target used to identify and initialize the pool.
885
+ * @param options.name Worker name used as the base pool identity.
886
+ * @param options.url Worker script URL.
887
+ * @param options.source Inline worker source.
888
+ * @param options.loadWorker Built-in browser worker factory.
835
889
  * @example
836
890
  * const job = WorkerFarm.getWorkerFarm().getWorkerPool({name, url}).startJob(...);
837
891
  */
838
892
  getWorkerPool(options) {
839
- const { name, source, url } = options;
840
- let workerPool = this.workerPools.get(name);
893
+ const { name, source, url, getUrl, loadWorker } = options;
894
+ const workerPoolKey = getWorkerPoolKey(options);
895
+ let workerPool = this.workerPools.get(workerPoolKey);
841
896
  if (!workerPool) {
842
897
  workerPool = new WorkerPool({
843
898
  name,
844
899
  source,
845
- url
900
+ url,
901
+ getUrl,
902
+ loadWorker
846
903
  });
847
904
  workerPool.setProps(this._getWorkerPoolProps());
848
- this.workerPools.set(name, workerPool);
905
+ this.workerPools.set(workerPoolKey, workerPool);
849
906
  }
850
907
  return workerPool;
851
908
  }
@@ -866,35 +923,42 @@ function getWorkerName(worker) {
866
923
  const warning = worker.version !== VERSION3 ? ` (worker-utils@${VERSION3})` : "";
867
924
  return `${worker.name}@${worker.version}${warning}`;
868
925
  }
869
- function getWorkerURL(worker, options = {}) {
926
+ function getCustomWorkerURL(worker, options = {}) {
870
927
  var _a;
871
928
  const workerOptions = options[worker.id] || {};
872
- const workerFile = isBrowser2 ? `${worker.id}-worker.js` : worker.workerNode || `${worker.id}-worker-node.js`;
929
+ const workerFile = isBrowser2 ? worker.workerFile || `${worker.id}-worker.js` : worker.workerNode || `${worker.id}-worker-node.js`;
873
930
  let url = workerOptions.workerUrl;
874
- if (!url && typeof worker.worker === "string") {
875
- url = worker.worker;
876
- }
877
931
  if (!url && worker.id === "compression") {
878
932
  url = options.workerUrl;
879
933
  }
880
934
  const workerType = options._workerType || ((_a = options == null ? void 0 : options.core) == null ? void 0 : _a._workerType);
881
- if (workerType === "test") {
935
+ if (!url && workerType === "test") {
882
936
  if (isBrowser2) {
883
937
  url = `modules/${worker.module}/dist/${workerFile}`;
884
938
  } else {
885
939
  url = `modules/${worker.module}/src/workers/${worker.id}-worker-node.ts`;
886
940
  }
887
941
  }
888
- if (!url) {
889
- let version2 = worker.version;
890
- if (version2 === "latest") {
891
- version2 = NPM_TAG;
892
- }
893
- const versionTag = version2 ? `@${version2}` : "";
894
- url = `https://unpkg.com/@loaders.gl/${worker.module}${versionTag}/dist/${workerFile}`;
942
+ return url || null;
943
+ }
944
+ function getWorkerURL(worker, options = {}) {
945
+ const customWorkerUrl = getCustomWorkerURL(worker, options);
946
+ const descriptorWorkerUrl = typeof worker.worker === "string" ? worker.worker : null;
947
+ const url = customWorkerUrl || descriptorWorkerUrl || getDefaultWorkerURL(worker, true);
948
+ assert(url);
949
+ return url;
950
+ }
951
+ function getDefaultWorkerURL(worker, warn = false) {
952
+ const workerFile = isBrowser2 ? worker.workerFile || `${worker.id}-worker.js` : worker.workerNode || `${worker.id}-worker-node.js`;
953
+ let version2 = worker.version;
954
+ if (version2 === "latest") {
955
+ version2 = NPM_TAG;
956
+ }
957
+ const versionTag = version2 ? `@${version2}` : "";
958
+ const url = `https://unpkg.com/@loaders.gl/${worker.module}${versionTag}/dist/${workerFile}`;
959
+ if (warn) {
895
960
  warnIfUsingNpmTagFallback(worker, url);
896
961
  }
897
- assert(url);
898
962
  return url;
899
963
  }
900
964
  function warnIfUsingNpmTagFallback(worker, url) {
@@ -928,19 +992,16 @@ function canProcessOnWorker(worker, options) {
928
992
  return false;
929
993
  }
930
994
  const workerOptions = options == null ? void 0 : options[worker.id];
931
- return Boolean((worker.worker || (workerOptions == null ? void 0 : workerOptions.workerUrl)) && (options == null ? void 0 : options.worker));
995
+ return Boolean(
996
+ (worker.worker || worker.loadWorker || (workerOptions == null ? void 0 : workerOptions.workerUrl)) && (options == null ? void 0 : options.worker)
997
+ );
932
998
  }
933
999
  async function processOnWorker(worker, data, options = {}, context = {}, jobContext = {}) {
934
1000
  var _a, _b, _c;
935
1001
  throwIfAborted(options.signal);
936
1002
  const name = getWorkerName(worker);
937
1003
  const workerFarm = WorkerFarm.getWorkerFarm(options);
938
- const { source } = options;
939
- const workerPoolProps = { name, source };
940
- if (!source) {
941
- workerPoolProps.url = getWorkerURL(worker, options);
942
- }
943
- const workerPool = workerFarm.getWorkerPool(workerPoolProps);
1004
+ const workerPool = workerFarm.getWorkerPool(getWorkerPoolTarget(worker, options, name));
944
1005
  const jobName = options.jobName || worker.name;
945
1006
  const job = await workerPool.startJob(
946
1007
  jobName,
@@ -983,6 +1044,24 @@ function createAbortError2(message) {
983
1044
  error.name = "AbortError";
984
1045
  return error;
985
1046
  }
1047
+ function getWorkerPoolTarget(worker, options, name) {
1048
+ if (options.source) {
1049
+ return { name, source: options.source };
1050
+ }
1051
+ const customWorkerUrl = getCustomWorkerURL(worker, options);
1052
+ if (customWorkerUrl) {
1053
+ return { name, url: customWorkerUrl };
1054
+ }
1055
+ if (isBrowser2 && worker.loadWorker) {
1056
+ return {
1057
+ name,
1058
+ loadWorker: worker.loadWorker,
1059
+ getUrl: () => getWorkerURL(worker, options),
1060
+ urlKey: getDefaultWorkerURL(worker)
1061
+ };
1062
+ }
1063
+ return { name, url: getWorkerURL(worker, options) };
1064
+ }
986
1065
  async function onMessage(context, job, type, payload) {
987
1066
  switch (type) {
988
1067
  case "done":
@@ -1015,6 +1094,7 @@ var init_process_on_worker = __esm({
1015
1094
  init_worker_farm();
1016
1095
  init_get_worker_url();
1017
1096
  init_get_transfer_list();
1097
+ init_globals2();
1018
1098
  }
1019
1099
  });
1020
1100
 
@@ -1048,7 +1128,7 @@ async function parseWithWorker(loader, data, options, context, parseOnMainThread
1048
1128
  const result = await processOnWorker(
1049
1129
  loader,
1050
1130
  data,
1051
- { ...getWorkerOptions(options), signal: workerSignal },
1131
+ { ...getWorkerOptions(options, loader), signal: workerSignal },
1052
1132
  {
1053
1133
  process: async (input, processOptions, _workerContext, parseContext) => {
1054
1134
  if (!parseOnMainThread) {
@@ -1081,12 +1161,19 @@ function callParseOnMainThread(parseOnMainThread, input, options, context) {
1081
1161
  }
1082
1162
  return parseOnMainThread(input, void 0, options, context);
1083
1163
  }
1084
- function getWorkerOptions(options = {}) {
1164
+ function getWorkerOptions(options = {}, loader) {
1085
1165
  const serializedOptions = JSON.parse(JSON.stringify(options));
1086
- return {
1166
+ const workerOptions = {
1087
1167
  ...serializedOptions.core,
1088
1168
  ...serializedOptions
1089
1169
  };
1170
+ if (workerOptions.worker === "auto") {
1171
+ workerOptions.worker = true;
1172
+ }
1173
+ if (loader) {
1174
+ workerOptions._workerLoaderId = loader.id;
1175
+ }
1176
+ return workerOptions;
1090
1177
  }
1091
1178
  function getSerializableLoaderContext(context) {
1092
1179
  if (!context) {
@@ -7191,7 +7278,7 @@ var init_geoparquet_loader = __esm({
7191
7278
  "use strict";
7192
7279
  init_parquet_format();
7193
7280
  init_parquet_loader_options();
7194
- VERSION5 = true ? "5.0.0-alpha.5" : "latest";
7281
+ VERSION5 = true ? "5.0.0-alpha.6" : "latest";
7195
7282
  GeoParquetLoader = {
7196
7283
  ...ParquetFormat,
7197
7284
  dataType: null,
@@ -25899,7 +25986,7 @@ function resolveParquetSourceWorkerUrl() {
25899
25986
  }
25900
25987
  }
25901
25988
  function getParquetSourceWorkerFile() {
25902
- return "./parquet-source-worker.js";
25989
+ return "../dist/parquet-source-worker.js";
25903
25990
  }
25904
25991
  var import_meta5, PARQUET_SOURCE_WORKER_URL;
25905
25992
  var init_parquet_source_worker_url = __esm({
@@ -28013,7 +28100,7 @@ init_geoparquet_loader();
28013
28100
 
28014
28101
  // dist/parquet-js-loader-types.js
28015
28102
  init_parquet_format();
28016
- var VERSION8 = true ? "5.0.0-alpha.5" : "latest";
28103
+ var VERSION8 = true ? "5.0.0-alpha.6" : "latest";
28017
28104
  var DEFAULT_PARQUET_JS_OPTIONS3 = {
28018
28105
  columns: void 0,
28019
28106
  preserveBinary: false,
@@ -28040,7 +28127,7 @@ var ParquetJSLoader2 = {
28040
28127
 
28041
28128
  // dist/parquet-source-loader-types.js
28042
28129
  init_parquet_format();
28043
- var VERSION10 = true ? "5.0.0-alpha.5" : "latest";
28130
+ var VERSION10 = true ? "5.0.0-alpha.6" : "latest";
28044
28131
  async function preloadParquetSourceLoader2() {
28045
28132
  const { ParquetSourceLoaderWithParser: ParquetSourceLoaderWithParser2 } = await Promise.resolve().then(() => (init_parquet_source_loader(), parquet_source_loader_exports));
28046
28133
  return ParquetSourceLoaderWithParser2;
@@ -28164,7 +28251,7 @@ init_normalize_parquet_options2();
28164
28251
  init_parquet_format();
28165
28252
 
28166
28253
  // dist/lib/constants.js
28167
- var VERSION11 = true ? "5.0.0-alpha.5" : "latest";
28254
+ var VERSION11 = true ? "5.0.0-alpha.6" : "latest";
28168
28255
  var PARQUET_MAGIC2 = "PAR1";
28169
28256
  var PARQUET_MAGIC_ENCRYPTED2 = "PARE";
28170
28257
  var PARQUET_RDLVL_TYPE2 = "INT32";
@@ -39027,7 +39114,7 @@ function formatDataType(dataType) {
39027
39114
 
39028
39115
  // dist/parquet-js-writer.js
39029
39116
  init_parquet_format();
39030
- var VERSION12 = true ? "5.0.0-alpha.5" : "latest";
39117
+ var VERSION12 = true ? "5.0.0-alpha.6" : "latest";
39031
39118
  var DEFAULT_PARQUET_JS_OPTIONS4 = {};
39032
39119
  var ParquetJSWriter = {
39033
39120
  ...ParquetFormat,