@zip.js/zip.js 2.5.20 → 2.5.21

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/zip-fs.js CHANGED
@@ -2989,8 +2989,12 @@
2989
2989
  const endOfDirectoryView = getDataView$1(endOfDirectoryInfo);
2990
2990
  let directoryDataLength = getUint32(endOfDirectoryView, 12);
2991
2991
  let directoryDataOffset = getUint32(endOfDirectoryView, 16);
2992
+ const commentOffset = endOfDirectoryInfo.offset;
2993
+ const commentLength = getUint16(endOfDirectoryView, 20);
2994
+ const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
2992
2995
  let filesLength = getUint16(endOfDirectoryView, 8);
2993
2996
  let prependedDataLength = 0;
2997
+ let startOffset = 0;
2994
2998
  if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS) {
2995
2999
  const endOfDirectoryLocatorArray = await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH);
2996
3000
  const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray);
@@ -3061,6 +3065,7 @@
3061
3065
  commentUTF8: languageEncodingFlag,
3062
3066
  rawExtraField: directoryArray.subarray(extraFieldOffset, commentOffset)
3063
3067
  });
3068
+ startOffset = Math.max(fileEntry.offset, startOffset);
3064
3069
  const endOffset = commentOffset + fileEntry.commentLength;
3065
3070
  fileEntry.rawComment = directoryArray.subarray(commentOffset, endOffset);
3066
3071
  const filenameEncoding = getOptionValue$1(zipReader, options, "filenameEncoding");
@@ -3087,16 +3092,22 @@
3087
3092
  }
3088
3093
  yield entry;
3089
3094
  }
3095
+ const extractPrependedData = getOptionValue$1(zipReader, options, "extractPrependedData");
3096
+ const extractAppendedData = getOptionValue$1(zipReader, options, "extractAppendedData");
3097
+ if (extractPrependedData) {
3098
+ zipReader.prependedData = await readUint8Array(reader, 0, startOffset);
3099
+ }
3100
+ zipReader.comment = await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength);
3101
+ if (extractAppendedData) {
3102
+ zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) : new Uint8Array();
3103
+ }
3090
3104
  return true;
3091
3105
  }
3092
3106
 
3093
3107
  async getEntries(options = {}) {
3094
3108
  const entries = [];
3095
- const iterator = this.getEntriesGenerator(options);
3096
- let result = iterator.next();
3097
- while (!(await result).done) {
3098
- entries.push((await result).value);
3099
- result = iterator.next();
3109
+ for await (const entry of this.getEntriesGenerator(options)) {
3110
+ entries.push(entry);
3100
3111
  }
3101
3112
  return entries;
3102
3113
  }
@@ -3544,7 +3555,7 @@
3544
3555
  await Promise.all(Array.from(pendingAddFileCalls));
3545
3556
  }
3546
3557
  await closeFile(this, comment, options);
