@zip.js/zip.js 2.6.51 → 2.6.52

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/index.d.ts CHANGED
@@ -740,7 +740,7 @@ interface ZipReaderOptions {
740
740
  }
741
741
 
742
742
  /**
743
- * Represents the metatdata of an entry in a zip file (Core API).
743
+ * Represents the metadata of an entry in a zip file (Core API).
744
744
  */
745
745
  export interface EntryMetaData {
746
746
  /**
package/lib/core/io.js CHANGED
@@ -585,7 +585,7 @@ class SplitDataWriter extends Stream {
585
585
  let diskSourceWriter, diskWritable, diskWriter;
586
586
  const writable = new WritableStream({
587
587
  async write(chunk) {
588
- let { maxSize } = zipWriter;
588
+ const { availableSize } = zipWriter;
589
589
  if (!diskWriter) {
590
590
  const { value, done } = await writerGenerator.next();
591
591
  if (done && !value) {
@@ -596,24 +596,21 @@ class SplitDataWriter extends Stream {
596
596
  if (diskSourceWriter.maxSize) {
597
597
  zipWriter.maxSize = diskSourceWriter.maxSize;
598
598
  }
599
+ zipWriter.availableSize = zipWriter.maxSize;
599
600
  await initStream(diskSourceWriter);
600
601
  diskWritable = value.writable;
601
602
  diskWriter = diskWritable.getWriter();
602
603
  }
603
604
  await this.write(chunk);
604
- } else if (diskSourceWriter.size + chunk.length >= maxSize) {
605
- const chunkLength = maxSize - diskSourceWriter.size;
606
- await writeChunk(chunk.slice(0, chunkLength));
605
+ } else if (chunk.length >= availableSize) {
606
+ await writeChunk(chunk.slice(0, availableSize));
607
607
  await closeDisk();
608
608
  zipWriter.diskOffset += diskSourceWriter.size;
609
609
  zipWriter.diskNumber++;
610
610
  diskWriter = null;
611
- await this.write(chunk.slice(chunkLength));
611
+ await this.write(chunk.slice(availableSize));
612
612
  } else {
613
- if (chunk.length) {
614
- await writeChunk(chunk);
615
- }
616
- zipWriter.availableSize = maxSize - diskSourceWriter.size;
613
+ await writeChunk(chunk);
617
614
  }
618
615
  },
619
616
  async close() {
@@ -628,10 +625,14 @@ class SplitDataWriter extends Stream {
628
625
  });
629
626
 
630
627
  async function writeChunk(chunk) {
631
- await diskWriter.ready;
632
- await diskWriter.write(chunk);
633
- diskSourceWriter.size += chunk.length;
634
- zipWriter.size += chunk.length;
628
+ const chunkLength = chunk.length;
629
+ if (chunkLength) {
630
+ await diskWriter.ready;
631
+ await diskWriter.write(chunk);
632
+ diskSourceWriter.size += chunkLength;
633
+ zipWriter.size += chunkLength;
634
+ zipWriter.availableSize -= chunkLength;
635
+ }
635
636
  }
636
637
 
637
638
  async function closeDisk() {
@@ -332,6 +332,9 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
332
332
  dataDescriptor,
333
333
  signal
334
334
  } = options;
335
+ const {
336
+ headerInfo
337
+ } = entryInfo;
335
338
  const previousFileEntry = Array.from(files.values()).pop();
336
339
  let fileEntry = {};
337
340
  let bufferedWrite;
@@ -357,7 +360,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
357
360
  initLockWriter();
358
361
  }
359
362
  await initStream(fileWriter);
360
- const { writable, diskNumber } = writer;
363
+ const { writable } = writer;
361
364
  let { diskOffset } = writer;
362
365
  if (zipWriter.addSplitZipSignature) {
363
366
  delete zipWriter.addSplitZipSignature;
@@ -369,7 +372,9 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
369
372
  }
370
373
  if (!bufferedWrite) {
371
374
  await lockPreviousFileEntry;
375
+ await skipDiskIfNeeded(writable);
372
376
  }
377
+ const { diskNumber } = writer;
373
378
  writingEntryData = true;
374
379
  fileEntry.diskNumberStart = diskNumber;
375
380
  fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, zipWriter.config, options);
@@ -385,6 +390,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
385
390
  if (!dataDescriptor) {
386
391
  blob = await writeMissingHeaderInfo(fileEntry, blob, writable, options);
387
392
  }
393
+ await skipDiskIfNeeded(writable);
388
394
  fileEntry.diskNumberStart = writer.diskNumber;
389
395
  diskOffset = writer.diskOffset;
390
396
  await blob.stream().pipeTo(writable, { preventClose: true, signal });
@@ -440,6 +446,13 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
440
446
  zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
441
447
  }
442
448
  }
449
+
450
+ async function skipDiskIfNeeded(writable) {
451
+ if (headerInfo.localHeaderArray.length > writer.availableSize) {
452
+ writer.availableSize = 0;
453
+ await writeData(writable, new Uint8Array());
454
+ }
455
+ }
443
456
  }
444
457
 
445
458
  async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryInfo, config, options) {
@@ -827,6 +840,8 @@ async function closeFile(zipWriter, comment, options) {
827
840
  }
828
841
  const directoryArray = new Uint8Array(directoryDataLength);
829
842
  const directoryView = getDataView(directoryArray);
843
+ await initStream(writer);
844
+ let directoryDiskOffset = 0;
830
845
  for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
831
846
  const {
832
847
  offset: fileEntryOffset,
@@ -879,7 +894,13 @@ async function closeFile(zipWriter, comment, options) {
879
894
  arraySet(directoryArray, rawExtraFieldNTFS, offset + 46 + getLength(rawFilename, rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp));
880
895
  arraySet(directoryArray, rawExtraField, offset + 46 + getLength(rawFilename, rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS));
881
896
  arraySet(directoryArray, rawComment, offset + 46 + getLength(rawFilename) + extraFieldLength);
882
- offset += 46 + getLength(rawFilename, rawComment) + extraFieldLength;
897
+ const directoryEntryLength = 46 + getLength(rawFilename, rawComment) + extraFieldLength;
898
+ if (offset - directoryDiskOffset > writer.availableSize) {
899
+ writer.availableSize = 0;
900
+ await writeData(writable, directoryArray.slice(directoryDiskOffset, offset));
901
+ directoryDiskOffset = offset;
902
+ }
903
+ offset += directoryEntryLength;
883
904
  if (options.onprogress) {
884
905
  try {
885
906
  await options.onprogress(indexFileEntry + 1, files.size, new Entry(fileEntry));
@@ -888,8 +909,7 @@ async function closeFile(zipWriter, comment, options) {
888
909
  }
889
910
  }
890
911
  }
891
- await initStream(writer);
892
- await writeData(writable, directoryArray);
912
+ await writeData(writable, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
893
913
  let lastDiskNumber = writer.diskNumber;
894
914
  const { availableSize } = writer;
895
915
  if (availableSize < END_OF_CENTRAL_DIR_LENGTH) {
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "A JavaScript library to zip and unzip files in the browser, Deno and Node.js",
4
4
  "author": "Gildas Lormeau",
5
5
  "license": "BSD-3-Clause",
6
- "version": "2.6.51",
6
+ "version": "2.6.52",
7
7
  "type": "module",
8
8
  "keywords": [
9
9
  "zip",