@zip.js/zip.js 2.5.22 → 2.5.25

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
@@ -4426,14 +4426,13 @@
4426
4426
  if (codecAdapter.pendingData) {
4427
4427
  const { pendingData } = codecAdapter;
4428
4428
  codecAdapter.pendingData = new Uint8Array(pendingData.length + data.length);
4429
- codecAdapter.pendingData.set(pendingData, 0);
4430
- codecAdapter.pendingData.set(data, pendingData.length);
4429
+ pendingData.set(pendingData, 0);
4430
+ pendingData.set(data, pendingData.length);
4431
4431
  } else {
4432
4432
  codecAdapter.pendingData = new Uint8Array(data);
4433
4433
  }
4434
4434
  };
4435
- // eslint-disable-next-line no-prototype-builtins
4436
- if (options.hasOwnProperty("level") && options.level === undefined) {
4435
+ if (Object.hasOwn(options, "level") && options.level === undefined) {
4437
4436
  delete options.level;
4438
4437
  }
4439
4438
  codecAdapter.codec = new constructor(Object.assign({}, constructorOptions, options));
@@ -6490,12 +6489,13 @@
6490
6489
 
6491
6490
  get readable() {
6492
6491
  const reader = this;
6492
+ const { chunkSize = DEFAULT_CHUNK_SIZE } = reader;
6493
6493
  const readable = new ReadableStream({
6494
6494
  start() {
6495
6495
  this.chunkOffset = 0;
6496
6496
  },
6497
6497
  async pull(controller) {
6498
- const { offset = 0, chunkSize = DEFAULT_CHUNK_SIZE, size } = readable;
6498
+ const { offset = 0, size } = readable;
6499
6499
  const { chunkOffset } = this;
6500
6500
  controller.enqueue(await reader.readUint8Array(offset + chunkOffset, Math.min(chunkSize, size() - chunkOffset)));
6501
6501
  if (chunkOffset + chunkSize > size()) {
@@ -6855,7 +6855,7 @@
6855
6855
  if (response.status < 400) {
6856
6856
  return response;
6857
6857
  } else {
6858
- throw new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
6858
+ throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
6859
6859
  }
6860
6860
  }
6861
6861
 
@@ -6876,7 +6876,7 @@
6876
6876
  headers: new Map(headers)
6877
6877
  });
6878
6878
  } else {
6879
- reject(new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
6879
+ reject(request.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
6880
6880
  }
6881
6881
  }, false);
6882
6882
  request.addEventListener("error", event => reject(event.detail.error), false);
@@ -7213,6 +7213,7 @@
7213
7213
  if (!reader.initialized) {
7214
7214
  await reader.init();
7215
7215
  }
7216
+ reader.chunkSize = getChunkSize(config);
7216
7217
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
7217
7218
  throw new Error(ERR_BAD_FORMAT);
7218
7219
  }
@@ -7329,9 +7330,9 @@
7329
7330
  const extractPrependedData = getOptionValue$1(zipReader, options, "extractPrependedData");
7330
7331
  const extractAppendedData = getOptionValue$1(zipReader, options, "extractAppendedData");
7331
7332
  if (extractPrependedData) {
7332
- zipReader.prependedData = await readUint8Array(reader, 0, startOffset);
7333
+ zipReader.prependedData = startOffset > 0 ? await readUint8Array(reader, 0, startOffset) : new Uint8Array();
7333
7334
  }
7334
- zipReader.comment = await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength);
7335
+ zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : new Uint8Array();
7335
7336
  if (extractAppendedData) {
7336
7337
  zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) : new Uint8Array();
7337
7338
  }
@@ -7409,7 +7410,6 @@
7409
7410
  const readable = reader.readable;
7410
7411
  readable.offset = dataOffset;
7411
7412
  readable.size = size;
7412
- readable.chunkSize = getChunkSize(config);
7413
7413
  const { writable } = writer;
7414
7414
  const signal = getOptionValue$1(zipEntry, options, "signal");
