@zip.js/zip.js 2.5.23 → 2.5.24

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
  }
@@ -7331,7 +7332,7 @@
7331
7332
  if (extractPrependedData) {
7332
7333
  zipReader.prependedData = await readUint8Array(reader, 0, startOffset);
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;
7948
7962
  let fileWriter;
7949
7963
  files.set(name, fileEntry);
7950
7964
  try {
7951
7965
  let lockPreviousFileEntry;
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;
@@ -7970,14 +7984,14 @@
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,23 +8017,30 @@
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
8022
  zipWriter.offset += fileWriter.size;
8009
8023
  }
8010
8024
  files.delete(name);
8011
8025
  throw error;
8012
8026
  } finally {
8013
- resolveLockCurrentFileEntry();
8027
+ if (releaseLockCurrentFileEntry) {
8028
+ releaseLockCurrentFileEntry();
8029
+ }
8014
8030
  if (releaseLockWriter) {
8015
8031
  releaseLockWriter();
8016
8032
  }
8017
8033
  }
8018
8034
 
8019
- async function lockWriter() {
8020
- if (zipWriter.lockWriter) {
8021
- await zipWriter.lockWriter.then(() => delete zipWriter.lockWriter);
8022
- 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();
8023
8044
  } else {
8024
8045
  zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
8025
8046
  }
@@ -8161,7 +8182,7 @@
8161
8182
  const rawLastModDate = dateArray[0];
8162
8183
  setUint32(headerView, 6, rawLastModDate);
8163
8184
  setUint16(headerView, 22, rawFilename.length);
8164
- const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + fileEntry.rawExtraField.length;
8185
+ const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + rawExtraField.length;
8165
8186
  setUint16(headerView, 24, extraFieldLength);
8166
8187
  const localHeaderArray = new Uint8Array(30 + rawFilename.length + extraFieldLength);
8167
8188
  const localHeaderView = getDataView(localHeaderArray);
@@ -8171,16 +8192,16 @@
8171
8192
  arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length);
8172
8193
  arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + rawFilename.length + rawExtraFieldAES.length);
8173
8194
  arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length);
8174
- 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);
8175
8196
  let result;
8176
8197
  let compressedSize = 0;
8177
8198
  if (reader) {
8199
+ reader.chunkSize = getChunkSize(config);
8178
8200
  await writeUint8Array(writable, localHeaderArray);
8179
8201
  fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
8180
8202
  const size = () => reader.size;
8181
8203
  const readable = reader.readable;
8182
8204
  readable.size = size;
8183
- readable.chunkSize = getChunkSize(config);
8184
8205
  const workerOptions = {
8185
8206
  options: {
8186
8207
  codecType: CODEC_DEFLATE,
@@ -8250,7 +8271,15 @@
8250
8271
  await writeUint8Array(writable, dataDescriptorArray);
8251
8272
  }
8252
8273
  const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length;
8253
- 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
+ });
8254
8283
  return fileEntry;
8255
8284
  }
8256
8285