@loaders.gl/i3s 4.0.0-alpha.6 → 4.0.0-alpha.7

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 (83) hide show
  1. package/dist/dist.min.js +676 -113
  2. package/dist/es5/arcgis-webscene-loader.js +1 -1
  3. package/dist/es5/i3s-attribute-loader.js +1 -1
  4. package/dist/es5/i3s-building-scene-layer-loader.js +1 -1
  5. package/dist/es5/i3s-content-loader.js +2 -3
  6. package/dist/es5/i3s-content-loader.js.map +1 -1
  7. package/dist/es5/i3s-loader.js +1 -1
  8. package/dist/es5/i3s-node-page-loader.js +1 -1
  9. package/dist/es5/i3s-slpk-loader.js +20 -0
  10. package/dist/es5/i3s-slpk-loader.js.map +1 -0
  11. package/dist/es5/index.js +8 -1
  12. package/dist/es5/index.js.map +1 -1
  13. package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js +94 -0
  14. package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js.map +1 -0
  15. package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js +112 -0
  16. package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -0
  17. package/dist/es5/lib/parsers/parse-zip/cd-file-header.js +44 -0
  18. package/dist/es5/lib/parsers/parse-zip/cd-file-header.js.map +1 -0
  19. package/dist/es5/lib/parsers/parse-zip/local-file-header.js +26 -0
  20. package/dist/es5/lib/parsers/parse-zip/local-file-header.js.map +1 -0
  21. package/dist/es5/workers/{i3s-content-nodejs-worker.js → i3s-content-worker-node.js} +2 -2
  22. package/dist/es5/workers/i3s-content-worker-node.js.map +1 -0
  23. package/dist/esm/arcgis-webscene-loader.js +1 -1
  24. package/dist/esm/i3s-attribute-loader.js +1 -1
  25. package/dist/esm/i3s-building-scene-layer-loader.js +1 -1
  26. package/dist/esm/i3s-content-loader.js +2 -3
  27. package/dist/esm/i3s-content-loader.js.map +1 -1
  28. package/dist/esm/i3s-loader.js +1 -1
  29. package/dist/esm/i3s-node-page-loader.js +1 -1
  30. package/dist/esm/i3s-slpk-loader.js +13 -0
  31. package/dist/esm/i3s-slpk-loader.js.map +1 -0
  32. package/dist/esm/index.js +2 -1
  33. package/dist/esm/index.js.map +1 -1
  34. package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js +37 -0
  35. package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js.map +1 -0
  36. package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js +58 -0
  37. package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -0
  38. package/dist/esm/lib/parsers/parse-zip/cd-file-header.js +37 -0
  39. package/dist/esm/lib/parsers/parse-zip/cd-file-header.js.map +1 -0
  40. package/dist/esm/lib/parsers/parse-zip/local-file-header.js +19 -0
  41. package/dist/esm/lib/parsers/parse-zip/local-file-header.js.map +1 -0
  42. package/dist/esm/workers/{i3s-content-nodejs-worker.js → i3s-content-worker-node.js} +2 -2
  43. package/dist/esm/workers/i3s-content-worker-node.js.map +1 -0
  44. package/dist/i3s-content-loader.d.ts.map +1 -1
  45. package/dist/i3s-content-loader.js +1 -2
  46. package/dist/i3s-content-worker-node.js +197 -0
  47. package/dist/{i3s-content-nodejs-worker.js.map → i3s-content-worker-node.js.map} +3 -3
  48. package/dist/i3s-content-worker.js +77 -55
  49. package/dist/i3s-slpk-loader.d.ts +10 -0
  50. package/dist/i3s-slpk-loader.d.ts.map +1 -0
  51. package/dist/i3s-slpk-loader.js +20 -0
  52. package/dist/index.d.ts +2 -1
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +5 -3
  55. package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts +4 -0
  56. package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts.map +1 -0
  57. package/dist/lib/parsers/parse-slpk/parse-slpk.js +50 -0
  58. package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts +32 -0
  59. package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts.map +1 -0
  60. package/dist/lib/parsers/parse-slpk/slpk-archieve.js +79 -0
  61. package/dist/lib/parsers/parse-zip/cd-file-header.d.ts +38 -0
  62. package/dist/lib/parsers/parse-zip/cd-file-header.d.ts.map +1 -0
  63. package/dist/lib/parsers/parse-zip/cd-file-header.js +48 -0
  64. package/dist/lib/parsers/parse-zip/local-file-header.d.ts +30 -0
  65. package/dist/lib/parsers/parse-zip/local-file-header.d.ts.map +1 -0
  66. package/dist/lib/parsers/parse-zip/local-file-header.js +28 -0
  67. package/dist/workers/i3s-content-worker-node.d.ts +2 -0
  68. package/dist/workers/i3s-content-worker-node.d.ts.map +1 -0
  69. package/dist/workers/{i3s-content-nodejs-worker.js → i3s-content-worker-node.js} +2 -1
  70. package/package.json +15 -13
  71. package/src/i3s-content-loader.ts +1 -2
  72. package/src/i3s-slpk-loader.ts +25 -0
  73. package/src/index.ts +2 -2
  74. package/src/lib/parsers/parse-slpk/parse-slpk.ts +61 -0
  75. package/src/lib/parsers/parse-slpk/slpk-archieve.ts +108 -0
  76. package/src/lib/parsers/parse-zip/cd-file-header.ts +93 -0
  77. package/src/lib/parsers/parse-zip/local-file-header.ts +56 -0
  78. package/src/workers/{i3s-content-nodejs-worker.ts → i3s-content-worker-node.ts} +2 -1
  79. package/dist/es5/workers/i3s-content-nodejs-worker.js.map +0 -1
  80. package/dist/esm/workers/i3s-content-nodejs-worker.js.map +0 -1
  81. package/dist/i3s-content-nodejs-worker.js +0 -198
  82. package/dist/workers/i3s-content-nodejs-worker.d.ts +0 -2
  83. package/dist/workers/i3s-content-nodejs-worker.d.ts.map +0 -1