7415
7415
  if (writer.init && !writer.initialized) {
@@ -7760,17 +7760,22 @@
7760
7760
 
7761
7761
  async add(name = "", reader, options = {}) {
7762
7762
  const zipWriter = this;
7763
- if (workers < zipWriter.config.maxWorkers) {
7763
+ const {
7764
+ pendingAddFileCalls,
7765
+ pendingEntries,
7766
+ config
7767
+ } = zipWriter;
7768
+ if (workers < config.maxWorkers) {
7764
7769
  workers++;
7765
7770
  let promiseAddFile;
7766
7771
  try {
7767
7772
  promiseAddFile = addFile(zipWriter, name, reader, options);
7768
- this.pendingAddFileCalls.add(promiseAddFile);
7773
+ pendingAddFileCalls.add(promiseAddFile);
7769
7774
  return await promiseAddFile;
7770
7775
  } finally {
7771
- this.pendingAddFileCalls.delete(promiseAddFile);
7776
+ pendingAddFileCalls.delete(promiseAddFile);
7772
7777
  workers--;
7773
- const pendingEntry = zipWriter.pendingEntries.shift();
7778
+ const pendingEntry = pendingEntries.shift();
7774
7779
  if (pendingEntry) {
7775
7780
  zipWriter.add(pendingEntry.name, pendingEntry.reader, pendingEntry.options)
7776
7781
  .then(pendingEntry.resolve)
@@ -7778,7 +7783,7 @@
7778
7783
  }
7779
7784
  }
7780
7785
  } else {
7781
- return new Promise((resolve, reject) => zipWriter.pendingEntries.push({ name, reader, options, resolve, reject }));
7786
+ return new Promise((resolve, reject) => pendingEntries.push({ name, reader, options, resolve, reject }));
7782
7787
  }
7783
7788
  }
7784
7789
 
@@ -7938,22 +7943,31 @@
7938
7943
  }
7939
7944
 
7940
7945
  async function getFileEntry(zipWriter, name, reader, options) {
7941
- const { files, writer } = zipWriter;
7946
+ const {
7947
+ files,
7948
+ writer
7949
+ } = zipWriter;
7950
+ const {
7951
+ keepOrder,
7952
+ dataDescriptor,
7953
+ zipCrypto,
7954
+ signal
7955
+ } = options;
7942
7956
  const previousFileEntry = Array.from(files.values()).pop();
7943
7957
  let fileEntry = {};
7944
7958
  let bufferedWrite;
7945
7959
  let releaseLockWriter;
7946
- let resolveLockCurrentFileEntry;
7947
- let writingBufferedData;
7960
+ let releaseLockCurrentFileEntry;
7961
+ let bufferedDataWritten;
7962
+ let fileWriter;
7948
7963
  files.set(name, fileEntry);
7949
7964
  try {
7950
7965
  let lockPreviousFileEntry;
7951
- let fileWriter;
7952
- if (options.keepOrder) {
7966
+ if (keepOrder) {
7953
7967
  lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
7968
+ requestLockCurrentFileEntry();
7954
7969
  }
7955
- fileEntry.lock = new Promise(resolve => resolveLockCurrentFileEntry = resolve);
7956
- if (options.bufferedWrite || zipWriter.lockWriter || !options.dataDescriptor) {
7970
+ if (options.bufferedWrite || zipWriter.lockWriter || !dataDescriptor) {
7957
7971
  fileWriter = new BlobWriter();
7958
7972
  fileWriter.init();
7959
7973
  bufferedWrite = true;
@@ -7964,20 +7978,20 @@
7964
7978
  }
7965
7979
  fileWriter = writer;
7966
7980
  }
7967
- fileEntry = await createFileEntry(reader, fileWriter.writable, zipWriter.config, options);
7981
+ fileEntry = await createFileEntry(reader, fileEntry, fileWriter.writable, zipWriter.config, options);
7968
7982
  files.set(name, fileEntry);
7969
7983
  fileEntry.filename = name;
7970
7984
  if (bufferedWrite) {
7971
7985
  let blob = fileWriter.getData();
7972
7986
  await lockPreviousFileEntry;
7973
- await lockWriter();
7974
- writingBufferedData = true;
7987
+ await requestLockWriter();
7988
+ bufferedDataWritten = true;
7975
7989
  const { writable } = writer;
7976
- if (!options.dataDescriptor) {
7990
+ if (!dataDescriptor) {
7977
7991
  const headerLength = 26;
7978
7992
  const arrayBuffer = await sliceAsArrayBuffer(blob, 0, headerLength);
7979
7993
  const arrayBufferView = new DataView(arrayBuffer);
7980
- if (!fileEntry.encrypted || options.zipCrypto) {
7994
+ if (!fileEntry.encrypted || zipCrypto) {
7981
7995
  setUint32(arrayBufferView, 14, fileEntry.signature);
7982
7996
  }
7983
7997
  if (fileEntry.zip64) {
@@ -7990,8 +8004,8 @@
7990
8004
  await writeUint8Array(writable, new Uint8Array(arrayBuffer));
7991
8005
  blob = blob.slice(headerLength);
7992
8006
  }
7993
- await blob.stream().pipeTo(writable, { preventClose: true });
7994
- writingBufferedData = false;
8007
+ await blob.stream().pipeTo(writable, { preventClose: true, signal });
8008
+ bufferedDataWritten = false;
7995
8009
  }
7996
8010
  fileEntry.offset = zipWriter.offset;
7997
8011
  if (fileEntry.zip64) {
@@ -8003,32 +8017,37 @@
8003
8017
  zipWriter.offset += fileEntry.length;
8004
8018
  return fileEntry;
8005
8019
  } catch (error) {
8006
- if ((bufferedWrite && writingBufferedData) || (!bufferedWrite && fileEntry.dataWritten)) {
8020
+ if ((bufferedWrite && bufferedDataWritten) || (!bufferedWrite && fileEntry.dataWritten)) {
8007
8021
  error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
8008
- if (fileEntry.uncompressedSize) {
8009
- zipWriter.offset += fileEntry.uncompressedSize;
8010
- }
8022
+ zipWriter.offset += fileWriter.size;
8011
8023
  }
8012
8024
  files.delete(name);
8013
8025
  throw error;
8014
8026
  } finally {
8015
- resolveLockCurrentFileEntry();
8027
+ if (releaseLockCurrentFileEntry) {
8028
+ releaseLockCurrentFileEntry();
8029
+ }
8016
8030
  if (releaseLockWriter) {
8017
8031
  releaseLockWriter();
8018
8032
  }
8019
8033
  }
8020
8034
 
8021
- async function lockWriter() {
8022
- if (zipWriter.lockWriter) {
8023
- await zipWriter.lockWriter.then(() => delete zipWriter.lockWriter);
8024
- await lockWriter();
8035
+ function requestLockCurrentFileEntry() {
8036
+ fileEntry.lock = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
8037
+ }
8038
+
8039
+ async function requestLockWriter() {
8040
+ const { lockWriter } = zipWriter;
8041
+ if (lockWriter) {
8042
+ await lockWriter.then(() => delete zipWriter.lockWriter);
8043
+ return requestLockWriter();
8025
8044
  } else {
8026
8045
  zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
8027
8046
  }
8028
8047
  }
8029
8048
  }
8030
8049
 
8031
- async function createFileEntry(reader, writable, config, options) {
8050
+ async function createFileEntry(reader, pendingFileEntry, writable, config, options) {
8032
8051
  const {
8033
8052
  rawFilename,
8034
8053
  lastAccessDate,
@@ -8163,7 +8182,7 @@
8163
8182
  const rawLastModDate = dateArray[0];
8164
8183
  setUint32(headerView, 6, rawLastModDate);
8165
8184
  setUint16(headerView, 22, rawFilename.length);
8166
- const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + fileEntry.rawExtraField.length;
8185
+ const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + rawExtraField.length;
8167
8186
  setUint16(headerView, 24, extraFieldLength);
8168
8187
  const localHeaderArray = new Uint8Array(30 + rawFilename.length + extraFieldLength);
8169
8188
  const localHeaderView = getDataView(localHeaderArray);
@@ -8173,16 +8192,16 @@
8173
8192
  arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length);
8174
8193
  arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + rawFilename.length + rawExtraFieldAES.length);
8175
8194
  arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length);
8176
- arraySet(localHeaderArray, fileEntry.rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
8195
+ arraySet(localHeaderArray, rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
8177
8196
  let result;
8178
8197
  let compressedSize = 0;
8179
8198
  if (reader) {
8199
+ reader.chunkSize = getChunkSize(config);
8180
8200
  await writeUint8Array(writable, localHeaderArray);
8181
- fileEntry.dataWritten = true;
8201
+ fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
8182
8202
  const size = () => reader.size;
8183
8203
  const readable = reader.readable;
8184
8204
  readable.size = size;
8185
- readable.chunkSize = getChunkSize(config);
8186
8205
  const workerOptions = {
8187
8206
  options: {
8188
8207
  codecType: CODEC_DEFLATE,
@@ -8206,7 +8225,7 @@
8206
8225
  compressedSize = result.length;
8207
8226
  } else {
8208
8227
  await writeUint8Array(writable, localHeaderArray);
8209
- fileEntry.dataWritten = true;
8228
+ fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
8210
8229
  }
8211
8230
  let dataDescriptorArray = new Uint8Array();
8212
8231
  let dataDescriptorView, dataDescriptorOffset = 0;
@@ -8252,7 +8271,15 @@
8252
8271
  await writeUint8Array(writable, dataDescriptorArray);
8253
8272
  }
8254
8273
  const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length;
8255
- Object.assign(fileEntry, { compressedSize, lastModDate, rawLastModDate, creationDate, lastAccessDate, encrypted, length });
8274
+ Object.assign(fileEntry, {
8275
+ compressedSize,
8276
+ lastModDate,
8277
+ rawLastModDate,
8278
+ creationDate,
8279
+ lastAccessDate,
8280
+ encrypted,
8281
+ length
8282
+ });
8256
8283
  return fileEntry;
8257
8284
  }
8258
8285