@zip.js/zip.js 2.16.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 (42) hide show
  1. package/deno.json +1 -1
  2. package/dist/zip-core-external.js +284 -179
  3. package/dist/zip-core-external.min.js +1 -1
  4. package/dist/zip-core.js +108 -61
  5. package/dist/zip-core.min.js +1 -1
  6. package/dist/zip-fs-core-external.js +426 -189
  7. package/dist/zip-fs-core-external.min.js +1 -1
  8. package/dist/zip-fs-core.js +251 -70
  9. package/dist/zip-fs-core.min.js +1 -1
  10. package/dist/zip-fs-external.js +426 -189
  11. package/dist/zip-fs-external.min.js +1 -1
  12. package/dist/zip-fs-native.js +253 -72
  13. package/dist/zip-fs-native.min.js +1 -1
  14. package/dist/zip-fs.js +428 -189
  15. package/dist/zip-fs.min.js +1 -1
  16. package/dist/zip-legacy.js +110 -63
  17. package/dist/zip-legacy.min.js +1 -1
  18. package/dist/zip-native.js +110 -63
  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 +285 -180
  23. package/dist/zip.min.js +1 -1
  24. package/eslint.config.mjs +1 -1
  25. package/index-native.cjs +253 -72
  26. package/index-native.min.js +1 -1
  27. package/index.cjs +428 -189
  28. package/index.d.cts +117 -16
  29. package/index.d.ts +117 -16
  30. package/index.min.js +1 -1
  31. package/lib/core/streams/aes-crypto-stream.js +60 -17
  32. package/lib/core/streams/zip-crypto-stream.js +7 -7
  33. package/lib/core/streams/zip-entry-stream.js +22 -26
  34. package/lib/core/streams/zlib-wasm/zlib-streams.js +176 -118
  35. package/lib/core/util/compatible-streams.js +10 -5
  36. package/lib/core/version.js +1 -1
  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 +144 -10
  40. package/lib/core/zip-reader.js +5 -5
  41. package/lib/core/zip-writer.js +4 -2
  42. package/package.json +3 -2
@@ -223,7 +223,7 @@
223
223
  const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
224
224
  const ERR_INVALID_PASS_THROUGH_VALUE = "Invalid passThrough option (must be a boolean or 'compressed')";
225
225
  const ERR_ABORTED = "The operation was aborted";
226
- const ABORT_ERROR_NAME = "AbortError";
226
+ const ABORT_ERROR_NAME$1 = "AbortError";
227
227
 
228
228
  function checkFunctionOption(value) {
229
229
  if (value && typeof value != FUNCTION_TYPE) {
@@ -241,7 +241,7 @@
241
241
 
242
242
  function throwIfAborted(signal) {
243
243
  if (signal && signal.aborted) {
244
- throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME) : signal.reason;
244
+ throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME$1) : signal.reason;
245
245
  }
246
246
  }
247
247
 
@@ -445,7 +445,7 @@
445
445
  Object.assign(config, DEFAULT_CONFIGURATION);
446
446
  }
447
447
 