3547
- if (!writer.preventClose) {
3558
+ if (!writer.preventClose && !options.preventClose) {
3548
3559
  await writable.getWriter().close();
3549
3560
  }
3550
3561
  return writer.getData ? writer.getData() : writable;
@@ -3697,8 +3708,9 @@
3697
3708
  const previousFileEntry = Array.from(files.values()).pop();
3698
3709
  let fileEntry = {};
3699
3710
  let bufferedWrite;
3700
- let resolveLockUnbufferedWrite;
3711
+ let releaseLockWriter;
3701
3712
  let resolveLockCurrentFileEntry;
3713
+ let writingBufferedData;
3702
3714
  files.set(name, fileEntry);
3703
3715
  try {
3704
3716
  let lockPreviousFileEntry;
@@ -3707,12 +3719,12 @@
3707
3719
  lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
3708
3720
  }
3709
3721
  fileEntry.lock = new Promise(resolve => resolveLockCurrentFileEntry = resolve);
3710
- if (options.bufferedWrite || zipWriter.lockWrite || !options.dataDescriptor) {
3722
+ if (options.bufferedWrite || zipWriter.lockWriter || !options.dataDescriptor) {
3711
3723
  fileWriter = new BlobWriter();
3712
3724
  fileWriter.init();
3713
3725
  bufferedWrite = true;
3714
3726
  } else {
3715
- zipWriter.lockWrite = Promise.resolve();
3727
+ zipWriter.lockWriter = Promise.resolve();
3716
3728
  if (writer.init && !writer.initialized) {
3717
3729
  await writer.init();
3718
3730
  }
@@ -3722,11 +3734,10 @@
3722
3734
  files.set(name, fileEntry);
3723
3735
  fileEntry.filename = name;
3724
3736
  if (bufferedWrite) {
3725
- let indexWrittenData = 0;
3726
- const blob = fileWriter.getData();
3737
+ let blob = fileWriter.getData();
3727
3738
  await lockPreviousFileEntry;
3728
- await lockWriterAccess();
3729
- fileEntry.writingBufferedData = true;
3739
+ await lockWriter();
3740
+ writingBufferedData = true;
3730
3741
  const { writable } = writer;
3731
3742
  if (!options.dataDescriptor) {
3732
3743
  const headerLength = 26;
@@ -3743,10 +3754,10 @@
3743
3754
  setUint32(arrayBufferView, 22, fileEntry.uncompressedSize);
3744
3755
  }
3745
3756
  await writeUint8Array(writable, new Uint8Array(arrayBuffer));
3746
- indexWrittenData = headerLength;
3757
+ blob = blob.slice(headerLength);
3747
3758
  }
3748
- await writeBlob(writable, blob, indexWrittenData);
3749
- delete fileEntry.writingBufferedData;
3759
+ await blob.stream().pipeTo(writable, { preventClose: true });
3760
+ writingBufferedData = false;
3750
3761
  }
3751
3762
  fileEntry.offset = zipWriter.offset;
3752
3763
  if (fileEntry.zip64) {
@@ -3758,7 +3769,7 @@
3758
3769
  zipWriter.offset += fileEntry.length;
3759
3770
  return fileEntry;
3760
3771
  } catch (error) {
3761
- if ((bufferedWrite && fileEntry.writingBufferedData) || (!bufferedWrite && fileEntry.dataWritten)) {
3772
+ if ((bufferedWrite && writingBufferedData) || (!bufferedWrite && fileEntry.dataWritten)) {
3762
3773
  error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
3763
3774
  if (fileEntry.uncompressedSize) {
3764
3775
  zipWriter.offset += fileEntry.uncompressedSize;
@@ -3768,17 +3779,17 @@
3768
3779
  throw error;
3769
3780
  } finally {
3770
3781
  resolveLockCurrentFileEntry();
3771
- if (resolveLockUnbufferedWrite) {
3772
- resolveLockUnbufferedWrite();
3782
+ if (releaseLockWriter) {
3783
+ releaseLockWriter();
3773
3784
  }
3774
3785
  }
3775
3786
 
3776
- async function lockWriterAccess() {
3777
- if (zipWriter.lockWrite) {
3778
- await zipWriter.lockWrite.then(() => delete zipWriter.lockWrite);
3779
- await lockWriterAccess();
3787
+ async function lockWriter() {
3788
+ if (zipWriter.lockWriter) {
3789
+ await zipWriter.lockWriter.then(() => delete zipWriter.lockWriter);
3790
+ await lockWriter();
3780
3791
  } else {
3781
- zipWriter.lockWrite = new Promise(resolve => resolveLockUnbufferedWrite = resolve);
3792
+ zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
3782
3793
  }
3783
3794
  }
3784
3795
  }
@@ -4037,13 +4048,6 @@
4037
4048
  }
4038
4049
  const directoryArray = new Uint8Array(directoryDataLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH));
4039
4050
  const directoryView = getDataView(directoryArray);
4040
- if (comment && comment.length) {
4041
- if (comment.length <= MAX_16_BITS) {
4042
- setUint16(directoryView, offset + 20, comment.length);
4043
- } else {
4044
- throw new Error(ERR_INVALID_COMMENT);
4045
- }
4046
- }
4047
4051
  for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
4048
4052
  const {
4049
4053
  rawFilename,
@@ -4127,6 +4131,13 @@
4127
4131
  setUint16(directoryView, offset + 10, filesLength);
4128
4132
  setUint32(directoryView, offset + 12, directoryDataLength);
4129
4133
  setUint32(directoryView, offset + 16, directoryOffset);
4134
+ if (comment && comment.length) {
4135
+ if (comment.length <= MAX_16_BITS) {
4136
+ setUint16(directoryView, offset + 20, comment.length);
4137
+ } else {
4138
+ throw new Error(ERR_INVALID_COMMENT);
4139
+ }
4140
+ }
4130
4141
  const { writable } = zipWriter.writer;
4131
4142
  await writeUint8Array(writable, directoryArray);
4132
4143
  if (comment && comment.length) {
@@ -4142,20 +4153,6 @@
4142
4153
  }
4143
4154
  }
4144
4155
 
4145
- async function writeBlob(writable, blob, start = 0) {
4146
- const blockSize = 512 * 1024 * 1024;
4147
- await writeSlice();
4148
-
4149
- async function writeSlice() {
4150
- if (start < blob.size) {
4151
- const arrayBuffer = await sliceAsArrayBuffer(blob, start, start + blockSize);
4152
- await writeUint8Array(writable, new Uint8Array(arrayBuffer));
4153
- start += blockSize;
4154
- await writeSlice();
4155
- }
4156
- }
4157
- }
4158
-
4159
4156
  async function writeUint8Array(writable, array) {
4160
4157
  const streamWriter = writable.getWriter();
4161
4158
  await streamWriter.ready;