@zip.js/zip.js 2.8.45 → 2.8.47

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 (56) hide show
  1. package/README.md +28 -2
  2. package/deno.json +13 -3
  3. package/dist/zip-core-external.js +146 -35
  4. package/dist/zip-core-external.min.js +1 -1
  5. package/dist/zip-core.js +154 -32
  6. package/dist/zip-core.min.js +1 -1
  7. package/dist/zip-fs-core-external.js +146 -35
  8. package/dist/zip-fs-core-external.min.js +1 -1
  9. package/dist/zip-fs-core.js +124 -30
  10. package/dist/zip-fs-core.min.js +1 -1
  11. package/dist/zip-fs-external.js +146 -35
  12. package/dist/zip-fs-external.min.js +1 -1
  13. package/dist/zip-fs-native.js +160 -36
  14. package/dist/zip-fs-native.min.js +1 -1
  15. package/dist/zip-fs.js +160 -36
  16. package/dist/zip-fs.min.js +1 -1
  17. package/dist/zip-legacy.js +156 -34
  18. package/dist/zip-legacy.min.js +1 -1
  19. package/dist/zip-native.js +158 -36
  20. package/dist/zip-native.min.js +1 -1
  21. package/dist/zip-web-worker-native.js +1 -1
  22. package/dist/zip-web-worker.js +1 -1
  23. package/dist/zip.js +158 -36
  24. package/dist/zip.min.js +1 -1
  25. package/index-native.cjs +160 -36
  26. package/index-native.min.js +1 -1
  27. package/index.cjs +160 -36
  28. package/index.d.cts +232 -1
  29. package/index.d.ts +232 -1
  30. package/index.min.js +1 -1
  31. package/lib/core/codec-pool.js +9 -5
  32. package/lib/core/codec-worker.js +30 -13
  33. package/lib/core/configuration.js +20 -2
  34. package/lib/core/constants.js +2 -0
  35. package/lib/core/options.js +4 -0
  36. package/lib/core/streams/codec-stream.js +2 -0
  37. package/lib/core/streams/common-crypto.js +2 -1
  38. package/lib/core/streams/zip-entry-stream.js +12 -10
  39. package/lib/core/util/sync-access-handle-temp-stream.js +2 -1
  40. package/lib/core/web-worker-base.js +27 -0
  41. package/lib/core/web-worker-inline-native.js +1 -1
  42. package/lib/core/web-worker-inline-wasm.js +1 -1
  43. package/lib/core/web-worker-native.js +7 -9
  44. package/lib/core/web-worker-wasm.js +9 -12
  45. package/lib/core/zip-fs.js +1 -1
  46. package/lib/core/zip-reader.js +58 -5
  47. package/lib/core/zip-writer.js +43 -8
  48. package/lib/zip-core-base.js +2 -1
  49. package/lib/{core/web-worker-inline-template.js → zip-core-custom.js} +13 -20
  50. package/lib/zip-core-reader.js +2 -1
  51. package/lib/zip-core-writer.js +10 -1
  52. package/lib/zip-module-native.js +3 -3
  53. package/lib/zip-module-wasm-base.js +3 -3
  54. package/package.json +20 -2
  55. package/lib/core/web-worker-inline-template-native.js +0 -48
  56. package/lib/core/zlib-streams-inline-template.js +0 -45
package/index-native.cjs CHANGED
@@ -41,6 +41,7 @@ const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
41
41
  const SPLIT_ZIP_FILE_SIGNATURE = 0x08074b50;
42
42
  const DATA_DESCRIPTOR_RECORD_SIGNATURE = SPLIT_ZIP_FILE_SIGNATURE;
43
43
  const ARCHIVE_EXTRA_DATA_SIGNATURE = 0x08064b50;
44
+ const DIGITAL_SIGNATURE_RECORD_SIGNATURE = 0x05054b50;
44
45
  const CENTRAL_FILE_HEADER_SIGNATURE = 0x02014b50;
45
46
  const END_OF_CENTRAL_DIR_SIGNATURE = 0x06054b50;
46
47
  const ZIP64_END_OF_CENTRAL_DIR_SIGNATURE = 0x06064b50;
