@loaders.gl/i3s 4.0.0-alpha.10 → 4.0.0-alpha.11
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 +4500 -261
- 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 +1 -1
- package/dist/es5/index.js +14 -0
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js +25 -12
- package/dist/es5/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
- package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js +62 -33
- package/dist/es5/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
- package/dist/es5/lib/parsers/parse-zip/buffer-file-provider.js +46 -0
- package/dist/es5/lib/parsers/parse-zip/buffer-file-provider.js.map +1 -0
- package/dist/es5/lib/parsers/parse-zip/cd-file-header.js +75 -35
- package/dist/es5/lib/parsers/parse-zip/cd-file-header.js.map +1 -1
- package/dist/es5/lib/parsers/parse-zip/file-provider.js +2 -0
- package/dist/es5/lib/parsers/parse-zip/file-provider.js.map +1 -0
- package/dist/es5/lib/parsers/parse-zip/local-file-header.js +63 -17
- package/dist/es5/lib/parsers/parse-zip/local-file-header.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 +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js +8 -4
- package/dist/esm/lib/parsers/parse-slpk/parse-slpk.js.map +1 -1
- package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js +11 -12
- package/dist/esm/lib/parsers/parse-slpk/slpk-archieve.js.map +1 -1
- package/dist/esm/lib/parsers/parse-zip/buffer-file-provider.js +23 -0
- package/dist/esm/lib/parsers/parse-zip/buffer-file-provider.js.map +1 -0
- package/dist/esm/lib/parsers/parse-zip/cd-file-header.js +7 -7
- package/dist/esm/lib/parsers/parse-zip/cd-file-header.js.map +1 -1
- package/dist/esm/lib/parsers/parse-zip/file-provider.js +2 -0
- package/dist/esm/lib/parsers/parse-zip/file-provider.js.map +1 -0
- package/dist/esm/lib/parsers/parse-zip/local-file-header.js +16 -10
- package/dist/esm/lib/parsers/parse-zip/local-file-header.js.map +1 -1
- package/dist/i3s-content-worker-node.js +2 -2
- package/dist/i3s-content-worker.js +8 -8
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/lib/parsers/parse-slpk/parse-slpk.d.ts.map +1 -1
- package/dist/lib/parsers/parse-slpk/parse-slpk.js +8 -4
- package/dist/lib/parsers/parse-slpk/slpk-archieve.d.ts.map +1 -1
- package/dist/lib/parsers/parse-slpk/slpk-archieve.js +12 -12
- package/dist/lib/parsers/parse-zip/buffer-file-provider.d.ts +37 -0
- package/dist/lib/parsers/parse-zip/buffer-file-provider.d.ts.map +1 -0
- package/dist/lib/parsers/parse-zip/buffer-file-provider.js +47 -0
- package/dist/lib/parsers/parse-zip/cd-file-header.d.ts +9 -20
- package/dist/lib/parsers/parse-zip/cd-file-header.d.ts.map +1 -1
- package/dist/lib/parsers/parse-zip/cd-file-header.js +7 -7
- package/dist/lib/parsers/parse-zip/file-provider.d.ts +31 -0
- package/dist/lib/parsers/parse-zip/file-provider.d.ts.map +1 -0
- package/dist/lib/parsers/parse-zip/file-provider.js +2 -0
- package/dist/lib/parsers/parse-zip/local-file-header.d.ts +8 -13
- package/dist/lib/parsers/parse-zip/local-file-header.d.ts.map +1 -1
- package/dist/lib/parsers/parse-zip/local-file-header.js +16 -10
- package/package.json +9 -9
- package/src/index.ts +2 -0
- package/src/lib/parsers/parse-slpk/parse-slpk.ts +12 -4
- package/src/lib/parsers/parse-slpk/slpk-archieve.ts +14 -13
- package/src/lib/parsers/parse-zip/buffer-file-provider.ts +55 -0
- package/src/lib/parsers/parse-zip/cd-file-header.ts +25 -32
- package/src/lib/parsers/parse-zip/file-provider.ts +34 -0
- package/src/lib/parsers/parse-zip/local-file-header.ts +33 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cd-file-header.js","names":["parseZipCDFileHeader","headerOffset","buffer","offsets","CD_COMPRESSED_SIZE_OFFSET","CD_UNCOMPRESSED_SIZE_OFFSET","CD_FILE_NAME_LENGTH_OFFSET","CD_EXTRA_FIELD_LENGTH_OFFSET","CD_LOCAL_HEADER_OFFSET_OFFSET","CD_FILE_NAME_OFFSET","
|
|
1
|
+
{"version":3,"file":"cd-file-header.js","names":["parseZipCDFileHeader","_ref","_asyncToGenerator2","default","_regenerator","mark","_callee","headerOffset","buffer","offsets","compressedSize","uncompressedSize","fileNameLength","fileName","extraOffset","oldFormatOffset","fileDataOffset","offsetInZip64Data","localHeaderOffset","wrap","_callee$","_context","prev","next","CD_COMPRESSED_SIZE_OFFSET","CD_UNCOMPRESSED_SIZE_OFFSET","CD_FILE_NAME_LENGTH_OFFSET","CD_EXTRA_FIELD_LENGTH_OFFSET","CD_LOCAL_HEADER_OFFSET_OFFSET","CD_FILE_NAME_OFFSET","getUint32","sent","getUint16","t0","TextDecoder","slice","t1","decode","call","abrupt","stop","_x","_x2","apply","arguments","exports"],"sources":["../../../../../src/lib/parsers/parse-zip/cd-file-header.ts"],"sourcesContent":["import {FileProvider} from './file-provider';\n\n/**\n * zip central directory file header info\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipCDFileHeader = {\n /** Compressed size */\n compressedSize: number;\n /** Uncompressed size */\n uncompressedSize: number;\n /** File name length */\n fileNameLength: number;\n /** File name */\n fileName: string;\n /** Extra field offset */\n extraOffset: number;\n /** Relative offset of local file header */\n localHeaderOffset: number;\n};\n\n/**\n * Parses central directory file header of zip file\n * @param headerOffset - offset in the archive where header starts\n * @param buffer - buffer containing whole array\n * @returns Info from the header\n */\nexport const parseZipCDFileHeader = async (\n headerOffset: number,\n buffer: FileProvider\n): Promise<ZipCDFileHeader> => {\n const offsets = {\n CD_COMPRESSED_SIZE_OFFSET: 20,\n CD_UNCOMPRESSED_SIZE_OFFSET: 24,\n CD_FILE_NAME_LENGTH_OFFSET: 28,\n CD_EXTRA_FIELD_LENGTH_OFFSET: 30,\n CD_LOCAL_HEADER_OFFSET_OFFSET: 42,\n CD_FILE_NAME_OFFSET: 46\n };\n\n const compressedSize = await buffer.getUint32(headerOffset + offsets.CD_COMPRESSED_SIZE_OFFSET);\n\n const uncompressedSize = await buffer.getUint32(\n headerOffset + offsets.CD_UNCOMPRESSED_SIZE_OFFSET\n );\n\n const fileNameLength = await buffer.getUint16(headerOffset + offsets.CD_FILE_NAME_LENGTH_OFFSET);\n\n const fileName = new TextDecoder().decode(\n await buffer.slice(\n headerOffset + offsets.CD_FILE_NAME_OFFSET,\n headerOffset + offsets.CD_FILE_NAME_OFFSET + fileNameLength\n )\n );\n\n const extraOffset = headerOffset + offsets.CD_FILE_NAME_OFFSET + fileNameLength;\n\n const oldFormatOffset = await buffer.getUint32(\n headerOffset + offsets.CD_LOCAL_HEADER_OFFSET_OFFSET\n );\n\n let fileDataOffset = oldFormatOffset;\n if (fileDataOffset === 0xffffffff) {\n let offsetInZip64Data = 4;\n // looking for info that might be also be in zip64 extra field\n if (compressedSize === 0xffffffff) {\n offsetInZip64Data += 8;\n }\n if (uncompressedSize === 0xffffffff) {\n offsetInZip64Data += 8;\n }\n\n // getUint32 needs to be replaced with getBigUint64 for archieves bigger than 2gb\n fileDataOffset = await buffer.getUint32(extraOffset + offsetInZip64Data); // setting it to the one from zip64\n }\n const localHeaderOffset = fileDataOffset;\n\n return {\n compressedSize,\n uncompressedSize,\n fileNameLength,\n fileName,\n extraOffset,\n localHeaderOffset\n };\n};\n"],"mappings":";;;;;;;;;AA2BO,IAAMA,oBAAoB;EAAA,IAAAC,IAAA,OAAAC,kBAAA,CAAAC,OAAA,EAAAC,YAAA,CAAAD,OAAA,CAAAE,IAAA,CAAG,SAAAC,QAClCC,YAAoB,EACpBC,MAAoB;IAAA,IAAAC,OAAA,EAAAC,cAAA,EAAAC,gBAAA,EAAAC,cAAA,EAAAC,QAAA,EAAAC,WAAA,EAAAC,eAAA,EAAAC,cAAA,EAAAC,iBAAA,EAAAC,iBAAA;IAAA,OAAAd,YAAA,CAAAD,OAAA,CAAAgB,IAAA,UAAAC,SAAAC,QAAA;MAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;QAAA;UAEdd,OAAO,GAAG;YACde,yBAAyB,EAAE,EAAE;YAC7BC,2BAA2B,EAAE,EAAE;YAC/BC,0BAA0B,EAAE,EAAE;YAC9BC,4BAA4B,EAAE,EAAE;YAChCC,6BAA6B,EAAE,EAAE;YACjCC,mBAAmB,EAAE;UACvB,CAAC;UAAAR,QAAA,CAAAE,IAAA;UAAA,OAE4Bf,MAAM,CAACsB,SAAS,CAACvB,YAAY,GAAGE,OAAO,CAACe,yBAAyB,CAAC;QAAA;UAAzFd,cAAc,GAAAW,QAAA,CAAAU,IAAA;UAAAV,QAAA,CAAAE,IAAA;UAAA,OAEWf,MAAM,CAACsB,SAAS,CAC7CvB,YAAY,GAAGE,OAAO,CAACgB,2BACzB,CAAC;QAAA;UAFKd,gBAAgB,GAAAU,QAAA,CAAAU,IAAA;UAAAV,QAAA,CAAAE,IAAA;UAAA,OAIOf,MAAM,CAACwB,SAAS,CAACzB,YAAY,GAAGE,OAAO,CAACiB,0BAA0B,CAAC;QAAA;UAA1Fd,cAAc,GAAAS,QAAA,CAAAU,IAAA;UAAAV,QAAA,CAAAY,EAAA,GAEH,IAAIC,WAAW,CAAC,CAAC;UAAAb,QAAA,CAAAE,IAAA;UAAA,OAC1Bf,MAAM,CAAC2B,KAAK,CAChB5B,YAAY,GAAGE,OAAO,CAACoB,mBAAmB,EAC1CtB,YAAY,GAAGE,OAAO,CAACoB,mBAAmB,GAAGjB,cAC/C,CAAC;QAAA;UAAAS,QAAA,CAAAe,EAAA,GAAAf,QAAA,CAAAU,IAAA;UAJGlB,QAAQ,GAAAQ,QAAA,CAAAY,EAAA,CAAqBI,MAAM,CAAAC,IAAA,CAAAjB,QAAA,CAAAY,EAAA,EAAAZ,QAAA,CAAAe,EAAA;UAOnCtB,WAAW,GAAGP,YAAY,GAAGE,OAAO,CAACoB,mBAAmB,GAAGjB,cAAc;UAAAS,QAAA,CAAAE,IAAA;UAAA,OAEjDf,MAAM,CAACsB,SAAS,CAC5CvB,YAAY,GAAGE,OAAO,CAACmB,6BACzB,CAAC;QAAA;UAFKb,eAAe,GAAAM,QAAA,CAAAU,IAAA;UAIjBf,cAAc,GAAGD,eAAe;UAAA,MAChCC,cAAc,KAAK,UAAU;YAAAK,QAAA,CAAAE,IAAA;YAAA;UAAA;UAC3BN,iBAAiB,GAAG,CAAC;UAEzB,IAAIP,cAAc,KAAK,UAAU,EAAE;YACjCO,iBAAiB,IAAI,CAAC;UACxB;UACA,IAAIN,gBAAgB,KAAK,UAAU,EAAE;YACnCM,iBAAiB,IAAI,CAAC;UACxB;UAACI,QAAA,CAAAE,IAAA;UAAA,OAGsBf,MAAM,CAACsB,SAAS,CAAChB,WAAW,GAAGG,iBAAiB,CAAC;QAAA;UAAxED,cAAc,GAAAK,QAAA,CAAAU,IAAA;QAAA;UAEVb,iBAAiB,GAAGF,cAAc;UAAA,OAAAK,QAAA,CAAAkB,MAAA,WAEjC;YACL7B,cAAc,EAAdA,cAAc;YACdC,gBAAgB,EAAhBA,gBAAgB;YAChBC,cAAc,EAAdA,cAAc;YACdC,QAAQ,EAARA,QAAQ;YACRC,WAAW,EAAXA,WAAW;YACXI,iBAAiB,EAAjBA;UACF,CAAC;QAAA;QAAA;UAAA,OAAAG,QAAA,CAAAmB,IAAA;MAAA;IAAA,GAAAlC,OAAA;EAAA,CACF;EAAA,gBA1DYN,oBAAoBA,CAAAyC,EAAA,EAAAC,GAAA;IAAA,OAAAzC,IAAA,CAAA0C,KAAA,OAAAC,SAAA;EAAA;AAAA,GA0DhC;AAACC,OAAA,CAAA7C,oBAAA,GAAAA,oBAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-provider.js","names":[],"sources":["../../../../../src/lib/parsers/parse-zip/file-provider.ts"],"sourcesContent":["/**\n * Interface for providing file data\n */\nexport interface FileProvider {\n /**\n * Gets an unsigned 8-bit integer at the specified byte offset from the start of the file.\n * @param offset The offset, in bytes, from the start of the file where to read the data.\n */\n getUint8(offset: number): Promise<number>;\n\n /**\n * Gets an unsigned 16-bit integer at the specified byte offset from the start of the file.\n * @param offset The offset, in bytes, from the start of the file where to read the data.\n */\n getUint16(offset: number): Promise<number>;\n\n /**\n * Gets an unsigned 32-bit integer at the specified byte offset from the start of the file.\n * @param offset The offset, in bytes, from the file of the view where to read the data.\n */\n getUint32(offset: number): Promise<number>;\n\n /**\n * returns an ArrayBuffer whose contents are a copy of this file bytes from startOffset, inclusive, up to endOffset, exclusive.\n * @param startOffset The offset, in bytes, from the start of the file where to start reading the data.\n * @param endOffset The offset, in bytes, from the start of the file where to end reading the data.\n */\n slice(startOffset: number, endOffset: number): Promise<ArrayBuffer>;\n\n /**\n * the length (in bytes) of the data.\n */\n length: number;\n}\n"],"mappings":""}
|
|
@@ -1,26 +1,72 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
7
|
exports.parseZipLocalFileHeader = void 0;
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
var fileNameLength = buffer.getUint16(headerOffset + offsets.FILE_NAME_LENGTH_OFFSET, true);
|
|
15
|
-
var extraFieldLength = buffer.getUint16(headerOffset + offsets.EXTRA_FIELD_LENGTH_OFFSET, true);
|
|
16
|
-
var fileDataOffset = headerOffset + offsets.FILE_NAME_OFFSET + fileNameLength + extraFieldLength;
|
|
17
|
-
var compressedSize = buffer.getUint32(headerOffset + offsets.COMPRESSED_SIZE_OFFSET, true);
|
|
18
|
-
return {
|
|
19
|
-
fileNameLength: fileNameLength,
|
|
20
|
-
extraFieldLength: extraFieldLength,
|
|
21
|
-
fileDataOffset: fileDataOffset,
|
|
22
|
-
compressedSize: compressedSize
|
|
23
|
-
};
|
|
8
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
9
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
10
|
+
var offsets = {
|
|
11
|
+
COMPRESSED_SIZE_OFFSET: 18,
|
|
12
|
+
FILE_NAME_LENGTH_OFFSET: 26,
|
|
13
|
+
EXTRA_FIELD_LENGTH_OFFSET: 28,
|
|
14
|
+
FILE_NAME_OFFSET: 30
|
|
24
15
|
};
|
|
16
|
+
var signature = Buffer.from([0x50, 0x4b, 0x03, 0x04]);
|
|
17
|
+
var parseZipLocalFileHeader = function () {
|
|
18
|
+
var _ref = (0, _asyncToGenerator2.default)(_regenerator.default.mark(function _callee(headerOffset, buffer) {
|
|
19
|
+
var fileNameLength, fileName, extraFieldLength, fileDataOffset, compressedSize;
|
|
20
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
21
|
+
while (1) switch (_context.prev = _context.next) {
|
|
22
|
+
case 0:
|
|
23
|
+
_context.t0 = Buffer;
|
|
24
|
+
_context.next = 3;
|
|
25
|
+
return buffer.slice(headerOffset, headerOffset + 4);
|
|
26
|
+
case 3:
|
|
27
|
+
_context.t1 = _context.sent;
|
|
28
|
+
_context.t2 = _context.t0.from.call(_context.t0, _context.t1).compare(signature);
|
|
29
|
+
if (!(_context.t2 !== 0)) {
|
|
30
|
+
_context.next = 7;
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
return _context.abrupt("return", Promise.resolve(undefined));
|
|
34
|
+
case 7:
|
|
35
|
+
_context.next = 9;
|
|
36
|
+
return buffer.getUint16(headerOffset + offsets.FILE_NAME_LENGTH_OFFSET);
|
|
37
|
+
case 9:
|
|
38
|
+
fileNameLength = _context.sent;
|
|
39
|
+
_context.t3 = new TextDecoder();
|
|
40
|
+
_context.next = 13;
|
|
41
|
+
return buffer.slice(headerOffset + offsets.FILE_NAME_OFFSET, headerOffset + offsets.FILE_NAME_OFFSET + fileNameLength);
|
|
42
|
+
case 13:
|
|
43
|
+
_context.t4 = _context.sent;
|
|
44
|
+
fileName = _context.t3.decode.call(_context.t3, _context.t4);
|
|
45
|
+
_context.next = 17;
|
|
46
|
+
return buffer.getUint16(headerOffset + offsets.EXTRA_FIELD_LENGTH_OFFSET);
|
|
47
|
+
case 17:
|
|
48
|
+
extraFieldLength = _context.sent;
|
|
49
|
+
fileDataOffset = headerOffset + offsets.FILE_NAME_OFFSET + fileNameLength + extraFieldLength;
|
|
50
|
+
_context.next = 21;
|
|
51
|
+
return buffer.getUint32(headerOffset + offsets.COMPRESSED_SIZE_OFFSET);
|
|
52
|
+
case 21:
|
|
53
|
+
compressedSize = _context.sent;
|
|
54
|
+
return _context.abrupt("return", {
|
|
55
|
+
fileNameLength: fileNameLength,
|
|
56
|
+
fileName: fileName,
|
|
57
|
+
extraFieldLength: extraFieldLength,
|
|
58
|
+
fileDataOffset: fileDataOffset,
|
|
59
|
+
compressedSize: compressedSize
|
|
60
|
+
});
|
|
61
|
+
case 23:
|
|
62
|
+
case "end":
|
|
63
|
+
return _context.stop();
|
|
64
|
+
}
|
|
65
|
+
}, _callee);
|
|
66
|
+
}));
|
|
67
|
+
return function parseZipLocalFileHeader(_x, _x2) {
|
|
68
|
+
return _ref.apply(this, arguments);
|
|
69
|
+
};
|
|
70
|
+
}();
|
|
25
71
|
exports.parseZipLocalFileHeader = parseZipLocalFileHeader;
|
|
26
72
|
//# sourceMappingURL=local-file-header.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-file-header.js","names":["parseZipLocalFileHeader","
|
|
1
|
+
{"version":3,"file":"local-file-header.js","names":["offsets","COMPRESSED_SIZE_OFFSET","FILE_NAME_LENGTH_OFFSET","EXTRA_FIELD_LENGTH_OFFSET","FILE_NAME_OFFSET","signature","Buffer","from","parseZipLocalFileHeader","_ref","_asyncToGenerator2","default","_regenerator","mark","_callee","headerOffset","buffer","fileNameLength","fileName","extraFieldLength","fileDataOffset","compressedSize","wrap","_callee$","_context","prev","next","t0","slice","t1","sent","t2","call","compare","abrupt","Promise","resolve","undefined","getUint16","t3","TextDecoder","t4","decode","getUint32","stop","_x","_x2","apply","arguments","exports"],"sources":["../../../../../src/lib/parsers/parse-zip/local-file-header.ts"],"sourcesContent":["import {FileProvider} from './file-provider';\n\n/**\n * zip local file header info\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipLocalFileHeader = {\n /** File name length */\n fileNameLength: number;\n /** File name */\n fileName: string;\n /** Extra field length */\n extraFieldLength: number;\n /** Offset of the file data */\n fileDataOffset: number;\n /** Compressed size */\n compressedSize: number;\n};\n\nconst offsets = {\n COMPRESSED_SIZE_OFFSET: 18,\n FILE_NAME_LENGTH_OFFSET: 26,\n EXTRA_FIELD_LENGTH_OFFSET: 28,\n FILE_NAME_OFFSET: 30\n};\n\nconst signature = Buffer.from([0x50, 0x4b, 0x03, 0x04]);\n\n/**\n * Parses local file header of zip file\n * @param headerOffset - offset in the archive where header starts\n * @param buffer - buffer containing whole array\n * @returns Info from the header\n */\nexport const parseZipLocalFileHeader = async (\n headerOffset: number,\n buffer: FileProvider\n): Promise<ZipLocalFileHeader | undefined> => {\n if (Buffer.from(await buffer.slice(headerOffset, headerOffset + 4)).compare(signature) !== 0) {\n return Promise.resolve(undefined);\n }\n\n const fileNameLength = await buffer.getUint16(headerOffset + offsets.FILE_NAME_LENGTH_OFFSET);\n\n const fileName = new TextDecoder().decode(\n await buffer.slice(\n headerOffset + offsets.FILE_NAME_OFFSET,\n headerOffset + offsets.FILE_NAME_OFFSET + fileNameLength\n )\n );\n const extraFieldLength = await buffer.getUint16(headerOffset + offsets.EXTRA_FIELD_LENGTH_OFFSET);\n\n const fileDataOffset =\n headerOffset + offsets.FILE_NAME_OFFSET + fileNameLength + extraFieldLength;\n\n const compressedSize = await buffer.getUint32(headerOffset + offsets.COMPRESSED_SIZE_OFFSET);\n\n return {\n fileNameLength,\n fileName,\n extraFieldLength,\n fileDataOffset,\n compressedSize\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { parseWebscene } from './lib/parsers/parse-arcgis-webscene';
|
|
2
|
-
const VERSION = typeof "4.0.0-alpha.
|
|
2
|
+
const VERSION = typeof "4.0.0-alpha.11" !== 'undefined' ? "4.0.0-alpha.11" : 'beta';
|
|
3
3
|
export const ArcGisWebSceneLoader = {
|
|
4
4
|
name: 'ArcGIS Web Scene Loader',
|
|
5
5
|
id: 'arcgis-web-scene',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { load } from '@loaders.gl/core';
|
|
2
2
|
import { parseI3STileAttribute } from './lib/parsers/parse-i3s-attribute';
|
|
3
3
|
import { getUrlWithToken } from './lib/utils/url-utils';
|
|
4
|
-
const VERSION = typeof "4.0.0-alpha.
|
|
4
|
+
const VERSION = typeof "4.0.0-alpha.11" !== 'undefined' ? "4.0.0-alpha.11" : 'latest';
|
|
5
5
|
const EMPTY_VALUE = '';
|
|
6
6
|
const REJECTED_STATUS = 'rejected';
|
|
7
7
|
export const I3SAttributeLoader = {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { parseBuildingSceneLayer } from './lib/parsers/parse-i3s-building-scene-layer';
|
|
2
|
-
const VERSION = typeof "4.0.0-alpha.
|
|
2
|
+
const VERSION = typeof "4.0.0-alpha.11" !== 'undefined' ? "4.0.0-alpha.11" : 'beta';
|
|
3
3
|
export const I3SBuildingSceneLayerLoader = {
|
|
4
4
|
name: 'I3S Building Scene Layer',
|
|
5
5
|
id: 'i3s-building-scene-layer',
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { parseI3STileContent } from './lib/parsers/parse-i3s-tile-content';
|
|
2
|
-
const VERSION = typeof "4.0.0-alpha.
|
|
2
|
+
const VERSION = typeof "4.0.0-alpha.11" !== 'undefined' ? "4.0.0-alpha.11" : 'beta';
|
|
3
3
|
export const I3SContentLoader = {
|
|
4
4
|
name: 'I3S Content (Indexed Scene Layers)',
|
|
5
5
|
id: 'i3s-content',
|
package/dist/esm/i3s-loader.js
CHANGED
|
@@ -2,7 +2,7 @@ import { parse } from '@loaders.gl/core';
|
|
|
2
2
|
import { I3SContentLoader } from './i3s-content-loader';
|
|
3
3
|
import { normalizeTileData, normalizeTilesetData } from './lib/parsers/parse-i3s';
|
|
4
4
|
import { COORDINATE_SYSTEM } from './lib/parsers/constants';
|
|
5
|
-
const VERSION = typeof "4.0.0-alpha.
|
|
5
|
+
const VERSION = typeof "4.0.0-alpha.11" !== 'undefined' ? "4.0.0-alpha.11" : 'latest';
|
|
6
6
|
const TILESET_REGEX = /layers\/[0-9]+$/;
|
|
7
7
|
const TILE_HEADER_REGEX = /nodes\/([0-9-]+|root)$/;
|
|
8
8
|
const SLPK_HEX = '504b0304';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const VERSION = typeof "4.0.0-alpha.
|
|
1
|
+
const VERSION = typeof "4.0.0-alpha.11" !== 'undefined' ? "4.0.0-alpha.11" : 'latest';
|
|
2
2
|
async function parseNodePage(data, options) {
|
|
3
3
|
return JSON.parse(new TextDecoder().decode(data));
|
|
4
4
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { parseSLPK } from './lib/parsers/parse-slpk/parse-slpk';
|
|
2
|
-
const VERSION = typeof "4.0.0-alpha.
|
|
2
|
+
const VERSION = typeof "4.0.0-alpha.11" !== 'undefined' ? "4.0.0-alpha.11" : 'latest';
|
|
3
3
|
export const SLPKLoader = {
|
|
4
4
|
name: 'I3S SLPK (Scene Layer Package)',
|
|
5
5
|
id: 'slpk',
|
package/dist/esm/index.js
CHANGED
|
@@ -6,4 +6,6 @@ export { I3SAttributeLoader, loadFeatureAttributes } from './i3s-attribute-loade
|
|
|
6
6
|
export { I3SBuildingSceneLayerLoader } from './i3s-building-scene-layer-loader';
|
|
7
7
|
export { I3SNodePageLoader } from './i3s-node-page-loader';
|
|
8
8
|
export { ArcGisWebSceneLoader } from './arcgis-webscene-loader';
|
|
9
|
+
export { parseZipLocalFileHeader } from './lib/parsers/parse-zip/local-file-header';
|
|
10
|
+
export { FileProvider } from './lib/parsers/parse-zip/file-provider';
|
|
9
11
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["COORDINATE_SYSTEM","I3SLoader","SLPKLoader","I3SContentLoader","I3SAttributeLoader","loadFeatureAttributes","I3SBuildingSceneLayerLoader","I3SNodePageLoader","ArcGisWebSceneLoader"],"sources":["../../src/index.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nexport type {\n BoundingVolumes,\n Mbs,\n Obb,\n SceneLayer3D,\n AttributeStorageInfo,\n Field,\n ESRIField,\n PopupInfo,\n Node3DIndexDocument,\n LodSelection,\n NodeReference,\n Resource,\n MaxScreenThresholdSQ,\n NodeInPage,\n SharedResources,\n Attribute,\n Extent,\n FeatureAttribute,\n FieldInfo,\n I3SMaterialDefinition,\n TextureDefinitionInfo,\n MaterialDefinitionInfo,\n FullExtent,\n StatisticsInfo,\n StatsInfo,\n Histogram,\n ValueCount,\n BuildingSceneSublayer,\n DATA_TYPE,\n OperationalLayer,\n TextureSetDefinitionFormats\n} from './types';\n\nexport {COORDINATE_SYSTEM} from './lib/parsers/constants';\n\nexport {I3SLoader} from './i3s-loader';\nexport {SLPKLoader} from './i3s-slpk-loader';\nexport {I3SContentLoader} from './i3s-content-loader';\nexport {I3SAttributeLoader, loadFeatureAttributes} from './i3s-attribute-loader';\nexport {I3SBuildingSceneLayerLoader} from './i3s-building-scene-layer-loader';\nexport {I3SNodePageLoader} from './i3s-node-page-loader';\nexport {ArcGisWebSceneLoader} from './arcgis-webscene-loader';\n"],"mappings":"AAoCA,SAAQA,iBAAiB,QAAO,yBAAyB;AAEzD,SAAQC,SAAS,QAAO,cAAc;AACtC,SAAQC,UAAU,QAAO,mBAAmB;AAC5C,SAAQC,gBAAgB,QAAO,sBAAsB;AACrD,SAAQC,kBAAkB,EAAEC,qBAAqB,QAAO,wBAAwB;AAChF,SAAQC,2BAA2B,QAAO,mCAAmC;AAC7E,SAAQC,iBAAiB,QAAO,wBAAwB;AACxD,SAAQC,oBAAoB,QAAO,0BAA0B"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["COORDINATE_SYSTEM","I3SLoader","SLPKLoader","I3SContentLoader","I3SAttributeLoader","loadFeatureAttributes","I3SBuildingSceneLayerLoader","I3SNodePageLoader","ArcGisWebSceneLoader","parseZipLocalFileHeader","FileProvider"],"sources":["../../src/index.ts"],"sourcesContent":["// loaders.gl, MIT license\n\nexport type {\n BoundingVolumes,\n Mbs,\n Obb,\n SceneLayer3D,\n AttributeStorageInfo,\n Field,\n ESRIField,\n PopupInfo,\n Node3DIndexDocument,\n LodSelection,\n NodeReference,\n Resource,\n MaxScreenThresholdSQ,\n NodeInPage,\n SharedResources,\n Attribute,\n Extent,\n FeatureAttribute,\n FieldInfo,\n I3SMaterialDefinition,\n TextureDefinitionInfo,\n MaterialDefinitionInfo,\n FullExtent,\n StatisticsInfo,\n StatsInfo,\n Histogram,\n ValueCount,\n BuildingSceneSublayer,\n DATA_TYPE,\n OperationalLayer,\n TextureSetDefinitionFormats\n} from './types';\n\nexport {COORDINATE_SYSTEM} from './lib/parsers/constants';\n\nexport {I3SLoader} from './i3s-loader';\nexport {SLPKLoader} from './i3s-slpk-loader';\nexport {I3SContentLoader} from './i3s-content-loader';\nexport {I3SAttributeLoader, loadFeatureAttributes} from './i3s-attribute-loader';\nexport {I3SBuildingSceneLayerLoader} from './i3s-building-scene-layer-loader';\nexport {I3SNodePageLoader} from './i3s-node-page-loader';\nexport {ArcGisWebSceneLoader} from './arcgis-webscene-loader';\nexport {parseZipLocalFileHeader} from './lib/parsers/parse-zip/local-file-header';\nexport {FileProvider} from './lib/parsers/parse-zip/file-provider';\n"],"mappings":"AAoCA,SAAQA,iBAAiB,QAAO,yBAAyB;AAEzD,SAAQC,SAAS,QAAO,cAAc;AACtC,SAAQC,UAAU,QAAO,mBAAmB;AAC5C,SAAQC,gBAAgB,QAAO,sBAAsB;AACrD,SAAQC,kBAAkB,EAAEC,qBAAqB,QAAO,wBAAwB;AAChF,SAAQC,2BAA2B,QAAO,mCAAmC;AAC7E,SAAQC,iBAAiB,QAAO,wBAAwB;AACxD,SAAQC,oBAAoB,QAAO,0BAA0B;AAC7D,SAAQC,uBAAuB,QAAO,2CAA2C;AACjF,SAAQC,YAAY,QAAO,uCAAuC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { DataViewFileProvider } from '../parse-zip/buffer-file-provider';
|
|
1
2
|
import { parseZipCDFileHeader } from '../parse-zip/cd-file-header';
|
|
2
3
|
import { parseZipLocalFileHeader } from '../parse-zip/local-file-header';
|
|
3
4
|
import { SLPKArchive } from './slpk-archieve';
|
|
@@ -21,12 +22,15 @@ export async function parseSLPK(data) {
|
|
|
21
22
|
break;
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
if (
|
|
25
|
+
const fileProvider = new DataViewFileProvider(archive);
|
|
26
|
+
const cdFileHeader = await parseZipCDFileHeader(hashCDOffset, fileProvider);
|
|
27
|
+
if (cdFileHeader.fileName !== '@specialIndexFileHASH128@') {
|
|
28
|
+
throw new Error('No hash file in slpk');
|
|
29
|
+
}
|
|
30
|
+
const localFileHeader = await parseZipLocalFileHeader(cdFileHeader.localHeaderOffset, fileProvider);
|
|
31
|
+
if (!localFileHeader) {
|
|
27
32
|
throw new Error('No hash file in slpk');
|
|
28
33
|
}
|
|
29
|
-
const localFileHeader = parseZipLocalFileHeader(cdFileHeader.localHeaderOffset, archive);
|
|
30
34
|
const fileDataOffset = localFileHeader.fileDataOffset;
|
|
31
35
|
const hashFile = archive.buffer.slice(fileDataOffset, fileDataOffset + localFileHeader.compressedSize);
|
|
32
36
|
if (!hashFile) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-slpk.js","names":["parseZipCDFileHeader","parseZipLocalFileHeader","SLPKArchive","getByteAt","offset","buffer","getUint8","byteOffset","parseSLPK","data","_options$slpk$path","_options$slpk","_options$slpk2","options","arguments","length","undefined","archive","DataView","cdFileHeaderSignature","searchWindow","byteLength","hashCDOffset","i","every","val","index","
|
|
1
|
+
{"version":3,"file":"parse-slpk.js","names":["DataViewFileProvider","parseZipCDFileHeader","parseZipLocalFileHeader","SLPKArchive","getByteAt","offset","buffer","getUint8","byteOffset","parseSLPK","data","_options$slpk$path","_options$slpk","_options$slpk2","options","arguments","length","undefined","archive","DataView","cdFileHeaderSignature","searchWindow","byteLength","hashCDOffset","i","every","val","index","fileProvider","cdFileHeader","fileName","Error","localFileHeader","localHeaderOffset","fileDataOffset","hashFile","slice","compressedSize","getFile","slpk","path","pathMode"],"sources":["../../../../../src/lib/parsers/parse-slpk/parse-slpk.ts"],"sourcesContent":["import type {SLPKLoaderOptions} from '../../../i3s-slpk-loader';\nimport {DataViewFileProvider} from '../parse-zip/buffer-file-provider';\nimport {parseZipCDFileHeader} from '../parse-zip/cd-file-header';\nimport {parseZipLocalFileHeader} from '../parse-zip/local-file-header';\nimport {SLPKArchive} from './slpk-archieve';\n\n/**\n * Returns one byte from the provided buffer at the provided position\n * @param offset - position where to read\n * @param buffer - buffer to read\n * @returns one byte from the provided buffer at the provided position\n */\nconst getByteAt = (offset: number, buffer: DataView): number => {\n return buffer.getUint8(buffer.byteOffset + offset);\n};\n\nexport async function parseSLPK(data: ArrayBuffer, options: SLPKLoaderOptions = {}) {\n const archive = new DataView(data);\n const cdFileHeaderSignature = [80, 75, 1, 2];\n\n const searchWindow = [\n getByteAt(archive.byteLength - 1, archive),\n getByteAt(archive.byteLength - 2, archive),\n getByteAt(archive.byteLength - 3, archive),\n undefined\n ];\n\n let hashCDOffset = 0;\n\n // looking for the last record in the central directory\n for (let i = archive.byteLength - 4; i > -1; i--) {\n searchWindow[3] = searchWindow[2];\n searchWindow[2] = searchWindow[1];\n searchWindow[1] = searchWindow[0];\n searchWindow[0] = getByteAt(i, archive);\n if (searchWindow.every((val, index) => val === cdFileHeaderSignature[index])) {\n hashCDOffset = i;\n break;\n }\n }\n\n const fileProvider = new DataViewFileProvider(archive);\n\n const cdFileHeader = await parseZipCDFileHeader(hashCDOffset, fileProvider);\n\n if (cdFileHeader.fileName !== '@specialIndexFileHASH128@') {\n throw new Error('No hash file in slpk');\n }\n\n const localFileHeader = await parseZipLocalFileHeader(\n cdFileHeader.localHeaderOffset,\n fileProvider\n );\n if (!localFileHeader) {\n throw new Error('No hash file in slpk');\n }\n\n const fileDataOffset = localFileHeader.fileDataOffset;\n const hashFile = archive.buffer.slice(\n fileDataOffset,\n fileDataOffset + localFileHeader.compressedSize\n );\n\n if (!hashFile) {\n throw new Error('No hash file in slpk');\n }\n\n return await new SLPKArchive(data, hashFile).getFile(\n options.slpk?.path ?? '',\n options.slpk?.pathMode\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
-
import { processOnWorker } from '@loaders.gl/worker-utils';
|
|
3
2
|
import md5 from 'md5';
|
|
4
|
-
import { CompressionWorker } from '@loaders.gl/compression';
|
|
5
3
|
import { parseZipLocalFileHeader } from '../parse-zip/local-file-header';
|
|
4
|
+
import { DataViewFileProvider } from '../parse-zip/buffer-file-provider';
|
|
5
|
+
import { GZipCompression } from '@loaders.gl/compression';
|
|
6
6
|
const PATH_DESCRIPTIONS = [{
|
|
7
7
|
test: /^$/,
|
|
8
8
|
extensions: ['3dSceneLayer.json.gz']
|
|
@@ -71,7 +71,7 @@ export class SLPKArchive {
|
|
|
71
71
|
if (decompressedFile) {
|
|
72
72
|
return Buffer.from(decompressedFile);
|
|
73
73
|
}
|
|
74
|
-
const fileWithoutCompression = this.getFileBytes(path);
|
|
74
|
+
const fileWithoutCompression = await this.getFileBytes(path);
|
|
75
75
|
if (fileWithoutCompression) {
|
|
76
76
|
return Buffer.from(fileWithoutCompression);
|
|
77
77
|
}
|
|
@@ -79,28 +79,27 @@ export class SLPKArchive {
|
|
|
79
79
|
throw new Error('No such file in the archieve');
|
|
80
80
|
}
|
|
81
81
|
async getDataByPath(path) {
|
|
82
|
-
const data = this.getFileBytes(path);
|
|
82
|
+
const data = await this.getFileBytes(path);
|
|
83
83
|
if (!data) {
|
|
84
84
|
return undefined;
|
|
85
85
|
}
|
|
86
86
|
if (/\.gz$/.test(path)) {
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
operation: 'decompress',
|
|
90
|
-
_workerType: 'test',
|
|
91
|
-
gzip: {}
|
|
92
|
-
});
|
|
87
|
+
const compression = new GZipCompression();
|
|
88
|
+
const decompressedData = await compression.decompress(data);
|
|
93
89
|
return decompressedData;
|
|
94
90
|
}
|
|
95
91
|
return Buffer.from(data);
|
|
96
92
|
}
|
|
97
|
-
getFileBytes(path) {
|
|
93
|
+
async getFileBytes(path) {
|
|
98
94
|
const nameHash = Buffer.from(md5(path), 'hex');
|
|
99
95
|
const fileInfo = this.hashArray.find(val => Buffer.compare(val.hash, nameHash) === 0);
|
|
100
96
|
if (!fileInfo) {
|
|
101
97
|
return undefined;
|
|
102
98
|
}
|
|
103
|
-
const localFileHeader = parseZipLocalFileHeader(this.slpkArchive.byteOffset + (fileInfo === null || fileInfo === void 0 ? void 0 : fileInfo.offset), this.slpkArchive);
|
|
99
|
+
const localFileHeader = await parseZipLocalFileHeader(this.slpkArchive.byteOffset + (fileInfo === null || fileInfo === void 0 ? void 0 : fileInfo.offset), new DataViewFileProvider(this.slpkArchive));
|
|
100
|
+
if (!localFileHeader) {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
104
103
|
const compressedFile = this.slpkArchive.buffer.slice(localFileHeader.fileDataOffset, localFileHeader.fileDataOffset + localFileHeader.compressedSize);
|
|
105
104
|
return compressedFile;
|
|
106
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slpk-archieve.js","names":["
|
|
1
|
+
{"version":3,"file":"slpk-archieve.js","names":["md5","parseZipLocalFileHeader","DataViewFileProvider","GZipCompression","PATH_DESCRIPTIONS","test","extensions","SLPKArchive","constructor","slpkArchiveBuffer","hashFile","_defineProperty","slpkArchive","DataView","hashArray","parseHashFile","hashFileBuffer","Buffer","from","i","buffer","byteLength","offsetBuffer","slice","byteOffset","offset","getUint32","push","hash","subarray","getFile","path","mode","arguments","length","undefined","_PATH_DESCRIPTIONS$fi","find","val","data","ext","getDataByPath","concat","decompressedFile","fileWithoutCompression","getFileBytes","Error","compression","decompressedData","decompress","nameHash","fileInfo","compare","localFileHeader","compressedFile","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 {DataViewFileProvider} from '../parse-zip/buffer-file-provider';\nimport {GZipCompression} from '@loaders.gl/compression';\n\n/** Element of hash array */\ntype HashElement = {\n /**\n * File name hash\n */\n hash: Buffer;\n /**\n * File offset in the archive\n */\n offset: number;\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+$/,\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 slpkArchive: DataView;\n hashArray: {hash: Buffer; offset: number}[];\n constructor(slpkArchiveBuffer: ArrayBuffer, hashFile: ArrayBuffer) {\n this.slpkArchive = new DataView(slpkArchiveBuffer);\n this.hashArray = this.parseHashFile(hashFile);\n }\n\n /**\n * Reads hash file from buffer and returns it in ready-to-use form\n * @param hashFile - bufer containing hash file\n * @returns Array containing file info\n */\n private parseHashFile(hashFile: ArrayBuffer): HashElement[] {\n const hashFileBuffer = Buffer.from(hashFile);\n const hashArray: HashElement[] = [];\n for (let i = 0; i < hashFileBuffer.buffer.byteLength; i = i + 24) {\n const offsetBuffer = new DataView(\n hashFileBuffer.buffer.slice(\n hashFileBuffer.byteOffset + i + 16,\n hashFileBuffer.byteOffset + i + 24\n )\n );\n const offset = offsetBuffer.getUint32(offsetBuffer.byteOffset, true);\n hashArray.push({\n hash: Buffer.from(\n hashFileBuffer.subarray(hashFileBuffer.byteOffset + i, hashFileBuffer.byteOffset + i + 16)\n ),\n offset\n });\n }\n return hashArray;\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 const data = await this.getFileBytes(path);\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.hashArray.find((val) => Buffer.compare(val.hash, nameHash) === 0);\n if (!fileInfo) {\n return undefined;\n }\n\n const localFileHeader = await parseZipLocalFileHeader(\n this.slpkArchive.byteOffset + fileInfo?.offset,\n new DataViewFileProvider(this.slpkArchive)\n );\n if (!localFileHeader) {\n return undefined;\n }\n\n const compressedFile = this.slpkArchive.buffer.slice(\n localFileHeader.fileDataOffset,\n localFileHeader.fileDataOffset + localFileHeader.compressedSize\n );\n\n return compressedFile;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
export class DataViewFileProvider {
|
|
3
|
+
constructor(file) {
|
|
4
|
+
_defineProperty(this, "file", void 0);
|
|
5
|
+
this.file = file;
|
|
6
|
+
}
|
|
7
|
+
getUint8(offset) {
|
|
8
|
+
return Promise.resolve(this.file.getUint8(offset));
|
|
9
|
+
}
|
|
10
|
+
getUint16(offset) {
|
|
11
|
+
return Promise.resolve(this.file.getUint16(offset, true));
|
|
12
|
+
}
|
|
13
|
+
getUint32(offset) {
|
|
14
|
+
return Promise.resolve(this.file.getUint32(offset, true));
|
|
15
|
+
}
|
|
16
|
+
slice(startOffset, endOffset) {
|
|
17
|
+
return Promise.resolve(this.file.buffer.slice(startOffset, endOffset));
|
|
18
|
+
}
|
|
19
|
+
get length() {
|
|
20
|
+
return this.file.byteLength;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=buffer-file-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffer-file-provider.js","names":["DataViewFileProvider","constructor","file","_defineProperty","getUint8","offset","Promise","resolve","getUint16","getUint32","slice","startOffset","endOffset","buffer","length","byteLength"],"sources":["../../../../../src/lib/parsers/parse-zip/buffer-file-provider.ts"],"sourcesContent":["import {FileProvider} from './file-provider';\n\n/**\n * Provides file data using DataView\n */\nexport class DataViewFileProvider implements FileProvider {\n /**\n * The DataView from which data is provided\n */\n private file: DataView;\n\n constructor(file: DataView) {\n this.file = file;\n }\n\n /**\n * Gets an unsigned 8-bit integer at the specified byte offset from the start of the file.\n * @param offset The offset, in bytes, from the start of the file where to read the data.\n */\n getUint8(offset: number): Promise<number> {\n return Promise.resolve(this.file.getUint8(offset));\n }\n\n /**\n * Gets an unsigned 16-bit integer at the specified byte offset from the start of the file.\n * @param offset The offset, in bytes, from the start of the file where to read the data.\n */\n getUint16(offset: number): Promise<number> {\n return Promise.resolve(this.file.getUint16(offset, true));\n }\n\n /**\n * Gets an unsigned 32-bit integer at the specified byte offset from the start of the file.\n * @param offset The offset, in bytes, from the start of the file where to read the data.\n */\n getUint32(offset: number): Promise<number> {\n return Promise.resolve(this.file.getUint32(offset, true));\n }\n\n /**\n * returns an ArrayBuffer whose contents are a copy of this file bytes from startOffset, inclusive, up to endOffset, exclusive.\n * @param startOffset The offset, in bytes, from the start of the file where to start reading the data.\n * @param endOffset The offset, in bytes, from the start of the file where to end reading the data.\n */\n slice(startOffset: number, endOffset: number): Promise<ArrayBuffer> {\n return Promise.resolve(this.file.buffer.slice(startOffset, endOffset));\n }\n\n /**\n * the length (in bytes) of the data.\n */\n get length() {\n return this.file.byteLength;\n }\n}\n"],"mappings":";AAKA,OAAO,MAAMA,oBAAoB,CAAyB;EAMxDC,WAAWA,CAACC,IAAc,EAAE;IAAAC,eAAA;IAC1B,IAAI,CAACD,IAAI,GAAGA,IAAI;EAClB;EAMAE,QAAQA,CAACC,MAAc,EAAmB;IACxC,OAAOC,OAAO,CAACC,OAAO,CAAC,IAAI,CAACL,IAAI,CAACE,QAAQ,CAACC,MAAM,CAAC,CAAC;EACpD;EAMAG,SAASA,CAACH,MAAc,EAAmB;IACzC,OAAOC,OAAO,CAACC,OAAO,CAAC,IAAI,CAACL,IAAI,CAACM,SAAS,CAACH,MAAM,EAAE,IAAI,CAAC,CAAC;EAC3D;EAMAI,SAASA,CAACJ,MAAc,EAAmB;IACzC,OAAOC,OAAO,CAACC,OAAO,CAAC,IAAI,CAACL,IAAI,CAACO,SAAS,CAACJ,MAAM,EAAE,IAAI,CAAC,CAAC;EAC3D;EAOAK,KAAKA,CAACC,WAAmB,EAAEC,SAAiB,EAAwB;IAClE,OAAON,OAAO,CAACC,OAAO,CAAC,IAAI,CAACL,IAAI,CAACW,MAAM,CAACH,KAAK,CAACC,WAAW,EAAEC,SAAS,CAAC,CAAC;EACxE;EAKA,IAAIE,MAAMA,CAAA,EAAG;IACX,OAAO,IAAI,CAACZ,IAAI,CAACa,UAAU;EAC7B;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const parseZipCDFileHeader = (headerOffset, buffer) => {
|
|
1
|
+
export const parseZipCDFileHeader = async (headerOffset, buffer) => {
|
|
2
2
|
const offsets = {
|
|
3
3
|
CD_COMPRESSED_SIZE_OFFSET: 20,
|
|
4
4
|
CD_UNCOMPRESSED_SIZE_OFFSET: 24,
|
|
@@ -7,12 +7,12 @@ export const parseZipCDFileHeader = (headerOffset, buffer) => {
|
|
|
7
7
|
CD_LOCAL_HEADER_OFFSET_OFFSET: 42,
|
|
8
8
|
CD_FILE_NAME_OFFSET: 46
|
|
9
9
|
};
|
|
10
|
-
const compressedSize = buffer.getUint32(headerOffset + offsets.CD_COMPRESSED_SIZE_OFFSET
|
|
11
|
-
const uncompressedSize = buffer.getUint32(headerOffset + offsets.CD_UNCOMPRESSED_SIZE_OFFSET
|
|
12
|
-
const fileNameLength = buffer.getUint16(headerOffset + offsets.CD_FILE_NAME_LENGTH_OFFSET
|
|
13
|
-
const fileName =
|
|
10
|
+
const compressedSize = await buffer.getUint32(headerOffset + offsets.CD_COMPRESSED_SIZE_OFFSET);
|
|
11
|
+
const uncompressedSize = await buffer.getUint32(headerOffset + offsets.CD_UNCOMPRESSED_SIZE_OFFSET);
|
|
12
|
+
const fileNameLength = await buffer.getUint16(headerOffset + offsets.CD_FILE_NAME_LENGTH_OFFSET);
|
|
13
|
+
const fileName = new TextDecoder().decode(await buffer.slice(headerOffset + offsets.CD_FILE_NAME_OFFSET, headerOffset + offsets.CD_FILE_NAME_OFFSET + fileNameLength));
|
|
14
14
|
const extraOffset = headerOffset + offsets.CD_FILE_NAME_OFFSET + fileNameLength;
|
|
15
|
-
const oldFormatOffset = buffer.getUint32(headerOffset + offsets.CD_LOCAL_HEADER_OFFSET_OFFSET
|
|
15
|
+
const oldFormatOffset = await buffer.getUint32(headerOffset + offsets.CD_LOCAL_HEADER_OFFSET_OFFSET);
|
|
16
16
|
let fileDataOffset = oldFormatOffset;
|
|
17
17
|
if (fileDataOffset === 0xffffffff) {
|
|
18
18
|
let offsetInZip64Data = 4;
|
|
@@ -22,7 +22,7 @@ export const parseZipCDFileHeader = (headerOffset, buffer) => {
|
|
|
22
22
|
if (uncompressedSize === 0xffffffff) {
|
|
23
23
|
offsetInZip64Data += 8;
|
|
24
24
|
}
|
|
25
|
-
fileDataOffset = buffer.getUint32(extraOffset + offsetInZip64Data
|
|
25
|
+
fileDataOffset = await buffer.getUint32(extraOffset + offsetInZip64Data);
|
|
26
26
|
}
|
|
27
27
|
const localHeaderOffset = fileDataOffset;
|
|
28
28
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cd-file-header.js","names":["parseZipCDFileHeader","headerOffset","buffer","offsets","CD_COMPRESSED_SIZE_OFFSET","CD_UNCOMPRESSED_SIZE_OFFSET","CD_FILE_NAME_LENGTH_OFFSET","CD_EXTRA_FIELD_LENGTH_OFFSET","CD_LOCAL_HEADER_OFFSET_OFFSET","CD_FILE_NAME_OFFSET","compressedSize","getUint32","uncompressedSize","fileNameLength","getUint16","fileName","slice","extraOffset","oldFormatOffset","fileDataOffset","offsetInZip64Data","localHeaderOffset"],"sources":["../../../../../src/lib/parsers/parse-zip/cd-file-header.ts"],"sourcesContent":["/**\n * zip central directory file header info\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipCDFileHeader = {\n
|
|
1
|
+
{"version":3,"file":"cd-file-header.js","names":["parseZipCDFileHeader","headerOffset","buffer","offsets","CD_COMPRESSED_SIZE_OFFSET","CD_UNCOMPRESSED_SIZE_OFFSET","CD_FILE_NAME_LENGTH_OFFSET","CD_EXTRA_FIELD_LENGTH_OFFSET","CD_LOCAL_HEADER_OFFSET_OFFSET","CD_FILE_NAME_OFFSET","compressedSize","getUint32","uncompressedSize","fileNameLength","getUint16","fileName","TextDecoder","decode","slice","extraOffset","oldFormatOffset","fileDataOffset","offsetInZip64Data","localHeaderOffset"],"sources":["../../../../../src/lib/parsers/parse-zip/cd-file-header.ts"],"sourcesContent":["import {FileProvider} from './file-provider';\n\n/**\n * zip central directory file header info\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipCDFileHeader = {\n /** Compressed size */\n compressedSize: number;\n /** Uncompressed size */\n uncompressedSize: number;\n /** File name length */\n fileNameLength: number;\n /** File name */\n fileName: string;\n /** Extra field offset */\n extraOffset: number;\n /** Relative offset of local file header */\n localHeaderOffset: number;\n};\n\n/**\n * Parses central directory file header of zip file\n * @param headerOffset - offset in the archive where header starts\n * @param buffer - buffer containing whole array\n * @returns Info from the header\n */\nexport const parseZipCDFileHeader = async (\n headerOffset: number,\n buffer: FileProvider\n): Promise<ZipCDFileHeader> => {\n const offsets = {\n CD_COMPRESSED_SIZE_OFFSET: 20,\n CD_UNCOMPRESSED_SIZE_OFFSET: 24,\n CD_FILE_NAME_LENGTH_OFFSET: 28,\n CD_EXTRA_FIELD_LENGTH_OFFSET: 30,\n CD_LOCAL_HEADER_OFFSET_OFFSET: 42,\n CD_FILE_NAME_OFFSET: 46\n };\n\n const compressedSize = await buffer.getUint32(headerOffset + offsets.CD_COMPRESSED_SIZE_OFFSET);\n\n const uncompressedSize = await buffer.getUint32(\n headerOffset + offsets.CD_UNCOMPRESSED_SIZE_OFFSET\n );\n\n const fileNameLength = await buffer.getUint16(headerOffset + offsets.CD_FILE_NAME_LENGTH_OFFSET);\n\n const fileName = new TextDecoder().decode(\n await buffer.slice(\n headerOffset + offsets.CD_FILE_NAME_OFFSET,\n headerOffset + offsets.CD_FILE_NAME_OFFSET + fileNameLength\n )\n );\n\n const extraOffset = headerOffset + offsets.CD_FILE_NAME_OFFSET + fileNameLength;\n\n const oldFormatOffset = await buffer.getUint32(\n headerOffset + offsets.CD_LOCAL_HEADER_OFFSET_OFFSET\n );\n\n let fileDataOffset = oldFormatOffset;\n if (fileDataOffset === 0xffffffff) {\n let offsetInZip64Data = 4;\n // looking for info that might be also be in zip64 extra field\n if (compressedSize === 0xffffffff) {\n offsetInZip64Data += 8;\n }\n if (uncompressedSize === 0xffffffff) {\n offsetInZip64Data += 8;\n }\n\n // getUint32 needs to be replaced with getBigUint64 for archieves bigger than 2gb\n fileDataOffset = await buffer.getUint32(extraOffset + offsetInZip64Data); // setting it to the one from zip64\n }\n const localHeaderOffset = fileDataOffset;\n\n return {\n compressedSize,\n uncompressedSize,\n fileNameLength,\n fileName,\n extraOffset,\n localHeaderOffset\n };\n};\n"],"mappings":"AA2BA,OAAO,MAAMA,oBAAoB,GAAG,MAAAA,CAClCC,YAAoB,EACpBC,MAAoB,KACS;EAC7B,MAAMC,OAAO,GAAG;IACdC,yBAAyB,EAAE,EAAE;IAC7BC,2BAA2B,EAAE,EAAE;IAC/BC,0BAA0B,EAAE,EAAE;IAC9BC,4BAA4B,EAAE,EAAE;IAChCC,6BAA6B,EAAE,EAAE;IACjCC,mBAAmB,EAAE;EACvB,CAAC;EAED,MAAMC,cAAc,GAAG,MAAMR,MAAM,CAACS,SAAS,CAACV,YAAY,GAAGE,OAAO,CAACC,yBAAyB,CAAC;EAE/F,MAAMQ,gBAAgB,GAAG,MAAMV,MAAM,CAACS,SAAS,CAC7CV,YAAY,GAAGE,OAAO,CAACE,2BACzB,CAAC;EAED,MAAMQ,cAAc,GAAG,MAAMX,MAAM,CAACY,SAAS,CAACb,YAAY,GAAGE,OAAO,CAACG,0BAA0B,CAAC;EAEhG,MAAMS,QAAQ,GAAG,IAAIC,WAAW,CAAC,CAAC,CAACC,MAAM,CACvC,MAAMf,MAAM,CAACgB,KAAK,CAChBjB,YAAY,GAAGE,OAAO,CAACM,mBAAmB,EAC1CR,YAAY,GAAGE,OAAO,CAACM,mBAAmB,GAAGI,cAC/C,CACF,CAAC;EAED,MAAMM,WAAW,GAAGlB,YAAY,GAAGE,OAAO,CAACM,mBAAmB,GAAGI,cAAc;EAE/E,MAAMO,eAAe,GAAG,MAAMlB,MAAM,CAACS,SAAS,CAC5CV,YAAY,GAAGE,OAAO,CAACK,6BACzB,CAAC;EAED,IAAIa,cAAc,GAAGD,eAAe;EACpC,IAAIC,cAAc,KAAK,UAAU,EAAE;IACjC,IAAIC,iBAAiB,GAAG,CAAC;IAEzB,IAAIZ,cAAc,KAAK,UAAU,EAAE;MACjCY,iBAAiB,IAAI,CAAC;IACxB;IACA,IAAIV,gBAAgB,KAAK,UAAU,EAAE;MACnCU,iBAAiB,IAAI,CAAC;IACxB;IAGAD,cAAc,GAAG,MAAMnB,MAAM,CAACS,SAAS,CAACQ,WAAW,GAAGG,iBAAiB,CAAC;EAC1E;EACA,MAAMC,iBAAiB,GAAGF,cAAc;EAExC,OAAO;IACLX,cAAc;IACdE,gBAAgB;IAChBC,cAAc;IACdE,QAAQ;IACRI,WAAW;IACXI;EACF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-provider.js","names":[],"sources":["../../../../../src/lib/parsers/parse-zip/file-provider.ts"],"sourcesContent":["/**\n * Interface for providing file data\n */\nexport interface FileProvider {\n /**\n * Gets an unsigned 8-bit integer at the specified byte offset from the start of the file.\n * @param offset The offset, in bytes, from the start of the file where to read the data.\n */\n getUint8(offset: number): Promise<number>;\n\n /**\n * Gets an unsigned 16-bit integer at the specified byte offset from the start of the file.\n * @param offset The offset, in bytes, from the start of the file where to read the data.\n */\n getUint16(offset: number): Promise<number>;\n\n /**\n * Gets an unsigned 32-bit integer at the specified byte offset from the start of the file.\n * @param offset The offset, in bytes, from the file of the view where to read the data.\n */\n getUint32(offset: number): Promise<number>;\n\n /**\n * returns an ArrayBuffer whose contents are a copy of this file bytes from startOffset, inclusive, up to endOffset, exclusive.\n * @param startOffset The offset, in bytes, from the start of the file where to start reading the data.\n * @param endOffset The offset, in bytes, from the start of the file where to end reading the data.\n */\n slice(startOffset: number, endOffset: number): Promise<ArrayBuffer>;\n\n /**\n * the length (in bytes) of the data.\n */\n length: number;\n}\n"],"mappings":""}
|
|
@@ -1,16 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
const offsets = {
|
|
2
|
+
COMPRESSED_SIZE_OFFSET: 18,
|
|
3
|
+
FILE_NAME_LENGTH_OFFSET: 26,
|
|
4
|
+
EXTRA_FIELD_LENGTH_OFFSET: 28,
|
|
5
|
+
FILE_NAME_OFFSET: 30
|
|
6
|
+
};
|
|
7
|
+
const signature = Buffer.from([0x50, 0x4b, 0x03, 0x04]);
|
|
8
|
+
export const parseZipLocalFileHeader = async (headerOffset, buffer) => {
|
|
9
|
+
if (Buffer.from(await buffer.slice(headerOffset, headerOffset + 4)).compare(signature) !== 0) {
|
|
10
|
+
return Promise.resolve(undefined);
|
|
11
|
+
}
|
|
12
|
+
const fileNameLength = await buffer.getUint16(headerOffset + offsets.FILE_NAME_LENGTH_OFFSET);
|
|
13
|
+
const fileName = new TextDecoder().decode(await buffer.slice(headerOffset + offsets.FILE_NAME_OFFSET, headerOffset + offsets.FILE_NAME_OFFSET + fileNameLength));
|
|
14
|
+
const extraFieldLength = await buffer.getUint16(headerOffset + offsets.EXTRA_FIELD_LENGTH_OFFSET);
|
|
10
15
|
const fileDataOffset = headerOffset + offsets.FILE_NAME_OFFSET + fileNameLength + extraFieldLength;
|
|
11
|
-
const compressedSize = buffer.getUint32(headerOffset + offsets.COMPRESSED_SIZE_OFFSET
|
|
16
|
+
const compressedSize = await buffer.getUint32(headerOffset + offsets.COMPRESSED_SIZE_OFFSET);
|
|
12
17
|
return {
|
|
13
18
|
fileNameLength,
|
|
19
|
+
fileName,
|
|
14
20
|
extraFieldLength,
|
|
15
21
|
fileDataOffset,
|
|
16
22
|
compressedSize
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-file-header.js","names":["parseZipLocalFileHeader","headerOffset","buffer","
|
|
1
|
+
{"version":3,"file":"local-file-header.js","names":["offsets","COMPRESSED_SIZE_OFFSET","FILE_NAME_LENGTH_OFFSET","EXTRA_FIELD_LENGTH_OFFSET","FILE_NAME_OFFSET","signature","Buffer","from","parseZipLocalFileHeader","headerOffset","buffer","slice","compare","Promise","resolve","undefined","fileNameLength","getUint16","fileName","TextDecoder","decode","extraFieldLength","fileDataOffset","compressedSize","getUint32"],"sources":["../../../../../src/lib/parsers/parse-zip/local-file-header.ts"],"sourcesContent":["import {FileProvider} from './file-provider';\n\n/**\n * zip local file header info\n * according to https://en.wikipedia.org/wiki/ZIP_(file_format)\n */\nexport type ZipLocalFileHeader = {\n /** File name length */\n fileNameLength: number;\n /** File name */\n fileName: string;\n /** Extra field length */\n extraFieldLength: number;\n /** Offset of the file data */\n fileDataOffset: number;\n /** Compressed size */\n compressedSize: number;\n};\n\nconst offsets = {\n COMPRESSED_SIZE_OFFSET: 18,\n FILE_NAME_LENGTH_OFFSET: 26,\n EXTRA_FIELD_LENGTH_OFFSET: 28,\n FILE_NAME_OFFSET: 30\n};\n\nconst signature = Buffer.from([0x50, 0x4b, 0x03, 0x04]);\n\n/**\n * Parses local file header of zip file\n * @param headerOffset - offset in the archive where header starts\n * @param buffer - buffer containing whole array\n * @returns Info from the header\n */\nexport const parseZipLocalFileHeader = async (\n headerOffset: number,\n buffer: FileProvider\n): Promise<ZipLocalFileHeader | undefined> => {\n if (Buffer.from(await buffer.slice(headerOffset, headerOffset + 4)).compare(signature) !== 0) {\n return Promise.resolve(undefined);\n }\n\n const fileNameLength = await buffer.getUint16(headerOffset + offsets.FILE_NAME_LENGTH_OFFSET);\n\n const fileName = new TextDecoder().decode(\n await buffer.slice(\n headerOffset + offsets.FILE_NAME_OFFSET,\n headerOffset + offsets.FILE_NAME_OFFSET + fileNameLength\n )\n );\n const extraFieldLength = await buffer.getUint16(headerOffset + offsets.EXTRA_FIELD_LENGTH_OFFSET);\n\n const fileDataOffset =\n headerOffset + offsets.FILE_NAME_OFFSET + fileNameLength + extraFieldLength;\n\n const compressedSize = await buffer.getUint32(headerOffset + offsets.COMPRESSED_SIZE_OFFSET);\n\n return {\n fileNameLength,\n fileName,\n extraFieldLength,\n fileDataOffset,\n compressedSize\n };\n};\n"],"mappings":"AAmBA,MAAMA,OAAO,GAAG;EACdC,sBAAsB,EAAE,EAAE;EAC1BC,uBAAuB,EAAE,EAAE;EAC3BC,yBAAyB,EAAE,EAAE;EAC7BC,gBAAgB,EAAE;AACpB,CAAC;AAED,MAAMC,SAAS,GAAGC,MAAM,CAACC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAQvD,OAAO,MAAMC,uBAAuB,GAAG,MAAAA,CACrCC,YAAoB,EACpBC,MAAoB,KACwB;EAC5C,IAAIJ,MAAM,CAACC,IAAI,CAAC,MAAMG,MAAM,CAACC,KAAK,CAACF,YAAY,EAAEA,YAAY,GAAG,CAAC,CAAC,CAAC,CAACG,OAAO,CAACP,SAAS,CAAC,KAAK,CAAC,EAAE;IAC5F,OAAOQ,OAAO,CAACC,OAAO,CAACC,SAAS,CAAC;EACnC;EAEA,MAAMC,cAAc,GAAG,MAAMN,MAAM,CAACO,SAAS,CAACR,YAAY,GAAGT,OAAO,CAACE,uBAAuB,CAAC;EAE7F,MAAMgB,QAAQ,GAAG,IAAIC,WAAW,CAAC,CAAC,CAACC,MAAM,CACvC,MAAMV,MAAM,CAACC,KAAK,CAChBF,YAAY,GAAGT,OAAO,CAACI,gBAAgB,EACvCK,YAAY,GAAGT,OAAO,CAACI,gBAAgB,GAAGY,cAC5C,CACF,CAAC;EACD,MAAMK,gBAAgB,GAAG,MAAMX,MAAM,CAACO,SAAS,CAACR,YAAY,GAAGT,OAAO,CAACG,yBAAyB,CAAC;EAEjG,MAAMmB,cAAc,GAClBb,YAAY,GAAGT,OAAO,CAACI,gBAAgB,GAAGY,cAAc,GAAGK,gBAAgB;EAE7E,MAAME,cAAc,GAAG,MAAMb,MAAM,CAACc,SAAS,CAACf,YAAY,GAAGT,OAAO,CAACC,sBAAsB,CAAC;EAE5F,OAAO;IACLe,cAAc;IACdE,QAAQ;IACRG,gBAAgB;IAChBC,cAAc;IACdC;EACF,CAAC;AACH,CAAC"}
|