@zip.js/zip.js 2.15.0 → 2.16.1

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 (44) hide show
  1. package/BENCHMARKS.md +4 -2
  2. package/deno.json +1 -1
  3. package/dist/zip-core-external.js +410 -227
  4. package/dist/zip-core-external.min.js +1 -1
  5. package/dist/zip-core.js +234 -109
  6. package/dist/zip-core.min.js +1 -1
  7. package/dist/zip-fs-core-external.js +552 -237
  8. package/dist/zip-fs-core-external.min.js +1 -1
  9. package/dist/zip-fs-core.js +377 -118
  10. package/dist/zip-fs-core.min.js +1 -1
  11. package/dist/zip-fs-external.js +552 -237
  12. package/dist/zip-fs-external.min.js +1 -1
  13. package/dist/zip-fs-native.js +379 -120
  14. package/dist/zip-fs-native.min.js +1 -1
  15. package/dist/zip-fs.js +554 -237
  16. package/dist/zip-fs.min.js +1 -1
  17. package/dist/zip-legacy.js +236 -111
  18. package/dist/zip-legacy.min.js +1 -1
  19. package/dist/zip-native.js +236 -111
  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 +411 -228
  24. package/dist/zip.min.js +1 -1
  25. package/eslint.config.mjs +1 -1
  26. package/index-native.cjs +379 -120
  27. package/index-native.min.js +1 -1
  28. package/index.cjs +554 -237
  29. package/index.d.cts +143 -16
  30. package/index.d.ts +143 -16
  31. package/index.min.js +1 -1
  32. package/lib/core/io.js +3 -2
  33. package/lib/core/streams/aes-crypto-stream.js +60 -17
  34. package/lib/core/streams/zip-crypto-stream.js +7 -7
  35. package/lib/core/streams/zip-entry-stream.js +146 -73
  36. package/lib/core/streams/zlib-wasm/zlib-streams.js +176 -118
  37. package/lib/core/util/compatible-streams.js +10 -5
  38. package/lib/core/version.js +1 -1
  39. package/lib/core/web-worker-inline-native.js +1 -1
  40. package/lib/core/web-worker-inline-wasm.js +1 -1
  41. package/lib/core/zip-fs.js +144 -10
  42. package/lib/core/zip-reader.js +5 -5
  43. package/lib/core/zip-writer.js +4 -2
  44. package/package.json +3 -2
package/index-native.cjs CHANGED
@@ -217,7 +217,7 @@ const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
217
217
  const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
218
218
  const ERR_INVALID_PASS_THROUGH_VALUE = "Invalid passThrough option (must be a boolean or 'compressed')";
219
219
  const ERR_ABORTED = "The operation was aborted";
220
- const ABORT_ERROR_NAME = "AbortError";
220
+ const ABORT_ERROR_NAME$1 = "AbortError";
221
221
 
