@zip.js/zip.js 2.5.22 → 2.5.25

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.
@@ -68,7 +68,9 @@ import {
68
68
  runWorker
69
69
  } from "./codec-pool.js";
70
70
  import encodeText from "./util/encode-text.js";
71
- import { BlobWriter } from "./io.js";
71
+ import {
72
+ BlobWriter
73
+ } from "./io.js";
72
74
  import Entry from "./zip-entry.js";
73
75
 
74
76
  const ERR_DUPLICATED_NAME = "File already exists";
@@ -103,17 +105,22 @@ class ZipWriter {
103
105
 
104
106
  async add(name = "", reader, options = {}) {
105
107
  const zipWriter = this;
106
- if (workers < zipWriter.config.maxWorkers) {
108
+ const {
109
+ pendingAddFileCalls,
110
+ pendingEntries,
111
+ config
112
+ } = zipWriter;
113
+ if (workers < config.maxWorkers) {
107
114
  workers++;
108
115
  let promiseAddFile;
109
116
  try {
110
117
  promiseAddFile = addFile(zipWriter, name, reader, options);
111
- this.pendingAddFileCalls.add(promiseAddFile);
118
+ pendingAddFileCalls.add(promiseAddFile);
112
119
  return await promiseAddFile;
113
120
  } finally {
114
- this.pendingAddFileCalls.delete(promiseAddFile);
121
+ pendingAddFileCalls.delete(promiseAddFile);
115
122
  workers--;
116
- const pendingEntry = zipWriter.pendingEntries.shift();
123
+ const pendingEntry = pendingEntries.shift();
117
124
  if (pendingEntry) {
118
125
  zipWriter.add(pendingEntry.name, pendingEntry.reader, pendingEntry.options)
119
126
  .then(pendingEntry.resolve)
@@ -121,7 +128,7 @@ class ZipWriter {
121
128
  }
122
129
  }
123
130
  } else {
124
- return new Promise((resolve, reject) => zipWriter.pendingEntries.push({ name, reader, options, resolve, reject }));
131
+ return new Promise((resolve, reject) => pendingEntries.push({ name, reader, options, resolve, reject }));
125
132
  }
126
133
  }
127
134
 
@@ -294,22 +301,31 @@ async function addFile(zipWriter, name, reader, options) {
294
301
  }
295
302
 
296
303
  async function getFileEntry(zipWriter, name, reader, options) {
297
- const { files, writer } = zipWriter;
304
+ const {
305
+ files,
306
+ writer
307
+ } = zipWriter;
308
+ const {
309
+ keepOrder,
310
+ dataDescriptor,
311
+ zipCrypto,
312
+ signal
313
+ } = options;
298
314
  const previousFileEntry = Array.from(files.values()).pop();
299
315
  let fileEntry = {};
300
316
  let bufferedWrite;
301
317
  let releaseLockWriter;
302
- let resolveLockCurrentFileEntry;
303
- let writingBufferedData;
318
+ let releaseLockCurrentFileEntry;
319
+ let bufferedDataWritten;
304
320
  let fileWriter;
305
321
  files.set(name, fileEntry);
306
322
  try {
307
323
  let lockPreviousFileEntry;
308
- if (options.keepOrder) {
324
+ if (keepOrder) {
309
325
  lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
326
+ requestLockCurrentFileEntry();
310
327
  }
311
- fileEntry.lock = new Promise(resolve => resolveLockCurrentFileEntry = resolve);
312
- if (options.bufferedWrite || zipWriter.lockWriter || !options.dataDescriptor) {
328
+ if (options.bufferedWrite || zipWriter.lockWriter || !dataDescriptor) {
313
329
  fileWriter = new BlobWriter();
314
330
  fileWriter.init();
315
331
  bufferedWrite = true;
@@ -326,14 +342,14 @@ async function getFileEntry(zipWriter, name, reader, options) {
326
342
  if (bufferedWrite) {
327
343
  let blob = fileWriter.getData();
328
344
  await lockPreviousFileEntry;
329
- await lockWriter();
330
- writingBufferedData = true;
345
+ await requestLockWriter();
346
+ bufferedDataWritten = true;
331
347
  const { writable } = writer;
332
- if (!options.dataDescriptor) {
348
+ if (!dataDescriptor) {
333
349
  const headerLength = 26;
334
350
  const arrayBuffer = await sliceAsArrayBuffer(blob, 0, headerLength);
335
351
  const arrayBufferView = new DataView(arrayBuffer);
336
- if (!fileEntry.encrypted || options.zipCrypto) {
352
+ if (!fileEntry.encrypted || zipCrypto) {
337
353
  setUint32(arrayBufferView, 14, fileEntry.signature);
338
354
  }
339
355
  if (fileEntry.zip64) {
@@ -346,8 +362,8 @@ async function getFileEntry(zipWriter, name, reader, options) {
346
362
  await writeUint8Array(writable, new Uint8Array(arrayBuffer));
347
363
  blob = blob.slice(headerLength);
348
364
  }
349
- await blob.stream().pipeTo(writable, { preventClose: true });
350
- writingBufferedData = false;
365
+ await blob.stream().pipeTo(writable, { preventClose: true, signal });
366
+ bufferedDataWritten = false;
351
367
  }
352
368
  fileEntry.offset = zipWriter.offset;
353
369
  if (fileEntry.zip64) {
@@ -359,23 +375,30 @@ async function getFileEntry(zipWriter, name, reader, options) {
359
375
  zipWriter.offset += fileEntry.length;
360
376
  return fileEntry;
361
377
  } catch (error) {
362
- if ((bufferedWrite && writingBufferedData) || (!bufferedWrite && fileEntry.dataWritten)) {
378
+ if ((bufferedWrite && bufferedDataWritten) || (!bufferedWrite && fileEntry.dataWritten)) {
363
379
  error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
364
380
  zipWriter.offset += fileWriter.size;
365
381
  }
366
382
  files.delete(name);
367
383
  throw error;
368
384
  } finally {
369
- resolveLockCurrentFileEntry();
385
+ if (releaseLockCurrentFileEntry) {
386
+ releaseLockCurrentFileEntry();
387
+ }
370
388
  if (releaseLockWriter) {
371
389
  releaseLockWriter();
372
390
  }
373
391
  }
374
392
 
375
- async function lockWriter() {
376
- if (zipWriter.lockWriter) {
377
- await zipWriter.lockWriter.then(() => delete zipWriter.lockWriter);
378
- await lockWriter();
393
+ function requestLockCurrentFileEntry() {
394
+ fileEntry.lock = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
395
+ }
396
+
397
+ async function requestLockWriter() {
398
+ const { lockWriter } = zipWriter;
399
+ if (lockWriter) {
400
+ await lockWriter.then(() => delete zipWriter.lockWriter);
401
+ return requestLockWriter();
379
402
  } else {
380
403
  zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
381
404
  }
@@ -517,7 +540,7 @@ async function createFileEntry(reader, pendingFileEntry, writable, config, optio
517
540
  const rawLastModDate = dateArray[0];
518
541
  setUint32(headerView, 6, rawLastModDate);
519
542
  setUint16(headerView, 22, rawFilename.length);
520
- const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + fileEntry.rawExtraField.length;
543
+ const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + rawExtraField.length;
521
544
  setUint16(headerView, 24, extraFieldLength);
522
545
  const localHeaderArray = new Uint8Array(30 + rawFilename.length + extraFieldLength);
523
546
  const localHeaderView = getDataView(localHeaderArray);
@@ -527,16 +550,16 @@ async function createFileEntry(reader, pendingFileEntry, writable, config, optio
527
550
  arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length);
528
551
  arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + rawFilename.length + rawExtraFieldAES.length);
529
552
  arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length);
530
- arraySet(localHeaderArray, fileEntry.rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
553
+ arraySet(localHeaderArray, rawExtraField, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length);
531
554
  let result;
532
555
  let compressedSize = 0;
533
556
  if (reader) {
557
+ reader.chunkSize = getChunkSize(config);
534
558
  await writeUint8Array(writable, localHeaderArray);
535
559
  fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
536
560
  const size = () => reader.size;
537
561
  const readable = reader.readable;
538
562
  readable.size = size;
539
- readable.chunkSize = getChunkSize(config);
540
563
  const workerOptions = {
541
564
  options: {
542
565
  codecType: CODEC_DEFLATE,
@@ -606,7 +629,15 @@ async function createFileEntry(reader, pendingFileEntry, writable, config, optio
606
629
  await writeUint8Array(writable, dataDescriptorArray);
607
630
  }
608
631
  const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length;
609
- Object.assign(fileEntry, { compressedSize, lastModDate, rawLastModDate, creationDate, lastAccessDate, encrypted, length });
632
+ Object.assign(fileEntry, {
633
+ compressedSize,
634
+ lastModDate,
635
+ rawLastModDate,
636
+ creationDate,
637
+ lastAccessDate,
638
+ encrypted,
639
+ length
640
+ });
610
641
  return fileEntry;
611
642
  }
612
643
 
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "A JavaScript library to zip and unzip files in the browser and Deno",
4
4
  "author": "Gildas Lormeau",
5
5
  "license": "BSD-3-Clause",
6
- "version": "2.5.22",
6
+ "version": "2.5.25",
7
7
  "type": "module",
8
8
  "keywords": [
9
9
  "zip",