@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-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,36 +7942,36 @@
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;
7948
+ let fileWriter;
7936
7949
  files.set(name, fileEntry);
7937
7950
  try {
7938
7951
  let lockPreviousFileEntry;
7939
- let fileWriter;
7940
7952
  if (options.keepOrder) {
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
  }
7953
7965
  fileWriter = writer;
7954
7966
  }
7955
- fileEntry = await createFileEntry(reader, fileWriter.writable, zipWriter.config, options);
7967
+ fileEntry = await createFileEntry(reader, fileEntry, fileWriter.writable, zipWriter.config, options);
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,32 +8003,30 @@
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
- if (fileEntry.uncompressedSize) {
7998
- zipWriter.offset += fileEntry.uncompressedSize;
7999
- }
8008
+ zipWriter.offset += fileWriter.size;
8000
8009
  }
8001
8010
  files.delete(name);
8002
8011
  throw error;
8003
8012
  } finally {
8004
8013
  resolveLockCurrentFileEntry();
8005
- if (resolveLockUnbufferedWrite) {
8006
- resolveLockUnbufferedWrite();
8014
+ if (releaseLockWriter) {
8015
+ releaseLockWriter();
8007
8016
  }
8008
8017
  }
8009
8018
 
8010
- async function lockWriterAccess() {
8011
- if (zipWriter.lockWrite) {
8012
- await zipWriter.lockWrite.then(() => delete zipWriter.lockWrite);
8013
- await lockWriterAccess();
8019
+ async function lockWriter() {
8020
+ if (zipWriter.lockWriter) {
8021
+ await zipWriter.lockWriter.then(() => delete zipWriter.lockWriter);
8022
+ await lockWriter();
8014
8023
  } else {
8015
- zipWriter.lockWrite = new Promise(resolve => resolveLockUnbufferedWrite = resolve);
8024
+ zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
8016
8025
  }
8017
8026
  }
8018
8027
  }
8019
8028
 
8020
- async function createFileEntry(reader, writable, config, options) {
8029
+ async function createFileEntry(reader, pendingFileEntry, writable, config, options) {
8021
8030
  const {
8022
8031
  rawFilename,
8023
8032
  lastAccessDate,
@@ -8167,7 +8176,7 @@
8167
8176
  let compressedSize = 0;
8168
8177
  if (reader) {
8169
8178
  await writeUint8Array(writable, localHeaderArray);
8170
- fileEntry.dataWritten = true;
8179
+ fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
8171
8180
  const size = () => reader.size;
8172
8181
  const readable = reader.readable;
8173
8182
  readable.size = size;
@@ -8195,7 +8204,7 @@
8195
8204
  compressedSize = result.length;
8196
8205
  } else {
8197
8206
  await writeUint8Array(writable, localHeaderArray);
8198
- fileEntry.dataWritten = true;
8207
+ fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
8199
8208
  }
8200
8209
  let dataDescriptorArray = new Uint8Array();
8201
8210
  let dataDescriptorView, dataDescriptorOffset = 0;
@@ -8271,13 +8280,6 @@
8271
8280
  }
8272
8281
  const directoryArray = new Uint8Array(directoryDataLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH));
8273
8282
  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
8283
  for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
8282
8284
  const {
8283
8285
  rawFilename,
@@ -8361,6 +8363,13 @@
8361
8363
  setUint16(directoryView, offset + 10, filesLength);
8362
8364
  setUint32(directoryView, offset + 12, directoryDataLength);
8363
8365
  setUint32(directoryView, offset + 16, directoryOffset);
8366
+ if (comment && comment.length) {
8367
+ if (comment.length <= MAX_16_BITS) {
8368
+ setUint16(directoryView, offset + 20, comment.length);
8369
+ } else {
8370
+ throw new Error(ERR_INVALID_COMMENT);
8371
+ }
8372
+ }
8364
8373
  const { writable } = zipWriter.writer;
8365
8374
  await writeUint8Array(writable, directoryArray);
8366
8375
  if (comment && comment.length) {
@@ -8376,20 +8385,6 @@
8376
8385
  }
8377
8386
  }
8378
8387
 
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
8388
  async function writeUint8Array(writable, array) {
8394
8389
  const streamWriter = writable.getWriter();
8395
8390
  await streamWriter.ready;