@loaders.gl/i3s 4.0.0-alpha.19 → 4.0.0-alpha.21
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 +300 -275
- 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 +3 -3
- package/dist/es5/i3s-slpk-loader.js.map +1 -1
- package/dist/es5/index.js +0 -7
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js +6 -69
- package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
- package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js +9 -33
- package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.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 +3 -3
- package/dist/esm/i3s-slpk-loader.js.map +1 -1
- package/dist/esm/index.js +0 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js +2 -35
- package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
- package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js +5 -29
- package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
- package/dist/i3s-content-worker-node.js +2 -2
- package/dist/i3s-content-worker-node.js.map +2 -2
- package/dist/i3s-content-worker.js +21 -21
- package/dist/i3s-slpk-loader.js +2 -2
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts +1 -1
- package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts.map +1 -1
- package/dist/lib/parsers/parse-slpk/parse-slpk.js +6 -50
- package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts +2 -21
- package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts.map +1 -1
- package/dist/lib/parsers/parse-slpk/slpk-archieve.js +7 -46
- package/package.json +9 -9
- package/src/i3s-slpk-loader.ts +2 -2
- package/src/index.ts +0 -2
- package/src/lib/parsers/parse-slpk/parse-slpk.ts +11 -56
- package/src/lib/parsers/parse-slpk/slpk-archieve.ts +5 -54
- package/dist/es5/lib/parsers/parse-zip/cd-file-header.js +0 -121
- package/dist/es5/lib/parsers/parse-zip/cd-file-header.js.map +0 -1
- package/dist/es5/lib/parsers/parse-zip/data-view-file-provider.js +0 -129
- package/dist/es5/lib/parsers/parse-zip/data-view-file-provider.js.map +0 -1
- package/dist/es5/lib/parsers/parse-zip/end-of-central-directory.js +0 -100
- package/dist/es5/lib/parsers/parse-zip/end-of-central-directory.js.map +0 -1
- package/dist/es5/lib/parsers/parse-zip/file-provider.js +0 -2
- package/dist/es5/lib/parsers/parse-zip/file-provider.js.map +0 -1
- package/dist/es5/lib/parsers/parse-zip/local-file-header.js +0 -113
- package/dist/es5/lib/parsers/parse-zip/local-file-header.js.map +0 -1
- package/dist/es5/lib/parsers/parse-zip/search-from-the-end.js +0 -69
- package/dist/es5/lib/parsers/parse-zip/search-from-the-end.js.map +0 -1
- package/dist/esm/lib/parsers/parse-zip/cd-file-header.js +0 -45
- package/dist/esm/lib/parsers/parse-zip/cd-file-header.js.map +0 -1
- package/dist/esm/lib/parsers/parse-zip/data-view-file-provider.js +0 -32
- package/dist/esm/lib/parsers/parse-zip/data-view-file-provider.js.map +0 -1
- package/dist/esm/lib/parsers/parse-zip/end-of-central-directory.js +0 -33
- package/dist/esm/lib/parsers/parse-zip/end-of-central-directory.js.map +0 -1
- package/dist/esm/lib/parsers/parse-zip/file-provider.js +0 -2
- package/dist/esm/lib/parsers/parse-zip/file-provider.js.map +0 -1
- package/dist/esm/lib/parsers/parse-zip/local-file-header.js +0 -40
- package/dist/esm/lib/parsers/parse-zip/local-file-header.js.map +0 -1
- package/dist/esm/lib/parsers/parse-zip/search-from-the-end.js +0 -16
- package/dist/esm/lib/parsers/parse-zip/search-from-the-end.js.map +0 -1
- package/dist/lib/parsers/parse-zip/cd-file-header.d.ts +0 -31
- package/dist/lib/parsers/parse-zip/cd-file-header.d.ts.map +0 -1
- package/dist/lib/parsers/parse-zip/cd-file-header.js +0 -55
- package/dist/lib/parsers/parse-zip/data-view-file-provider.d.ts +0 -36
- package/dist/lib/parsers/parse-zip/data-view-file-provider.d.ts.map +0 -1
- package/dist/lib/parsers/parse-zip/data-view-file-provider.js +0 -61
- package/dist/lib/parsers/parse-zip/end-of-central-directory.d.ts +0 -18
- package/dist/lib/parsers/parse-zip/end-of-central-directory.d.ts.map +0 -1
- package/dist/lib/parsers/parse-zip/end-of-central-directory.js +0 -41
- package/dist/lib/parsers/parse-zip/file-provider.d.ts +0 -36
- package/dist/lib/parsers/parse-zip/file-provider.d.ts.map +0 -1
- package/dist/lib/parsers/parse-zip/file-provider.js +0 -2
- package/dist/lib/parsers/parse-zip/local-file-header.d.ts +0 -27
- package/dist/lib/parsers/parse-zip/local-file-header.d.ts.map +0 -1
- package/dist/lib/parsers/parse-zip/local-file-header.js +0 -53
- package/dist/lib/parsers/parse-zip/search-from-the-end.d.ts +0 -11
- package/dist/lib/parsers/parse-zip/search-from-the-end.d.ts.map +0 -1
- package/dist/lib/parsers/parse-zip/search-from-the-end.js +0 -31
- package/src/lib/parsers/parse-zip/cd-file-header.ts +0 -106
- package/src/lib/parsers/parse-zip/data-view-file-provider.ts +0 -69
- package/src/lib/parsers/parse-zip/end-of-central-directory.ts +0 -78
- package/src/lib/parsers/parse-zip/file-provider.ts +0 -40
- package/src/lib/parsers/parse-zip/local-file-header.ts +0 -91
- package/src/lib/parsers/parse-zip/search-from-the-end.ts +0 -38
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import { parseEoCDRecord } from '../parse-zip/end-of-central-directory';
|
|
4
|
-
import { parseZipLocalFileHeader } from '../parse-zip/local-file-header';
|
|
5
|
-
import { searchFromTheEnd } from '../parse-zip/search-from-the-end';
|
|
6
|
-
import { SLPKArchive, compareHashes } from './slpk-archieve';
|
|
1
|
+
import { parseZipCDFileHeader, cdSignature as cdHeaderSignature, parseZipLocalFileHeader, searchFromTheEnd, parseHashFile, generateHashInfo } from '@loaders.gl/zip';
|
|
2
|
+
import { SLPKArchive } from './slpk-archieve';
|
|
7
3
|
export const parseSLPK = async (fileProvider, cb) => {
|
|
8
4
|
const hashCDOffset = await searchFromTheEnd(fileProvider, cdHeaderSignature);
|
|
9
5
|
const cdFileHeader = await parseZipCDFileHeader(hashCDOffset, fileProvider);
|
|
@@ -24,33 +20,4 @@ export const parseSLPK = async (fileProvider, cb) => {
|
|
|
24
20
|
}
|
|
25
21
|
return new SLPKArchive(fileProvider, hashData);
|
|
26
22
|
};
|
|
27
|
-
const generateHashInfo = async fileProvider => {
|
|
28
|
-
const {
|
|
29
|
-
cdStartOffset
|
|
30
|
-
} = await parseEoCDRecord(fileProvider);
|
|
31
|
-
let cdHeader = await parseZipCDFileHeader(cdStartOffset, fileProvider);
|
|
32
|
-
const hashInfo = [];
|
|
33
|
-
while (cdHeader) {
|
|
34
|
-
hashInfo.push({
|
|
35
|
-
hash: Buffer.from(md5(cdHeader.fileName.split('\\').join('/').toLocaleLowerCase()), 'hex'),
|
|
36
|
-
offset: cdHeader.localHeaderOffset
|
|
37
|
-
});
|
|
38
|
-
cdHeader = await parseZipCDFileHeader(cdHeader.extraOffset + BigInt(cdHeader.extraFieldLength), fileProvider);
|
|
39
|
-
}
|
|
40
|
-
hashInfo.sort((a, b) => compareHashes(a.hash, b.hash));
|
|
41
|
-
return hashInfo;
|
|
42
|
-
};
|
|
43
|
-
const parseHashFile = hashFile => {
|
|
44
|
-
const hashFileBuffer = Buffer.from(hashFile);
|
|
45
|
-
const hashArray = [];
|
|
46
|
-
for (let i = 0; i < hashFileBuffer.buffer.byteLength; i = i + 24) {
|
|
47
|
-
const offsetBuffer = new DataView(hashFileBuffer.buffer.slice(hashFileBuffer.byteOffset + i + 16, hashFileBuffer.byteOffset + i + 24));
|
|
48
|
-
const offset = offsetBuffer.getBigUint64(offsetBuffer.byteOffset, true);
|
|
49
|
-
hashArray.push({
|
|
50
|
-
hash: Buffer.from(hashFileBuffer.subarray(hashFileBuffer.byteOffset + i, hashFileBuffer.byteOffset + i + 16)),
|
|
51
|
-
offset
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
return hashArray;
|
|
55
|
-
};
|
|
56
23
|
//# sourceMappingURL=parse-slpk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-slpk.js","names":["
|
|
1
|
+
{"version":3,"file":"parse-slpk.js","names":["parseZipCDFileHeader","cdSignature","cdHeaderSignature","parseZipLocalFileHeader","searchFromTheEnd","parseHashFile","generateHashInfo","SLPKArchive","parseSLPK","fileProvider","cb","hashCDOffset","cdFileHeader","hashData","fileName","localFileHeader","localHeaderOffset","Error","fileDataOffset","hashFile","slice","compressedSize"],"sources":["../../../../../src/lib/parsers/parse-slpk/parse-slpk.ts"],"sourcesContent":["import {\n parseZipCDFileHeader,\n cdSignature as cdHeaderSignature,\n FileProvider,\n parseZipLocalFileHeader,\n searchFromTheEnd,\n HashElement,\n parseHashFile,\n generateHashInfo\n} from '@loaders.gl/zip';\nimport {SLPKArchive} from './slpk-archieve';\n\n/**\n * Creates slpk file handler from raw file\n * @param fileProvider raw file data\n * @param cb is called with information message during parsing\n * @returns slpk file handler\n */\nexport const parseSLPK = async (\n fileProvider: FileProvider,\n cb?: (msg: string) => void\n): Promise<SLPKArchive> => {\n const hashCDOffset = await searchFromTheEnd(fileProvider, cdHeaderSignature);\n\n const cdFileHeader = await parseZipCDFileHeader(hashCDOffset, fileProvider);\n\n let hashData: HashElement[];\n if (cdFileHeader?.fileName !== '@specialIndexFileHASH128@') {\n cb?.('SLPK doesnt contain hash file');\n hashData = await generateHashInfo(fileProvider);\n cb?.('hash info has been composed according to central directory records');\n } else {\n cb?.('SLPK contains hash file');\n const localFileHeader = await parseZipLocalFileHeader(\n cdFileHeader.localHeaderOffset,\n fileProvider\n );\n if (!localFileHeader) {\n throw new Error('corrupted SLPK');\n }\n\n const fileDataOffset = localFileHeader.fileDataOffset;\n const hashFile = await fileProvider.slice(\n fileDataOffset,\n fileDataOffset + localFileHeader.compressedSize\n );\n\n hashData = parseHashFile(hashFile);\n }\n\n return new SLPKArchive(fileProvider, hashData);\n};\n"],"mappings":"AAAA,SACEA,oBAAoB,EACpBC,WAAW,IAAIC,iBAAiB,EAEhCC,uBAAuB,EACvBC,gBAAgB,EAEhBC,aAAa,EACbC,gBAAgB,QACX,iBAAiB;AACxB,SAAQC,WAAW,QAAO,iBAAiB;AAQ3C,OAAO,MAAMC,SAAS,GAAG,MAAAA,CACvBC,YAA0B,EAC1BC,EAA0B,KACD;EACzB,MAAMC,YAAY,GAAG,MAAMP,gBAAgB,CAACK,YAAY,EAAEP,iBAAiB,CAAC;EAE5E,MAAMU,YAAY,GAAG,MAAMZ,oBAAoB,CAACW,YAAY,EAAEF,YAAY,CAAC;EAE3E,IAAII,QAAuB;EAC3B,IAAI,CAAAD,YAAY,aAAZA,YAAY,uBAAZA,YAAY,CAAEE,QAAQ,MAAK,2BAA2B,EAAE;IAC1DJ,EAAE,aAAFA,EAAE,uBAAFA,EAAE,CAAG,+BAA+B,CAAC;IACrCG,QAAQ,GAAG,MAAMP,gBAAgB,CAACG,YAAY,CAAC;IAC/CC,EAAE,aAAFA,EAAE,uBAAFA,EAAE,CAAG,oEAAoE,CAAC;EAC5E,CAAC,MAAM;IACLA,EAAE,aAAFA,EAAE,uBAAFA,EAAE,CAAG,yBAAyB,CAAC;IAC/B,MAAMK,eAAe,GAAG,MAAMZ,uBAAuB,CACnDS,YAAY,CAACI,iBAAiB,EAC9BP,YACF,CAAC;IACD,IAAI,CAACM,eAAe,EAAE;MACpB,MAAM,IAAIE,KAAK,CAAC,gBAAgB,CAAC;IACnC;IAEA,MAAMC,cAAc,GAAGH,eAAe,CAACG,cAAc;IACrD,MAAMC,QAAQ,GAAG,MAAMV,YAAY,CAACW,KAAK,CACvCF,cAAc,EACdA,cAAc,GAAGH,eAAe,CAACM,cACnC,CAAC;IAEDR,QAAQ,GAAGR,aAAa,CAACc,QAAQ,CAAC;EACpC;EAEA,OAAO,IAAIZ,WAAW,CAACE,YAAY,EAAEI,QAAQ,CAAC;AAChD,CAAC"}
|
|
@@ -1,18 +1,7 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
2
|
import md5 from 'md5';
|
|
3
|
-
import { parseZipLocalFileHeader } from '
|
|
3
|
+
import { parseZipLocalFileHeader, findBin } from '@loaders.gl/zip';
|
|
4
4
|
import { GZipCompression } from '@loaders.gl/compression';
|
|
5
|
-
export const compareHashes = (hash1, hash2) => {
|
|
6
|
-
const h1 = new BigUint64Array(hash1.buffer, hash1.byteOffset, 2);
|
|
7
|
-
const h2 = new BigUint64Array(hash2.buffer, hash2.byteOffset, 2);
|
|
8
|
-
const diff = h1[0] === h2[0] ? h1[1] - h2[1] : h1[0] - h2[0];
|
|
9
|
-
if (diff < 0n) {
|
|
10
|
-
return -1;
|
|
11
|
-
} else if (diff === 0n) {
|
|
12
|
-
return 0;
|
|
13
|
-
}
|
|
14
|
-
return 1;
|
|
15
|
-
};
|
|
16
5
|
const PATH_DESCRIPTIONS = [{
|
|
17
6
|
test: /^$/,
|
|
18
7
|
extensions: ['3dSceneLayer.json.gz']
|
|
@@ -42,22 +31,6 @@ export class SLPKArchive {
|
|
|
42
31
|
constructor(slpkArchive, hashFile) {
|
|
43
32
|
_defineProperty(this, "slpkArchive", void 0);
|
|
44
33
|
_defineProperty(this, "hashArray", void 0);
|
|
45
|
-
_defineProperty(this, "findBin", hashToSearch => {
|
|
46
|
-
let lowerBorder = 0;
|
|
47
|
-
let upperBorder = this.hashArray.length;
|
|
48
|
-
while (upperBorder - lowerBorder > 1) {
|
|
49
|
-
const middle = lowerBorder + Math.floor((upperBorder - lowerBorder) / 2);
|
|
50
|
-
const value = compareHashes(this.hashArray[middle].hash, hashToSearch);
|
|
51
|
-
if (value === 0) {
|
|
52
|
-
return this.hashArray[middle];
|
|
53
|
-
} else if (value < 0) {
|
|
54
|
-
lowerBorder = middle;
|
|
55
|
-
} else {
|
|
56
|
-
upperBorder = middle;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return undefined;
|
|
60
|
-
});
|
|
61
34
|
this.slpkArchive = slpkArchive;
|
|
62
35
|
this.hashArray = hashFile;
|
|
63
36
|
}
|
|
@@ -108,7 +81,7 @@ export class SLPKArchive {
|
|
|
108
81
|
}
|
|
109
82
|
async getFileBytes(path) {
|
|
110
83
|
const nameHash = Buffer.from(md5(path), 'hex');
|
|
111
|
-
const fileInfo =
|
|
84
|
+
const fileInfo = findBin(nameHash, this.hashArray);
|
|
112
85
|
if (!fileInfo) {
|
|
113
86
|
return undefined;
|
|
114
87
|
}
|
|
@@ -119,5 +92,8 @@ export class SLPKArchive {
|
|
|
119
92
|
const compressedFile = this.slpkArchive.slice(localFileHeader.fileDataOffset, localFileHeader.fileDataOffset + localFileHeader.compressedSize);
|
|
120
93
|
return compressedFile;
|
|
121
94
|
}
|
|
95
|
+
findBin(nameHash) {
|
|
96
|
+
throw new Error('Method not implemented.');
|
|
97
|
+
}
|
|
122
98
|
}
|
|
123
99
|
//# sourceMappingURL=slpk-archieve.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slpk-archieve.js","names":["md5","parseZipLocalFileHeader","GZipCompression","compareHashes","hash1","hash2","h1","BigUint64Array","buffer","byteOffset","h2","diff","PATH_DESCRIPTIONS","test","extensions","SLPKArchive","constructor","slpkArchive","hashFile","_defineProperty","hashToSearch","lowerBorder","upperBorder","hashArray","length","middle","Math","floor","value","hash","undefined","getFile","path","mode","arguments","_PATH_DESCRIPTIONS$fi","find","val","data","ext","getDataByPath","concat","Buffer","from","decompressedFile","fileWithoutCompression","getFileBytes","Error","toLocaleLowerCase","compression","decompressedData","decompress","nameHash","fileInfo","findBin","localFileHeader","offset","compressedFile","slice","fileDataOffset","compressedSize"],"sources":["../../../../../src/lib/parsers/parse-slpk/slpk-archieve.ts"],"sourcesContent":["import md5 from 'md5';\nimport {parseZipLocalFileHeader} from '../parse-zip/local-file-header';\nimport {GZipCompression} from '@loaders.gl/compression';\nimport {FileProvider} from '../parse-zip/file-provider';\n\n/** Element of hash array */\nexport type HashElement = {\n /** File name hash */\n hash: Buffer;\n /** File offset in the archive */\n offset: bigint;\n};\n\n/**\n * Comparing md5 hashes according to https://github.com/Esri/i3s-spec/blob/master/docs/2.0/slpk_hashtable.pcsl.md step 5\n * @param hash1 hash to compare\n * @param hash2 hash to compare\n * @returns -1 if hash1 < hash2, 0 of hash1 === hash2, 1 if hash1 > hash2\n */\nexport const compareHashes = (hash1: Buffer, hash2: Buffer): number => {\n const h1 = new BigUint64Array(hash1.buffer, hash1.byteOffset, 2);\n const h2 = new BigUint64Array(hash2.buffer, hash2.byteOffset, 2);\n\n const diff = h1[0] === h2[0] ? h1[1] - h2[1] : h1[0] - h2[0];\n\n if (diff < 0n) {\n return -1;\n } else if (diff === 0n) {\n return 0;\n }\n return 1;\n};\n\n/** Description of real paths for different file types */\nconst PATH_DESCRIPTIONS: {test: RegExp; extensions: string[]}[] = [\n {\n test: /^$/,\n extensions: ['3dSceneLayer.json.gz']\n },\n {\n test: /^nodepages\\/\\d+$/,\n extensions: ['.json.gz']\n },\n {\n test: /^nodes\\/(\\d+|root)$/,\n extensions: ['/3dNodeIndexDocument.json.gz']\n },\n {\n test: /^nodes\\/\\d+\\/textures\\/.+$/,\n extensions: ['.jpg', '.png', '.bin.dds.gz', '.ktx']\n },\n {\n test: /^nodes\\/\\d+\\/geometries\\/\\d+$/,\n extensions: ['.bin.gz', '.draco.gz']\n },\n {\n test: /^nodes\\/\\d+\\/attributes\\/f_\\d+\\/\\d+$/,\n extensions: ['.bin.gz']\n },\n {\n test: /^statistics\\/f_\\d+\\/\\d+$/,\n extensions: ['.json.gz']\n },\n {\n test: /^nodes\\/\\d+\\/shared$/,\n extensions: ['/sharedResource.json.gz']\n }\n];\n\n/**\n * Class for handling information about slpk file\n */\nexport class SLPKArchive {\n private slpkArchive: FileProvider;\n private hashArray: HashElement[];\n constructor(slpkArchive: FileProvider, hashFile: HashElement[]) {\n this.slpkArchive = slpkArchive;\n this.hashArray = hashFile;\n }\n\n /**\n * Binary search in the hash info\n * @param hashToSearch hash that we need to find\n * @returns required hash element or undefined if not found\n */\n private findBin = (hashToSearch: Buffer): HashElement | undefined => {\n let lowerBorder = 0;\n let upperBorder = this.hashArray.length;\n\n while (upperBorder - lowerBorder > 1) {\n const middle = lowerBorder + Math.floor((upperBorder - lowerBorder) / 2);\n const value = compareHashes(this.hashArray[middle].hash, hashToSearch);\n if (value === 0) {\n return this.hashArray[middle];\n } else if (value < 0) {\n lowerBorder = middle;\n } else {\n upperBorder = middle;\n }\n }\n return undefined;\n };\n\n /**\n * Returns file with the given path from slpk archive\n * @param path - path inside the slpk\n * @param mode - currently only raw mode supported\n * @returns buffer with ready to use file\n */\n async getFile(path: string, mode: 'http' | 'raw' = 'raw'): Promise<Buffer> {\n if (mode === 'http') {\n const extensions = PATH_DESCRIPTIONS.find((val) => val.test.test(path))?.extensions;\n if (extensions) {\n let data: ArrayBuffer | undefined;\n for (const ext of extensions) {\n data = await this.getDataByPath(`${path}${ext}`);\n if (data) {\n break;\n }\n }\n if (data) {\n return Buffer.from(data);\n }\n }\n }\n if (mode === 'raw') {\n const decompressedFile = await this.getDataByPath(`${path}.gz`);\n if (decompressedFile) {\n return Buffer.from(decompressedFile);\n }\n const fileWithoutCompression = await this.getFileBytes(path);\n if (fileWithoutCompression) {\n return Buffer.from(fileWithoutCompression);\n }\n }\n\n throw new Error('No such file in the archieve');\n }\n\n /**\n * returning uncompressed data for paths that ends with .gz and raw data for all other paths\n * @param path - path inside the archive\n * @returns buffer with the file data\n */\n private async getDataByPath(path: string): Promise<ArrayBuffer | undefined> {\n // sometimes paths are not in lower case when hash file is created,\n // so first we're looking for lower case file name and then for original one\n let data = await this.getFileBytes(path.toLocaleLowerCase());\n if (!data) {\n data = await this.getFileBytes(path);\n }\n if (!data) {\n return undefined;\n }\n if (/\\.gz$/.test(path)) {\n const compression = new GZipCompression();\n\n const decompressedData = await compression.decompress(data);\n return decompressedData;\n }\n return Buffer.from(data);\n }\n\n /**\n * Trying to get raw file data by adress\n * @param path - path inside the archive\n * @returns buffer with the raw file data\n */\n private async getFileBytes(path: string): Promise<ArrayBuffer | undefined> {\n const nameHash = Buffer.from(md5(path), 'hex');\n const fileInfo = this.findBin(nameHash); // implement binary search\n if (!fileInfo) {\n return undefined;\n }\n\n const localFileHeader = await parseZipLocalFileHeader(fileInfo.offset, this.slpkArchive);\n if (!localFileHeader) {\n return undefined;\n }\n\n const compressedFile = this.slpkArchive.slice(\n localFileHeader.fileDataOffset,\n localFileHeader.fileDataOffset + localFileHeader.compressedSize\n );\n\n return compressedFile;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"slpk-archieve.js","names":["md5","parseZipLocalFileHeader","findBin","GZipCompression","PATH_DESCRIPTIONS","test","extensions","SLPKArchive","constructor","slpkArchive","hashFile","_defineProperty","hashArray","getFile","path","mode","arguments","length","undefined","_PATH_DESCRIPTIONS$fi","find","val","data","ext","getDataByPath","concat","Buffer","from","decompressedFile","fileWithoutCompression","getFileBytes","Error","toLocaleLowerCase","compression","decompressedData","decompress","nameHash","fileInfo","localFileHeader","offset","compressedFile","slice","fileDataOffset","compressedSize"],"sources":["../../../../../src/lib/parsers/parse-slpk/slpk-archieve.ts"],"sourcesContent":["import md5 from 'md5';\nimport {FileProvider, parseZipLocalFileHeader, HashElement, findBin} from '@loaders.gl/zip';\nimport {GZipCompression} from '@loaders.gl/compression';\n\n/** Description of real paths for different file types */\nconst PATH_DESCRIPTIONS: {test: RegExp; extensions: string[]}[] = [\n {\n test: /^$/,\n extensions: ['3dSceneLayer.json.gz']\n },\n {\n test: /^nodepages\\/\\d+$/,\n extensions: ['.json.gz']\n },\n {\n test: /^nodes\\/(\\d+|root)$/,\n extensions: ['/3dNodeIndexDocument.json.gz']\n },\n {\n test: /^nodes\\/\\d+\\/textures\\/.+$/,\n extensions: ['.jpg', '.png', '.bin.dds.gz', '.ktx']\n },\n {\n test: /^nodes\\/\\d+\\/geometries\\/\\d+$/,\n extensions: ['.bin.gz', '.draco.gz']\n },\n {\n test: /^nodes\\/\\d+\\/attributes\\/f_\\d+\\/\\d+$/,\n extensions: ['.bin.gz']\n },\n {\n test: /^statistics\\/f_\\d+\\/\\d+$/,\n extensions: ['.json.gz']\n },\n {\n test: /^nodes\\/\\d+\\/shared$/,\n extensions: ['/sharedResource.json.gz']\n }\n];\n\n/**\n * Class for handling information about slpk file\n */\nexport class SLPKArchive {\n private slpkArchive: FileProvider;\n private hashArray: HashElement[];\n constructor(slpkArchive: FileProvider, hashFile: HashElement[]) {\n this.slpkArchive = slpkArchive;\n this.hashArray = hashFile;\n }\n\n /**\n * Returns file with the given path from slpk archive\n * @param path - path inside the slpk\n * @param mode - currently only raw mode supported\n * @returns buffer with ready to use file\n */\n async getFile(path: string, mode: 'http' | 'raw' = 'raw'): Promise<Buffer> {\n if (mode === 'http') {\n const extensions = PATH_DESCRIPTIONS.find((val) => val.test.test(path))?.extensions;\n if (extensions) {\n let data: ArrayBuffer | undefined;\n for (const ext of extensions) {\n data = await this.getDataByPath(`${path}${ext}`);\n if (data) {\n break;\n }\n }\n if (data) {\n return Buffer.from(data);\n }\n }\n }\n if (mode === 'raw') {\n const decompressedFile = await this.getDataByPath(`${path}.gz`);\n if (decompressedFile) {\n return Buffer.from(decompressedFile);\n }\n const fileWithoutCompression = await this.getFileBytes(path);\n if (fileWithoutCompression) {\n return Buffer.from(fileWithoutCompression);\n }\n }\n\n throw new Error('No such file in the archieve');\n }\n\n /**\n * returning uncompressed data for paths that ends with .gz and raw data for all other paths\n * @param path - path inside the archive\n * @returns buffer with the file data\n */\n private async getDataByPath(path: string): Promise<ArrayBuffer | undefined> {\n // sometimes paths are not in lower case when hash file is created,\n // so first we're looking for lower case file name and then for original one\n let data = await this.getFileBytes(path.toLocaleLowerCase());\n if (!data) {\n data = await this.getFileBytes(path);\n }\n if (!data) {\n return undefined;\n }\n if (/\\.gz$/.test(path)) {\n const compression = new GZipCompression();\n\n const decompressedData = await compression.decompress(data);\n return decompressedData;\n }\n return Buffer.from(data);\n }\n\n /**\n * Trying to get raw file data by adress\n * @param path - path inside the archive\n * @returns buffer with the raw file data\n */\n private async getFileBytes(path: string): Promise<ArrayBuffer | undefined> {\n const nameHash = Buffer.from(md5(path), 'hex');\n const fileInfo = findBin(nameHash, this.hashArray); // implement binary search\n if (!fileInfo) {\n return undefined;\n }\n\n const localFileHeader = await parseZipLocalFileHeader(fileInfo.offset, this.slpkArchive);\n if (!localFileHeader) {\n return undefined;\n }\n\n const compressedFile = this.slpkArchive.slice(\n localFileHeader.fileDataOffset,\n localFileHeader.fileDataOffset + localFileHeader.compressedSize\n );\n\n return compressedFile;\n }\n findBin(nameHash: Buffer) {\n throw new Error('Method not implemented.');\n }\n}\n"],"mappings":"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"}
|