@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
package/dist/zip-core.js CHANGED
@@ -1874,6 +1874,8 @@
1874
1874
  */
1875
1875
 
1876
1876
 
1877
+ const HTTP_HEADER_CONTENT_TYPE = "Content-Type";
1878
+
1877
1879
  function toCompatibleReadable(readable) {
1878
1880
  if (readable instanceof ReadableStream) {
1879
1881
  return readable;
@@ -1894,6 +1896,29 @@
1894
1896
  });
1895
1897
  }
1896
1898
 
1899
+ function streamToBlob(readable, contentType) {
1900
+ readable = toCompatibleReadable(readable);
1901
+ if (responseSupportsGlobalReadable()) {
1902
+ const options = {};
1903
+ if (contentType) {
1904
+ options.headers = [[HTTP_HEADER_CONTENT_TYPE, contentType]];
1905
+ }
1906
+ return new Response(readable, options).blob();
1907
+ }
1908
+ const chunks = [];
1909
+ return readable
1910
+ .pipeTo(new WritableStream({
1911
+ write(chunk) {
1912
+ chunks.push(chunk);
1913
+ }
1914
+ }))
1915
+ .then(() => new Blob(chunks, contentType ? { type: contentType } : {}));
1916
+ }
1917
+
1918
+ function responseSupportsGlobalReadable() {
1919
+ return typeof Blob.prototype.stream != FUNCTION_TYPE || new Blob([]).stream() instanceof ReadableStream;
1920
+ }
1921
+
1897
1922
  function toCompatibleWritable(writable) {
1898
1923
  if (writable instanceof WritableStream) {
1899
1924
  return writable;
@@ -2654,14 +2679,16 @@
2654
2679
  } else {
2655
2680
  webWorkerSupported = false;
2656
2681
  }
2657
- const { reader } = workerData;
2658
- if (reader) {
2659
- reader.releaseLock();
2660
- }
2661
- workerData.reader = null;
2662
- workerData.writer = null;
2682
+ releaseWorkerStreams(workerData);
2663
2683
  return runWorker$1(workerData, config);
2664
2684
  }
2685
+ if (error && error.codecImportFailed) {
2686
+ if (workerData.reader) {
2687
+ releaseWorkerStreams(workerData);
2688
+ return runWorker$1(workerData, config);
2689
+ }
2690
+ workerData.onTaskFinished();
2691
+ }
2665
2692
  throw error;
2666
2693
  }
2667
2694
  }
@@ -2798,6 +2825,15 @@
2798
2825
  return { writable, closed, abortPipe: () => abortController.abort() };
2799
2826
  }
2800
2827
 
2828
+ function releaseWorkerStreams(workerData) {
2829
+ const { reader } = workerData;
2830
+ if (reader) {
2831
+ reader.releaseLock();
2832
+ }
2833
+ workerData.reader = null;
2834
+ workerData.writer = null;
2835
+ }
2836
+
2801
2837
  function terminateWorker$1(workerData) {
2802
2838
  const { worker } = workerData;
2803
2839
  if (worker) {
@@ -2865,7 +2901,7 @@
2865
2901
  try {
2866
2902
  worker = new Worker(resolvedURI, resolvedOptions);
2867
2903
  } catch (error) {
2868
- if (!isModuleType) {
2904
+ if (isModuleType) {
2869
2905
  return getWebWorker(url, baseURI, workerData, false, useBlobURI);
2870
2906
  } else {
2871
2907
  throw error;
@@ -2983,12 +3019,15 @@
2983
3019
  const stale = () => workerData.generation != generation;
2984
3020
  try {
2985
3021
  if (error) {
2986
- const { message, stack, code, name, outputSize, cause } = error;
3022
+ const { message, stack, code, name, outputSize, cause, codecImportFailed } = error;
2987
3023
  const responseError = new Error(message);
2988
3024
  Object.assign(responseError, { stack, code, name, outputSize });
2989
3025
  if (cause) {
2990
3026
  responseError.cause = Object.assign(new Error(cause.message), { name: cause.name });
2991
3027
  }
3028
+ if (codecImportFailed) {
3029
+ responseError.codecImportFailed = true;
3030
+ }
2992
3031
  close(responseError);
2993
3032
  } else {
2994
3033
  if (type == MESSAGE_PULL) {
@@ -3027,7 +3066,9 @@
3027
3066
  if (writer) {
3028
3067
  writer.releaseLock();
3029
3068
  }
3030
- onTaskFinished();
3069
+ if (!(error && error.codecImportFailed)) {
3070
+ onTaskFinished();
3071
+ }
3031
3072
  }
3032
3073
  }
3033
3074
 
@@ -3077,7 +3118,7 @@
3077
3118
  }
3078
3119
  await ensureCodecStreams(format, options.codecURI);
3079
3120
  }
3080
- workerOptions.transferStreams = transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams);
3121
+ workerOptions.transferStreams = !format && (transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams));
3081
3122
  const streamCopy = !compressed && !checkCrc32 && !computeCrc32 && !encrypted;
3082
3123
  const workerSupported = format === UNDEFINED_VALUE || Boolean(options.codecURI);
3083
3124
  workerOptions.useWebWorkers = !streamCopy && workerSupported && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
@@ -3233,7 +3274,6 @@
3233
3274
  const HTTP_HEADER_CONTENT_RANGE = "Content-Range";
3234
3275
  const HTTP_HEADER_ACCEPT_RANGES = "Accept-Ranges";
3235
3276
  const HTTP_HEADER_RANGE = "Range";
3236
- const HTTP_HEADER_CONTENT_TYPE = "Content-Type";
3237
3277
  const HTTP_HEADER_ETAG = "Etag";
3238
3278
  const HTTP_HEADER_LAST_MODIFIED = "Last-Modified";
3239
3279
  const HTTP_METHOD_HEAD = "HEAD";
@@ -3438,10 +3478,6 @@
3438
3478
  }
3439
3479
  }
