@zip.js/zip.js 2.5.23 → 2.5.26

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-fs.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));
@@ -2225,7 +2224,7 @@
2225
2224
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2226
2225
  */
2227
2226
 
2228
- /* global Blob, atob, btoa, XMLHttpRequest, URL, fetch, ReadableStream, WritableStream */
2227
+ /* global Blob, atob, btoa, XMLHttpRequest, URL, fetch, ReadableStream, WritableStream, FileReader */
2229
2228
 
2230
2229
  const ERR_HTTP_STATUS = "HTTP error ";
2231
2230
  const ERR_HTTP_RANGE = "HTTP Range not supported";
@@ -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()) {
@@ -2334,7 +2334,16 @@
2334
2334
 
2335
2335
  getData() {
2336
2336
  const writer = this;
2337
- return writer.blob.text();
2337
+ if (writer.blob.text && (writer.encoding === undefined || (writer.encoding && writer.encoding.toLowerCase() == "utf-8"))) {
2338
+ return writer.blob.text();
2339
+ } else {
2340
+ const reader = new FileReader();
2341
+ return new Promise((resolve, reject) => {
2342
+ reader.onload = event => resolve(event.target.result);
2343
+ reader.onerror = () => reject(reader.error);
2344
+ reader.readAsText(writer.blob, writer.encoding);
2345
+ });
2346
+ }
2338
2347
  }
2339
2348
  }
2340
2349
 
@@ -2621,7 +2630,7 @@
2621
2630
  if (response.status < 400) {
2622
2631
  return response;
2623
2632
  } else {
2624
- throw new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
2633
+ throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
2625
2634
  }
2626
2635
  }
2627
2636
 
@@ -2642,7 +2651,7 @@
2642
2651
  headers: new Map(headers)
2643
2652
  });
2644
2653
  } else {
2645
- reject(new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
2654
+ reject(request.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
2646
2655
  }
2647
2656
  }, false);
2648
2657
  request.addEventListener("error", event => reject(event.detail.error), false);
@@ -2979,6 +2988,7 @@
2979
2988
  if (!reader.initialized) {
2980
2989
  await reader.init();
2981
2990
  }
2991
+ reader.chunkSize = getChunkSize(config);
2982
2992
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
2983
2993
  throw new Error(ERR_BAD_FORMAT);
2984
2994
  }
@@ -3095,9 +3105,9 @@
3095
3105
  const extractPrependedData = getOptionValue$1(zipReader, options, "extractPrependedData");
3096
3106
  const extractAppendedData = getOptionValue$1(zipReader, options, "extractAppendedData");
3097
3107
  if (extractPrependedData) {
3098
- zipReader.prependedData = await readUint8Array(reader, 0, startOffset);
3108
+ zipReader.prependedData = startOffset > 0 ? await readUint8Array(reader, 0, startOffset) : new Uint8Array();
3099
3109
  }
3100
- zipReader.comment = await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength);
3110
+ zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : new Uint8Array();
3101
3111
  if (extractAppendedData) {
3102
3112
  zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) : new Uint8Array();
3103
3113
  }
@@ -3175,7 +3185,6 @@
3175
3185
  const readable = reader.readable;
3176
3186
  readable.offset = dataOffset;
3177
3187
  readable.size = size;
3178
- readable.chunkSize = getChunkSize(config);
3179
3188
  const { writable } = writer;
3180
3189
  const signal = getOptionValue$1(zipEntry, options, "signal");
