@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-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));
@@ -6459,7 +6458,7 @@
6459
6458
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
6460
6459
  */
6461
6460
 
6462
- /* global Blob, atob, btoa, XMLHttpRequest, URL, fetch, ReadableStream, WritableStream */
6461
+ /* global Blob, atob, btoa, XMLHttpRequest, URL, fetch, ReadableStream, WritableStream, FileReader */
6463
6462
 
6464
6463
  const ERR_HTTP_STATUS = "HTTP error ";
6465
6464
  const ERR_HTTP_RANGE = "HTTP Range not supported";
@@ -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()) {
@@ -6568,7 +6568,16 @@
6568
6568
 
6569
6569
  getData() {
6570
6570
  const writer = this;
6571
- return writer.blob.text();
6571
+ if (writer.blob.text && (writer.encoding === undefined || (writer.encoding && writer.encoding.toLowerCase() == "utf-8"))) {
6572
+ return writer.blob.text();
6573
+ } else {
6574
+ const reader = new FileReader();
6575
+ return new Promise((resolve, reject) => {
6576
+ reader.onload = event => resolve(event.target.result);
6577
+ reader.onerror = () => reject(reader.error);
6578
+ reader.readAsText(writer.blob, writer.encoding);
6579
+ });
6580
+ }
6572
6581
  }
6573
6582
  }
6574
6583
 
@@ -6855,7 +6864,7 @@
6855
6864
  if (response.status < 400) {
6856
6865
  return response;
6857
6866
  } else {
6858
- throw new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
6867
+ throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
6859
6868
  }
6860
6869
  }
6861
6870
 
@@ -6876,7 +6885,7 @@
6876
6885
  headers: new Map(headers)
6877
6886
  });
6878
6887
  } else {
6879
- reject(new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
6888
+ reject(request.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (request.statusText || request.status)));
6880
6889
  }
6881
6890
  }, false);
6882
6891
  request.addEventListener("error", event => reject(event.detail.error), false);
@@ -7213,6 +7222,7 @@
7213
7222
  if (!reader.initialized) {
7214
7223
  await reader.init();
7215
7224
  }
7225
+ reader.chunkSize = getChunkSize(config);
7216
7226
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
7217
7227
  throw new Error(ERR_BAD_FORMAT);
7218
7228
  }
@@ -7329,9 +7339,9 @@
7329
7339
  const extractPrependedData = getOptionValue$1(zipReader, options, "extractPrependedData");
7330
7340
  const extractAppendedData = getOptionValue$1(zipReader, options, "extractAppendedData");
7331
7341
  if (extractPrependedData) {
7332
- zipReader.prependedData = await readUint8Array(reader, 0, startOffset);
7342
+ zipReader.prependedData = startOffset > 0 ? await readUint8Array(reader, 0, startOffset) : new Uint8Array();
7333
7343
  }
7334
- zipReader.comment = await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength);
7344
+ zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : new Uint8Array();
7335
7345
  if (extractAppendedData) {
7336
7346
  zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) : new Uint8Array();
7337
7347
  }
@@ -7409,7 +7419,6 @@
7409
7419
  const readable = reader.readable;
7410
7420
  readable.offset = dataOffset;
7411
7421
  readable.size = size;
7412
- readable.chunkSize = getChunkSize(config);
7413
7422
  const { writable } = writer;
7414
7423
  const signal = getOptionValue$1(zipEntry, options, "signal");