@@ -55,7 +55,7 @@
55
55
  var nodeVersion = matches && parseFloat(matches[1]) || 0;
56
56
 
57
57
  // ../worker-utils/src/lib/env-utils/version.ts
58
- var VERSION = true ? "4.0.0-alpha.6" : DEFAULT_VERSION;
58
+ var VERSION = true ? "4.0.0-alpha.7" : DEFAULT_VERSION;
59
59
  if (false) {
60
60
  console.error("loaders.gl: The __VERSION__ variable is not injected using babel plugin. Latest unstable workers would be fetched from the CDN.");
61
61
  }
@@ -359,7 +359,7 @@
359
359
  }
360
360
  }
361
361
  returnWorkerToQueue(worker) {
362
- const shouldDestroyWorker = this.isDestroyed || !this.reuseWorkers || this.count > this._getMaxConcurrency();
362
+ const shouldDestroyWorker = !isBrowser2 || this.isDestroyed || !this.reuseWorkers || this.count > this._getMaxConcurrency();
363
363
  if (shouldDestroyWorker) {
364
364
  worker.destroy();
365
365
  this.count--;
@@ -523,7 +523,7 @@
523
523
  var NPM_TAG = "beta";
524
524
  function getWorkerURL(worker, options = {}) {
525
525
  const workerOptions = options[worker.id] || {};
526
- const workerFile = `${worker.id}-worker.js`;
526
+ const workerFile = isBrowser2 ? `${worker.id}-worker.js` : `${worker.id}-worker-node.js`;
527
527
  let url = workerOptions.workerUrl;
528
528
  if (!url && worker.id === "compression") {
529
529
  url = options.workerUrl;
@@ -1053,40 +1053,55 @@
1053
1053
  return "";
1054
1054
  }
1055
1055
 
1056
- // ../core/src/lib/utils/resource-utils.ts
1056
+ // ../core/src/lib/utils/url-utils.ts
1057
1057
  var QUERY_STRING_PATTERN = /\?.*/;
1058
- function getResourceUrlAndType(resource) {
1058
+ function extractQueryString(url) {
1059
+ const matches3 = url.match(QUERY_STRING_PATTERN);
1060
+ return matches3 && matches3[0];
1061
+ }
1062
+ function stripQueryString(url) {
1063
+ return url.replace(QUERY_STRING_PATTERN, "");
1064
+ }
1065
+
1066
+ // ../core/src/lib/utils/resource-utils.ts
1067
+ function getResourceUrl(resource) {
1059
1068
  if (isResponse(resource)) {
1060
- const url = stripQueryString(resource.url || "");
1061
- const contentTypeHeader = resource.headers.get("content-type") || "";
1062
- return {
1063
- url,
1064
- type: parseMIMEType(contentTypeHeader) || parseMIMETypeFromURL(url)
1065
- };
1069
+ const response = resource;
1070
+ return response.url;
1066
1071
  }
1067
1072
  if (isBlob(resource)) {
1068
- return {
1069
- url: stripQueryString(resource.name || ""),
1070
- type: resource.type || ""
1071
- };
1073
+ const blob = resource;
1074
+ return blob.name || "";
1072
1075
  }
1073
1076
  if (typeof resource === "string") {
1074
- return {
1075
- url: stripQueryString(resource),
1076
- type: parseMIMETypeFromURL(resource)
1077
- };
1077
+ return resource;
1078
1078
  }
1079
- return {
1080
- url: "",
1081
- type: ""
1082
- };
1079
+ return "";
1080
+ }
1081
+ function getResourceMIMEType(resource) {
1082
+ if (isResponse(resource)) {
1083
+ const response = resource;
1084
+ const contentTypeHeader = response.headers.get("content-type") || "";
1085
+ const noQueryUrl = stripQueryString(response.url);
1086
+ return parseMIMEType(contentTypeHeader) || parseMIMETypeFromURL(noQueryUrl);
1087
+ }
1088
+ if (isBlob(resource)) {
1089
+ const blob = resource;
1090
+ return blob.type || "";
1091
+ }
1092
+ if (typeof resource === "string") {
1093
+ return parseMIMETypeFromURL(resource);
1094
+ }
1095
+ return "";
1083
1096
  }
1084
1097
  function getResourceContentLength(resource) {
1085
1098
  if (isResponse(resource)) {
1086
- return resource.headers["content-length"] || -1;
1099
+ const response = resource;
1100
+ return response.headers["content-length"] || -1;
1087
1101
  }
1088
1102
  if (isBlob(resource)) {
1089
- return resource.size;
1103
+ const blob = resource;
1104
+ return blob.size;
1090
1105
  }
1091
1106
  if (typeof resource === "string") {
1092
1107
  return resource.length;
@@ -1099,9 +1114,6 @@
1099
1114
  }
1100
1115
  return -1;
1101
1116
  }
1102
- function stripQueryString(url) {
1103
- return url.replace(QUERY_STRING_PATTERN, "");
1104
- }
1105
1117
 
1106
1118
  // ../core/src/lib/utils/response-utils.ts
1107
1119
  async function makeResponse(resource) {
@@ -1113,7 +1125,8 @@
1113
1125
  if (contentLength >= 0) {
1114
1126
  headers["content-length"] = String(contentLength);
1115
1127
  }
1116
- const { url, type } = getResourceUrlAndType(resource);
1128
+ const url = getResourceUrl(resource);
1129
+ const type = getResourceMIMEType(resource);
1117
1130
  if (type) {
1118
1131
  headers["content-type"] = type;
1119
1132
  }
@@ -1190,7 +1203,7 @@
1190
1203
  return await makeResponse(url);
1191
1204
  }
1192
1205
 
1193
- // ../../node_modules/@probe.gl/env/dist/lib/is-electron.js
1206
+ // ../../node_modules/@probe.gl/log/node_modules/@probe.gl/env/dist/lib/is-electron.js
1194
1207
  function isElectron(mockUserAgent) {
1195
1208
  if (typeof window !== "undefined" && typeof window.process === "object" && window.process.type === "renderer") {
1196
1209
  return true;
@@ -1206,13 +1219,13 @@
1206
1219
  return false;
1207
1220
  }
1208
1221
 
1209
- // ../../node_modules/@probe.gl/env/dist/lib/is-browser.js
1222
+ // ../../node_modules/@probe.gl/log/node_modules/@probe.gl/env/dist/lib/is-browser.js
1210
1223
  function isBrowser3() {
1211
1224
  const isNode = typeof process === "object" && String(process) === "[object process]" && !process.browser;
1212
1225
  return !isNode || isElectron();
1213
1226
  }
1214
1227
 
1215
- // ../../node_modules/@probe.gl/env/dist/lib/globals.js
1228
+ // ../../node_modules/@probe.gl/log/node_modules/@probe.gl/env/dist/lib/globals.js
1216
1229
  var self_3 = globalThis.self || globalThis.window || globalThis.global;
1217
1230
  var window_3 = globalThis.window || globalThis.self || globalThis.global;
1218
1231
  var document_3 = globalThis.document || {};
@@ -1220,8 +1233,8 @@
1220
1233
  var console_ = globalThis.console;
1221
1234
  var navigator_ = globalThis.navigator || {};
1222
1235
 
1223
- // ../../node_modules/@probe.gl/env/dist/utils/globals.js
1224
- var VERSION3 = true ? "4.0.0-alpha.6" : "untranspiled source";
1236
+ // ../../node_modules/@probe.gl/log/node_modules/@probe.gl/env/dist/utils/globals.js
1237
+ var VERSION3 = true ? "4.0.0-alpha.7" : "untranspiled source";
1225
1238
  var isBrowser4 = isBrowser3();
1226
1239
 
1227
1240
  // ../../node_modules/@probe.gl/log/dist/utils/local-storage.js
@@ -1973,8 +1986,9 @@
1973
1986
  return loader;
1974
1987
  }
1975
1988
  function selectLoaderInternal(data, loaders, options, context) {
1976
- const { url, type } = getResourceUrlAndType(data);
1977
- const testUrl = url || context?.url;
1989
+ const url = getResourceUrl(data);
1990
+ const type = getResourceMIMEType(data);
1991
+ const testUrl = stripQueryString(url) || context?.url;
1978
1992
  let loader = null;
1979
1993
  let reason = "";
1980
1994
  if (options?.mimeType) {
@@ -2003,7 +2017,8 @@
2003
2017
  return true;
2004
2018
  }
2005
2019
  function getNoValidLoaderMessage(data) {
2006
- const { url, type } = getResourceUrlAndType(data);
2020
+ const url = getResourceUrl(data);
2021
+ const type = getResourceMIMEType(data);
2007
2022
  let message = "No valid loader found (";
2008
2023
  message += url ? `${path_exports.filename(url)}, ` : "no url provided, ";
2009
2024
  message += `MIME type: ${type ? `"${type}"` : "not provided"}, `;
@@ -2277,18 +2292,25 @@
2277
2292
  }
2278
2293
 
2279
2294
  // ../core/src/lib/loader-utils/loader-context.ts
2280
- function getLoaderContext(context, options, previousContext = null) {
2281
- if (previousContext) {
2282
- return previousContext;
2295
+ function getLoaderContext(context, options, parentContext) {
2296
+ if (parentContext) {
2297
+ return parentContext;
2283
2298
  }
2284
- const resolvedContext = {
2299
+ const newContext = {
2285
2300
  fetch: getFetchFunction(options, context),
2286
2301
  ...context
2287
2302
  };
2288
- if (!Array.isArray(resolvedContext.loaders)) {
2289
- resolvedContext.loaders = null;
2303
+ if (newContext.url) {
2304
+ const baseUrl = stripQueryString(newContext.url);
2305
+ newContext.baseUrl = baseUrl;
2306
+ newContext.queryString = extractQueryString(newContext.url);
2307
+ newContext.filename = path_exports.filename(baseUrl);
2308
+ newContext.baseUrl = path_exports.dirname(baseUrl);
2309
+ }
2310
+ if (!Array.isArray(newContext.loaders)) {
2311
+ newContext.loaders = null;
2290
2312
  }
2291
- return resolvedContext;
2313
+ return newContext;
2292
2314
  }
2293
2315
  function getLoadersFromContext(loaders, context) {
2294
2316
  if (!context && loaders && !Array.isArray(loaders)) {
@@ -2315,7 +2337,7 @@
2315
2337
  }
2316
2338
  data = await data;
2317
2339
  options = options || {};
2318
- const { url } = getResourceUrlAndType(data);
2340
+ const url = getResourceUrl(data);
2319
2341
  const typedLoaders = loaders;
2320
2342
  const candidateLoaders = getLoadersFromContext(typedLoaders, context);
2321
2343
  const loader = await selectLoader(data, candidateLoaders, options);
@@ -2323,7 +2345,7 @@
2323
2345
  return null;
2324
2346
  }
2325
2347
  options = normalizeOptions(options, loader, candidateLoaders, url);
2326
- context = getLoaderContext({ url, parse, loaders: candidateLoaders }, options, context);
2348
+ context = getLoaderContext({ url, parse, loaders: candidateLoaders }, options, context || null);
2327
2349
  return await parseWithLoader(loader, data, options, context);
2328
2350
  }
2329
2351
  async function parseWithLoader(loader, data, options, context) {
@@ -4560,7 +4582,7 @@
4560
4582
  _defineProperty(Ellipsoid, "WGS84", new Ellipsoid(WGS84_RADIUS_X, WGS84_RADIUS_Y, WGS84_RADIUS_Z));
4561
4583
 
4562
4584
  // ../images/src/lib/utils/version.ts
4563
- var VERSION4 = true ? "4.0.0-alpha.6" : "latest";
4585
+ var VERSION4 = true ? "4.0.0-alpha.7" : "latest";
4564
4586
 
4565
4587
  // ../images/src/lib/category-api/image-type.ts
4566
4588
  var { _parseImageNode } = globalThis;
@@ -4957,7 +4979,7 @@
4957
4979
  };
4958
4980
 
4959
4981
  // ../draco/src/lib/utils/version.ts
4960
- var VERSION5 = true ? "4.0.0-alpha.6" : "latest";
4982
+ var VERSION5 = true ? "4.0.0-alpha.7" : "latest";
4961
4983
 
4962
4984
  // ../draco/src/draco-loader.ts
4963
4985
  var DEFAULT_DRACO_OPTIONS = {
@@ -4970,7 +4992,7 @@
4970
4992
  };
4971
4993
  var DracoLoader = {
4972
4994
  name: "Draco",
4973
- id: isBrowser2 ? "draco" : "draco-nodejs",
4995
+ id: "draco",
4974
4996
  module: "draco",
4975
4997
  version: VERSION5,
4976
4998
  worker: true,
@@ -5502,10 +5524,10 @@
5502
5524
  }
5503
5525
 
5504
5526
  // ../textures/src/lib/utils/version.ts
5505
- var VERSION6 = true ? "4.0.0-alpha.6" : "beta";
5527
+ var VERSION6 = true ? "4.0.0-alpha.7" : "beta";
5506
5528
 
5507
5529
  // ../textures/src/lib/parsers/basis-module-loader.ts
5508
- var VERSION7 = true ? "4.0.0-alpha.6" : "beta";
5530
+ var VERSION7 = true ? "4.0.0-alpha.7" : "beta";
5509
5531
  var BASIS_CDN_ENCODER_WASM = `https://unpkg.com/@loaders.gl/textures@${VERSION7}/dist/libs/basis_encoder.wasm`;
5510
5532
  var BASIS_CDN_ENCODER_JS = `https://unpkg.com/@loaders.gl/textures@${VERSION7}/dist/libs/basis_encoder.js`;
5511
5533
  var loadBasisTranscoderPromise;
@@ -6095,7 +6117,7 @@
6095
6117
  // ../textures/src/basis-loader.ts
6096
6118
  var BasisWorkerLoader = {
6097
6119
  name: "Basis",
6098
- id: isBrowser2 ? "basis" : "basis-nodejs",
6120
+ id: "basis",
6099
6121
  module: "textures",
6100
6122
  version: VERSION6,
6101
6123
  worker: true,
@@ -7203,7 +7225,7 @@
7203
7225
  }
7204
7226
 
7205
7227
  // src/i3s-attribute-loader.ts
7206
- var VERSION8 = true ? "4.0.0-alpha.6" : "latest";
7228
+ var VERSION8 = true ? "4.0.0-alpha.7" : "latest";
7207
7229
  var I3SAttributeLoader = {
7208
7230
  name: "I3S Attribute",
7209
7231
  id: "i3s-attribute",
@@ -7660,10 +7682,10 @@
7660
7682
  }
7661
7683
 
7662
7684
  // src/i3s-content-loader.ts
7663
- var VERSION9 = true ? "4.0.0-alpha.6" : "beta";
7685
+ var VERSION9 = true ? "4.0.0-alpha.7" : "beta";
7664
7686
  var I3SContentLoader = {
7665
7687
  name: "I3S Content (Indexed Scene Layers)",
7666
- id: isBrowser2 ? "i3s-content" : "i3s-content-nodejs",
7688
+ id: "i3s-content",
7667
7689
  module: "i3s",
7668
7690
  worker: true,
7669
7691
  version: VERSION9,
@@ -0,0 +1,10 @@
1
+ import { LoaderOptions, LoaderWithParser } from '@loaders.gl/loader-utils';
2
+ export type SLPKLoaderOptions = LoaderOptions & {
3
+ path?: string;
4
+ mode?: 'http' | 'raw';
5
+ };
6
+ /**
7
+ * Loader for SLPK - Scene Layer Package
8
+ */
9
+ export declare const SLPKLoader: LoaderWithParser;
10
+ //# sourceMappingURL=i3s-slpk-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i3s-slpk-loader.d.ts","sourceRoot":"","sources":["../src/i3s-slpk-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,aAAa,EAAE,gBAAgB,EAAC,MAAM,0BAA0B,CAAC;AAOzE,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,gBASxB,CAAC"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SLPKLoader = void 0;
4
+ const parse_slpk_1 = require("./lib/parsers/parse-slpk/parse-slpk");
5
+ // __VERSION__ is injected by babel-plugin-version-inline
6
+ // @ts-ignore TS2304: Cannot find name '__VERSION__'.
7
+ const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
8
+ /**
9
+ * Loader for SLPK - Scene Layer Package
10
+ */
11
+ exports.SLPKLoader = {
12
+ name: 'I3S SLPK (Scene Layer Package)',
13
+ id: 'slpk',
14
+ module: 'i3s',
15
+ version: VERSION,
16
+ mimeTypes: ['application/octet-stream'],
17
+ parse: parse_slpk_1.parseSLPK,
18
+ extensions: ['slpk'],
19
+ options: {}
20
+ };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  export type { BoundingVolumes, Mbs, Obb, SceneLayer3D, AttributeStorageInfo, Field, ESRIField, PopupInfo, Node3DIndexDocument, LodSelection, NodeReference, Resource, MaxScreenThresholdSQ, NodeInPage, SharedResources, Attribute, Extent, FeatureAttribute, FieldInfo, I3SMaterialDefinition, TextureDefinitionInfo, MaterialDefinitionInfo, FullExtent, StatisticsInfo, StatsInfo, Histogram, ValueCount, BuildingSceneSublayer, DATA_TYPE, OperationalLayer } from './types';
2
2
  export { COORDINATE_SYSTEM } from './lib/parsers/constants';
3
3
  export { I3SLoader } from './i3s-loader';
4
+ export { SLPKLoader } from './i3s-slpk-loader';
4
5
  export { I3SContentLoader } from './i3s-content-loader';
5
6
  export { I3SAttributeLoader, loadFeatureAttributes } from './i3s-attribute-loader';
6
- export { I3SNodePageLoader } from './i3s-node-page-loader';
7
7
  export { I3SBuildingSceneLayerLoader } from './i3s-building-scene-layer-loader';
8
+ export { I3SNodePageLoader } from './i3s-node-page-loader';
8
9
  export { ArcGisWebSceneLoader } from './arcgis-webscene-loader';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,eAAe,EACf,GAAG,EACH,GAAG,EACH,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,SAAS,EACT,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,kBAAkB,EAAE,qBAAqB,EAAC,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAC,iBAAiB,EAAC,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAC,2BAA2B,EAAC,MAAM,mCAAmC,CAAC;AAE9E,OAAO,EAAC,oBAAoB,EAAC,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,eAAe,EACf,GAAG,EACH,GAAG,EACH,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,SAAS,EACT,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,UAAU,EAAC,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,kBAAkB,EAAE,qBAAqB,EAAC,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAC,2BAA2B,EAAC,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAC,iBAAiB,EAAC,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAC,oBAAoB,EAAC,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -1,19 +1,21 @@
1
1
  "use strict";
2
2
  // loaders.gl, MIT license
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.ArcGisWebSceneLoader = exports.I3SBuildingSceneLayerLoader = exports.I3SNodePageLoader = exports.loadFeatureAttributes = exports.I3SAttributeLoader = exports.I3SContentLoader = exports.I3SLoader = exports.COORDINATE_SYSTEM = void 0;
4
+ exports.ArcGisWebSceneLoader = exports.I3SNodePageLoader = exports.I3SBuildingSceneLayerLoader = exports.loadFeatureAttributes = exports.I3SAttributeLoader = exports.I3SContentLoader = exports.SLPKLoader = exports.I3SLoader = exports.COORDINATE_SYSTEM = void 0;
5
5
  var constants_1 = require("./lib/parsers/constants");
6
6
  Object.defineProperty(exports, "COORDINATE_SYSTEM", { enumerable: true, get: function () { return constants_1.COORDINATE_SYSTEM; } });
7
7
  var i3s_loader_1 = require("./i3s-loader");
8
8
  Object.defineProperty(exports, "I3SLoader", { enumerable: true, get: function () { return i3s_loader_1.I3SLoader; } });
9
+ var i3s_slpk_loader_1 = require("./i3s-slpk-loader");
10
+ Object.defineProperty(exports, "SLPKLoader", { enumerable: true, get: function () { return i3s_slpk_loader_1.SLPKLoader; } });
9
11
  var i3s_content_loader_1 = require("./i3s-content-loader");
10
12
  Object.defineProperty(exports, "I3SContentLoader", { enumerable: true, get: function () { return i3s_content_loader_1.I3SContentLoader; } });
11
13
  var i3s_attribute_loader_1 = require("./i3s-attribute-loader");
12
14
  Object.defineProperty(exports, "I3SAttributeLoader", { enumerable: true, get: function () { return i3s_attribute_loader_1.I3SAttributeLoader; } });
13
15
  Object.defineProperty(exports, "loadFeatureAttributes", { enumerable: true, get: function () { return i3s_attribute_loader_1.loadFeatureAttributes; } });
14
- var i3s_node_page_loader_1 = require("./i3s-node-page-loader");
15
- Object.defineProperty(exports, "I3SNodePageLoader", { enumerable: true, get: function () { return i3s_node_page_loader_1.I3SNodePageLoader; } });
16
16
  var i3s_building_scene_layer_loader_1 = require("./i3s-building-scene-layer-loader");
17
17
  Object.defineProperty(exports, "I3SBuildingSceneLayerLoader", { enumerable: true, get: function () { return i3s_building_scene_layer_loader_1.I3SBuildingSceneLayerLoader; } });
18
+ var i3s_node_page_loader_1 = require("./i3s-node-page-loader");
19
+ Object.defineProperty(exports, "I3SNodePageLoader", { enumerable: true, get: function () { return i3s_node_page_loader_1.I3SNodePageLoader; } });
18
20
  var arcgis_webscene_loader_1 = require("./arcgis-webscene-loader");
19
21
  Object.defineProperty(exports, "ArcGisWebSceneLoader", { enumerable: true, get: function () { return arcgis_webscene_loader_1.ArcGisWebSceneLoader; } });
@@ -0,0 +1,4 @@
1
+ /// <reference types="node" />
2
+ import type { SLPKLoaderOptions } from '../../../i3s-slpk-loader';
3
+ export declare function parseSLPK(data: ArrayBuffer, options?: SLPKLoaderOptions): Promise<Buffer>;
4
+ //# sourceMappingURL=parse-slpk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-slpk.d.ts","sourceRoot":"","sources":["../../../../src/lib/parsers/parse-slpk/parse-slpk.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAehE,wBAAsB,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,iBAAsB,mBA6CjF"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSLPK = void 0;
4
+ const cd_file_header_1 = require("../parse-zip/cd-file-header");
5
+ const local_file_header_1 = require("../parse-zip/local-file-header");
6
+ const slpk_archieve_1 = require("./slpk-archieve");
7
+ /**
8
+ * Returns one byte from the provided buffer at the provided position
9
+ * @param offset - position where to read
10
+ * @param buffer - buffer to read
11
+ * @returns one byte from the provided buffer at the provided position
12
+ */
13
+ const getByteAt = (offset, buffer) => {
14
+ return buffer.getUint8(buffer.byteOffset + offset);
15
+ };
16
+ async function parseSLPK(data, options = {}) {
17
+ const archive = new DataView(data);
18
+ const cdFileHeaderSignature = [80, 75, 1, 2];
19
+ const searchWindow = [
20
+ getByteAt(archive.byteLength - 1, archive),
21
+ getByteAt(archive.byteLength - 2, archive),
22
+ getByteAt(archive.byteLength - 3, archive),
23
+ undefined
24
+ ];
25
+ let hashCDOffset = 0;
26
+ // looking for the last record in the central directory
27
+ for (let i = archive.byteLength - 4; i > -1; i--) {
28
+ searchWindow[3] = searchWindow[2];
29
+ searchWindow[2] = searchWindow[1];
30
+ searchWindow[1] = searchWindow[0];
31
+ searchWindow[0] = getByteAt(i, archive);
32
+ if (searchWindow.every((val, index) => val === cdFileHeaderSignature[index])) {
33
+ hashCDOffset = i;
34
+ break;
35
+ }
36
+ }
37
+ const cdFileHeader = (0, cd_file_header_1.parseZipCDFileHeader)(hashCDOffset, archive);
38
+ const textDecoder = new TextDecoder();
39
+ if (textDecoder.decode(cdFileHeader.fileName) !== '@specialIndexFileHASH128@') {
40
+ throw new Error('No hash file in slpk');
41
+ }
42
+ const localFileHeader = (0, local_file_header_1.parseZipLocalFileHeader)(cdFileHeader.localHeaderOffset, archive);
43
+ const fileDataOffset = localFileHeader.fileDataOffset;
44
+ const hashFile = archive.buffer.slice(fileDataOffset, fileDataOffset + localFileHeader.compressedSize);
45
+ if (!hashFile) {
46
+ throw new Error('No hash file in slpk');
47
+ }
48
+ return await new slpk_archieve_1.SLPKArchive(data, hashFile).getFile(options.path ?? '');
49
+ }
50
+ exports.parseSLPK = parseSLPK;
@@ -0,0 +1,32 @@
1
+ /// <reference types="node" />
2
+ /**
3
+ * Class for handling information about slpk file
4
+ */
5
+ export declare class SLPKArchive {
6
+ slpkArchive: DataView;
7
+ hashArray: {
8
+ hash: Buffer;
9
+ offset: number;
10
+ }[];
11
+ constructor(slpkArchiveBuffer: ArrayBuffer, hashFile: ArrayBuffer);
12
+ /**
13
+ * Reads hash file from buffer and returns it in ready-to-use form
14
+ * @param hashFile - bufer containing hash file
15
+ * @returns Array containing file info
16
+ */
17
+ private parseHashFile;
18
+ /**
19
+ * Returns file with the given path from slpk archive
20
+ * @param path - path inside the slpk
21
+ * @param mode - currently only raw mode supported
22
+ * @returns buffer with ready to use file
23
+ */
24
+ getFile(path: string, mode?: 'http' | 'raw'): Promise<Buffer>;
25
+ /**
26
+ * Trying to get raw file data by adress
27
+ * @param path - path inside the archive
28
+ * @returns buffer with the raw file data
29
+ */
30
+ private getFileBytes;
31
+ }
32
+ //# sourceMappingURL=slpk-archieve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slpk-archieve.d.ts","sourceRoot":"","sources":["../../../../src/lib/parsers/parse-slpk/slpk-archieve.ts"],"names":[],"mappings":";AAiBA;;GAEG;AACH,qBAAa,WAAW;IACtB,WAAW,EAAE,QAAQ,CAAC;IACtB,SAAS,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;gBAChC,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW;IAKjE;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAqBrB;;;;;OAKG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,KAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB1E;;;;OAIG;IACH,OAAO,CAAC,YAAY;CAmBrB"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SLPKArchive = void 0;
7
+ const worker_utils_1 = require("@loaders.gl/worker-utils");
8
+ const md5_1 = __importDefault(require("md5"));
9
+ const compression_1 = require("@loaders.gl/compression");
10
+ const local_file_header_1 = require("../parse-zip/local-file-header");
11
+ /**
12
+ * Class for handling information about slpk file
13
+ */
14
+ class SLPKArchive {
15
+ constructor(slpkArchiveBuffer, hashFile) {
16
+ this.slpkArchive = new DataView(slpkArchiveBuffer);
17
+ this.hashArray = this.parseHashFile(hashFile);
18
+ }
19
+ /**
20
+ * Reads hash file from buffer and returns it in ready-to-use form
21
+ * @param hashFile - bufer containing hash file
22
+ * @returns Array containing file info
23
+ */
24
+ parseHashFile(hashFile) {
25
+ const hashFileBuffer = Buffer.from(hashFile);
26
+ const hashArray = [];
27
+ for (let i = 0; i < hashFileBuffer.buffer.byteLength; i = i + 24) {
28
+ const offsetBuffer = new DataView(hashFileBuffer.buffer.slice(hashFileBuffer.byteOffset + i + 16, hashFileBuffer.byteOffset + i + 24));
29
+ const offset = offsetBuffer.getUint32(offsetBuffer.byteOffset, true);
30
+ hashArray.push({
31
+ hash: Buffer.from(hashFileBuffer.subarray(hashFileBuffer.byteOffset + i, hashFileBuffer.byteOffset + i + 16)),
32
+ offset
33
+ });
34
+ }
35
+ return hashArray;
36
+ }
37
+ /**
38
+ * Returns file with the given path from slpk archive
39
+ * @param path - path inside the slpk
40
+ * @param mode - currently only raw mode supported
41
+ * @returns buffer with ready to use file
42
+ */
43
+ async getFile(path, mode = 'raw') {
44
+ if (mode === 'http') {
45
+ throw new Error('http mode is not supported');
46
+ }
47
+ const fileToDecompress = this.getFileBytes(`${path}.gz`);
48
+ if (fileToDecompress) {
49
+ const decompressedData = await (0, worker_utils_1.processOnWorker)(compression_1.CompressionWorker, fileToDecompress, {
50
+ compression: 'gzip',
51
+ operation: 'decompress',
52
+ _workerType: 'test',
53
+ gzip: {}
54
+ });
55
+ return decompressedData;
56
+ }
57
+ const fileWithoutCompression = this.getFileBytes(path);
58
+ if (fileWithoutCompression) {
59
+ return Promise.resolve(Buffer.from(fileWithoutCompression));
60
+ }
61
+ throw new Error('No such file in the archieve');
62
+ }
63
+ /**
64
+ * Trying to get raw file data by adress
65
+ * @param path - path inside the archive
66
+ * @returns buffer with the raw file data
67
+ */
68
+ getFileBytes(path) {
69
+ const nameHash = Buffer.from((0, md5_1.default)(path), 'hex');
70
+ const fileInfo = this.hashArray.find((val) => Buffer.compare(val.hash, nameHash) === 0);
71
+ if (!fileInfo) {
72
+ return undefined;
73
+ }
74
+ const localFileHeader = (0, local_file_header_1.parseZipLocalFileHeader)(this.slpkArchive.byteOffset + fileInfo?.offset, this.slpkArchive);
75
+ const compressedFile = this.slpkArchive.buffer.slice(localFileHeader.fileDataOffset, localFileHeader.fileDataOffset + localFileHeader.compressedSize);
76
+ return compressedFile;
77
+ }
78
+ }
79
+ exports.SLPKArchive = SLPKArchive;
@@ -0,0 +1,38 @@
1
+ /**
2
+ * zip central directory file header info
3
+ * according to https://en.wikipedia.org/wiki/ZIP_(file_format)
4
+ */
5
+ export type ZipCDFileHeader = {
6
+ /**
7
+ * Compressed size
8
+ */
9
+ compressedSize: number;
10
+ /**
11
+ * Uncompressed size
12
+ */
13
+ uncompressedSize: number;
14
+ /**
15
+ * File name length
16
+ */
17
+ fileNameLength: number;
18
+ /**
19
+ * File name
20
+ */
21
+ fileName: ArrayBuffer;
22
+ /**
23
+ * Extra field offset
24
+ */
25
+ extraOffset: number;
26
+ /**
27
+ * Relative offset of local file header
28
+ */
29
+ localHeaderOffset: number;
30
+ };
31
+ /**
32
+ * Parses central directory file header of zip file
33
+ * @param headerOffset - offset in the archive where header starts
34
+ * @param buffer - buffer containing whole array
35
+ * @returns Info from the header
36
+ */
37
+ export declare const parseZipCDFileHeader: (headerOffset: number, buffer: DataView) => ZipCDFileHeader;
38
+ //# sourceMappingURL=cd-file-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cd-file-header.d.ts","sourceRoot":"","sources":["../../../../src/lib/parsers/parse-zip/cd-file-header.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,QAAQ,EAAE,WAAW,CAAC;IACtB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,iBAAkB,MAAM,UAAU,QAAQ,KAAG,eAuD7E,CAAC"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseZipCDFileHeader = void 0;
4
+ /**
5
+ * Parses central directory file header of zip file
6
+ * @param headerOffset - offset in the archive where header starts
7
+ * @param buffer - buffer containing whole array
8
+ * @returns Info from the header
9
+ */
10
+ const parseZipCDFileHeader = (headerOffset, buffer) => {
11
+ const offsets = {
12
+ CD_COMPRESSED_SIZE_OFFSET: 20,
13
+ CD_UNCOMPRESSED_SIZE_OFFSET: 24,
14
+ CD_FILE_NAME_LENGTH_OFFSET: 28,
15
+ CD_EXTRA_FIELD_LENGTH_OFFSET: 30,
16
+ CD_LOCAL_HEADER_OFFSET_OFFSET: 42,
17
+ CD_FILE_NAME_OFFSET: 46
18
+ };
19
+ const compressedSize = buffer.getUint32(headerOffset + offsets.CD_COMPRESSED_SIZE_OFFSET, true);
20
+ const uncompressedSize = buffer.getUint32(headerOffset + offsets.CD_UNCOMPRESSED_SIZE_OFFSET, true);
21
+ const fileNameLength = buffer.getUint16(headerOffset + offsets.CD_FILE_NAME_LENGTH_OFFSET, true);
22
+ const fileName = buffer.buffer.slice(headerOffset + offsets.CD_FILE_NAME_OFFSET, headerOffset + offsets.CD_FILE_NAME_OFFSET + fileNameLength);
23
+ const extraOffset = headerOffset + offsets.CD_FILE_NAME_OFFSET + fileNameLength;
24
+ const oldFormatOffset = buffer.getUint32(headerOffset + offsets.CD_LOCAL_HEADER_OFFSET_OFFSET, true);
25
+ let fileDataOffset = oldFormatOffset;
26
+ if (fileDataOffset === 0xffffffff) {
27
+ let offsetInZip64Data = 4;
28
+ // looking for info that might be also be in zip64 extra field
29
+ if (compressedSize === 0xffffffff) {
30
+ offsetInZip64Data += 8;
31
+ }
32
+ if (uncompressedSize === 0xffffffff) {
33
+ offsetInZip64Data += 8;
34
+ }
35
+ // getUint32 needs to be replaced with getBigUint64 for archieves bigger than 2gb
36
+ fileDataOffset = buffer.getUint32(extraOffset + offsetInZip64Data, true); // setting it to the one from zip64
37
+ }
38
+ const localHeaderOffset = fileDataOffset;
39
+ return {
40
+ compressedSize,
41
+ uncompressedSize,
42
+ fileNameLength,
43
+ fileName,
44
+ extraOffset,
45
+ localHeaderOffset
46
+ };
47
+ };
48
+ exports.parseZipCDFileHeader = parseZipCDFileHeader;