@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.js CHANGED
@@ -192,14 +192,13 @@
192
192
  if (codecAdapter.pendingData) {
193
193
  const { pendingData } = codecAdapter;
194
194
  codecAdapter.pendingData = new Uint8Array(pendingData.length + data.length);
195
- codecAdapter.pendingData.set(pendingData, 0);
196
- codecAdapter.pendingData.set(data, pendingData.length);
195
+ pendingData.set(pendingData, 0);
196
+ pendingData.set(data, pendingData.length);
197
197
  } else {
198
198
  codecAdapter.pendingData = new Uint8Array(data);
199
199
  }
200
200
  };
201
- // eslint-disable-next-line no-prototype-builtins
202
- if (options.hasOwnProperty("level") && options.level === undefined) {
201
+ if (Object.hasOwn(options, "level") && options.level === undefined) {
203
202
  delete options.level;
204
203
  }
205
204
  codecAdapter.codec = new constructor(Object.assign({}, constructorOptions, options));
@@ -2256,12 +2255,13 @@
2256
2255
 
2257
2256
  get readable() {
2258
2257
  const reader = this;
2258
+ const { chunkSize = DEFAULT_CHUNK_SIZE } = reader;
2259
2259
  const readable = new ReadableStream({
2260
2260
  start() {
2261
2261
  this.chunkOffset = 0;
2262
2262
  },
2263
2263
  async pull(controller) {
2264
- const { offset = 0, chunkSize = DEFAULT_CHUNK_SIZE, size } = readable;
2264
+ const { offset = 0, size } = readable;
2265
2265
  const { chunkOffset } = this;
2266
2266
  controller.enqueue(await reader.readUint8Array(offset + chunkOffset, Math.min(chunkSize, size() - chunkOffset)));
2267
2267
  if (chunkOffset + chunkSize > size()) {
@@ -2621,7 +2621,7 @@
2621
2621
  if (response.status < 400) {
2622
2622
  return response;
2623
2623
  } else {
2624
- throw new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
2624
+ throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
2625
2625
  }
2626
2626
  }
2627
2627
 
@@ -2642,7 +2642,7 @@
2642
2642
  headers: new Map(headers)
2643
2643
  });
2644
2644
  } else {
2645
- reject(new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
2645
+ reject(request.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
2646
2646
  }
2647
2647
  }, false);
2648
2648
  request.addEventListener("error", event => reject(event.detail.error), false);
@@ -2979,6 +2979,7 @@
2979
2979
  if (!reader.initialized) {
2980
2980
  await reader.init();
2981
2981
  }
2982
+ reader.chunkSize = getChunkSize(config);
2982
2983
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
2983
2984
  throw new Error(ERR_BAD_FORMAT);
2984
2985
  }
@@ -3097,7 +3098,7 @@
3097
3098
  if (extractPrependedData) {
3098
3099
  zipReader.prependedData = await readUint8Array(reader, 0, startOffset);
3099
3100
  }
3100
- zipReader.comment = await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength);
3101
+ zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : new Uint8Array();
3101
3102
  if (extractAppendedData) {
3102
3103
  zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) : new Uint8Array();
3103
3104
  }
@@ -3175,7 +3176,6 @@
3175
3176
  const readable = reader.readable;
3176
3177
  readable.offset = dataOffset;
3177
3178
  readable.size = size;
3178
- readable.chunkSize = getChunkSize(config);
3179
3179
  const { writable } = writer;
3180
3180
  const signal = getOptionValue$1(zipEntry, options, "signal");
