@zip.js/zip.js 2.8.47 → 2.8.49

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.
Files changed (42) hide show
  1. package/deno.json +1 -1
  2. package/dist/zip-core-external.js +71 -36
  3. package/dist/zip-core-external.min.js +1 -1
  4. package/dist/zip-core.js +71 -36
  5. package/dist/zip-core.min.js +1 -1
  6. package/dist/zip-fs-core-external.js +72 -37
  7. package/dist/zip-fs-core-external.min.js +1 -1
  8. package/dist/zip-fs-core.js +55 -34
  9. package/dist/zip-fs-core.min.js +1 -1
  10. package/dist/zip-fs-external.js +72 -37
  11. package/dist/zip-fs-external.min.js +1 -1
  12. package/dist/zip-fs-native.js +75 -40
  13. package/dist/zip-fs-native.min.js +1 -1
  14. package/dist/zip-fs.js +73 -38
  15. package/dist/zip-fs.min.js +1 -1
  16. package/dist/zip-legacy.js +73 -38
  17. package/dist/zip-legacy.min.js +1 -1
  18. package/dist/zip-native.js +74 -39
  19. package/dist/zip-native.min.js +1 -1
  20. package/dist/zip-web-worker-native.js +1 -1
  21. package/dist/zip-web-worker.js +1 -1
  22. package/dist/zip.js +72 -37
  23. package/dist/zip.min.js +1 -1
  24. package/index-native.cjs +75 -40
  25. package/index-native.min.js +1 -1
  26. package/index.cjs +73 -38
  27. package/index.min.js +1 -1
  28. package/lib/core/codec-pool.js +1 -1
  29. package/lib/core/codec-worker.js +25 -9
  30. package/lib/core/io.js +3 -23
  31. package/lib/core/streams/zlib-js/zlib-streams.min.js +1 -1
  32. package/lib/core/util/blob-temp-stream.js +4 -2
  33. package/lib/core/util/compatible-streams.js +30 -2
  34. package/lib/core/util/opfs-temp-stream.js +8 -1
  35. package/lib/core/util/sync-access-handle-temp-stream.js +8 -1
  36. package/lib/core/web-worker-base.js +10 -2
  37. package/lib/core/web-worker-inline-native.js +1 -1
  38. package/lib/core/web-worker-inline-wasm.js +1 -1
  39. package/lib/core/zip-fs.js +2 -1
  40. package/lib/core/zip-reader.js +4 -4
  41. package/package.json +2 -1
  42. package/worker-message-property-names.js +1 -1
@@ -1901,6 +1901,8 @@ function getInt32(number) {
1901
1901
  */
1902
1902
 
1903
1903
 
1904
+ const HTTP_HEADER_CONTENT_TYPE = "Content-Type";
1905
+
1904
1906
  function toCompatibleReadable(readable) {
1905
1907
  if (readable instanceof ReadableStream) {
1906
1908
  return readable;
@@ -1921,6 +1923,29 @@ function toCompatibleReadable(readable) {
1921
1923
  });
1922
1924
  }
1923
1925
 
1926
+ function streamToBlob(readable, contentType) {
1927
+ readable = toCompatibleReadable(readable);
1928
+ if (responseSupportsGlobalReadable()) {
1929
+ const options = {};
1930
+ if (contentType) {
1931
+ options.headers = [[HTTP_HEADER_CONTENT_TYPE, contentType]];
1932
+ }
1933
+ return new Response(readable, options).blob();
1934
+ }
1935
+ const chunks = [];
1936
+ return readable
1937
+ .pipeTo(new WritableStream({
1938
+ write(chunk) {
1939
+ chunks.push(chunk);
1940
+ }
1941
+ }))
1942
+ .then(() => new Blob(chunks, contentType ? { type: contentType } : {}));
1943
+ }
1944
+
1945
+ function responseSupportsGlobalReadable() {
1946
+ return typeof Blob.prototype.stream != FUNCTION_TYPE || new Blob([]).stream() instanceof ReadableStream;
1947
+ }
1948
+
1924
1949
  function toCompatibleWritable(writable) {
1925
1950
  if (writable instanceof WritableStream) {
1926
1951
  return writable;
@@ -2685,14 +2710,16 @@ function createWebWorkerInterface(workerData, config) {
2685
2710
  } else {
2686
2711
  webWorkerSupported = false;
2687
2712
  }
2688
- const { reader } = workerData;
2689
- if (reader) {
2690
- reader.releaseLock();
2691
- }
2692
- workerData.reader = null;
2693
- workerData.writer = null;
2713
+ releaseWorkerStreams(workerData);
2694
2714
  return runWorker$1(workerData, config);
2695
2715
  }
2716
+ if (error && error.codecImportFailed) {
2717
+ if (workerData.reader) {
2718
+ releaseWorkerStreams(workerData);
2719
+ return runWorker$1(workerData, config);
2720
+ }
2721
+ workerData.onTaskFinished();
2722
+ }
2696
2723
  throw error;
2697
2724
  }
2698
2725
  }
