@zip.js/zip.js 2.6.13 → 2.6.16

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
@@ -2716,18 +2716,19 @@
2716
2716
 
2717
2717
  class Uint8ArrayWriter extends Writer {
2718
2718
 
2719
- constructor() {
2720
- super();
2721
- this.array = new Uint8Array();
2719
+ init(initSize = 0) {
2720
+ this.array = new Uint8Array(initSize);
2722
2721
  }
2723
2722
 
2724
2723
  writeUint8Array(array) {
2725
- super.writeUint8Array(array);
2726
2724
  const writer = this;
2727
- const previousArray = writer.array;
2728
- writer.array = new Uint8Array(previousArray.length + array.length);
2729
- writer.array.set(previousArray);
2730
- writer.array.set(array, previousArray.length);
2725
+ if (writer.size + array.length > writer.array.length) {
2726
+ const previousArray = writer.array;
2727
+ writer.array = new Uint8Array(previousArray.length + array.length);
2728
+ writer.array.set(previousArray);
2729
+ }
2730
+ writer.array.set(array, writer.size);
2731
+ super.writeUint8Array(array);
2731
2732
  }
2732
2733
 
2733
2734
  getData() {
@@ -2741,9 +2742,9 @@
2741
2742
  return protocol == "http:" || protocol == "https:";
2742
2743
  }
2743
2744
 
2744
- async function initStream(stream) {
2745
+ async function initStream(stream, initSize) {
2745
2746
  if (stream.init && !stream.initialized) {
2746
- await stream.init();
2747
+ await stream.init(initSize);
2747
2748
  }
2748
2749
  }
2749
2750
 
@@ -3162,6 +3163,7 @@
3162
3163
  bitFlag,
3163
3164
  signature,
3164
3165
  rawLastModDate,
3166
+ uncompressedSize,
3165
3167
  compressedSize
3166
3168
  } = zipEntry;
3167
3169
  const localDirectory = zipEntry.localDirectory = {};
@@ -3202,7 +3204,7 @@
3202
3204
  readable.size = size;
3203
3205
  const { writable } = writer;
3204
3206
  const signal = getOptionValue$1(zipEntry, options, "signal");
3205
- await initStream(writer);
3207
+ await initStream(writer, uncompressedSize);
3206
3208
  const { onstart, onprogress, onend } = options;
3207
3209
  const workerOptions = {
3208
3210
  options: {
@@ -3530,6 +3532,7 @@
3530
3532
  const EXTRAFIELD_LENGTH_ZIP64 = 24;
3531
3533
 
3532
3534
  let workers = 0;
3535
+ const pendingEntries = [];
3533
3536
 
3534
3537
  class ZipWriter {
3535
3538
 
@@ -3542,7 +3545,6 @@
3542
3545
  filenames: new Set(),
3543
3546
  offset: writer.size || 0,
3544
3547
  pendingCompressedSize: 0,
3545
- pendingEntries: [],
3546
3548
  pendingAddFileCalls: new Set()
3547
3549
  });
3548
3550
  }
@@ -3551,36 +3553,34 @@
3551
3553
  const zipWriter = this;
3552
3554
  const {
3553
3555
  pendingAddFileCalls,
3554
- pendingEntries,
3555
3556
  config
3556
3557
  } = zipWriter;
3557
3558
  if (workers < config.maxWorkers) {
3558
3559
  workers++;
3559
- let promiseAddFile;
3560
- try {
3561
- name = name.trim();
3562
- if (zipWriter.filenames.has(name)) {
3563
- throw new Error(ERR_DUPLICATED_NAME);
3564
- }
3565
- zipWriter.filenames.add(name);
3566
- promiseAddFile = addFile(zipWriter, name, reader, options);
3567
- pendingAddFileCalls.add(promiseAddFile);
3568
- return await promiseAddFile;
3569
- } catch (error) {
3570
- zipWriter.filenames.delete(name);
3571
- throw error;
3572
- } finally {
3573
- pendingAddFileCalls.delete(promiseAddFile);
3560
+ } else {
3561
+ await new Promise(resolve => pendingEntries.push(resolve));
3562
+ }
3563
+ let promiseAddFile;
3564
+ try {
3565
+ name = name.trim();
3566
+ if (zipWriter.filenames.has(name)) {
3567
+ throw new Error(ERR_DUPLICATED_NAME);
3568
+ }
3569
+ zipWriter.filenames.add(name);
3570
+ promiseAddFile = addFile(zipWriter, name, reader, options);
3571
+ pendingAddFileCalls.add(promiseAddFile);
3572
+ return await promiseAddFile;
3573
+ } catch (error) {
3574
+ zipWriter.filenames.delete(name);
3575
+ throw error;
3576
+ } finally {
3577
+ pendingAddFileCalls.delete(promiseAddFile);
3578
+ const pendingEntry = pendingEntries.shift();
3579
+ if (pendingEntry) {
3580
+ pendingEntry();
3581
+ } else {
3574
3582
  workers--;
3575
- const pendingEntry = pendingEntries.shift();
3576
- if (pendingEntry) {
3577
- zipWriter.add(pendingEntry.name, pendingEntry.reader, pendingEntry.options)
3578
- .then(pendingEntry.resolve)
3579
- .catch(pendingEntry.reject);
3580
- }
3581
3583
  }
3582
- } else {
3583
- return new Promise((resolve, reject) => pendingEntries.push({ name, reader, options, resolve, reject }));
3584
3584
  }
3585
3585
  }
3586
3586
 
@@ -3750,8 +3750,9 @@
3750
3750
  let bufferedWrite;
3751
3751
  let releaseLockWriter;
3752
3752
  let releaseLockCurrentFileEntry;
3753
- let bufferedDataWritten;
3753
+ let writingBufferedData;
3754
3754
  let fileWriter;
3755
+ let fileWriterSize;
3755
3756
  files.set(name, fileEntry);
3756
3757
  try {
3757
3758
  let lockPreviousFileEntry;
@@ -3768,6 +3769,7 @@
3768
3769
  await initStream(writer);
3769
3770
  fileWriter = writer;
3770
3771
  }
3772
+ fileWriterSize = fileWriter.size;
3771
3773
  fileEntry = await createFileEntry(reader, fileEntry, fileWriter.writable, zipWriter.config, options);
3772
3774
  files.set(name, fileEntry);
3773
3775
  fileEntry.filename = name;
@@ -3775,7 +3777,7 @@
3775
3777
  let blob = fileWriter.getData();
3776
3778
  await lockPreviousFileEntry;
3777
3779
  await requestLockWriter();
3778
- bufferedDataWritten = true;
3780
+ writingBufferedData = true;
3779
3781
  const { writable } = writer;
3780
3782
  if (!dataDescriptor) {
3781
3783
  const headerLength = 26;
@@ -3795,7 +3797,7 @@
3795
3797
  blob = blob.slice(headerLength);
3796
3798
  }
3797
3799
  await blob.stream().pipeTo(writable, { preventClose: true, signal });
3798
- bufferedDataWritten = false;
3800
+ writingBufferedData = false;
3799
3801
  }
3800
3802
  fileEntry.offset = zipWriter.offset;
3801
3803
  if (fileEntry.zip64) {
@@ -3807,9 +3809,12 @@
3807
3809
  zipWriter.offset += fileEntry.length;
3808
3810
  return fileEntry;
3809
3811
  } catch (error) {
3810
- if ((bufferedWrite && bufferedDataWritten) || (!bufferedWrite && fileEntry.dataWritten)) {
3811
- error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
3812
- zipWriter.offset += fileWriter.size;
3812
+ if ((bufferedWrite && writingBufferedData) || (!bufferedWrite && fileEntry.writingData)) {
3813
+ zipWriter.hasCorruptedEntries = true;
3814
+ if (error) {
3815
+ error.corruptedEntry = true;
3816
+ }
3817
+ zipWriter.offset += fileWriter.size - fileWriterSize;
3813
3818
  }
3814
3819
  files.delete(name);
3815
3820
  throw error;
@@ -3986,10 +3991,10 @@
3986
3991
  arraySet(localHeaderArray, rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
3987
3992
  let result;
3988
3993
  let compressedSize = 0;
3994
+ fileEntry.writingData = pendingFileEntry.writingData = true;
3989
3995
  if (reader) {
3990
3996
  reader.chunkSize = getChunkSize(config);
3991
3997
  await writeData(writable, localHeaderArray);
3992
- fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
3993
3998
  const size = () => reader.size;
3994
3999
  const readable = reader.readable;
3995
4000
  readable.size = size;
@@ -4016,7 +4021,6 @@
4016
4021
  compressedSize = result.size;
4017
4022
  } else {
4018
4023
  await writeData(writable, localHeaderArray);
4019
- fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
4020
4024
  }
4021
4025
  let dataDescriptorArray = new Uint8Array();
4022
4026
  let dataDescriptorView, dataDescriptorOffset = 0;
@@ -4069,7 +4073,8 @@
4069
4073
  creationDate,
4070
4074
  lastAccessDate,
4071
4075
  encrypted,
4072
- length
4076
+ length,
4077
+ writingData: false
4073
4078
  });
4074
4079
  return fileEntry;
4075
4080
  }
@@ -4351,7 +4356,7 @@
4351
4356
  return zipEntry.data;
4352
4357
  } else {
4353
4358
  const reader = zipEntry.reader = new zipEntry.Reader(zipEntry.data, options);
4354
- await Promise.all([initStream(reader), initStream(writer)]);
4359
+ await Promise.all([initStream(reader), initStream(writer, zipEntry.data.uncompressedSize)]);
4355
4360
  zipEntry.uncompressedSize = reader.size;
4356
4361
  const readable = reader.readable;
4357
4362
  readable.size = () => reader.size;