@loaders.gl/i3s 4.0.0-alpha.15 → 4.0.0-alpha.16

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 (90) hide show
  1. package/dist/dist.min.js +278 -197
  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 +1 -1
  6. package/dist/es5/i3s-loader.js +1 -1
  7. package/dist/es5/i3s-node-page-loader.js +1 -1
  8. package/dist/es5/i3s-slpk-loader.js +1 -1
  9. package/dist/es5/index.js.map +1 -1
  10. package/dist/es5/lib/parsers/constants.js +14 -15
  11. package/dist/es5/lib/parsers/constants.js.map +1 -1
  12. package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js +93 -29
  13. package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
  14. package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js +51 -30
  15. package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
  16. package/dist/es5/lib/parsers/parse-zip/cd-file-header.js +61 -42
  17. package/dist/es5/lib/parsers/parse-zip/cd-file-header.js.map +1 -1
  18. package/dist/es5/lib/parsers/parse-zip/end-of-central-directory.js +100 -0
  19. package/dist/es5/lib/parsers/parse-zip/end-of-central-directory.js.map +1 -0
  20. package/dist/es5/lib/parsers/parse-zip/local-file-header.js +1 -1
  21. package/dist/es5/lib/parsers/parse-zip/local-file-header.js.map +1 -1
  22. package/dist/es5/lib/parsers/parse-zip/search-from-the-end.js.map +1 -0
  23. package/dist/es5/types.js +1 -14
  24. package/dist/es5/types.js.map +1 -1
  25. package/dist/esm/arcgis-webscene-loader.js +1 -1
  26. package/dist/esm/i3s-attribute-loader.js +1 -1
  27. package/dist/esm/i3s-building-scene-layer-loader.js +1 -1
  28. package/dist/esm/i3s-content-loader.js +1 -1
  29. package/dist/esm/i3s-loader.js +1 -1
  30. package/dist/esm/i3s-node-page-loader.js +1 -1
  31. package/dist/esm/i3s-slpk-loader.js +1 -1
  32. package/dist/esm/index.js.map +1 -1
  33. package/dist/esm/lib/parsers/constants.js +14 -15
  34. package/dist/esm/lib/parsers/constants.js.map +1 -1
  35. package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js +49 -16
  36. package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
  37. package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js +35 -18
  38. package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
  39. package/dist/esm/lib/parsers/parse-zip/cd-file-header.js +14 -8
  40. package/dist/esm/lib/parsers/parse-zip/cd-file-header.js.map +1 -1
  41. package/dist/esm/lib/parsers/parse-zip/end-of-central-directory.js +33 -0
  42. package/dist/esm/lib/parsers/parse-zip/end-of-central-directory.js.map +1 -0
  43. package/dist/esm/lib/parsers/parse-zip/local-file-header.js +1 -1
  44. package/dist/esm/lib/parsers/parse-zip/local-file-header.js.map +1 -1
  45. package/dist/esm/lib/parsers/parse-zip/search-from-the-end.js.map +1 -0
  46. package/dist/esm/types.js +0 -12
  47. package/dist/esm/types.js.map +1 -1
  48. package/dist/i3s-content-worker-node.js +47 -47
  49. package/dist/i3s-content-worker-node.js.map +2 -2
  50. package/dist/i3s-content-worker.js +22 -34
  51. package/dist/index.d.ts +1 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/lib/parsers/constants.d.ts.map +1 -1
  54. package/dist/lib/parsers/constants.js +14 -15
  55. package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts +2 -1
  56. package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts.map +1 -1
  57. package/dist/lib/parsers/parse-slpk/parse-slpk.js +61 -15
  58. package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts +21 -10
  59. package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts.map +1 -1
  60. package/dist/lib/parsers/parse-slpk/slpk-archieve.js +53 -24
  61. package/dist/lib/parsers/parse-zip/cd-file-header.d.ts +5 -1
  62. package/dist/lib/parsers/parse-zip/cd-file-header.d.ts.map +1 -1
  63. package/dist/lib/parsers/parse-zip/cd-file-header.js +15 -9
  64. package/dist/lib/parsers/parse-zip/end-of-central-directory.d.ts +18 -0
  65. package/dist/lib/parsers/parse-zip/end-of-central-directory.d.ts.map +1 -0
  66. package/dist/lib/parsers/parse-zip/end-of-central-directory.js +41 -0
  67. package/dist/lib/parsers/parse-zip/local-file-header.d.ts +1 -1
  68. package/dist/lib/parsers/parse-zip/local-file-header.d.ts.map +1 -1
  69. package/dist/lib/parsers/parse-zip/local-file-header.js +1 -1
  70. package/dist/lib/parsers/parse-zip/search-from-the-end.d.ts.map +1 -0
  71. package/dist/types.d.ts +17 -24
  72. package/dist/types.d.ts.map +1 -1
  73. package/dist/types.js +1 -13
  74. package/package.json +9 -9
  75. package/src/index.ts +0 -1
  76. package/src/lib/parsers/constants.ts +14 -15
  77. package/src/lib/parsers/parse-slpk/parse-slpk.ts +79 -25
  78. package/src/lib/parsers/parse-slpk/slpk-archieve.ts +55 -37
  79. package/src/lib/parsers/parse-zip/cd-file-header.ts +27 -9
  80. package/src/lib/parsers/parse-zip/end-of-central-directory.ts +78 -0
  81. package/src/lib/parsers/parse-zip/local-file-header.ts +2 -2
  82. package/src/types.ts +25 -40
  83. package/dist/es5/lib/parsers/parse-slpk/search-from-the-end.js.map +0 -1
  84. package/dist/esm/lib/parsers/parse-slpk/search-from-the-end.js.map +0 -1
  85. package/dist/lib/parsers/parse-slpk/search-from-the-end.d.ts.map +0 -1
  86. /package/dist/es5/lib/parsers/{parse-slpk → parse-zip}/search-from-the-end.js +0 -0
  87. /package/dist/esm/lib/parsers/{parse-slpk → parse-zip}/search-from-the-end.js +0 -0
  88. /package/dist/lib/parsers/{parse-slpk → parse-zip}/search-from-the-end.d.ts +0 -0
  89. /package/dist/lib/parsers/{parse-slpk → parse-zip}/search-from-the-end.js +0 -0
  90. /package/src/lib/parsers/{parse-slpk → parse-zip}/search-from-the-end.ts +0 -0
