@loaders.gl/i3s 4.0.0-alpha.14 → 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.
- package/dist/dist.min.js +329 -211
- package/dist/es5/arcgis-webscene-loader.js +1 -1
- package/dist/es5/i3s-attribute-loader.js +1 -1
- package/dist/es5/i3s-building-scene-layer-loader.js +1 -1
- package/dist/es5/i3s-content-loader.js +1 -1
- package/dist/es5/i3s-loader.js +1 -1
- package/dist/es5/i3s-node-page-loader.js +1 -1
- package/dist/es5/i3s-slpk-loader.js +30 -2
- package/dist/es5/i3s-slpk-loader.js.map +1 -1
- package/dist/es5/index.js +7 -7
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/parsers/constants.js +14 -15
- package/dist/es5/lib/parsers/constants.js.map +1 -1
- package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js +101 -76
- package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
- package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js +54 -34
- package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
- package/dist/es5/lib/parsers/parse-zip/cd-file-header.js +76 -39
- package/dist/es5/lib/parsers/parse-zip/cd-file-header.js.map +1 -1
- package/dist/es5/lib/parsers/parse-zip/data-view-file-provider.js +129 -0
- package/dist/es5/lib/parsers/parse-zip/data-view-file-provider.js.map +1 -0
- package/dist/es5/lib/parsers/parse-zip/end-of-central-directory.js +100 -0
- package/dist/es5/lib/parsers/parse-zip/end-of-central-directory.js.map +1 -0
- package/dist/es5/lib/parsers/parse-zip/file-provider.js.map +1 -1
- package/dist/es5/lib/parsers/parse-zip/local-file-header.js +55 -14
- package/dist/es5/lib/parsers/parse-zip/local-file-header.js.map +1 -1
- package/dist/es5/lib/parsers/parse-zip/search-from-the-end.js +69 -0
- package/dist/es5/lib/parsers/parse-zip/search-from-the-end.js.map +1 -0
- package/dist/es5/types.js +1 -14
- package/dist/es5/types.js.map +1 -1
- package/dist/esm/arcgis-webscene-loader.js +1 -1
- package/dist/esm/i3s-attribute-loader.js +1 -1
- package/dist/esm/i3s-building-scene-layer-loader.js +1 -1
- package/dist/esm/i3s-content-loader.js +1 -1
- package/dist/esm/i3s-loader.js +1 -1
- package/dist/esm/i3s-node-page-loader.js +1 -1
- package/dist/esm/i3s-slpk-loader.js +8 -2
- package/dist/esm/i3s-slpk-loader.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/parsers/constants.js +14 -15
- package/dist/esm/lib/parsers/constants.js.map +1 -1
- package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js +50 -35
- package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
- package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js +38 -22
- package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
- package/dist/esm/lib/parsers/parse-zip/cd-file-header.js +30 -22
- package/dist/esm/lib/parsers/parse-zip/cd-file-header.js.map +1 -1
- package/dist/esm/lib/parsers/parse-zip/data-view-file-provider.js +32 -0
- package/dist/esm/lib/parsers/parse-zip/data-view-file-provider.js.map +1 -0
- package/dist/esm/lib/parsers/parse-zip/end-of-central-directory.js +33 -0
- package/dist/esm/lib/parsers/parse-zip/end-of-central-directory.js.map +1 -0
- package/dist/esm/lib/parsers/parse-zip/file-provider.js.map +1 -1
- package/dist/esm/lib/parsers/parse-zip/local-file-header.js +25 -10
- package/dist/esm/lib/parsers/parse-zip/local-file-header.js.map +1 -1
- package/dist/esm/lib/parsers/parse-zip/search-from-the-end.js +16 -0
- package/dist/esm/lib/parsers/parse-zip/search-from-the-end.js.map +1 -0
- package/dist/esm/types.js +0 -12
- package/dist/esm/types.js.map +1 -1
- package/dist/i3s-content-worker-node.js +47 -47
- package/dist/i3s-content-worker-node.js.map +2 -2
- package/dist/i3s-content-worker.js +22 -34
- package/dist/i3s-slpk-loader.d.ts +3 -0
- package/dist/i3s-slpk-loader.d.ts.map +1 -1
- package/dist/i3s-slpk-loader.js +11 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/lib/parsers/constants.d.ts.map +1 -1
- package/dist/lib/parsers/constants.js +14 -15
- package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts +9 -3
- package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts.map +1 -1
- package/dist/lib/parsers/parse-slpk/parse-slpk.js +65 -42
- package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts +22 -10
- package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts.map +1 -1
- package/dist/lib/parsers/parse-slpk/slpk-archieve.js +56 -28
- package/dist/lib/parsers/parse-zip/cd-file-header.d.ts +9 -5
- package/dist/lib/parsers/parse-zip/cd-file-header.d.ts.map +1 -1
- package/dist/lib/parsers/parse-zip/cd-file-header.js +32 -25
- package/dist/lib/parsers/parse-zip/{buffer-file-provider.d.ts → data-view-file-provider.d.ts} +15 -16
- package/dist/lib/parsers/parse-zip/data-view-file-provider.d.ts.map +1 -0
- package/dist/lib/parsers/parse-zip/{buffer-file-provider.js → data-view-file-provider.js} +28 -14
- package/dist/lib/parsers/parse-zip/end-of-central-directory.d.ts +18 -0
- package/dist/lib/parsers/parse-zip/end-of-central-directory.d.ts.map +1 -0
- package/dist/lib/parsers/parse-zip/end-of-central-directory.js +41 -0
- package/dist/lib/parsers/parse-zip/file-provider.d.ts +10 -5
- package/dist/lib/parsers/parse-zip/file-provider.d.ts.map +1 -1
- package/dist/lib/parsers/parse-zip/local-file-header.d.ts +5 -3
- package/dist/lib/parsers/parse-zip/local-file-header.d.ts.map +1 -1
- package/dist/lib/parsers/parse-zip/local-file-header.js +30 -11
- package/dist/lib/parsers/parse-zip/search-from-the-end.d.ts +11 -0
- package/dist/lib/parsers/parse-zip/search-from-the-end.d.ts.map +1 -0
- package/dist/lib/parsers/parse-zip/search-from-the-end.js +31 -0
- package/dist/types.d.ts +17 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -13
- package/package.json +9 -9
- package/src/i3s-slpk-loader.ts +19 -1
- package/src/index.ts +2 -2
- package/src/lib/parsers/constants.ts +14 -15
- package/src/lib/parsers/parse-slpk/parse-slpk.ts +83 -58
- package/src/lib/parsers/parse-slpk/slpk-archieve.ts +59 -44
- package/src/lib/parsers/parse-zip/cd-file-header.ts +52 -32
- package/src/lib/parsers/parse-zip/data-view-file-provider.ts +69 -0
- package/src/lib/parsers/parse-zip/end-of-central-directory.ts +78 -0
- package/src/lib/parsers/parse-zip/file-provider.ts +11 -5
- package/src/lib/parsers/parse-zip/local-file-header.ts +45 -19
- package/src/lib/parsers/parse-zip/search-from-the-end.ts +38 -0
- package/src/types.ts +25 -40
- package/dist/es5/lib/parsers/parse-zip/buffer-file-provider.js +0 -46
- package/dist/es5/lib/parsers/parse-zip/buffer-file-provider.js.map +0 -1
- package/dist/esm/lib/parsers/parse-zip/buffer-file-provider.js +0 -23
- package/dist/esm/lib/parsers/parse-zip/buffer-file-provider.js.map +0 -1
- package/dist/lib/parsers/parse-zip/buffer-file-provider.d.ts.map +0 -1
- package/src/lib/parsers/parse-zip/buffer-file-provider.ts +0 -55
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
7105
|
+
case "UInt8":
|
|
7118
7106
|
return Uint8Array;
|
|
7119
|
-
case
|
|
7107
|
+
case "UInt16":
|
|
7120
7108
|
return Uint16Array;
|
|
7121
|
-
case
|
|
7109
|
+
case "UInt32":
|
|
7122
7110
|
return Uint32Array;
|
|
7123
|
-
case
|
|
7111
|
+
case "Float32":
|
|
7124
7112
|
return Float32Array;
|
|
7125
|
-
case
|
|
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
|
|
7128
|
+
case "UInt8":
|
|
7141
7129
|
return 1;
|
|
7142
|
-
case
|
|
7143
|
-
case
|
|
7130
|
+
case "UInt16":
|
|
7131
|
+
case "Int16":
|
|
7144
7132
|
return 2;
|
|
7145
|
-
case
|
|
7146
|
-
case
|
|
7147
|
-
case
|
|
7133
|
+
case "UInt32":
|
|
7134
|
+
case "Int32":
|
|
7135
|
+
case "Float32":
|
|
7148
7136
|
return 4;
|
|
7149
|
-
case
|
|
7150
|
-
case
|
|
7151
|
-
case
|
|
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.
|
|
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.
|
|
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",
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { LoaderOptions, LoaderWithParser } from '@loaders.gl/loader-utils';
|
|
3
|
+
/** options to load data from SLPK */
|
|
3
4
|
export type SLPKLoaderOptions = LoaderOptions & {
|
|
4
5
|
slpk?: {
|
|
6
|
+
/** path inside the slpk archive */
|
|
5
7
|
path?: string;
|
|
8
|
+
/** mode of the path */
|
|
6
9
|
pathMode?: 'http' | 'raw';
|
|
7
10
|
};
|
|
8
11
|
};
|
|
@@ -1 +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;
|
|
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;AAQzE,qCAAqC;AACrC,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG;IAC9C,IAAI,CAAC,EAAE;QACL,mCAAmC;QACnC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,uBAAuB;QACvB,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;KAC3B,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,iBAAiB,CASzE,CAAC"}
|
package/dist/i3s-slpk-loader.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SLPKLoader = void 0;
|
|
4
4
|
const parse_slpk_1 = require("./lib/parsers/parse-slpk/parse-slpk");
|
|
5
|
+
const data_view_file_provider_1 = require("./lib/parsers/parse-zip/data-view-file-provider");
|
|
5
6
|
// __VERSION__ is injected by babel-plugin-version-inline
|
|
6
7
|
// @ts-ignore TS2304: Cannot find name '__VERSION__'.
|
|
7
8
|
const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
|
|
@@ -14,7 +15,16 @@ exports.SLPKLoader = {
|
|
|
14
15
|
module: 'i3s',
|
|
15
16
|
version: VERSION,
|
|
16
17
|
mimeTypes: ['application/octet-stream'],
|
|
17
|
-
parse:
|
|
18
|
+
parse: parseSLPK,
|
|
18
19
|
extensions: ['slpk'],
|
|
19
20
|
options: {}
|
|
20
21
|
};
|
|
22
|
+
/**
|
|
23
|
+
* returns a single file from the slpk archive
|
|
24
|
+
* @param data slpk archive data
|
|
25
|
+
* @param options options
|
|
26
|
+
* @returns requested file
|
|
27
|
+
*/
|
|
28
|
+
async function parseSLPK(data, options = {}) {
|
|
29
|
+
return (await (0, parse_slpk_1.parseSLPK)(new data_view_file_provider_1.DataViewFileProvider(new DataView(data)))).getFile(options.slpk?.path ?? '', options.slpk?.pathMode);
|
|
30
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
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,
|
|
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
|
+
export type { FileProvider } from './lib/parsers/parse-zip/file-provider';
|
|
2
3
|
export { COORDINATE_SYSTEM } from './lib/parsers/constants';
|
|
3
4
|
export { I3SLoader } from './i3s-loader';
|
|
4
5
|
export { SLPKLoader } from './i3s-slpk-loader';
|
|
@@ -8,5 +9,5 @@ export { I3SBuildingSceneLayerLoader } from './i3s-building-scene-layer-loader';
|
|
|
8
9
|
export { I3SNodePageLoader } from './i3s-node-page-loader';
|
|
9
10
|
export { ArcGisWebSceneLoader } from './arcgis-webscene-loader';
|
|
10
11
|
export { parseZipLocalFileHeader } from './lib/parsers/parse-zip/local-file-header';
|
|
11
|
-
export {
|
|
12
|
+
export { parseSLPK } from './lib/parsers/parse-slpk/parse-slpk';
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// loaders.gl, MIT license
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.parseZipLocalFileHeader = exports.ArcGisWebSceneLoader = exports.I3SNodePageLoader = exports.I3SBuildingSceneLayerLoader = exports.loadFeatureAttributes = exports.I3SAttributeLoader = exports.I3SContentLoader = exports.SLPKLoader = exports.I3SLoader = exports.COORDINATE_SYSTEM = void 0;
|
|
4
|
+
exports.parseSLPK = exports.parseZipLocalFileHeader = 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");
|
|
@@ -21,3 +21,5 @@ var arcgis_webscene_loader_1 = require("./arcgis-webscene-loader");
|
|
|
21
21
|
Object.defineProperty(exports, "ArcGisWebSceneLoader", { enumerable: true, get: function () { return arcgis_webscene_loader_1.ArcGisWebSceneLoader; } });
|
|
22
22
|
var local_file_header_1 = require("./lib/parsers/parse-zip/local-file-header");
|
|
23
23
|
Object.defineProperty(exports, "parseZipLocalFileHeader", { enumerable: true, get: function () { return local_file_header_1.parseZipLocalFileHeader; } });
|
|
24
|
+
var parse_slpk_1 = require("./lib/parsers/parse-slpk/parse-slpk");
|
|
25
|
+
Object.defineProperty(exports, "parseSLPK", { enumerable: true, get: function () { return parse_slpk_1.parseSLPK; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/constants.ts"],"names":[],"mappings":"
|
|
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
|
|
10
|
+
case 'UInt8':
|
|
12
11
|
return Uint8Array;
|
|
13
|
-
case
|
|
12
|
+
case 'UInt16':
|
|
14
13
|
return Uint16Array;
|
|
15
|
-
case
|
|
14
|
+
case 'UInt32':
|
|
16
15
|
return Uint32Array;
|
|
17
|
-
case
|
|
16
|
+
case 'Float32':
|
|
18
17
|
return Float32Array;
|
|
19
|
-
case
|
|
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
|
|
39
|
+
case 'UInt8':
|
|
41
40
|
return 1;
|
|
42
|
-
case
|
|
43
|
-
case
|
|
41
|
+
case 'UInt16':
|
|
42
|
+
case 'Int16':
|
|
44
43
|
return 2;
|
|
45
|
-
case
|
|
46
|
-
case
|
|
47
|
-
case
|
|
44
|
+
case 'UInt32':
|
|
45
|
+
case 'Int32':
|
|
46
|
+
case 'Float32':
|
|
48
47
|
return 4;
|
|
49
|
-
case
|
|
50
|
-
case
|
|
51
|
-
case
|
|
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}`);
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
|
|
1
|
+
import { FileProvider } from '../parse-zip/file-provider';
|
|
2
|
+
import { SLPKArchive } from './slpk-archieve';
|
|
3
|
+
/**
|
|
4
|
+
* Creates slpk file handler from raw file
|
|
5
|
+
* @param fileProvider raw file data
|
|
6
|
+
* @param cb is called with information message during parsing
|
|
7
|
+
* @returns slpk file handler
|
|
8
|
+
*/
|
|
9
|
+
export declare const parseSLPK: (fileProvider: FileProvider, cb?: ((msg: string) => void) | undefined) => Promise<SLPKArchive>;
|
|
4
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":"
|
|
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,54 +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;
|
|
4
|
-
const
|
|
7
|
+
const md5_1 = __importDefault(require("md5"));
|
|
5
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");
|
|
6
10
|
const local_file_header_1 = require("../parse-zip/local-file-header");
|
|
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
|
-
*
|
|
10
|
-
* @param
|
|
11
|
-
* @param
|
|
12
|
-
* @returns
|
|
14
|
+
* Creates slpk file handler from raw file
|
|
15
|
+
* @param fileProvider raw file data
|
|
16
|
+
* @param cb is called with information message during parsing
|
|
17
|
+
* @returns slpk file handler
|
|
13
18
|
*/
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
};
|
|
17
|
-
async function parseSLPK(data, options = {}) {
|
|
18
|
-
const archive = new DataView(data);
|
|
19
|
-
const cdFileHeaderSignature = [80, 75, 1, 2];
|
|
20
|
-
const searchWindow = [
|
|
21
|
-
getByteAt(archive.byteLength - 1, archive),
|
|
22
|
-
getByteAt(archive.byteLength - 2, archive),
|
|
23
|
-
getByteAt(archive.byteLength - 3, archive),
|
|
24
|
-
undefined
|
|
25
|
-
];
|
|
26
|
-
let hashCDOffset = 0;
|
|
27
|
-
// looking for the last record in the central directory
|
|
28
|
-
for (let i = archive.byteLength - 4; i > -1; i--) {
|
|
29
|
-
searchWindow[3] = searchWindow[2];
|
|
30
|
-
searchWindow[2] = searchWindow[1];
|
|
31
|
-
searchWindow[1] = searchWindow[0];
|
|
32
|
-
searchWindow[0] = getByteAt(i, archive);
|
|
33
|
-
if (searchWindow.every((val, index) => val === cdFileHeaderSignature[index])) {
|
|
34
|
-
hashCDOffset = i;
|
|
35
|
-
break;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
const fileProvider = new buffer_file_provider_1.DataViewFileProvider(archive);
|
|
19
|
+
const parseSLPK = async (fileProvider, cb) => {
|
|
20
|
+
const hashCDOffset = await (0, search_from_the_end_1.searchFromTheEnd)(fileProvider, cd_file_header_1.signature);
|
|
39
21
|
const cdFileHeader = await (0, cd_file_header_1.parseZipCDFileHeader)(hashCDOffset, fileProvider);
|
|
40
|
-
|
|
41
|
-
|
|
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');
|
|
42
27
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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);
|
|
51
37
|
}
|
|
52
|
-
return
|
|
53
|
-
}
|
|
38
|
+
return new slpk_archieve_1.SLPKArchive(fileProvider, hashData);
|
|
39
|
+
};
|
|
54
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,20 +1,32 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
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;
|
|
2
17
|
/**
|
|
3
18
|
* Class for handling information about slpk file
|
|
4
19
|
*/
|
|
5
20
|
export declare class SLPKArchive {
|
|
6
|
-
slpkArchive
|
|
7
|
-
hashArray
|
|
8
|
-
|
|
9
|
-
offset: number;
|
|
10
|
-
}[];
|
|
11
|
-
constructor(slpkArchiveBuffer: ArrayBuffer, hashFile: ArrayBuffer);
|
|
21
|
+
private slpkArchive;
|
|
22
|
+
private hashArray;
|
|
23
|
+
constructor(slpkArchive: FileProvider, hashFile: HashElement[]);
|
|
12
24
|
/**
|
|
13
|
-
*
|
|
14
|
-
* @param
|
|
15
|
-
* @returns
|
|
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
|
|
16
28
|
*/
|
|
17
|
-
private
|
|
29
|
+
private findBin;
|
|
18
30
|
/**
|
|
19
31
|
* Returns file with the given path from slpk archive
|
|
20
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":";
|
|
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,11 +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
|
-
const buffer_file_provider_1 = require("../parse-zip/buffer-file-provider");
|
|
10
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;
|
|
11
29
|
/** Description of real paths for different file types */
|
|
12
30
|
const PATH_DESCRIPTIONS = [
|
|
13
31
|
{
|
|
@@ -19,7 +37,7 @@ const PATH_DESCRIPTIONS = [
|
|
|
19
37
|
extensions: ['.json.gz']
|
|
20
38
|
},
|
|
21
39
|
{
|
|
22
|
-
test: /^nodes
|
|
40
|
+
test: /^nodes\/(\d+|root)$/,
|
|
23
41
|
extensions: ['/3dNodeIndexDocument.json.gz']
|
|
24
42
|
},
|
|
25
43
|
{
|
|
@@ -47,27 +65,32 @@ const PATH_DESCRIPTIONS = [
|
|
|
47
65
|
* Class for handling information about slpk file
|
|
48
66
|
*/
|
|
49
67
|
class SLPKArchive {
|
|
50
|
-
constructor(
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
+
};
|
|
92
|
+
this.slpkArchive = slpkArchive;
|
|
93
|
+
this.hashArray = hashFile;
|
|
71
94
|
}
|
|
72
95
|
/**
|
|
73
96
|
* Returns file with the given path from slpk archive
|
|
@@ -109,7 +132,12 @@ class SLPKArchive {
|
|
|
109
132
|
* @returns buffer with the file data
|
|
110
133
|
*/
|
|
111
134
|
async getDataByPath(path) {
|
|
112
|
-
|
|
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
|
+
}
|
|
113
141
|
if (!data) {
|
|
114
142
|
return undefined;
|
|
115
143
|
}
|
|
@@ -127,15 +155,15 @@ class SLPKArchive {
|
|
|
127
155
|
*/
|
|
128
156
|
async getFileBytes(path) {
|
|
129
157
|
const nameHash = Buffer.from((0, md5_1.default)(path), 'hex');
|
|
130
|
-
const fileInfo = this.
|
|
158
|
+
const fileInfo = this.findBin(nameHash); // implement binary search
|
|
131
159
|
if (!fileInfo) {
|
|
132
160
|
return undefined;
|
|
133
161
|
}
|
|
134
|
-
const localFileHeader = await (0, local_file_header_1.parseZipLocalFileHeader)(
|
|
162
|
+
const localFileHeader = await (0, local_file_header_1.parseZipLocalFileHeader)(fileInfo.offset, this.slpkArchive);
|
|
135
163
|
if (!localFileHeader) {
|
|
136
164
|
return undefined;
|
|
137
165
|
}
|
|
138
|
-
const compressedFile = this.slpkArchive.
|
|
166
|
+
const compressedFile = this.slpkArchive.slice(localFileHeader.fileDataOffset, localFileHeader.fileDataOffset + localFileHeader.compressedSize);
|
|
139
167
|
return compressedFile;
|
|
140
168
|
}
|
|
141
169
|
}
|
|
@@ -1,27 +1,31 @@
|
|
|
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)
|
|
5
6
|
*/
|
|
6
7
|
export type ZipCDFileHeader = {
|
|
7
8
|
/** Compressed size */
|
|
8
|
-
compressedSize:
|
|
9
|
+
compressedSize: bigint;
|
|
9
10
|
/** Uncompressed size */
|
|
10
|
-
uncompressedSize:
|
|
11
|
+
uncompressedSize: bigint;
|
|
12
|
+
/** Extra field size */
|
|
13
|
+
extraFieldLength: number;
|
|
11
14
|
/** File name length */
|
|
12
15
|
fileNameLength: number;
|
|
13
16
|
/** File name */
|
|
14
17
|
fileName: string;
|
|
15
18
|
/** Extra field offset */
|
|
16
|
-
extraOffset:
|
|
19
|
+
extraOffset: bigint;
|
|
17
20
|
/** Relative offset of local file header */
|
|
18
|
-
localHeaderOffset:
|
|
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:
|
|
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;
|
|
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"}
|