@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-full.js CHANGED
@@ -7223,8 +7223,12 @@
7223
7223
  const endOfDirectoryView = getDataView$1(endOfDirectoryInfo);
7224
7224
  let directoryDataLength = getUint32(endOfDirectoryView, 12);
7225
7225
  let directoryDataOffset = getUint32(endOfDirectoryView, 16);
7226
+ const commentOffset = endOfDirectoryInfo.offset;
7227
+ const commentLength = getUint16(endOfDirectoryView, 20);
7228
+ const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
7226
7229
  let filesLength = getUint16(endOfDirectoryView, 8);
7227
7230
  let prependedDataLength = 0;
7231
+ let startOffset = 0;
7228
7232
  if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS) {
7229
7233
  const endOfDirectoryLocatorArray = await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH);
7230
7234
  const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray);
@@ -7295,6 +7299,7 @@
7295
7299
  commentUTF8: languageEncodingFlag,
7296
7300
  rawExtraField: directoryArray.subarray(extraFieldOffset, commentOffset)
7297
7301
  });
7302
+ startOffset = Math.max(fileEntry.offset, startOffset);
7298
7303
  const endOffset = commentOffset + fileEntry.commentLength;
7299
7304
  fileEntry.rawComment = directoryArray.subarray(commentOffset, endOffset);
7300
7305
  const filenameEncoding = getOptionValue$1(zipReader, options, "filenameEncoding");
@@ -7321,16 +7326,22 @@
7321
7326
  }
7322
7327
  yield entry;
7323
7328
  }
7329
+ const extractPrependedData = getOptionValue$1(zipReader, options, "extractPrependedData");
7330
+ const extractAppendedData = getOptionValue$1(zipReader, options, "extractAppendedData");
7331
+ if (extractPrependedData) {
7332
+ zipReader.prependedData = await readUint8Array(reader, 0, startOffset);
7333
+ }
7334
+ zipReader.comment = await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength);
7335
+ if (extractAppendedData) {
7336
+ zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) : new Uint8Array();
7337
+ }
7324
7338
  return true;
7325
7339
  }
7326
7340
 
7327
7341
  async getEntries(options = {}) {
7328
7342
  const entries = [];
7329
- const iterator = this.getEntriesGenerator(options);
7330
- let result = iterator.next();
7331
- while (!(await result).done) {
7332
- entries.push((await result).value);
7333
- result = iterator.next();
7343
+ for await (const entry of this.getEntriesGenerator(options)) {
7344
+ entries.push(entry);
7334
7345
  }
7335
7346
  return entries;
7336
7347
  }
@@ -7778,7 +7789,7 @@
7778
7789
  await Promise.all(Array.from(pendingAddFileCalls));
7779
7790
  }
7780
7791
  await closeFile(this, comment, options);
