@loaders.gl/zip 4.2.1 → 4.3.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -55,7 +55,7 @@ module.exports = __toCommonJS(dist_exports);
55
55
 
56
56
  // dist/zip-loader.js
57
57
  var import_jszip = __toESM(require("jszip"), 1);
58
- var VERSION = true ? "4.2.0" : "latest";
58
+ var VERSION = true ? "4.3.0-alpha.1" : "latest";
59
59
  var ZipLoader = {
60
60
  dataType: null,
61
61
  batchType: null,
@@ -102,7 +102,7 @@ async function loadZipEntry(jsZip, subFilename, options = {}) {
102
102
 
103
103
  // dist/zip-writer.js
104
104
  var import_jszip2 = __toESM(require("jszip"), 1);
105
- var VERSION2 = true ? "4.2.0" : "latest";
105
+ var VERSION2 = true ? "4.3.0-alpha.1" : "latest";
106
106
  var ZipWriter = {
107
107
  name: "Zip Archive",
108
108
  id: "zip",
@@ -366,6 +366,7 @@ var import_loader_utils3 = require("@loaders.gl/loader-utils");
366
366
  var import_loader_utils2 = require("@loaders.gl/loader-utils");
367
367
 
368
368
  // dist/parse-zip/search-from-the-end.js
369
+ var buffLength = 1024;
369
370
  var searchFromTheEnd = async (file, target) => {
370
371
  const searchWindow = [
371
372
  await file.getUint8(file.length - 1n),
@@ -373,18 +374,25 @@ var searchFromTheEnd = async (file, target) => {
373
374
  await file.getUint8(file.length - 3n),
374
375
  void 0
375
376
  ];
376
- let targetOffset = 0n;
377
- for (let i = file.length - 4n; i > -1; i--) {
378
- searchWindow[3] = searchWindow[2];
379
- searchWindow[2] = searchWindow[1];
380
- searchWindow[1] = searchWindow[0];
381
- searchWindow[0] = await file.getUint8(i);
382
- if (searchWindow.every((val, index) => val === target[index])) {
383
- targetOffset = i;
384
- break;
377
+ let targetOffset = -1;
378
+ let point = file.length - 4n;
379
+ do {
380
+ const prevPoint = point;
381
+ point -= BigInt(buffLength);
382
+ point = point >= 0n ? point : 0n;
383
+ const buff = new Uint8Array(await file.slice(point, prevPoint));
384
+ for (let i = buff.length - 1; i > -1; i--) {
385
+ searchWindow[3] = searchWindow[2];
386
+ searchWindow[2] = searchWindow[1];
387
+ searchWindow[1] = searchWindow[0];
388
+ searchWindow[0] = buff[i];
389
+ if (searchWindow.every((val, index) => val === target[index])) {
390
+ targetOffset = i;
391
+ break;
392
+ }
385
393
  }
386
- }
387
- return targetOffset;
394
+ } while (targetOffset === -1 && point > 0n);
395
+ return point + BigInt(targetOffset);
388
396
  };
389
397
 
390
398
  // dist/parse-zip/zip64-info-generation.js
@@ -466,6 +474,7 @@ var ZIP64_COMMENT_OFFSET = 56n;
466
474
  var parseEoCDRecord = async (file) => {
467
475
  const zipEoCDOffset = await searchFromTheEnd(file, eoCDSignature);
468
476
  let cdRecordsNumber = BigInt(await file.getUint16(zipEoCDOffset + CD_RECORDS_NUMBER_OFFSET));
477
+ let cdByteSize = BigInt(await file.getUint32(zipEoCDOffset + CD_CD_BYTE_SIZE_OFFSET));
469
478
  let cdStartOffset = BigInt(await file.getUint32(zipEoCDOffset + CD_START_OFFSET_OFFSET));
470
479
  let zip64EoCDLocatorOffset = zipEoCDOffset - 20n;
471
480
  let zip64EoCDOffset = 0n;
@@ -477,6 +486,7 @@ var parseEoCDRecord = async (file) => {
477
486
  throw new Error("zip64 EoCD not found");
478
487
  }
479
488
  cdRecordsNumber = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_RECORDS_NUMBER_OFFSET);
489
+ cdByteSize = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_CD_BYTE_SIZE_OFFSET);
480
490
  cdStartOffset = await file.getBigUint64(zip64EoCDOffset + ZIP64_CD_START_OFFSET_OFFSET);
481
491
  } else {
482
492
  zip64EoCDLocatorOffset = 0n;
@@ -484,6 +494,7 @@ var parseEoCDRecord = async (file) => {
484
494
  return {
485
495
  cdRecordsNumber,
486
496
  cdStartOffset,
497
+ cdByteSize,
487
498
  offsets: {
488
499
  zip64EoCDOffset,
489
500
  zip64EoCDLocatorOffset,
@@ -677,30 +688,35 @@ var ZIP64_EOCD_FIELDS = [
677
688
  ];
678
689
 
679
690
  // dist/parse-zip/cd-file-header.js
680
- var CD_COMPRESSED_SIZE_OFFSET = 20n;
681
- var CD_UNCOMPRESSED_SIZE_OFFSET = 24n;
682
- var CD_FILE_NAME_LENGTH_OFFSET = 28n;
683
- var CD_EXTRA_FIELD_LENGTH_OFFSET = 30n;
684
- var CD_START_DISK_OFFSET = 32n;
685
- var CD_LOCAL_HEADER_OFFSET_OFFSET = 42n;
691
+ var CD_COMPRESSED_SIZE_OFFSET = 20;
692
+ var CD_UNCOMPRESSED_SIZE_OFFSET = 24;
693
+ var CD_FILE_NAME_LENGTH_OFFSET = 28;
694
+ var CD_EXTRA_FIELD_LENGTH_OFFSET = 30;
695
+ var CD_START_DISK_OFFSET = 32;
696
+ var CD_LOCAL_HEADER_OFFSET_OFFSET = 42;
686
697
  var CD_FILE_NAME_OFFSET = 46n;
687
698
  var signature2 = new Uint8Array([80, 75, 1, 2]);
688
699
  var parseZipCDFileHeader = async (headerOffset, file) => {
689
- const magicBytes = await file.slice(headerOffset, headerOffset + 4n);
700
+ if (headerOffset >= file.length) {
701
+ return null;
702
+ }
703
+ const mainHeader = new DataView(await file.slice(headerOffset, headerOffset + CD_FILE_NAME_OFFSET));
704
+ const magicBytes = mainHeader.buffer.slice(0, 4);
690
705
  if (!(0, import_loader_utils3.compareArrayBuffers)(magicBytes, signature2.buffer)) {
691
706
  return null;
692
707
  }
693
- const compressedSize = BigInt(await file.getUint32(headerOffset + CD_COMPRESSED_SIZE_OFFSET));
694
- const uncompressedSize = BigInt(await file.getUint32(headerOffset + CD_UNCOMPRESSED_SIZE_OFFSET));
695
- const extraFieldLength = await file.getUint16(headerOffset + CD_EXTRA_FIELD_LENGTH_OFFSET);
696
- const startDisk = BigInt(await file.getUint16(headerOffset + CD_START_DISK_OFFSET));
697
- const fileNameLength = await file.getUint16(headerOffset + CD_FILE_NAME_LENGTH_OFFSET);
698
- const filenameBytes = await file.slice(headerOffset + CD_FILE_NAME_OFFSET, headerOffset + CD_FILE_NAME_OFFSET + BigInt(fileNameLength));
708
+ const compressedSize = BigInt(mainHeader.getUint32(CD_COMPRESSED_SIZE_OFFSET, true));
709
+ const uncompressedSize = BigInt(mainHeader.getUint32(CD_UNCOMPRESSED_SIZE_OFFSET, true));
710
+ const extraFieldLength = mainHeader.getUint16(CD_EXTRA_FIELD_LENGTH_OFFSET, true);
711
+ const startDisk = BigInt(mainHeader.getUint16(CD_START_DISK_OFFSET, true));
712
+ const fileNameLength = mainHeader.getUint16(CD_FILE_NAME_LENGTH_OFFSET, true);
713
+ const additionalHeader = await file.slice(headerOffset + CD_FILE_NAME_OFFSET, headerOffset + CD_FILE_NAME_OFFSET + BigInt(fileNameLength + extraFieldLength));
714
+ const filenameBytes = additionalHeader.slice(0, fileNameLength);
699
715
  const fileName = new TextDecoder().decode(filenameBytes);
700
716
  const extraOffset = headerOffset + CD_FILE_NAME_OFFSET + BigInt(fileNameLength);
701
- const oldFormatOffset = await file.getUint32(headerOffset + CD_LOCAL_HEADER_OFFSET_OFFSET);
717
+ const oldFormatOffset = mainHeader.getUint32(CD_LOCAL_HEADER_OFFSET_OFFSET, true);
702
718
  const localHeaderOffset = BigInt(oldFormatOffset);
703
- const extraField = new DataView(await file.slice(extraOffset, extraOffset + BigInt(extraFieldLength)));
719
+ const extraField = new DataView(additionalHeader.slice(fileNameLength, additionalHeader.byteLength));
704
720
  const zip64data = {
705
721
  uncompressedSize,
706
722
  compressedSize,
@@ -718,11 +734,12 @@ var parseZipCDFileHeader = async (headerOffset, file) => {
718
734
  };
719
735
  };
720
736
  async function* makeZipCDHeaderIterator(fileProvider) {
721
- const { cdStartOffset } = await parseEoCDRecord(fileProvider);
722
- let cdHeader = await parseZipCDFileHeader(cdStartOffset, fileProvider);
737
+ const { cdStartOffset, cdByteSize } = await parseEoCDRecord(fileProvider);
738
+ const centralDirectory = new import_loader_utils3.DataViewFile(new DataView(await fileProvider.slice(cdStartOffset, cdStartOffset + cdByteSize)));
739
+ let cdHeader = await parseZipCDFileHeader(0n, centralDirectory);
723
740
  while (cdHeader) {
724
741
  yield cdHeader;
725
- cdHeader = await parseZipCDFileHeader(cdHeader.extraOffset + BigInt(cdHeader.extraFieldLength), fileProvider);
742
+ cdHeader = await parseZipCDFileHeader(cdHeader.extraOffset + BigInt(cdHeader.extraFieldLength), centralDirectory);
726
743
  }
727
744
  }
728
745
  var getUint16 = (...bytes) => {
@@ -895,37 +912,40 @@ var ZIP_HEADER_FIELDS = [
895
912
 
896
913
  // dist/parse-zip/local-file-header.js
897
914
  var import_loader_utils4 = require("@loaders.gl/loader-utils");
898
- var COMPRESSION_METHOD_OFFSET = 8n;
899
- var COMPRESSED_SIZE_OFFSET = 18n;
900
- var UNCOMPRESSED_SIZE_OFFSET = 22n;
901
- var FILE_NAME_LENGTH_OFFSET = 26n;
902
- var EXTRA_FIELD_LENGTH_OFFSET = 28n;
915
+ var COMPRESSION_METHOD_OFFSET = 8;
916
+ var COMPRESSED_SIZE_OFFSET = 18;
917
+ var UNCOMPRESSED_SIZE_OFFSET = 22;
918
+ var FILE_NAME_LENGTH_OFFSET = 26;
919
+ var EXTRA_FIELD_LENGTH_OFFSET = 28;
903
920
  var FILE_NAME_OFFSET = 30n;
904
921
  var signature3 = new Uint8Array([80, 75, 3, 4]);
905
- var parseZipLocalFileHeader = async (headerOffset, buffer) => {
906
- const magicBytes = await buffer.slice(headerOffset, headerOffset + 4n);
922
+ var parseZipLocalFileHeader = async (headerOffset, file) => {
923
+ const mainHeader = new DataView(await file.slice(headerOffset, headerOffset + FILE_NAME_OFFSET));
924
+ const magicBytes = mainHeader.buffer.slice(0, 4);
907
925
  if (!(0, import_loader_utils4.compareArrayBuffers)(magicBytes, signature3)) {
908
926
  return null;
909
927
  }
910
- const fileNameLength = await buffer.getUint16(headerOffset + FILE_NAME_LENGTH_OFFSET);
911
- const fileName = new TextDecoder().decode(await buffer.slice(headerOffset + FILE_NAME_OFFSET, headerOffset + FILE_NAME_OFFSET + BigInt(fileNameLength))).split("\\").join("/");
912
- const extraFieldLength = await buffer.getUint16(headerOffset + EXTRA_FIELD_LENGTH_OFFSET);
928
+ const fileNameLength = mainHeader.getUint16(FILE_NAME_LENGTH_OFFSET, true);
929
+ const extraFieldLength = mainHeader.getUint16(EXTRA_FIELD_LENGTH_OFFSET, true);
930
+ const additionalHeader = await file.slice(headerOffset + FILE_NAME_OFFSET, headerOffset + FILE_NAME_OFFSET + BigInt(fileNameLength + extraFieldLength));
931
+ const fileNameBuffer = additionalHeader.slice(0, fileNameLength);
932
+ const extraDataBuffer = new DataView(additionalHeader.slice(fileNameLength, additionalHeader.byteLength));
933
+ const fileName = new TextDecoder().decode(fileNameBuffer).split("\\").join("/");
913
934
  let fileDataOffset = headerOffset + FILE_NAME_OFFSET + BigInt(fileNameLength + extraFieldLength);
914
- const compressionMethod = await buffer.getUint16(headerOffset + COMPRESSION_METHOD_OFFSET);
915
- let compressedSize = BigInt(await buffer.getUint32(headerOffset + COMPRESSED_SIZE_OFFSET));
916
- let uncompressedSize = BigInt(await buffer.getUint32(headerOffset + UNCOMPRESSED_SIZE_OFFSET));
917
- const extraOffset = headerOffset + FILE_NAME_OFFSET + BigInt(fileNameLength);
918
- let offsetInZip64Data = 4n;
935
+ const compressionMethod = mainHeader.getUint16(COMPRESSION_METHOD_OFFSET, true);
936
+ let compressedSize = BigInt(mainHeader.getUint32(COMPRESSED_SIZE_OFFSET, true));
937
+ let uncompressedSize = BigInt(mainHeader.getUint32(UNCOMPRESSED_SIZE_OFFSET, true));
938
+ let offsetInZip64Data = 4;
919
939
  if (uncompressedSize === BigInt(4294967295)) {
920
- uncompressedSize = await buffer.getBigUint64(extraOffset + offsetInZip64Data);
921
- offsetInZip64Data += 8n;
940
+ uncompressedSize = extraDataBuffer.getBigUint64(offsetInZip64Data, true);
941
+ offsetInZip64Data += 8;
922
942
  }
923
943
  if (compressedSize === BigInt(4294967295)) {
924
- compressedSize = await buffer.getBigUint64(extraOffset + offsetInZip64Data);
925
- offsetInZip64Data += 8n;
944
+ compressedSize = extraDataBuffer.getBigUint64(offsetInZip64Data, true);
945
+ offsetInZip64Data += 8;
926
946
  }
927
947
  if (fileDataOffset === BigInt(4294967295)) {
928
- fileDataOffset = await buffer.getBigUint64(extraOffset + offsetInZip64Data);
948
+ fileDataOffset = extraDataBuffer.getBigUint64(offsetInZip64Data, true);
929
949
  }
930
950
  return {
931
951
  fileNameLength,