@loaders.gl/zip 4.0.4 → 4.1.0-alpha.10

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 (68) hide show
  1. package/dist/dist.dev.js +434 -27
  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 +6 -0
  5. package/dist/hash-file-utility.d.ts.map +1 -1
  6. package/dist/hash-file-utility.js +22 -0
  7. package/dist/hash-file-utility.js.map +1 -1
  8. package/dist/index.cjs +462 -32
  9. package/dist/index.d.ts +4 -3
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +4 -3
  12. package/dist/index.js.map +1 -1
  13. package/dist/lib/tar/header.d.ts.map +1 -1
  14. package/dist/lib/tar/header.js.map +1 -1
  15. package/dist/lib/tar/tar.d.ts.map +1 -1
  16. package/dist/lib/tar/tar.js.map +1 -1
  17. package/dist/lib/tar/types.d.ts.map +1 -1
  18. package/dist/lib/tar/types.js.map +1 -1
  19. package/dist/lib/tar/utils.d.ts.map +1 -1
  20. package/dist/lib/tar/utils.js.map +1 -1
  21. package/dist/parse-zip/cd-file-header.d.ts +18 -0
  22. package/dist/parse-zip/cd-file-header.d.ts.map +1 -1
  23. package/dist/parse-zip/cd-file-header.js +101 -1
  24. package/dist/parse-zip/cd-file-header.js.map +1 -1
  25. package/dist/parse-zip/end-of-central-directory.d.ts +19 -0
  26. package/dist/parse-zip/end-of-central-directory.d.ts.map +1 -1
  27. package/dist/parse-zip/end-of-central-directory.js +41 -8
  28. package/dist/parse-zip/end-of-central-directory.js.map +1 -1
  29. package/dist/parse-zip/local-file-header.d.ts +16 -0
  30. package/dist/parse-zip/local-file-header.d.ts.map +1 -1
  31. package/dist/parse-zip/local-file-header.js +73 -1
  32. package/dist/parse-zip/local-file-header.js.map +1 -1
  33. package/dist/parse-zip/search-from-the-end.d.ts.map +1 -1
  34. package/dist/parse-zip/search-from-the-end.js.map +1 -1
  35. package/dist/parse-zip/zip-compozition.d.ts +8 -0
  36. package/dist/parse-zip/zip-compozition.d.ts.map +1 -0
  37. package/dist/parse-zip/zip-compozition.js +43 -0
  38. package/dist/parse-zip/zip-compozition.js.map +1 -0
  39. package/dist/parse-zip/zip64-info-generation.d.ts +24 -0
  40. package/dist/parse-zip/zip64-info-generation.d.ts.map +1 -0
  41. package/dist/parse-zip/zip64-info-generation.js +50 -0
  42. package/dist/parse-zip/zip64-info-generation.js.map +1 -0
  43. package/dist/tar-builder.d.ts.map +1 -1
  44. package/dist/tar-builder.js.map +1 -1
  45. package/dist/zip-loader.d.ts.map +1 -1
  46. package/dist/zip-loader.js +1 -1
  47. package/dist/zip-loader.js.map +1 -1
  48. package/dist/zip-writer.d.ts +2 -2
  49. package/dist/zip-writer.d.ts.map +1 -1
  50. package/dist/zip-writer.js +22 -7
  51. package/dist/zip-writer.js.map +1 -1
  52. package/package.json +7 -7
  53. package/src/filesystems/zip-filesystem.ts +2 -1
  54. package/src/hash-file-utility.ts +52 -2
  55. package/src/index.ts +8 -4
  56. package/src/lib/tar/header.ts +2 -1
  57. package/src/lib/tar/tar.ts +2 -1
  58. package/src/lib/tar/types.ts +2 -1
  59. package/src/lib/tar/utils.ts +2 -1
  60. package/src/parse-zip/cd-file-header.ts +185 -2
  61. package/src/parse-zip/end-of-central-directory.ts +99 -9
  62. package/src/parse-zip/local-file-header.ts +128 -2
  63. package/src/parse-zip/search-from-the-end.ts +2 -1
  64. package/src/parse-zip/zip-compozition.ts +113 -0
  65. package/src/parse-zip/zip64-info-generation.ts +106 -0
  66. package/src/tar-builder.ts +2 -1
  67. package/src/zip-loader.ts +2 -1
  68. package/src/zip-writer.ts +24 -10
package/dist/dist.dev.js CHANGED
@@ -6951,12 +6951,16 @@ 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
+ addOneFile: () => addOneFile,
6960
+ composeHashFile: () => composeHashFile,
6961
+ generateCDHeader: () => generateCDHeader,
6962
+ generateLocalHeader: () => generateLocalHeader,
6963
+ localHeaderSignature: () => signature3,
6960
6964
  makeHashTableFromZipHeaders: () => makeHashTableFromZipHeaders,
