@zip.js/zip.js 2.6.50 → 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,9 +740,9 @@ interface ZipReaderOptions {
740
740
  }
741
741
 
742
742
  /**
743
- * Represents an entry in a zip file (Core API).
743
+ * Represents the metadata of an entry in a zip file (Core API).
744
744
  */
745
- export interface Entry {
745
+ export interface EntryMetaData {
746
746
  /**
747
747
  * The byte offset of the entry.
748
748
  */
@@ -861,6 +861,20 @@ export interface Entry {
861
861
  getData?<Type>(writer: Writer<Type> | WritableWriter | WritableStream | AsyncGenerator<Writer<unknown> | WritableWriter | WritableStream, boolean>, options?: EntryGetDataOptions): Promise<Type>
862
862
  }
863
863
 
864
+ /**
865
+ * Represents an entry with its data and metadata in a zip file (Core API).
866
+ */
867
+ export interface Entry extends EntryMetaData {
868
+ /**
869
+ * Returns the content of the entry
870
+ *
871
+ * @param writer The {@link Writer} instance used to write the content of the entry.
872
+ * @param options The options.
873
+ * @returns A promise resolving to the type to data associated to `writer`.
874
+ */
875
+ getData<Type>(writer: Writer<Type> | WritableWriter | WritableStream | AsyncGenerator<Writer<unknown> | WritableWriter | WritableStream, boolean>, options?: EntryGetDataOptions): Promise<Type>
876
+ }
877
+
864
878
  /**
865
879
  * Represents the options passed to {@link Entry#getData} and `{@link ZipFileEntry}.get*`.
866
880
  */
@@ -904,9 +918,9 @@ export class ZipWriter<Type> {
904
918
  * @param filename The filename of the entry.
905
919
  * @param reader The {@link Reader} instance used to read the content of the entry.
906
920
  * @param options The options.
907
- * @returns A promise resolving to an {@link Entry} instance.
921
+ * @returns A promise resolving to an {@link EntryMetaData} instance.
908
922
  */
909
- add<ReaderType>(filename: string, reader?: Reader<ReaderType> | ReadableReader | ReadableStream | Reader<unknown>[] | ReadableReader[] | ReadableStream[], options?: ZipWriterAddDataOptions): Promise<Entry>
923
+ add<ReaderType>(filename: string, reader?: Reader<ReaderType> | ReadableReader | ReadableStream | Reader<unknown>[] | ReadableReader[] | ReadableStream[], options?: ZipWriterAddDataOptions): Promise<EntryMetaData>
910
924
  /**
911
925
  * Writes the entries directory, writes the global comment, and returns the content of the zip file
912
926
  *
@@ -1075,7 +1089,7 @@ interface ZipWriterConstructorOptions {
1075
1089
  */
1076
1090
  dataDescriptorSignature?: boolean
1077
1091
  /**
1078
- * `true` to write {@link Entry#externalFileAttribute} in MS-DOS format for folder entries.
1092
+ * `true` to write {@link EntryMetaData#externalFileAttribute} in MS-DOS format for folder entries.
1079
1093
  *
1080
1094
  * @defaultValue true
1081
1095
  */
@@ -1134,7 +1148,7 @@ interface EntryOnprogressOptions {
1134
1148
  * @param entry The entry being read/written.
1135
1149
  * @returns An empty promise or `undefined`.
1136
1150
  */
1137
- onprogress?(progress: number, total: number, entry: Entry): Promise<void> | undefined
1151
+ onprogress?(progress: number, total: number, entry: EntryMetaData): Promise<void> | undefined
1138
1152
  }
1139
1153
 
1140
1154
  /**
@@ -1146,9 +1160,9 @@ declare class ZipEntry {
1146
1160
  */
1147
1161
  name: string
1148
1162
  /**
1149
- * The underlying {@link Entry} instance.
1163
+ * The underlying {@link EntryMetaData} instance.
1150
1164
  */
1151
- data?: Entry
1165
+ data?: EntryMetaData
1152
1166
  /**
1153
1167
  * The ID of the instance.
1154
1168
  */
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.50",
6
+ "version": "2.6.52",
7
7
  "type": "module",
8
8
  "keywords": [
9
9
  "zip",