@@ -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.15" : DEFAULT_VERSION;
58
+ var VERSION = true ? "4.0.0-alpha.16" : 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
  }
@@ -1234,7 +1234,7 @@
1234
1234
  var navigator_ = globalThis.navigator || {};
1235
1235
 
1236
1236
  // ../../node_modules/@probe.gl/log/node_modules/@probe.gl/env/dist/utils/globals.js
1237
- var VERSION3 = true ? "4.0.0-alpha.15" : "untranspiled source";
1237
+ var VERSION3 = true ? "4.0.0-alpha.16" : "untranspiled source";
1238
1238
  var isBrowser4 = isBrowser3();
1239
1239
 
1240
1240
  // ../../node_modules/@probe.gl/log/dist/utils/local-storage.js
@@ -4582,7 +4582,7 @@
4582
4582
  _defineProperty(Ellipsoid, "WGS84", new Ellipsoid(WGS84_RADIUS_X, WGS84_RADIUS_Y, WGS84_RADIUS_Z));
4583
4583
 
4584
4584
  // ../images/src/lib/utils/version.ts
4585
- var VERSION4 = true ? "4.0.0-alpha.15" : "latest";
4585
+ var VERSION4 = true ? "4.0.0-alpha.16" : "latest";
4586
4586
 
4587
4587
  // ../images/src/lib/category-api/image-type.ts
4588
4588
  var { _parseImageNode } = globalThis;
@@ -4979,7 +4979,7 @@
4979
4979
  };
4980
4980
 
4981
4981
  // ../draco/src/lib/utils/version.ts
4982
- var VERSION5 = true ? "4.0.0-alpha.15" : "latest";
4982
+ var VERSION5 = true ? "4.0.0-alpha.16" : "latest";
4983
4983
 
4984
4984
  // ../draco/src/draco-loader.ts
4985
4985
  var DEFAULT_DRACO_OPTIONS = {
@@ -5524,10 +5524,10 @@
5524
5524
  }
5525
5525
 
5526
5526
  // ../textures/src/lib/utils/version.ts
5527
- var VERSION6 = true ? "4.0.0-alpha.15" : "beta";
5527
+ var VERSION6 = true ? "4.0.0-alpha.16" : "beta";
5528
5528
 
5529
5529
  // ../textures/src/lib/parsers/basis-module-loader.ts
5530
- var VERSION7 = true ? "4.0.0-alpha.15" : "beta";
5530
+ var VERSION7 = true ? "4.0.0-alpha.16" : "beta";
5531
5531
  var BASIS_CDN_ENCODER_WASM = `https://unpkg.com/@loaders.gl/textures@${VERSION7}/dist/libs/basis_encoder.wasm`;
5532
5532
  var BASIS_CDN_ENCODER_JS = `https://unpkg.com/@loaders.gl/textures@${VERSION7}/dist/libs/basis_encoder.js`;
5533
5533
  var loadBasisTranscoderPromise;
@@ -6470,18 +6470,6 @@
6470
6470
  };
6471
6471
 
6472
6472
  // src/types.ts
6473
- var DATA_TYPE;
6474
- (function(DATA_TYPE2) {
6475
- DATA_TYPE2["UInt8"] = "UInt8";
6476
- DATA_TYPE2["UInt16"] = "UInt16";
6477
- DATA_TYPE2["UInt32"] = "UInt32";
6478
- DATA_TYPE2["UInt64"] = "UInt64";
6479
- DATA_TYPE2["Int16"] = "Int16";
6480
- DATA_TYPE2["Int32"] = "Int32";
6481
- DATA_TYPE2["Int64"] = "Int64";
6482
- DATA_TYPE2["Float32"] = "Float32";
6483
- DATA_TYPE2["Float64"] = "Float64";
6484
- })(DATA_TYPE || (DATA_TYPE = {}));
6485
6473
  var HeaderAttributeProperty;