6961
6965
  makeZipCDHeaderIterator: () => makeZipCDHeaderIterator,
6962
6966
  parseEoCDRecord: () => parseEoCDRecord,
@@ -6968,7 +6972,7 @@ var __exports__ = (() => {
6968
6972
 
6969
6973
  // src/zip-loader.ts
6970
6974
  var import_jszip = __toESM(require_jszip_min(), 1);
6971
- var VERSION = typeof __VERSION__ !== "undefined" ? __VERSION__ : "latest";
6975
+ var VERSION = true ? "4.1.0-alpha.10" : "latest";
6972
6976
  var ZipLoader = {
6973
6977
  id: "zip",
6974
6978
  module: "zip",
@@ -7013,11 +7017,22 @@ var __exports__ = (() => {
7013
7017
 
7014
7018
  // src/zip-writer.ts
7015
7019
  var import_jszip2 = __toESM(require_jszip_min(), 1);
7020
+ var VERSION2 = true ? "4.1.0-alpha.10" : "latest";
7016
7021
  var ZipWriter = {
7017
7022
  name: "Zip Archive",
7023
+ id: "zip",
7024
+ module: "zip",
7025
+ version: VERSION2,
7018
7026
  extensions: ["zip"],
7019
7027
  category: "archive",
7020
7028
  mimeTypes: ["application/zip"],
7029
+ options: {
7030
+ zip: {
7031
+ onUpdate: () => {
7032
+ }
7033
+ },
7034
+ jszip: {}
7035
+ },
7021
7036
  encode: encodeZipAsync
7022
7037
  };
7023
7038
  async function encodeZipAsync(fileMap, options = {}) {
@@ -7026,18 +7041,21 @@ var __exports__ = (() => {
7026
7041
  const subFileData = fileMap[subFileName];
7027
7042
  jsZip.file(subFileName, subFileData, options?.jszip || {});
7028
7043
  }
7044
+ const zipOptions = {
7045
+ ...ZipWriter.options.zip,
7046
+ ...options?.zip
7047
+ };
7029
7048
  const jszipOptions = {
7030
- ...options?.jszip,
7031
- type: "arraybuffer"
7049
+ ...ZipWriter.options?.jszip,
7050
+ ...options.jszip
7032
7051
  };
7033
- const {
7034
- onUpdate = () => {
7035
- }
7036
- } = options;
7037
7052
  try {
7038
- return await jsZip.generateAsync(jszipOptions, onUpdate);
7053
+ return await jsZip.generateAsync({
7054
+ ...jszipOptions,
7055
+ type: "arraybuffer"
7056
+ }, zipOptions.onUpdate);
7039
7057
  } catch (error) {
7040
- options.log.error(`Unable to write zip archive: ${error}`);
7058
+ options.log.error(`Unable to encode zip archive: ${error}`);
7041
7059
  throw error;
7042
7060
  }
7043
7061
  }
@@ -7278,6 +7296,9 @@ var __exports__ = (() => {
7278
7296
  return true;
7279
7297
  }
7280
7298
  function concatenateArrayBuffers(...sources) {
7299
+ return concatenateArrayBuffersFromArray(sources);
7300
+ }
7301
+ function concatenateArrayBuffersFromArray(sources) {
7281
7302
  const sourceArrays = sources.map((source2) => source2 instanceof ArrayBuffer ? new Uint8Array(source2) : source2);
7282
7303
  const byteLength = sourceArrays.reduce((length, typedArray) => length + typedArray.byteLength, 0);
7283
7304
  const result = new Uint8Array(byteLength);
@@ -7360,6 +7381,12 @@ var __exports__ = (() => {
7360
7381
  async stat() {
7361
7382
  throw NOT_IMPLEMENTED;
7362
7383
  }
7384
+ async truncate(length) {
7385
+ throw NOT_IMPLEMENTED;
7386
+ }
7387
+ async append(data) {
7388
+ throw NOT_IMPLEMENTED;
7389
+ }
7363
7390
  async close() {
7364
7391
  }
7365
7392
  };
@@ -7371,9 +7398,14 @@ var __exports__ = (() => {
7371
7398
 
7372
7399
  // ../loader-utils/src/lib/file-provider/file-handle-file.ts
7373
7400
  var FileHandleFile = class {
7374
- constructor(path) {
7375
- this.file = new NodeFileFacade(path, "r");
7376
- this.size = this.file.bigsize;
7401
+ constructor(path, append = false) {
7402
+ this.file = new NodeFileFacade(path, append ? "a+" : "r");
7403
+ }
7404
+ async truncate(length) {
7405
+ await this.file.truncate(length);
7406
+ }
7407
+ async append(buffer) {
7408
+ await this.file.append(buffer);
7377
7409
  }
7378
7410
  async destroy() {
7379
7411
  await this.file.close();
@@ -7419,7 +7451,7 @@ var __exports__ = (() => {
7419
7451
  return await this.file.read(startOffset, length);
7420
7452
  }
7421
7453
  get length() {
7422
- return this.size;
7454
+ return this.file.bigsize;
7423
7455
  }
7424
7456
  };
7425
7457
 
@@ -7440,38 +7472,119 @@ var __exports__ = (() => {
7440
7472
  return targetOffset;
7441
7473
  };
7442
7474
 
7475
+ // src/parse-zip/zip64-info-generation.ts
7476
+ var signature = new Uint8Array([1, 0]);
7477
+ function createZip64Info(options) {
7478
+ const optionsToUse = {
7479
+ ...options,
7480
+ zip64Length: (options.offset ? 1 : 0) * 8 + (options.size ? 1 : 0) * 16
7481
+ };
7482
+ const arraysToConcat = [];
7483
+ for (const field of ZIP64_FIELDS) {
7484
+ if (!optionsToUse[field.name ?? ""] && !field.default) {
7485
+ continue;
7486
+ }
7487
+ const newValue = new DataView(new ArrayBuffer(field.size));
7488
+ NUMBER_SETTERS[field.size](newValue, 0, optionsToUse[field.name ?? ""] ?? field.default);
7489
+ arraysToConcat.push(newValue.buffer);
7490
+ }
7491
+ return concatenateArrayBuffers(...arraysToConcat);
7492
+ }
7493
+ function setFieldToNumber(header, fieldSize, fieldOffset, value) {
7494
+ NUMBER_SETTERS[fieldSize](header, Number(fieldOffset), value);
7495
+ }
7496
+ var NUMBER_SETTERS = {
7497
+ 2: (header, offset, value) => {
7498
+ header.setUint16(offset, Number(value), true);
7499
+ },
7500
+ 4: (header, offset, value) => {
7501
+ header.setUint32(offset, Number(value), true);
7502
+ },
7503
+ 8: (header, offset, value) => {
7504
+ header.setBigUint64(offset, BigInt(value), true);
7505
+ }
7506
+ };
7507
+ var ZIP64_FIELDS = [{
7508
+ size: 2,
7509
+ default: new DataView(signature.buffer).getUint16(0, true)
7510
+ }, {
7511
+ size: 2,
7512
+ name: "zip64Length"
7513
+ }, {
7514
+ size: 8,
7515
+ name: "size"
7516
+ }, {
7517
+ size: 8,
7518
+ name: "size"
7519
+ }, {
7520
+ size: 8,
7521
+ name: "offset"
7522
+ }];
7523
+
7443
7524
  // src/parse-zip/end-of-central-directory.ts
7444
7525
  var eoCDSignature = new Uint8Array([80, 75, 5, 6]);
7445
7526
  var zip64EoCDLocatorSignature = new Uint8Array([80, 75, 6, 7]);
7446
7527
  var zip64EoCDSignature = new Uint8Array([80, 75, 6, 6]);
7447
7528
  var CD_RECORDS_NUMBER_OFFSET = 8n;
7529
+ var CD_RECORDS_NUMBER_ON_DISC_OFFSET = 10n;
7530
+ var CD_CD_BYTE_SIZE_OFFSET = 12n;
7448
7531
  var CD_START_OFFSET_OFFSET = 16n;
7449
7532
  var ZIP64_EOCD_START_OFFSET_OFFSET = 8n;
7450
7533
  var ZIP64_CD_RECORDS_NUMBER_OFFSET = 24n;
7534
+ var ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET = 32n;
7535
+ var ZIP64_CD_CD_BYTE_SIZE_OFFSET = 40n;
7451
7536
  var ZIP64_CD_START_OFFSET_OFFSET = 48n;
7452
7537
  var parseEoCDRecord = async (file) => {
7453
7538
  const zipEoCDOffset = await searchFromTheEnd(file, eoCDSignature);
7454
7539
  let cdRecordsNumber = BigInt(await file.getUint16(zipEoCDOffset + CD_RECORDS_NUMBER_OFFSET));
7455
7540
  let cdStartOffset = BigInt(await file.getUint32(zipEoCDOffset + CD_START_OFFSET_OFFSET));
7456
- if (cdStartOffset === BigInt(4294967295) || cdRecordsNumber === BigInt(4294967295)) {
7457
- const zip64EoCDLocatorOffset = zipEoCDOffset - 20n;
7458
- const magicBytes = await file.slice(zip64EoCDLocatorOffset, zip64EoCDLocatorOffset + 4n);
7459
- if (!compareArrayBuffers(magicBytes, zip64EoCDLocatorSignature)) {
7460
- throw new Error("zip64 EoCD locator not found");
7461
- }
7462
- const zip64EoCDOffset = await file.getBigUint64(zip64EoCDLocatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET);
7541
+ let zip64EoCDLocatorOffset = zipEoCDOffset - 20n;
7542
+ let zip64EoCDOffset = 0n;
7543
+ const magicBytes = await file.slice(zip64EoCDLocatorOffset, zip64EoCDLocatorOffset + 4n);
7544
+ if (compareArrayBuffers(magicBytes, zip64EoCDLocatorSignature)) {
7545
+ zip64EoCDOffset = await file.getBigUint64(zip64EoCDLocatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET);
7463
7546
  const endOfCDMagicBytes = await file.slice(zip64EoCDOffset, zip64EoCDOffset + 4n);
7464
7547
  if (!compareArrayBuffers(endOfCDMagicBytes, zip64EoCDSignature.buffer)) {
7465
7548
  throw new Error("zip64 EoCD not found");
7466
7549
  }
7467
7550
  cdRecordsNumber = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_RECORDS_NUMBER_OFFSET);
7468
7551
  cdStartOffset = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_START_OFFSET_OFFSET);
7552
+ } else {
7553
+ zip64EoCDLocatorOffset = 0n;
7469
7554
  }
7470
7555
  return {
7471
7556
  cdRecordsNumber,
7472
- cdStartOffset
7557
+ cdStartOffset,
7558
+ offsets: {
7559
+ zip64EoCDOffset,
7560
+ zip64EoCDLocatorOffset,
7561
+ zipEoCDOffset
7562
+ }
7473
7563
  };
7474
7564
  };
7565
+ async function updateEoCD(eocdBody, oldEoCDOffsets, newCDStartOffset, eocdStartOffset, newCDRecordsNumber) {
7566
+ const eocd = new DataView(eocdBody);
7567
+ const classicEoCDOffset = oldEoCDOffsets.zip64EoCDOffset ? oldEoCDOffsets.zipEoCDOffset - oldEoCDOffsets.zip64EoCDOffset : 0n;
7568
+ if (Number(newCDRecordsNumber) <= 65535) {
7569
+ setFieldToNumber(eocd, 2, classicEoCDOffset + CD_RECORDS_NUMBER_OFFSET, newCDRecordsNumber);
7570
+ setFieldToNumber(eocd, 2, classicEoCDOffset + CD_RECORDS_NUMBER_ON_DISC_OFFSET, newCDRecordsNumber);
7571
+ }
7572
+ if (eocdStartOffset - newCDStartOffset <= 4294967295) {
7573
+ setFieldToNumber(eocd, 4, classicEoCDOffset + CD_CD_BYTE_SIZE_OFFSET, eocdStartOffset - newCDStartOffset);
7574
+ }
7575
+ if (newCDStartOffset < 4294967295) {
7576
+ setFieldToNumber(eocd, 4, classicEoCDOffset + CD_START_OFFSET_OFFSET, newCDStartOffset);
7577
+ }
7578
+ if (oldEoCDOffsets.zip64EoCDLocatorOffset && oldEoCDOffsets.zip64EoCDOffset) {
7579
+ const locatorOffset = oldEoCDOffsets.zip64EoCDLocatorOffset - oldEoCDOffsets.zip64EoCDOffset;
7580
+ setFieldToNumber(eocd, 8, locatorOffset + ZIP64_EOCD_START_OFFSET_OFFSET, eocdStartOffset);
7581
+ setFieldToNumber(eocd, 8, ZIP64_CD_START_OFFSET_OFFSET, newCDStartOffset);
7582
+ setFieldToNumber(eocd, 8, ZIP64_CD_RECORDS_NUMBER_OFFSET, newCDRecordsNumber);
7583
+ setFieldToNumber(eocd, 8, ZIP64_CD_RECORDS_NUMBER_ON_DISC_OFFSET, newCDRecordsNumber);
7584
+ setFieldToNumber(eocd, 8, ZIP64_CD_CD_BYTE_SIZE_OFFSET, eocdStartOffset - newCDStartOffset);
7585
+ }
7586
+ return new Uint8Array(eocd.buffer);
7587
+ }
7475
7588
 
7476
7589
  // src/parse-zip/cd-file-header.ts
7477
7590
  var CD_COMPRESSED_SIZE_OFFSET = 20n;
@@ -7481,10 +7594,10 @@ var __exports__ = (() => {
7481
7594
  var CD_START_DISK_OFFSET = 32n;
7482
7595
  var CD_LOCAL_HEADER_OFFSET_OFFSET = 42n;
7483
7596
  var CD_FILE_NAME_OFFSET = 46n;
7484
- var signature = new Uint8Array([80, 75, 1, 2]);
7597
+ var signature2 = new Uint8Array([80, 75, 1, 2]);
7485
7598
  var parseZipCDFileHeader = async (headerOffset, file) => {
7486
7599
  const magicBytes = await file.slice(headerOffset, headerOffset + 4n);
7487
- if (!compareArrayBuffers(magicBytes, signature.buffer)) {
7600
+ if (!compareArrayBuffers(magicBytes, signature2.buffer)) {
7488
7601
  return null;
7489
7602
  }
7490
7603
  const compressedSize = BigInt(await file.getUint32(headerOffset + CD_COMPRESSED_SIZE_OFFSET));
@@ -7570,6 +7683,104 @@ var __exports__ = (() => {
7570
7683
  }
7571
7684
  return zip64dataList;
7572
7685
  };
7686
+ function generateCDHeader(options) {
7687
+ const optionsToUse = {
7688
+ ...options,
7689
+ fnlength: options.fileName.length,
7690
+ extraLength: 0
7691
+ };
7692
+ let zip64header = new ArrayBuffer(0);
7693
+ const optionsToZip64 = {};
7694
+ if (optionsToUse.offset >= 4294967295) {
7695
+ optionsToZip64.offset = optionsToUse.offset;
7696
+ optionsToUse.offset = BigInt(4294967295);
7697
+ }
7698
+ if (optionsToUse.length >= 4294967295) {
7699
+ optionsToZip64.size = optionsToUse.length;
7700
+ optionsToUse.length = 4294967295;
7701
+ }
7702
+ if (Object.keys(optionsToZip64).length) {
7703
+ zip64header = createZip64Info(optionsToZip64);
7704
+ optionsToUse.extraLength = zip64header.byteLength;
7705
+ }
7706
+ const header = new DataView(new ArrayBuffer(Number(CD_FILE_NAME_OFFSET)));
7707
+ for (const field of ZIP_HEADER_FIELDS) {
7708
+ setFieldToNumber(header, field.size, field.offset, optionsToUse[field.name ?? ""] ?? field.default ?? 0);
7709
+ }
7710
+ const encodedName = new TextEncoder().encode(optionsToUse.fileName);
7711
+ const resHeader = concatenateArrayBuffers(header.buffer, encodedName, zip64header);
7712
+ return resHeader;
7713
+ }
7714
+ var ZIP_HEADER_FIELDS = [{
7715
+ offset: 0,
7716
+ size: 4,
7717
+ default: new DataView(signature2.buffer).getUint32(0, true)
7718
+ }, {
7719
+ offset: 4,
7720
+ size: 2,
7721
+ default: 45
7722
+ }, {
7723
+ offset: 6,
7724
+ size: 2,
7725
+ default: 45
7726
+ }, {
7727
+ offset: 8,
7728
+ size: 2,
7729
+ default: 0
7730
+ }, {
7731
+ offset: 10,
7732
+ size: 2,
7733
+ default: 0
7734
+ }, {
7735
+ offset: 12,
7736
+ size: 2,
7737
+ default: 0
7738
+ }, {
7739
+ offset: 14,
7740
+ size: 2,
7741
+ default: 0
7742
+ }, {
7743
+ offset: 16,
7744
+ size: 4,
7745
+ name: "crc32"
7746
+ }, {
7747
+ offset: 20,
7748
+ size: 4,
7749
+ name: "length"
7750
+ }, {
7751
+ offset: 24,
7752
+ size: 4,
7753
+ name: "length"
7754
+ }, {
7755
+ offset: 28,
7756
+ size: 2,
7757
+ name: "fnlength"
7758
+ }, {
7759
+ offset: 30,
7760
+ size: 2,
7761
+ default: 0,
7762
+ name: "extraLength"
7763
+ }, {
7764
+ offset: 32,
7765
+ size: 2,
7766
+ default: 0
7767
+ }, {
7768
+ offset: 34,
7769
+ size: 2,
7770
+ default: 0
7771
+ }, {
7772
+ offset: 36,
7773
+ size: 2,
7774
+ default: 0
7775
+ }, {
7776
+ offset: 38,
7777
+ size: 4,
7778
+ default: 0
7779
+ }, {
7780
+ offset: 42,
7781
+ size: 4,
7782
+ name: "offset"
7783
+ }];
7573
7784
 
7574
7785
  // src/parse-zip/local-file-header.ts
7575
7786
  var COMPRESSION_METHOD_OFFSET = 8n;
@@ -7578,10 +7789,10 @@ var __exports__ = (() => {
7578
7789
  var FILE_NAME_LENGTH_OFFSET = 26n;
7579
7790
  var EXTRA_FIELD_LENGTH_OFFSET = 28n;
7580
7791
  var FILE_NAME_OFFSET = 30n;
7581
- var signature2 = new Uint8Array([80, 75, 3, 4]);
7792
+ var signature3 = new Uint8Array([80, 75, 3, 4]);
7582
7793
  var parseZipLocalFileHeader = async (headerOffset, buffer) => {
7583
7794
  const magicBytes = await buffer.slice(headerOffset, headerOffset + 4n);
7584
- if (!compareArrayBuffers(magicBytes, signature2)) {
7795
+ if (!compareArrayBuffers(magicBytes, signature3)) {
7585
7796
  return null;
7586
7797
  }
7587
7798
  const fileNameLength = await buffer.getUint16(headerOffset + FILE_NAME_LENGTH_OFFSET);
@@ -7613,6 +7824,76 @@ var __exports__ = (() => {
7613
7824
  compressionMethod
7614
7825
  };
7615
7826
  };
7827
+ function generateLocalHeader(options) {
7828
+ const optionsToUse = {
7829
+ ...options,
7830
+ extraLength: 0,
7831
+ fnlength: options.fileName.length
7832
+ };
7833
+ let zip64header = new ArrayBuffer(0);
7834
+ const optionsToZip64 = {};
7835
+ if (optionsToUse.length >= 4294967295) {
7836
+ optionsToZip64.size = optionsToUse.length;
7837
+ optionsToUse.length = 4294967295;
7838
+ }
7839
+ if (Object.keys(optionsToZip64).length) {
7840
+ zip64header = createZip64Info(optionsToZip64);
7841
+ optionsToUse.extraLength = zip64header.byteLength;
7842
+ }
7843
+ const header = new DataView(new ArrayBuffer(Number(FILE_NAME_OFFSET)));
7844
+ for (const field of ZIP_HEADER_FIELDS2) {
7845
+ setFieldToNumber(header, field.size, field.offset, optionsToUse[field.name ?? ""] ?? field.default ?? 0);
7846
+ }
7847
+ const encodedName = new TextEncoder().encode(optionsToUse.fileName);
7848
+ const resHeader = concatenateArrayBuffers(header.buffer, encodedName, zip64header);
7849
+ return resHeader;
7850
+ }
7851
+ var ZIP_HEADER_FIELDS2 = [{
7852
+ offset: 0,
7853
+ size: 4,
7854
+ default: new DataView(signature3.buffer).getUint32(0, true)
7855
+ }, {
7856
+ offset: 4,
7857
+ size: 2,
7858
+ default: 45
7859
+ }, {
7860
+ offset: 6,
7861
+ size: 2,
7862
+ default: 0
7863
+ }, {
7864
+ offset: 8,
7865
+ size: 2,
7866
+ default: 0
7867
+ }, {
7868
+ offset: 10,
7869
+ size: 2,
7870
+ default: 0
7871
+ }, {
7872
+ offset: 12,
7873
+ size: 2,
7874
+ default: 0
7875
+ }, {
7876
+ offset: 14,
7877
+ size: 4,
7878
+ name: "crc32"
7879
+ }, {
7880
+ offset: 18,
7881
+ size: 4,
7882
+ name: "length"
7883
+ }, {
7884
+ offset: 22,
7885
+ size: 4,
7886
+ name: "length"
7887
+ }, {
7888
+ offset: 26,
7889
+ size: 2,
7890
+ name: "fnlength"
7891
+ }, {
7892
+ offset: 28,
7893
+ size: 2,
7894
+ default: 0,
7895
+ name: "extraLength"
7896
+ }];
7616
7897
 
7617
7898
  // ../crypto/src/lib/hash.ts
7618
7899
  var Hash = class {
@@ -7639,6 +7920,29 @@ var __exports__ = (() => {
7639
7920
  }
7640
7921
  };
7641
7922
 
7923
+ // ../crypto/src/lib/algorithms/crc32.ts
7924
+ var CRC32 = class {
7925
+ constructor() {
7926
+ this.crc = ~0;
7927
+ }
7928
+ update(arrayBuffer) {
7929
+ const CRC32_TABLE = getCRC32Table();
7930
+ const byteArray = new Uint8Array(arrayBuffer);
7931
+ for (let i = 0; i < byteArray.byteLength; i++) {
7932
+ this.crc = this.crc >>> 8 ^ CRC32_TABLE[(this.crc ^ byteArray[i]) & 255];
7933
+ }
7934
+ return this;
7935
+ }
7936
+ finalize() {
7937
+ this.crc = (this.crc ^ -1) >>> 0;
7938
+ return this.crc;
7939
+ }
7940
+ };
7941
+ var CRC32TAB = Uint32Array.of(0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270, 936918e3, 2847714899, 3736837829, 1202900863, 817233897, 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117);
7942
+ function getCRC32Table() {
7943
+ return CRC32TAB;
7944
+ }
7945
+
7642
7946
  // ../crypto/src/lib/utils/base64-utils.ts
7643
7947
  function asciiToBase64(string) {
7644
7948
  string = `${string}`;
@@ -7690,6 +7994,16 @@ var __exports__ = (() => {
7690
7994
  }
7691
7995
 
7692
7996
  // ../crypto/src/lib/utils/digest-utils.ts
7997
+ function encodeNumber(number, encoding) {
7998
+ switch (encoding) {
7999
+ case "hex":
8000
+ return convertNumberToHex(number);
8001
+ case "base64":
8002
+ return convertHexToBase64(convertNumberToHex(number));
8003
+ default:
8004
+ throw new Error(encoding);
8005
+ }
8006
+ }
7693
8007
  function encodeHex(hex, encoding) {
7694
8008
  switch (encoding) {
7695
8009
  case "hex":
@@ -7708,6 +8022,43 @@ var __exports__ = (() => {
7708
8022
  const string = matches2.map((a) => String.fromCharCode(parseInt(a, 16))).join("");
7709
8023
  return asciiToBase64(string) || "";
7710
8024
  }
8025
+ function convertNumberToHex(cipher) {
8026
+ const hexString = cipher.toString(16);
8027
+ return hexString === "0" ? `0${hexString}` : hexString;
8028
+ }
8029
+
8030
+ // ../crypto/src/lib/crc32-hash.ts
8031
+ var CRC32Hash = class extends Hash {
8032
+ name = "crc32";
8033
+ constructor(options = {}) {
8034
+ super();
8035
+ this.options = {
8036
+ crypto: {},
8037
+ ...options
8038
+ };
8039
+ this.hashBatches = this.hashBatches.bind(this);
8040
+ }
8041
+ async hash(input, encoding) {
8042
+ return this.hashSync(input, encoding);
8043
+ }
8044
+ hashSync(input, encoding) {
8045
+ const hash = new CRC32();
8046
+ hash.update(input);
8047
+ const digest = hash.finalize();
8048
+ return encodeNumber(digest, encoding);
8049
+ }
8050
+ async *hashBatches(asyncIterator, encoding = "base64") {
8051
+ const hash = new CRC32();
8052
+ for await (const chunk of asyncIterator) {
8053
+ hash.update(chunk);
8054
+ yield chunk;
8055
+ }
8056
+ const digest = hash.finalize();
8057
+ this.options.crypto?.onEnd?.({
8058
+ hash: encodeNumber(digest, encoding)
8059
+ });
8060
+ }
8061
+ };
7711
8062
 
7712
8063
  // ../crypto/src/lib/algorithms/md5-wasm.ts
7713
8064
  var atb = typeof atob === "function" ? atob : typeof Buffer === "function" ? nodeATOB : identity;
@@ -8132,6 +8483,45 @@ var __exports__ = (() => {
8132
8483
  }
8133
8484
  };
8134
8485
 
8486
+ // src/parse-zip/zip-compozition.ts
8487
+ async function cutTheTailOff(provider) {
8488
+ const oldEoCDinfo = await parseEoCDRecord(provider);
8489
+ const oldCDStartOffset = oldEoCDinfo.cdStartOffset;
8490
+ const oldCDLength = Number(oldEoCDinfo.offsets.zip64EoCDOffset ? oldEoCDinfo.offsets.zip64EoCDOffset - oldCDStartOffset : oldEoCDinfo.offsets.zipEoCDOffset - oldCDStartOffset);
8491
+ const zipEnding = await provider.slice(oldCDStartOffset, provider.length);
8492
+ await provider.truncate(Number(oldCDStartOffset));
8493
+ const oldCDBody = zipEnding.slice(0, oldCDLength);
8494
+ const eocdBody = zipEnding.slice(oldCDLength, zipEnding.byteLength);
8495
+ return [oldCDBody, eocdBody, oldEoCDinfo];
8496
+ }
8497
+ async function generateFileHeaders(fileName, fileToAdd, localFileHeaderOffset) {
8498
+ const newFileCRC322 = parseInt(await new CRC32Hash().hash(fileToAdd, "hex"), 16);
8499
+ const newFileLocalHeader = generateLocalHeader({
8500
+ crc32: newFileCRC322,
8501
+ fileName,
8502
+ length: fileToAdd.byteLength
8503
+ });
8504
+ const newFileCDHeader = generateCDHeader({
8505
+ crc32: newFileCRC322,
8506
+ fileName,
8507
+ offset: localFileHeaderOffset,
8508
+ length: fileToAdd.byteLength
8509
+ });
8510
+ return [new Uint8Array(concatenateArrayBuffers(newFileLocalHeader, fileToAdd)), new Uint8Array(newFileCDHeader)];
8511
+ }
8512
+ async function addOneFile(zipUrl, fileToAdd, fileName) {
8513
+ const provider = new FileHandleFile(zipUrl, true);
8514
+ const [oldCDBody, eocdBody, oldEoCDinfo] = await cutTheTailOff(provider);
8515
+ const newFileOffset = provider.length;
8516
+ const [localPart, cdHeaderPart] = await generateFileHeaders(fileName, fileToAdd, newFileOffset);
8517
+ await provider.append(localPart);
8518
+ const newCDBody = concatenateArrayBuffers(oldCDBody, cdHeaderPart);
8519
+ const newCDStartOffset = provider.length;
8520
+ await provider.append(new Uint8Array(newCDBody));
8521
+ const eocdOffset = provider.length;
8522
+ await provider.append(await updateEoCD(eocdBody, oldEoCDinfo.offsets, newCDStartOffset, eocdOffset, oldEoCDinfo.cdRecordsNumber + 1n));
8523
+ }
8524
+
8135
8525
  // src/hash-file-utility.ts
8136
8526
  function parseHashTable(arrayBuffer) {
8137
8527
  const dataView = new DataView(arrayBuffer);
@@ -8159,6 +8549,23 @@ var __exports__ = (() => {
8159
8549
  }
8160
8550
  return hashTable;
8161
8551
  }
8552
+ async function composeHashFile(fileProvider) {
8553
+ const hashArray = await makeHashTableFromZipHeaders(fileProvider);
8554
+ const bufferArray = Object.entries(hashArray).map(([key, value]) => concatenateArrayBuffers(hexStringToBuffer(key), bigintToBuffer(value))).sort(compareHashes);
8555
+ return concatenateArrayBuffersFromArray(bufferArray);
8556
+ }
8557
+ function compareHashes(arrA, arrB) {
8558
+ const a = new BigUint64Array(arrA);
8559
+ const b = new BigUint64Array(arrB);
8560
+ return Number(a[0] === b[0] ? a[1] - b[1] : a[0] - b[0]);
8561
+ }
8562
+ function hexStringToBuffer(str) {
8563
+ const byteArray = str.match(/../g)?.map((h) => parseInt(h, 16));
8564
+ return new Uint8Array(byteArray ?? new Array(16)).buffer;
8565
+ }
8566
+ function bigintToBuffer(n) {
8567
+ return new BigUint64Array([n]).buffer;
8568
+ }
8162
8569
 
8163
8570
  // ../compression/src/lib/compression.ts
8164
8571
  var Compression = class {
@@ -1 +1 @@
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
+ {"version":3,"file":"zip-filesystem.d.ts","sourceRoot":"","sources":["../../src/filesystems/zip-filesystem.ts"],"names":[],"mappings":"AAIA,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":["// 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
+ {"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\n// SPDX-License-Identifier: MIT\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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"}
@@ -11,4 +11,10 @@ export declare function parseHashTable(arrayBuffer: ArrayBuffer): Record<string,
11
11
  * @returns ready to use hash info
12
12
  */
13
13
  export declare function makeHashTableFromZipHeaders(fileProvider: FileProvider): Promise<Record<string, bigint>>;
14
+ /**
15
+ * creates hash file that later can be added to the SLPK archive
16
+ * @param fileProvider SLPK archive where we need to add hash file
17
+ * @returns ArrayBuffer containing hash file
18
+ */
19
+ export declare function composeHashFile(fileProvider: FileProvider): Promise<ArrayBuffer>;
14
20
  //# sourceMappingURL=hash-file-utility.d.ts.map