@zip.js/zip.js 2.8.60 → 2.8.61

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
@@ -6680,6 +6680,13 @@
6680
6680
  const { comment } = metadataInfo;
6681
6681
  const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
6682
6682
  zipWriter.fileEntries.set(name, UNDEFINED_VALUE);
6683
+ const previousFileEntry = zipWriter.lastFileEntry;
6684
+ const pendingFileEntry = {};
6685
+ let releaseLockFileEntry;
6686
+ if (metadataInfo.resolvedOptions.keepOrder) {
6687
+ pendingFileEntry.lockFileEntry = new Promise(resolve => releaseLockFileEntry = resolve);
6688
+ }
6689
+ zipWriter.lastFileEntry = pendingFileEntry;
6683
6690
  let fileEntry;
6684
6691
  try {
6685
6692
  const { resolvedOptions } = metadataInfo;
@@ -6701,10 +6708,21 @@
6701
6708
  const headerInfo = getHeaderInfo(options);
6702
6709
  const dataDescriptorInfo = getDataDescriptorInfo(options);
6703
6710
  const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
6704
- fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
6711
+ fileEntry = await getFileEntry(zipWriter, name, reader, {
6712
+ headerInfo,
6713
+ dataDescriptorInfo,
6714
+ metadataSize,
6715
+ fileEntry: pendingFileEntry,
6716
+ previousFileEntry,
6717
+ releaseLockFileEntry
6718
+ }, options);
6705
6719
  } catch (error) {
6706
6720
  zipWriter.fileEntries.delete(name);
6707
6721
  throw error;
6722
+ } finally {
6723
+ if (releaseLockFileEntry) {
6724
+ releaseLockFileEntry(previousFileEntry && previousFileEntry.lockFileEntry);
6725
+ }
6708
6726
  }
6709
6727
  Object.assign(fileEntry, {
6710
6728
  name,
@@ -7092,7 +7110,6 @@
7092
7110
  }
7093
7111
  const usdz = writerOptions[OPTION_USDZ];
7094
7112
  const files = new Map();
7095
- let layoutDependsOnWriteOrder = Boolean(usdz);
7096
7113
  const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
7097
7114
  let offset = initialOffset;
7098
7115
  let minimumEntrySize = INFINITY_VALUE;
@@ -7138,9 +7155,7 @@
7138
7155
  minimumEntrySize = Math.min(minimumEntrySize, entrySize);
7139
7156
  offset += entrySize;
7140
7157
  }
7141
- if (files.size && offset - minimumEntrySize >= MAX_32_BITS) {
7142
- layoutDependsOnWriteOrder = true;
7143
- }
7158
+ const layoutDependsOnWriteOrder = files.size > 1 && (usdz || offset - minimumEntrySize >= MAX_32_BITS);
7144
7159
  if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
7145
7160
  throw new Error(ERR_UNDETERMINED_SIZE);
7146
7161
  }
@@ -7168,27 +7183,23 @@
7168
7183
  signal
7169
7184
  } = options;
7170
7185
  const {
7171
- headerInfo
7186
+ headerInfo,
7187
+ fileEntry: pendingFileEntry,
7188
+ previousFileEntry,
7189
+ releaseLockFileEntry
7172
7190
  } = entryInfo;
7173
7191
  const usdz = zipWriter.options[OPTION_USDZ];
7174
- const previousFileEntry = zipWriter.lastFileEntry;
7175
- let fileEntry = {};
7192
+ let fileEntry = pendingFileEntry;
7176
7193
  let bufferedWrite;
7177
7194
  let releaseLockWriter;
7178
- let releaseLockCurrentFileEntry;
7179
7195
  let writingBufferedEntryData;
7180
7196
  let writingEntryData;
7181
7197
  let writerSizeBeforeEntry;
7182
7198
  let flushedBufferedSize = 0;
7183
7199
  let fileWriter;
7200
+ const lockPreviousFileEntry = keepOrder && previousFileEntry ? previousFileEntry.lockFileEntry : UNDEFINED_VALUE;
7184
7201
  fileEntries.set(name, fileEntry);
7185
- zipWriter.lastFileEntry = fileEntry;
7186
7202
  try {
7187
- let lockPreviousFileEntry;
7188
- if (keepOrder) {
7189
- lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
7190
- requestLockCurrentFileEntry();
7191
- }
7192
7203
  if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || (!dataDescriptor && !emptyEntry)) {
7193
7204
  bufferedWrite = true;
7194
7205
  zipWriter.bufferedWrites++;
@@ -7201,6 +7212,7 @@
7201
7212
  await initStream(writer);
7202
7213
  } else {
7203
7214
  fileWriter = writer;
7215
+ await lockPreviousFileEntry;
7204
7216
  await requestLockWriter();
7205
7217
  }
7206
7218
  await initStream(fileWriter);
@@ -7213,7 +7225,6 @@
7213
7225
  }
7214
7226
  const { localHeaderArray } = headerInfo;
7215
7227
  if (!bufferedWrite) {
7216
- await lockPreviousFileEntry;
7217
7228
  await skipDiskIfNeeded();
7218
7229
  }
7219
7230
  const diskNumberStart = getDiskNumber(writer);
@@ -7278,8 +7289,8 @@
7278
7289
  if (bufferedWrite) {
7279
7290
  zipWriter.bufferedWrites--;
7280
7291
  }
7281
- if (releaseLockCurrentFileEntry) {
7282
- releaseLockCurrentFileEntry();
7292
+ if (releaseLockFileEntry) {
7293
+ releaseLockFileEntry(lockPreviousFileEntry);
7283
7294
  }
7284
7295
  if (releaseLockWriter) {
7285
7296
  releaseLockWriter();
@@ -7293,10 +7304,6 @@
7293
7304
  }
7294
7305
  }
7295
7306
 
7296
- function requestLockCurrentFileEntry() {
7297
- fileEntry.lockFileEntry = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
7298
- }
7299
-
7300
7307
  async function requestLockWriter() {
7301
7308
  zipWriter.writerLocked = true;
7302
7309
  const { lockWriter } = zipWriter;
@@ -8616,7 +8623,7 @@
8616
8623
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8617
8624
  */
8618
8625
 
8619
- const VERSION = "2.8.60";
8626
+ const VERSION = "2.8.61";
8620
8627
 
8621
8628
  /*
8622
8629
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9968,12 +9975,13 @@
9968
9975
  if (options.bufferedWrite === UNDEFINED_VALUE) {
9969
9976
  options.bufferedWrite = true;
9970
9977
  }
9971
- const writeOrderGuaranteed = !options.bufferedWrite ||
9972
- (options.keepOrder !== false && zipEntry.children.every(child => !child.children.length));
9973
- return getEntriesSize(options, zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
9978
+ const entries = zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
9974
9979
  const { name, entryOptions } = getChildEntryOptions(child, zipEntry, options);
9975
9980
  return { name, size: child.directory ? 0 : getDeterminedSize(child, isPassThrough(child, options)), options: entryOptions };
9976
- }), writeOrderGuaranteed, options.globalComment);
9981
+ });
9982
+ const writeOrderGuaranteed = !options.bufferedWrite ||
9983
+ (entries.every(entry => entry.options.keepOrder !== false) && zipEntry.children.every(child => !child.children.length));
9984
+ return getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
9977
9985
  }
9978
9986
 
9979
9987
  getChildByName(name) {