@@ -170,6 +171,7 @@ const CONFIGURABLE_PROPERTY_NAMES = [
170
171
  "baseURI",
171
172
  "wasmURI",
172
173
  "workerURI",
174
+ "createWorker",
173
175
  "chunkSize",
174
176
  "maxWorkers",
175
177
  "terminateWorkerTimeout",
@@ -180,8 +182,8 @@ const CONFIGURABLE_PROPERTY_NAMES = [
180
182
  "transferStreams",
181
183
  "CompressionStream",
182
184
  "DecompressionStream",
183
- "CompressionStreamZlib",
184
- "DecompressionStreamZlib"
185
+ "CompressionStreamFallback",
186
+ "DecompressionStreamFallback"
185
187
  ];
186
188
 
187
189
  const config = { ...DEFAULT_CONFIGURATION };
@@ -195,6 +197,7 @@ function getChunkSize(config) {
195
197
  }
196
198
 
197
199
  function configure(configuration) {
200
+ configuration = normalizeConfiguration(configuration);
198
201
  for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
199
202
  const propertyValue = configuration[propertyName];
200
203
  if (propertyValue !== UNDEFINED_VALUE) {
@@ -203,7 +206,23 @@ function configure(configuration) {
203
206
  }
204
207
  }
205
208
 
209
+ function normalizeConfiguration(configuration) {
210
+ const { CompressionStreamZlib, DecompressionStreamZlib } = configuration;
211
+ if (CompressionStreamZlib === UNDEFINED_VALUE && DecompressionStreamZlib === UNDEFINED_VALUE) {
212
+ return configuration;
213
+ }
214
+ const normalizedConfiguration = Object.assign({}, configuration);
215
+ if (normalizedConfiguration.CompressionStreamFallback === UNDEFINED_VALUE) {
216
+ normalizedConfiguration.CompressionStreamFallback = CompressionStreamZlib;
217
+ }
218
+ if (normalizedConfiguration.DecompressionStreamFallback === UNDEFINED_VALUE) {
219
+ normalizedConfiguration.DecompressionStreamFallback = DecompressionStreamZlib;
220
+ }
221
+ return normalizedConfiguration;
222
+ }
223
+
206
224
  function setDefaultConfiguration(configuration) {
225
+ configuration = normalizeConfiguration(configuration);
207
226
  for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
208
227
  const propertyValue = configuration[propertyName];
209
228
  if (propertyValue !== UNDEFINED_VALUE) {
@@ -220,7 +239,7 @@ function resetConfiguration() {
220
239
  Object.assign(config, DEFAULT_CONFIGURATION);
221
240
  }
222
241
 
223
- const n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],i=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],t=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],r=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],s=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],o=new Uint8Array(288);o.fill(8,0,144),o.fill(9,144,256),o.fill(7,256,280),o.fill(8,280,288);const a=new Uint8Array(30).fill(5);function e(n){const i=new Uint16Array(16);for(const t of n)i[t]++;i[0]=0;const t=new Uint16Array(17);for(let n=1;15>=n;n++)t[n+1]=t[n]+i[n];const r=new Uint16Array(n.length);for(let i=0;i<n.length;i++)n[i]&&(r[t[n[i]]++]=i);return {o:i,symbols:r}}const f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function h(h){h({workerURI:h=>{const b="text/javascript",u=(f=>{let h=0,b=0,u=0,Z=new Uint8Array(1024),j=0,R=0;for(;!R;){R=C(1);const n=C(2);if(0==n)O();else if(1==n)Y(e(o),e(a));else {if(2!=n)throw Error("invalid deflate block type");Y(...m());}}return Z.subarray(0,j);function z(){if(h>=f.length)throw Error("unexpected end of deflate data");return f[h++]}function C(n){for(;n>u;)b|=z()<<u,u+=8;const i=b&(1<<n)-1;return b>>>=n,u-=n,i}function O(){b=0,u=0;const n=z()|z()<<8;h+=2,G(j+n);for(let i=0;n>i;i++)Z[j++]=z();}function Y(s,o){let a=v(s);for(;256!=a;){if(256>a)G(j+1),Z[j++]=a;else {const s=a-257,e=n[s]+C(i[s]),f=v(o),h=t[f]+C(r[f]);G(j+e);const b=j-h;for(let n=0;e>n;n++)Z[j++]=Z[b+n];}a=v(s);}}function m(){const n=C(5)+257,i=C(5)+1,t=C(4)+4,r=new Uint8Array(19);for(let n=0;t>n;n++)r[s[n]]=C(3);const o=e(r),a=new Uint8Array(n+i);let f=0;for(;f<a.length;){const n=v(o);if(16>n)a[f++]=n;else if(16==n){const n=a[f-1];let i=C(2)+3;for(;i--;)a[f++]=n;}else f+=17==n?C(3)+3:C(7)+11;}return [e(a.subarray(0,n)),e(a.subarray(n))]}function v(n){const{o:i,symbols:t}=n;let r=0,s=0,o=0;for(let n=1;15>=n;n++){r|=C(1);const a=i[n];if(a>r-s)return t[o+(r-s)];o+=a,s=s+a<<1,r<<=1;}throw Error("invalid huffman code")}function G(n){if(Z.length<n){let i=2*Z.length;for(;n>i;)i*=2;const t=new Uint8Array(i);t.set(Z.subarray(0,j)),Z=t;}}})((n=>{const i=(n=(n+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,t=[];for(let r=0;i>r;r+=4){const i=f.indexOf(n[r])<<18|f.indexOf(n[r+1])<<12|(63&f.indexOf(n[r+2]))<<6|63&f.indexOf(n[r+3]);t.push(i>>16&255),"="!==n[r+2]&&t.push(i>>8&255),"="!==n[r+3]&&t.push(255&i);}return new Uint8Array(t)})("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"));if(h){const n=new Blob([u],{type:b});return URL.createObjectURL(n)}return "data:"+b+";base64,"+(n=>{let i="";const t=n.length;let r=0;for(;t>r+2;r+=3){const t=n[r]<<16|n[r+1]<<8|n[r+2];i+=f[t>>18&63]+f[t>>12&63]+f[t>>6&63]+f[63&t];}const s=t-r;if(1===s){const t=n[r]<<16;i+=f[t>>18&63]+f[t>>12&63]+"==";}else if(2===s){const t=n[r]<<16|n[r+1]<<8;i+=f[t>>18&63]+f[t>>12&63]+f[t>>6&63]+"=";}return i})(u)}});}
242
+ const r=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],n=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],t=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],e=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],f=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],u=new Uint8Array(288);u.fill(8,0,144),u.fill(9,144,256),u.fill(7,256,280),u.fill(8,280,288);const i=new Uint8Array(30).fill(5);function o(r){const n=new Uint16Array(16);for(const t of r)n[t]++;n[0]=0;const t=new Uint16Array(17);for(let r=1;15>=r;r++)t[r+1]=t[r]+n[r];const e=new Uint16Array(r.length);for(let n=0;n<r.length;n++)r[n]&&(e[t[r[n]]++]=n);return {o:n,symbols:e}}const G="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",l=(x=()=>(G=>{let l=0,x=0,c=0,s=new Uint8Array(1024),p=0,m=0;for(;!m;){m=w(1);const r=w(2);if(0==r)z();else if(1==r)U(o(u),o(i));else {if(2!=r)throw Error("invalid deflate block type");U(...W());}}return s.subarray(0,p);function j(){if(l>=G.length)throw Error("unexpected end of deflate data");return G[l++]}function w(r){for(;r>c;)x|=j()<<c,c+=8;const n=x&(1<<r)-1;return x>>>=r,c-=r,n}function z(){x=0,c=0;const r=j()|j()<<8;l+=2,C(p+r);for(let n=0;r>n;n++)s[p++]=j();}function U(f,u){let i=N(f);for(;256!=i;){if(256>i)C(p+1),s[p++]=i;else {const f=i-257,o=r[f]+w(n[f]),G=N(u),l=t[G]+w(e[G]);C(p+o);const x=p-l;for(let r=0;o>r;r++)s[p++]=s[x+r];}i=N(f);}}function W(){const r=w(5)+257,n=w(5)+1,t=w(4)+4,e=new Uint8Array(19);for(let r=0;t>r;r++)e[f[r]]=w(3);const u=o(e),i=new Uint8Array(r+n);let G=0;for(;G<i.length;){const r=N(u);if(16>r)i[G++]=r;else if(16==r){const r=i[G-1];let n=w(2)+3;for(;n--;)i[G++]=r;}else G+=17==r?w(3)+3:w(7)+11;}return [o(i.subarray(0,r)),o(i.subarray(r))]}function N(r){const{o:n,symbols:t}=r;let e=0,f=0,u=0;for(let r=1;15>=r;r++){e|=w(1);const i=n[r];if(i>e-f)return t[u+(e-f)];u+=i,f=f+i<<1,e<<=1;}throw Error("invalid huffman code")}function C(r){if(s.length<r){let n=2*s.length;for(;r>n;)n*=2;const t=new Uint8Array(n);t.set(s.subarray(0,p)),s=t;}}})((r=>{const n=(r=(r+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,t=[];for(let e=0;n>e;e+=4){const n=G.indexOf(r[e])<<18|G.indexOf(r[e+1])<<12|(63&G.indexOf(r[e+2]))<<6|63&G.indexOf(r[e+3]);t.push(n>>16&255),"="!==r[e+2]&&t.push(n>>8&255),"="!==r[e+3]&&t.push(255&n);}return new Uint8Array(t)})("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")),r=>r({workerURI:r=>{const n="text/javascript";let t=x();if("string"==typeof t&&(t=(new TextEncoder).encode(t)),r){const r=new Blob([t],{type:n});return URL.createObjectURL(r)}return "data:"+n+";base64,"+(r=>{let n="";const t=r.length;let e=0;for(;t>e+2;e+=3){const t=r[e]<<16|r[e+1]<<8|r[e+2];n+=G[t>>18&63]+G[t>>12&63]+G[t>>6&63]+G[63&t];}const f=t-e;if(1===f){const t=r[e]<<16;n+=G[t>>18&63]+G[t>>12&63]+"==";}else if(2===f){const t=r[e]<<16|r[e+1]<<8;n+=G[t>>18&63]+G[t>>12&63]+G[t>>6&63]+"=";}return n})(t)}}));var x;
224
243
 
225
244
  /*
226
245
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -1932,7 +1951,7 @@ const GZIP_OUTPUT_STALL_TIMEOUT = 5000;
1932
1951
 
1933
1952
  class DeflateStream extends TransformStream {
1934
1953
 
1935
- constructor(options, { chunkSize, CompressionStreamZlib, CompressionStream }) {
1954
+ constructor(options, { chunkSize, CompressionStreamFallback, CompressionStream }) {
1936
1955
  super({});
1937
1956
  const { compressed, encrypted, useCompressionStream, zipCrypto, computeCrc32, level, deflate64, format, compressionMethod } = options;
1938
1957
  const stream = this;
@@ -1954,7 +1973,7 @@ class DeflateStream extends TransformStream {
1954
1973
  readable = pipeThrough(readable, gzipCrc32Stream);
1955
1974
  } else {
1956
1975
  try {
1957
- readable = pipeThroughCompressionStream(readable, useCompressionStream, { level, chunkSize }, CompressionStream, CompressionStreamZlib);
1976
+ readable = pipeThroughCompressionStream(readable, useCompressionStream, { level, chunkSize }, CompressionStream, CompressionStreamFallback);
1958
1977
  } catch (error) {
1959
1978
  let gzipStream;
1960
1979
  try {
@@ -2096,7 +2115,7 @@ function pipeThroughGzipDecompressionStream(readable, gzipStream, outputSize) {
2096
2115
 
2097
2116
  class InflateStream extends TransformStream {
2098
2117
 
2099
- constructor(options, { chunkSize, DecompressionStreamZlib, DecompressionStream }) {
2118
+ constructor(options, { chunkSize, DecompressionStreamFallback, DecompressionStream }) {
2100
2119
  super({});
2101
2120
  const { zipCrypto, encrypted, checkCrc32, crc32, compressed, useCompressionStream, deflate64, format, compressionMethod, rawBitFlag, outputSize } = options;
2102
2121
  let crc32Stream, decryptionStream;
@@ -2115,7 +2134,7 @@ class InflateStream extends TransformStream {
2115
2134
  readable = pipeThroughBackpressured(readable, createCodecStream(codecStreams.DecompressionStream, format, { chunkSize, compressionMethod, rawBitFlag, uncompressedSize: outputSize }));
2116
2135
  } else {
2117
2136
  try {
2118
- readable = pipeThroughCompressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamZlib);
2137
+ readable = pipeThroughCompressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamFallback);
2119
2138
  } catch (error) {
2120
2139
  if (deflate64 || outputSize === UNDEFINED_VALUE) {
2121
2140
  throw error;
@@ -2194,17 +2213,17 @@ function createCodecStream(CodecStreamClass, format, options) {
2194
2213
  return new CodecStreamClass(format, options);
2195
2214
  }
2196
2215
 
2197
- function pipeThroughCompressionStream(readable, useCompressionStream, options, CompressionStreamNative, CompressionStreamZlib) {
2216
+ function pipeThroughCompressionStream(readable, useCompressionStream, options, CompressionStreamNative, CompressionStreamFallback) {
2198
2217
  const Stream = useCompressionStream && CompressionStreamNative ?
2199
2218
  CompressionStreamNative :
2200
- CompressionStreamZlib || CompressionStreamNative;
2219
+ CompressionStreamFallback || CompressionStreamNative;
2201
2220
  const format = options.deflate64 ? FORMAT_DEFLATE64_RAW : FORMAT_DEFLATE_RAW;
2202
2221
  let codecStream;
2203
2222
  try {
2204
2223
  codecStream = new Stream(format, options);
2205
2224
  } catch (error) {
2206
- if (useCompressionStream && CompressionStreamZlib && Stream != CompressionStreamZlib) {
2207
- codecStream = new CompressionStreamZlib(format, options);
2225
+ if (useCompressionStream && CompressionStreamFallback && Stream != CompressionStreamFallback) {
2226
+ codecStream = new CompressionStreamFallback(format, options);
2208
2227
  } else {
2209
2228
  throw error;
2210
2229
  }
@@ -2467,7 +2486,7 @@ const ERROR_EVENT_TYPE = "error";
2467
2486
  const MESSAGE_ERROR_EVENT_TYPE = "messageerror";
2468
2487
  const ERR_WORKER_STARTUP_TIMEOUT = "Worker startup timeout";
2469
2488
 
2470
- let webWorkerSupported, webWorkerSource, webWorkerURI, webWorkerOptions;
2489
+ let webWorkerSupported, webWorkerSource, webWorkerURI, webWorkerOptions, createWorkerFailed;
2471
2490
  let transferStreamsSupported = true;
2472
2491
  try {
2473
2492
  transferStreamsSupported = typeof structuredClone == FUNCTION_TYPE && structuredClone(new DOMException("", "AbortError")).code !== UNDEFINED_VALUE;
@@ -2477,14 +2496,14 @@ try {
2477
2496
  let initModule = () => { };
2478
2497
 
2479
2498
  async function supportsDeflate(config) {
2480
- const { CompressionStream: NativeStream, CompressionStreamZlib: ZlibStream } = config;
2481
- if (ZlibStream && !ZlibStream.requiresModule) {
2499
+ const { CompressionStream: NativeStream, CompressionStreamFallback: FallbackStream } = config;
2500
+ if (FallbackStream && !FallbackStream.requiresModule) {
2482
2501
  return true;
2483
2502
  }
2484
2503
  if (supportsDeflateRaw(NativeStream) || supportsGzip(NativeStream)) {
2485
2504
  return true;
2486
2505
  }
2487
- if (ZlibStream) {
2506
+ if (FallbackStream) {
2488
2507
  try {
2489
2508
  await initModule(config);
2490
2509
  return true;
@@ -2497,12 +2516,16 @@ async function supportsDeflate(config) {
2497
2516
 
2498
2517
  function resetWebWorkerSupport() {
2499
2518
  webWorkerSupported = UNDEFINED_VALUE;
2519
+ createWorkerFailed = false;
2500
2520
  }
2501
2521
 
2502
2522
  class CodecWorker {
2503
2523
 
2504
- constructor(workerData, { readable, writable }, { options, config, streamOptions, useWebWorkers, transferStreams, workerURI }, onTaskFinished) {
2524
+ constructor(workerData, { readable, writable }, { options, config, streamOptions, useWebWorkers, transferStreams, workerURI, createWorker }, onTaskFinished) {
2505
2525
  const { signal } = streamOptions;
2526
+ if (createWorkerFailed) {
2527
+ createWorker = UNDEFINED_VALUE;
2528
+ }
2506
2529
  Object.assign(workerData, {
2507
2530
  busy: true,
2508
2531
  generation: (workerData.generation || 0) + 1,
@@ -2512,6 +2535,7 @@ class CodecWorker {
2512
2535
  writable,
2513
2536
  options: Object.assign({}, options),
2514
2537
  workerURI,
2538
+ createWorker,
2515
2539
  transferStreams,
2516
2540
  terminate() {
2517
2541
  return new Promise(resolve => {
@@ -2547,7 +2571,7 @@ class CodecWorker {
2547
2571
  // deno-lint-ignore valid-typeof
2548
2572
  webWorkerSupported = typeof Worker != UNDEFINED_TYPE;
2549
2573
  }
2550
- return (useWebWorkers && webWorkerSupported ? createWebWorkerInterface : createWorkerInterface)(workerData, config);
2574
+ return (useWebWorkers && ((webWorkerSupported && workerURI) || createWorker) ? createWebWorkerInterface : createWorkerInterface)(workerData, config);
2551
2575
  }
2552
2576
  }
2553
2577
 
@@ -2604,7 +2628,11 @@ function createWebWorkerInterface(workerData, config) {
2604
2628
  try {
2605
2629
  worker = getWebWorker(workerData.workerURI, baseURI, workerData);
2606
2630
  } catch {
2607
- webWorkerSupported = false;
2631
+ if (workerData.createWorker) {
2632
+ createWorkerFailed = true;
2633
+ } else {
2634
+ webWorkerSupported = false;
2635
+ }
2608
2636
  return createWorkerInterface(workerData, config);
2609
2637
  }
2610
2638
  Object.assign(workerData, {
@@ -2617,7 +2645,11 @@ function createWebWorkerInterface(workerData, config) {
2617
2645
  return await runWebWorker(workerData, { chunkSize, wasmURI, baseURI, workerStartupTimeout });
2618
2646
  } catch (error) {
2619
2647
  if (error && error.workerStartupFailed) {
2620
- webWorkerSupported = false;
2648
+ if (workerData.createWorker) {
2649
+ createWorkerFailed = true;
2650
+ } else {
2651
+ webWorkerSupported = false;
2652
+ }
2621
2653
  const { reader } = workerData;
2622
2654
  if (reader) {
2623
2655
  reader.releaseLock();
@@ -2640,17 +2672,17 @@ async function runWorker$1({ options, readable, writable, onTaskFinished }, conf
2640
2672
  try {
2641
2673
  if (options.compressed && !options.format) {
2642
2674
  const deflate = options.codecType.startsWith(CODEC_DEFLATE);
2643
- const ZlibStream = deflate ? config.CompressionStreamZlib : config.DecompressionStreamZlib;
2675
+ const FallbackStream = deflate ? config.CompressionStreamFallback : config.DecompressionStreamFallback;
2644
2676
  const NativeStream = deflate ? config.CompressionStream : config.DecompressionStream;
2645
2677
  if (!options.useCompressionStream) {
2646
2678
  try {
2647
2679
  await initModule(config);
2648
2680
  } catch {
2649
- if (!ZlibStream || ZlibStream.requiresModule) {
2681
+ if (!FallbackStream || FallbackStream.requiresModule) {
2650
2682
  options.useCompressionStream = true;
2651
2683
  }
2652
2684
  }
2653
- } else if (ZlibStream && ZlibStream.requiresModule && !supportsDeflateRaw(NativeStream)) {
2685
+ } else if (FallbackStream && FallbackStream.requiresModule && !supportsDeflateRaw(NativeStream)) {
2654
2686
  try {
2655
2687
  await initModule(config);
2656
2688
  } catch {
@@ -2775,8 +2807,11 @@ function terminateWorker$1(workerData) {
2775
2807
  }
2776
2808
 
2777
2809
  function getWebWorker(url, baseURI, workerData, isModuleType, useBlobURI = true) {
2810
+ const { createWorker } = workerData;
2778
2811
  let worker, resolvedURI, resolvedOptions;
2779
- if (webWorkerURI === UNDEFINED_VALUE || webWorkerSource !== url) {
2812
+ if (createWorker) {
2813
+ worker = createWorker();
2814
+ } else if (webWorkerURI === UNDEFINED_VALUE || webWorkerSource !== url) {
2780
2815
  // deno-lint-ignore valid-typeof
2781
2816
  const isFunctionURI = typeof url == FUNCTION_TYPE;
2782
2817
  if (isFunctionURI) {
@@ -3031,7 +3066,7 @@ let indexWorker = 0;
3031
3066
  async function runWorker(stream, workerOptions) {
3032
3067
  const { options, config } = workerOptions;
3033
3068
  const { transferStreams, useWebWorkers, useCompressionStream, compressed, checkCrc32, computeCrc32, encrypted, format, codecURI } = options;
3034
- const { workerURI, maxWorkers } = config;
3069
+ const { workerURI, createWorker, maxWorkers } = config;
3035
3070
  if (format) {
3036
3071
  if (codecURI) {
3037
3072
  options.codecURI = resolveCodecURI(codecURI, config.baseURI);
@@ -3043,6 +3078,7 @@ async function runWorker(stream, workerOptions) {
3043
3078
  const workerSupported = format === UNDEFINED_VALUE || Boolean(options.codecURI);
3044
3079
  workerOptions.useWebWorkers = !streamCopy && workerSupported && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
3045
3080
  workerOptions.workerURI = workerOptions.useWebWorkers && workerURI ? workerURI : UNDEFINED_VALUE;
3081
+ workerOptions.createWorker = workerOptions.useWebWorkers && createWorker ? createWorker : UNDEFINED_VALUE;
3046
3082
  options.useCompressionStream = useCompressionStream || (useCompressionStream === UNDEFINED_VALUE && config.useCompressionStream);
3047
3083
  return (await getWorker()).run();
3048
3084
 
@@ -3106,7 +3142,7 @@ function onWorkerStarvation() {
3106
3142
  starvationTimeout = null;
3107
3143
  if (pendingRequests.length) {
3108
3144
  const [{ resolve, stream, workerOptions }] = pendingRequests.splice(0, 1);
3109
- const inlineWorkerOptions = Object.assign({}, workerOptions, { useWebWorkers: false, workerURI: UNDEFINED_VALUE });
3145
+ const inlineWorkerOptions = Object.assign({}, workerOptions, { useWebWorkers: false, workerURI: UNDEFINED_VALUE, createWorker: UNDEFINED_VALUE });
3110
3146
  resolve(new CodecWorker({}, stream, inlineWorkerOptions, onInlineTaskFinished));
3111
3147
  armStarvationTimeout();
3112
3148
  }
@@ -4415,6 +4451,8 @@ const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
4415
4451
  const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
4416
4452
  const OPTION_STRICTNESS = "strictness";
4417
4453
  const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
4454
+ const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
4455
+ const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
4418
4456
  const STRICTNESS_STRICT = "strict";
4419
4457
  const STRICTNESS_BALANCED = "balanced";
4420
4458
  const STRICTNESS_TOLERANT = "tolerant";
@@ -4540,6 +4578,7 @@ class ZipReader {
4540
4578
  let startOffset;
4541
4579
  let zip64EndOfDirectory;
4542
4580
  let zip64EndOfDirectoryVersion2;
4581
+ let directoryEncryptionInfo;
4543
4582
  const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
4544
4583
  if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
4545
4584
  directoryDataOffset += getDiskOffset$1(reader, diskNumber);
@@ -4570,6 +4609,15 @@ class ZipReader {
4570
4609
  }
4571
4610
  zip64EndOfDirectory = true;
4572
4611
  zip64EndOfDirectoryVersion2 = getBigUint64(endOfDirectoryView, 4) > ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12;
4612
+ if (zip64EndOfDirectoryVersion2) {
4613
+ const extensibleDataLength = Math.min(
4614
+ Number(getBigUint64(endOfDirectoryView, 4)) - (ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12),
4615
+ reader.size - directoryDataOffset - ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4616
+ if (extensibleDataLength > 0) {
4617
+ const rawExtensibleData = await readUint8Array(reader, directoryDataOffset + ZIP64_END_OF_CENTRAL_DIR_LENGTH, extensibleDataLength);
4618
+ directoryEncryptionInfo = getDirectoryEncryptionInfo(rawExtensibleData);
4619
+ }
4620
+ }
4573
4621
  if (lastDiskNumber == MAX_16_BITS) {
4574
4622
  lastDiskNumber = getUint32(endOfDirectoryView, 16);
4575
4623
  } else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
@@ -4593,7 +4641,7 @@ class ZipReader {
4593
4641
  directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4594
4642
  }
4595
4643
  }
4596
- const declaredDirectoryDataLength = directoryDataLength;
4644
+ let declaredDirectoryDataLength = directoryDataLength;
4597
4645
  const centralDirectoryEndOffset = endOfDirectoryInfo.offset -
4598
4646
  (zip64EndOfDirectory ? ZIP64_END_OF_CENTRAL_DIR_LENGTH + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
4599
4647
  if (directoryDataOffset >= reader.size) {
@@ -4641,6 +4689,18 @@ class ZipReader {
4641
4689
  if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) {
4642
4690
  throw new Error(ERR_BAD_FORMAT);
4643
4691
  }
4692
+ zipReader.directoryOffset = directoryDataOffset;
4693
+ zipReader.directoryLength = declaredDirectoryDataLength;
4694
+ const decryptCentralDirectory = getOptionValue$1(zipReader, options, OPTION_DECRYPT_CENTRAL_DIRECTORY);
4695
+ let decryptedDirectory;
4696
+ if (decryptCentralDirectory && filesLength && directoryArray.length >= 4 &&
4697
+ getUint32(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
4698
+ (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
4699
+ directoryArray = await decryptCentralDirectory(directoryArray, directoryEncryptionInfo);
4700
+ directoryView = getDataView(directoryArray);
4701
+ declaredDirectoryDataLength = directoryArray.length;
4702
+ decryptedDirectory = true;
4703
+ }
4644
4704
  startOffset = directoryDataOffset;
4645
4705
  const filenameEncoding = getOptionValue$1(zipReader, options, OPTION_FILENAME_ENCODING);
4646
4706
  const commentEncoding = getOptionValue$1(zipReader, options, OPTION_COMMENT_ENCODING);
@@ -4649,7 +4709,7 @@ class ZipReader {
4649
4709
  for (let indexFile = 0; indexFile < filesLength; indexFile++) {
4650
4710
  const fileEntry = new ZipEntry$1(reader, config, zipReader.options);
4651
4711
  if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
4652
- if (indexFile == 0 && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
4712
+ if (indexFile == 0 && !decryptedDirectory && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
4653
4713
  throw new Error(ERR_ENCRYPTED_CENTRAL_DIRECTORY);
4654
4714
  }
4655
4715
  throw new Error(ERR_CENTRAL_DIRECTORY_NOT_FOUND);
@@ -4762,7 +4822,15 @@ class ZipReader {
4762
4822
  }
4763
4823
  yield entry;
4764
4824
  }
4765
- if (checkAmbiguity && offset != declaredDirectoryDataLength) {
4825
+ let offsetAfterSignature = offset;
4826
+ if (offset + 6 <= directoryArray.length && getUint32(directoryView, offset) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
4827
+ const signatureDataLength = getUint16(directoryView, offset + 4);
4828
+ if (offset + 6 + signatureDataLength <= directoryArray.length) {
4829
+ zipReader.digitalSignature = directoryArray.subarray(offset + 6, offset + 6 + signatureDataLength);
4830
+ offsetAfterSignature = offset + 6 + signatureDataLength;
4831
+ }
4832
+ }
4833
+ if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
4766
4834
  throwAmbiguousArchive("trailing central directory data");
4767
4835
  }
4768
4836
  if (duplicateFilename) {
@@ -5034,6 +5102,25 @@ function detectEncryptedCentralDirectory(directoryView) {
5034
5102
  return false;
5035
5103
  }
5036
5104
 
5105
+ function getDirectoryEncryptionInfo(rawExtensibleData) {
5106
+ const directoryEncryptionInfo = { rawExtensibleData };
5107
+ if (rawExtensibleData.length >= 28) {
5108
+ const extensibleDataView = getDataView(rawExtensibleData);
5109
+ const hashDataLength = getUint16(extensibleDataView, 26);
5110
+ Object.assign(directoryEncryptionInfo, {
5111
+ compressionMethod: getUint16(extensibleDataView, 0),
5112
+ compressedSize: Number(getBigUint64(extensibleDataView, 2)),
5113
+ uncompressedSize: Number(getBigUint64(extensibleDataView, 10)),
5114
+ encryptionAlgorithm: getUint16(extensibleDataView, 18),
5115
+ bitLength: getUint16(extensibleDataView, 20),
5116
+ flags: getUint16(extensibleDataView, 22),
5117
+ hashAlgorithm: getUint16(extensibleDataView, 24),
5118
+ hashData: rawExtensibleData.subarray(28, 28 + hashDataLength)
5119
+ });
5120
+ }
5121
+ return directoryEncryptionInfo;
5122
+ }
5123
+
5037
5124
  function readCommonHeader(directory, dataView, offset) {
5038
5125
  const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2);
5039
5126
  const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED;
@@ -5585,6 +5672,7 @@ var zipReader = /*#__PURE__*/Object.freeze({
5585
5672
  ERR_SPLIT_ZIP_FILE: ERR_SPLIT_ZIP_FILE,
5586
5673
  ERR_UNSUPPORTED_COMPRESSION: ERR_UNSUPPORTED_COMPRESSION$1,
5587
5674
  ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
5675
+ ERR_WORKER_STARTUP_TIMEOUT: ERR_WORKER_STARTUP_TIMEOUT,
5588
5676
  ZipReader: ZipReader,
5589
5677
  ZipReaderStream: ZipReaderStream
5590
5678
  });
@@ -5643,6 +5731,7 @@ const ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = "Invalid unixExtraFieldType (must be '
5643
5731
  const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldType 'unix' (use 'infozip' for larger ids)";
5644
5732
  const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
5645
5733
  const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
5734
+ const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
5646
5735
 
5647
5736
  const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
5648
5737
  const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
@@ -7002,8 +7091,9 @@ function updateLocalHeader({
7002
7091
 
7003
7092
  async function closeFile(zipWriter, comment, options) {
7004
7093
  const directoryDataLength = createDirectoryRecords(zipWriter.files);
7005
- const directoryStart = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
7006
- await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength });
7094
+ const { directoryStart, directoryArray } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
7095
+ const signatureLength = await writeDigitalSignatureRecord(zipWriter, directoryArray, options);
7096
+ await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength, signatureLength });
7007
7097
  }