3440
3480
 
3441
- function responseSupportsGlobalReadable() {
3442
- return typeof Blob.prototype.stream != FUNCTION_TYPE || new Blob([]).stream() instanceof ReadableStream;
3443
- }
3444
-
3445
3481
  class BlobWriter extends Stream {
3446
3482
 
3447
3483
  constructor(contentType) {
@@ -3453,22 +3489,7 @@
3453
3489
  return transformStream.writable;
3454
3490
  }
3455
3491
  });
3456
- if (responseSupportsGlobalReadable()) {
3457
- const headers = [];
3458
- if (contentType) {
3459
- headers.push([HTTP_HEADER_CONTENT_TYPE, contentType]);
3460
- }
3461
- writer.blob = new Response(transformStream.readable, { headers }).blob();
3462
- } else {
3463
- const chunks = [];
3464
- writer.blob = transformStream.readable
3465
- .pipeTo(new WritableStream({
3466
- write(chunk) {
3467
- chunks.push(chunk);
3468
- }
3469
- }))
3470
- .then(() => new Blob(chunks, { type: contentType }));
3471
- }
3492
+ writer.blob = streamToBlob(transformStream.readable, contentType);
3472
3493
  writer.blob.catch(() => { });
3473
3494
  }
3474
3495
 
@@ -4542,7 +4563,7 @@
4542
4563
  const { config } = zipReader;
4543
4564
  await initStream(reader);
4544
4565
  if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
4545
- reader = new BlobReader(await new Response(reader.readable).blob());
4566
+ reader = new BlobReader(await streamToBlob(reader.readable));
4546
4567
  await initStream(reader);
4547
4568
  }
4548
4569
  if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
@@ -4811,7 +4832,7 @@
4811
4832
  entry.arrayBuffer = async options => {
4812
4833
  const writer = new TransformStream();
4813
4834
  const [arrayBuffer] = await Promise.all([
4814
- new Response(writer.readable).arrayBuffer(),
4835
+ streamToBlob(writer.readable).then(blob => blob.arrayBuffer()),
4815
4836
  fileEntry.getData(writer, entry, zipReader.readRanges, options)]);
4816
4837
  return arrayBuffer;
4817
4838
  };
@@ -7619,7 +7640,7 @@
7619
7640
 
7620
7641
  async function spillToFile() {
7621
7642
  const directoryHandle = await getTempDirectory();
7622
- fileName = crypto.randomUUID();
7643
+ fileName = getRandomFileName$1();
7623
7644
  fileHandle = await directoryHandle.getFileHandle(fileName, { create: true });
7624
7645
  fileWriter = (await fileHandle.createWritable()).getWriter();
7625
7646
  spilled = true;
@@ -7700,6 +7721,13 @@
7700
7721
  };
7701
7722
  }
7702
7723
 
7724
+ function getRandomFileName$1() {
7725
+ if (crypto.randomUUID) {
7726
+ return crypto.randomUUID();
7727
+ }
7728
+ return Array.from(crypto.getRandomValues(new Uint8Array(16)), byteValue => byteValue.toString(16).padStart(2, "0")).join("");
7729
+ }
7730
+
7703
7731
  /*
7704
7732
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
7705
7733
 
@@ -7743,7 +7771,7 @@
7743
7771
 
7744
7772
  async function spillToBlob() {
7745
7773
  const transformStream = new TransformStream();
7746
- blobPromise = new Response(transformStream.readable).blob();
7774
+ blobPromise = streamToBlob(transformStream.readable);
7747
7775
  blobWriter = transformStream.writable.getWriter();
7748
7776
  spilled = true;
7749
7777
  for (const chunk of memoryChunks) {
@@ -7883,7 +7911,7 @@
7883
7911
 
7884
7912
  async function spillToFile() {
7885
7913
  const directoryHandle = await getTempDirectory();
7886
- fileName = crypto.randomUUID();
7914
+ fileName = getRandomFileName();
7887
7915
  const fileHandle = await directoryHandle.getFileHandle(fileName, { create: true });
7888
7916
  accessHandle = await fileHandle.createSyncAccessHandle();
7889
7917
  spilled = true;
@@ -7963,6 +7991,13 @@
7963
7991
  };
7964
7992
  }
7965
7993
 
7994
+ function getRandomFileName() {
7995
+ if (crypto.randomUUID) {
7996
+ return crypto.randomUUID();
7997
+ }
7998
+ return Array.from(crypto.getRandomValues(new Uint8Array(16)), byteValue => byteValue.toString(16).padStart(2, "0")).join("");
7999
+ }
8000
+
7966
8001
  /*
7967
8002
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
7968
8003