@@ -2829,6 +2856,15 @@ function watchClosedStream(writableSource) {
2829
2856
  return { writable, closed, abortPipe: () => abortController.abort() };
2830
2857
  }
2831
2858
 
2859
+ function releaseWorkerStreams(workerData) {
2860
+ const { reader } = workerData;
2861
+ if (reader) {
2862
+ reader.releaseLock();
2863
+ }
2864
+ workerData.reader = null;
2865
+ workerData.writer = null;
2866
+ }
2867
+
2832
2868
  function terminateWorker$1(workerData) {
2833
2869
  const { worker } = workerData;
2834
2870
  if (worker) {
@@ -2896,7 +2932,7 @@ function getWebWorker(url, baseURI, workerData, isModuleType, useBlobURI = true)
2896
2932
  try {
2897
2933
  worker = new Worker(resolvedURI, resolvedOptions);
2898
2934
  } catch (error) {
2899
- if (!isModuleType) {
2935
+ if (isModuleType) {
2900
2936
  return getWebWorker(url, baseURI, workerData, false, useBlobURI);
2901
2937
  } else {
2902
2938
  throw error;
@@ -3014,12 +3050,15 @@ async function onMessage({ data }, workerData) {
3014
3050
  const stale = () => workerData.generation != generation;
3015
3051
  try {
3016
3052
  if (error) {
3017
- const { message, stack, code, name, outputSize, cause } = error;
3053
+ const { message, stack, code, name, outputSize, cause, codecImportFailed } = error;
3018
3054
  const responseError = new Error(message);
3019
3055
  Object.assign(responseError, { stack, code, name, outputSize });
3020
3056
  if (cause) {
3021
3057
  responseError.cause = Object.assign(new Error(cause.message), { name: cause.name });
3022
3058
  }
3059
+ if (codecImportFailed) {
3060
+ responseError.codecImportFailed = true;
3061
+ }
3023
3062
  close(responseError);
3024
3063
  } else {
3025
3064
  if (type == MESSAGE_PULL) {
@@ -3058,7 +3097,9 @@ async function onMessage({ data }, workerData) {
3058
3097
  if (writer) {
3059
3098
  writer.releaseLock();
3060
3099
  }
3061
- onTaskFinished();
3100
+ if (!(error && error.codecImportFailed)) {
3101
+ onTaskFinished();
3102
+ }
3062
3103
  }
3063
3104
  }
3064
3105
 
@@ -3108,7 +3149,7 @@ async function runWorker(stream, workerOptions) {
3108
3149
  }
3109
3150
  await ensureCodecStreams(format, options.codecURI);
3110
3151
  }
3111
- workerOptions.transferStreams = transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams);
3152
+ workerOptions.transferStreams = !format && (transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams));
3112
3153
  const streamCopy = !compressed && !checkCrc32 && !computeCrc32 && !encrypted;
3113
3154
  const workerSupported = format === UNDEFINED_VALUE || Boolean(options.codecURI);
3114
3155
  workerOptions.useWebWorkers = !streamCopy && workerSupported && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
@@ -3264,7 +3305,6 @@ const HTTP_HEADER_CONTENT_ENCODING = "Content-Encoding";
3264
3305
  const HTTP_HEADER_CONTENT_RANGE = "Content-Range";
3265
3306
  const HTTP_HEADER_ACCEPT_RANGES = "Accept-Ranges";
3266
3307
  const HTTP_HEADER_RANGE = "Range";
3267
- const HTTP_HEADER_CONTENT_TYPE = "Content-Type";
3268
3308
  const HTTP_HEADER_ETAG = "Etag";
3269
3309
  const HTTP_HEADER_LAST_MODIFIED = "Last-Modified";
3270
3310
  const HTTP_METHOD_HEAD = "HEAD";
@@ -3469,10 +3509,6 @@ class BlobReader extends Reader {
3469
3509
  }
3470
3510
  }
3471
3511
 
3472
- function responseSupportsGlobalReadable() {
3473
- return typeof Blob.prototype.stream != FUNCTION_TYPE || new Blob([]).stream() instanceof ReadableStream;
3474
- }
3475
-
3476
3512
  class BlobWriter extends Stream {
3477
3513
 
3478
3514
  constructor(contentType) {
@@ -3484,22 +3520,7 @@ class BlobWriter extends Stream {
3484
3520
  return transformStream.writable;
3485
3521
  }
3486
3522
  });
3487
- if (responseSupportsGlobalReadable()) {
3488
- const headers = [];
3489
- if (contentType) {
3490
- headers.push([HTTP_HEADER_CONTENT_TYPE, contentType]);
3491
- }
3492
- writer.blob = new Response(transformStream.readable, { headers }).blob();
3493
- } else {
3494
- const chunks = [];
3495
- writer.blob = transformStream.readable
3496
- .pipeTo(new WritableStream({
3497
- write(chunk) {
3498
- chunks.push(chunk);
3499
- }
3500
- }))
3501
- .then(() => new Blob(chunks, { type: contentType }));
3502
- }
3523
+ writer.blob = streamToBlob(transformStream.readable, contentType);
3503
3524
  writer.blob.catch(() => { });
3504
3525
  }
3505
3526
 
@@ -4573,7 +4594,7 @@ class ZipReader {
4573
4594
  const { config } = zipReader;
4574
4595
  await initStream(reader);
4575
4596
  if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
4576
- reader = new BlobReader(await new Response(reader.readable).blob());
4597
+ reader = new BlobReader(await streamToBlob(reader.readable));
4577
4598
  await initStream(reader);
4578
4599
  }
4579
4600
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
@@ -4842,7 +4863,7 @@ class ZipReader {
4842
4863
  entry.arrayBuffer = async options => {
4843
4864
  const writer = new TransformStream();
4844
4865
  const [arrayBuffer] = await Promise.all([
4845
- new Response(writer.readable).arrayBuffer(),
4866
+ streamToBlob(writer.readable).then(blob => blob.arrayBuffer()),
4846
4867
  fileEntry.getData(writer, entry, zipReader.readRanges, options)]);
4847
4868
  return arrayBuffer;
4848
4869
  };
@@ -7650,7 +7671,7 @@ function createOPFSTempStream(options = {}) {
7650
7671
 
7651
7672
  async function spillToFile() {
7652
7673
  const directoryHandle = await getTempDirectory();
7653
- fileName = crypto.randomUUID();
7674
+ fileName = getRandomFileName$1();
7654
7675
  fileHandle = await directoryHandle.getFileHandle(fileName, { create: true });
7655
7676
  fileWriter = (await fileHandle.createWritable()).getWriter();
7656
7677
  spilled = true;
@@ -7731,6 +7752,13 @@ function createOPFSTempStream(options = {}) {
7731
7752
  };
7732
7753
  }
7733
7754
 
7755
+ function getRandomFileName$1() {
7756
+ if (crypto.randomUUID) {
7757
+ return crypto.randomUUID();
7758
+ }
7759
+ return Array.from(crypto.getRandomValues(new Uint8Array(16)), byteValue => byteValue.toString(16).padStart(2, "0")).join("");
7760
+ }
7761
+
7734
7762
  /*
7735
7763
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
7736
7764
 
@@ -7774,7 +7802,7 @@ function createBlobTempStream(options = {}) {
7774
7802
 
7775
7803
  async function spillToBlob() {
7776
7804
  const transformStream = new TransformStream();
7777
- blobPromise = new Response(transformStream.readable).blob();
7805
+ blobPromise = streamToBlob(transformStream.readable);
7778
7806
  blobWriter = transformStream.writable.getWriter();
7779
7807
  spilled = true;
7780
7808
  for (const chunk of memoryChunks) {
@@ -7914,7 +7942,7 @@ function createSyncAccessHandleTempStream(options = {}) {
7914
7942
 
7915
7943
  async function spillToFile() {
7916
7944
  const directoryHandle = await getTempDirectory();
7917
- fileName = crypto.randomUUID();
7945
+ fileName = getRandomFileName();
7918
7946
  const fileHandle = await directoryHandle.getFileHandle(fileName, { create: true });
7919
7947
  accessHandle = await fileHandle.createSyncAccessHandle();
7920
7948
  spilled = true;
@@ -7994,6 +8022,13 @@ function createSyncAccessHandleTempStream(options = {}) {
7994
8022
  };
7995
8023
  }
7996
8024
 
8025
+ function getRandomFileName() {
8026
+ if (crypto.randomUUID) {
8027
+ return crypto.randomUUID();
8028
+ }
8029
+ return Array.from(crypto.getRandomValues(new Uint8Array(16)), byteValue => byteValue.toString(16).padStart(2, "0")).join("");
8030
+ }
8031
+
7997
8032
  /*
7998
8033
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
7999
8034
 
@@ -8544,7 +8579,7 @@ class ZipFileEntry extends ZipEntry {
8544
8579
  await Promise.all([initStream(reader), initStream(writer, uncompressedSize)]);
8545
8580
  const { readable } = reader;
8546
8581
  zipEntry.uncompressedSize = reader.size;
8547
- await readable.pipeTo(writer.writable);
8582
+ await toCompatibleReadable(readable).pipeTo(toCompatibleWritable(writer.writable));
8548
8583
  return writer.getData ? writer.getData() : writer.writable;
8549
8584
  }
8550
8585
  }