@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.
@@ -6705,6 +6705,13 @@ async function addFile(zipWriter, name, reader, options) {
6705
6705
  const { comment } = metadataInfo;
6706
6706
  const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
6707
6707
  zipWriter.fileEntries.set(name, UNDEFINED_VALUE);
6708
+ const previousFileEntry = zipWriter.lastFileEntry;
6709
+ const pendingFileEntry = {};
6710
+ let releaseLockFileEntry;
6711
+ if (metadataInfo.resolvedOptions.keepOrder) {
6712
+ pendingFileEntry.lockFileEntry = new Promise(resolve => releaseLockFileEntry = resolve);
6713
+ }
6714
+ zipWriter.lastFileEntry = pendingFileEntry;
6708
6715
  let fileEntry;
6709
6716
  try {
6710
6717
  const { resolvedOptions } = metadataInfo;
@@ -6726,10 +6733,21 @@ async function addFile(zipWriter, name, reader, options) {
6726
6733
  const headerInfo = getHeaderInfo(options);
6727
6734
  const dataDescriptorInfo = getDataDescriptorInfo(options);
6728
6735
  const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
6729
- fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
6736
+ fileEntry = await getFileEntry(zipWriter, name, reader, {
6737
+ headerInfo,
6738
+ dataDescriptorInfo,
6739
+ metadataSize,
6740
+ fileEntry: pendingFileEntry,
6741
+ previousFileEntry,
6742
+ releaseLockFileEntry
6743
+ }, options);
6730
6744
  } catch (error) {
6731
6745
  zipWriter.fileEntries.delete(name);
6732
6746
  throw error;
6747
+ } finally {
6748
+ if (releaseLockFileEntry) {
6749
+ releaseLockFileEntry(previousFileEntry && previousFileEntry.lockFileEntry);
6750
+ }
6733
6751
  }
6734
6752
  Object.assign(fileEntry, {
6735
6753
  name,
@@ -7117,7 +7135,6 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
7117
7135
  }
7118
7136
  const usdz = writerOptions[OPTION_USDZ];
7119
7137
  const files = new Map();
7120
- let layoutDependsOnWriteOrder = Boolean(usdz);
7121
7138
  const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
7122
7139
  let offset = initialOffset;
7123
7140
  let minimumEntrySize = INFINITY_VALUE;
@@ -7163,9 +7180,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
7163
7180
  minimumEntrySize = Math.min(minimumEntrySize, entrySize);
7164
7181
  offset += entrySize;
7165
7182
  }
7166
- if (files.size && offset - minimumEntrySize >= MAX_32_BITS) {
7167
- layoutDependsOnWriteOrder = true;
7168
- }
7183
+ const layoutDependsOnWriteOrder = files.size > 1 && (usdz || offset - minimumEntrySize >= MAX_32_BITS);
7169
7184
  if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
7170
7185
  throw new Error(ERR_UNDETERMINED_SIZE);
7171
7186
  }
@@ -7193,27 +7208,23 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7193
7208
  signal
7194
7209
  } = options;
7195
7210
  const {
7196
- headerInfo
7211
+ headerInfo,
7212
+ fileEntry: pendingFileEntry,
7213
+ previousFileEntry,
7214
+ releaseLockFileEntry
7197
7215
  } = entryInfo;
7198
7216
  const usdz = zipWriter.options[OPTION_USDZ];
7199
- const previousFileEntry = zipWriter.lastFileEntry;
7200
- let fileEntry = {};
7217
+ let fileEntry = pendingFileEntry;
7201
7218
  let bufferedWrite;
7202
7219
  let releaseLockWriter;
7203
- let releaseLockCurrentFileEntry;
7204
7220
  let writingBufferedEntryData;
7205
7221
  let writingEntryData;
7206
7222
  let writerSizeBeforeEntry;
7207
7223
  let flushedBufferedSize = 0;
7208
7224
  let fileWriter;
7225
+ const lockPreviousFileEntry = keepOrder && previousFileEntry ? previousFileEntry.lockFileEntry : UNDEFINED_VALUE;
7209
7226
  fileEntries.set(name, fileEntry);
7210
- zipWriter.lastFileEntry = fileEntry;
7211
7227
  try {
7212
- let lockPreviousFileEntry;
7213
- if (keepOrder) {
7214
- lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
7215
- requestLockCurrentFileEntry();
7216
- }
7217
7228
  if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || (!dataDescriptor && !emptyEntry)) {
7218
7229
  bufferedWrite = true;
7219
7230
  zipWriter.bufferedWrites++;
@@ -7226,6 +7237,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7226
7237
  await initStream(writer);
7227
7238
  } else {
7228
7239
  fileWriter = writer;
7240
+ await lockPreviousFileEntry;
7229
7241
  await requestLockWriter();
7230
7242
  }
7231
7243
  await initStream(fileWriter);
@@ -7238,7 +7250,6 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7238
7250
  }
7239
7251
  const { localHeaderArray } = headerInfo;
7240
7252
  if (!bufferedWrite) {
7241
- await lockPreviousFileEntry;
7242
7253
  await skipDiskIfNeeded();
7243
7254
  }
7244
7255
  const diskNumberStart = getDiskNumber(writer);
@@ -7303,8 +7314,8 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7303
7314
  if (bufferedWrite) {
7304
7315
  zipWriter.bufferedWrites--;
7305
7316
  }
7306
- if (releaseLockCurrentFileEntry) {
7307
- releaseLockCurrentFileEntry();
7317
+ if (releaseLockFileEntry) {
7318
+ releaseLockFileEntry(lockPreviousFileEntry);
7308
7319
  }
7309
7320
  if (releaseLockWriter) {
7310
7321
  releaseLockWriter();
@@ -7318,10 +7329,6 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7318
7329
  }
7319
7330
  }
7320
7331
 
7321
- function requestLockCurrentFileEntry() {
7322
- fileEntry.lockFileEntry = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
7323
- }
7324
-
7325
7332
  async function requestLockWriter() {
7326
7333
  zipWriter.writerLocked = true;
7327
7334
  const { lockWriter } = zipWriter;
@@ -8641,7 +8648,7 @@ function formatSupported(StreamClass, format) {
8641
8648
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8642
8649
  */
8643
8650
 
8644
- const VERSION = "2.8.60";
8651
+ const VERSION = "2.8.61";
8645
8652
 
8646
8653
  /*
8647
8654
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9965,12 +9972,13 @@ class ZipDirectoryEntry extends ZipEntry {
9965
9972
  if (options.bufferedWrite === UNDEFINED_VALUE) {
9966
9973
  options.bufferedWrite = true;
9967
9974
  }
9968
- const writeOrderGuaranteed = !options.bufferedWrite ||
9969
- (options.keepOrder !== false && zipEntry.children.every(child => !child.children.length));
9970
- return getEntriesSize(options, zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
9975
+ const entries = zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
9971
9976
  const { name, entryOptions } = getChildEntryOptions(child, zipEntry, options);
9972
9977
  return { name, size: child.directory ? 0 : getDeterminedSize(child, isPassThrough(child, options)), options: entryOptions };
9973
- }), writeOrderGuaranteed, options.globalComment);
9978
+ });
9979
+ const writeOrderGuaranteed = !options.bufferedWrite ||
9980
+ (entries.every(entry => entry.options.keepOrder !== false) && zipEntry.children.every(child => !child.children.length));
9981
+ return getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
9974
9982
  }
9975
9983
 
9976
9984
  getChildByName(name) {