@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/index-native.cjs CHANGED
@@ -6670,6 +6670,13 @@ async function addFile(zipWriter, name, reader, options) {
6670
6670
  const { comment } = metadataInfo;
6671
6671
  const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
6672
6672
  zipWriter.fileEntries.set(name, UNDEFINED_VALUE);
6673
+ const previousFileEntry = zipWriter.lastFileEntry;
6674
+ const pendingFileEntry = {};
6675
+ let releaseLockFileEntry;
6676
+ if (metadataInfo.resolvedOptions.keepOrder) {
6677
+ pendingFileEntry.lockFileEntry = new Promise(resolve => releaseLockFileEntry = resolve);
6678
+ }
6679
+ zipWriter.lastFileEntry = pendingFileEntry;
6673
6680
  let fileEntry;
6674
6681
  try {
6675
6682
  const { resolvedOptions } = metadataInfo;
@@ -6691,10 +6698,21 @@ async function addFile(zipWriter, name, reader, options) {
6691
6698
  const headerInfo = getHeaderInfo(options);
6692
6699
  const dataDescriptorInfo = getDataDescriptorInfo(options);
6693
6700
  const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
6694
- fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
6701
+ fileEntry = await getFileEntry(zipWriter, name, reader, {
6702
+ headerInfo,
6703
+ dataDescriptorInfo,
6704
+ metadataSize,
6705
+ fileEntry: pendingFileEntry,
6706
+ previousFileEntry,
6707
+ releaseLockFileEntry
6708
+ }, options);
6695
6709
  } catch (error) {
6696
6710
  zipWriter.fileEntries.delete(name);
6697
6711
  throw error;
6712
+ } finally {
6713
+ if (releaseLockFileEntry) {
6714
+ releaseLockFileEntry(previousFileEntry && previousFileEntry.lockFileEntry);
6715
+ }
6698
6716
  }
6699
6717
  Object.assign(fileEntry, {
6700
6718
  name,
@@ -7082,7 +7100,6 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
7082
7100
  }
7083
7101
  const usdz = writerOptions[OPTION_USDZ];
7084
7102
  const files = new Map();
7085
- let layoutDependsOnWriteOrder = Boolean(usdz);
7086
7103
  const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
7087
7104
  let offset = initialOffset;
7088
7105
  let minimumEntrySize = INFINITY_VALUE;
@@ -7128,9 +7145,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
7128
7145
  minimumEntrySize = Math.min(minimumEntrySize, entrySize);
7129
7146
  offset += entrySize;
7130
7147
  }
7131
- if (files.size && offset - minimumEntrySize >= MAX_32_BITS) {
7132
- layoutDependsOnWriteOrder = true;
7133
- }
7148
+ const layoutDependsOnWriteOrder = files.size > 1 && (usdz || offset - minimumEntrySize >= MAX_32_BITS);
7134
7149
  if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
7135
7150
  throw new Error(ERR_UNDETERMINED_SIZE);
7136
7151
  }
@@ -7158,27 +7173,23 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7158
7173
  signal
7159
7174
  } = options;
7160
7175
  const {
7161
- headerInfo
7176
+ headerInfo,
7177
+ fileEntry: pendingFileEntry,
7178
+ previousFileEntry,
7179
+ releaseLockFileEntry
7162
7180
  } = entryInfo;
7163
7181
  const usdz = zipWriter.options[OPTION_USDZ];
7164
- const previousFileEntry = zipWriter.lastFileEntry;
7165
- let fileEntry = {};
7182
+ let fileEntry = pendingFileEntry;
7166
7183
  let bufferedWrite;
7167
7184
  let releaseLockWriter;
7168
- let releaseLockCurrentFileEntry;
7169
7185
  let writingBufferedEntryData;
7170
7186
  let writingEntryData;
7171
7187
  let writerSizeBeforeEntry;
7172
7188
  let flushedBufferedSize = 0;
7173
7189
  let fileWriter;
7190
+ const lockPreviousFileEntry = keepOrder && previousFileEntry ? previousFileEntry.lockFileEntry : UNDEFINED_VALUE;
7174
7191
  fileEntries.set(name, fileEntry);
7175
- zipWriter.lastFileEntry = fileEntry;
7176
7192
  try {
7177
- let lockPreviousFileEntry;
7178
- if (keepOrder) {
7179
- lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
7180
- requestLockCurrentFileEntry();
7181
- }
7182
7193
  if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || (!dataDescriptor && !emptyEntry)) {
7183
7194
  bufferedWrite = true;
7184
7195
  zipWriter.bufferedWrites++;
@@ -7191,6 +7202,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7191
7202
  await initStream(writer);
7192
7203
  } else {
7193
7204
  fileWriter = writer;
7205
+ await lockPreviousFileEntry;
7194
7206
  await requestLockWriter();
7195
7207
  }
7196
7208
  await initStream(fileWriter);
@@ -7203,7 +7215,6 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7203
7215
  }
7204
7216
  const { localHeaderArray } = headerInfo;
7205
7217
  if (!bufferedWrite) {
7206
- await lockPreviousFileEntry;
7207
7218
  await skipDiskIfNeeded();
7208
7219
  }
7209
7220
  const diskNumberStart = getDiskNumber(writer);
@@ -7268,8 +7279,8 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7268
7279
  if (bufferedWrite) {
7269
7280
  zipWriter.bufferedWrites--;
7270
7281
  }
7271
- if (releaseLockCurrentFileEntry) {
7272
- releaseLockCurrentFileEntry();
7282
+ if (releaseLockFileEntry) {
7283
+ releaseLockFileEntry(lockPreviousFileEntry);
7273
7284
  }
7274
7285
  if (releaseLockWriter) {
7275
7286
  releaseLockWriter();
@@ -7283,10 +7294,6 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
7283
7294
  }
7284
7295
  }
7285
7296
 
7286
- function requestLockCurrentFileEntry() {
7287
- fileEntry.lockFileEntry = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
7288
- }
7289
-
7290
7297
  async function requestLockWriter() {
7291
7298
  zipWriter.writerLocked = true;
7292
7299
  const { lockWriter } = zipWriter;
@@ -8606,7 +8613,7 @@ function formatSupported(StreamClass, format) {
8606
8613
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8607
8614
  */
8608
8615
 
8609
- const VERSION = "2.8.60";
8616
+ const VERSION = "2.8.61";
8610
8617
 
8611
8618
  /*
8612
8619
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9583,12 +9590,13 @@ class ZipDirectoryEntry extends ZipEntry {
9583
9590
  if (options.bufferedWrite === UNDEFINED_VALUE) {
9584
9591
  options.bufferedWrite = true;
9585
9592
  }
9586
- const writeOrderGuaranteed = !options.bufferedWrite ||
9587
- (options.keepOrder !== false && zipEntry.children.every(child => !child.children.length));
9588
- return getEntriesSize(options, zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
9593
+ const entries = zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
9589
9594
  const { name, entryOptions } = getChildEntryOptions(child, zipEntry, options);
9590
9595
  return { name, size: child.directory ? 0 : getDeterminedSize(child, isPassThrough(child, options)), options: entryOptions };
9591
- }), writeOrderGuaranteed, options.globalComment);
9596
+ });
9597
+ const writeOrderGuaranteed = !options.bufferedWrite ||
9598
+ (entries.every(entry => entry.options.keepOrder !== false) && zipEntry.children.every(child => !child.children.length));
9599
+ return getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
9592
9600
  }
9593
9601
 
9594
9602
  getChildByName(name) {