@zip.js/zip.js 2.5.20 → 2.5.23

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,36 +3708,36 @@
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;
3714
+ let fileWriter;
3702
3715
  files.set(name, fileEntry);
3703
3716
  try {
3704
3717
  let lockPreviousFileEntry;
3705
- let fileWriter;
3706
3718
  if (options.keepOrder) {
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
  }
3719
3731
  fileWriter = writer;
3720
3732
  }
3721
- fileEntry = await createFileEntry(reader, fileWriter.writable, zipWriter.config, options);
3733
+ fileEntry = await createFileEntry(reader, fileEntry, fileWriter.writable, zipWriter.config, options);
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,32 +3769,30 @@
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
- if (fileEntry.uncompressedSize) {
3764
- zipWriter.offset += fileEntry.uncompressedSize;
3765
- }
3774
+ zipWriter.offset += fileWriter.size;
3766
3775
  }
3767
3776
  files.delete(name);
3768
3777
  throw error;
3769
3778
  } finally {
3770
3779
  resolveLockCurrentFileEntry();
3771
- if (resolveLockUnbufferedWrite) {
3772
- resolveLockUnbufferedWrite();
3780
+ if (releaseLockWriter) {
3781
+ releaseLockWriter();
3773
3782
  }
3774
3783
  }
3775
3784
 
3776
- async function lockWriterAccess() {
3777
- if (zipWriter.lockWrite) {
3778
- await zipWriter.lockWrite.then(() => delete zipWriter.lockWrite);
3779
- await lockWriterAccess();
3785
+ async function lockWriter() {
3786
+ if (zipWriter.lockWriter) {
3787
+ await zipWriter.lockWriter.then(() => delete zipWriter.lockWriter);
3788
+ await lockWriter();
3780
3789
  } else {
3781
- zipWriter.lockWrite = new Promise(resolve => resolveLockUnbufferedWrite = resolve);
3790
+ zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
3782
3791
  }
3783
3792
  }
3784
3793
  }
3785
3794
 
3786
- async function createFileEntry(reader, writable, config, options) {
3795
+ async function createFileEntry(reader, pendingFileEntry, writable, config, options) {
3787
3796
  const {
3788
3797
  rawFilename,
3789
3798
  lastAccessDate,
@@ -3933,7 +3942,7 @@
3933
3942
  let compressedSize = 0;
3934
3943
  if (reader) {
3935
3944
  await writeUint8Array(writable, localHeaderArray);
3936
- fileEntry.dataWritten = true;
3945
+ fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
3937
3946
  const size = () => reader.size;
3938
3947
  const readable = reader.readable;
3939
3948
  readable.size = size;
@@ -3961,7 +3970,7 @@
3961
3970
  compressedSize = result.length;
3962
3971
  } else {
3963
3972
  await writeUint8Array(writable, localHeaderArray);
3964
- fileEntry.dataWritten = true;
3973
+ fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
3965
3974
  }
3966
3975
  let dataDescriptorArray = new Uint8Array();
3967
3976
  let dataDescriptorView, dataDescriptorOffset = 0;
@@ -4037,13 +4046,6 @@
4037
4046
  }
4038
4047
  const directoryArray = new Uint8Array(directoryDataLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH));
4039
4048
  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
4049
  for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
4048
4050
  const {
4049
4051
  rawFilename,
@@ -4127,6 +4129,13 @@
4127
4129
  setUint16(directoryView, offset + 10, filesLength);
4128
4130
  setUint32(directoryView, offset + 12, directoryDataLength);
4129
4131
  setUint32(directoryView, offset + 16, directoryOffset);
4132
+ if (comment && comment.length) {
4133
+ if (comment.length <= MAX_16_BITS) {
4134
+ setUint16(directoryView, offset + 20, comment.length);
4135
+ } else {
4136
+ throw new Error(ERR_INVALID_COMMENT);
4137
+ }
4138
+ }
4130
4139
  const { writable } = zipWriter.writer;
4131
4140
  await writeUint8Array(writable, directoryArray);
4132
4141
  if (comment && comment.length) {
@@ -4142,20 +4151,6 @@
4142
4151
  }
4143
4152
  }
4144
4153
 
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
4154
  async function writeUint8Array(writable, array) {
4160
4155
  const streamWriter = writable.getWriter();
4161
4156
  await streamWriter.ready;