@loaders.gl/scan 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.
package/dist/iceberg.cjs CHANGED
@@ -424,6 +424,10 @@ var init_worker_thread = __esm({
424
424
  name;
425
425
  source;
426
426
  url;
427
+ /** Lazily resolves the classic worker URL used as a fallback. */
428
+ getUrl;
429
+ /** Creates a browser Worker directly. */
430
+ loadWorker;
427
431
  terminated = false;
428
432
  worker;
429
433
  onMessage;
@@ -434,11 +438,13 @@ var init_worker_thread = __esm({
434
438
  return typeof Worker !== "undefined" && isBrowser2 || typeof NodeWorker !== "undefined" && !isBrowser2;
435
439
  }
436
440
  constructor(props) {
437
- const { name, source, url } = props;
438
- assert(source || url);
441
+ const { name, source, url, getUrl, loadWorker } = props;
442
+ assert(source || url || getUrl || loadWorker);
439
443
  this.name = name;
440
444
  this.source = source;
441
445
  this.url = url;
446
+ this.getUrl = getUrl;
447
+ this.loadWorker = loadWorker;
442
448
  this.onMessage = NOOP;
443
449
  this.onError = (error) => console.log(error);
444
450
  this.worker = isBrowser2 ? this._createBrowserWorker() : this._createNodeWorker();
@@ -484,7 +490,7 @@ var init_worker_thread = __esm({
484
490
  */
485
491
  _getErrorFromErrorEvent(event) {
486
492
  let message = "Failed to load ";
487
- message += `worker ${this.name} from ${this.url}. `;
493
+ message += `worker ${this.name} from ${this.url || "built-in worker factory"}. `;
488
494
  if (event.message) {
489
495
  message += `${event.message} in `;
490
496
  }
@@ -497,8 +503,26 @@ var init_worker_thread = __esm({
497
503
  * Creates a worker thread on the browser
498
504
  */
499
505
  _createBrowserWorker() {
500
- this._loadableURL = getLoadableWorkerURL({ source: this.source, url: this.url });
506
+ var _a;
507
+ if (this.loadWorker) {
508
+ try {
509
+ const worker2 = this.loadWorker();
510
+ if (worker2) {
511
+ return this._initializeBrowserWorker(worker2);
512
+ }
513
+ } catch (error) {
514
+ if (!this.source && !this.url && !this.getUrl) {
515
+ throw error;
516
+ }
517
+ }
518
+ }
519
+ const url = this.url || ((_a = this.getUrl) == null ? void 0 : _a.call(this));
520
+ this._loadableURL = getLoadableWorkerURL({ source: this.source, url });
501
521
  const worker = new Worker(this._loadableURL, { name: this.name });
522
+ return this._initializeBrowserWorker(worker);
523
+ }
524
+ /** Attaches protocol handlers to a browser worker. */
525
+ _initializeBrowserWorker(worker) {
502
526
  worker.onmessage = (event) => {
503
527
  if (!event.data) {
504
528
  this.onError(new Error("No data received"));
@@ -557,6 +581,10 @@ var init_worker_pool = __esm({
557
581
  source;
558
582
  // | Function;
559
583
  url;
584
+ /** Lazily resolves a classic worker fallback URL. */
585
+ getUrl;
586
+ /** Creates a browser Worker directly. */
587
+ loadWorker;
560
588
  maxConcurrency = 1;
561
589
  maxMobileConcurrency = 1;
562
590
  onDebug = () => {
@@ -578,6 +606,8 @@ var init_worker_pool = __esm({
578
606
  constructor(props) {
579
607
  this.source = props.source;
580
608
  this.url = props.url;
609
+ this.getUrl = props.getUrl;
610
+ this.loadWorker = props.loadWorker;
581
611
  this.setProps(props);
582
612
  }
583
613
  /**
@@ -687,7 +717,13 @@ var init_worker_pool = __esm({
687
717
  if (this.count < this._getMaxConcurrency()) {
688
718
  this.count++;
689
719
  const name = `${this.name.toLowerCase()} (#${this.count} of ${this.maxConcurrency})`;
690
- return new WorkerThread({ name, source: this.source, url: this.url });
720
+ return new WorkerThread({
721
+ name,
722
+ source: this.source,
723
+ url: this.url,
724
+ getUrl: this.getUrl,
725
+ loadWorker: this.loadWorker
726
+ });
691
727
  }
692
728
  return null;
693
729
  }
@@ -699,7 +735,22 @@ var init_worker_pool = __esm({
699
735
  });
700
736
 
701
737
  // ../worker-utils/src/lib/worker-farm/worker-farm.ts
702
- var DEFAULT_PROPS, WorkerFarm;
738
+ function getWorkerPoolKey(options) {
739
+ const { name, source, url, urlKey, loadWorker } = options;
740
+ const sourceKey = source ? `source:${source}` : "";
741
+ const urlKeyPart = url || urlKey ? `url:${url || urlKey}` : "";
742
+ const loadWorkerKey = loadWorker ? `loadWorker:${getLoadWorkerId(loadWorker)}` : "";
743
+ return [name, sourceKey, urlKeyPart, loadWorkerKey].filter(Boolean).join("|");
744
+ }
745
+ function getLoadWorkerId(loadWorker) {
746
+ let loadWorkerId = loadWorkerIds.get(loadWorker);
747
+ if (!loadWorkerId) {
748
+ loadWorkerId = nextLoadWorkerId++;
749
+ loadWorkerIds.set(loadWorker, loadWorkerId);
750
+ }
751
+ return loadWorkerId;
752
+ }
753
+ var DEFAULT_PROPS, loadWorkerIds, nextLoadWorkerId, WorkerFarm;
703
754
  var init_worker_farm = __esm({
704
755
  "../worker-utils/src/lib/worker-farm/worker-farm.ts"() {
705
756
  "use strict";
@@ -712,6 +763,8 @@ var init_worker_farm = __esm({
712
763
  onDebug: () => {
713
764
  }
714
765
  };
766
+ loadWorkerIds = /* @__PURE__ */ new WeakMap();
767
+ nextLoadWorkerId = 1;
715
768
  WorkerFarm = class _WorkerFarm {
716
769
  props;
717
770
  workerPools = /* @__PURE__ */ new Map();
@@ -755,24 +808,28 @@ var init_worker_farm = __esm({
755
808
  }
756
809
  /**
757
810
  * Returns a worker pool for the specified worker
758
- * @param options - only used first time for a specific worker name
759
- * @param options.name - the name of the worker - used to identify worker pool
760
- * @param options.url -
761
- * @param options.source -
811
+ * @param options Worker target used to identify and initialize the pool.
812
+ * @param options.name Worker name used as the base pool identity.
813
+ * @param options.url Worker script URL.
814
+ * @param options.source Inline worker source.
815
+ * @param options.loadWorker Built-in browser worker factory.
762
816
  * @example
763
817
  * const job = WorkerFarm.getWorkerFarm().getWorkerPool({name, url}).startJob(...);
764
818
  */
765
819
  getWorkerPool(options) {
766
- const { name, source, url } = options;
767
- let workerPool = this.workerPools.get(name);
820
+ const { name, source, url, getUrl, loadWorker } = options;
821
+ const workerPoolKey = getWorkerPoolKey(options);
822
+ let workerPool = this.workerPools.get(workerPoolKey);
768
823
  if (!workerPool) {
769
824
  workerPool = new WorkerPool({
770
825
  name,
771
826
  source,
772
- url
827
+ url,
828
+ getUrl,
829
+ loadWorker
773
830
  });
774
831
  workerPool.setProps(this._getWorkerPoolProps());
775
- this.workerPools.set(name, workerPool);
832
+ this.workerPools.set(workerPoolKey, workerPool);
776
833
  }
777
834
  return workerPool;
778
835
  }
@@ -793,35 +850,42 @@ function getWorkerName(worker) {
793
850
  const warning = worker.version !== VERSION2 ? ` (worker-utils@${VERSION2})` : "";
794
851
  return `${worker.name}@${worker.version}${warning}`;
795
852
  }
796
- function getWorkerURL(worker, options = {}) {
853
+ function getCustomWorkerURL(worker, options = {}) {
797
854
  var _a;
798
855
  const workerOptions = options[worker.id] || {};
799
- const workerFile = isBrowser2 ? `${worker.id}-worker.js` : worker.workerNode || `${worker.id}-worker-node.js`;
856
+ const workerFile = isBrowser2 ? worker.workerFile || `${worker.id}-worker.js` : worker.workerNode || `${worker.id}-worker-node.js`;
800
857
  let url = workerOptions.workerUrl;
801
- if (!url && typeof worker.worker === "string") {
802
- url = worker.worker;
803
- }
804
858
  if (!url && worker.id === "compression") {
805
859
  url = options.workerUrl;
806
860
  }
807
861
  const workerType = options._workerType || ((_a = options == null ? void 0 : options.core) == null ? void 0 : _a._workerType);
808
- if (workerType === "test") {
862
+ if (!url && workerType === "test") {
809
863
  if (isBrowser2) {
810
864
  url = `modules/${worker.module}/dist/${workerFile}`;
811
865
  } else {
812
866
  url = `modules/${worker.module}/src/workers/${worker.id}-worker-node.ts`;
813
867
  }
814
868
  }
815
- if (!url) {
816
- let version2 = worker.version;
817
- if (version2 === "latest") {
818
- version2 = NPM_TAG;
819
- }
820
- const versionTag = version2 ? `@${version2}` : "";
821
- url = `https://unpkg.com/@loaders.gl/${worker.module}${versionTag}/dist/${workerFile}`;
869
+ return url || null;
870
+ }
871
+ function getWorkerURL(worker, options = {}) {
872
+ const customWorkerUrl = getCustomWorkerURL(worker, options);
873
+ const descriptorWorkerUrl = typeof worker.worker === "string" ? worker.worker : null;
874
+ const url = customWorkerUrl || descriptorWorkerUrl || getDefaultWorkerURL(worker, true);
875
+ assert(url);
876
+ return url;
877
+ }
878
+ function getDefaultWorkerURL(worker, warn = false) {
879
+ const workerFile = isBrowser2 ? worker.workerFile || `${worker.id}-worker.js` : worker.workerNode || `${worker.id}-worker-node.js`;
880
+ let version2 = worker.version;
881
+ if (version2 === "latest") {
882
+ version2 = NPM_TAG;
883
+ }
884
+ const versionTag = version2 ? `@${version2}` : "";
885
+ const url = `https://unpkg.com/@loaders.gl/${worker.module}${versionTag}/dist/${workerFile}`;
886
+ if (warn) {
822
887
  warnIfUsingNpmTagFallback(worker, url);
823
888
  }
824
- assert(url);
825
889
  return url;
826
890
  }
827
891
  function warnIfUsingNpmTagFallback(worker, url) {
@@ -855,19 +919,16 @@ function canProcessOnWorker(worker, options) {
855
919
  return false;
856
920
  }
857
921
  const workerOptions = options == null ? void 0 : options[worker.id];
858
- return Boolean((worker.worker || (workerOptions == null ? void 0 : workerOptions.workerUrl)) && (options == null ? void 0 : options.worker));
922
+ return Boolean(
923
+ (worker.worker || worker.loadWorker || (workerOptions == null ? void 0 : workerOptions.workerUrl)) && (options == null ? void 0 : options.worker)
924
+ );
859
925
  }
860
926
  async function processOnWorker(worker, data, options = {}, context = {}, jobContext = {}) {
861
927
  var _a, _b, _c;
862
928
  throwIfAborted(options.signal);
863
929
  const name = getWorkerName(worker);
864
930
  const workerFarm = WorkerFarm.getWorkerFarm(options);
865
- const { source } = options;
866
- const workerPoolProps = { name, source };
867
- if (!source) {
868
- workerPoolProps.url = getWorkerURL(worker, options);
869
- }
870
- const workerPool = workerFarm.getWorkerPool(workerPoolProps);
931
+ const workerPool = workerFarm.getWorkerPool(getWorkerPoolTarget(worker, options, name));
871
932
  const jobName = options.jobName || worker.name;
872
933
  const job = await workerPool.startJob(
873
934
  jobName,
@@ -910,6 +971,24 @@ function createAbortError2(message) {
910
971
  error.name = "AbortError";
911
972
  return error;
912
973
  }
974
+ function getWorkerPoolTarget(worker, options, name) {
975
+ if (options.source) {
976
+ return { name, source: options.source };
977
+ }
978
+ const customWorkerUrl = getCustomWorkerURL(worker, options);
979
+ if (customWorkerUrl) {
980
+ return { name, url: customWorkerUrl };
981
+ }
982
+ if (isBrowser2 && worker.loadWorker) {
983
+ return {
984
+ name,
985
+ loadWorker: worker.loadWorker,
986
+ getUrl: () => getWorkerURL(worker, options),
987
+ urlKey: getDefaultWorkerURL(worker)
988
+ };
989
+ }
990
+ return { name, url: getWorkerURL(worker, options) };
991
+ }
913
992
  async function onMessage(context, job, type, payload) {
914
993
  switch (type) {
915
994
  case "done":
@@ -942,6 +1021,7 @@ var init_process_on_worker = __esm({
942
1021
  init_worker_farm();
943
1022
  init_get_worker_url();
944
1023
  init_get_transfer_list();
1024
+ init_globals2();
945
1025
  }
946
1026
  });
947
1027
 
@@ -975,7 +1055,7 @@ async function parseWithWorker(loader, data, options, context, parseOnMainThread
975
1055
  const result = await processOnWorker(
976
1056
  loader,
977
1057
  data,
978
- { ...getWorkerOptions(options), signal: workerSignal },
1058
+ { ...getWorkerOptions(options, loader), signal: workerSignal },
979
1059
  {
980
1060
  process: async (input, processOptions, _workerContext, parseContext) => {
981
1061
  if (!parseOnMainThread) {
@@ -1008,12 +1088,19 @@ function callParseOnMainThread(parseOnMainThread, input, options, context) {
1008
1088
  }
1009
1089
  return parseOnMainThread(input, void 0, options, context);
1010
1090
  }
1011
- function getWorkerOptions(options = {}) {
1091
+ function getWorkerOptions(options = {}, loader) {
1012
1092
  const serializedOptions = JSON.parse(JSON.stringify(options));
1013
- return {
1093
+ const workerOptions = {
1014
1094
  ...serializedOptions.core,
1015
1095
  ...serializedOptions
1016
1096
  };
1097
+ if (workerOptions.worker === "auto") {
1098
+ workerOptions.worker = true;
1099
+ }
1100
+ if (loader) {
1101
+ workerOptions._workerLoaderId = loader.id;
1102
+ }
1103
+ return workerOptions;
1017
1104
  }
1018
1105
  function getSerializableLoaderContext(context) {
1019
1106
  if (!context) {
@@ -16550,7 +16637,7 @@ function resolveParquetSourceWorkerUrl() {
16550
16637
  }
16551
16638
  }
16552
16639
  function getParquetSourceWorkerFile() {
16553
- return "./parquet-source-worker.js";
16640
+ return "../dist/parquet-source-worker.js";
16554
16641
  }
16555
16642
  var import_meta, PARQUET_SOURCE_WORKER_URL;
16556
16643
  var init_parquet_source_worker_url = __esm({