3181
3190
  if (writer.init && !writer.initialized) {
@@ -3526,17 +3535,22 @@
3526
3535
 
3527
3536
  async add(name = "", reader, options = {}) {
3528
3537
  const zipWriter = this;
3529
- if (workers < zipWriter.config.maxWorkers) {
3538
+ const {
3539
+ pendingAddFileCalls,
3540
+ pendingEntries,
3541
+ config
3542
+ } = zipWriter;
3543
+ if (workers < config.maxWorkers) {
3530
3544
  workers++;
3531
3545
  let promiseAddFile;
3532
3546
  try {
3533
3547
  promiseAddFile = addFile(zipWriter, name, reader, options);
3534
- this.pendingAddFileCalls.add(promiseAddFile);
3548
+ pendingAddFileCalls.add(promiseAddFile);
3535
3549
  return await promiseAddFile;
3536
3550
  } finally {
3537
- this.pendingAddFileCalls.delete(promiseAddFile);
3551
+ pendingAddFileCalls.delete(promiseAddFile);
3538
3552
  workers--;
3539
- const pendingEntry = zipWriter.pendingEntries.shift();
3553
+ const pendingEntry = pendingEntries.shift();
3540
3554
  if (pendingEntry) {
3541
3555
  zipWriter.add(pendingEntry.name, pendingEntry.reader, pendingEntry.options)
3542
3556
  .then(pendingEntry.resolve)
@@ -3544,7 +3558,7 @@
3544
3558
  }
3545
3559
  }
3546
3560
  } else {
3547
- return new Promise((resolve, reject) => zipWriter.pendingEntries.push({ name, reader, options, resolve, reject }));
3561
+ return new Promise((resolve, reject) => pendingEntries.push({ name, reader, options, resolve, reject }));
3548
3562
  }
3549
3563
  }
3550
3564
 
@@ -3704,22 +3718,31 @@
3704
3718
  }
3705
3719
 
3706
3720
  async function getFileEntry(zipWriter, name, reader, options) {
3707
- const { files, writer } = zipWriter;
3721
+ const {
3722
+ files,
3723
+ writer
3724
+ } = zipWriter;
3725
+ const {
3726
+ keepOrder,
3727
+ dataDescriptor,
3728
+ zipCrypto,
3729
+ signal
3730
+ } = options;
3708
3731
  const previousFileEntry = Array.from(files.values()).pop();
3709
3732
  let fileEntry = {};
3710
3733
  let bufferedWrite;
3711
3734
  let releaseLockWriter;
3712
- let resolveLockCurrentFileEntry;
3713
- let writingBufferedData;
3735
+ let releaseLockCurrentFileEntry;
3736
+ let bufferedDataWritten;
3714
3737
  let fileWriter;
3715
3738
  files.set(name, fileEntry);
3716
3739
  try {
3717
3740
  let lockPreviousFileEntry;
3718
- if (options.keepOrder) {
3741
+ if (keepOrder) {
3719
3742
  lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
3743
+ requestLockCurrentFileEntry();
3720
3744
  }
3721
- fileEntry.lock = new Promise(resolve => resolveLockCurrentFileEntry = resolve);
3722
- if (options.bufferedWrite || zipWriter.lockWriter || !options.dataDescriptor) {
3745
+ if (options.bufferedWrite || zipWriter.lockWriter || !dataDescriptor) {
3723
3746
  fileWriter = new BlobWriter();
3724
3747
  fileWriter.init();
3725
3748
  bufferedWrite = true;
@@ -3736,14 +3759,14 @@
3736
3759
  if (bufferedWrite) {
3737
3760
  let blob = fileWriter.getData();
3738
3761
  await lockPreviousFileEntry;
3739
- await lockWriter();
3740
- writingBufferedData = true;
3762
+ await requestLockWriter();
3763
+ bufferedDataWritten = true;
3741
3764
  const { writable } = writer;
3742
- if (!options.dataDescriptor) {
3765
+ if (!dataDescriptor) {
3743
3766
  const headerLength = 26;
3744
3767
  const arrayBuffer = await sliceAsArrayBuffer(blob, 0, headerLength);
3745
3768
  const arrayBufferView = new DataView(arrayBuffer);
3746
- if (!fileEntry.encrypted || options.zipCrypto) {
3769
+ if (!fileEntry.encrypted || zipCrypto) {
3747
3770
  setUint32(arrayBufferView, 14, fileEntry.signature);
3748
3771
  }
3749
3772
  if (fileEntry.zip64) {
@@ -3756,8 +3779,8 @@
3756
3779
  await writeUint8Array(writable, new Uint8Array(arrayBuffer));
3757
3780
  blob = blob.slice(headerLength);
3758
3781
  }
3759
- await blob.stream().pipeTo(writable, { preventClose: true });
3760
- writingBufferedData = false;
3782
+ await blob.stream().pipeTo(writable, { preventClose: true, signal });
3783
+ bufferedDataWritten = false;
3761
3784
  }
3762
3785
  fileEntry.offset = zipWriter.offset;
3763
3786
  if (fileEntry.zip64) {
@@ -3769,23 +3792,30 @@
3769
3792
  zipWriter.offset += fileEntry.length;
3770
3793
  return fileEntry;
3771
3794
  } catch (error) {
3772
- if ((bufferedWrite && writingBufferedData) || (!bufferedWrite && fileEntry.dataWritten)) {
3795
+ if ((bufferedWrite && bufferedDataWritten) || (!bufferedWrite && fileEntry.dataWritten)) {
3773
3796
  error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
3774
3797
  zipWriter.offset += fileWriter.size;
3775
3798
  }
3776
3799
  files.delete(name);
3777
3800
  throw error;
3778
3801
  } finally {
3779
- resolveLockCurrentFileEntry();
3802
+ if (releaseLockCurrentFileEntry) {
3803
+ releaseLockCurrentFileEntry();
3804
+ }
3780
3805
  if (releaseLockWriter) {
3781
3806
  releaseLockWriter();
3782
3807
  }
3783
3808
  }
3784
3809
 
3785
- async function lockWriter() {
3786
- if (zipWriter.lockWriter) {
3787
- await zipWriter.lockWriter.then(() => delete zipWriter.lockWriter);
3788
- await lockWriter();
3810
+ function requestLockCurrentFileEntry() {
3811
+ fileEntry.lock = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
3812
+ }
3813
+
3814
+ async function requestLockWriter() {
3815
+ const { lockWriter } = zipWriter;
3816
+ if (lockWriter) {
3817
+ await lockWriter.then(() => delete zipWriter.lockWriter);
3818
+ return requestLockWriter();
3789
3819
  } else {
3790
3820
  zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
3791
3821
  }
@@ -3927,7 +3957,7 @@
3927
3957
  const rawLastModDate = dateArray[0];
3928
3958
  setUint32(headerView, 6, rawLastModDate);
3929
3959
  setUint16(headerView, 22, rawFilename.length);
3930
- const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + fileEntry.rawExtraField.length;
3960
+ const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + rawExtraField.length;
3931
3961
  setUint16(headerView, 24, extraFieldLength);
3932
3962
  const localHeaderArray = new Uint8Array(30 + rawFilename.length + extraFieldLength);
3933
3963
  const localHeaderView = getDataView(localHeaderArray);
@@ -3937,16 +3967,16 @@
3937
3967
  arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length);
3938
3968
  arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + rawFilename.length + rawExtraFieldAES.length);
3939
3969
  arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length);
3940
- arraySet(localHeaderArray, fileEntry.rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
3970
+ arraySet(localHeaderArray, rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
3941
3971
  let result;
3942
3972
  let compressedSize = 0;
3943
3973
  if (reader) {
3974
+ reader.chunkSize = getChunkSize(config);
3944
3975
  await writeUint8Array(writable, localHeaderArray);
3945
3976
  fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
3946
3977
  const size = () => reader.size;
3947
3978
  const readable = reader.readable;
3948
3979
  readable.size = size;
3949
- readable.chunkSize = getChunkSize(config);
3950
3980
  const workerOptions = {
3951
3981
  options: {
3952
3982
  codecType: CODEC_DEFLATE,
@@ -4016,7 +4046,15 @@
4016
4046
  await writeUint8Array(writable, dataDescriptorArray);
4017
4047
  }
4018
4048
  const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length;
4019
- Object.assign(fileEntry, { compressedSize, lastModDate, rawLastModDate, creationDate, lastAccessDate, encrypted, length });
4049
+ Object.assign(fileEntry, {
4050
+ compressedSize,
4051
+ lastModDate,
4052
+ rawLastModDate,
4053
+ creationDate,
4054
+ lastAccessDate,
4055
+ encrypted,
4056
+ length
4057
+ });
4020
4058
  return fileEntry;
4021
4059
  }
4022
4060