448
- 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],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],f=[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 o=new Uint8Array(30).fill(5);function u(n){const r=new Uint16Array(16);for(const t of n)r[t]++;r[0]=0;const t=new Uint16Array(17);for(let n=1;n<=15;n++)t[n+1]=t[n]+r[n];const f=new Uint16Array(n.length);for(let r=0;r<n.length;r++)n[r]&&(f[t[n[r]]++]=r);return {lengthCounts:r,symbols:f}}const h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",g$1=(O=()=>function(h){let g=0,O=0,w=0,l=new Uint8Array(1024),W=0,V=0;for(;!V;){V=c(1);const n=c(2);if(0==n)L();else if(1==n)Y(u(e),u(o));else {if(2!=n)throw new Error("invalid deflate block type");Y(...i());}}return l.subarray(0,W);function y(){if(g>=h.length)throw new Error("unexpected end of deflate data");return h[g++]}function c(n){for(;w<n;)O|=y()<<w,w+=8;const r=O&(1<<n)-1;return O>>>=n,w-=n,r}function L(){O=0,w=0;const n=y()|y()<<8;g+=2,B(W+n);for(let r=0;r<n;r++)l[W++]=y();}function Y(s,e){let o=m(s);for(;256!=o;){if(o<256)B(W+1),l[W++]=o;else {const s=o-257,u=n[s]+c(r[s]),h=m(e),g=t[h]+c(f[h]);B(W+u);const O=W-g;for(let n=0;n<u;n++)l[W++]=l[O+n];}o=m(s);}}function i(){const n=c(5)+257,r=c(5)+1,t=c(4)+4,f=new Uint8Array(19);for(let n=0;n<t;n++)f[s[n]]=c(3);const e=u(f),o=new Uint8Array(n+r);let h=0;for(;h<o.length;){const n=m(e);if(n<16)o[h++]=n;else if(16==n){const n=o[h-1];let r=c(2)+3;for(;r--;)o[h++]=n;}else h+=17==n?c(3)+3:c(7)+11;}return [u(o.subarray(0,n)),u(o.subarray(n))]}function m(n){const{lengthCounts:r,symbols:t}=n;let f=0,s=0,e=0;for(let n=1;n<=15;n++){f|=c(1);const o=r[n];if(f-s<o)return t[e+(f-s)];e+=o,s=s+o<<1,f<<=1;}throw new Error("invalid huffman code")}function B(n){if(l.length<n){let r=2*l.length;for(;r<n;)r*=2;const t=new Uint8Array(r);t.set(l.subarray(0,W)),l=t;}}}(function(n){const r=(n=String(n).replace(/[^A-Za-z0-9+/=]/g,"")).length,t=[];for(let f=0;f<r;f+=4){const r=h.indexOf(n[f])<<18|h.indexOf(n[f+1])<<12|(63&h.indexOf(n[f+2]))<<6|63&h.indexOf(n[f+3]);t.push(r>>16&255),"="!==n[f+2]&&t.push(r>>8&255),"="!==n[f+3]&&t.push(255&r);}return new Uint8Array(t)}("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")),n=>n({workerURI:n=>{const r="text/javascript";let t=O();if("string"==typeof t&&(t=(new TextEncoder).encode(t)),n){const n=new Blob([t],{type:r});return URL.createObjectURL(n)}return "data:"+r+";base64,"+function(n){let r="";const t=n.length;let f=0;for(;f+2<t;f+=3){const t=n[f]<<16|n[f+1]<<8|n[f+2];r+=h[t>>18&63]+h[t>>12&63]+h[t>>6&63]+h[63&t];}const s=t-f;if(1===s){const t=n[f]<<16;r+=h[t>>18&63]+h[t>>12&63]+"==";}else if(2===s){const t=n[f]<<16|n[f+1]<<8;r+=h[t>>18&63]+h[t>>12&63]+h[t>>6&63]+"=";}return r}(t)}}));var O;
448
+ 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;
449
449
 
450
450
  /*
451
451
  Copyright (c) 2026 Gildas Lormeau. All rights reserved.
@@ -1285,12 +1285,12 @@
1285
1285
  class AESDecryptionStream extends TransformStream {
1286
1286
 
1287
1287
  constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly, checkAuthenticationCode = true }) {
1288
+ const aesCrypto = {};
1288
1289
  super({
1289
1290
  start() {
1290
- initAesCrypto(this, password, rawPassword, encryptionStrength);
1291
+ initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength);
1291
1292
  },
1292
1293
  async transform(chunk, controller) {
1293
- const aesCrypto = this;
1294
1294
  const {
1295
1295
  password,
1296
1296
  strength,
@@ -1309,6 +1309,9 @@
1309
1309
  } else {
1310
1310
  await ready;
1311
1311
  }
1312
+ if (aesCrypto.discarded) {
1313
+ return;
1314
+ }
1312
1315
  const output = new Uint8Array(chunk.length - AUTHENTICATION_CODE_LENGTH - ((chunk.length - AUTHENTICATION_CODE_LENGTH) % BLOCK_LENGTH));
1313
1316
  controller.enqueue(append(aesCrypto, chunk, output, 0, AUTHENTICATION_CODE_LENGTH, true));
1314
1317
  },
@@ -1317,9 +1320,12 @@
1317
1320
  engine,
1318
1321
  pendingInput,
1319
1322
  ready
1320
- } = this;
1323
+ } = aesCrypto;
1321
1324
  if (engine) {
1322
1325
  await ready;
1326
+ if (aesCrypto.discarded) {
1327
+ return;
1328
+ }
1323
1329
  const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
1324
1330
  const decryptedChunkArray = new Uint8Array(subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH));
1325
1331
  engine.process(decryptedChunkArray, true);
@@ -1329,27 +1335,26 @@
1329
1335
  invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
1330
1336
  }
1331
1337
  if (invalidAuthenticationCode && checkAuthenticationCode) {
1332
- throw new Error(ERR_INVALID_AUTHENTICATION_CODE);
1338
+ controller.error(new Error(ERR_INVALID_AUTHENTICATION_CODE));
1339
+ return;
1333
1340
  }
1334
1341
  controller.enqueue(decryptedChunkArray);
1335
1342
  }
1336
- },
1337
- cancel() {
1338
- disposeEngine(this);
1339
1343
  }
1340
1344
  });
1345
+ setDisposingReadable(this, aesCrypto);
1341
1346
  }
1342
1347
  }
1343
1348
 
1344
1349
  class AESEncryptionStream extends TransformStream {
1345
1350
 
1346
1351
  constructor({ password, rawPassword, encryptionStrength }) {
1352
+ const aesCrypto = {};
1347
1353
  super({
1348
1354
  start() {
1349
- initAesCrypto(this, password, rawPassword, encryptionStrength);
1355
+ initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength);
1350
1356
  },
1351
1357
  async transform(chunk, controller) {
1352
- const aesCrypto = this;
1353
1358
  const {
1354
1359
  password,
1355
1360
  strength,
@@ -1363,6 +1368,9 @@
1363
1368
  } else {
1364
1369
  await ready;
1365
1370
  }
1371
+ if (aesCrypto.discarded) {
1372
+ return;
1373
+ }
1366
1374
  const output = new Uint8Array(preamble.length + chunk.length - (chunk.length % BLOCK_LENGTH));
1367
1375
  output.set(preamble, 0);
1368
1376
  controller.enqueue(append(aesCrypto, chunk, output, preamble.length, 0, false));
@@ -1372,19 +1380,20 @@
1372
1380
  engine,
1373
1381
  pendingInput,
1374
1382
  ready
1375
- } = this;
1383
+ } = aesCrypto;
1376
1384
  if (engine) {
1377
1385
  await ready;
1386
+ if (aesCrypto.discarded) {
1387
+ return;
1388
+ }
1378
1389
  const encryptedChunkArray = new Uint8Array(pendingInput);
1379
1390
  engine.process(encryptedChunkArray, false);
1380
1391
  const authenticationCode = subarray(engine.digest(), 0, AUTHENTICATION_CODE_LENGTH);
1381
1392
  controller.enqueue(concat(encryptedChunkArray, authenticationCode));
1382
1393
  }
1383
- },
1384
- cancel() {
1385
- disposeEngine(this);
1386
1394
  }
1387
1395
  });
1396
+ setDisposingReadable(this, aesCrypto);
1388
1397
  }
1389
1398
  }
1390
1399
 
@@ -1393,7 +1402,37 @@
1393
1402
  ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
1394
1403
  password: encodePassword(password, rawPassword),
1395
1404
  strength: encryptionStrength - 1,
1396
- pendingInput: EMPTY_UINT8_ARRAY
1405
+ pendingInput: EMPTY_UINT8_ARRAY,
1406
+ discarded: false
1407
+ });
1408
+ }
1409
+
1410
+ function setDisposingReadable(stream, aesCrypto) {
1411
+ const reader = stream.readable.getReader();
1412
+ const readable = new ReadableStream({
1413
+ async pull(controller) {
1414
+ try {
1415
+ const { value, done } = await reader.read();
1416
+ if (done) {
1417
+ controller.close();
1418
+ } else {
1419
+ controller.enqueue(value);
1420
+ }
1421
+ } catch (error) {
1422
+ disposeEngine(aesCrypto);
1423
+ reader.cancel(error).catch(() => { });
1424
+ throw error;
1425
+ }
1426
+ },
1427
+ cancel(reason) {
1428
+ disposeEngine(aesCrypto);
1429
+ return reader.cancel(reason);
1430
+ }
1431
+ });
1432
+ Object.defineProperty(stream, "readable", {
1433
+ get() {
1434
+ return readable;
1435
+ }
1397
1436
  });
1398
1437
  }
1399
1438
 
@@ -1426,7 +1465,9 @@
1426
1465
  }
1427
1466
  }
1428
1467
 
1429
- function disposeEngine({ engine }) {
1468
+ function disposeEngine(aesCrypto) {
1469
+ const { engine } = aesCrypto;
1470
+ aesCrypto.discarded = true;
1430
1471
  if (engine && engine.dispose) {
1431
1472
  engine.dispose();
1432
1473
  }
@@ -1443,6 +1484,9 @@
1443
1484
  const keyLength = KEY_LENGTH[strength];
1444
1485
  const compositeKey = await deriveKey(password, salt, keyLength * 2 + PASSWORD_VERIFICATION_LENGTH);
1445
1486
  aesCrypto.engine = createEngine(subarray(compositeKey, 0, keyLength), subarray(compositeKey, keyLength, keyLength * 2));
1487
+ if (aesCrypto.discarded) {
1488
+ disposeEngine(aesCrypto);
1489
+ }
1446
1490
  return subarray(compositeKey, keyLength * 2);
1447
1491
  }
1448
1492
 
@@ -1594,11 +1638,11 @@
1594
1638
  }
1595
1639
 
1596
1640
  function createKeys(target, password, rawPassword) {
1597
- const keys = [0x12345678, 0x23456789, 0x34567890];
1641
+ const cryptoKeys = [0x12345678, 0x23456789, 0x34567890];
1598
1642
  Object.assign(target, {
1599
- keys,
1600
- crcKey0: new Crc32(keys[0]),
1601
- crcKey2: new Crc32(keys[2])
1643
+ cryptoKeys,
1644
+ crcKey0: new Crc32(cryptoKeys[0]),
1645
+ crcKey2: new Crc32(cryptoKeys[2])
1602
1646
  });
1603
1647
  if (rawPassword) {
1604
1648
  for (let index = 0; index < rawPassword.length; index++) {
@@ -1612,17 +1656,17 @@
1612
1656
  }
1613
1657
 
1614
1658
  function updateKeys(target, byte) {
1615
- let [, key1] = target.keys;
1659
+ let [, key1] = target.cryptoKeys;
1616
1660
  target.crcKey0.append([byte]);
1617
1661
  const key0 = ~target.crcKey0.get();
1618
1662
  key1 = getInt32(Math.imul(getInt32(key1 + getInt8(key0)), 134775813) + 1);
1619
1663
  target.crcKey2.append([key1 >>> 24]);
1620
1664
  const key2 = ~target.crcKey2.get();
1621
- target.keys = [key0, key1, key2];
1665
+ target.cryptoKeys = [key0, key1, key2];
1622
1666
  }
1623
1667
 
1624
1668
  function getByte(target) {
1625
- const temp = target.keys[2] | 2;
1669
+ const temp = target.cryptoKeys[2] | 2;
1626
1670
  return getInt8(Math.imul(temp, (temp ^ 1)) >>> 8);
1627
1671
  }
1628
1672
 
@@ -1670,11 +1714,16 @@
1670
1714
  const reader = readable.getReader();
1671
1715
  return new ReadableStream({
1672
1716
  async pull(controller) {
1673
- const { value, done } = await reader.read();
1674
- if (done) {
1675
- controller.close();
1676
- } else {
1677
- controller.enqueue(value);
1717
+ try {
1718
+ const { value, done } = await reader.read();
1719
+ if (done) {
1720
+ controller.close();
1721
+ } else {
1722
+ controller.enqueue(value);
1723
+ }
1724
+ } catch (error) {
1725
+ reader.cancel(error).catch(() => { });
1726
+ throw error;
1678
1727
  }
1679
1728
  },
1680
1729
  cancel(reason) {
@@ -1977,28 +2026,25 @@
1977
2026
  pump();
1978
2027
  return new ReadableStream({
1979
2028
  async pull(controller) {
1980
- let result;
1981
2029
  try {
1982
- result = await read();
2030
+ const { value, done } = await read();
2031
+ if (done) {
2032
+ controller.close();
2033
+ } else {
2034
+ outputLength += value.length;
2035
+ if (outputLength > outputSize) {
2036
+ throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
2037
+ }
2038
+ if (outputCrc32) {
2039
+ outputCrc32.append(value);
2040
+ }
2041
+ controller.enqueue(value);
2042
+ }
1983
2043
  } catch (error) {
2044
+ rejectTrailerReady(error);
2045
+ await cancel(reader, error);
1984
2046
  throw trailerWritten ? getTrailerError(error) : error;
1985
2047
  }
1986
- const { value, done } = result;
1987
- if (done) {
1988
- controller.close();
1989
- } else {
1990
- outputLength += value.length;
1991
- if (outputLength > outputSize) {
1992
- const error = new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
1993
- rejectTrailerReady(error);
1994
- await cancel(reader, error);
1995
- throw error;
1996
- }
1997
- if (outputCrc32) {
1998
- outputCrc32.append(value);
1999
- }
2000
- controller.enqueue(value);
2001
- }
2002
2048
  },
2003
2049
  cancel(reason) {
2004
2050
  rejectTrailerReady(reason);
@@ -2277,10 +2323,15 @@
2277
2323
  const reader = readable.getReader();
2278
2324
  return new ReadableStream({
2279
2325
  async pull(controller) {
2280
- let result;
2281
2326
  try {
2282
- result = await reader.read();
2327
+ const { value, done } = await reader.read();
2328
+ if (done) {
2329
+ controller.close();
2330
+ } else {
2331
+ controller.enqueue(value);
2332
+ }
2283
2333
  } catch (error) {
2334
+ await cancel(reader, error);
2284
2335
  if (error && error.message) {
2285
2336
  throw error;
2286
2337
  }
@@ -2288,12 +2339,6 @@
2288
2339
  mappedError.cause = error;
2289
2340
  throw mappedError;
2290
2341
  }
2291
- const { value, done } = result;
2292
- if (done) {
2293
- controller.close();
2294
- } else {
2295
- controller.enqueue(value);
2296
- }
2297
2342
  },
2298
2343
  cancel(reason) {
2299
2344
  return reader.cancel(reason);
@@ -5368,8 +5413,8 @@
5368
5413
  const passThroughCompression = Boolean(passThrough);
5369
5414
  const passThroughEncryption = passThrough === true;
5370
5415
  checkPasswordOption(password, rawPassword);
5371
- password = password && password.length && password;
5372
- rawPassword = rawPassword && rawPassword.length && rawPassword;
5416
+ password = password && password.length ? password : UNDEFINED_VALUE;
5417
+ rawPassword = rawPassword && rawPassword.length ? rawPassword : UNDEFINED_VALUE;
5373
5418
  if (extraFieldAES) {
5374
5419
  if (extraFieldAES.originalCompressionMethod != COMPRESSION_METHOD_AES) {
5375
5420
  throw new Error(ERR_UNSUPPORTED_COMPRESSION);
@@ -6130,7 +6175,7 @@
6130
6175
  async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDataSize) {
6131
6176
  const { size } = reader;
6132
6177
  const anchoredLength = Math.min(size, END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS);
6133
- const remoteProbeBudget = { count: MAX_END_OF_CENTRAL_DIR_PROBES };
6178
+ const remoteProbeBudget = { remaining: MAX_END_OF_CENTRAL_DIR_PROBES };
6134
6179
  let endOfDirectoryInfo;
6135
6180
  let plausibleEndOfDirectoryInfo;
6136
6181
  let endOfDirectoryReachingEndCount = 0;
@@ -6223,8 +6268,8 @@
6223
6268
  if (signatureOffset >= anchoredOffset) {
6224
6269
  return getUint32$1(view, signatureOffset - anchoredOffset);
6225
6270
  }
6226
- if (remoteProbeBudget.count > 0) {
6227
- remoteProbeBudget.count--;
6271
+ if (remoteProbeBudget.remaining > 0) {
6272
+ remoteProbeBudget.remaining--;
6228
6273
  const signatureArray = await readUint8Array(reader, signatureOffset, 4);
6229
6274
  return getUint32$1(getDataView(signatureArray), 0);
6230
6275
  }
@@ -7140,9 +7185,11 @@
7140
7185
  const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
7141
7186
  const passThroughCompression = Boolean(passThrough);
7142
7187
  const passThroughEncryption = passThrough === true;
7143
- const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
7144
- const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
7188
+ let password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
7189
+ let rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
7145
7190
  checkPasswordOption(password, rawPassword);
7191
+ password = password && password.length ? password : UNDEFINED_VALUE;
7192
+ rawPassword = rawPassword && rawPassword.length ? rawPassword : UNDEFINED_VALUE;
7146
7193
  const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
7147
7194
  const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
7148
7195
  const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
@@ -8938,7 +8985,7 @@
8938
8985
  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
8939
8986
  */
8940
8987
 
8941
- const VERSION = "2.16.0";
8988
+ const VERSION = "2.16.1";
8942
8989
 
8943
8990
  /*
8944
8991
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -9469,7 +9516,11 @@
9469
9516
  const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
9470
9517
  const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
9471
9518
  const ERR_UNSUPPORTED_PASS_THROUGH_VALUE = "The 'compressed' passThrough option is only supported by Entry#getData() and ZipWriter#add()";
9519
+ const ERR_INVALID_PASSWORDS = "Invalid passwords option (must be an array of strings)";
9520
+ const ERR_INVALID_REQUEST_PASSWORD = "Invalid requestPassword option (must be a function returning a string or undefined)";
9472
9521
  const ERR_ABORT_EXPORT = "zipjs-abort-export";
9522
+ const ABORT_ERROR_NAME = "AbortError";
9523
+ const EMPTY_RAW_PASSWORD = new Uint8Array(0);
9473
9524
 
9474
9525
  class ZipEntry {
9475
9526
 
@@ -9842,8 +9893,10 @@
9842
9893
  zipReader = new ZipReader(reader, options);
9843
9894
  }
9844
9895
  checkPassThroughValue(options.passThrough);
9896
+ checkPasswordCandidatesOptions(options);
9845
9897
  const duplicates = checkDuplicatesOption(options.duplicates);
9846
9898
  const importedEntries = [];
9899
+ const passwordState = { known: [] };
9847
9900
  const entries = await zipReader.getEntries(options);
9848
9901
  for (const entry of entries) {
9849
9902
  let parent = this;
@@ -9888,7 +9941,7 @@
9888
9941
  }
9889
9942
  importedEntries.push(addChild(parent, name, {
9890
9943
  data: entry,
9891
- Reader: getZipBlobReader(Object.assign({}, options)),
9944
+ Reader: getZipBlobReader(Object.assign({}, options), passwordState),
9892
9945
  uncompressedSize: options.passThrough ? entry.compressedSize : entry.uncompressedSize,
9893
9946
  passThrough: options.passThrough
9894
9947
  }));
@@ -10217,7 +10270,7 @@
10217
10270
  };
10218
10271
  }
10219
10272
 
10220
- function getZipBlobReader(options) {
10273
+ function getZipBlobReader(options, passwordState) {
10221
10274
  return class extends Reader {
10222
10275
 
10223
10276
  constructor(entry, options = {}) {
@@ -10230,12 +10283,12 @@
10230
10283
  const zipBlobReader = this;
10231
10284
  const readerOptions = Object.assign({}, options, zipBlobReader.options);
10232
10285
  const { checkOverlappingEntry, checkOverlappingEntryOnly } = readerOptions;
10233
- const data = await zipBlobReader.entry.getData(new BlobWriter(), Object.assign(readerOptions, {
10286
+ const data = await readEntryData(zipBlobReader.entry, Object.assign(readerOptions, {
10234
10287
  checkPasswordOnly: false,
10235
10288
  checkOverlappingEntry: checkOverlappingEntryOnly || checkOverlappingEntry,
10236
10289
  checkOverlappingEntryOnly: false,
10237
10290
  preventClose: false
10238
- }));
10291
+ }), passwordState);
10239
10292
  zipBlobReader.data = data;
10240
10293
  zipBlobReader.blobReader = new BlobReader(data);
10241
10294
  zipBlobReader.size = data.size;
@@ -10297,10 +10350,9 @@
10297
10350
  await initStream(reader);
10298
10351
  } catch (error) {
10299
10352
  try {
10353
+ error.entry = child;
10300
10354
  error.entryId = child.id;
10301
- error.cause = {
10302
- entry: child
10303
- };
10355
+ error.entryName = child.getRelativeName(entry);
10304
10356
  } catch {
10305
10357
  // ignored
10306
10358
  }
@@ -10392,10 +10444,136 @@
10392
10444
  }
10393
10445
  if (readerOptions) {
10394
10446
  checkPassThroughValue(readerOptions.passThrough);
10447
+ checkPasswordCandidatesOptions(readerOptions);
10395
10448
  }
10396
10449
  return readerOptions;
10397
10450
  }
10398
10451
 
10452
+ function checkPasswordCandidatesOptions(options) {
10453
+ const { passwords, requestPassword } = options;
10454
+ if (passwords && (!Array.isArray(passwords) || passwords.some(password => typeof password != STRING_TYPE))) {
10455
+ throw new Error(ERR_INVALID_PASSWORDS);
10456
+ }
10457
+ if (requestPassword && typeof requestPassword != FUNCTION_TYPE) {
10458
+ throw new Error(ERR_INVALID_REQUEST_PASSWORD);
10459
+ }
10460
+ }
10461
+
10462
+ async function readEntryData(entry, options, passwordState) {
10463
+ checkPasswordCandidatesOptions(options);
10464
+ const { passwords, requestPassword, signal } = options;
10465
+ options = Object.assign({}, options);
10466
+ delete options.passwords;
10467
+ delete options.requestPassword;
10468
+ if (!entry.encrypted || options.passThrough || (!passwords && !requestPassword)) {
10469
+ return entry.getData(new BlobWriter(), options);
10470
+ }
10471
+ const tried = new Set();
10472
+ let error;
10473
+ while (true) {
10474
+ for (const candidate of getPasswordCandidates(options, passwordState, passwords)) {
10475
+ if (!tried.has(candidate.key)) {
10476
+ const result = await tryPasswordCandidate(candidate);
10477
+ if (result.done) {
10478
+ return result.data;
10479
+ }
10480
+ error = result.error;
10481
+ }
10482
+ }
10483
+ if (!requestPassword) {
10484
+ break;
10485
+ }
10486
+ if (passwordState.pendingPrompt) {
10487
+ await passwordState.pendingPrompt;
10488
+ continue;
10489
+ }
10490
+ let release;
10491
+ passwordState.pendingPrompt = new Promise(resolve => release = resolve);
10492
+ try {
10493
+ const answer = await requestPassword(entry, error);
10494
+ if (answer === UNDEFINED_VALUE || answer === null) {
10495
+ break;
10496
+ }
10497
+ // deno-lint-ignore valid-typeof
10498
+ if (typeof answer != STRING_TYPE) {
10499
+ throw new Error(ERR_INVALID_REQUEST_PASSWORD);
10500
+ }
10501
+ const result = await tryPasswordCandidate(getPasswordCandidate(answer));
10502
+ if (result.done) {
10503
+ return result.data;
10504
+ }
10505
+ error = result.error;
10506
+ } finally {
10507
+ passwordState.pendingPrompt = UNDEFINED_VALUE;
10508
+ release();
10509
+ }
10510
+ }
10511
+ throw new Error(tried.size ? ERR_INVALID_PASSWORD : ERR_ENCRYPTED);
10512
+
10513
+ async function tryPasswordCandidate(candidate) {
10514
+ tried.add(candidate.key);
10515
+ const candidateOptions = Object.assign({}, options, candidate.options);
10516
+ if (entry.zipCrypto) {
10517
+ candidateOptions.checkCrc32 = true;
10518
+ try {
10519
+ await entry.getData(null, Object.assign({}, candidateOptions, { checkPasswordOnly: true }));
10520
+ } catch (probeError) {
10521
+ if (isInvalidPasswordError(probeError)) {
10522
+ return { done: false, error: probeError };
10523
+ }
10524
+ throw probeError;
10525
+ }
10526
+ }
10527
+ try {
10528
+ const data = await entry.getData(new BlobWriter(), candidateOptions);
10529
+ rememberPassword(passwordState, candidate);
10530
+ return { done: true, data };
10531
+ } catch (readError) {
10532
+ if (isAbortError(readError, signal) || (!entry.zipCrypto && !isInvalidPasswordError(readError))) {
10533
+ throw readError;
10534
+ }
10535
+ return { done: false, error: readError };
10536
+ }
10537
+ }
10538
+ }
10539
+
10540
+ function isInvalidPasswordError(error) {
10541
+ return isErrorObject(error) && error.message == ERR_INVALID_PASSWORD;
10542
+ }
10543
+
10544
+ function isAbortError(error, signal) {
10545
+ return Boolean(signal && signal.aborted) || (isErrorObject(error) && error.name == ABORT_ERROR_NAME);
10546
+ }
10547
+
10548
+ function getPasswordCandidates(options, passwordState, passwords) {
10549
+ const candidates = [];
10550
+ const { password, rawPassword } = options;
10551
+ if (rawPassword && rawPassword.length) {
10552
+ candidates.push({ key: rawPassword, options: { password: "", rawPassword } });
10553
+ }
10554
+ if (password) {
10555
+ candidates.push(getPasswordCandidate(password));
10556
+ }
10557
+ candidates.push(...passwordState.known);
10558
+ if (passwords) {
10559
+ candidates.push(...passwords.filter(password => password).map(getPasswordCandidate));
10560
+ }
10561
+ return candidates;
10562
+ }
10563
+
10564
+ function getPasswordCandidate(password) {
10565
+ return { key: password, options: { password, rawPassword: EMPTY_RAW_PASSWORD } };
10566
+ }
10567
+
10568
+ function rememberPassword(passwordState, candidate) {
10569
+ const { known } = passwordState;
10570
+ const index = known.findIndex(knownCandidate => knownCandidate.key === candidate.key);
10571
+ if (index != -1) {
10572
+ known.splice(index, 1);
10573
+ }
10574
+ known.unshift(candidate);
10575
+ }
10576
+
10399
10577
  function checkPassThroughValue(passThrough) {
10400
10578
  if (checkPassThroughOption(passThrough) === PASS_THROUGH_COMPRESSED) {
10401
10579
  throw new Error(ERR_UNSUPPORTED_PASS_THROUGH_VALUE);
@@ -10533,6 +10711,7 @@
10533
10711
  async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
10534
10712
  const { onstart, onprogress, onend } = options;
10535
10713
  checkPassThroughValue(options.passThrough);
10714
+ checkPasswordCandidatesOptions(options);
10536
10715
  const readerOptions = checkReaderOptions(options.readerOptions);
10537
10716
  const abortController = new AbortController();
10538
10717
  const { signal } = abortController;
@@ -10875,7 +11054,7 @@
10875
11054
  */
10876
11055
 
10877
11056
 
10878
- g$1(setDefaultConfiguration);
11057
+ f(setDefaultConfiguration);
10879
11058
 
10880
11059
  exports.BlobReader = BlobReader;
10881
11060
  exports.BlobWriter = BlobWriter;
@@ -10926,11 +11105,13 @@
10926
11105
  exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
10927
11106
  exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
10928
11107
  exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
11108
+ exports.ERR_INVALID_PASSWORDS = ERR_INVALID_PASSWORDS;
10929
11109
  exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
10930
11110
  exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
10931
11111
  exports.ERR_INVALID_PASS_THROUGH_VALUE = ERR_INVALID_PASS_THROUGH_VALUE;
10932
11112
  exports.ERR_INVALID_READER = ERR_INVALID_READER;
10933
11113
  exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
11114
+ exports.ERR_INVALID_REQUEST_PASSWORD = ERR_INVALID_REQUEST_PASSWORD;
10934
11115
  exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
10935
11116
  exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
10936
11117
  exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;