3181
3181
  if (writer.init && !writer.initialized) {
@@ -3526,17 +3526,22 @@
3526
3526
 
3527
3527
  async add(name = "", reader, options = {}) {
3528
3528
  const zipWriter = this;
3529
- if (workers < zipWriter.config.maxWorkers) {
3529
+ const {
3530
+ pendingAddFileCalls,
3531
+ pendingEntries,
3532
+ config
3533
+ } = zipWriter;
3534
+ if (workers < config.maxWorkers) {
3530
3535
  workers++;
3531
3536
  let promiseAddFile;
3532
3537
  try {
3533
3538
  promiseAddFile = addFile(zipWriter, name, reader, options);
3534
- this.pendingAddFileCalls.add(promiseAddFile);
3539
+ pendingAddFileCalls.add(promiseAddFile);
3535
3540
  return await promiseAddFile;
3536
3541
  } finally {
3537
- this.pendingAddFileCalls.delete(promiseAddFile);
3542
+ pendingAddFileCalls.delete(promiseAddFile);
3538
3543
  workers--;
3539
- const pendingEntry = zipWriter.pendingEntries.shift();
3544
+ const pendingEntry = pendingEntries.shift();
3540
3545
  if (pendingEntry) {
3541
3546
  zipWriter.add(pendingEntry.name, pendingEntry.reader, pendingEntry.options)
3542
3547
  .then(pendingEntry.resolve)
@@ -3544,7 +3549,7 @@
3544
3549
  }
3545
3550
  }
3546
3551
  } else {
3547
- return new Promise((resolve, reject) => zipWriter.pendingEntries.push({ name, reader, options, resolve, reject }));
3552
+ return new Promise((resolve, reject) => pendingEntries.push({ name, reader, options, resolve, reject }));
3548
3553
  }
3549
3554
  }
3550
3555
 
@@ -3704,22 +3709,31 @@
3704
3709
  }
3705
3710
 
3706
3711
  async function getFileEntry(zipWriter, name, reader, options) {
3707
- const { files, writer } = zipWriter;
3712
+ const {
3713
+ files,
3714
+ writer
3715
+ } = zipWriter;
3716
+ const {
3717
+ keepOrder,
3718
+ dataDescriptor,
3719
+ zipCrypto,
3720
+ signal
3721
+ } = options;
3708
3722
  const previousFileEntry = Array.from(files.values()).pop();
3709
3723
  let fileEntry = {};
3710
3724
  let bufferedWrite;
3711
3725
  let releaseLockWriter;
3712
- let resolveLockCurrentFileEntry;
3713
- let writingBufferedData;
3726
+ let releaseLockCurrentFileEntry;
3727
+ let bufferedDataWritten;
3714
3728
  let fileWriter;
3715
3729
  files.set(name, fileEntry);
3716
3730
  try {
3717
3731
  let lockPreviousFileEntry;
3718
- if (options.keepOrder) {
3732
+ if (keepOrder) {
3719
3733
  lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
3734
+ requestLockCurrentFileEntry();
3720
3735
  }
3721
- fileEntry.lock = new Promise(resolve => resolveLockCurrentFileEntry = resolve);
3722
- if (options.bufferedWrite || zipWriter.lockWriter || !options.dataDescriptor) {
3736
+ if (options.bufferedWrite || zipWriter.lockWriter || !dataDescriptor) {
3723
3737
  fileWriter = new BlobWriter();
3724
3738
  fileWriter.init();
3725
3739
  bufferedWrite = true;
@@ -3736,14 +3750,14 @@
3736
3750
  if (bufferedWrite) {
3737
3751
  let blob = fileWriter.getData();
3738
3752
  await lockPreviousFileEntry;
3739
- await lockWriter();
3740
- writingBufferedData = true;
3753
+ await requestLockWriter();
3754
+ bufferedDataWritten = true;
3741
3755
  const { writable } = writer;
3742
- if (!options.dataDescriptor) {
3756
+ if (!dataDescriptor) {
3743
3757
  const headerLength = 26;
3744
3758
  const arrayBuffer = await sliceAsArrayBuffer(blob, 0, headerLength);
3745
3759
  const arrayBufferView = new DataView(arrayBuffer);
3746
- if (!fileEntry.encrypted || options.zipCrypto) {
3760
+ if (!fileEntry.encrypted || zipCrypto) {
3747
3761
  setUint32(arrayBufferView, 14, fileEntry.signature);
3748
3762
  }
3749
3763
  if (fileEntry.zip64) {
@@ -3756,8 +3770,8 @@
3756
3770
  await writeUint8Array(writable, new Uint8Array(arrayBuffer));
3757
3771
  blob = blob.slice(headerLength);
3758
3772
  }
3759
- await blob.stream().pipeTo(writable, { preventClose: true });
3760
- writingBufferedData = false;
3773
+ await blob.stream().pipeTo(writable, { preventClose: true, signal });
3774
+ bufferedDataWritten = false;
3761
3775
  }
3762
3776
  fileEntry.offset = zipWriter.offset;
3763
3777
  if (fileEntry.zip64) {
@@ -3769,23 +3783,30 @@
3769
3783
  zipWriter.offset += fileEntry.length;
3770
3784
  return fileEntry;
3771
3785
  } catch (error) {
3772
- if ((bufferedWrite && writingBufferedData) || (!bufferedWrite && fileEntry.dataWritten)) {
3786
+ if ((bufferedWrite && bufferedDataWritten) || (!bufferedWrite && fileEntry.dataWritten)) {
3773
3787
  error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
3774
3788
  zipWriter.offset += fileWriter.size;
3775
3789
  }
3776
3790
  files.delete(name);
3777
3791
  throw error;
3778
3792
  } finally {
3779
- resolveLockCurrentFileEntry();
3793
+ if (releaseLockCurrentFileEntry) {
3794
+ releaseLockCurrentFileEntry();
3795
+ }
3780
3796
  if (releaseLockWriter) {
3781
3797
  releaseLockWriter();
3782
3798
  }
3783
3799
  }
3784
3800
 
3785
- async function lockWriter() {
3786
- if (zipWriter.lockWriter) {
3787
- await zipWriter.lockWriter.then(() => delete zipWriter.lockWriter);
3788
- await lockWriter();
3801
+ function requestLockCurrentFileEntry() {
3802
+ fileEntry.lock = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
3803
+ }
3804
+
3805
+ async function requestLockWriter() {
3806
+ const { lockWriter } = zipWriter;
3807
+ if (lockWriter) {
3808
+ await lockWriter.then(() => delete zipWriter.lockWriter);
3809
+ return requestLockWriter();
3789
3810
  } else {
3790
3811
  zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
3791
3812
  }
@@ -3927,7 +3948,7 @@
3927
3948
  const rawLastModDate = dateArray[0];
3928
3949
  setUint32(headerView, 6, rawLastModDate);
3929
3950
  setUint16(headerView, 22, rawFilename.length);
3930
- const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + fileEntry.rawExtraField.length;
3951
+ const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + rawExtraField.length;
3931
3952
  setUint16(headerView, 24, extraFieldLength);
3932
3953
  const localHeaderArray = new Uint8Array(30 + rawFilename.length + extraFieldLength);
3933
3954
  const localHeaderView = getDataView(localHeaderArray);
@@ -3937,16 +3958,16 @@
3937
3958
  arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length);
3938
3959
  arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + rawFilename.length + rawExtraFieldAES.length);
3939
3960
  arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length);
3940
- arraySet(localHeaderArray, fileEntry.rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
3961
+ arraySet(localHeaderArray, rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
3941
3962
  let result;
3942
3963
  let compressedSize = 0;
3943
3964
  if (reader) {
3965
+ reader.chunkSize = getChunkSize(config);
3944
3966
  await writeUint8Array(writable, localHeaderArray);
3945
3967
  fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
3946
3968
  const size = () => reader.size;
3947
3969
  const readable = reader.readable;
3948
3970
  readable.size = size;
3949
- readable.chunkSize = getChunkSize(config);
3950
3971
  const workerOptions = {
3951
3972
  options: {
3952
3973
  codecType: CODEC_DEFLATE,
@@ -4016,7 +4037,15 @@
4016
4037
  await writeUint8Array(writable, dataDescriptorArray);
4017
4038
  }
4018
4039
  const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length;
4019
- Object.assign(fileEntry, { compressedSize, lastModDate, rawLastModDate, creationDate, lastAccessDate, encrypted, length });
4040
+ Object.assign(fileEntry, {
4041
+ compressedSize,
4042
+ lastModDate,
4043
+ rawLastModDate,
4044
+ creationDate,
4045
+ lastAccessDate,
4046
+ encrypted,
4047
+ length
4048
+ });
4020
4049
  return fileEntry;
4021
4050
  }
4022
4051