7008
7098
 
7009
7099
  function createDirectoryRecords(files) {
@@ -7160,12 +7250,33 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
7160
7250
  }
7161
7251
  }
7162
7252
  await writeData(writer, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
7163
- return { diskNumber: directoryStartDiskNumber, diskOffset: directoryStartDiskOffset };
7253
+ return {
7254
+ directoryStart: { diskNumber: directoryStartDiskNumber, diskOffset: directoryStartDiskOffset },
7255
+ directoryArray
7256
+ };
7257
+ }
7258
+
7259
+ async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
7260
+ const signCentralDirectory = getOptionValue(zipWriter, options, OPTION_SIGN_CENTRAL_DIRECTORY);
7261
+ if (signCentralDirectory) {
7262
+ const signatureData = await signCentralDirectory(directoryArray);
7263
+ const signatureDataLength = getLength(signatureData);
7264
+ if (signatureDataLength > MAX_16_BITS) {
7265
+ throw new Error(ERR_INVALID_SIGNATURE_DATA);
7266
+ }
7267
+ const signatureRecord = createRecordWriter(6 + signatureDataLength);
7268
+ signatureRecord.uint32(DIGITAL_SIGNATURE_RECORD_SIGNATURE);
7269
+ signatureRecord.uint16(signatureDataLength);
7270
+ signatureRecord.bytes(signatureData);
7271
+ await writeData(zipWriter.writer, signatureRecord.array);
7272
+ return 6 + signatureDataLength;
7273
+ }
7274
+ return 0;
7164
7275
  }