222
222
  function checkFunctionOption(value) {
223
223
  if (value && typeof value != FUNCTION_TYPE) {
@@ -235,7 +235,7 @@ function checkSignalOption(signal) {
235
235
 
236
236
  function throwIfAborted(signal) {
237
237
  if (signal && signal.aborted) {
238
- throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME) : signal.reason;
238
+ throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME$1) : signal.reason;
239
239
  }
240
240
  }
241
241
 
@@ -439,7 +439,7 @@ function resetConfiguration() {
439
439
  Object.assign(config, DEFAULT_CONFIGURATION);
440
440
  }
441
441
 
442
- 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],r=[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],c=[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],t=[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],e=new Uint8Array(288);e.fill(8,0,144),e.fill(9,144,256),e.fill(7,256,280),e.fill(8,280,288);const u=new Uint8Array(30).fill(5);function f(n){const r=new Uint16Array(16);for(const c of n)r[c]++;r[0]=0;const c=new Uint16Array(17);for(let n=1;n<=15;n++)c[n+1]=c[n]+r[n];const t=new Uint16Array(n.length);for(let r=0;r<n.length;r++)n[r]&&(t[c[n[r]]++]=r);return {lengthCounts:r,symbols:t}}const i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o=(v=()=>function(i){let o=0,v=0,O=0,E=new Uint8Array(1024),l=0,C=0;for(;!C;){C=g(1);const n=g(2);if(0==n)B();else if(1==n)V(f(e),f(u));else {if(2!=n)throw new Error("invalid deflate block type");V(...L());}}return E.subarray(0,l);function W(){if(o>=i.length)throw new Error("unexpected end of deflate data");return i[o++]}function g(n){for(;O<n;)v|=W()<<O,O+=8;const r=v&(1<<n)-1;return v>>>=n,O-=n,r}function B(){v=0,O=0;const n=W()|W()<<8;o+=2,b(l+n);for(let r=0;r<n;r++)E[l++]=W();}function V(s,e){let u=a(s);for(;256!=u;){if(u<256)b(l+1),E[l++]=u;else {const s=u-257,f=n[s]+g(r[s]),i=a(e),o=c[i]+g(t[i]);b(l+f);const v=l-o;for(let n=0;n<f;n++)E[l++]=E[v+n];}u=a(s);}}function L(){const n=g(5)+257,r=g(5)+1,c=g(4)+4,t=new Uint8Array(19);for(let n=0;n<c;n++)t[s[n]]=g(3);const e=f(t),u=new Uint8Array(n+r);let i=0;for(;i<u.length;){const n=a(e);if(n<16)u[i++]=n;else if(16==n){const n=u[i-1];let r=g(2)+3;for(;r--;)u[i++]=n;}else i+=17==n?g(3)+3:g(7)+11;}return [f(u.subarray(0,n)),f(u.subarray(n))]}function a(n){const{lengthCounts:r,symbols:c}=n;let t=0,s=0,e=0;for(let n=1;n<=15;n++){t|=g(1);const u=r[n];if(t-s<u)return c[e+(t-s)];e+=u,s=s+u<<1,t<<=1;}throw new Error("invalid huffman code")}function b(n){if(E.length<n){let r=2*E.length;for(;r<n;)r*=2;const c=new Uint8Array(r);c.set(E.subarray(0,l)),E=c;}}}(function(n){const r=(n=String(n).replace(/[^A-Za-z0-9+/=]/g,"")).length,c=[];for(let t=0;t<r;t+=4){const r=i.indexOf(n[t])<<18|i.indexOf(n[t+1])<<12|(63&i.indexOf(n[t+2]))<<6|63&i.indexOf(n[t+3]);c.push(r>>16&255),"="!==n[t+2]&&c.push(r>>8&255),"="!==n[t+3]&&c.push(255&r);}return new Uint8Array(c)}("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")),n=>n({workerURI:n=>{const r="text/javascript";let c=v();if("string"==typeof c&&(c=(new TextEncoder).encode(c)),n){const n=new Blob([c],{type:r});return URL.createObjectURL(n)}return "data:"+r+";base64,"+function(n){let r="";const c=n.length;let t=0;for(;t+2<c;t+=3){const c=n[t]<<16|n[t+1]<<8|n[t+2];r+=i[c>>18&63]+i[c>>12&63]+i[c>>6&63]+i[63&c];}const s=c-t;if(1===s){const c=n[t]<<16;r+=i[c>>18&63]+i[c>>12&63]+"==";}else if(2===s){const c=n[t]<<16|n[t+1]<<8;r+=i[c>>18&63]+i[c>>12&63]+i[c>>6&63]+"=";}return r}(c)}}));var v;
442
+ 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],t=[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],r=[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],o=[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],V=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],L$1=new Uint8Array(288);L$1.fill(8,0,144),L$1.fill(9,144,256),L$1.fill(7,256,280),L$1.fill(8,280,288);const a=new Uint8Array(30).fill(5);function l(n){const t=new Uint16Array(16);for(const r of n)t[r]++;t[0]=0;const r=new Uint16Array(17);for(let n=1;n<=15;n++)r[n+1]=r[n]+t[n];const o=new Uint16Array(n.length);for(let t=0;t<n.length;t++)n[t]&&(o[r[n[t]]++]=t);return {lengthCounts:t,symbols:o}}const s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",f=(C$1=()=>function(s){let f=0,C=0,K=0,u=new Uint8Array(1024),e=0,g=0;for(;!g;){g=h(1);const n=h(2);if(0==n)q();else if(1==n)b(l(L$1),l(a));else {if(2!=n)throw new Error("invalid deflate block type");b(...c());}}return u.subarray(0,e);function J(){if(f>=s.length)throw new Error("unexpected end of deflate data");return s[f++]}function h(n){for(;K<n;)C|=J()<<K,K+=8;const t=C&(1<<n)-1;return C>>>=n,K-=n,t}function q(){C=0,K=0;const n=J()|J()<<8;f+=2,A(e+n);for(let t=0;t<n;t++)u[e++]=J();}function b(V,L){let a=W(V);for(;256!=a;){if(a<256)A(e+1),u[e++]=a;else {const V=a-257,l=n[V]+h(t[V]),s=W(L),f=r[s]+h(o[s]);A(e+l);const C=e-f;for(let n=0;n<l;n++)u[e++]=u[C+n];}a=W(V);}}function c(){const n=h(5)+257,t=h(5)+1,r=h(4)+4,o=new Uint8Array(19);for(let n=0;n<r;n++)o[V[n]]=h(3);const L=l(o),a=new Uint8Array(n+t);let s=0;for(;s<a.length;){const n=W(L);if(n<16)a[s++]=n;else if(16==n){const n=a[s-1];let t=h(2)+3;for(;t--;)a[s++]=n;}else s+=17==n?h(3)+3:h(7)+11;}return [l(a.subarray(0,n)),l(a.subarray(n))]}function W(n){const{lengthCounts:t,symbols:r}=n;let o=0,V=0,L=0;for(let n=1;n<=15;n++){o|=h(1);const a=t[n];if(o-V<a)return r[L+(o-V)];L+=a,V=V+a<<1,o<<=1;}throw new Error("invalid huffman code")}function A(n){if(u.length<n){let t=2*u.length;for(;t<n;)t*=2;const r=new Uint8Array(t);r.set(u.subarray(0,e)),u=r;}}}(function(n){const t=(n=String(n).replace(/[^A-Za-z0-9+/=]/g,"")).length,r=[];for(let o=0;o<t;o+=4){const t=s.indexOf(n[o])<<18|s.indexOf(n[o+1])<<12|(63&s.indexOf(n[o+2]))<<6|63&s.indexOf(n[o+3]);r.push(t>>16&255),"="!==n[o+2]&&r.push(t>>8&255),"="!==n[o+3]&&r.push(255&t);}return new Uint8Array(r)}("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")),n=>n({workerURI:n=>{const t="text/javascript";let r=C$1();if("string"==typeof r&&(r=(new TextEncoder).encode(r)),n){const n=new Blob([r],{type:t});return URL.createObjectURL(n)}return "data:"+t+";base64,"+function(n){let t="";const r=n.length;let o=0;for(;o+2<r;o+=3){const r=n[o]<<16|n[o+1]<<8|n[o+2];t+=s[r>>18&63]+s[r>>12&63]+s[r>>6&63]+s[63&r];}const V=r-o;if(1===V){const r=n[o]<<16;t+=s[r>>18&63]+s[r>>12&63]+"==";}else if(2===V){const r=n[o]<<16|n[o+1]<<8;t+=s[r>>18&63]+s[r>>12&63]+s[r>>6&63]+"=";}return t}(r)}}));var C$1;
443
443
 
