@zip.js/zip.js 2.5.20 → 2.5.21

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.
@@ -132,7 +132,7 @@ class ZipWriter {
132
132
  await Promise.all(Array.from(pendingAddFileCalls));
133
133
  }
134
134
  await closeFile(this, comment, options);
135
- if (!writer.preventClose) {
135
+ if (!writer.preventClose && !options.preventClose) {
136
136
  await writable.getWriter().close();
137
137
  }
138
138
  return writer.getData ? writer.getData() : writable;
@@ -298,8 +298,9 @@ async function getFileEntry(zipWriter, name, reader, options) {
298
298
  const previousFileEntry = Array.from(files.values()).pop();
299
299
  let fileEntry = {};
300
300
  let bufferedWrite;
301
- let resolveLockUnbufferedWrite;
301
+ let releaseLockWriter;
302
302
  let resolveLockCurrentFileEntry;
303
+ let writingBufferedData;
303
304
  files.set(name, fileEntry);
304
305
  try {
305
306
  let lockPreviousFileEntry;
@@ -308,12 +309,12 @@ async function getFileEntry(zipWriter, name, reader, options) {
308
309
  lockPreviousFileEntry = previousFileEntry && previousFileEntry.lock;
309
310
  }
310
311
  fileEntry.lock = new Promise(resolve => resolveLockCurrentFileEntry = resolve);
311
- if (options.bufferedWrite || zipWriter.lockWrite || !options.dataDescriptor) {
312
+ if (options.bufferedWrite || zipWriter.lockWriter || !options.dataDescriptor) {
312
313
  fileWriter = new BlobWriter();
313
314
  fileWriter.init();
314
315
  bufferedWrite = true;
315
316
  } else {
316
- zipWriter.lockWrite = Promise.resolve();
317
+ zipWriter.lockWriter = Promise.resolve();
317
318
  if (writer.init && !writer.initialized) {
318
319
  await writer.init();
319
320
  }
@@ -323,11 +324,10 @@ async function getFileEntry(zipWriter, name, reader, options) {
323
324
  files.set(name, fileEntry);
324
325
  fileEntry.filename = name;
325
326
  if (bufferedWrite) {
326
- let indexWrittenData = 0;
327
- const blob = fileWriter.getData();
327
+ let blob = fileWriter.getData();
328
328
  await lockPreviousFileEntry;
329
- await lockWriterAccess();
330
- fileEntry.writingBufferedData = true;
329
+ await lockWriter();
330
+ writingBufferedData = true;
331
331
  const { writable } = writer;
332
332
  if (!options.dataDescriptor) {
333
333
  const headerLength = 26;
@@ -344,10 +344,10 @@ async function getFileEntry(zipWriter, name, reader, options) {
344
344
  setUint32(arrayBufferView, 22, fileEntry.uncompressedSize);
345
345
  }
346
346
  await writeUint8Array(writable, new Uint8Array(arrayBuffer));
347
- indexWrittenData = headerLength;
347
+ blob = blob.slice(headerLength);
348
348
  }
349
- await writeBlob(writable, blob, indexWrittenData);
350
- delete fileEntry.writingBufferedData;
349
+ await blob.stream().pipeTo(writable, { preventClose: true });
350
+ writingBufferedData = false;
351
351
  }
352
352
  fileEntry.offset = zipWriter.offset;
353
353
  if (fileEntry.zip64) {
@@ -359,7 +359,7 @@ async function getFileEntry(zipWriter, name, reader, options) {
359
359
  zipWriter.offset += fileEntry.length;
360
360
  return fileEntry;
361
361
  } catch (error) {
362
- if ((bufferedWrite && fileEntry.writingBufferedData) || (!bufferedWrite && fileEntry.dataWritten)) {
362
+ if ((bufferedWrite && writingBufferedData) || (!bufferedWrite && fileEntry.dataWritten)) {
363
363
  error.corruptedEntry = zipWriter.hasCorruptedEntries = true;
364
364
  if (fileEntry.uncompressedSize) {
365
365
  zipWriter.offset += fileEntry.uncompressedSize;
@@ -369,17 +369,17 @@ async function getFileEntry(zipWriter, name, reader, options) {
369
369
  throw error;
370
370
  } finally {
371
371
  resolveLockCurrentFileEntry();
372
- if (resolveLockUnbufferedWrite) {
373
- resolveLockUnbufferedWrite();
372
+ if (releaseLockWriter) {
373
+ releaseLockWriter();
374
374
  }
375
375
  }
376
376
 
377
- async function lockWriterAccess() {
378
- if (zipWriter.lockWrite) {
379
- await zipWriter.lockWrite.then(() => delete zipWriter.lockWrite);
380
- await lockWriterAccess();
377
+ async function lockWriter() {
378
+ if (zipWriter.lockWriter) {
379
+ await zipWriter.lockWriter.then(() => delete zipWriter.lockWriter);
380
+ await lockWriter();
381
381
  } else {
382
- zipWriter.lockWrite = new Promise(resolve => resolveLockUnbufferedWrite = resolve);
382
+ zipWriter.lockWriter = new Promise(resolve => releaseLockWriter = resolve);
383
383
  }
384
384
  }
385
385
  }
@@ -638,13 +638,6 @@ async function closeFile(zipWriter, comment, options) {
638
638
  }
639
639
  const directoryArray = new Uint8Array(directoryDataLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH));
640
640
  const directoryView = getDataView(directoryArray);
641
- if (comment && comment.length) {
642
- if (comment.length <= MAX_16_BITS) {
643
- setUint16(directoryView, offset + 20, comment.length);
644
- } else {
645
- throw new Error(ERR_INVALID_COMMENT);
646
- }
647
- }
648
641
  for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
649
642
  const {
650
643
  rawFilename,
@@ -728,6 +721,13 @@ async function closeFile(zipWriter, comment, options) {
728
721
  setUint16(directoryView, offset + 10, filesLength);
729
722
  setUint32(directoryView, offset + 12, directoryDataLength);
730
723
  setUint32(directoryView, offset + 16, directoryOffset);
724
+ if (comment && comment.length) {
725
+ if (comment.length <= MAX_16_BITS) {
726
+ setUint16(directoryView, offset + 20, comment.length);
727
+ } else {
728
+ throw new Error(ERR_INVALID_COMMENT);
729
+ }
730
+ }
731
731
  const { writable } = zipWriter.writer;
732
732
  await writeUint8Array(writable, directoryArray);
733
733
  if (comment && comment.length) {
@@ -743,20 +743,6 @@ function sliceAsArrayBuffer(blob, start, end) {
743
743
  }
744
744
  }
745
745
 
746
- async function writeBlob(writable, blob, start = 0) {
747
- const blockSize = 512 * 1024 * 1024;
748
- await writeSlice();
749
-
750
- async function writeSlice() {
751
- if (start < blob.size) {
752
- const arrayBuffer = await sliceAsArrayBuffer(blob, start, start + blockSize);
753
- await writeUint8Array(writable, new Uint8Array(arrayBuffer));
754
- start += blockSize;
755
- await writeSlice();
756
- }
757
- }
758
- }
759
-
760
746
  async function writeUint8Array(writable, array) {
761
747
  const streamWriter = writable.getWriter();
762
748
  await streamWriter.ready;
package/lib/zip-fs.js CHANGED
@@ -30,9 +30,9 @@ import { configure } from "./core/configuration.js";
30
30
  import configureWebWorker from "./z-worker-inline.js";
31
31
  import { getMimeType } from "./core/util/default-mime-type.js";
32
32
  import initShimAsyncCodec from "./core/util/stream-codec-shim.js";
33
- import {
34
- terminateWorkers,
35
- ERR_ABORT
33
+ import {
34
+ terminateWorkers,
35
+ ERR_ABORT
36
36
  } from "./core/codec-pool.js";
37
37
 
38
38
  let baseURL;
@@ -31,9 +31,9 @@ import { configure } from "./core/configuration.js";
31
31
  import configureWebWorker from "./z-worker-inline.js";
32
32
  import { getMimeType } from "./core/util/default-mime-type.js";
33
33
  import initShimAsyncCodec from "./core/util/stream-codec-shim.js";
34
- import {
35
- terminateWorkers,
36
- ERR_ABORT
34
+ import {
35
+ terminateWorkers,
36
+ ERR_ABORT
37
37
  } from "./core/codec-pool.js";
38
38
 
39
39
  let baseURL;
package/lib/zip-full.js CHANGED
@@ -32,9 +32,9 @@ import { configure } from "./core/configuration.js";
32
32
  import configureWebWorker from "./z-worker-inline.js";
33
33
  import { getMimeType } from "./core/util/default-mime-type.js";
34
34
  import initShimAsyncCodec from "./core/util/stream-codec-shim.js";
35
- import {
36
- terminateWorkers,
37
- ERR_ABORT
35
+ import {
36
+ terminateWorkers,
37
+ ERR_ABORT
38
38
  } from "./core/codec-pool.js";
39
39
 
40
40
  let baseURL;
@@ -29,9 +29,9 @@
29
29
  import Deflate from "./core/streams/codecs/deflate.js";
30
30
  import { configure } from "./core/configuration.js";
31
31
  import { getMimeType } from "./core/util/default-mime-type.js";
32
- import {
33
- terminateWorkers,
34
- ERR_ABORT
32
+ import {
33
+ terminateWorkers,
34
+ ERR_ABORT
35
35
  } from "./core/codec-pool.js";
36
36
 
37
37
  configure({ Deflate });
@@ -29,9 +29,9 @@
29
29
  import { Deflate } from "./zip-fflate-shim.js";
30
30
  import { configure } from "./core/configuration.js";
31
31
  import { getMimeType } from "./core/util/default-mime-type.js";
32
- import {
33
- terminateWorkers,
34
- ERR_ABORT
32
+ import {
33
+ terminateWorkers,
34
+ ERR_ABORT
35
35
  } from "./core/codec-pool.js";
36
36
 
37
37
  configure({ Deflate });
@@ -29,9 +29,9 @@
29
29
  import { Inflate } from "./zip-fflate-shim.js";
30
30
  import { configure } from "./core/configuration.js";
31
31
  import { getMimeType } from "./core/util/default-mime-type.js";
32
- import {
33
- terminateWorkers,
34
- ERR_ABORT
32
+ import {
33
+ terminateWorkers,
34
+ ERR_ABORT
35
35
  } from "./core/codec-pool.js";
36
36
 
37
37
  configure({ Inflate });
@@ -29,9 +29,9 @@
29
29
  import { Deflate, Inflate } from "./zip-fflate-shim.js";
30
30
  import { configure } from "./core/configuration.js";
31
31
  import { getMimeType } from "./core/util/default-mime-type.js";
32
- import {
33
- terminateWorkers,
34
- ERR_ABORT
32
+ import {
33
+ terminateWorkers,
34
+ ERR_ABORT
35
35
  } from "./core/codec-pool.js";
36
36
 
37
37
  configure({ Deflate, Inflate });
@@ -29,9 +29,9 @@
29
29
  import Inflate from "./core/streams/codecs/inflate.js";
30
30
  import { configure } from "./core/configuration.js";
31
31
  import { getMimeType } from "./core/util/default-mime-type.js";
32
- import {
33
- terminateWorkers,
34
- ERR_ABORT
32
+ import {
33
+ terminateWorkers,
34
+ ERR_ABORT
35
35
  } from "./core/codec-pool.js";
36
36
 
37
37
  configure({ Inflate });
@@ -30,9 +30,9 @@ import Deflate from "./core/streams/codecs/deflate.js";
30
30
  import Inflate from "./core/streams/codecs/inflate.js";
31
31
  import { configure } from "./core/configuration.js";
32
32
  import { getMimeType } from "./core/util/default-mime-type.js";
33
- import {
34
- terminateWorkers,
35
- ERR_ABORT
33
+ import {
34
+ terminateWorkers,
35
+ ERR_ABORT
36
36
  } from "./core/codec-pool.js";
37
37
 
38
38
  configure({ Deflate, Inflate });
package/lib/zip.js CHANGED
@@ -30,9 +30,9 @@ import { configure } from "./core/configuration.js";
30
30
  import configureWebWorker from "./z-worker-inline.js";
31
31
  import { getMimeType } from "./core/util/default-mime-type.js";
32
32
  import initShimAsyncCodec from "./core/util/stream-codec-shim.js";
33
- import {
34
- terminateWorkers,
35
- ERR_ABORT
33
+ import {
34
+ terminateWorkers,
35
+ ERR_ABORT
36
36
  } from "./core/codec-pool.js";
37
37
 
38
38
  let baseURL;
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.20",
6
+ "version": "2.5.21",
7
7
  "type": "module",
8
8
  "keywords": [
9
9
  "zip",
@@ -3,9 +3,6 @@ import replace from "@rollup/plugin-replace";
3
3
  import { terser } from "rollup-plugin-terser";
4
4
  import fs from "fs";
5
5
 
6
- const GLOBALS = "const { Array, Object, String, BigInt, Math, Date, Map, URL, Error, Uint8Array, Uint16Array, Uint32Array, DataView, Blob, Promise, TextEncoder, TextDecoder, document, crypto, btoa, TransformStream, ReadableStream, WritableStream, CompressionStream, DecompressionStream, navigator } = globalThis;";
7
- const GLOBALS_WORKER = "const { Array, Object, Math, Error, Uint8Array, Uint16Array, Uint32Array, Int32Array, DataView, Promise, TextEncoder, crypto, postMessage, TransformStream, ReadableStream, WritableStream, CompressionStream, DecompressionStream } = globalThis;";
8
-
9
6
  const bundledTerserOptions = {
10
7
  compress: {
11
8
  unsafe: true,
@@ -33,6 +30,9 @@ const inlineTerserOptions = {
33
30
  }
34
31
  };
35
32
 
33
+ const GLOBALS = "const { Array, Object, String, BigInt, Math, Date, Map, URL, Error, Uint8Array, Uint16Array, Uint32Array, DataView, Blob, Promise, TextEncoder, TextDecoder, document, crypto, btoa, TransformStream, ReadableStream, WritableStream, CompressionStream, DecompressionStream, navigator } = globalThis;";
34
+ const GLOBALS_WORKER = "const { Array, Object, Math, Error, Uint8Array, Uint16Array, Uint32Array, Int32Array, DataView, Promise, TextEncoder, crypto, postMessage, TransformStream, ReadableStream, WritableStream, CompressionStream, DecompressionStream } = globalThis;";
35
+
36
36
  export default [{
37
37
  input: "lib/z-worker-fflate.js",
38
38
  output: [{
@@ -5,20 +5,24 @@ import * as zip from "../../index.js";
5
5
  const TEXT_CONTENT = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Typi non habent claritatem insitam; est usus legentis in iis qui facit eorum claritatem. Investigationes demonstraverunt lectores legere me lius quod ii legunt saepius. Claritas est etiam processus dynamicus, qui sequitur mutationem consuetudium lectorum. Mirum est notare quam littera gothica, quam nunc putamus parum claram, anteposuerit litterarum formas humanitatis per seacula quarta decima et quinta decima. Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum.";
6
6
  const FILENAME = "lorem.txt";
7
7
  const BLOB = new Blob([TEXT_CONTENT], { type: zip.getMimeType(FILENAME) });
8
+ const COMMENT = new Uint8Array([60, 61, 62]);
9
+ const PREPENDED_DATA = new Uint8Array([60, 61, 62]);
8
10
 
9
11
  export { test };
10
12
 
11
13
  async function test() {
12
14
  zip.configure({ chunkSize: 128, useWebWorkers: true });
13
15
  const blobWriter = new zip.BlobWriter("application/zip");
14
- await blobWriter.writeUint8Array(new Uint8Array([60, 61, 62]));
16
+ await blobWriter.writeUint8Array(PREPENDED_DATA);
15
17
  const zipWriter = new zip.ZipWriter(blobWriter);
16
18
  await zipWriter.add(FILENAME, new zip.BlobReader(BLOB));
17
- await zipWriter.close(new Uint8Array([60, 61, 62]));
18
- const zipReader = new zip.ZipReader(new zip.BlobReader(blobWriter.getData()));
19
+ await zipWriter.close(COMMENT);
20
+ const zipReader = new zip.ZipReader(new zip.BlobReader(blobWriter.getData()), { extractPrependedData: true });
19
21
  const entries = await zipReader.getEntries();
20
22
  const data = await entries[0].getData(new zip.BlobWriter(zip.getMimeType(entries[0].filename)));
21
23
  await zipReader.close();
24
+ const comment = Array.from(zipReader.comment).toString();
25
+ const prependedData = Array.from(zipReader.prependedData).toString();
22
26
  zip.terminateWorkers();
23
- return TEXT_CONTENT == (await data.text()) && entries[0].filename == FILENAME && entries[0].uncompressedSize == TEXT_CONTENT.length;
27
+ return TEXT_CONTENT == (await data.text()) && prependedData == Array.from(PREPENDED_DATA) && comment == Array.from(COMMENT);
24
28
  }