@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.
Files changed (48) hide show
  1. package/dist/dist.dev.js +151 -6
  2. package/dist/filesystems/zip-filesystem.d.ts.map +1 -1
  3. package/dist/filesystems/zip-filesystem.js.map +1 -1
  4. package/dist/hash-file-utility.d.ts.map +1 -1
  5. package/dist/hash-file-utility.js.map +1 -1
  6. package/dist/index.cjs +208 -12
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/lib/tar/header.d.ts.map +1 -1
  12. package/dist/lib/tar/header.js.map +1 -1
  13. package/dist/lib/tar/tar.d.ts.map +1 -1
  14. package/dist/lib/tar/tar.js.map +1 -1
  15. package/dist/lib/tar/types.d.ts.map +1 -1
  16. package/dist/lib/tar/types.js.map +1 -1
  17. package/dist/lib/tar/utils.d.ts.map +1 -1
  18. package/dist/lib/tar/utils.js.map +1 -1
  19. package/dist/parse-zip/cd-file-header.d.ts +18 -0
  20. package/dist/parse-zip/cd-file-header.d.ts.map +1 -1
  21. package/dist/parse-zip/cd-file-header.js +101 -1
  22. package/dist/parse-zip/cd-file-header.js.map +1 -1
  23. package/dist/parse-zip/end-of-central-directory.d.ts.map +1 -1
  24. package/dist/parse-zip/end-of-central-directory.js.map +1 -1
  25. package/dist/parse-zip/local-file-header.d.ts.map +1 -1
  26. package/dist/parse-zip/local-file-header.js.map +1 -1
  27. package/dist/parse-zip/search-from-the-end.d.ts.map +1 -1
  28. package/dist/parse-zip/search-from-the-end.js.map +1 -1
  29. package/dist/parse-zip/zip64-info-generation.d.ts +27 -0
  30. package/dist/parse-zip/zip64-info-generation.d.ts.map +1 -0
  31. package/dist/parse-zip/zip64-info-generation.js +47 -0
  32. package/dist/parse-zip/zip64-info-generation.js.map +1 -0
  33. package/dist/tar-builder.d.ts.map +1 -1
  34. package/dist/tar-builder.js.map +1 -1
  35. package/package.json +5 -5
  36. package/src/filesystems/zip-filesystem.ts +3 -0
  37. package/src/hash-file-utility.ts +3 -0
  38. package/src/index.ts +2 -1
  39. package/src/lib/tar/header.ts +3 -0
  40. package/src/lib/tar/tar.ts +3 -0
  41. package/src/lib/tar/types.ts +3 -0
  42. package/src/lib/tar/utils.ts +3 -0
  43. package/src/parse-zip/cd-file-header.ts +185 -1
  44. package/src/parse-zip/end-of-central-directory.ts +3 -0
  45. package/src/parse-zip/local-file-header.ts +3 -0
  46. package/src/parse-zip/search-from-the-end.ts +3 -0
  47. package/src/parse-zip/zip64-info-generation.ts +90 -0
  48. 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
- cdSignature: () => signature,
6959
- localHeaderSignature: () => signature2,
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 signature = new Uint8Array([80, 75, 1, 2]);
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, signature.buffer)) {
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 signature2 = new Uint8Array([80, 75, 3, 4]);
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, signature2)) {
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":"AAAA,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
+ {"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":["import {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
+ {"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":"AACA,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
+ {"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":["import {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":"AAAA,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"}
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
- cdSignature: () => signature,
38
- localHeaderSignature: () => signature2,
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 import_loader_utils2 = require("@loaders.gl/loader-utils");
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 signature = new Uint8Array([80, 75, 1, 2]);
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, import_loader_utils2.compareArrayBuffers)(magicBytes, signature.buffer)) {
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 import_loader_utils3 = require("@loaders.gl/loader-utils");
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 signature2 = new Uint8Array([80, 75, 3, 4]);
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, import_loader_utils3.compareArrayBuffers)(magicBytes, signature2)) {
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 (!import_loader_utils4.isBrowser) {
597
- this.fileProvider = new import_loader_utils6.FileHandleFile(file);
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, import_loader_utils5.isFileProvider)(file)) {
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 cdSignature } from './parse-zip/cd-file-header';
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';
@@ -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,WAAW,EACzB,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"}
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 cdSignature } from "./parse-zip/cd-file-header.js";
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","cdSignature","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 cdSignature\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,WAAW;AAAA,SAGxBC,uBAAuB,EACvBF,SAAS,IAAIG,oBAAoB;AAAA,SAE3BC,eAAe;AAAA,SACfC,gBAAgB;AAAA,SAGhBC,cAAc,EAAEC,2BAA2B;AAAA,SAE3CC,aAAa"}
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":"AAQA,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
+ {"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":"OAOO,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
+ {"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":"AASA,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"}
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"}