444
444
  /*
445
445
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -1279,12 +1279,12 @@ let createEngine = createEngine$1;
1279
1279
  class AESDecryptionStream extends TransformStream {
1280
1280
 
1281
1281
  constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly, checkAuthenticationCode = true }) {
1282
+ const aesCrypto = {};
1282
1283
  super({
1283
1284
  start() {
1284
- initAesCrypto(this, password, rawPassword, encryptionStrength);
1285
+ initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength);
1285
1286
  },
1286
1287
  async transform(chunk, controller) {
1287
- const aesCrypto = this;
1288
1288
  const {
1289
1289
  password,
1290
1290
  strength,
@@ -1303,6 +1303,9 @@ class AESDecryptionStream extends TransformStream {
1303
1303
  } else {
1304
1304
  await ready;
1305
1305
  }
1306
+ if (aesCrypto.discarded) {
1307
+ return;
1308
+ }
1306
1309
  const output = new Uint8Array(chunk.length - AUTHENTICATION_CODE_LENGTH - ((chunk.length - AUTHENTICATION_CODE_LENGTH) % BLOCK_LENGTH));
1307
1310
  controller.enqueue(append(aesCrypto, chunk, output, 0, AUTHENTICATION_CODE_LENGTH, true));
1308
1311
  },
@@ -1311,9 +1314,12 @@ class AESDecryptionStream extends TransformStream {
1311
1314
  engine,
1312
1315
  pendingInput,
1313
1316
  ready
1314
- } = this;
1317
+ } = aesCrypto;
1315
1318
  if (engine) {
1316
1319
  await ready;
1320
+ if (aesCrypto.discarded) {
1321
+ return;
1322
+ }
1317
1323
  const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
1318
1324
  const decryptedChunkArray = new Uint8Array(subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH));
1319
1325
  engine.process(decryptedChunkArray, true);
@@ -1323,27 +1329,26 @@ class AESDecryptionStream extends TransformStream {
1323
1329
  invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
1324
1330
  }
1325
1331
  if (invalidAuthenticationCode && checkAuthenticationCode) {
1326
- throw new Error(ERR_INVALID_AUTHENTICATION_CODE);
1332
+ controller.error(new Error(ERR_INVALID_AUTHENTICATION_CODE));
1333
+ return;
1327
1334
  }
1328
1335
  controller.enqueue(decryptedChunkArray);
1329
1336
  }
1330
- },
1331
- cancel() {
1332
- disposeEngine(this);
1333
1337
  }
1334
1338
  });
1339
+ setDisposingReadable(this, aesCrypto);
1335
1340
  }
1336
1341
  }
1337
1342
 
1338
1343
  class AESEncryptionStream extends TransformStream {
1339
1344
 
1340
1345
  constructor({ password, rawPassword, encryptionStrength }) {
1346
+ const aesCrypto = {};
1341
1347
  super({
1342
1348
  start() {
1343
- initAesCrypto(this, password, rawPassword, encryptionStrength);
1349
+ initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength);
1344
1350
  },
1345
1351
  async transform(chunk, controller) {
1346
- const aesCrypto = this;
1347
1352
  const {
1348
1353
  password,
1349
1354
  strength,
@@ -1357,6 +1362,9 @@ class AESEncryptionStream extends TransformStream {
1357
1362
  } else {
1358
1363
  await ready;
1359
1364
  }
1365
+ if (aesCrypto.discarded) {
1366
+ return;
1367
+ }
1360
1368
  const output = new Uint8Array(preamble.length + chunk.length - (chunk.length % BLOCK_LENGTH));
1361
1369
  output.set(preamble, 0);
1362
1370
  controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0, false));
@@ -1366,19 +1374,20 @@ class AESEncryptionStream extends TransformStream {
1366
1374
  engine,
1367
1375
  pendingInput,
1368
1376
  ready
1369
- } = this;
1377
+ } = aesCrypto;
1370
1378
  if (engine) {
1371
1379
  await ready;
1380
+ if (aesCrypto.discarded) {
1381
+ return;
1382
+ }
1372
1383
  const encryptedChunkArray = new Uint8Array(pendingInput);
1373
1384
  engine.process(encryptedChunkArray, false);
1374
1385
  const authenticationCode = subarray(engine.digest(), 0, AUTHENTICATION_CODE_LENGTH);
1375
1386
  controller.enqueue(concat(encryptedChunkArray, authenticationCode));
1376
1387
  }
1377
- },
1378
- cancel() {
1379
- disposeEngine(this);
1380
1388
  }
1381
1389
  });
1390
+ setDisposingReadable(this, aesCrypto);
1382
1391
  }
1383
1392
  }
1384
1393
 
@@ -1387,7 +1396,37 @@ function initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength) {
1387
1396
  ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
1388
1397
  password: encodePassword(password, rawPassword),
1389
1398
  strength: encryptionStrength - 1,
1390
- pendingInput: EMPTY_UINT8_ARRAY
1399
+ pendingInput: EMPTY_UINT8_ARRAY,
1400
+ discarded: false
1401
+ });
1402
+ }
1403
+
1404
+ function setDisposingReadable(stream, aesCrypto) {
1405
+ const reader = stream.readable.getReader();
1406
+ const readable = new ReadableStream({
1407
+ async pull(controller) {
1408
+ try {
1409
+ const { value, done } = await reader.read();
1410
+ if (done) {
1411
+ controller.close();
1412
+ } else {
1413
+ controller.enqueue(value);
1414
+ }
1415
+ } catch (error) {
1416
+ disposeEngine(aesCrypto);
1417
+ reader.cancel(error).catch(() => { });
1418
+ throw error;
1419
+ }
1420
+ },
1421
+ cancel(reason) {
1422
+ disposeEngine(aesCrypto);
1423
+ return reader.cancel(reason);
1424
+ }
1425
+ });
1426
+ Object.defineProperty(stream, "readable", {
1427
+ get() {
1428
+ return readable;
1429
+ }
1391
1430
  });
1392
1431
  }
1393
1432
 
@@ -1420,7 +1459,9 @@ async function createDecryptionKeys(decrypt, strength, password, preamble) {
1420
1459
  }
1421
1460
  }
1422
1461
 
1423
- function disposeEngine({ engine }) {
1462
+ function disposeEngine(aesCrypto) {
1463
+ const { engine } = aesCrypto;
1464
+ aesCrypto.discarded = true;
1424
1465
  if (engine && engine.dispose) {
1425
1466
  engine.dispose();
1426
1467
  }
@@ -1437,6 +1478,9 @@ async function createKeys$1(aesCrypto, strength, password, salt) {
1437
1478
  const keyLength = KEY_LENGTH[strength];
1438
1479
  const compositeKey = await deriveKey(password, salt, keyLength * 2 + PASSWORD_VERIFICATION_LENGTH);
1439
1480
  aesCrypto.engine = createEngine(subarray(compositeKey, 0, keyLength), subarray(compositeKey, keyLength, keyLength * 2));
1481
+ if (aesCrypto.discarded) {
1482
+ disposeEngine(aesCrypto);
1483
+ }
1440
1484
  return subarray(compositeKey, keyLength * 2);
1441
1485
  }
1442
1486
 
@@ -1588,11 +1632,11 @@ function encrypt(target, input) {
1588
1632
  }
1589
1633
 
1590
1634
  function createKeys(target, password, rawPassword) {
1591
- const keys = [0x12345678, 0x23456789, 0x34567890];
1635
+ const cryptoKeys = [0x12345678, 0x23456789, 0x34567890];
1592
1636
  Object.assign(target, {
1593
- keys,
1594
- crcKey0: new Crc32(keys[0]),
1595
- crcKey2: new Crc32(keys[2])
1637
+ cryptoKeys,
1638
+ crcKey0: new Crc32(cryptoKeys[0]),
1639
+ crcKey2: new Crc32(cryptoKeys[2])
1596
1640
  });
1597
1641
  if (rawPassword) {
1598
1642
  for (let index = 0; index < rawPassword.length; index++) {
@@ -1606,17 +1650,17 @@ function createKeys(target, password, rawPassword) {
1606
1650
  }
1607
1651
 
1608
1652
  function updateKeys(target, byte) {
1609
- let [, key1] = target.keys;
1653
+ let [, key1] = target.cryptoKeys;
1610
1654
  target.crcKey0.append([byte]);
1611
1655
  const key0 = ~target.crcKey0.get();
1612
1656
  key1 = getInt32(Math.imul(getInt32(key1 + getInt8(key0)), 134775813) + 1);
1613
1657
  target.crcKey2.append([key1 >>> 24]);
1614
1658
  const key2 = ~target.crcKey2.get();
1615
- target.keys = [key0, key1, key2];
1659
+ target.cryptoKeys = [key0, key1, key2];
1616
1660
  }
1617
1661
 
1618
1662
  function getByte(target) {
1619
- const temp = target.keys[2] | 2;
1663
+ const temp = target.cryptoKeys[2] | 2;
1620
1664
  return getInt8(Math.imul(temp, (temp ^ 1)) >>> 8);
1621
1665
  }
1622
1666
 
@@ -1664,11 +1708,16 @@ function toCompatibleReadable(readable) {
1664
1708
  const reader = readable.getReader();
1665
1709
  return new ReadableStream({
1666
1710
  async pull(controller) {
1667
- const { value, done } = await reader.read();
1668
- if (done) {
1669
- controller.close();
1670
- } else {
1671
- controller.enqueue(value);
1711
+ try {
1712
+ const { value, done } = await reader.read();
1713
+ if (done) {
1714
+ controller.close();
1715
+ } else {
1716
+ controller.enqueue(value);
1717
+ }
1718
+ } catch (error) {
1719
+ reader.cancel(error).catch(() => { });
1720
+ throw error;
1672
1721
  }
1673
1722
  },
1674
1723
  cancel(reason) {
@@ -1854,7 +1903,6 @@ const FORMAT_GZIP = "gzip";
1854
1903
  const GZIP_HEADER_LENGTH = 10;
1855
1904
  const GZIP_TRAILER_LENGTH = 8;
1856
1905
  const GZIP_HEADER_BYTES = [0x1f, 0x8b, 0x08];
1857
- const GZIP_OUTPUT_STALL_TIMEOUT = 5000;
1858
1906
 
1859
1907
  class DeflateStream extends TransformStream {
1860
1908
 
@@ -1865,7 +1913,7 @@ class DeflateStream extends TransformStream {
1865
1913
  let crc32Stream, encryptionStream, gzipCrc32Stream;
1866
1914
  let readable = super.readable;
1867
1915
  const codecStreams = format && getCodecStreams(format);
1868
- const GzipCompressionStream = getGzipCompressionStream(useCompressionStream, CompressionStream, CompressionStreamFallback);
1916
+ const GzipCompressionStream = getGzipCodecStream(useCompressionStream, CompressionStream, CompressionStreamFallback);
1869
1917
  const useGzipCrc32 = computeCrc32 && compressed && !deflate64 && !codecStreams && (!encrypted || zipCrypto) && Boolean(GzipCompressionStream);
1870
1918
  if ((!encrypted || zipCrypto) && computeCrc32 && !useGzipCrc32) {
1871
1919
  crc32Stream = new Crc32Stream();
@@ -1882,6 +1930,9 @@ class DeflateStream extends TransformStream {
1882
1930
  try {
1883
1931
  readable = pipeThroughCompressionStream(readable, useCompressionStream, { level, chunkSize }, CompressionStream, CompressionStreamFallback);
1884
1932
  } catch (error) {
1933
+ if (!useCompressionStream && CompressionStreamFallback) {
1934
+ throw error;
1935
+ }
1885
1936
  let gzipStream;
1886
1937
  try {
1887
1938
  gzipStream = new CompressionStream(FORMAT_GZIP);
@@ -1951,74 +2002,134 @@ class GzipToRawDeflateStream extends TransformStream {
1951
2002
  }
1952
2003
 
1953
2004
  function pipeThroughGzipDecompressionStream(readable, gzipStream, outputSize, crc32) {
2005
+ const writer = gzipStream.writable.getWriter();
2006
+ const reader = gzipStream.readable.getReader();
2007
+ const outputCrc32 = crc32 === UNDEFINED_VALUE ? new Crc32() : UNDEFINED_VALUE;
1954
2008
  let outputLength = 0;
1955
2009
  let inputDone = false;
1956
- let watchdogTimeout;
2010
+ let trailerWritten = false;
2011
+ let idleCheckArmed = false;
2012
+ let readCount = 0;
2013
+ let readPending = false;
1957
2014
  let resolveTrailerReady, rejectTrailerReady;
1958
2015
  const trailerReady = new Promise((resolve, reject) => {
1959
2016
  resolveTrailerReady = resolve;
1960
2017
  rejectTrailerReady = reject;
1961
2018
  });
1962
2019
  trailerReady.catch(() => { });
1963
- if (!outputSize) {
1964
- resolveTrailerReady();
1965
- }
1966
- const gzipWrapStream = new TransformStream({
1967
- start(controller) {
2020
+ pump();
2021
+ return new ReadableStream({
2022
+ async pull(controller) {
2023
+ try {
2024
+ const { value, done } = await read();
2025
+ if (done) {
2026
+ controller.close();
2027
+ } else {
2028
+ outputLength += value.length;
2029
+ if (outputLength > outputSize) {
2030
+ throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
2031
+ }
2032
+ if (outputCrc32) {
2033
+ outputCrc32.append(value);
2034
+ }
2035
+ controller.enqueue(value);
2036
+ }
2037
+ } catch (error) {
2038
+ rejectTrailerReady(error);
2039
+ await cancel(reader, error);
2040
+ throw trailerWritten ? getTrailerError(error) : error;
2041
+ }
2042
+ },
2043
+ cancel(reason) {
2044
+ rejectTrailerReady(reason);
2045
+ return reader.cancel(reason);
2046
+ }
2047
+ });
2048
+
2049
+ async function pump() {
2050
+ const inputReader = readable.getReader();
2051
+ try {
1968
2052
  const header = new Uint8Array(GZIP_HEADER_LENGTH);
1969
2053
  header.set(GZIP_HEADER_BYTES);
1970
- controller.enqueue(header);
1971
- },
1972
- transform(chunk, controller) {
1973
- controller.enqueue(chunk);
1974
- },
1975
- async flush(controller) {
2054
+ await writer.write(header);
2055
+ for (; ;) {
2056
+ await writer.ready;
2057
+ const { value, done } = await inputReader.read();
2058
+ if (done) {
2059
+ break;
2060
+ }
2061
+ await writer.write(value);
2062
+ }
1976
2063
  inputDone = true;
1977
- startWatchdog();
1978
- try {
2064
+ if (outputCrc32) {
2065
+ if (readPending) {
2066
+ armIdleCheck();
2067
+ }
1979
2068
  await trailerReady;
1980
- } finally {
1981
- stopWatchdog();
1982
2069
  }
1983
2070
  const trailer = new Uint8Array(GZIP_TRAILER_LENGTH);
1984
2071
  const dataView = getDataView(trailer);
1985
- dataView.setUint32(0, crc32.get(), true);
2072
+ dataView.setUint32(0, outputCrc32 ? outputCrc32.get() : crc32, true);
1986
2073
  dataView.setUint32(4, outputSize, true);
1987
- controller.enqueue(trailer);
1988
- },
1989
- cancel(reason) {
1990
- rejectTrailerReady(reason);
2074
+ trailerWritten = true;
2075
+ await writer.write(trailer);
2076
+ await writer.close();
2077
+ } catch (error) {
2078
+ await abort(writer, error);
2079
+ await cancel(inputReader, error);
1991
2080
  }
1992
- });
1993
- const outputStream = new TransformStream({
1994
- transform(chunk, controller) {
1995
- crc32.append(chunk);
1996
- outputLength += chunk.length;
1997
- if (outputLength >= outputSize) {
1998
- resolveTrailerReady();
1999
- } else if (inputDone) {
2000
- startWatchdog();
2001
- }
2002
- controller.enqueue(chunk);
2003
- },
2004
- cancel(reason) {
2005
- rejectTrailerReady(reason);
2081
+ }
2082
+
2083
+ function read() {
2084
+ readCount++;
2085
+ readPending = true;
2086
+ const result = reader.read();
2087
+ result.then(onReadSettled, onReadSettled);
2088
+ if (inputDone && outputCrc32) {
2089
+ armIdleCheck();
2006
2090
  }
2007
- });
2008
- readable = pipeThrough(readable, gzipWrapStream);
2009
- readable = pipeThroughBackpressured(readable, gzipStream);
2010
- return pipeThrough(readable, outputStream);
2091
+ return result;
2092
+ }
2011
2093
 
2012
- function startWatchdog() {
2013
- stopWatchdog();
2014
- watchdogTimeout = setTimeout(() => rejectTrailerReady(new Error(ERR_INVALID_UNCOMPRESSED_SIZE)), GZIP_OUTPUT_STALL_TIMEOUT);
2094
+ function onReadSettled() {
2095
+ readPending = false;
2015
2096
  }
2016
2097
 
2017
- function stopWatchdog() {
2018
- clearTimeout(watchdogTimeout);
2098
+ async function armIdleCheck() {
2099
+ if (!idleCheckArmed) {
2100
+ idleCheckArmed = true;
2101
+ const count = readCount;
2102
+ await nextTask();
2103
+ idleCheckArmed = false;
2104
+ if (readPending) {
2105
+ if (readCount == count) {
2106
+ resolveTrailerReady();
2107
+ } else {
2108
+ armIdleCheck();
2109
+ }
2110
+ }
2111
+ }
2112
+ }
2113
+
2114
+ function getTrailerError(error) {
2115
+ const trailerError = new Error(outputLength == outputSize ? ERR_INVALID_CRC32 : ERR_INVALID_UNCOMPRESSED_SIZE);
2116
+ trailerError.cause = error;
2117
+ return trailerError;
2019
2118
  }
2020
2119
  }
2021
2120
 
2121
+ function nextTask() {
2122
+ return new Promise(resolve => {
2123
+ const { port1, port2 } = new MessageChannel();
2124
+ port2.onmessage = () => {
2125
+ port1.close();
2126
+ port2.close();
2127
+ resolve();
2128
+ };
2129
+ port1.postMessage(UNDEFINED_VALUE);
2130
+ });
2131
+ }
2132
+
2022
2133
  class InflateStream extends TransformStream {
2023
2134
 
2024
2135
  constructor(options, { chunkSize, DecompressionStreamFallback, DecompressionStream }) {
@@ -2039,20 +2150,32 @@ class InflateStream extends TransformStream {
2039
2150
  if (codecStreams) {
2040
2151
  readable = pipeThroughBackpressured(readable, createCodecStream(codecStreams.DecompressionStream, format, { chunkSize, compressionMethod, rawBitFlag, uncompressedSize: outputSize }));
2041
2152
  } else {
2042
- try {
2043
- readable = pipeThroughCompressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamFallback);
2044
- } catch (error) {
2045
- if (deflate64 || outputSize === UNDEFINED_VALUE) {
2046
- throw error;
2047
- }
2048
- let gzipStream;
2153
+ let gzipStream;
2154
+ const GzipDecompressionStream = getGzipCodecStream(useCompressionStream, DecompressionStream, DecompressionStreamFallback);
2155
+ if (checkCrc32 && !deflate64 && crc32 !== UNDEFINED_VALUE && outputSize !== UNDEFINED_VALUE && GzipDecompressionStream) {
2049
2156
  try {
2050
- gzipStream = new DecompressionStream(FORMAT_GZIP);
2157
+ gzipStream = new GzipDecompressionStream(FORMAT_GZIP, { chunkSize });
2051
2158
  } catch {
2052
- throw error;
2159
+ gzipStream = UNDEFINED_VALUE;
2053
2160
  }
2054
- gzipCrc32 = new Crc32();
2055
- readable = pipeThroughGzipDecompressionStream(readable, gzipStream, outputSize, gzipCrc32);
2161
+ }
2162
+ if (!gzipStream) {
2163
+ try {
2164
+ readable = pipeThroughCompressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamFallback);
2165
+ } catch (error) {
2166
+ if (deflate64 || outputSize === UNDEFINED_VALUE || (!useCompressionStream && DecompressionStreamFallback)) {
2167
+ throw error;
2168
+ }
2169
+ try {
2170
+ gzipStream = new DecompressionStream(FORMAT_GZIP);
2171
+ } catch {
2172
+ throw error;
2173
+ }
2174
+ }
2175
+ }
2176
+ if (gzipStream) {
2177
+ gzipCrc32 = true;
2178
+ readable = pipeThroughGzipDecompressionStream(readable, gzipStream, outputSize, crc32);
2056
2179
  }
2057
2180
  }
2058
2181
  readable = mapInflateStreamError(readable);
@@ -2062,8 +2185,8 @@ class InflateStream extends TransformStream {
2062
2185
  readable = pipeThrough(readable, crc32Stream);
2063
2186
  }
2064
2187
  setReadable(this, readable, () => {
2065
- if (checkCrc32) {
2066
- const computedCrc32 = gzipCrc32 ? gzipCrc32.get() >>> 0 : new DataView(crc32Stream.value.buffer).getUint32(0, false);
2188
+ if (crc32Stream) {
2189
+ const computedCrc32 = new DataView(crc32Stream.value.buffer).getUint32(0, false);
2067
2190
  if (crc32 != computedCrc32) {
2068
2191
  throw new Error(ERR_INVALID_CRC32);
2069
2192
  }
@@ -2120,11 +2243,11 @@ function createCodecStream(CodecStreamClass, format, options) {
2120
2243
  return new CodecStreamClass(format, options);
2121
2244
  }
2122
2245
 
2123
- function getGzipCompressionStream(useCompressionStream, CompressionStreamNative, CompressionStreamFallback) {
2124
- if (useCompressionStream && CompressionStreamNative) {
2125
- return CompressionStreamNative;
2126
- } else if (CompressionStreamFallback && CompressionStreamFallback.requiresModule) {
2127
- return CompressionStreamFallback;
2246
+ function getGzipCodecStream(useCompressionStream, CodecStreamNative, CodecStreamFallback) {
2247
+ if (useCompressionStream && CodecStreamNative) {
2248
+ return CodecStreamNative;
2249
+ } else if (CodecStreamFallback && CodecStreamFallback.requiresModule) {
2250
+ return CodecStreamFallback;
2128
2251
  }
2129
2252
  }
2130
2253
 
@@ -2194,10 +2317,15 @@ function mapInflateStreamError(readable) {
2194
2317
  const reader = readable.getReader();
2195
2318
  return new ReadableStream({
2196
2319
  async pull(controller) {
2197
- let result;
2198
2320
  try {
2199
- result = await reader.read();
2321
+ const { value, done } = await reader.read();
2322
+ if (done) {
2323
+ controller.close();
2324
+ } else {
2325
+ controller.enqueue(value);
2326
+ }
2200
2327
  } catch (error) {
2328
+ await cancel(reader, error);
2201
2329
  if (error && error.message) {
2202
2330
  throw error;
2203
2331
  }
@@ -2205,12 +2333,6 @@ function mapInflateStreamError(readable) {
2205
2333
  mappedError.cause = error;
2206
2334
  throw mappedError;
2207
2335
  }
2208
- const { value, done } = result;
2209
- if (done) {
2210
- controller.close();
2211
- } else {
2212
- controller.enqueue(value);
2213
- }
2214
2336
  },
2215
2337
  cancel(reason) {
2216
2338
  return reader.cancel(reason);
@@ -3722,10 +3844,11 @@ class FetchReader extends Reader {
3722
3844
 
3723
3845
  createReadable(options) {
3724
3846
  const reader = this;
3725
- const { useRangeHeader, forceRangeRequests, size } = reader;
3847
+ const { useRangeHeader, forceRangeRequests, size, eocdCache } = reader;
3726
3848
  if ((useRangeHeader || forceRangeRequests) && size !== UNDEFINED_VALUE) {
3727
3849
  const { offset = 0, size: readSize = size - offset } = options || {};
3728
- if (readSize > 0 && offset < size) {
3850
+ const cached = eocdCache && offset >= size - eocdCache.length;
3851
+ if (readSize > 0 && offset < size && !cached) {
3729
3852
  return createRangeReadable(reader, offset, Math.min(readSize, size - offset));
3730
3853
  }
3731
3854
  }
@@ -5284,8 +5407,8 @@ let ZipEntry$1 = class ZipEntry {
5284
5407
  const passThroughCompression = Boolean(passThrough);
5285
5408
  const passThroughEncryption = passThrough === true;
5286
5409
  checkPasswordOption(password, rawPassword);
5287
- password = password && password.length && password;
5288
- rawPassword = rawPassword && rawPassword.length && rawPassword;
5410
+ password = password && password.length ? password : UNDEFINED_VALUE;
5411
+ rawPassword = rawPassword && rawPassword.length ? rawPassword : UNDEFINED_VALUE;
5289
5412
  if (extraFieldAES) {
5290
5413
  if (extraFieldAES.originalCompressionMethod != COMPRESSION_METHOD_AES) {
5291
5414
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
@@ -6046,7 +6169,7 @@ function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
6046
6169
  async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDataSize) {
6047
6170
  const { size } = reader;
6048
6171
  const anchoredLength = Math.min(size, END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS);
6049
- const remoteProbeBudget = { count: MAX_END_OF_CENTRAL_DIR_PROBES };
6172
+ const remoteProbeBudget = { remaining: MAX_END_OF_CENTRAL_DIR_PROBES };
6050
6173
  let endOfDirectoryInfo;
6051
6174
  let plausibleEndOfDirectoryInfo;
6052
6175
  let endOfDirectoryReachingEndCount = 0;
@@ -6139,8 +6262,8 @@ async function readSignature(reader, view, anchoredOffset, signatureOffset, size
6139
6262
  if (signatureOffset >= anchoredOffset) {
6140
6263
  return getUint32$1(view, signatureOffset - anchoredOffset);
6141
6264
  }
6142
- if (remoteProbeBudget.count > 0) {
6143
- remoteProbeBudget.count--;
6265
+ if (remoteProbeBudget.remaining > 0) {
6266
+ remoteProbeBudget.remaining--;
6144
6267
  const signatureArray = await readUint8Array(reader, signatureOffset, 4);
6145
6268
  return getUint32$1(getDataView(signatureArray), 0);
6146
6269
  }
@@ -7056,9 +7179,11 @@ function resolveMetadata(zipWriter, name, options) {
7056
7179
  const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
7057
7180
  const passThroughCompression = Boolean(passThrough);
7058
7181
  const passThroughEncryption = passThrough === true;
7059
- const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
7060
- const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
7182
+ let password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
7183
+ let rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
7061
7184
  checkPasswordOption(password, rawPassword);
7185
+ password = password && password.length ? password : UNDEFINED_VALUE;
7186
+ rawPassword = rawPassword && rawPassword.length ? rawPassword : UNDEFINED_VALUE;
7062
7187
  const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
7063
7188
  const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
7064
7189
  const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
@@ -8854,7 +8979,7 @@ function formatSupported(StreamClass, format) {
8854
8979
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8855
8980
  */