6486
6474
  (function(HeaderAttributeProperty2) {
6487
6475
  HeaderAttributeProperty2["vertexCount"] = "vertexCount";
@@ -7114,15 +7102,15 @@
7114
7102
  // src/lib/parsers/constants.ts
7115
7103
  function getConstructorForDataFormat(dataType) {
7116
7104
  switch (dataType) {
7117
- case DATA_TYPE.UInt8:
7105
+ case "UInt8":
7118
7106
  return Uint8Array;
7119
- case DATA_TYPE.UInt16:
7107
+ case "UInt16":
7120
7108
  return Uint16Array;
7121
- case DATA_TYPE.UInt32:
7109
+ case "UInt32":
7122
7110
  return Uint32Array;
7123
- case DATA_TYPE.Float32:
7111
+ case "Float32":
7124
7112
  return Float32Array;
7125
- case DATA_TYPE.UInt64:
7113
+ case "UInt64":
7126
7114
  return Float64Array;
7127
7115
  default:
7128
7116
  throw new Error(`parse i3s tile content: unknown type of data: ${dataType}`);
@@ -7137,18 +7125,18 @@
7137
7125
  };
7138
7126
  function sizeOf(dataType) {
7139
7127
  switch (dataType) {
7140
- case DATA_TYPE.UInt8:
7128
+ case "UInt8":
7141
7129
  return 1;
7142
- case DATA_TYPE.UInt16:
7143
- case DATA_TYPE.Int16:
7130
+ case "UInt16":
7131
+ case "Int16":
7144
7132
  return 2;
7145
- case DATA_TYPE.UInt32:
7146
- case DATA_TYPE.Int32:
7147
- case DATA_TYPE.Float32:
7133
+ case "UInt32":
7134
+ case "Int32":
7135
+ case "Float32":
7148
7136
  return 4;
7149
- case DATA_TYPE.UInt64:
7150
- case DATA_TYPE.Int64:
7151
- case DATA_TYPE.Float64:
7137
+ case "UInt64":
7138
+ case "Int64":
7139
+ case "Float64":
7152
7140
  return 8;
7153
7141
  default:
7154
7142
  throw new Error(`parse i3s tile content: unknown size of data: ${dataType}`);
@@ -7225,7 +7213,7 @@
7225
7213
  }
7226
7214
 
7227
7215
  // src/i3s-attribute-loader.ts
7228
- var VERSION8 = true ? "4.0.0-alpha.15" : "latest";
7216
+ var VERSION8 = true ? "4.0.0-alpha.16" : "latest";
7229
7217
  var I3SAttributeLoader = {
7230
7218
  name: "I3S Attribute",
7231
7219
  id: "i3s-attribute",
@@ -7688,7 +7676,7 @@
7688
7676
  }
7689
7677
 
7690
7678
  // src/i3s-content-loader.ts
7691
- var VERSION9 = true ? "4.0.0-alpha.15" : "beta";
7679
+ var VERSION9 = true ? "4.0.0-alpha.16" : "beta";
7692
7680
  var I3SContentLoader = {
7693
7681
  name: "I3S Content (Indexed Scene Layers)",
7694
7682
  id: "i3s-content",
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
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, TextureSetDefinitionFormats } from './types';
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, OperationalLayer, TextureSetDefinitionFormats } from './types';
2
2
  export type { FileProvider } from './lib/parsers/parse-zip/file-provider';
3
3
  export { COORDINATE_SYSTEM } from './lib/parsers/constants';
4
4
  export { I3SLoader } from './i3s-loader';
@@ -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,EAChB,2BAA2B,EAC5B,MAAM,SAAS,CAAC;AACjB,YAAY,EAAC,YAAY,EAAC,MAAM,uCAAuC,CAAC;AAExE,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;AAC9D,OAAO,EAAC,uBAAuB,EAAC,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAC,SAAS,EAAC,MAAM,qCAAqC,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,gBAAgB,EAChB,2BAA2B,EAC5B,MAAM,SAAS,CAAC;AACjB,YAAY,EAAC,YAAY,EAAC,MAAM,uCAAuC,CAAC;AAExE,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;AAC9D,OAAO,EAAC,uBAAuB,EAAC,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAC,SAAS,EAAC,MAAM,qCAAqC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/constants.ts"],"names":[],"mappings":"AAGA,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,+HAe3D;AAED,eAAO,MAAM,WAAW,EAAE;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAM/C,CAAC;AACF;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkB/C;AAED,eAAO,MAAM,qBAAqB,WAAW,CAAC;AAC9C,eAAO,MAAM,wBAAwB,UAAU,CAAC;AAChD,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,qBAAqB,UAAU,CAAC;AAI7C,oBAAY,iBAAiB;IAC3B;;OAEG;IACH,OAAO,KAAK;IACZ;;;OAGG;IACH,MAAM,IAAI;IACV;;OAEG;IACH,aAAa,IAAI;IACjB;;;;OAIG;IACH,cAAc,IAAI;IAClB;;OAEG;IACH,SAAS,IAAI;CACd"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/constants.ts"],"names":[],"mappings":"AAEA,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,+HAe3D;AAED,eAAO,MAAM,WAAW,EAAE;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CAM/C,CAAC;AACF;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkB/C;AAED,eAAO,MAAM,qBAAqB,WAAW,CAAC;AAC9C,eAAO,MAAM,wBAAwB,UAAU,CAAC;AAChD,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,qBAAqB,UAAU,CAAC;AAI7C,oBAAY,iBAAiB;IAC3B;;OAEG;IACH,OAAO,KAAK;IACZ;;;OAGG;IACH,MAAM,IAAI;IACV;;OAEG;IACH,aAAa,IAAI;IACjB;;;;OAIG;IACH,cAAc,IAAI;IAClB;;OAEG;IACH,SAAS,IAAI;CACd"}
@@ -5,18 +5,17 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.COORDINATE_SYSTEM = exports.INT_16_ATTRIBUTE_TYPE = exports.FLOAT_64_TYPE = exports.OBJECT_ID_ATTRIBUTE_TYPE = exports.STRING_ATTRIBUTE_TYPE = exports.sizeOf = exports.GL_TYPE_MAP = exports.getConstructorForDataFormat = void 0;
7
7
  const constants_1 = __importDefault(require("@luma.gl/constants"));
8
- const types_1 = require("../../types");
9
8
  function getConstructorForDataFormat(dataType) {
10
9
  switch (dataType) {
11
- case types_1.DATA_TYPE.UInt8:
10
+ case 'UInt8':
12
11
  return Uint8Array;
13
- case types_1.DATA_TYPE.UInt16:
12
+ case 'UInt16':
14
13
  return Uint16Array;
15
- case types_1.DATA_TYPE.UInt32:
14
+ case 'UInt32':
16
15
  return Uint32Array;
17
- case types_1.DATA_TYPE.Float32:
16
+ case 'Float32':
18
17
  return Float32Array;
19
- case types_1.DATA_TYPE.UInt64:
18
+ case 'UInt64':
20
19
  return Float64Array;
21
20
  default:
22
21
  throw new Error(`parse i3s tile content: unknown type of data: ${dataType}`);
@@ -37,18 +36,18 @@ exports.GL_TYPE_MAP = {
37
36
  */
38
37
  function sizeOf(dataType) {
39
38
  switch (dataType) {
40
- case types_1.DATA_TYPE.UInt8:
39
+ case 'UInt8':
41
40
  return 1;
42
- case types_1.DATA_TYPE.UInt16:
43
- case types_1.DATA_TYPE.Int16:
41
+ case 'UInt16':
42
+ case 'Int16':
44
43
  return 2;
45
- case types_1.DATA_TYPE.UInt32:
46
- case types_1.DATA_TYPE.Int32:
47
- case types_1.DATA_TYPE.Float32:
44
+ case 'UInt32':
45
+ case 'Int32':
46
+ case 'Float32':
48
47
  return 4;
49
- case types_1.DATA_TYPE.UInt64:
50
- case types_1.DATA_TYPE.Int64:
51
- case types_1.DATA_TYPE.Float64:
48
+ case 'UInt64':
49
+ case 'Int64':
50
+ case 'Float64':
52
51
  return 8;
53
52
  default:
54
53
  throw new Error(`parse i3s tile content: unknown size of data: ${dataType}`);
@@ -3,7 +3,8 @@ import { SLPKArchive } from './slpk-archieve';
3
3
  /**
4
4
  * Creates slpk file handler from raw file
5
5
  * @param fileProvider raw file data
6
+ * @param cb is called with information message during parsing
6
7
  * @returns slpk file handler
7
8
  */
8
- export declare const parseSLPK: (fileProvider: FileProvider) => Promise<SLPKArchive>;
9
+ export declare const parseSLPK: (fileProvider: FileProvider, cb?: ((msg: string) => void) | undefined) => Promise<SLPKArchive>;
9
10
  //# sourceMappingURL=parse-slpk.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-slpk.d.ts","sourceRoot":"","sources":["../../../../src/lib/parsers/parse-slpk/parse-slpk.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAGxD,OAAO,EAAC,WAAW,EAAC,MAAM,iBAAiB,CAAC;AAE5C;;;;GAIG;AAEH,eAAO,MAAM,SAAS,iBAAwB,YAAY,KAAG,QAAQ,WAAW,CA8B/E,CAAC"}
1
+ {"version":3,"file":"parse-slpk.d.ts","sourceRoot":"","sources":["../../../../src/lib/parsers/parse-slpk/parse-slpk.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAGxD,OAAO,EAAc,WAAW,EAAgB,MAAM,iBAAiB,CAAC;AAExE;;;;;GAKG;AACH,eAAO,MAAM,SAAS,iBACN,YAAY,cACf,MAAM,KAAK,IAAI,kBACzB,QAAQ,WAAW,CA8BrB,CAAC"}
@@ -1,31 +1,77 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.parseSLPK = void 0;
7
+ const md5_1 = __importDefault(require("md5"));
4
8
  const cd_file_header_1 = require("../parse-zip/cd-file-header");
9
+ const end_of_central_directory_1 = require("../parse-zip/end-of-central-directory");
5
10
  const local_file_header_1 = require("../parse-zip/local-file-header");
6
- const search_from_the_end_1 = require("./search-from-the-end");
11
+ const search_from_the_end_1 = require("../parse-zip/search-from-the-end");
7
12
  const slpk_archieve_1 = require("./slpk-archieve");
8
13
  /**
9
14
  * Creates slpk file handler from raw file
10
15
  * @param fileProvider raw file data
16
+ * @param cb is called with information message during parsing
11
17
  * @returns slpk file handler
12
18
  */
13
- const parseSLPK = async (fileProvider) => {
14
- const cdFileHeaderSignature = [0x50, 0x4b, 0x01, 0x02];
15
- const hashCDOffset = await (0, search_from_the_end_1.searchFromTheEnd)(fileProvider, cdFileHeaderSignature);
19
+ const parseSLPK = async (fileProvider, cb) => {
20
+ const hashCDOffset = await (0, search_from_the_end_1.searchFromTheEnd)(fileProvider, cd_file_header_1.signature);
16
21
  const cdFileHeader = await (0, cd_file_header_1.parseZipCDFileHeader)(hashCDOffset, fileProvider);
17
- if (cdFileHeader.fileName !== '@specialIndexFileHASH128@') {
18
- throw new Error('No hash file in slpk');
19
- }
20
- const localFileHeader = await (0, local_file_header_1.parseZipLocalFileHeader)(cdFileHeader.localHeaderOffset, fileProvider);
21
- if (!localFileHeader) {
22
- throw new Error('No hash file in slpk');
22
+ let hashData;
23
+ if (cdFileHeader?.fileName !== '@specialIndexFileHASH128@') {
24
+ cb?.('SLPK doesnt contain hash file');
25
+ hashData = await generateHashInfo(fileProvider);
26
+ cb?.('hash info has been composed according to central directory records');
23
27
  }
24
- const fileDataOffset = localFileHeader.fileDataOffset;
25
- const hashFile = await fileProvider.slice(fileDataOffset, fileDataOffset + localFileHeader.compressedSize);
26
- if (!hashFile) {
27
- throw new Error('No hash file in slpk');
28
+ else {
29
+ cb?.('SLPK contains hash file');
30
+ const localFileHeader = await (0, local_file_header_1.parseZipLocalFileHeader)(cdFileHeader.localHeaderOffset, fileProvider);
31
+ if (!localFileHeader) {
32
+ throw new Error('corrupted SLPK');
33
+ }
34
+ const fileDataOffset = localFileHeader.fileDataOffset;
35
+ const hashFile = await fileProvider.slice(fileDataOffset, fileDataOffset + localFileHeader.compressedSize);
36
+ hashData = parseHashFile(hashFile);
28
37
  }
29
- return new slpk_archieve_1.SLPKArchive(fileProvider, hashFile);
38
+ return new slpk_archieve_1.SLPKArchive(fileProvider, hashData);
30
39
  };
31
40
  exports.parseSLPK = parseSLPK;
41
+ /**
42
+ * generates hash info from central directory
43
+ * @param fileProvider - provider of the archive
44
+ * @returns ready to use hash info
45
+ */
46
+ const generateHashInfo = async (fileProvider) => {
47
+ const { cdStartOffset } = await (0, end_of_central_directory_1.parseEoCDRecord)(fileProvider);
48
+ let cdHeader = await (0, cd_file_header_1.parseZipCDFileHeader)(cdStartOffset, fileProvider);
49
+ const hashInfo = [];
50
+ while (cdHeader) {
51
+ hashInfo.push({
52
+ hash: Buffer.from((0, md5_1.default)(cdHeader.fileName.split('\\').join('/').toLocaleLowerCase()), 'hex'),
53
+ offset: cdHeader.localHeaderOffset
54
+ });
55
+ cdHeader = await (0, cd_file_header_1.parseZipCDFileHeader)(cdHeader.extraOffset + BigInt(cdHeader.extraFieldLength), fileProvider);
56
+ }
57
+ hashInfo.sort((a, b) => (0, slpk_archieve_1.compareHashes)(a.hash, b.hash));
58
+ return hashInfo;
59
+ };
60
+ /**
61
+ * Reads hash file from buffer and returns it in ready-to-use form
62
+ * @param hashFile - bufer containing hash file
63
+ * @returns Array containing file info
64
+ */
65
+ const parseHashFile = (hashFile) => {
66
+ const hashFileBuffer = Buffer.from(hashFile);
67
+ const hashArray = [];
68
+ for (let i = 0; i < hashFileBuffer.buffer.byteLength; i = i + 24) {
69
+ const offsetBuffer = new DataView(hashFileBuffer.buffer.slice(hashFileBuffer.byteOffset + i + 16, hashFileBuffer.byteOffset + i + 24));
70
+ const offset = offsetBuffer.getBigUint64(offsetBuffer.byteOffset, true);
71
+ hashArray.push({
72
+ hash: Buffer.from(hashFileBuffer.subarray(hashFileBuffer.byteOffset + i, hashFileBuffer.byteOffset + i + 16)),
73
+ offset
74
+ });
75
+ }
76
+ return hashArray;
77
+ };
@@ -1,21 +1,32 @@
1
1
  /// <reference types="node" />
2
2
  import { FileProvider } from '../parse-zip/file-provider';
3
+ /** Element of hash array */
4
+ export type HashElement = {
5
+ /** File name hash */
6
+ hash: Buffer;
7
+ /** File offset in the archive */
8
+ offset: bigint;
9
+ };
10
+ /**
11
+ * Comparing md5 hashes according to https://github.com/Esri/i3s-spec/blob/master/docs/2.0/slpk_hashtable.pcsl.md step 5
12
+ * @param hash1 hash to compare
13
+ * @param hash2 hash to compare
14
+ * @returns -1 if hash1 < hash2, 0 of hash1 === hash2, 1 if hash1 > hash2
15
+ */
16
+ export declare const compareHashes: (hash1: Buffer, hash2: Buffer) => number;
3
17
  /**
4
18
  * Class for handling information about slpk file
5
19
  */
6
20
  export declare class SLPKArchive {
7
- slpkArchive: FileProvider;
8
- hashArray: {
9
- hash: Buffer;
10
- offset: bigint;
11
- }[];
12
- constructor(slpkArchive: FileProvider, hashFile: ArrayBuffer);
21
+ private slpkArchive;
22
+ private hashArray;
23
+ constructor(slpkArchive: FileProvider, hashFile: HashElement[]);
13
24
  /**
14
- * Reads hash file from buffer and returns it in ready-to-use form
15
- * @param hashFile - bufer containing hash file
16
- * @returns Array containing file info
25
+ * Binary search in the hash info
26
+ * @param hashToSearch hash that we need to find
27
+ * @returns required hash element or undefined if not found
17
28
  */
18
- private parseHashFile;
29
+ private findBin;
19
30
  /**
20
31
  * Returns file with the given path from slpk archive
21
32
  * @param path - path inside the slpk
@@ -1 +1 @@
1
- {"version":3,"file":"slpk-archieve.d.ts","sourceRoot":"","sources":["../../../../src/lib/parsers/parse-slpk/slpk-archieve.ts"],"names":[],"mappings":";AAGA,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAkDxD;;GAEG;AACH,qBAAa,WAAW;IACtB,WAAW,EAAE,YAAY,CAAC;IAC1B,SAAS,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,EAAE,CAAC;gBAChC,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW;IAK5D;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAqBrB;;;;;OAKG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,KAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IA8B1E;;;;OAIG;YACW,aAAa;IAc3B;;;;OAIG;YACW,YAAY;CAmB3B"}
1
+ {"version":3,"file":"slpk-archieve.d.ts","sourceRoot":"","sources":["../../../../src/lib/parsers/parse-slpk/slpk-archieve.ts"],"names":[],"mappings":";AAGA,OAAO,EAAC,YAAY,EAAC,MAAM,4BAA4B,CAAC;AAExD,4BAA4B;AAC5B,MAAM,MAAM,WAAW,GAAG;IACxB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,UAAW,MAAM,SAAS,MAAM,KAAG,MAY5D,CAAC;AAsCF;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,SAAS,CAAgB;gBACrB,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE;IAK9D;;;;OAIG;IACH,OAAO,CAAC,OAAO,CAgBb;IAEF;;;;;OAKG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,KAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IA8B1E;;;;OAIG;YACW,aAAa;IAmB3B;;;;OAIG;YACW,YAAY;CAmB3B"}
@@ -3,10 +3,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.SLPKArchive = void 0;
6
+ exports.SLPKArchive = exports.compareHashes = void 0;
7
7
  const md5_1 = __importDefault(require("md5"));
8
8
  const local_file_header_1 = require("../parse-zip/local-file-header");
9
9
  const compression_1 = require("@loaders.gl/compression");
10
+ /**
11
+ * Comparing md5 hashes according to https://github.com/Esri/i3s-spec/blob/master/docs/2.0/slpk_hashtable.pcsl.md step 5
12
+ * @param hash1 hash to compare
13
+ * @param hash2 hash to compare
14
+ * @returns -1 if hash1 < hash2, 0 of hash1 === hash2, 1 if hash1 > hash2
15
+ */
16
+ const compareHashes = (hash1, hash2) => {
17
+ const h1 = new BigUint64Array(hash1.buffer, hash1.byteOffset, 2);
18
+ const h2 = new BigUint64Array(hash2.buffer, hash2.byteOffset, 2);
19
+ const diff = h1[0] === h2[0] ? h1[1] - h2[1] : h1[0] - h2[0];
20
+ if (diff < 0n) {
21
+ return -1;
22
+ }
23
+ else if (diff === 0n) {
24
+ return 0;
25
+ }
26
+ return 1;
27
+ };
28
+ exports.compareHashes = compareHashes;
10
29
  /** Description of real paths for different file types */
11
30
  const PATH_DESCRIPTIONS = [
12
31
  {
@@ -18,7 +37,7 @@ const PATH_DESCRIPTIONS = [
18
37
  extensions: ['.json.gz']
19
38
  },
20
39
  {
21
- test: /^nodes\/\d+$/,
40
+ test: /^nodes\/(\d+|root)$/,
22
41
  extensions: ['/3dNodeIndexDocument.json.gz']
23
42
  },
24
43
  {
@@ -47,26 +66,31 @@ const PATH_DESCRIPTIONS = [
47
66
  */
48
67
  class SLPKArchive {
49
68
  constructor(slpkArchive, hashFile) {
69
+ /**
70
+ * Binary search in the hash info
71
+ * @param hashToSearch hash that we need to find
72
+ * @returns required hash element or undefined if not found
73
+ */
74
+ this.findBin = (hashToSearch) => {
75
+ let lowerBorder = 0;
76
+ let upperBorder = this.hashArray.length;
77
+ while (upperBorder - lowerBorder > 1) {
78
+ const middle = lowerBorder + Math.floor((upperBorder - lowerBorder) / 2);
79
+ const value = (0, exports.compareHashes)(this.hashArray[middle].hash, hashToSearch);
80
+ if (value === 0) {
81
+ return this.hashArray[middle];
82
+ }
83
+ else if (value < 0) {
84
+ lowerBorder = middle;
85
+ }
86
+ else {
87
+ upperBorder = middle;
88
+ }
89
+ }
90
+ return undefined;
91
+ };
50
92
  this.slpkArchive = slpkArchive;
51
- this.hashArray = this.parseHashFile(hashFile);
52
- }
53
- /**
54
- * Reads hash file from buffer and returns it in ready-to-use form
55
- * @param hashFile - bufer containing hash file
56
- * @returns Array containing file info
57
- */
58
- parseHashFile(hashFile) {
59
- const hashFileBuffer = Buffer.from(hashFile);
60
- const hashArray = [];
61
- for (let i = 0; i < hashFileBuffer.buffer.byteLength; i = i + 24) {
62
- const offsetBuffer = new DataView(hashFileBuffer.buffer.slice(hashFileBuffer.byteOffset + i + 16, hashFileBuffer.byteOffset + i + 24));
63
- const offset = offsetBuffer.getBigUint64(offsetBuffer.byteOffset, true);
64
- hashArray.push({
65
- hash: Buffer.from(hashFileBuffer.subarray(hashFileBuffer.byteOffset + i, hashFileBuffer.byteOffset + i + 16)),
66
- offset
67
- });
68
- }
69
- return hashArray;
93
+ this.hashArray = hashFile;
70
94
  }
71
95
  /**
72
96
  * Returns file with the given path from slpk archive
@@ -108,7 +132,12 @@ class SLPKArchive {
108
132
  * @returns buffer with the file data
109
133
  */
110
134
  async getDataByPath(path) {
111
- const data = await this.getFileBytes(path);
135
+ // sometimes paths are not in lower case when hash file is created,
136
+ // so first we're looking for lower case file name and then for original one
137
+ let data = await this.getFileBytes(path.toLocaleLowerCase());
138
+ if (!data) {
139
+ data = await this.getFileBytes(path);
140
+ }
112
141
  if (!data) {
113
142
  return undefined;
114
143
  }
@@ -126,11 +155,11 @@ class SLPKArchive {
126
155
  */
127
156
  async getFileBytes(path) {
128
157
  const nameHash = Buffer.from((0, md5_1.default)(path), 'hex');
129
- const fileInfo = this.hashArray.find((val) => Buffer.compare(val.hash, nameHash) === 0);
158
+ const fileInfo = this.findBin(nameHash); // implement binary search
130
159
  if (!fileInfo) {
131
160
  return undefined;
132
161
  }
133
- const localFileHeader = await (0, local_file_header_1.parseZipLocalFileHeader)(fileInfo?.offset, this.slpkArchive);
162
+ const localFileHeader = await (0, local_file_header_1.parseZipLocalFileHeader)(fileInfo.offset, this.slpkArchive);
134
163
  if (!localFileHeader) {
135
164
  return undefined;
136
165
  }
@@ -1,4 +1,5 @@
1
1
  import { FileProvider } from './file-provider';
2
+ import { ZipSignature } from './search-from-the-end';
2
3
  /**
3
4
  * zip central directory file header info
4
5
  * according to https://en.wikipedia.org/wiki/ZIP_(file_format)
@@ -8,6 +9,8 @@ export type ZipCDFileHeader = {
8
9
  compressedSize: bigint;
9
10
  /** Uncompressed size */
10
11
  uncompressedSize: bigint;
12
+ /** Extra field size */
13
+ extraFieldLength: number;
11
14
  /** File name length */
12
15
  fileNameLength: number;
13
16
  /** File name */
@@ -17,11 +20,12 @@ export type ZipCDFileHeader = {
17
20
  /** Relative offset of local file header */
18
21
  localHeaderOffset: bigint;
19
22
  };
23
+ export declare const signature: ZipSignature;
20
24
  /**
21
25
  * Parses central directory file header of zip file
22
26
  * @param headerOffset - offset in the archive where header starts
23
27
  * @param buffer - buffer containing whole array
24
28
  * @returns Info from the header
25
29
  */
26
- export declare const parseZipCDFileHeader: (headerOffset: bigint, buffer: FileProvider) => Promise<ZipCDFileHeader>;
30
+ export declare const parseZipCDFileHeader: (headerOffset: bigint, buffer: FileProvider) => Promise<ZipCDFileHeader | null>;
27
31
  //# sourceMappingURL=cd-file-header.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cd-file-header.d.ts","sourceRoot":"","sources":["../../../../src/lib/parsers/parse-zip/cd-file-header.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAE7C;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,sBAAsB;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,iBACjB,MAAM,UACZ,YAAY,KACnB,QAAQ,eAAe,CAyDzB,CAAC"}
1
+ {"version":3,"file":"cd-file-header.d.ts","sourceRoot":"","sources":["../../../../src/lib/parsers/parse-zip/cd-file-header.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAC;AAEnD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,sBAAsB;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAWF,eAAO,MAAM,SAAS,EAAE,YAAuC,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,iBACjB,MAAM,UACZ,YAAY,KACnB,QAAQ,eAAe,GAAG,IAAI,CA6DhC,CAAC"}
@@ -1,6 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseZipCDFileHeader = void 0;
3
+ exports.parseZipCDFileHeader = exports.signature = void 0;
4
+ const offsets = {
5
+ CD_COMPRESSED_SIZE_OFFSET: 20n,
6
+ CD_UNCOMPRESSED_SIZE_OFFSET: 24n,
7
+ CD_FILE_NAME_LENGTH_OFFSET: 28n,
8
+ CD_EXTRA_FIELD_LENGTH_OFFSET: 30n,
9
+ CD_LOCAL_HEADER_OFFSET_OFFSET: 42n,
10
+ CD_FILE_NAME_OFFSET: 46n
11
+ };
12
+ exports.signature = [0x50, 0x4b, 0x01, 0x02];
4
13
  /**
5
14
  * Parses central directory file header of zip file
6
15
  * @param headerOffset - offset in the archive where header starts
@@ -8,16 +17,12 @@ exports.parseZipCDFileHeader = void 0;
8
17
  * @returns Info from the header
9
18
  */
10
19
  const parseZipCDFileHeader = async (headerOffset, buffer) => {
11
- const offsets = {
12
- CD_COMPRESSED_SIZE_OFFSET: 20n,
13
- CD_UNCOMPRESSED_SIZE_OFFSET: 24n,
14
- CD_FILE_NAME_LENGTH_OFFSET: 28n,
15
- CD_EXTRA_FIELD_LENGTH_OFFSET: 30n,
16
- CD_LOCAL_HEADER_OFFSET_OFFSET: 42n,
17
- CD_FILE_NAME_OFFSET: 46n
18
- };
20
+ if (Buffer.from(await buffer.slice(headerOffset, headerOffset + 4n)).compare(Buffer.from(exports.signature)) !== 0) {
21
+ return null;
22
+ }
19
23
  let compressedSize = BigInt(await buffer.getUint32(headerOffset + offsets.CD_COMPRESSED_SIZE_OFFSET));
20
24
  let uncompressedSize = BigInt(await buffer.getUint32(headerOffset + offsets.CD_UNCOMPRESSED_SIZE_OFFSET));
25
+ const extraFieldLength = await buffer.getUint16(headerOffset + offsets.CD_EXTRA_FIELD_LENGTH_OFFSET);
21
26
  const fileNameLength = await buffer.getUint16(headerOffset + offsets.CD_FILE_NAME_LENGTH_OFFSET);
22
27
  const fileName = new TextDecoder().decode(await buffer.slice(headerOffset + offsets.CD_FILE_NAME_OFFSET, headerOffset + offsets.CD_FILE_NAME_OFFSET + BigInt(fileNameLength)));
23
28
  const extraOffset = headerOffset + offsets.CD_FILE_NAME_OFFSET + BigInt(fileNameLength);
@@ -40,6 +45,7 @@ const parseZipCDFileHeader = async (headerOffset, buffer) => {
40
45
  return {
41
46
  compressedSize,
42
47
  uncompressedSize,
48
+ extraFieldLength,
43
49
  fileNameLength,
44
50
  fileName,
45
51
  extraOffset,
@@ -0,0 +1,18 @@
1
+ import { FileProvider } from './file-provider';
2
+ /**
3
+ * End of central directory info
4
+ * according to https://en.wikipedia.org/wiki/ZIP_(file_format)
5
+ */
6
+ export type ZipEoCDRecord = {
7
+ /** Relative offset of local file header */
8
+ cdStartOffset: bigint;
9
+ /** Relative offset of local file header */
10
+ cdRecordsNumber: bigint;
11
+ };
12
+ /**
13
+ * Parses end of central directory record of zip file
14
+ * @param fileProvider - FileProvider instance
15
+ * @returns Info from the header
16
+ */
17
+ export declare const parseEoCDRecord: (fileProvider: FileProvider) => Promise<ZipEoCDRecord>;
18
+ //# sourceMappingURL=end-of-central-directory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"end-of-central-directory.d.ts","sourceRoot":"","sources":["../../../../src/lib/parsers/parse-zip/end-of-central-directory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAG7C;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,2CAA2C;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAgBF;;;;GAIG;AACH,eAAO,MAAM,eAAe,iBAAwB,YAAY,KAAG,QAAQ,aAAa,CA4CvF,CAAC"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseEoCDRecord = void 0;
4
+ const search_from_the_end_1 = require("./search-from-the-end");
5
+ const eoCDSignature = [0x50, 0x4b, 0x05, 0x06];
6
+ const zip64EoCDLocatorSignature = Buffer.from([0x50, 0x4b, 0x06, 0x07]);
7
+ const zip64EoCDSignature = Buffer.from([0x50, 0x4b, 0x06, 0x06]);
8
+ const offsets = {
9
+ CD_RECORDS_NUMBER_OFFSET: 8n,
10
+ CD_START_OFFSET_OFFSET: 16n,
11
+ ZIP64_EOCD_START_OFFSET_OFFSET: 8n,
12
+ ZIP64_CD_RECORDS_NUMBER_OFFSET: 24n,
13
+ ZIP64_CD_START_OFFSET_OFFSET: 48n
14
+ };
15
+ /**
16
+ * Parses end of central directory record of zip file
17
+ * @param fileProvider - FileProvider instance
18
+ * @returns Info from the header
19
+ */
20
+ const parseEoCDRecord = async (fileProvider) => {
21
+ const zipEoCDOffset = await (0, search_from_the_end_1.searchFromTheEnd)(fileProvider, eoCDSignature);
22
+ let cdRecordsNumber = BigInt(await fileProvider.getUint16(zipEoCDOffset + offsets.CD_RECORDS_NUMBER_OFFSET));
23
+ let cdStartOffset = BigInt(await fileProvider.getUint32(zipEoCDOffset + offsets.CD_START_OFFSET_OFFSET));
24
+ if (cdStartOffset === BigInt(0xffffffff) || cdRecordsNumber === BigInt(0xffffffff)) {
25
+ const zip64EoCDLocatorOffset = zipEoCDOffset - 20n;
26
+ if (Buffer.from(await fileProvider.slice(zip64EoCDLocatorOffset, zip64EoCDLocatorOffset + 4n)).compare(zip64EoCDLocatorSignature) !== 0) {
27
+ throw new Error('zip64 EoCD locator not found');
28
+ }
29
+ const zip64EoCDOffset = await fileProvider.getBigUint64(zip64EoCDLocatorOffset + offsets.ZIP64_EOCD_START_OFFSET_OFFSET);
30
+ if (Buffer.from(await fileProvider.slice(zip64EoCDOffset, zip64EoCDOffset + 4n)).compare(zip64EoCDSignature) !== 0) {
31
+ throw new Error('zip64 EoCD not found');
32
+ }
33
+ cdRecordsNumber = await fileProvider.getBigUint64(zip64EoCDOffset + offsets.ZIP64_CD_RECORDS_NUMBER_OFFSET);
34
+ cdStartOffset = await fileProvider.getBigUint64(zip64EoCDOffset + offsets.ZIP64_CD_START_OFFSET_OFFSET);
35
+ }
36
+ return {
37
+ cdRecordsNumber,
38
+ cdStartOffset
39
+ };
40
+ };
41
+ exports.parseEoCDRecord = parseEoCDRecord;
@@ -23,5 +23,5 @@ export declare const signature: Buffer;
23
23
  * @param buffer - buffer containing whole array
24
24
  * @returns Info from the header
25
25
  */
26
- export declare const parseZipLocalFileHeader: (headerOffset: bigint, buffer: FileProvider) => Promise<ZipLocalFileHeader | undefined>;
26
+ export declare const parseZipLocalFileHeader: (headerOffset: bigint, buffer: FileProvider) => Promise<ZipLocalFileHeader | null>;
27
27
  //# sourceMappingURL=local-file-header.d.ts.map