@zip.js/zip.js 2.5.21 → 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.
@@ -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;
320
+ let fileWriter;
304
321
  files.set(name, fileEntry);
305
322
  try {
306
323
  let lockPreviousFileEntry;
307
- let fileWriter;
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;
@@ -320,20 +336,20 @@ async function getFileEntry(zipWriter, name, reader, options) {
320
336
  }
321
337
  fileWriter = writer;
322
338
  }
323
- fileEntry = await createFileEntry(reader, fileWriter.writable, zipWriter.config, options);
339
+ fileEntry = await createFileEntry(reader, fileEntry, fileWriter.writable, zipWriter.config, options);
324
340
  files.set(name, fileEntry);
325
341
  fileEntry.filename = name;
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,32 +375,37 @@ 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
- if (fileEntry.uncompressedSize) {
365
- zipWriter.offset += fileEntry.uncompressedSize;
366
- }
380
+ zipWriter.offset += fileWriter.size;
367
381
  }
368
382
  files.delete(name);
369
383
  throw error;
370
384
  } finally {
371
- resolveLockCurrentFileEntry();
385
+ if (releaseLockCurrentFileEntry) {
386
+ releaseLockCurrentFileEntry();
387
+ }
372
388
  if (releaseLockWriter) {
373
389
  releaseLockWriter();
374
390
  }
375
391
  }
376
392
 
377
- async function lockWriter() {
378
- if (zipWriter.lockWriter) {
379
- await zipWriter.lockWriter.then(() => delete zipWriter.lockWriter);
380
- 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();
381
402
  } else {
382
403
  zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
383
404
  }
384
405
  }
385
406
  }
386
407
 
387
- async function createFileEntry(reader, writable, config, options) {
408
+ async function createFileEntry(reader, pendingFileEntry, writable, config, options) {
388
409
  const {
389
410
  rawFilename,
390
411
  lastAccessDate,
@@ -519,7 +540,7 @@ async function createFileEntry(reader, writable, config, options) {
519
540
  const rawLastModDate = dateArray[0];
520
541
  setUint32(headerView, 6, rawLastModDate);
521
542
  setUint16(headerView, 22, rawFilename.length);
522
- const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + fileEntry.rawExtraField.length;
543
+ const extraFieldLength = rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length + rawExtraFieldNTFS.length + rawExtraField.length;
523
544
  setUint16(headerView, 24, extraFieldLength);
524
545
  const localHeaderArray = new Uint8Array(30 + rawFilename.length + extraFieldLength);
525
546
  const localHeaderView = getDataView(localHeaderArray);
@@ -529,16 +550,16 @@ async function createFileEntry(reader, writable, config, options) {
529
550
  arraySet(localHeaderArray, rawExtraFieldAES, 30 + rawFilename.length);
530
551
  arraySet(localHeaderArray, rawExtraFieldExtendedTimestamp, 30 + rawFilename.length + rawExtraFieldAES.length);
531
552
  arraySet(localHeaderArray, rawExtraFieldNTFS, 30 + rawFilename.length + rawExtraFieldAES.length + rawExtraFieldExtendedTimestamp.length);
532
- 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);
533
554
  let result;
534
555
  let compressedSize = 0;
535
556
  if (reader) {
557
+ reader.chunkSize = getChunkSize(config);
536
558
  await writeUint8Array(writable, localHeaderArray);
537
- fileEntry.dataWritten = true;
559
+ fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
538
560
  const size = () => reader.size;
539
561
  const readable = reader.readable;
540
562
  readable.size = size;
541
- readable.chunkSize = getChunkSize(config);
542
563
  const workerOptions = {
543
564
  options: {
544
565
  codecType: CODEC_DEFLATE,
@@ -562,7 +583,7 @@ async function createFileEntry(reader, writable, config, options) {
562
583
  compressedSize = result.length;
563
584
  } else {
564
585
  await writeUint8Array(writable, localHeaderArray);
565
- fileEntry.dataWritten = true;
586
+ fileEntry.dataWritten = pendingFileEntry.dataWritten = true;
566
587
  }
567
588
  let dataDescriptorArray = new Uint8Array();
568
589
  let dataDescriptorView, dataDescriptorOffset = 0;
@@ -608,7 +629,15 @@ async function createFileEntry(reader, writable, config, options) {
608
629
  await writeUint8Array(writable, dataDescriptorArray);
609
630
  }
610
631
  const length = localHeaderArray.length + compressedSize + dataDescriptorArray.length;
611
- 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
+ });
612
641
  return fileEntry;
613
642
  }
614
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.21",
6
+ "version": "2.5.24",
7
7
  "type": "module",
8
8
  "keywords": [
9
9
  "zip",