7165
7276
 
7166
7277
  async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
7167
7278
  const { writer } = zipWriter;
7168
- const { directoryStart } = cdInfo;
7279
+ const { directoryStart, signatureLength } = cdInfo;
7169
7280
  let { directoryDataLength } = cdInfo;
7170
7281
  let filesLength = zipWriter.files.size;
7171
7282
  let diskNumber = directoryStart.diskNumber;
@@ -7204,7 +7315,7 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
7204
7315
  endOfdirectoryRecord.uint64(directoryOffset);
7205
7316
  endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
7206
7317
  endOfdirectoryRecord.uint32(lastDiskNumber);
7207
- endOfdirectoryRecord.uint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength));
7318
+ endOfdirectoryRecord.uint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength) + BigInt(signatureLength));
7208
7319
  endOfdirectoryRecord.uint32(lastDiskNumber + 1);
7209
7320
  const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
7210
7321
  if (supportZip64SplitFile) {
@@ -7917,8 +8028,8 @@ var{Uint8Array:p,Uint16Array:g,Int32Array:R,TransformStream:H,Math:z,Error:L,Arr
7917
8028
  setDefaultConfiguration({
7918
8029
  workerURI: "./core/web-worker-native.js",
7919
8030
  wasmURI: null,
7920
- CompressionStreamZlib: E_,
7921
- DecompressionStreamZlib: g_
8031
+ CompressionStreamFallback: E_,
8032
+ DecompressionStreamFallback: g_
7922
8033
  });
7923
8034
 
7924
8035
  /*
@@ -9074,7 +9185,7 @@ function decodeMimeTypes(data) {
9074
9185
  */
9075
9186
 
9076
9187
 
9077
- h(setDefaultConfiguration);
9188
+ l(setDefaultConfiguration);
9078
9189
 
9079
9190
  exports.BlobReader = BlobReader;
9080
9191
  exports.BlobWriter = BlobWriter;
@@ -9086,6 +9197,7 @@ exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
9086
9197
  exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
9087
9198
  exports.ERR_ENCRYPTED = ERR_ENCRYPTED;
9088
9199
  exports.ERR_ENCRYPTED_CENTRAL_DIRECTORY = ERR_ENCRYPTED_CENTRAL_DIRECTORY;
9200
+ exports.ERR_ENTRY_EXISTS = ERR_ENTRY_EXISTS;
9089
9201
  exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
9090
9202
  exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
9091
9203
  exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
@@ -9102,21 +9214,33 @@ exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
9102
9214
  exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
9103
9215
  exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
9104
9216
  exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
9217
+ exports.ERR_INVALID_GID = ERR_INVALID_GID;
9218
+ exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
9219
+ exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
9105
9220
  exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
9106
9221
  exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
9222
+ exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
9223
+ exports.ERR_INVALID_UID = ERR_INVALID_UID;
9107
9224
  exports.ERR_INVALID_UNCOMPRESSED_SIZE = ERR_INVALID_UNCOMPRESSED_SIZE;
9225
+ exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
9226
+ exports.ERR_INVALID_UNIX_ID_SIZE = ERR_INVALID_UNIX_ID_SIZE;
9227
+ exports.ERR_INVALID_UNIX_MODE = ERR_INVALID_UNIX_MODE;
9108
9228
  exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
9109
9229
  exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
9110
9230
  exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
9111
9231
  exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
9232
+ exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
9112
9233
  exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
9113
9234
  exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
9114
9235
  exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
9115
9236
  exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
9116
9237
  exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION$1;
9238
+ exports.ERR_UNSUPPORTED_CONTEXT = ERR_UNSUPPORTED_CONTEXT;
9239
+ exports.ERR_UNSUPPORTED_CRYPTO_API = ERR_UNSUPPORTED_CRYPTO_API;
9117
9240
  exports.ERR_UNSUPPORTED_ENCRYPTION = ERR_UNSUPPORTED_ENCRYPTION;
9118
9241
  exports.ERR_UNSUPPORTED_ENCRYPTION_USDZ = ERR_UNSUPPORTED_ENCRYPTION_USDZ;
9119
9242
  exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
9243
+ exports.ERR_WORKER_STARTUP_TIMEOUT = ERR_WORKER_STARTUP_TIMEOUT;
9120
9244
  exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
9121
9245
  exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
9122
9246
  exports.HttpRangeReader = HttpRangeReader;