7781
- if (!writer.preventClose) {
7792
+ if (!writer.preventClose && !options.preventClose) {
7782
7793
  await writable.getWriter().close();
7783
7794
  }
7784
7795
  return writer.getData ? writer.getData() : writable;
@@ -7931,8 +7942,9 @@
7931
7942
  const previousFileEntry = Array.from(files.values()).pop();
7932
7943
  let fileEntry = {};
7933
7944
  let bufferedWrite;
7934
- let resolveLockUnbufferedWrite;
7945
+ let releaseLockWriter;
7935
7946
  let resolveLockCurrentFileEntry;
7947
+ let writingBufferedData;
7936
7948
  files.set(name, fileEntry);
7937
7949
  try {
7938
7950
  let lockPreviousFileEntry;
@@ -7941,12 +7953,12 @@
7941
7953
  lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
7942
7954
  }
7943
7955
  fileEntry.lock = new Promise(resolve => resolveLockCurrentFileEntry = resolve);
7944
- if (options.bufferedWrite || zipWriter.lockWrite || !options.dataDescriptor) {
7956
+ if (options.bufferedWrite || zipWriter.lockWriter || !options.dataDescriptor) {
7945
7957
  fileWriter = new BlobWriter();
7946
7958
  fileWriter.init();
7947
7959
  bufferedWrite = true;
7948
7960
  } else {
7949
- zipWriter.lockWrite = Promise.resolve();
7961
+ zipWriter.lockWriter = Promise.resolve();
7950
7962
  if (writer.init && !writer.initialized) {
7951
7963
  await writer.init();
7952
7964
  }
@@ -7956,11 +7968,10 @@
7956
7968
  files.set(name, fileEntry);
7957
7969
  fileEntry.filename = name;
7958
7970
  if (bufferedWrite) {
7959
- let indexWrittenData = 0;
7960
- const blob = fileWriter.getData();
7971
+ let blob = fileWriter.getData();
7961
7972
  await lockPreviousFileEntry;
7962
- await lockWriterAccess();
7963
- fileEntry.writingBufferedData = true;
7973
+ await lockWriter();
7974
+ writingBufferedData = true;
7964
7975
  const { writable } = writer;
7965
7976
  if (!options.dataDescriptor) {
7966
7977
  const headerLength = 26;
@@ -7977,10 +7988,10 @@
7977
7988
  setUint32(arrayBufferView, 22, fileEntry.uncompressedSize);
7978
7989
  }
7979
7990
  await writeUint8Array(writable, new Uint8Array(arrayBuffer));
7980
- indexWrittenData = headerLength;
7991
+ blob = blob.slice(headerLength);
7981
7992
  }
7982
- await writeBlob(writable, blob, indexWrittenData);
7983
- delete fileEntry.writingBufferedData;
7993
+ await blob.stream().pipeTo(writable, { preventClose: true });
7994
+ writingBufferedData = false;
7984
7995
  }
7985
7996
  fileEntry.offset = zipWriter.offset;
7986
7997
  if (fileEntry.zip64) {
@@ -7992,7 +8003,7 @@
7992
8003
  zipWriter.offset += fileEntry.length;
7993
8004
  return fileEntry;
7994
8005
  } catch (error) {
7995
- if ((bufferedWrite && fileEntry.writingBufferedData) || (!bufferedWrite && fileEntry.dataWritten)) {
8006
+ if ((bufferedWrite && writingBufferedData) || (!bufferedWrite && fileEntry.dataWritten)) {
7996
8007
  error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
7997
8008
  if (fileEntry.uncompressedSize) {
7998
8009
  zipWriter.offset += fileEntry.uncompressedSize;
@@ -8002,17 +8013,17 @@
8002
8013
  throw error;
8003
8014
  } finally {
8004
8015
  resolveLockCurrentFileEntry();
8005
- if (resolveLockUnbufferedWrite) {
8006
- resolveLockUnbufferedWrite();
8016
+ if (releaseLockWriter) {
8017
+ releaseLockWriter();
8007
8018
  }
8008
8019
  }
8009
8020
 
8010
- async function lockWriterAccess() {
8011
- if (zipWriter.lockWrite) {
8012
- await zipWriter.lockWrite.then(() => delete zipWriter.lockWrite);
8013
- await lockWriterAccess();
8021
+ async function lockWriter() {
8022
+ if (zipWriter.lockWriter) {
8023
+ await zipWriter.lockWriter.then(() => delete zipWriter.lockWriter);
8024
+ await lockWriter();
8014
8025
  } else {
8015
- zipWriter.lockWrite = new Promise(resolve => resolveLockUnbufferedWrite = resolve);
8026
+ zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
8016
8027
  }
8017
8028
  }
8018
8029
  }
@@ -8271,13 +8282,6 @@
8271
8282
  }
8272
8283
  const directoryArray = new Uint8Array(directoryDataLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH));
8273
8284
  const directoryView = getDataView(directoryArray);
8274
- if (comment && comment.length) {
8275
- if (comment.length <= MAX_16_BITS) {
8276
- setUint16(directoryView, offset + 20, comment.length);
8277
- } else {
8278
- throw new Error(ERR_INVALID_COMMENT);
8279
- }
8280
- }
8281
8285
  for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
8282
8286
  const {
8283
8287
  rawFilename,
@@ -8361,6 +8365,13 @@
8361
8365
  setUint16(directoryView, offset + 10, filesLength);
8362
8366
  setUint32(directoryView, offset + 12, directoryDataLength);
8363
8367
  setUint32(directoryView, offset + 16, directoryOffset);
8368
+ if (comment && comment.length) {
8369
+ if (comment.length <= MAX_16_BITS) {
8370
+ setUint16(directoryView, offset + 20, comment.length);
8371
+ } else {
8372
+ throw new Error(ERR_INVALID_COMMENT);
8373
+ }
8374
+ }
8364
8375
  const { writable } = zipWriter.writer;
8365
8376
  await writeUint8Array(writable, directoryArray);
8366
8377
  if (comment && comment.length) {
@@ -8376,20 +8387,6 @@
8376
8387
  }
8377
8388
  }
8378
8389
 
8379
- async function writeBlob(writable, blob, start = 0) {
8380
- const blockSize = 512 * 1024 * 1024;
8381
- await writeSlice();
8382
-
8383
- async function writeSlice() {
8384
- if (start < blob.size) {
8385
- const arrayBuffer = await sliceAsArrayBuffer(blob, start, start + blockSize);
8386
- await writeUint8Array(writable, new Uint8Array(arrayBuffer));
8387
- start += blockSize;
8388
- await writeSlice();
8389
- }
8390
- }
8391
- }
8392
-
8393
8390
  async function writeUint8Array(writable, array) {
8394
8391
  const streamWriter = writable.getWriter();
8395
8392
  await streamWriter.ready;