@loaders.gl/zip 4.0.3 → 4.1.0-alpha.1
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.dev.js +151 -6
- package/dist/filesystems/zip-filesystem.d.ts.map +1 -1
- package/dist/filesystems/zip-filesystem.js.map +1 -1
- package/dist/hash-file-utility.d.ts.map +1 -1
- package/dist/hash-file-utility.js.map +1 -1
- package/dist/index.cjs +208 -12
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/tar/header.d.ts.map +1 -1
- package/dist/lib/tar/header.js.map +1 -1
- package/dist/lib/tar/tar.d.ts.map +1 -1
- package/dist/lib/tar/tar.js.map +1 -1
- package/dist/lib/tar/types.d.ts.map +1 -1
- package/dist/lib/tar/types.js.map +1 -1
- package/dist/lib/tar/utils.d.ts.map +1 -1
- package/dist/lib/tar/utils.js.map +1 -1
- package/dist/parse-zip/cd-file-header.d.ts +18 -0
- package/dist/parse-zip/cd-file-header.d.ts.map +1 -1
- package/dist/parse-zip/cd-file-header.js +101 -1
- package/dist/parse-zip/cd-file-header.js.map +1 -1
- package/dist/parse-zip/end-of-central-directory.d.ts.map +1 -1
- package/dist/parse-zip/end-of-central-directory.js.map +1 -1
- package/dist/parse-zip/local-file-header.d.ts.map +1 -1
- package/dist/parse-zip/local-file-header.js.map +1 -1
- package/dist/parse-zip/search-from-the-end.d.ts.map +1 -1
- package/dist/parse-zip/search-from-the-end.js.map +1 -1
- package/dist/parse-zip/zip64-info-generation.d.ts +27 -0
- package/dist/parse-zip/zip64-info-generation.d.ts.map +1 -0
- package/dist/parse-zip/zip64-info-generation.js +47 -0
- package/dist/parse-zip/zip64-info-generation.js.map +1 -0
- package/dist/tar-builder.d.ts.map +1 -1
- package/dist/tar-builder.js.map +1 -1
- package/package.json +5 -5
- package/src/filesystems/zip-filesystem.ts +3 -0
- package/src/hash-file-utility.ts +3 -0
- package/src/index.ts +2 -1
- package/src/lib/tar/header.ts +3 -0
- package/src/lib/tar/tar.ts +3 -0
- package/src/lib/tar/types.ts +3 -0
- package/src/lib/tar/utils.ts +3 -0
- package/src/parse-zip/cd-file-header.ts +185 -1
- package/src/parse-zip/end-of-central-directory.ts +3 -0
- package/src/parse-zip/local-file-header.ts +3 -0
- package/src/parse-zip/search-from-the-end.ts +3 -0
- package/src/parse-zip/zip64-info-generation.ts +90 -0
- package/src/tar-builder.ts +3 -0
package/dist/dist.dev.js
CHANGED
|
@@ -6951,12 +6951,13 @@ var __exports__ = (() => {
|
|
|
6951
6951
|
// src/index.ts
|
|
6952
6952
|
var src_exports = {};
|
|
6953
6953
|
__export(src_exports, {
|
|
6954
|
+
CD_HEADER_SIGNATURE: () => signature2,
|
|
6954
6955
|
TarBuilder: () => TarBuilder,
|
|
6955
6956
|
ZipFileSystem: () => ZipFileSystem,
|
|
6956
6957
|
ZipLoader: () => ZipLoader,
|
|
6957
6958
|
ZipWriter: () => ZipWriter,
|
|
6958
|
-
|
|
6959
|
-
localHeaderSignature: () =>
|
|
6959
|
+
generateCDHeader: () => generateCDHeader,
|
|
6960
|
+
localHeaderSignature: () => signature3,
|
|
6960
6961
|
makeHashTableFromZipHeaders: () => makeHashTableFromZipHeaders,
|
|
6961
6962
|
makeZipCDHeaderIterator: () => makeZipCDHeaderIterator,
|
|
6962
6963
|
parseEoCDRecord: () => parseEoCDRecord,
|
|
@@ -7473,6 +7474,52 @@ var __exports__ = (() => {
|
|
|
7473
7474
|
};
|
|
7474
7475
|
};
|
|
7475
7476
|
|
|
7477
|
+
// src/parse-zip/zip64-info-generation.ts
|
|
7478
|
+
var signature = new Uint8Array([1, 0]);
|
|
7479
|
+
function createZip64Info(options) {
|
|
7480
|
+
const optionsToUse = {
|
|
7481
|
+
...options,
|
|
7482
|
+
zip64Length: (options.offset ? 1 : 0) * 8 + (options.size ? 1 : 0) * 16
|
|
7483
|
+
};
|
|
7484
|
+
const arraysToConcat = [];
|
|
7485
|
+
for (const field of ZIP64_FIELDS) {
|
|
7486
|
+
if (!optionsToUse[field.name ?? ""] && !field.default) {
|
|
7487
|
+
continue;
|
|
7488
|
+
}
|
|
7489
|
+
const newValue = new DataView(new ArrayBuffer(field.size));
|
|
7490
|
+
NUMBER_SETTERS[field.size](newValue, 0, optionsToUse[field.name ?? ""] ?? field.default);
|
|
7491
|
+
arraysToConcat.push(newValue.buffer);
|
|
7492
|
+
}
|
|
7493
|
+
return concatenateArrayBuffers(...arraysToConcat);
|
|
7494
|
+
}
|
|
7495
|
+
var NUMBER_SETTERS = {
|
|
7496
|
+
2: (header, offset, value) => {
|
|
7497
|
+
header.setUint16(offset, value, true);
|
|
7498
|
+
},
|
|
7499
|
+
4: (header, offset, value) => {
|
|
7500
|
+
header.setUint32(offset, value, true);
|
|
7501
|
+
},
|
|
7502
|
+
8: (header, offset, value) => {
|
|
7503
|
+
header.setBigUint64(offset, BigInt(value), true);
|
|
7504
|
+
}
|
|
7505
|
+
};
|
|
7506
|
+
var ZIP64_FIELDS = [{
|
|
7507
|
+
size: 2,
|
|
7508
|
+
default: new DataView(signature.buffer).getUint16(0, true)
|
|
7509
|
+
}, {
|
|
7510
|
+
size: 2,
|
|
7511
|
+
name: "zip64Length"
|
|
7512
|
+
}, {
|
|
7513
|
+
size: 8,
|
|
7514
|
+
name: "size"
|
|
7515
|
+
}, {
|
|
7516
|
+
size: 8,
|
|
7517
|
+
name: "size"
|
|
7518
|
+
}, {
|
|
7519
|
+
size: 8,
|
|
7520
|
+
name: "offset"
|
|
7521
|
+
}];
|
|
7522
|
+
|
|
7476
7523
|
// src/parse-zip/cd-file-header.ts
|
|
7477
7524
|
var CD_COMPRESSED_SIZE_OFFSET = 20n;
|
|
7478
7525
|
var CD_UNCOMPRESSED_SIZE_OFFSET = 24n;
|
|
@@ -7481,10 +7528,10 @@ var __exports__ = (() => {
|
|
|
7481
7528
|
var CD_START_DISK_OFFSET = 32n;
|
|
7482
7529
|
var CD_LOCAL_HEADER_OFFSET_OFFSET = 42n;
|
|
7483
7530
|
var CD_FILE_NAME_OFFSET = 46n;
|
|
7484
|
-
var
|
|
7531
|
+
var signature2 = new Uint8Array([80, 75, 1, 2]);
|
|
7485
7532
|
var parseZipCDFileHeader = async (headerOffset, file) => {
|
|
7486
7533
|
const magicBytes = await file.slice(headerOffset, headerOffset + 4n);
|
|
7487
|
-
if (!compareArrayBuffers(magicBytes,
|
|
7534
|
+
if (!compareArrayBuffers(magicBytes, signature2.buffer)) {
|
|
7488
7535
|
return null;
|
|
7489
7536
|
}
|
|
7490
7537
|
const compressedSize = BigInt(await file.getUint32(headerOffset + CD_COMPRESSED_SIZE_OFFSET));
|
|
@@ -7570,6 +7617,104 @@ var __exports__ = (() => {
|
|
|
7570
7617
|
}
|
|
7571
7618
|
return zip64dataList;
|
|
7572
7619
|
};
|
|
7620
|
+
function generateCDHeader(options) {
|
|
7621
|
+
const optionsToUse = {
|
|
7622
|
+
...options,
|
|
7623
|
+
fnlength: options.fileName.length,
|
|
7624
|
+
extraLength: 0
|
|
7625
|
+
};
|
|
7626
|
+
let zip64header = new ArrayBuffer(0);
|
|
7627
|
+
const optionsToZip64 = {};
|
|
7628
|
+
if (optionsToUse.offset >= 4294967295) {
|
|
7629
|
+
optionsToZip64.offset = optionsToUse.offset;
|
|
7630
|
+
optionsToUse.offset = 4294967295;
|
|
7631
|
+
}
|
|
7632
|
+
if (optionsToUse.length >= 4294967295) {
|
|
7633
|
+
optionsToZip64.size = optionsToUse.length;
|
|
7634
|
+
optionsToUse.length = 4294967295;
|
|
7635
|
+
}
|
|
7636
|
+
if (Object.keys(optionsToZip64).length) {
|
|
7637
|
+
zip64header = createZip64Info(optionsToZip64);
|
|
7638
|
+
optionsToUse.extraLength = zip64header.byteLength;
|
|
7639
|
+
}
|
|
7640
|
+
const header = new DataView(new ArrayBuffer(46));
|
|
7641
|
+
for (const field of ZIP_HEADER_FIELDS) {
|
|
7642
|
+
NUMBER_SETTERS[field.size](header, field.offset, optionsToUse[field.name ?? ""] ?? field.default ?? 0);
|
|
7643
|
+
}
|
|
7644
|
+
const encodedName = new TextEncoder().encode(optionsToUse.fileName);
|
|
7645
|
+
const resHeader = concatenateArrayBuffers(header.buffer, encodedName, zip64header);
|
|
7646
|
+
return resHeader;
|
|
7647
|
+
}
|
|
7648
|
+
var ZIP_HEADER_FIELDS = [{
|
|
7649
|
+
offset: 0,
|
|
7650
|
+
size: 4,
|
|
7651
|
+
default: new DataView(signature2.buffer).getUint32(0, true)
|
|
7652
|
+
}, {
|
|
7653
|
+
offset: 4,
|
|
7654
|
+
size: 2,
|
|
7655
|
+
default: 45
|
|
7656
|
+
}, {
|
|
7657
|
+
offset: 6,
|
|
7658
|
+
size: 2,
|
|
7659
|
+
default: 45
|
|
7660
|
+
}, {
|
|
7661
|
+
offset: 8,
|
|
7662
|
+
size: 2,
|
|
7663
|
+
default: 0
|
|
7664
|
+
}, {
|
|
7665
|
+
offset: 10,
|
|
7666
|
+
size: 2,
|
|
7667
|
+
default: 0
|
|
7668
|
+
}, {
|
|
7669
|
+
offset: 12,
|
|
7670
|
+
size: 2,
|
|
7671
|
+
default: 0
|
|
7672
|
+
}, {
|
|
7673
|
+
offset: 14,
|
|
7674
|
+
size: 2,
|
|
7675
|
+
default: 0
|
|
7676
|
+
}, {
|
|
7677
|
+
offset: 16,
|
|
7678
|
+
size: 4,
|
|
7679
|
+
name: "crc32"
|
|
7680
|
+
}, {
|
|
7681
|
+
offset: 20,
|
|
7682
|
+
size: 4,
|
|
7683
|
+
name: "length"
|
|
7684
|
+
}, {
|
|
7685
|
+
offset: 24,
|
|
7686
|
+
size: 4,
|
|
7687
|
+
name: "length"
|
|
7688
|
+
}, {
|
|
7689
|
+
offset: 28,
|
|
7690
|
+
size: 2,
|
|
7691
|
+
name: "fnlength"
|
|
7692
|
+
}, {
|
|
7693
|
+
offset: 30,
|
|
7694
|
+
size: 2,
|
|
7695
|
+
default: 0,
|
|
7696
|
+
name: "extraLength"
|
|
7697
|
+
}, {
|
|
7698
|
+
offset: 32,
|
|
7699
|
+
size: 2,
|
|
7700
|
+
default: 0
|
|
7701
|
+
}, {
|
|
7702
|
+
offset: 34,
|
|
7703
|
+
size: 2,
|
|
7704
|
+
default: 0
|
|
7705
|
+
}, {
|
|
7706
|
+
offset: 36,
|
|
7707
|
+
size: 2,
|
|
7708
|
+
default: 0
|
|
7709
|
+
}, {
|
|
7710
|
+
offset: 38,
|
|
7711
|
+
size: 4,
|
|
7712
|
+
default: 0
|
|
7713
|
+
}, {
|
|
7714
|
+
offset: 42,
|
|
7715
|
+
size: 4,
|
|
7716
|
+
name: "offset"
|
|
7717
|
+
}];
|
|
7573
7718
|
|
|
7574
7719
|
// src/parse-zip/local-file-header.ts
|
|
7575
7720
|
var COMPRESSION_METHOD_OFFSET = 8n;
|
|
@@ -7578,10 +7723,10 @@ var __exports__ = (() => {
|
|
|
7578
7723
|
var FILE_NAME_LENGTH_OFFSET = 26n;
|
|
7579
7724
|
var EXTRA_FIELD_LENGTH_OFFSET = 28n;
|
|
7580
7725
|
var FILE_NAME_OFFSET = 30n;
|
|
7581
|
-
var
|
|
7726
|
+
var signature3 = new Uint8Array([80, 75, 3, 4]);
|
|
7582
7727
|
var parseZipLocalFileHeader = async (headerOffset, buffer) => {
|
|
7583
7728
|
const magicBytes = await buffer.slice(headerOffset, headerOffset + 4n);
|
|
7584
|
-
if (!compareArrayBuffers(magicBytes,
|
|
7729
|
+
if (!compareArrayBuffers(magicBytes, signature3)) {
|
|
7585
7730
|
return null;
|
|
7586
7731
|
}
|
|
7587
7732
|
const fileNameLength = await buffer.getUint16(headerOffset + FILE_NAME_LENGTH_OFFSET);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zip-filesystem.d.ts","sourceRoot":"","sources":["../../src/filesystems/zip-filesystem.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"zip-filesystem.d.ts","sourceRoot":"","sources":["../../src/filesystems/zip-filesystem.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,UAAU,EAAY,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAC,YAAY,EAAiB,MAAM,0BAA0B,CAAC;AAEtE,OAAO,EAAC,eAAe,EAA0B,MAAM,6BAA6B,CAAC;AAiBrF;;;GAGG;AACH,qBAAa,aAAc,YAAW,UAAU;IAC9C,oCAAoC;IACpC,SAAS,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAQ;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;gBACS,IAAI,EAAE,YAAY,GAAG,MAAM;IAcvC,yBAAyB;IACnB,OAAO;IAMb;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAYlC;;;;OAIG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC;IAKvE;;;;OAIG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IA8BhD;;;;OAIG;YACW,eAAe;CAiB9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zip-filesystem.js","names":["isBrowser","isFileProvider","FileHandleFile","makeZipCDHeaderIterator","parseZipLocalFileHeader","DeflateCompression","COMPRESSION_METHODS","compressedFile","compression","raw","decompressedData","decompress","ZipFileSystem","constructor","file","fileProvider","fileName","Error","destroy","readdir","fileNames","zipCDIterator","cdHeader","push","stat","filename","cdFileHeader","getCDFileHeader","size","Number","uncompressedSize","fetch","localFileHeader","localHeaderOffset","compressionHandler","compressionMethod","toString","slice","fileDataOffset","compressedSize","uncompressedFile","response","Response","Object","defineProperty","value","result"],"sources":["../../src/filesystems/zip-filesystem.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"zip-filesystem.js","names":["isBrowser","isFileProvider","FileHandleFile","makeZipCDHeaderIterator","parseZipLocalFileHeader","DeflateCompression","COMPRESSION_METHODS","compressedFile","compression","raw","decompressedData","decompress","ZipFileSystem","constructor","file","fileProvider","fileName","Error","destroy","readdir","fileNames","zipCDIterator","cdHeader","push","stat","filename","cdFileHeader","getCDFileHeader","size","Number","uncompressedSize","fetch","localFileHeader","localHeaderOffset","compressionHandler","compressionMethod","toString","slice","fileDataOffset","compressedSize","uncompressedFile","response","Response","Object","defineProperty","value","result"],"sources":["../../src/filesystems/zip-filesystem.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport {FileSystem, isBrowser} from '@loaders.gl/loader-utils';\nimport {FileProvider, isFileProvider} from '@loaders.gl/loader-utils';\nimport {FileHandleFile} from '@loaders.gl/loader-utils';\nimport {ZipCDFileHeader, makeZipCDHeaderIterator} from '../parse-zip/cd-file-header';\nimport {parseZipLocalFileHeader} from '../parse-zip/local-file-header';\nimport {DeflateCompression} from '@loaders.gl/compression';\n\ntype CompressionHandler = (compressedFile: ArrayBuffer) => Promise<ArrayBuffer>;\n/** Handling different compression types in zip */\nconst COMPRESSION_METHODS: {[key: number]: CompressionHandler} = {\n /** No compression */\n 0: async (compressedFile) => compressedFile,\n /** Deflation */\n 8: async (compressedFile) => {\n const compression = new DeflateCompression({raw: true});\n const decompressedData = await compression.decompress(compressedFile);\n return decompressedData;\n }\n};\n\n/**\n * FileSystem adapter for a ZIP file\n * Holds FileProvider object that provides random access to archived files\n */\nexport class ZipFileSystem implements FileSystem {\n /** FileProvider instance promise */\n protected fileProvider: FileProvider | null = null;\n public fileName?: string;\n\n /**\n * Constructor\n * @param file - instance of FileProvider or file path string\n */\n constructor(file: FileProvider | string) {\n // Try to open file in NodeJS\n if (typeof file === 'string') {\n this.fileName = file;\n if (!isBrowser) {\n this.fileProvider = new FileHandleFile(file);\n } else {\n throw new Error('Cannot open file for random access in a WEB browser');\n }\n } else if (isFileProvider(file)) {\n this.fileProvider = file;\n }\n }\n\n /** Clean up resources */\n async destroy() {\n if (this.fileProvider) {\n await this.fileProvider.destroy();\n }\n }\n\n /**\n * Get file names list from zip archive\n * @returns array of file names\n */\n async readdir(): Promise<string[]> {\n if (!this.fileProvider) {\n throw new Error('No data detected in the zip archive');\n }\n const fileNames: string[] = [];\n const zipCDIterator = makeZipCDHeaderIterator(this.fileProvider);\n for await (const cdHeader of zipCDIterator) {\n fileNames.push(cdHeader.fileName);\n }\n return fileNames;\n }\n\n /**\n * Get file metadata\n * @param filename - name of a file\n * @returns central directory data\n */\n async stat(filename: string): Promise<ZipCDFileHeader & {size: number}> {\n const cdFileHeader = await this.getCDFileHeader(filename);\n return {...cdFileHeader, size: Number(cdFileHeader.uncompressedSize)};\n }\n\n /**\n * Implementation of fetch against this file system\n * @param filename - name of a file\n * @returns - Response with file data\n */\n async fetch(filename: string): Promise<Response> {\n if (!this.fileProvider) {\n throw new Error('No data detected in the zip archive');\n }\n const cdFileHeader = await this.getCDFileHeader(filename);\n const localFileHeader = await parseZipLocalFileHeader(\n cdFileHeader.localHeaderOffset,\n this.fileProvider\n );\n if (!localFileHeader) {\n throw new Error('Local file header has not been found in the zip archive`');\n }\n\n const compressionHandler = COMPRESSION_METHODS[localFileHeader.compressionMethod.toString()];\n if (!compressionHandler) {\n throw Error('Only Deflation compression is supported');\n }\n\n const compressedFile = await this.fileProvider.slice(\n localFileHeader.fileDataOffset,\n localFileHeader.fileDataOffset + localFileHeader.compressedSize\n );\n\n const uncompressedFile = await compressionHandler(compressedFile);\n\n const response = new Response(uncompressedFile);\n Object.defineProperty(response, 'url', {value: `${this.fileName || ''}/${filename}`});\n return response;\n }\n\n /**\n * Get central directory file header\n * @param filename - name of a file\n * @returns central directory file header\n */\n private async getCDFileHeader(filename: string): Promise<ZipCDFileHeader> {\n if (!this.fileProvider) {\n throw new Error('No data detected in the zip archive');\n }\n const zipCDIterator = makeZipCDHeaderIterator(this.fileProvider);\n let result: ZipCDFileHeader | null = null;\n for await (const cdHeader of zipCDIterator) {\n if (cdHeader.fileName === filename) {\n result = cdHeader;\n break;\n }\n }\n if (!result) {\n throw new Error('File has not been found in the zip archive');\n }\n return result;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash-file-utility.d.ts","sourceRoot":"","sources":["../src/hash-file-utility.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hash-file-utility.d.ts","sourceRoot":"","sources":["../src/hash-file-utility.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,YAAY,EAAC,MAAM,0BAA0B,CAAC;AAGtD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAY/E;AASD;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAejC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hash-file-utility.js","names":["MD5Hash","makeZipCDHeaderIterator","parseHashTable","arrayBuffer","dataView","DataView","hashMap","i","byteLength","offset","getBigUint64","hash","bufferToHex","buffer","start","length","Uint8Array","map","x","toString","padStart","join","makeHashTableFromZipHeaders","fileProvider","zipCDIterator","md5Hash","textEncoder","TextEncoder","hashTable","cdHeader","filename","fileName","split","toLocaleLowerCase","encode","md5","localHeaderOffset"],"sources":["../src/hash-file-utility.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"hash-file-utility.js","names":["MD5Hash","makeZipCDHeaderIterator","parseHashTable","arrayBuffer","dataView","DataView","hashMap","i","byteLength","offset","getBigUint64","hash","bufferToHex","buffer","start","length","Uint8Array","map","x","toString","padStart","join","makeHashTableFromZipHeaders","fileProvider","zipCDIterator","md5Hash","textEncoder","TextEncoder","hashTable","cdHeader","filename","fileName","split","toLocaleLowerCase","encode","md5","localHeaderOffset"],"sources":["../src/hash-file-utility.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nimport {MD5Hash} from '@loaders.gl/crypto';\nimport {FileProvider} from '@loaders.gl/loader-utils';\nimport {makeZipCDHeaderIterator} from './parse-zip/cd-file-header';\n\n/**\n * Reads hash file from buffer and returns it in ready-to-use form\n * @param arrayBuffer - buffer containing hash file\n * @returns Map containing hash and offset\n */\nexport function parseHashTable(arrayBuffer: ArrayBuffer): Record<string, bigint> {\n const dataView = new DataView(arrayBuffer);\n\n const hashMap: Record<string, bigint> = {};\n\n for (let i = 0; i < arrayBuffer.byteLength; i = i + 24) {\n const offset = dataView.getBigUint64(i + 16, true);\n const hash = bufferToHex(arrayBuffer, i, 16);\n hashMap[hash] = offset;\n }\n\n return hashMap;\n}\n\nfunction bufferToHex(buffer: ArrayBuffer, start: number, length: number): string {\n // buffer is an ArrayBuffer\n return [...new Uint8Array(buffer, start, length)]\n .map((x) => x.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * generates hash info from zip files \"central directory\"\n * @param fileProvider - provider of the archive\n * @returns ready to use hash info\n */\nexport async function makeHashTableFromZipHeaders(\n fileProvider: FileProvider\n): Promise<Record<string, bigint>> {\n const zipCDIterator = makeZipCDHeaderIterator(fileProvider);\n const md5Hash = new MD5Hash();\n const textEncoder = new TextEncoder();\n\n const hashTable: Record<string, bigint> = {};\n\n for await (const cdHeader of zipCDIterator) {\n const filename = cdHeader.fileName.split('\\\\').join('/').toLocaleLowerCase();\n const arrayBuffer = textEncoder.encode(filename).buffer;\n const md5 = await md5Hash.hash(arrayBuffer, 'hex');\n hashTable[md5] = cdHeader.localHeaderOffset;\n }\n\n return hashTable;\n}\n"],"mappings":"AAGA,SAAQA,OAAO,QAAO,oBAAoB;AAAC,SAEnCC,uBAAuB;AAO/B,OAAO,SAASC,cAAcA,CAACC,WAAwB,EAA0B;EAC/E,MAAMC,QAAQ,GAAG,IAAIC,QAAQ,CAACF,WAAW,CAAC;EAE1C,MAAMG,OAA+B,GAAG,CAAC,CAAC;EAE1C,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,WAAW,CAACK,UAAU,EAAED,CAAC,GAAGA,CAAC,GAAG,EAAE,EAAE;IACtD,MAAME,MAAM,GAAGL,QAAQ,CAACM,YAAY,CAACH,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC;IAClD,MAAMI,IAAI,GAAGC,WAAW,CAACT,WAAW,EAAEI,CAAC,EAAE,EAAE,CAAC;IAC5CD,OAAO,CAACK,IAAI,CAAC,GAAGF,MAAM;EACxB;EAEA,OAAOH,OAAO;AAChB;AAEA,SAASM,WAAWA,CAACC,MAAmB,EAAEC,KAAa,EAAEC,MAAc,EAAU;EAE/E,OAAO,CAAC,GAAG,IAAIC,UAAU,CAACH,MAAM,EAAEC,KAAK,EAAEC,MAAM,CAAC,CAAC,CAC9CE,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,QAAQ,CAAC,EAAE,CAAC,CAACC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAC3CC,IAAI,CAAC,EAAE,CAAC;AACb;AAOA,OAAO,eAAeC,2BAA2BA,CAC/CC,YAA0B,EACO;EACjC,MAAMC,aAAa,GAAGvB,uBAAuB,CAACsB,YAAY,CAAC;EAC3D,MAAME,OAAO,GAAG,IAAIzB,OAAO,CAAC,CAAC;EAC7B,MAAM0B,WAAW,GAAG,IAAIC,WAAW,CAAC,CAAC;EAErC,MAAMC,SAAiC,GAAG,CAAC,CAAC;EAE5C,WAAW,MAAMC,QAAQ,IAAIL,aAAa,EAAE;IAC1C,MAAMM,QAAQ,GAAGD,QAAQ,CAACE,QAAQ,CAACC,KAAK,CAAC,IAAI,CAAC,CAACX,IAAI,CAAC,GAAG,CAAC,CAACY,iBAAiB,CAAC,CAAC;IAC5E,MAAM9B,WAAW,GAAGuB,WAAW,CAACQ,MAAM,CAACJ,QAAQ,CAAC,CAACjB,MAAM;IACvD,MAAMsB,GAAG,GAAG,MAAMV,OAAO,CAACd,IAAI,CAACR,WAAW,EAAE,KAAK,CAAC;IAClDyB,SAAS,CAACO,GAAG,CAAC,GAAGN,QAAQ,CAACO,iBAAiB;EAC7C;EAEA,OAAOR,SAAS;AAClB"}
|
package/dist/index.cjs
CHANGED
|
@@ -30,12 +30,13 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/index.ts
|
|
31
31
|
var src_exports = {};
|
|
32
32
|
__export(src_exports, {
|
|
33
|
+
CD_HEADER_SIGNATURE: () => signature2,
|
|
33
34
|
TarBuilder: () => TarBuilder,
|
|
34
35
|
ZipFileSystem: () => ZipFileSystem,
|
|
35
36
|
ZipLoader: () => ZipLoader,
|
|
36
37
|
ZipWriter: () => ZipWriter,
|
|
37
|
-
|
|
38
|
-
localHeaderSignature: () =>
|
|
38
|
+
generateCDHeader: () => generateCDHeader,
|
|
39
|
+
localHeaderSignature: () => signature3,
|
|
39
40
|
makeHashTableFromZipHeaders: () => makeHashTableFromZipHeaders,
|
|
40
41
|
makeZipCDHeaderIterator: () => makeZipCDHeaderIterator,
|
|
41
42
|
parseEoCDRecord: () => parseEoCDRecord,
|
|
@@ -334,7 +335,7 @@ var TarBuilder = class {
|
|
|
334
335
|
};
|
|
335
336
|
|
|
336
337
|
// src/parse-zip/cd-file-header.ts
|
|
337
|
-
var
|
|
338
|
+
var import_loader_utils3 = require("@loaders.gl/loader-utils");
|
|
338
339
|
|
|
339
340
|
// src/parse-zip/end-of-central-directory.ts
|
|
340
341
|
var import_loader_utils = require("@loaders.gl/loader-utils");
|
|
@@ -396,6 +397,64 @@ var parseEoCDRecord = async (file) => {
|
|
|
396
397
|
};
|
|
397
398
|
};
|
|
398
399
|
|
|
400
|
+
// src/parse-zip/zip64-info-generation.ts
|
|
401
|
+
var import_loader_utils2 = require("@loaders.gl/loader-utils");
|
|
402
|
+
var signature = new Uint8Array([1, 0]);
|
|
403
|
+
function createZip64Info(options) {
|
|
404
|
+
const optionsToUse = {
|
|
405
|
+
...options,
|
|
406
|
+
zip64Length: (options.offset ? 1 : 0) * 8 + (options.size ? 1 : 0) * 16
|
|
407
|
+
};
|
|
408
|
+
const arraysToConcat = [];
|
|
409
|
+
for (const field of ZIP64_FIELDS) {
|
|
410
|
+
if (!optionsToUse[field.name ?? ""] && !field.default) {
|
|
411
|
+
continue;
|
|
412
|
+
}
|
|
413
|
+
const newValue = new DataView(new ArrayBuffer(field.size));
|
|
414
|
+
NUMBER_SETTERS[field.size](newValue, 0, optionsToUse[field.name ?? ""] ?? field.default);
|
|
415
|
+
arraysToConcat.push(newValue.buffer);
|
|
416
|
+
}
|
|
417
|
+
return (0, import_loader_utils2.concatenateArrayBuffers)(...arraysToConcat);
|
|
418
|
+
}
|
|
419
|
+
var NUMBER_SETTERS = {
|
|
420
|
+
2: (header, offset, value) => {
|
|
421
|
+
header.setUint16(offset, value, true);
|
|
422
|
+
},
|
|
423
|
+
4: (header, offset, value) => {
|
|
424
|
+
header.setUint32(offset, value, true);
|
|
425
|
+
},
|
|
426
|
+
8: (header, offset, value) => {
|
|
427
|
+
header.setBigUint64(offset, BigInt(value), true);
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
var ZIP64_FIELDS = [
|
|
431
|
+
// Header ID 0x0001
|
|
432
|
+
{
|
|
433
|
+
size: 2,
|
|
434
|
+
default: new DataView(signature.buffer).getUint16(0, true)
|
|
435
|
+
},
|
|
436
|
+
// Size of the extra field chunk (8, 16, 24 or 28)
|
|
437
|
+
{
|
|
438
|
+
size: 2,
|
|
439
|
+
name: "zip64Length"
|
|
440
|
+
},
|
|
441
|
+
// Original uncompressed file size
|
|
442
|
+
{
|
|
443
|
+
size: 8,
|
|
444
|
+
name: "size"
|
|
445
|
+
},
|
|
446
|
+
// Size of compressed data
|
|
447
|
+
{
|
|
448
|
+
size: 8,
|
|
449
|
+
name: "size"
|
|
450
|
+
},
|
|
451
|
+
// Offset of local header record
|
|
452
|
+
{
|
|
453
|
+
size: 8,
|
|
454
|
+
name: "offset"
|
|
455
|
+
}
|
|
456
|
+
];
|
|
457
|
+
|
|
399
458
|
// src/parse-zip/cd-file-header.ts
|
|
400
459
|
var CD_COMPRESSED_SIZE_OFFSET = 20n;
|
|
401
460
|
var CD_UNCOMPRESSED_SIZE_OFFSET = 24n;
|
|
@@ -404,10 +463,10 @@ var CD_EXTRA_FIELD_LENGTH_OFFSET = 30n;
|
|
|
404
463
|
var CD_START_DISK_OFFSET = 32n;
|
|
405
464
|
var CD_LOCAL_HEADER_OFFSET_OFFSET = 42n;
|
|
406
465
|
var CD_FILE_NAME_OFFSET = 46n;
|
|
407
|
-
var
|
|
466
|
+
var signature2 = new Uint8Array([80, 75, 1, 2]);
|
|
408
467
|
var parseZipCDFileHeader = async (headerOffset, file) => {
|
|
409
468
|
const magicBytes = await file.slice(headerOffset, headerOffset + 4n);
|
|
410
|
-
if (!(0,
|
|
469
|
+
if (!(0, import_loader_utils3.compareArrayBuffers)(magicBytes, signature2.buffer)) {
|
|
411
470
|
return null;
|
|
412
471
|
}
|
|
413
472
|
const compressedSize = BigInt(await file.getUint32(headerOffset + CD_COMPRESSED_SIZE_OFFSET));
|
|
@@ -489,19 +548,156 @@ var findExpectedData = (zip64data) => {
|
|
|
489
548
|
}
|
|
490
549
|
return zip64dataList;
|
|
491
550
|
};
|
|
551
|
+
function generateCDHeader(options) {
|
|
552
|
+
const optionsToUse = {
|
|
553
|
+
...options,
|
|
554
|
+
fnlength: options.fileName.length,
|
|
555
|
+
extraLength: 0
|
|
556
|
+
};
|
|
557
|
+
let zip64header = new ArrayBuffer(0);
|
|
558
|
+
const optionsToZip64 = {};
|
|
559
|
+
if (optionsToUse.offset >= 4294967295) {
|
|
560
|
+
optionsToZip64.offset = optionsToUse.offset;
|
|
561
|
+
optionsToUse.offset = 4294967295;
|
|
562
|
+
}
|
|
563
|
+
if (optionsToUse.length >= 4294967295) {
|
|
564
|
+
optionsToZip64.size = optionsToUse.length;
|
|
565
|
+
optionsToUse.length = 4294967295;
|
|
566
|
+
}
|
|
567
|
+
if (Object.keys(optionsToZip64).length) {
|
|
568
|
+
zip64header = createZip64Info(optionsToZip64);
|
|
569
|
+
optionsToUse.extraLength = zip64header.byteLength;
|
|
570
|
+
}
|
|
571
|
+
const header = new DataView(new ArrayBuffer(46));
|
|
572
|
+
for (const field of ZIP_HEADER_FIELDS) {
|
|
573
|
+
NUMBER_SETTERS[field.size](
|
|
574
|
+
header,
|
|
575
|
+
field.offset,
|
|
576
|
+
optionsToUse[field.name ?? ""] ?? field.default ?? 0
|
|
577
|
+
);
|
|
578
|
+
}
|
|
579
|
+
const encodedName = new TextEncoder().encode(optionsToUse.fileName);
|
|
580
|
+
const resHeader = (0, import_loader_utils3.concatenateArrayBuffers)(header.buffer, encodedName, zip64header);
|
|
581
|
+
return resHeader;
|
|
582
|
+
}
|
|
583
|
+
var ZIP_HEADER_FIELDS = [
|
|
584
|
+
// Central directory file header signature = 0x02014b50
|
|
585
|
+
{
|
|
586
|
+
offset: 0,
|
|
587
|
+
size: 4,
|
|
588
|
+
default: new DataView(signature2.buffer).getUint32(0, true)
|
|
589
|
+
},
|
|
590
|
+
// Version made by
|
|
591
|
+
{
|
|
592
|
+
offset: 4,
|
|
593
|
+
size: 2,
|
|
594
|
+
default: 45
|
|
595
|
+
},
|
|
596
|
+
// Version needed to extract (minimum)
|
|
597
|
+
{
|
|
598
|
+
offset: 6,
|
|
599
|
+
size: 2,
|
|
600
|
+
default: 45
|
|
601
|
+
},
|
|
602
|
+
// General purpose bit flag
|
|
603
|
+
{
|
|
604
|
+
offset: 8,
|
|
605
|
+
size: 2,
|
|
606
|
+
default: 0
|
|
607
|
+
},
|
|
608
|
+
// Compression method
|
|
609
|
+
{
|
|
610
|
+
offset: 10,
|
|
611
|
+
size: 2,
|
|
612
|
+
default: 0
|
|
613
|
+
},
|
|
614
|
+
// File last modification time
|
|
615
|
+
{
|
|
616
|
+
offset: 12,
|
|
617
|
+
size: 2,
|
|
618
|
+
default: 0
|
|
619
|
+
},
|
|
620
|
+
// File last modification date
|
|
621
|
+
{
|
|
622
|
+
offset: 14,
|
|
623
|
+
size: 2,
|
|
624
|
+
default: 0
|
|
625
|
+
},
|
|
626
|
+
// CRC-32 of uncompressed data
|
|
627
|
+
{
|
|
628
|
+
offset: 16,
|
|
629
|
+
size: 4,
|
|
630
|
+
name: "crc32"
|
|
631
|
+
},
|
|
632
|
+
// Compressed size (or 0xffffffff for ZIP64)
|
|
633
|
+
{
|
|
634
|
+
offset: 20,
|
|
635
|
+
size: 4,
|
|
636
|
+
name: "length"
|
|
637
|
+
},
|
|
638
|
+
// Uncompressed size (or 0xffffffff for ZIP64)
|
|
639
|
+
{
|
|
640
|
+
offset: 24,
|
|
641
|
+
size: 4,
|
|
642
|
+
name: "length"
|
|
643
|
+
},
|
|
644
|
+
// File name length (n)
|
|
645
|
+
{
|
|
646
|
+
offset: 28,
|
|
647
|
+
size: 2,
|
|
648
|
+
name: "fnlength"
|
|
649
|
+
},
|
|
650
|
+
// Extra field length (m)
|
|
651
|
+
{
|
|
652
|
+
offset: 30,
|
|
653
|
+
size: 2,
|
|
654
|
+
default: 0,
|
|
655
|
+
name: "extraLength"
|
|
656
|
+
},
|
|
657
|
+
// File comment length (k)
|
|
658
|
+
{
|
|
659
|
+
offset: 32,
|
|
660
|
+
size: 2,
|
|
661
|
+
default: 0
|
|
662
|
+
},
|
|
663
|
+
// Disk number where file starts (or 0xffff for ZIP64)
|
|
664
|
+
{
|
|
665
|
+
offset: 34,
|
|
666
|
+
size: 2,
|
|
667
|
+
default: 0
|
|
668
|
+
},
|
|
669
|
+
// Internal file attributes
|
|
670
|
+
{
|
|
671
|
+
offset: 36,
|
|
672
|
+
size: 2,
|
|
673
|
+
default: 0
|
|
674
|
+
},
|
|
675
|
+
// External file attributes
|
|
676
|
+
{
|
|
677
|
+
offset: 38,
|
|
678
|
+
size: 4,
|
|
679
|
+
default: 0
|
|
680
|
+
},
|
|
681
|
+
// Relative offset of local file header
|
|
682
|
+
{
|
|
683
|
+
offset: 42,
|
|
684
|
+
size: 4,
|
|
685
|
+
name: "offset"
|
|
686
|
+
}
|
|
687
|
+
];
|
|
492
688
|
|
|
493
689
|
// src/parse-zip/local-file-header.ts
|
|
494
|
-
var
|
|
690
|
+
var import_loader_utils4 = require("@loaders.gl/loader-utils");
|
|
495
691
|
var COMPRESSION_METHOD_OFFSET = 8n;
|
|
496
692
|
var COMPRESSED_SIZE_OFFSET = 18n;
|
|
497
693
|
var UNCOMPRESSED_SIZE_OFFSET = 22n;
|
|
498
694
|
var FILE_NAME_LENGTH_OFFSET = 26n;
|
|
499
695
|
var EXTRA_FIELD_LENGTH_OFFSET = 28n;
|
|
500
696
|
var FILE_NAME_OFFSET = 30n;
|
|
501
|
-
var
|
|
697
|
+
var signature3 = new Uint8Array([80, 75, 3, 4]);
|
|
502
698
|
var parseZipLocalFileHeader = async (headerOffset, buffer) => {
|
|
503
699
|
const magicBytes = await buffer.slice(headerOffset, headerOffset + 4n);
|
|
504
|
-
if (!(0,
|
|
700
|
+
if (!(0, import_loader_utils4.compareArrayBuffers)(magicBytes, signature3)) {
|
|
505
701
|
return null;
|
|
506
702
|
}
|
|
507
703
|
const fileNameLength = await buffer.getUint16(headerOffset + FILE_NAME_LENGTH_OFFSET);
|
|
@@ -569,9 +765,9 @@ async function makeHashTableFromZipHeaders(fileProvider) {
|
|
|
569
765
|
}
|
|
570
766
|
|
|
571
767
|
// src/filesystems/zip-filesystem.ts
|
|
572
|
-
var import_loader_utils4 = require("@loaders.gl/loader-utils");
|
|
573
768
|
var import_loader_utils5 = require("@loaders.gl/loader-utils");
|
|
574
769
|
var import_loader_utils6 = require("@loaders.gl/loader-utils");
|
|
770
|
+
var import_loader_utils7 = require("@loaders.gl/loader-utils");
|
|
575
771
|
var import_compression = require("@loaders.gl/compression");
|
|
576
772
|
var COMPRESSION_METHODS = {
|
|
577
773
|
/** No compression */
|
|
@@ -593,12 +789,12 @@ var ZipFileSystem = class {
|
|
|
593
789
|
this.fileProvider = null;
|
|
594
790
|
if (typeof file === "string") {
|
|
595
791
|
this.fileName = file;
|
|
596
|
-
if (!
|
|
597
|
-
this.fileProvider = new
|
|
792
|
+
if (!import_loader_utils5.isBrowser) {
|
|
793
|
+
this.fileProvider = new import_loader_utils7.FileHandleFile(file);
|
|
598
794
|
} else {
|
|
599
795
|
throw new Error("Cannot open file for random access in a WEB browser");
|
|
600
796
|
}
|
|
601
|
-
} else if ((0,
|
|
797
|
+
} else if ((0, import_loader_utils6.isFileProvider)(file)) {
|
|
602
798
|
this.fileProvider = file;
|
|
603
799
|
}
|
|
604
800
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { ZipLoader } from './zip-loader';
|
|
2
2
|
export { ZipWriter } from './zip-writer';
|
|
3
3
|
export { TarBuilder } from './tar-builder';
|
|
4
|
-
export { parseZipCDFileHeader, makeZipCDHeaderIterator, signature as
|
|
4
|
+
export { parseZipCDFileHeader, makeZipCDHeaderIterator, signature as CD_HEADER_SIGNATURE, generateCDHeader } from './parse-zip/cd-file-header';
|
|
5
5
|
export { parseZipLocalFileHeader, signature as localHeaderSignature } from './parse-zip/local-file-header';
|
|
6
6
|
export { parseEoCDRecord } from './parse-zip/end-of-central-directory';
|
|
7
7
|
export { searchFromTheEnd } from './parse-zip/search-from-the-end';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAEzC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,SAAS,IAAI,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAC;AAEzC,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,SAAS,IAAI,mBAAmB,EAChC,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,uBAAuB,EACvB,SAAS,IAAI,oBAAoB,EAClC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAC,eAAe,EAAC,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAC,gBAAgB,EAAC,MAAM,iCAAiC,CAAC;AAGjE,OAAO,EAAC,cAAc,EAAE,2BAA2B,EAAC,MAAM,qBAAqB,CAAC;AAEhF,OAAO,EAAC,aAAa,EAAC,MAAM,8BAA8B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { ZipLoader } from "./zip-loader.js";
|
|
2
2
|
export { ZipWriter } from "./zip-writer.js";
|
|
3
3
|
export { TarBuilder } from "./tar-builder.js";
|
|
4
|
-
export { parseZipCDFileHeader, makeZipCDHeaderIterator, signature as
|
|
4
|
+
export { parseZipCDFileHeader, makeZipCDHeaderIterator, signature as CD_HEADER_SIGNATURE, generateCDHeader } from "./parse-zip/cd-file-header.js";
|
|
5
5
|
export { parseZipLocalFileHeader, signature as localHeaderSignature } from "./parse-zip/local-file-header.js";
|
|
6
6
|
export { parseEoCDRecord } from "./parse-zip/end-of-central-directory.js";
|
|
7
7
|
export { searchFromTheEnd } from "./parse-zip/search-from-the-end.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["ZipLoader","ZipWriter","TarBuilder","parseZipCDFileHeader","makeZipCDHeaderIterator","signature","
|
|
1
|
+
{"version":3,"file":"index.js","names":["ZipLoader","ZipWriter","TarBuilder","parseZipCDFileHeader","makeZipCDHeaderIterator","signature","CD_HEADER_SIGNATURE","generateCDHeader","parseZipLocalFileHeader","localHeaderSignature","parseEoCDRecord","searchFromTheEnd","parseHashTable","makeHashTableFromZipHeaders","ZipFileSystem"],"sources":["../src/index.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\nexport {ZipLoader} from './zip-loader';\nexport {ZipWriter} from './zip-writer';\nexport {TarBuilder} from './tar-builder';\n\nexport {\n parseZipCDFileHeader,\n makeZipCDHeaderIterator,\n signature as CD_HEADER_SIGNATURE,\n generateCDHeader\n} from './parse-zip/cd-file-header';\nexport {\n parseZipLocalFileHeader,\n signature as localHeaderSignature\n} from './parse-zip/local-file-header';\nexport {parseEoCDRecord} from './parse-zip/end-of-central-directory';\nexport {searchFromTheEnd} from './parse-zip/search-from-the-end';\n\n// export type {HashElement} from './hash-file-utility';\nexport {parseHashTable, makeHashTableFromZipHeaders} from './hash-file-utility';\n\nexport {ZipFileSystem} from './filesystems/zip-filesystem';\n"],"mappings":"SAGQA,SAAS;AAAA,SACTC,SAAS;AAAA,SACTC,UAAU;AAAA,SAGhBC,oBAAoB,EACpBC,uBAAuB,EACvBC,SAAS,IAAIC,mBAAmB,EAChCC,gBAAgB;AAAA,SAGhBC,uBAAuB,EACvBH,SAAS,IAAII,oBAAoB;AAAA,SAE3BC,eAAe;AAAA,SACfC,gBAAgB;AAAA,SAGhBC,cAAc,EAAEC,2BAA2B;AAAA,SAE3CC,aAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../src/lib/tar/header.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../../src/lib/tar/header.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAe,OAAO,EAAC,MAAM,SAAS,CAAC;AAyCnD;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,UAAU,CAsB/E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.js","names":["utils","structure","fileName","fileMode","uid","gid","fileSize","mtime","checksum","type","linkName","ustar","owner","group","majorNumber","minorNumber","filenamePrefix","padding","format","data","cb","buffer","clean","offset","Object","entries","forEach","_ref","field","length","str","i","fieldLength","charCodeAt"],"sources":["../../../src/lib/tar/header.ts"],"sourcesContent":["// This file is derived from the tar-js code base under MIT license\n// See https://github.com/beatgammit/tar-js/blob/master/LICENSE\n/*\n * tar-js\n * MIT (c) 2011 T. Jameson Little\n */\n/* eslint-disable */\nimport * as utils from './utils';\nimport type {TarStructure, TarData} from './types';\n/*\nstruct posix_header { // byte offset\n\tchar name[100]; // 0\n\tchar mode[8]; // 100\n\tchar uid[8]; // 108\n\tchar gid[8]; // 116\n\tchar size[12]; // 124\n\tchar mtime[12]; // 136\n\tchar chksum[8]; // 148\n\tchar typeflag; // 156\n\tchar linkname[100]; // 157\n\tchar magic[6]; // 257\n\tchar version[2]; // 263\n\tchar uname[32]; // 265\n\tchar gname[32]; // 297\n\tchar devmajor[8]; // 329\n\tchar devminor[8]; // 337\n\tchar prefix[155]; // 345\n // 500\n};\n*/\n\nconst structure: TarStructure = {\n fileName: 100,\n fileMode: 8,\n uid: 8,\n gid: 8,\n fileSize: 12,\n mtime: 12,\n checksum: 8,\n type: 1,\n linkName: 100,\n ustar: 8,\n owner: 32,\n group: 32,\n majorNumber: 8,\n minorNumber: 8,\n filenamePrefix: 155,\n padding: 12\n};\n/**\n * Getting the header\n * @param data\n * @param [cb]\n * @returns {Uint8Array} | Array\n */\nexport function format(data: TarData, cb?: any): [string, number][] | Uint8Array {\n const buffer = utils.clean(512);\n let offset = 0;\n\n Object.entries(structure).forEach(([field, length]) => {\n const str = data[field] || '';\n let i: number;\n let fieldLength: number;\n\n for (i = 0, fieldLength = str.length; i < fieldLength; i += 1) {\n buffer[offset] = str.charCodeAt(i);\n offset += 1;\n }\n\n // space it out with nulls\n offset += length - i;\n });\n\n if (typeof cb === 'function') {\n return cb(buffer, offset);\n }\n return buffer;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"header.js","names":["utils","structure","fileName","fileMode","uid","gid","fileSize","mtime","checksum","type","linkName","ustar","owner","group","majorNumber","minorNumber","filenamePrefix","padding","format","data","cb","buffer","clean","offset","Object","entries","forEach","_ref","field","length","str","i","fieldLength","charCodeAt"],"sources":["../../../src/lib/tar/header.ts"],"sourcesContent":["// loaders.gl, MIT license\n// Copyright (c) vis.gl contributors\n\n// This file is derived from the tar-js code base under MIT license\n// See https://github.com/beatgammit/tar-js/blob/master/LICENSE\n/*\n * tar-js\n * MIT (c) 2011 T. Jameson Little\n */\n/* eslint-disable */\nimport * as utils from './utils';\nimport type {TarStructure, TarData} from './types';\n/*\nstruct posix_header { // byte offset\n\tchar name[100]; // 0\n\tchar mode[8]; // 100\n\tchar uid[8]; // 108\n\tchar gid[8]; // 116\n\tchar size[12]; // 124\n\tchar mtime[12]; // 136\n\tchar chksum[8]; // 148\n\tchar typeflag; // 156\n\tchar linkname[100]; // 157\n\tchar magic[6]; // 257\n\tchar version[2]; // 263\n\tchar uname[32]; // 265\n\tchar gname[32]; // 297\n\tchar devmajor[8]; // 329\n\tchar devminor[8]; // 337\n\tchar prefix[155]; // 345\n // 500\n};\n*/\n\nconst structure: TarStructure = {\n fileName: 100,\n fileMode: 8,\n uid: 8,\n gid: 8,\n fileSize: 12,\n mtime: 12,\n checksum: 8,\n type: 1,\n linkName: 100,\n ustar: 8,\n owner: 32,\n group: 32,\n majorNumber: 8,\n minorNumber: 8,\n filenamePrefix: 155,\n padding: 12\n};\n/**\n * Getting the header\n * @param data\n * @param [cb]\n * @returns {Uint8Array} | Array\n */\nexport function format(data: TarData, cb?: any): [string, number][] | Uint8Array {\n const buffer = utils.clean(512);\n let offset = 0;\n\n Object.entries(structure).forEach(([field, length]) => {\n const str = data[field] || '';\n let i: number;\n let fieldLength: number;\n\n for (i = 0, fieldLength = str.length; i < fieldLength; i += 1) {\n buffer[offset] = str.charCodeAt(i);\n offset += 1;\n }\n\n // space it out with nulls\n offset += length - i;\n });\n\n if (typeof cb === 'function') {\n return cb(buffer, offset);\n }\n return buffer;\n}\n"],"mappings":"OAUO,KAAKA,KAAK;AAwBjB,MAAMC,SAAuB,GAAG;EAC9BC,QAAQ,EAAE,GAAG;EACbC,QAAQ,EAAE,CAAC;EACXC,GAAG,EAAE,CAAC;EACNC,GAAG,EAAE,CAAC;EACNC,QAAQ,EAAE,EAAE;EACZC,KAAK,EAAE,EAAE;EACTC,QAAQ,EAAE,CAAC;EACXC,IAAI,EAAE,CAAC;EACPC,QAAQ,EAAE,GAAG;EACbC,KAAK,EAAE,CAAC;EACRC,KAAK,EAAE,EAAE;EACTC,KAAK,EAAE,EAAE;EACTC,WAAW,EAAE,CAAC;EACdC,WAAW,EAAE,CAAC;EACdC,cAAc,EAAE,GAAG;EACnBC,OAAO,EAAE;AACX,CAAC;AAOD,OAAO,SAASC,MAAMA,CAACC,IAAa,EAAEC,EAAQ,EAAmC;EAC/E,MAAMC,MAAM,GAAGrB,KAAK,CAACsB,KAAK,CAAC,GAAG,CAAC;EAC/B,IAAIC,MAAM,GAAG,CAAC;EAEdC,MAAM,CAACC,OAAO,CAACxB,SAAS,CAAC,CAACyB,OAAO,CAACC,IAAA,IAAqB;IAAA,IAApB,CAACC,KAAK,EAAEC,MAAM,CAAC,GAAAF,IAAA;IAChD,MAAMG,GAAG,GAAGX,IAAI,CAACS,KAAK,CAAC,IAAI,EAAE;IAC7B,IAAIG,CAAS;IACb,IAAIC,WAAmB;IAEvB,KAAKD,CAAC,GAAG,CAAC,EAAEC,WAAW,GAAGF,GAAG,CAACD,MAAM,EAAEE,CAAC,GAAGC,WAAW,EAAED,CAAC,IAAI,CAAC,EAAE;MAC7DV,MAAM,CAACE,MAAM,CAAC,GAAGO,GAAG,CAACG,UAAU,CAACF,CAAC,CAAC;MAClCR,MAAM,IAAI,CAAC;IACb;IAGAA,MAAM,IAAIM,MAAM,GAAGE,CAAC;EACtB,CAAC,CAAC;EAEF,IAAI,OAAOX,EAAE,KAAK,UAAU,EAAE;IAC5B,OAAOA,EAAE,CAACC,MAAM,EAAEE,MAAM,CAAC;EAC3B;EACA,OAAOF,MAAM;AACf"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tar.d.ts","sourceRoot":"","sources":["../../../src/lib/tar/tar.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tar.d.ts","sourceRoot":"","sources":["../../../src/lib/tar/tar.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAC,SAAS,EAAE,UAAU,EAAsB,MAAM,SAAS,CAAC;AAQxE,cAAM,GAAG;IACP,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,EAAE,SAAS,CAAM;IACvB,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;gBACS,eAAe,EAAE,MAAM,GAAG,SAAS;IAY/C;;;;;OAKG;IAEH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,SAAS;IA+DlF;;;OAGG;IACH,IAAI,IAAI,IAAI;IAkCZ;;OAEG;IACH,KAAK;CAIN;AAED,eAAe,GAAG,CAAC"}
|