7415
7424
  if (writer.init && !writer.initialized) {
@@ -7760,17 +7769,22 @@
7760
7769
 
7761
7770
  async add(name = "", reader, options = {}) {
7762
7771
  const zipWriter = this;
7763
- if (workers < zipWriter.config.maxWorkers) {
7772
+ const {
7773
+ pendingAddFileCalls,
7774
+ pendingEntries,
7775
+ config
7776
+ } = zipWriter;
7777
+ if (workers < config.maxWorkers) {
7764
7778
  workers++;
7765
7779
  let promiseAddFile;
7766
7780
  try {
7767
7781
  promiseAddFile = addFile(zipWriter, name, reader, options);
7768
- this.pendingAddFileCalls.add(promiseAddFile);
7782
+ pendingAddFileCalls.add(promiseAddFile);
7769
7783
  return await promiseAddFile;
7770
7784
  } finally {
7771
- this.pendingAddFileCalls.delete(promiseAddFile);
7785
+ pendingAddFileCalls.delete(promiseAddFile);
7772
7786
  workers--;
7773
- const pendingEntry = zipWriter.pendingEntries.shift();
7787
+ const pendingEntry = pendingEntries.shift();
7774
7788
  if (pendingEntry) {
7775
7789
  zipWriter.add(pendingEntry.name, pendingEntry.reader, pendingEntry.options)
7776
7790
  .then(pendingEntry.resolve)
@@ -7778,7 +7792,7 @@
7778
7792
  }
7779
7793
  }
7780
7794
  } else {
7781
- return new Promise((resolve, reject) => zipWriter.pendingEntries.push({ name, reader, options, resolve, reject }));
7795
+ return new Promise((resolve, reject) => pendingEntries.push({ name, reader, options, resolve, reject }));
7782
7796
  }
7783
7797
  }
7784
7798
 
@@ -7938,22 +7952,31 @@
7938
7952
  }
7939
7953
 
7940
7954
  async function getFileEntry(zipWriter, name, reader, options) {
7941
- const { files, writer } = zipWriter;
7955
+ const {
7956
+ files,
7957
+ writer
7958
+ } = zipWriter;
7959
+ const {
7960
+ keepOrder,
7961
+ dataDescriptor,
7962
+ zipCrypto,
7963
+ signal
7964
+ } = options;
7942
7965
  const previousFileEntry = Array.from(files.values()).pop();
7943
7966
  let fileEntry = {};
7944
7967
  let bufferedWrite;
7945
7968
  let releaseLockWriter;
7946
- let resolveLockCurrentFileEntry;
7947
- let writingBufferedData;
7969
+ let releaseLockCurrentFileEntry;
7970
+ let bufferedDataWritten;
7948
7971
  let fileWriter;
7949
7972
  files.set(name, fileEntry);
7950
7973
  try {
7951
7974
  let lockPreviousFileEntry;
7952
- if (options.keepOrder) {
7975
+ if (keepOrder) {
7953
7976
  lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
7977
+ requestLockCurrentFileEntry();
7954
7978
  }
7955
- fileEntry.lock = new Promise(resolve => resolveLockCurrentFileEntry = resolve);
7956
- if (options.bufferedWrite || zipWriter.lockWriter || !options.dataDescriptor) {
7979
+ if (options.bufferedWrite || zipWriter.lockWriter || !dataDescriptor) {
7957
7980
  fileWriter = new BlobWriter();
7958
7981
  fileWriter.init();
7959
7982
  bufferedWrite = true;
@@ -7970,14 +7993,14 @@
7970
7993
  if (bufferedWrite) {
7971
7994
  let blob = fileWriter.getData();
7972
7995
  await lockPreviousFileEntry;
7973
- await lockWriter();
7974
- writingBufferedData = true;
7996
+ await requestLockWriter();
7997
+ bufferedDataWritten = true;
7975
7998
  const { writable } = writer;
7976
- if (!options.dataDescriptor) {
7999
+ if (!dataDescriptor) {
7977
8000
  const headerLength = 26;
7978
8001
  const arrayBuffer = await sliceAsArrayBuffer(blob, 0, headerLength);
7979
8002
  const arrayBufferView = new DataView(arrayBuffer);
7980
- if (!fileEntry.encrypted || options.zipCrypto) {
8003
+ if (!fileEntry.encrypted || zipCrypto) {
7981
8004
  setUint32(arrayBufferView, 14, fileEntry.signature);
7982
8005
  }
7983
8006
  if (fileEntry.zip64) {
@@ -7990,8 +8013,8 @@
7990
8013
  await writeUint8Array(writable, new Uint8Array(arrayBuffer));
7991
8014
  blob = blob.slice(headerLength);
7992
8015
  }
7993
- await blob.stream().pipeTo(writable, { preventClose: true });
7994
- writingBufferedData = false;
8016
+ await blob.stream().pipeTo(writable, { preventClose: true, signal });
8017
+ bufferedDataWritten = false;
7995
8018
  }
7996
8019
  fileEntry.offset = zipWriter.offset;
7997
8020
  if (fileEntry.zip64) {
@@ -8003,23 +8026,30 @@
8003
8026
  zipWriter.offset += fileEntry.length;
8004
8027
  return fileEntry;
8005
8028
  } catch (error) {
8006
- if ((bufferedWrite && writingBufferedData) || (!bufferedWrite && fileEntry.dataWritten)) {
8029
+ if ((bufferedWrite && bufferedDataWritten) || (!bufferedWrite && fileEntry.dataWritten)) {
8007
8030
  error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
8008
8031
  zipWriter.offset += fileWriter.size;
8009
8032
  }
8010
8033
  files.delete(name);
8011
8034
  throw error;
8012
8035
  } finally {
8013
- resolveLockCurrentFileEntry();
8036
+ if (releaseLockCurrentFileEntry) {
8037
+ releaseLockCurrentFileEntry();
8038
+ }
8014
8039
  if (releaseLockWriter) {
8015
8040
  releaseLockWriter();
8016
8041
  }
8017
8042
  }
8018
8043
 
8019
- async function lockWriter() {
8020
- if (zipWriter.lockWriter) {
8021
- await zipWriter.lockWriter.then(() => delete zipWriter.lockWriter);
8022
- await lockWriter();
8044
+ function requestLockCurrentFileEntry() {
8045
+ fileEntry.lock = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
8046
+ }
8047
+
8048
+ async function requestLockWriter() {
8049
+ const { lockWriter } = zipWriter;
8050
+ if (lockWriter) {
8051
+ await lockWriter.then(() => delete zipWriter.lockWriter);
8052
+ return requestLockWriter();
8023
8053
  } else {
8024
8054
  zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
8025
8055
  }
@@ -8161,7 +8191,7 @@
8161
8191
  const rawLastModDate = dateArray[0];
8162
8192
  setUint32(headerView, 6, rawLastModDate);
8163
8193
  setUint16(headerView, 22, rawFilename.length);
8164
- const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + fileEntry.rawExtraField.length;
8194
+ const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + rawExtraField.length;
8165
8195
  setUint16(headerView, 24, extraFieldLength);
8166
8196
  const localHeaderArray = new Uint8Array(30 + rawFilename.length + extraFieldLength);
8167
8197
  const localHeaderView = getDataView(localHeaderArray);
@@ -8171,16 +8201,16 @@
8171
8201
  arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length);
8172
8202
  arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + rawFilename.length + rawExtraFieldAES.length);
8173
8203
  arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length);
8174
- arraySet(localHeaderArray, fileEntry.rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
8204
+ arraySet(localHeaderArray, rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
8175
8205
  let result;
8176
8206
  let compressedSize = 0;
8177
8207
  if (reader) {
8208
+ reader.chunkSize = getChunkSize(config);
8178
8209
  await writeUint8Array(writable, localHeaderArray);
8179
8210
  fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
8180
8211
  const size = () => reader.size;
8181
8212
  const readable = reader.readable;
8182
8213
  readable.size = size;
8183
- readable.chunkSize = getChunkSize(config);
8184
8214
  const workerOptions = {
8185
8215
  options: {
8186
8216
  codecType: CODEC_DEFLATE,
@@ -8250,7 +8280,15 @@
8250
8280
  await writeUint8Array(writable, dataDescriptorArray);
8251
8281
  }
8252
8282
  const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length;
8253
- Object.assign(fileEntry, { compressedSize, lastModDate, rawLastModDate, creationDate, lastAccessDate, encrypted, length });
8283
+ Object.assign(fileEntry, {
8284
+ compressedSize,
8285
+ lastModDate,
8286
+ rawLastModDate,
8287
+ creationDate,
8288
+ lastAccessDate,
8289
+ encrypted,
8290
+ length
8291
+ });
8254
8292
  return fileEntry;
8255
8293
  }
8256
8294