8856
8981
 
8857
- const VERSION = "2.15.0";
8982
+ const VERSION = "2.16.1";
8858
8983
 
8859
8984
  /*
8860
8985
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9385,7 +9510,11 @@ const DUPLICATES_VALUES = new Set([DUPLICATES_THROW, DUPLICATES_KEEP_FIRST, DUPL
9385
9510
  const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
9386
9511
  const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
9387
9512
  const ERR_UNSUPPORTED_PASS_THROUGH_VALUE = "The 'compressed' passThrough option is only supported by Entry#getData() and ZipWriter#add()";
9513
+ const ERR_INVALID_PASSWORDS = "Invalid passwords option (must be an array of strings)";
9514
+ const ERR_INVALID_REQUEST_PASSWORD = "Invalid requestPassword option (must be a function returning a string or undefined)";
9388
9515
  const ERR_ABORT_EXPORT = "zipjs-abort-export";
9516
+ const ABORT_ERROR_NAME = "AbortError";
9517
+ const EMPTY_RAW_PASSWORD = new Uint8Array(0);
9389
9518
 
9390
9519
  class ZipEntry {
9391
9520
 
@@ -9758,8 +9887,10 @@ class ZipDirectoryEntry extends ZipEntry {
9758
9887
  zipReader = new ZipReader(reader, options);
9759
9888
  }
9760
9889
  checkPassThroughValue(options.passThrough);
9890
+ checkPasswordCandidatesOptions(options);
9761
9891
  const duplicates = checkDuplicatesOption(options.duplicates);
9762
9892
  const importedEntries = [];
9893
+ const passwordState = { known: [] };
9763
9894
  const entries = await zipReader.getEntries(options);
9764
9895
  for (const entry of entries) {
9765
9896
  let parent = this;
@@ -9804,7 +9935,7 @@ class ZipDirectoryEntry extends ZipEntry {
9804
9935
  }
9805
9936
  importedEntries.push(addChild(parent, name, {
9806
9937
  data: entry,
9807
- Reader: getZipBlobReader(Object.assign({}, options)),
9938
+ Reader: getZipBlobReader(Object.assign({}, options), passwordState),
9808
9939
  uncompressedSize: options.passThrough ? entry.compressedSize : entry.uncompressedSize,
9809
9940
  passThrough: options.passThrough
9810
9941
  }));
@@ -10133,7 +10264,7 @@ function getReadableReader(readable) {
10133
10264
  };
10134
10265
  }
10135
10266
 
10136
- function getZipBlobReader(options) {
10267
+ function getZipBlobReader(options, passwordState) {
10137
10268
  return class extends Reader {
10138
10269
 
10139
10270
  constructor(entry, options = {}) {
@@ -10146,12 +10277,12 @@ function getZipBlobReader(options) {
10146
10277
  const zipBlobReader = this;
10147
10278
  const readerOptions = Object.assign({}, options, zipBlobReader.options);
10148
10279
  const { checkOverlappingEntry, checkOverlappingEntryOnly } = readerOptions;
10149
- const data = await zipBlobReader.entry.getData(new BlobWriter(), Object.assign(readerOptions, {
10280
+ const data = await readEntryData(zipBlobReader.entry, Object.assign(readerOptions, {
10150
10281
  checkPasswordOnly: false,
10151
10282
  checkOverlappingEntry: checkOverlappingEntryOnly || checkOverlappingEntry,
10152
10283
  checkOverlappingEntryOnly: false,
10153
10284
  preventClose: false
10154
- }));
10285
+ }), passwordState);
10155
10286
  zipBlobReader.data = data;
10156
10287
  zipBlobReader.blobReader = new BlobReader(data);
10157
10288
  zipBlobReader.size = data.size;
@@ -10213,10 +10344,9 @@ async function initReaders(entry, options) {
10213
10344
  await initStream(reader);
10214
10345
  } catch (error) {
10215
10346
  try {
10347
+ error.entry = child;
10216
10348
  error.entryId = child.id;
10217
- error.cause = {
10218
- entry: child
10219
- };
10349
+ error.entryName = child.getRelativeName(entry);
10220
10350
  } catch {
10221
10351
  // ignored
10222
10352
  }
@@ -10308,10 +10438,136 @@ function checkReaderOptions(readerOptions) {
10308
10438
  }
10309
10439
  if (readerOptions) {
10310
10440
  checkPassThroughValue(readerOptions.passThrough);
10441
+ checkPasswordCandidatesOptions(readerOptions);
10311
10442
  }
10312
10443
  return readerOptions;
10313
10444
  }
10314
10445
 
10446
+ function checkPasswordCandidatesOptions(options) {
10447
+ const { passwords, requestPassword } = options;
10448
+ if (passwords && (!Array.isArray(passwords) || passwords.some(password => typeof password != STRING_TYPE))) {
10449
+ throw new Error(ERR_INVALID_PASSWORDS);
10450
+ }
10451
+ if (requestPassword && typeof requestPassword != FUNCTION_TYPE) {
10452
+ throw new Error(ERR_INVALID_REQUEST_PASSWORD);
10453
+ }
10454
+ }
10455
+
10456
+ async function readEntryData(entry, options, passwordState) {
10457
+ checkPasswordCandidatesOptions(options);
10458
+ const { passwords, requestPassword, signal } = options;
10459
+ options = Object.assign({}, options);
10460
+ delete options.passwords;
10461
+ delete options.requestPassword;
10462
+ if (!entry.encrypted || options.passThrough || (!passwords && !requestPassword)) {
10463
+ return entry.getData(new BlobWriter(), options);
10464
+ }
10465
+ const tried = new Set();
10466
+ let error;
10467
+ while (true) {
10468
+ for (const candidate of getPasswordCandidates(options, passwordState, passwords)) {
10469
+ if (!tried.has(candidate.key)) {
10470
+ const result = await tryPasswordCandidate(candidate);
10471
+ if (result.done) {
10472
+ return result.data;
10473
+ }
10474
+ error = result.error;
10475
+ }
10476
+ }
10477
+ if (!requestPassword) {
10478
+ break;
10479
+ }
10480
+ if (passwordState.pendingPrompt) {
10481
+ await passwordState.pendingPrompt;
10482
+ continue;
10483
+ }
10484
+ let release;
10485
+ passwordState.pendingPrompt = new Promise(resolve => release = resolve);
10486
+ try {
10487
+ const answer = await requestPassword(entry, error);
10488
+ if (answer === UNDEFINED_VALUE || answer === null) {
10489
+ break;
10490
+ }
10491
+ // deno-lint-ignore valid-typeof
10492
+ if (typeof answer != STRING_TYPE) {
10493
+ throw new Error(ERR_INVALID_REQUEST_PASSWORD);
10494
+ }
10495
+ const result = await tryPasswordCandidate(getPasswordCandidate(answer));
10496
+ if (result.done) {
10497
+ return result.data;
10498
+ }
10499
+ error = result.error;
10500
+ } finally {
10501
+ passwordState.pendingPrompt = UNDEFINED_VALUE;
10502
+ release();
10503
+ }
10504
+ }
10505
+ throw new Error(tried.size ? ERR_INVALID_PASSWORD : ERR_ENCRYPTED);
10506
+
10507
+ async function tryPasswordCandidate(candidate) {
10508
+ tried.add(candidate.key);
10509
+ const candidateOptions = Object.assign({}, options, candidate.options);
10510
+ if (entry.zipCrypto) {
10511
+ candidateOptions.checkCrc32 = true;
10512
+ try {
10513
+ await entry.getData(null, Object.assign({}, candidateOptions, { checkPasswordOnly: true }));
10514
+ } catch (probeError) {
10515
+ if (isInvalidPasswordError(probeError)) {
10516
+ return { done: false, error: probeError };
10517
+ }
10518
+ throw probeError;
10519
+ }
10520
+ }
10521
+ try {
10522
+ const data = await entry.getData(new BlobWriter(), candidateOptions);
10523
+ rememberPassword(passwordState, candidate);
10524
+ return { done: true, data };
10525
+ } catch (readError) {
10526
+ if (isAbortError(readError, signal) || (!entry.zipCrypto && !isInvalidPasswordError(readError))) {
10527
+ throw readError;
10528
+ }
10529
+ return { done: false, error: readError };
10530
+ }
10531
+ }
10532
+ }
10533
+
10534
+ function isInvalidPasswordError(error) {
10535
+ return isErrorObject(error) && error.message == ERR_INVALID_PASSWORD;
10536
+ }
10537
+
10538
+ function isAbortError(error, signal) {
10539
+ return Boolean(signal && signal.aborted) || (isErrorObject(error) && error.name == ABORT_ERROR_NAME);
10540
+ }
10541
+
10542
+ function getPasswordCandidates(options, passwordState, passwords) {
10543
+ const candidates = [];
10544
+ const { password, rawPassword } = options;
10545
+ if (rawPassword && rawPassword.length) {
10546
+ candidates.push({ key: rawPassword, options: { password: "", rawPassword } });
10547
+ }
10548
+ if (password) {
10549
+ candidates.push(getPasswordCandidate(password));
10550
+ }
10551
+ candidates.push(...passwordState.known);
10552
+ if (passwords) {
10553
+ candidates.push(...passwords.filter(password => password).map(getPasswordCandidate));
10554
+ }
10555
+ return candidates;
10556
+ }
10557
+
10558
+ function getPasswordCandidate(password) {
10559
+ return { key: password, options: { password, rawPassword: EMPTY_RAW_PASSWORD } };
10560
+ }
10561
+
10562
+ function rememberPassword(passwordState, candidate) {
10563
+ const { known } = passwordState;
10564
+ const index = known.findIndex(knownCandidate => knownCandidate.key === candidate.key);
10565
+ if (index != -1) {
10566
+ known.splice(index, 1);
10567
+ }
10568
+ known.unshift(candidate);
10569
+ }
10570
+
10315
10571
  function checkPassThroughValue(passThrough) {
10316
10572
  if (checkPassThroughOption(passThrough) === PASS_THROUGH_COMPRESSED) {
10317
10573
  throw new Error(ERR_UNSUPPORTED_PASS_THROUGH_VALUE);
@@ -10449,6 +10705,7 @@ function addFileSystemHandle(zipEntry, handle, options) {
10449
10705
  async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
10450
10706
  const { onstart, onprogress, onend } = options;
10451
10707
  checkPassThroughValue(options.passThrough);
10708
+ checkPasswordCandidatesOptions(options);
10452
10709
  const readerOptions = checkReaderOptions(options.readerOptions);
10453
10710
  const abortController = new AbortController();
10454
10711
  const { signal } = abortController;
@@ -10791,7 +11048,7 @@ function decodeMimeTypes(data) {
10791
11048
  */
10792
11049
 
10793
11050
 
10794
- o(setDefaultConfiguration);
11051
+ f(setDefaultConfiguration);
10795
11052
 
10796
11053
  exports.BlobReader = BlobReader;
10797
11054
  exports.BlobWriter = BlobWriter;
@@ -10842,11 +11099,13 @@ exports.ERR_INVALID_MAX_WORKERS = ERR_INVALID_MAX_WORKERS;
10842
11099
  exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
10843
11100
  exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
10844
11101
  exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
11102
+ exports.ERR_INVALID_PASSWORDS = ERR_INVALID_PASSWORDS;
10845
11103
  exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
10846
11104
  exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
10847
11105
  exports.ERR_INVALID_PASS_THROUGH_VALUE = ERR_INVALID_PASS_THROUGH_VALUE;
10848
11106
  exports.ERR_INVALID_READER = ERR_INVALID_READER;
10849
11107
  exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
11108
+ exports.ERR_INVALID_REQUEST_PASSWORD = ERR_INVALID_REQUEST_PASSWORD;
10850
11109
  exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
10851
11110
  exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
10852
11111
  exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;