@zip.js/zip.js 2.8.34 → 2.8.36

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 (52) hide show
  1. package/README.md +13 -1
  2. package/deno.json +5 -2
  3. package/dist/README.md +3 -1
  4. package/dist/zip-core.js +494 -221
  5. package/dist/zip-core.min.js +1 -1
  6. package/dist/zip-fs-core.js +471 -221
  7. package/dist/zip-fs-core.min.js +1 -1
  8. package/dist/zip-fs-native.js +498 -227
  9. package/dist/zip-fs-native.min.js +1 -1
  10. package/dist/zip-fs.js +500 -229
  11. package/dist/zip-fs.min.js +1 -1
  12. package/dist/zip-legacy.js +496 -223
  13. package/dist/zip-legacy.min.js +1 -1
  14. package/dist/zip-native.js +497 -224
  15. package/dist/zip-native.min.js +1 -1
  16. package/dist/zip-web-worker-native.js +1 -1
  17. package/dist/zip-web-worker.js +1 -1
  18. package/dist/zip.js +499 -226
  19. package/dist/zip.min.js +1 -1
  20. package/index-native.cjs +498 -227
  21. package/index-native.min.js +1 -1
  22. package/index.cjs +500 -229
  23. package/index.d.cts +61 -0
  24. package/index.d.ts +61 -0
  25. package/index.min.js +1 -1
  26. package/lib/core/codec-pool.js +2 -2
  27. package/lib/core/codec-worker.js +6 -2
  28. package/lib/core/configuration.js +22 -1
  29. package/lib/core/io.js +230 -56
  30. package/lib/core/streams/aes-crypto-stream.js +1 -10
  31. package/lib/core/streams/codec-stream.js +37 -16
  32. package/lib/core/streams/zip-entry-stream.js +19 -28
  33. package/lib/core/util/array.js +48 -0
  34. package/lib/core/web-worker-base.js +3 -3
  35. package/lib/core/web-worker-inline-native.js +1 -1
  36. package/lib/core/web-worker-inline-wasm.js +1 -1
  37. package/lib/core/zip-fs.js +2 -3
  38. package/lib/core/zip-reader.js +37 -40
  39. package/lib/core/zip-writer.js +58 -51
  40. package/lib/core/zlib-streams-inline.js +1 -1
  41. package/lib/zip-core-base.js +5 -3
  42. package/lib/zip-fs-native.js +2 -2
  43. package/lib/zip-fs-wasm.js +2 -2
  44. package/lib/zip-legacy.js +2 -2
  45. package/lib/zip-module-native.js +2 -2
  46. package/lib/zip-module-wasm.js +3 -3
  47. package/lib/zip-native.js +2 -2
  48. package/lib/zip-wasm.js +2 -2
  49. package/package.json +3 -3
  50. package/worker-message-property-names.js +3 -0
  51. package/.github/workflows/publish.yml +0 -30
  52. package/reserved-property-names.js +0 -50
@@ -162,6 +162,7 @@
162
162
  workerStarvationTimeout: 5000,
163
163
  useWebWorkers: true,
164
164
  useCompressionStream: true,
165
+ transferStreams: true,
165
166
  CompressionStream: typeof CompressionStream != UNDEFINED_TYPE && CompressionStream,
166
167
  DecompressionStream: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream
167
168
  };
@@ -176,13 +177,14 @@
176
177
  "workerStarvationTimeout",
177
178
  "useCompressionStream",
178
179
  "useWebWorkers",
180
+ "transferStreams",
179
181
  "CompressionStream",
180
182
  "DecompressionStream",
181
183
  "CompressionStreamZlib",
182
184
  "DecompressionStreamZlib"
183
185
  ];
184
186
 
185
- const config = Object.assign({}, DEFAULT_CONFIGURATION);
187
+ const config = { ...DEFAULT_CONFIGURATION };
186
188
 
187
189
  function getConfiguration() {
188
190
  return config;
@@ -201,7 +203,24 @@
201
203
  }
202
204
  }
203
205
 
204
- const t=[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],f=[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],n=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],c=new Uint8Array(288);c.fill(8,0,144),c.fill(9,144,256),c.fill(7,256,280),c.fill(8,280,288);const e=new Uint8Array(30).fill(5);function s(t){const r=new Uint16Array(16);for(const f of t)r[f]++;r[0]=0;const f=new Uint16Array(17);for(let t=1;15>=t;t++)f[t+1]=f[t]+r[t];const o=new Uint16Array(t.length);for(let r=0;r<t.length;r++)t[r]&&(o[f[t[r]]++]=r);return {t:r,symbols:o}}const a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function i(i){i({workerURI:i=>{const v="text/javascript",m=(a=>{let i=0,v=0,m=0,u=new Uint8Array(1024),j=0,R=0;for(;!R;){R=x(1);const t=x(2);if(0==t)V();else if(1==t)X(s(c),s(e));else {if(2!=t)throw Error("invalid deflate block type");X(...K());}}return u.subarray(0,j);function b(){if(i>=a.length)throw Error("unexpected end of deflate data");return a[i++]}function x(t){for(;t>m;)v|=b()<<m,m+=8;const r=v&(1<<t)-1;return v>>>=t,m-=t,r}function V(){v=0,m=0;const t=b()|b()<<8;i+=2,l(j+t);for(let r=0;t>r;r++)u[j++]=b();}function X(n,c){let e=L(n);for(;256!=e;){if(256>e)l(j+1),u[j++]=e;else {const n=e-257,s=t[n]+x(r[n]),a=L(c),i=f[a]+x(o[a]);l(j+s);const v=j-i;for(let t=0;s>t;t++)u[j++]=u[v+t];}e=L(n);}}function K(){const t=x(5)+257,r=x(5)+1,f=x(4)+4,o=new Uint8Array(19);for(let t=0;f>t;t++)o[n[t]]=x(3);const c=s(o),e=new Uint8Array(t+r);let a=0;for(;a<e.length;){const t=L(c);if(16>t)e[a++]=t;else if(16==t){const t=e[a-1];let r=x(2)+3;for(;r--;)e[a++]=t;}else a+=17==t?x(3)+3:x(7)+11;}return [s(e.subarray(0,t)),s(e.subarray(t))]}function L(t){const{t:r,symbols:f}=t;let o=0,n=0,c=0;for(let t=1;15>=t;t++){o|=x(1);const e=r[t];if(e>o-n)return f[c+(o-n)];c+=e,n=n+e<<1,o<<=1;}throw Error("invalid huffman code")}function l(t){if(u.length<t){let r=2*u.length;for(;t>r;)r*=2;const f=new Uint8Array(r);f.set(u.subarray(0,j)),u=f;}}})((t=>{const r=(t=(t+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,f=[];for(let o=0;r>o;o+=4){const r=a.indexOf(t[o])<<18|a.indexOf(t[o+1])<<12|(63&a.indexOf(t[o+2]))<<6|63&a.indexOf(t[o+3]);f.push(r>>16&255),"="!==t[o+2]&&f.push(r>>8&255),"="!==t[o+3]&&f.push(255&r);}return new Uint8Array(f)})("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"));if(i){const t=new Blob([m],{type:v});return URL.createObjectURL(t)}return "data:"+v+";base64,"+(t=>{let r="";const f=t.length;let o=0;for(;f>o+2;o+=3){const f=t[o]<<16|t[o+1]<<8|t[o+2];r+=a[f>>18&63]+a[f>>12&63]+a[f>>6&63]+a[63&f];}const n=f-o;if(1===n){const f=t[o]<<16;r+=a[f>>18&63]+a[f>>12&63]+"==";}else if(2===n){const f=t[o]<<16|t[o+1]<<8;r+=a[f>>18&63]+a[f>>12&63]+a[f>>6&63]+"=";}return r})(m)}});}
206
+ function setDefaultConfiguration(configuration) {
207
+ for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
208
+ const propertyValue = configuration[propertyName];
209
+ if (propertyValue !== UNDEFINED_VALUE) {
210
+ DEFAULT_CONFIGURATION[propertyName] = propertyValue;
211
+ }
212
+ }
213
+ configure(configuration);
214
+ }
215
+
216
+ function resetConfiguration() {
217
+ for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
218
+ delete config[propertyName];
219
+ }
220
+ Object.assign(config, DEFAULT_CONFIGURATION);
221
+ }
222
+
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],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],e=[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],f=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],r=new Uint8Array(288);r.fill(8,0,144),r.fill(9,144,256),r.fill(7,256,280),r.fill(8,280,288);const c=new Uint8Array(30).fill(5);function w(n){const t=new Uint16Array(16);for(const e of n)t[e]++;t[0]=0;const e=new Uint16Array(17);for(let n=1;15>=n;n++)e[n+1]=e[n]+t[n];const o=new Uint16Array(n.length);for(let t=0;t<n.length;t++)n[t]&&(o[e[n[t]]++]=t);return {o:t,symbols:o}}const P="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function Y(Y){Y({workerURI:Y=>{const m="text/javascript",F=(P=>{let Y=0,m=0,F=0,x=new Uint8Array(1024),b=0,l=0;for(;!l;){l=v(1);const n=v(2);if(0==n)z();else if(1==n)a(w(r),w(c));else {if(2!=n)throw Error("invalid deflate block type");a(...j());}}return x.subarray(0,b);function s(){if(Y>=P.length)throw Error("unexpected end of deflate data");return P[Y++]}function v(n){for(;n>F;)m|=s()<<F,F+=8;const t=m&(1<<n)-1;return m>>>=n,F-=n,t}function z(){m=0,F=0;const n=s()|s()<<8;Y+=2,Z(b+n);for(let t=0;n>t;t++)x[b++]=s();}function a(f,r){let c=X(f);for(;256!=c;){if(256>c)Z(b+1),x[b++]=c;else {const f=c-257,w=n[f]+v(t[f]),P=X(r),Y=e[P]+v(o[P]);Z(b+w);const m=b-Y;for(let n=0;w>n;n++)x[b++]=x[m+n];}c=X(f);}}function j(){const n=v(5)+257,t=v(5)+1,e=v(4)+4,o=new Uint8Array(19);for(let n=0;e>n;n++)o[f[n]]=v(3);const r=w(o),c=new Uint8Array(n+t);let P=0;for(;P<c.length;){const n=X(r);if(16>n)c[P++]=n;else if(16==n){const n=c[P-1];let t=v(2)+3;for(;t--;)c[P++]=n;}else P+=17==n?v(3)+3:v(7)+11;}return [w(c.subarray(0,n)),w(c.subarray(n))]}function X(n){const{o:t,symbols:e}=n;let o=0,f=0,r=0;for(let n=1;15>=n;n++){o|=v(1);const c=t[n];if(c>o-f)return e[r+(o-f)];r+=c,f=f+c<<1,o<<=1;}throw Error("invalid huffman code")}function Z(n){if(x.length<n){let t=2*x.length;for(;n>t;)t*=2;const e=new Uint8Array(t);e.set(x.subarray(0,b)),x=e;}}})((n=>{const t=(n=(n+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,e=[];for(let o=0;t>o;o+=4){const t=P.indexOf(n[o])<<18|P.indexOf(n[o+1])<<12|(63&P.indexOf(n[o+2]))<<6|63&P.indexOf(n[o+3]);e.push(t>>16&255),"="!==n[o+2]&&e.push(t>>8&255),"="!==n[o+3]&&e.push(255&t);}return new Uint8Array(e)})("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"));if(Y){const n=new Blob([F],{type:m});return URL.createObjectURL(n)}return "data:"+m+";base64,"+(n=>{let t="";const e=n.length;let o=0;for(;e>o+2;o+=3){const e=n[o]<<16|n[o+1]<<8|n[o+2];t+=P[e>>18&63]+P[e>>12&63]+P[e>>6&63]+P[63&e];}const f=e-o;if(1===f){const e=n[o]<<16;t+=P[e>>18&63]+P[e>>12&63]+"==";}else if(2===f){const e=n[o]<<16|n[o+1]<<8;t+=P[e>>18&63]+P[e>>12&63]+P[e>>6&63]+"=";}return t})(F)}});}
205
224
 
206
225
  /*
207
226
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
@@ -385,6 +404,50 @@
385
404
  }
386
405
  }
387
406
 
407
+ /*
408
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
409
+
410
+ Redistribution and use in source and binary forms, with or without
411
+ modification, are permitted provided that the following conditions are met:
412
+
413
+ 1. Redistributions of source code must retain the above copyright notice,
414
+ this list of conditions and the following disclaimer.
415
+
416
+ 2. Redistributions in binary form must reproduce the above copyright
417
+ notice, this list of conditions and the following disclaimer in
418
+ the documentation and/or other materials provided with the distribution.
419
+
420
+ 3. The names of the authors may not be used to endorse or promote products
421
+ derived from this software without specific prior written permission.
422
+
423
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
424
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
425
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
426
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
427
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
428
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
429
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
430
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
431
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
432
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
433
+ */
434
+
435
+
436
+ function concat(first, second) {
437
+ const result = new Uint8Array(first.length + second.length);
438
+ result.set(first);
439
+ result.set(second, first.length);
440
+ return result;
441
+ }
442
+
443
+ function toExactUint8Array(array) {
444
+ return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
445
+ }
446
+
447
+ function getDataView(array) {
448
+ return new DataView(array.buffer, array.byteOffset, array.byteLength);
449
+ }
450
+
388
451
  // Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
389
452
 
390
453
  // deno-lint-ignore-file no-this-alias
@@ -1489,16 +1552,6 @@
1489
1552
  }
1490
1553
  }
1491
1554
 
1492
- function concat(leftArray, rightArray) {
1493
- let array = leftArray;
1494
- if (leftArray.length + rightArray.length) {
1495
- array = new Uint8Array(leftArray.length + rightArray.length);
1496
- array.set(leftArray, 0);
1497
- array.set(rightArray, leftArray.length);
1498
- }
1499
- return array;
1500
- }
1501
-
1502
1555
  function expand(inputArray, length) {
1503
1556
  if (length && length > inputArray.length) {
1504
1557
  const array = inputArray;
@@ -1760,44 +1813,34 @@
1760
1813
  constructor() {
1761
1814
  // deno-lint-ignore prefer-const
1762
1815
  let stream;
1763
- let headerLeft = GZIP_HEADER_LENGTH;
1764
- let tail = new Uint8Array(0);
1816
+ let headerBytesLeft = GZIP_HEADER_LENGTH;
1817
+ let trailerCandidate = new Uint8Array(0);
1765
1818
  super({
1766
1819
  transform(chunk, controller) {
1767
- if (headerLeft) {
1768
- const dropped = Math.min(headerLeft, chunk.length);
1769
- headerLeft -= dropped;
1770
- chunk = chunk.subarray(dropped);
1820
+ if (headerBytesLeft) {
1821
+ const droppedLength = Math.min(headerBytesLeft, chunk.length);
1822
+ headerBytesLeft -= droppedLength;
1823
+ chunk = chunk.subarray(droppedLength);
1771
1824
  if (!chunk.length) {
1772
1825
  return;
1773
1826
  }
1774
1827
  }
1775
- const available = tail.length + chunk.length;
1776
- if (available <= GZIP_TRAILER_LENGTH) {
1777
- const pending = new Uint8Array(available);
1778
- pending.set(tail);
1779
- pending.set(chunk, tail.length);
1780
- tail = pending;
1828
+ const availableLength = trailerCandidate.length + chunk.length;
1829
+ if (availableLength <= GZIP_TRAILER_LENGTH) {
1830
+ trailerCandidate = concat(trailerCandidate, chunk);
1781
1831
  return;
1782
1832
  }
1783
- const emitLength = available - GZIP_TRAILER_LENGTH;
1784
- const output = new Uint8Array(emitLength);
1785
- const fromTail = Math.min(emitLength, tail.length);
1786
- output.set(tail.subarray(0, fromTail), 0);
1787
- if (emitLength > fromTail) {
1788
- output.set(chunk.subarray(0, emitLength - fromTail), fromTail);
1789
- }
1790
- controller.enqueue(output);
1791
- const nextTail = new Uint8Array(GZIP_TRAILER_LENGTH);
1792
- const tailRemaining = tail.length - fromTail;
1793
- if (tailRemaining) {
1794
- nextTail.set(tail.subarray(fromTail), 0);
1795
- }
1796
- nextTail.set(chunk.subarray(emitLength - fromTail), tailRemaining);
1797
- tail = nextTail;
1833
+ const emitLength = availableLength - GZIP_TRAILER_LENGTH;
1834
+ const emittedFromTrailer = Math.min(emitLength, trailerCandidate.length);
1835
+ controller.enqueue(concat(
1836
+ trailerCandidate.subarray(0, emittedFromTrailer),
1837
+ chunk.subarray(0, emitLength - emittedFromTrailer)));
1838
+ trailerCandidate = concat(
1839
+ trailerCandidate.subarray(emittedFromTrailer),
1840
+ chunk.subarray(emitLength - emittedFromTrailer));
1798
1841
  },
1799
1842
  flush() {
1800
- const dataView = new DataView(tail.buffer, tail.byteOffset, tail.byteLength);
1843
+ const dataView = getDataView(trailerCandidate);
1801
1844
  stream.signature = dataView.getUint32(0, true);
1802
1845
  stream.uncompressedSize = dataView.getUint32(4, true);
1803
1846
  }
@@ -1972,7 +2015,7 @@
1972
2015
  */
1973
2016
 
1974
2017
 
1975
- const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
2018
+ const DEFAULT_CHUNK_SIZE = 64 * 1024;
1976
2019
  const MESSAGE_EVENT_TYPE = "message";
1977
2020
  const MESSAGE_START = "start";
1978
2021
  const MESSAGE_PULL = "pull";
@@ -2040,33 +2083,54 @@
2040
2083
  class ChunkStream extends TransformStream {
2041
2084
 
2042
2085
  constructor(chunkSize) {
2043
- let pendingChunk;
2044
- if (!(chunkSize >= 1)) {
2045
- chunkSize = DEFAULT_CHUNK_SIZE$1;
2086
+ const pendingChunks = [];
2087
+ let pendingLength = 0;
2088
+ if (!Number.isFinite(chunkSize) || chunkSize < 1) {
2089
+ chunkSize = DEFAULT_CHUNK_SIZE;
2046
2090
  }
2047
2091
  super({
2048
- transform,
2092
+ transform(chunk, controller) {
2093
+ pendingChunks.push(chunk);
2094
+ pendingLength += chunk.length;
2095
+ while (pendingLength > chunkSize) {
2096
+ controller.enqueue(shiftChunk());
2097
+ }
2098
+ },
2049
2099
  flush(controller) {
2050
- if (pendingChunk && pendingChunk.length) {
2051
- controller.enqueue(pendingChunk);
2100
+ if (pendingLength) {
2101
+ controller.enqueue(concatChunks(pendingChunks, pendingLength));
2052
2102
  }
2053
2103
  }
2054
2104
  });
2055
2105
 
2056
- function transform(chunk, controller) {
2057
- if (pendingChunk) {
2058
- const newChunk = new Uint8Array(pendingChunk.length + chunk.length);
2059
- newChunk.set(pendingChunk);
2060
- newChunk.set(chunk, pendingChunk.length);
2061
- chunk = newChunk;
2062
- pendingChunk = null;
2106
+ function shiftChunk() {
2107
+ const result = new Uint8Array(chunkSize);
2108
+ let resultOffset = 0;
2109
+ while (resultOffset < chunkSize) {
2110
+ const firstChunk = pendingChunks[0];
2111
+ const remainingLength = chunkSize - resultOffset;
2112
+ if (firstChunk.length <= remainingLength) {
2113
+ result.set(firstChunk, resultOffset);
2114
+ resultOffset += firstChunk.length;
2115
+ pendingChunks.shift();
2116
+ } else {
2117
+ result.set(firstChunk.subarray(0, remainingLength), resultOffset);
2118
+ pendingChunks[0] = firstChunk.subarray(remainingLength);
2119
+ resultOffset += remainingLength;
2120
+ }
2063
2121
  }
2122
+ pendingLength -= chunkSize;
2123
+ return result;
2124
+ }
2125
+
2126
+ function concatChunks(chunks, length) {
2127
+ const result = new Uint8Array(length);
2064
2128
  let offset = 0;
2065
- while (chunk.length - offset > chunkSize) {
2066
- controller.enqueue(chunk.slice(offset, offset + chunkSize));
2067
- offset += chunkSize;
2129
+ for (const chunk of chunks) {
2130
+ result.set(chunk, offset);
2131
+ offset += chunk.length;
2068
2132
  }
2069
- pendingChunk = offset ? chunk.slice(offset) : chunk;
2133
+ return result;
2070
2134
  }
2071
2135
  }
2072
2136
  }
@@ -2248,7 +2312,10 @@
2248
2312
  }
2249
2313
  }
2250
2314
  codecStream = new CodecStream(options, config);
2251
- await readable.pipeThrough(codecStream).pipeTo(writable, { preventClose: true, preventAbort: true });
2315
+ await readable
2316
+ .pipeThrough(codecStream)
2317
+ .pipeThrough(new ChunkStream(getChunkSize(config)))
2318
+ .pipeTo(writable, { preventClose: true, preventAbort: true });
2252
2319
  const {
2253
2320
  signature,
2254
2321
  inputSize,
@@ -2447,7 +2514,7 @@
2447
2514
  const { value, readable, writable } = message;
2448
2515
  const transferables = [];
2449
2516
  if (value) {
2450
- message.value = value.byteOffset || value.byteLength != value.buffer.byteLength ? new Uint8Array(value) : value;
2517
+ message.value = toExactUint8Array(value);
2451
2518
  transferables.push(message.value.buffer);
2452
2519
  }
2453
2520
  if (transferStreams && transferStreamsSupported) {
@@ -2571,8 +2638,8 @@
2571
2638
  const { options, config } = workerOptions;
2572
2639
  const { transferStreams, useWebWorkers, useCompressionStream, compressed, signed, encrypted } = options;
2573
2640
  const { workerURI, maxWorkers } = config;
2574
- workerOptions.transferStreams = transferStreams || transferStreams === UNDEFINED_VALUE;
2575
- const streamCopy = !compressed && !signed && !encrypted && !workerOptions.transferStreams;
2641
+ workerOptions.transferStreams = transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams);
2642
+ const streamCopy = !compressed && !signed && !encrypted;
2576
2643
  workerOptions.useWebWorkers = !streamCopy && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
2577
2644
  workerOptions.workerURI = workerOptions.useWebWorkers && workerURI ? workerURI : UNDEFINED_VALUE;
2578
2645
  options.useCompressionStream = useCompressionStream || (useCompressionStream === UNDEFINED_VALUE && config.useCompressionStream);
@@ -2706,6 +2773,7 @@
2706
2773
 
2707
2774
  const ERR_HTTP_STATUS = "HTTP error ";
2708
2775
  const ERR_HTTP_RANGE = "HTTP Range not supported";
2776
+ const ERR_HTTP_RESOURCE_CHANGED = "HTTP resource changed";
2709
2777
  const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
2710
2778
  const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
2711
2779
 
@@ -2716,13 +2784,16 @@
2716
2784
  const HTTP_HEADER_ACCEPT_RANGES = "Accept-Ranges";
2717
2785
  const HTTP_HEADER_RANGE = "Range";
2718
2786
  const HTTP_HEADER_CONTENT_TYPE = "Content-Type";
2787
+ const HTTP_HEADER_ETAG = "Etag";
2788
+ const HTTP_HEADER_LAST_MODIFIED = "Last-Modified";
2719
2789
  const HTTP_METHOD_HEAD = "HEAD";
2720
2790
  const HTTP_METHOD_GET = "GET";
2721
2791
  const HTTP_RANGE_UNIT = "bytes";
2722
- const DEFAULT_CHUNK_SIZE = 64 * 1024;
2723
2792
  const DEFAULT_BUFFER_SIZE = 256 * 1024;
2793
+ const DEFAULT_MAXIMUM_RANGE_SIZE = 16 * 1024 * 1024;
2724
2794
 
2725
2795
  const PROPERTY_NAME_WRITABLE = "writable";
2796
+ const DISK_BOUNDARY = Symbol();
2726
2797
 
2727
2798
  class Stream {
2728
2799
 
@@ -2741,13 +2812,13 @@
2741
2812
  return this.createReadable();
2742
2813
  }
2743
2814
 
2744
- createReadable({ offset = 0, size, diskNumberStart, chunkSize = DEFAULT_CHUNK_SIZE } = {}) {
2815
+ createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
2745
2816
  const reader = this;
2746
2817
  let chunkOffset = 0;
2747
2818
  return new ReadableStream({
2748
2819
  async pull(controller) {
2749
2820
  const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
2750
- const data = await readUint8Array(reader, offset + chunkOffset, dataSize, diskNumberStart);
2821
+ const data = await readUint8Array(reader, offset + chunkOffset, dataSize);
2751
2822
  controller.enqueue(data);
2752
2823
  if ((chunkOffset + chunkSize > size) || (size === UNDEFINED_VALUE && !data.length && dataSize)) {
2753
2824
  controller.close();
@@ -2769,7 +2840,7 @@
2769
2840
  if (!writer.initialized) {
2770
2841
  throw new Error(ERR_WRITER_NOT_INITIALIZED);
2771
2842
  }
2772
- return writer.writeUint8Array(chunk);
2843
+ return writer.writeUint8Array(toExactUint8Array(chunk));
2773
2844
  }
2774
2845
  });
2775
2846
  Object.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
@@ -2856,6 +2927,27 @@
2856
2927
  }
2857
2928
  }
2858
2929
 
2930
+ let blobSliceReliable;
2931
+ let blobSliceProbe;
2932
+
2933
+ function probeBlobSliceReliability() {
2934
+ blobSliceProbe = (async () => {
2935
+ try {
2936
+ const slicedBlob = new Blob([new Uint8Array(3)]).slice(1, 2);
2937
+ const streamReader = slicedBlob.stream().getReader();
2938
+ let streamedLength = 0;
2939
+ let result = await streamReader.read();
2940
+ while (!result.done) {
2941
+ streamedLength += result.value.length;
2942
+ result = await streamReader.read();
2943
+ }
2944
+ blobSliceReliable = streamedLength == 1;
2945
+ } catch {
2946
+ blobSliceReliable = false;
2947
+ }
2948
+ })();
2949
+ }
2950
+
2859
2951
  class BlobReader extends Reader {
2860
2952
 
2861
2953
  constructor(blob) {
@@ -2864,14 +2956,32 @@
2864
2956
  blob,
2865
2957
  size: blob.size
2866
2958
  });
2959
+ if (!blobSliceProbe) {
2960
+ probeBlobSliceReliability();
2961
+ }
2962
+ }
2963
+
2964
+ createReadable(options) {
2965
+ const reader = this;
2966
+ const { blob, size } = reader;
2967
+ const { offset = 0, size: readSize = size - offset } = options || {};
2968
+ if (!offset && readSize >= size) {
2969
+ return blob.stream();
2970
+ }
2971
+ if (blobSliceReliable) {
2972
+ return blob.slice(offset, offset + readSize).stream();
2973
+ }
2974
+ return super.createReadable(options);
2867
2975
  }
2868
2976
 
2869
2977
  async readUint8Array(offset, length) {
2870
2978
  const reader = this;
2871
2979
  const offsetEnd = offset + length;
2872
- const blob = offset || offsetEnd < reader.size ? reader.blob.slice(offset, offsetEnd) : reader.blob;
2980
+ const readsWholeBlob = !offset && offsetEnd >= reader.size;
2981
+ const blob = readsWholeBlob ? reader.blob : reader.blob.slice(offset, offsetEnd);
2873
2982
  let arrayBuffer = await blob.arrayBuffer();
2874
- if (arrayBuffer.byteLength > length) {
2983
+ const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
2984
+ if (sliceIgnoredByBuggyImplementation) {
2875
2985
  arrayBuffer = arrayBuffer.slice(offset, offsetEnd);
2876
2986
  }
2877
2987
  return new Uint8Array(arrayBuffer);
@@ -2952,6 +3062,18 @@
2952
3062
  super.init();
2953
3063
  }
2954
3064
 
3065
+ createReadable(options) {
3066
+ const reader = this;
3067
+ const { useRangeHeader, forceRangeRequests, size } = reader;
3068
+ if ((useRangeHeader || forceRangeRequests) && size !== UNDEFINED_VALUE) {
3069
+ const { offset = 0, size: readSize = size - offset } = options || {};
3070
+ if (readSize > 0 && offset < size) {
3071
+ return createRangeReadable(reader, offset, Math.min(readSize, size - offset));
3072
+ }
3073
+ }
3074
+ return super.createReadable(options);
3075
+ }
3076
+
2955
3077
  readUint8Array(index, length) {
2956
3078
  return readUint8ArrayHttpReader(this, index, length, sendFetchRequest, getFetchRequestData);
2957
3079
  }
@@ -2980,6 +3102,8 @@
2980
3102
  useRangeHeader,
2981
3103
  forceRangeRequests,
2982
3104
  combineSizeEocd,
3105
+ checkResourceChanges = true,
3106
+ maximumRangeSize = DEFAULT_MAXIMUM_RANGE_SIZE,
2983
3107
  fetch
2984
3108
  } = options;
2985
3109
  options = Object.assign({}, options);
@@ -2987,6 +3111,8 @@
2987
3111
  delete options.useRangeHeader;
2988
3112
  delete options.forceRangeRequests;
2989
3113
  delete options.combineSizeEocd;
3114
+ delete options.checkResourceChanges;
3115
+ delete options.maximumRangeSize;
2990
3116
  delete options.useXHR;
2991
3117
  delete options.fetch;
2992
3118
  Object.assign(httpReader, {
@@ -2996,6 +3122,8 @@
2996
3122
  useRangeHeader,
2997
3123
  forceRangeRequests,
2998
3124
  combineSizeEocd,
3125
+ checkResourceChanges,
3126
+ maximumRangeSize,
2999
3127
  fetch
3000
3128
  });
3001
3129
  }
@@ -3020,17 +3148,8 @@
3020
3148
  httpReader.eocdCache = eocdCache;
3021
3149
  }
3022
3150
  }
3023
- let contentSize;
3024
- const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
3025
- if (contentRangeHeader) {
3026
- const splitHeader = contentRangeHeader.trim().split(/\s*\/\s*/);
3027
- if (splitHeader.length) {
3028
- const headerValue = splitHeader[1];
3029
- if (headerValue && headerValue != "*") {
3030
- contentSize = Number(headerValue);
3031
- }
3032
- }
3033
- }
3151
+ setResourceValidators(httpReader, response);
3152
+ const contentSize = getContentRangeSize(response);
3034
3153
  if (contentSize === UNDEFINED_VALUE) {
3035
3154
  await getContentLength(httpReader, sendRequest, getRequestData);
3036
3155
  } else {
@@ -3071,6 +3190,8 @@
3071
3190
  throw new Error(ERR_HTTP_RANGE);
3072
3191
  }
3073
3192
  }
3193
+ checkResourceValidators(httpReader, response);
3194
+ setResourceValidators(httpReader, response);
3074
3195
  const data = new Uint8Array(await response.arrayBuffer());
3075
3196
  if (data.length != length) {
3076
3197
  throw new Error(ERR_HTTP_RANGE);
@@ -3082,7 +3203,114 @@
3082
3203
  if (!data) {
3083
3204
  await getRequestData(httpReader, options);
3084
3205
  }
3085
- return new Uint8Array(httpReader.data.subarray(index, index + length));
3206
+ return httpReader.data.subarray(index, index + length);
3207
+ }
3208
+ }
3209
+
3210
+ function createRangeReadable(httpReader, offset, size) {
3211
+ let bodyReader;
3212
+ let windowOffset = offset;
3213
+ let windowRemainingLength = 0;
3214
+ let remainingLength = size;
3215
+ return new ReadableStream({
3216
+ start() {
3217
+ return openWindow();
3218
+ },
3219
+ async pull(controller) {
3220
+ if (!bodyReader) {
3221
+ await openWindow();
3222
+ }
3223
+ const { value, done } = await bodyReader.read();
3224
+ if (done) {
3225
+ throw new Error(ERR_HTTP_RANGE);
3226
+ }
3227
+ const chunk = value.length > windowRemainingLength ? value.subarray(0, windowRemainingLength) : value;
3228
+ windowRemainingLength -= chunk.length;
3229
+ remainingLength -= chunk.length;
3230
+ if (chunk.length) {
3231
+ controller.enqueue(chunk);
3232
+ }
3233
+ if (!windowRemainingLength) {
3234
+ await closeWindow();
3235
+ if (!remainingLength) {
3236
+ controller.close();
3237
+ }
3238
+ }
3239
+ },
3240
+ cancel(reason) {
3241
+ return bodyReader && bodyReader.cancel(reason);
3242
+ }
3243
+ });
3244
+
3245
+ async function openWindow() {
3246
+ const windowLength = Math.min(httpReader.maximumRangeSize, remainingLength);
3247
+ const response = await sendFetchRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, windowOffset, windowLength));
3248
+ if (response.status != 206) {
3249
+ throw new Error(ERR_HTTP_RANGE);
3250
+ }
3251
+ const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
3252
+ if (contentRangeHeader) {
3253
+ const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
3254
+ if (!Number.isNaN(rangeStart) && rangeStart != windowOffset) {
3255
+ throw new Error(ERR_HTTP_RANGE);
3256
+ }
3257
+ }
3258
+ checkResourceValidators(httpReader, response);
3259
+ setResourceValidators(httpReader, response);
3260
+ windowOffset += windowLength;
3261
+ windowRemainingLength = windowLength;
3262
+ bodyReader = response.body.getReader();
3263
+ }
3264
+
3265
+ async function closeWindow() {
3266
+ const currentBodyReader = bodyReader;
3267
+ bodyReader = UNDEFINED_VALUE;
3268
+ await currentBodyReader.cancel();
3269
+ }
3270
+ }
3271
+
3272
+ function getContentRangeSize(response) {
3273
+ const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
3274
+ if (contentRangeHeader) {
3275
+ const headerValue = contentRangeHeader.trim().split(/\s*\/\s*/)[1];
3276
+ if (headerValue && headerValue != "*") {
3277
+ const contentSize = Number(headerValue);
3278
+ if (!Number.isNaN(contentSize)) {
3279
+ return contentSize;
3280
+ }
3281
+ }
3282
+ }
3283
+ }
3284
+
3285
+ function getResourceValidators({ headers }) {
3286
+ return {
3287
+ etag: headers.get(HTTP_HEADER_ETAG) || UNDEFINED_VALUE,
3288
+ lastModified: headers.get(HTTP_HEADER_LAST_MODIFIED) || UNDEFINED_VALUE
3289
+ };
3290
+ }
3291
+
3292
+ function setResourceValidators(httpReader, response) {
3293
+ const { checkResourceChanges, resourceValidators } = httpReader;
3294
+ if (checkResourceChanges && !resourceValidators && response.status == 206) {
3295
+ httpReader.resourceValidators = getResourceValidators(response);
3296
+ }
3297
+ }
3298
+
3299
+ function checkResourceValidators(httpReader, response) {
3300
+ const { checkResourceChanges, resourceValidators, size } = httpReader;
3301
+ if (checkResourceChanges) {
3302
+ const contentRangeSize = getContentRangeSize(response);
3303
+ if (contentRangeSize !== UNDEFINED_VALUE && size !== UNDEFINED_VALUE && contentRangeSize != size) {
3304
+ throw new Error(ERR_HTTP_RESOURCE_CHANGED);
3305
+ }
3306
+ if (resourceValidators) {
3307
+ const validators = getResourceValidators(response);
3308
+ const changed = Object.entries(resourceValidators).some(([name, value]) =>
3309
+ value !== UNDEFINED_VALUE && validators[name] !== UNDEFINED_VALUE && value != validators[name]);
3310
+ if (changed) {
3311
+ throw new Error(ERR_HTTP_RESOURCE_CHANGED);
3312
+ }
3313
+ }
3086
3314
  }
3087
3315
  }
3088
3316
 
@@ -3193,6 +3421,10 @@
3193
3421
  super.init();
3194
3422
  }
3195
3423
 
3424
+ createReadable(options) {
3425
+ return this.reader.createReadable(options);
3426
+ }
3427
+
3196
3428
  readUint8Array(index, length) {
3197
3429
  return this.reader.readUint8Array(index, length);
3198
3430
  }
@@ -3273,25 +3505,26 @@
3273
3505
  const reader = this;
3274
3506
  const { readers } = reader;
3275
3507
  reader.lastDiskNumber = 0;
3276
- reader.lastDiskOffset = 0;
3277
- await Promise.all(readers.map(async (diskReader, indexDiskReader) => {
3278
- await initStream(diskReader);
3279
- if (indexDiskReader != readers.length - 1) {
3280
- reader.lastDiskOffset += diskReader.size;
3281
- }
3508
+ await Promise.all(readers.map(diskReader => initStream(diskReader)));
3509
+ reader.diskOffsets = readers.map(diskReader => {
3510
+ const diskOffset = reader.size;
3282
3511
  reader.size += diskReader.size;
3283
- }));
3512
+ return diskOffset;
3513
+ });
3284
3514
  super.init();
3285
3515
  }
3286
3516
 
3287
- async readUint8Array(offset, length, diskNumber = 0) {
3517
+ getDiskOffset(diskNumber) {
3518
+ const { diskOffsets, size } = this;
3519
+ const diskOffset = diskOffsets.at(diskNumber);
3520
+ return diskOffset === UNDEFINED_VALUE ? size : diskOffset;
3521
+ }
3522
+
3523
+ async readUint8Array(offset, length) {
3288
3524
  const reader = this;
3289
3525
  const { readers } = this;
3290
3526
  let result;
3291
- let currentDiskNumber = diskNumber;
3292
- if (currentDiskNumber == -1) {
3293
- currentDiskNumber = readers.length - 1;
3294
- }
3527
+ let currentDiskNumber = 0;
3295
3528
  let currentReaderOffset = offset;
3296
3529
  while (readers[currentDiskNumber] && currentReaderOffset >= readers[currentDiskNumber].size) {
3297
3530
  currentReaderOffset -= readers[currentDiskNumber].size;
@@ -3304,14 +3537,9 @@
3304
3537
  result = await readUint8Array(currentReader, currentReaderOffset, length);
3305
3538
  } else {
3306
3539
  const chunkLength = currentReaderSize - currentReaderOffset;
3307
- result = new Uint8Array(length);
3308
3540
  const firstPart = await readUint8Array(currentReader, currentReaderOffset, chunkLength);
3309
- result.set(firstPart, 0);
3310
- const secondPart = await reader.readUint8Array(offset + chunkLength, length - chunkLength, diskNumber);
3311
- result.set(secondPart, chunkLength);
3312
- if (firstPart.length + secondPart.length < length) {
3313
- result = result.subarray(0, firstPart.length + secondPart.length);
3314
- }
3541
+ const secondPart = await reader.readUint8Array(offset + chunkLength, length - chunkLength);
3542
+ result = concat(firstPart, secondPart);
3315
3543
  }
3316
3544
  } else {
3317
3545
  result = EMPTY_UINT8_ARRAY;
@@ -3336,6 +3564,12 @@
3336
3564
  let diskSourceWriter, diskWritable, diskWriter;
3337
3565
  const writable = new WritableStream({
3338
3566
  async write(chunk) {
3567
+ if (chunk === DISK_BOUNDARY) {
3568
+ if (diskWriter) {
3569
+ await endDisk();
3570
+ }
3571
+ return;
3572
+ }
3339
3573
  const { availableSize } = writer;
3340
3574
  if (!diskWriter) {
3341
3575
  const { value, done } = await writerGenerator.next();
@@ -3355,11 +3589,7 @@
3355
3589
  await this.write(chunk);
3356
3590
  } else if (chunk.length >= availableSize) {
3357
3591
  await writeChunk(chunk.subarray(0, availableSize));
3358
- await closeDisk();
3359
- writer.diskOffset += diskSourceWriter.size;
3360
- writer.diskNumber++;
3361
- diskWriter = null;
3362
- writer.availableSize = writer.maxSize;
3592
+ await endDisk();
3363
3593
  if (chunk.length > availableSize) {
3364
3594
  await this.write(chunk.subarray(availableSize));
3365
3595
  }
@@ -3370,7 +3600,7 @@
3370
3600
  async close() {
3371
3601
  if (diskWriter) {
3372
3602
  await diskWriter.ready;
3373
- await closeDisk();
3603
+ await closeDiskWriter();
3374
3604
  }
3375
3605
  },
3376
3606
  async abort(reason) {
@@ -3395,10 +3625,28 @@
3395
3625
  }
3396
3626
  }
3397
3627
 
3398
- async function closeDisk() {
3628
+ async function endDisk() {
3629
+ await closeDiskWriter();
3630
+ writer.diskOffset += diskSourceWriter.size;
3631
+ writer.diskNumber++;
3632
+ diskWriter = null;
3633
+ writer.availableSize = writer.maxSize;
3634
+ }
3635
+
3636
+ async function closeDiskWriter() {
3399
3637
  await diskWriter.close();
3400
3638
  }
3401
3639
  }
3640
+
3641
+ async closeDisk() {
3642
+ const streamWriter = this.writable.getWriter();
3643
+ try {
3644
+ await streamWriter.ready;
3645
+ await streamWriter.write(DISK_BOUNDARY);
3646
+ } finally {
3647
+ streamWriter.releaseLock();
3648
+ }
3649
+ }
3402
3650
  }
3403
3651
 
3404
3652
  class GenericReader {
@@ -3430,14 +3678,6 @@
3430
3678
  if (writer.size === UNDEFINED_VALUE) {
3431
3679
  writer.size = 0;
3432
3680
  }
3433
- if (!(writer instanceof SplitDataWriter)) {
3434
- Object.assign(writer, {
3435
- diskNumber: 0,
3436
- diskOffset: 0,
3437
- availableSize: INFINITY_VALUE,
3438
- maxSize: INFINITY_VALUE
3439
- });
3440
- }
3441
3681
  return writer;
3442
3682
  }
3443
3683
  }
@@ -3456,8 +3696,8 @@
3456
3696
  }
3457
3697
  }
3458
3698
 
3459
- function readUint8Array(reader, offset, size, diskNumber) {
3460
- return reader.readUint8Array(offset, size, diskNumber);
3699
+ function readUint8Array(reader, offset, size) {
3700
+ return reader.readUint8Array(offset, size);
3461
3701
  }
3462
3702
 
3463
3703
  /*
@@ -3833,7 +4073,7 @@
3833
4073
  const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
3834
4074
  if (!endOfDirectoryInfo) {
3835
4075
  const signatureArray = await readUint8Array(reader, 0, 4);
3836
- const signatureView = getDataView$1(signatureArray);
4076
+ const signatureView = getDataView(signatureArray);
3837
4077
  if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
3838
4078
  throw new Error(ERR_SPLIT_ZIP_FILE);
3839
4079
  } else {
@@ -3843,7 +4083,7 @@
3843
4083
  if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
3844
4084
  throwAmbiguousArchive("multiple end of central directory records");
3845
4085
  }
3846
- const endOfDirectoryView = getDataView$1(endOfDirectoryInfo);
4086
+ const endOfDirectoryView = getDataView(endOfDirectoryInfo);
3847
4087
  let directoryDataLength = getUint32(endOfDirectoryView, 12);
3848
4088
  let directoryDataOffset = getUint32(endOfDirectoryView, 16);
3849
4089
  const commentOffset = endOfDirectoryInfo.offset;
@@ -3859,17 +4099,21 @@
3859
4099
  let prependedDataLength = 0;
3860
4100
  let startOffset;
3861
4101
  let zip64EndOfDirectory;
3862
- if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS) {
4102
+ const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
4103
+ if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
4104
+ directoryDataOffset += getDiskOffset$1(reader, diskNumber);
4105
+ }
4106
+ if (requiresZip64) {
3863
4107
  const endOfDirectoryLocatorArray = endOfDirectoryInfo.offset >= ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH ?
3864
4108
  await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH) :
3865
4109
  EMPTY_UINT8_ARRAY;
3866
- const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray);
4110
+ const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
3867
4111
  if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
3868
4112
  getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
3869
- directoryDataOffset = getBigUint64(endOfDirectoryLocatorView, 8);
3870
- let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
3871
- let endOfDirectoryView = getDataView$1(endOfDirectoryArray);
3872
- const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH - (reader.lastDiskOffset || 0);
4113
+ directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
4114
+ let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4115
+ let endOfDirectoryView = getDataView(endOfDirectoryArray);
4116
+ const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
3873
4117
  if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
3874
4118
  directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
3875
4119
  const originalDirectoryDataOffset = directoryDataOffset;
@@ -3877,8 +4121,8 @@
3877
4121
  if (directoryDataOffset > originalDirectoryDataOffset) {
3878
4122
  prependedDataLength = directoryDataOffset - originalDirectoryDataOffset;
3879
4123
  }
3880
- endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
3881
- endOfDirectoryView = getDataView$1(endOfDirectoryArray);
4124
+ endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4125
+ endOfDirectoryView = getDataView(endOfDirectoryArray);
3882
4126
  }
3883
4127
  if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
3884
4128
  throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
@@ -3904,7 +4148,7 @@
3904
4148
  } else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
3905
4149
  throwAmbiguousArchive("mismatched zip64 end of central directory record");
3906
4150
  }
3907
- directoryDataOffset = getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4151
+ directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
3908
4152
  }
3909
4153
  }
3910
4154
  const declaredDirectoryDataLength = directoryDataLength;
@@ -3921,19 +4165,19 @@
3921
4165
  throw new Error(ERR_BAD_FORMAT);
3922
4166
  }
3923
4167
  let offset = 0;
3924
- let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
3925
- let directoryView = getDataView$1(directoryArray);
4168
+ let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4169
+ let directoryView = getDataView(directoryArray);
3926
4170
  if (directoryDataLength) {
3927
4171
  if (directoryArray.length < 4) {
3928
4172
  throw new Error(ERR_BAD_FORMAT);
3929
4173
  }
3930
- const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength - (reader.lastDiskOffset || 0);
4174
+ const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
3931
4175
  if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
3932
4176
  const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE;
3933
4177
  let reconcile = !storedPointsAtDirectory;
3934
4178
  if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
3935
- const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4, diskNumber);
3936
- reconcile = getUint32(getDataView$1(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
4179
+ const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
4180
+ reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
3937
4181
  }
3938
4182
  if (reconcile) {
3939
4183
  const originalDirectoryDataOffset = directoryDataOffset;
@@ -3941,16 +4185,16 @@
3941
4185
  if (directoryDataOffset > originalDirectoryDataOffset) {
3942
4186
  prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
3943
4187
  }
3944
- directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
3945
- directoryView = getDataView$1(directoryArray);
4188
+ directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4189
+ directoryView = getDataView(directoryArray);
3946
4190
  }
3947
4191
  }
3948
4192
  }
3949
- const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset - (reader.lastDiskOffset || 0);
4193
+ const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset;
3950
4194
  if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0 && diskNumber == lastDiskNumber) {
3951
4195
  directoryDataLength = expectedDirectoryDataLength;
3952
- directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
3953
- directoryView = getDataView$1(directoryArray);
4196
+ directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4197
+ directoryView = getDataView(directoryArray);
3954
4198
  }
3955
4199
  if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) {
3956
4200
  throw new Error(ERR_BAD_FORMAT);
@@ -4023,7 +4267,7 @@
4023
4267
  });
4024
4268
  readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
4025
4269
  fileEntry.offset += prependedDataLength;
4026
- startOffset = Math.min(fileEntry.offset, startOffset);
4270
+ startOffset = Math.min(getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset, startOffset);
4027
4271
  if (checkAmbiguity) {
4028
4272
  if (filenames.has(fileEntry.filename)) {
4029
4273
  duplicateFilename = true;
@@ -4177,8 +4421,9 @@
4177
4421
  dataDescriptor
4178
4422
  } = bitFlag;
4179
4423
  const localDirectory = fileEntry.localDirectory = {};
4180
- const dataArray = await readUint8Array(reader, offset, HEADER_SIZE, diskNumberStart);
4181
- const dataView = getDataView$1(dataArray);
4424
+ const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
4425
+ const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
4426
+ const dataView = getDataView(dataArray);
4182
4427
  let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
4183
4428
  let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
4184
4429
  const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
@@ -4203,12 +4448,12 @@
4203
4448
  const checkAmbiguity = getStrictness(getOptionValue$1(zipEntry, options, OPTION_STRICTNESS), getOptionValue$1(zipEntry, options, OPTION_CHECK_AMBIGUITY)) == STRICTNESS_STRICT;
4204
4449
  let rawLocalFilename = EMPTY_UINT8_ARRAY;
4205
4450
  if (checkAmbiguity && (filenameLength || extraFieldLength)) {
4206
- const trailingDataArray = await readUint8Array(reader, offset + HEADER_SIZE, filenameLength + extraFieldLength, diskNumberStart);
4451
+ const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
4207
4452
  rawLocalFilename = trailingDataArray.subarray(0, filenameLength);
4208
4453
  localDirectory.rawExtraField = trailingDataArray.subarray(filenameLength);
4209
4454
  } else {
4210
4455
  localDirectory.rawExtraField = extraFieldLength ?
4211
- await readUint8Array(reader, offset + HEADER_SIZE + filenameLength, extraFieldLength, diskNumberStart) :
4456
+ await readUint8Array(reader, localHeaderOffset + HEADER_SIZE + filenameLength, extraFieldLength) :
4212
4457
  EMPTY_UINT8_ARRAY;
4213
4458
  }
4214
4459
  readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
@@ -4234,9 +4479,9 @@
4234
4479
  throw new Error(ERR_ENCRYPTED);
4235
4480
  }
4236
4481
  }
4237
- const dataOffset = offset + HEADER_SIZE + filenameLength + extraFieldLength;
4482
+ const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
4238
4483
  const size = compressedSize;
4239
- const readable = reader.createReadable({ offset: dataOffset, size, diskNumberStart, chunkSize: getChunkSize(config) });
4484
+ const readable = reader.createReadable({ offset: dataOffset, size });
4240
4485
  const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
4241
4486
  const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
4242
4487
  let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
@@ -4277,8 +4522,7 @@
4277
4522
  reader,
4278
4523
  fileEntry,
4279
4524
  index,
4280
- offset,
4281
- diskNumberStart,
4525
+ offset: localHeaderOffset,
4282
4526
  signature,
4283
4527
  compressedSize,
4284
4528
  uncompressedSize,
@@ -4342,7 +4586,7 @@
4342
4586
  function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory) {
4343
4587
  const { rawExtraField } = directory;
4344
4588
  const extraField = directory.extraField = new Map();
4345
- const rawExtraFieldView = getDataView$1(new Uint8Array(rawExtraField));
4589
+ const rawExtraFieldView = getDataView(rawExtraField);
4346
4590
  let offsetExtraField = 0;
4347
4591
  try {
4348
4592
  while (offsetExtraField < rawExtraField.length) {
@@ -4414,7 +4658,7 @@
4414
4658
 
4415
4659
  function readExtraFieldZip64(extraFieldZip64, directory) {
4416
4660
  directory.zip64 = true;
4417
- const extraFieldView = getDataView$1(extraFieldZip64.data);
4661
+ const extraFieldView = getDataView(extraFieldZip64.data);
4418
4662
  const missingProperties = ZIP64_PROPERTIES.filter(([propertyName, max]) => directory[propertyName] == max);
4419
4663
  const requiredLength = missingProperties.reduce((length, [, max]) => length + ZIP64_EXTRACTION[max].bytes, 0);
4420
4664
  if (extraFieldZip64.data.length < requiredLength) {
@@ -4433,10 +4677,10 @@
4433
4677
  extraFieldUnicode.valid = false;
4434
4678
  return;
4435
4679
  }
4436
- const extraFieldView = getDataView$1(extraFieldUnicode.data);
4680
+ const extraFieldView = getDataView(extraFieldUnicode.data);
4437
4681
  const crc32 = new Crc32();
4438
4682
  crc32.append(fileEntry[rawPropertyName]);
4439
- const dataViewSignature = getDataView$1(new Uint8Array(4));
4683
+ const dataViewSignature = getDataView(new Uint8Array(4));
4440
4684
  dataViewSignature.setUint32(0, crc32.get(), true);
4441
4685
  const signature = getUint32(extraFieldView, 1);
4442
4686
  Object.assign(extraFieldUnicode, {
@@ -4451,7 +4695,7 @@
4451
4695
  }
4452
4696
 
4453
4697
  function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
4454
- const extraFieldView = getDataView$1(extraFieldAES.data);
4698
+ const extraFieldView = getDataView(extraFieldAES.data);
4455
4699
  const strength = getUint8(extraFieldView, 4);
4456
4700
  Object.assign(extraFieldAES, {
4457
4701
  vendorVersion: getUint8(extraFieldView, 0),
@@ -4464,7 +4708,7 @@
4464
4708
  }
4465
4709
 
4466
4710
  function readExtraFieldNTFS(extraFieldNTFS, directory) {
4467
- const extraFieldView = getDataView$1(extraFieldNTFS.data);
4711
+ const extraFieldView = getDataView(extraFieldNTFS.data);
4468
4712
  let offsetExtraField = 4;
4469
4713
  let tag1Data;
4470
4714
  try {
@@ -4481,7 +4725,7 @@
4481
4725
  }
4482
4726
  try {
4483
4727
  if (tag1Data && tag1Data.length == 24) {
4484
- const tag1View = getDataView$1(tag1Data);
4728
+ const tag1View = getDataView(tag1Data);
4485
4729
  const rawLastModDate = tag1View.getBigUint64(0, true);
4486
4730
  const rawLastAccessDate = tag1View.getBigUint64(8, true);
4487
4731
  const rawCreationDate = tag1View.getBigUint64(16, true);
@@ -4504,7 +4748,7 @@
4504
4748
 
4505
4749
  function readExtraFieldUnix(extraField, directory, isInfoZip) {
4506
4750
  try {
4507
- const view = getDataView$1(new Uint8Array(extraField.data));
4751
+ const view = getDataView(extraField.data);
4508
4752
  let uid, gid;
4509
4753
  if (isInfoZip) {
4510
4754
  let offset = 0;
@@ -4542,7 +4786,7 @@
4542
4786
  if (!extraFieldExtendedTimestamp.data.length) {
4543
4787
  return;
4544
4788
  }
4545
- const extraFieldView = getDataView$1(extraFieldExtendedTimestamp.data);
4789
+ const extraFieldView = getDataView(extraFieldExtendedTimestamp.data);
4546
4790
  const flags = getUint8(extraFieldView, 0);
4547
4791
  const timeProperties = [];
4548
4792
  const timeRawProperties = [];
@@ -4580,7 +4824,6 @@
4580
4824
  fileEntry,
4581
4825
  index,
4582
4826
  offset,
4583
- diskNumberStart,
4584
4827
  signature,
4585
4828
  compressedSize,
4586
4829
  uncompressedSize,
@@ -4589,12 +4832,6 @@
4589
4832
  extraFieldZip64,
4590
4833
  readRanges
4591
4834
  }) {
4592
- let diskOffset = 0;
4593
- if (diskNumberStart && reader.readers) {
4594
- for (let indexReader = 0; indexReader < Math.min(diskNumberStart, reader.readers.length); indexReader++) {
4595
- diskOffset += reader.readers[indexReader].size;
4596
- }
4597
- }
4598
4835
  let dataDescriptorLength = 0;
4599
4836
  if (dataDescriptor) {
4600
4837
  if (extraFieldZip64) {
@@ -4604,19 +4841,19 @@
4604
4841
  }
4605
4842
  }
4606
4843
  if (dataDescriptorLength) {
4607
- const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, diskNumberStart);
4844
+ const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
4608
4845
  const dataDescriptorSignature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
4609
- getUint32(getDataView$1(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
4846
+ getUint32(getDataView(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
4610
4847
  if (dataDescriptorSignature) {
4611
- const readSignature = getUint32(getDataView$1(dataDescriptorArray), 4);
4848
+ const readSignature = getUint32(getDataView(dataDescriptorArray), 4);
4612
4849
  let readCompressedSize;
4613
4850
  let readUncompressedSize;
4614
4851
  if (extraFieldZip64) {
4615
- readCompressedSize = getBigUint64(getDataView$1(dataDescriptorArray), 8);
4616
- readUncompressedSize = getBigUint64(getDataView$1(dataDescriptorArray), 16);
4852
+ readCompressedSize = getBigUint64(getDataView(dataDescriptorArray), 8);
4853
+ readUncompressedSize = getBigUint64(getDataView(dataDescriptorArray), 16);
4617
4854
  } else {
4618
- readCompressedSize = getUint32(getDataView$1(dataDescriptorArray), 8);
4619
- readUncompressedSize = getUint32(getDataView$1(dataDescriptorArray), 12);
4855
+ readCompressedSize = getUint32(getDataView(dataDescriptorArray), 8);
4856
+ readUncompressedSize = getUint32(getDataView(dataDescriptorArray), 12);
4620
4857
  }
4621
4858
  const matchSignature = (fileEntry.encrypted && !fileEntry.zipCrypto) || readSignature == signature;
4622
4859
  if (matchSignature &&
@@ -4627,8 +4864,8 @@
4627
4864
  }
4628
4865
  }
4629
4866
  const range = {
4630
- start: diskOffset + offset,
4631
- end: diskOffset + dataOffset + compressedSize + dataDescriptorLength,
4867
+ start: offset,
4868
+ end: dataOffset + compressedSize + dataDescriptorLength,
4632
4869
  fileEntry
4633
4870
  };
4634
4871
  for (const [otherIndex, otherRange] of readRanges) {
@@ -4641,6 +4878,10 @@
4641
4878
  readRanges.set(index, range);
4642
4879
  }
4643
4880
 
4881
+ function getDiskOffset$1(reader, diskNumber) {
4882
+ return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
4883
+ }
4884
+
4644
4885
  function getStrictness(strictness, checkAmbiguity) {
4645
4886
  if (strictness === UNDEFINED_VALUE) {
4646
4887
  return checkAmbiguity ? STRICTNESS_STRICT : STRICTNESS_BALANCED;
@@ -4724,7 +4965,7 @@
4724
4965
  async function* scanEndOfCentralDirectory(reader, scanLength) {
4725
4966
  const scanOffset = reader.size - scanLength;
4726
4967
  const scanArray = await readUint8Array(reader, scanOffset, scanLength);
4727
- const scanView = getDataView$1(scanArray);
4968
+ const scanView = getDataView(scanArray);
4728
4969
  for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
4729
4970
  if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
4730
4971
  yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
@@ -4747,7 +4988,8 @@
4747
4988
  if (!filesLength && !directoryDataLength) {
4748
4989
  return CENTRAL_DIRECTORY_PLAUSIBLE;
4749
4990
  }
4750
- for (const centralDirectoryOffset of [offset - directoryDataLength, directoryDataOffset]) {
4991
+ const directoryDiskNumber = getUint16(view, indexByte + 6);
4992
+ for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
4751
4993
  if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
4752
4994
  return CENTRAL_DIRECTORY_REACHABLE;
4753
4995
  }
@@ -4765,7 +5007,7 @@
4765
5007
  if (remoteProbeBudget.count > 0) {
4766
5008
  remoteProbeBudget.count--;
4767
5009
  const signatureArray = await readUint8Array(reader, signatureOffset, 4);
4768
- return getUint32(getDataView$1(signatureArray), 0);
5010
+ return getUint32(getDataView(signatureArray), 0);
4769
5011
  }
4770
5012
  return UNDEFINED_VALUE;
4771
5013
  }
@@ -4830,9 +5072,27 @@
4830
5072
  return Number(view.getBigUint64(offset, true));
4831
5073
  }
4832
5074
 
4833
- function getDataView$1(array) {
4834
- return new DataView(array.buffer, array.byteOffset, array.byteLength);
4835
- }
5075
+ var zipReader = /*#__PURE__*/Object.freeze({
5076
+ __proto__: null,
5077
+ ERR_AMBIGUOUS_ARCHIVE: ERR_AMBIGUOUS_ARCHIVE,
5078
+ ERR_BAD_FORMAT: ERR_BAD_FORMAT,
5079
+ ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
5080
+ ERR_ENCRYPTED: ERR_ENCRYPTED,
5081
+ ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
5082
+ ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
5083
+ ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
5084
+ ERR_INVALID_COMPRESSED_DATA: ERR_INVALID_COMPRESSED_DATA,
5085
+ ERR_INVALID_PASSWORD: ERR_INVALID_PASSWORD,
5086
+ ERR_INVALID_SIGNATURE: ERR_INVALID_SIGNATURE,
5087
+ ERR_INVALID_UNCOMPRESSED_SIZE: ERR_INVALID_UNCOMPRESSED_SIZE,
5088
+ ERR_LOCAL_FILE_HEADER_NOT_FOUND: ERR_LOCAL_FILE_HEADER_NOT_FOUND,
5089
+ ERR_OVERLAPPING_ENTRY: ERR_OVERLAPPING_ENTRY,
5090
+ ERR_SPLIT_ZIP_FILE: ERR_SPLIT_ZIP_FILE,
5091
+ ERR_UNSUPPORTED_COMPRESSION: ERR_UNSUPPORTED_COMPRESSION$1,
5092
+ ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
5093
+ ZipReader: ZipReader,
5094
+ ZipReaderStream: ZipReaderStream
5095
+ });
4836
5096
 
4837
5097
  /*
4838
5098
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -4897,9 +5157,10 @@
4897
5157
 
4898
5158
  constructor(writer, options = {}) {
4899
5159
  writer = new GenericWriter(writer);
5160
+ const { availableSize = INFINITY_VALUE, maxSize = INFINITY_VALUE } = writer;
4900
5161
  const addSplitZipSignature =
4901
- writer.availableSize !== UNDEFINED_VALUE && writer.availableSize > 0 && writer.availableSize !== INFINITY_VALUE &&
4902
- writer.maxSize !== UNDEFINED_VALUE && writer.maxSize > 0 && writer.maxSize !== INFINITY_VALUE;
5162
+ availableSize > 0 && availableSize !== INFINITY_VALUE &&
5163
+ maxSize > 0 && maxSize !== INFINITY_VALUE;
4903
5164
  Object.assign(this, {
4904
5165
  writer,
4905
5166
  addSplitZipSignature,
@@ -4921,9 +5182,10 @@
4921
5182
  }
4922
5183
  reader = new GenericReader(reader);
4923
5184
  await initStream(reader);
4924
- const zipReader = new ZipReader(reader.readable);
4925
- const entries = await zipReader.getEntries();
4926
- await zipReader.close();
5185
+ const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
5186
+ const zipReader$1 = new ZipReader(reader.readable);
5187
+ const entries = await zipReader$1.getEntries();
5188
+ await zipReader$1.close();
4927
5189
  await initStream(this.writer);
4928
5190
  await reader.readable.pipeTo(this.writer.writable, { preventClose: true, preventAbort: true });
4929
5191
  this.writer.size = this.offset = reader.size;
@@ -4939,8 +5201,6 @@
4939
5201
  encrypted,
4940
5202
  uncompressedSize,
4941
5203
  compressedSize,
4942
- diskOffset,
4943
- diskNumber,
4944
5204
  zip64
4945
5205
  } = entry;
4946
5206
  let {
@@ -4988,8 +5248,9 @@
4988
5248
  Object.assign(entry, {
4989
5249
  zip64UncompressedSize,
4990
5250
  zip64CompressedSize,
4991
- zip64Offset: zip64 && this.offset - diskOffset >= MAX_32_BITS,
4992
- zip64DiskNumberStart: zip64 && diskNumber >= MAX_16_BITS,
5251
+ zip64Offset: zip64 && entry.offset >= MAX_32_BITS,
5252
+ diskNumberStart: 0,
5253
+ zip64DiskNumberStart: false,
4993
5254
  rawExtraFieldZip64,
4994
5255
  rawExtraFieldAES,
4995
5256
  rawExtraFieldExtendedTimestamp,
@@ -5156,7 +5417,8 @@
5156
5417
  try {
5157
5418
  const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
5158
5419
  ({ reader } = sizesInfo);
5159
- const { diskOffset, diskNumber } = zipWriter.writer;
5420
+ const diskOffset = getDiskOffset(zipWriter.writer);
5421
+ const diskNumber = getDiskNumber(zipWriter.writer);
5160
5422
  options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
5161
5423
  internalFileAttribute: metadataInfo.resolvedOptions.internalFileAttributes,
5162
5424
  externalFileAttribute: attributesInfo.resolvedOptions.externalFileAttributes,
@@ -5333,7 +5595,7 @@
5333
5595
  const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
5334
5596
  const keepOrder = getOptionValue(zipWriter, options, OPTION_KEEP_ORDER, true);
5335
5597
  const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
5336
- const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS, true);
5598
+ const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
5337
5599
  const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
5338
5600
  const createTempStream = getOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
5339
5601
  const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
@@ -5531,7 +5793,7 @@
5531
5793
  await requestLockWriter();
5532
5794
  }
5533
5795
  await initStream(fileWriter);
5534
- const { diskOffset } = writer;
5796
+ const diskOffset = getDiskOffset(writer);
5535
5797
  if (zipWriter.addSplitZipSignature) {
5536
5798
  delete zipWriter.addSplitZipSignature;
5537
5799
  const signatureArray = new Uint8Array(4);
@@ -5548,7 +5810,7 @@
5548
5810
  await lockPreviousFileEntry;
5549
5811
  await skipDiskIfNeeded();
5550
5812
  }
5551
- const diskNumberStart = writer.diskNumber;
5813
+ const diskNumberStart = getDiskNumber(writer);
5552
5814
  const entryOffset = getSegmentOffset(zipWriter, writer);
5553
5815
  fileEntry.diskNumberStart = diskNumberStart;
5554
5816
  if (!bufferedWrite) {
@@ -5568,11 +5830,11 @@
5568
5830
  writingBufferedEntryData = true;
5569
5831
  writerSizeBeforeEntry = writer.size;
5570
5832
  await skipDiskIfNeeded();
5571
- fileEntry.diskNumberStart = writer.diskNumber;
5833
+ fileEntry.diskNumberStart = getDiskNumber(writer);
5572
5834
  fileEntry.offset = getSegmentOffset(zipWriter, writer);
5573
5835
  if (usdz) {
5574
5836
  const previousMetadataSize = entryInfo.metadataSize;
5575
- appendExtraFieldUSDZ(entryInfo, zipWriter.offset - writer.diskOffset);
5837
+ appendExtraFieldUSDZ(entryInfo, zipWriter.offset - getDiskOffset(writer));
5576
5838
  fileEntry.size += entryInfo.metadataSize - previousMetadataSize;
5577
5839
  }
5578
5840
  updateLocalHeader(fileEntry, headerInfo.localHeaderView, options);
@@ -5637,9 +5899,8 @@
5637
5899
  }
5638
5900
 
5639
5901
  async function skipDiskIfNeeded() {
5640
- if (getLength(headerInfo.localHeaderArray) > writer.availableSize) {
5641
- writer.availableSize = 0;
5642
- await writeData(writer, EMPTY_UINT8_ARRAY);
5902
+ if (exceedsAvailableSize(writer, getLength(headerInfo.localHeaderArray))) {
5903
+ await writer.closeDisk();
5643
5904
  }
5644
5905
  }
5645
5906
  }
@@ -5750,7 +6011,7 @@
5750
6011
  }
5751
6012
  const { writable } = writer;
5752
6013
  if (reader) {
5753
- const readable = reader.createReadable ? reader.createReadable({ chunkSize: getChunkSize(config) }) : reader.readable;
6014
+ const readable = reader.createReadable ? reader.createReadable() : reader.readable;
5754
6015
  const size = reader.size;
5755
6016
  const workerOptions = {
5756
6017
  options: {
@@ -6182,8 +6443,8 @@
6182
6443
 
6183
6444
  async function closeFile(zipWriter, comment, options) {
6184
6445
  const directoryDataLength = createDirectoryRecords(zipWriter.files);
6185
- const { cdStartDiskNumber, cdStartDiskOffset } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
6186
- await writeEndOfDirectoryRecord(zipWriter, comment, options, { cdStartDiskNumber, cdStartDiskOffset, directoryDataLength });
6446
+ const directoryStart = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
6447
+ await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength });
6187
6448
  }
6188
6449
 
6189
6450
  function createDirectoryRecords(files) {
@@ -6265,8 +6526,8 @@
6265
6526
  await initStream(writer);
6266
6527
  let offset = 0;
6267
6528
  let directoryDiskOffset = 0;
6268
- let cdStartDiskNumber = writer.diskNumber;
6269
- let cdStartDiskOffset = writer.diskOffset;
6529
+ let directoryStartDiskNumber = getDiskNumber(writer);
6530
+ let directoryStartDiskOffset = getDiskOffset(writer);
6270
6531
  for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
6271
6532
  const {
6272
6533
  offset: fileEntryOffset,
@@ -6293,15 +6554,14 @@
6293
6554
  } = fileEntry;
6294
6555
  const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
6295
6556
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
6296
- if (offset + directoryRecordLength - directoryDiskOffset > writer.availableSize) {
6557
+ if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
6297
6558
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
6298
6559
  directoryDiskOffset = offset;
6299
- writer.availableSize = 0;
6300
- await writeData(writer, EMPTY_UINT8_ARRAY);
6560
+ await writer.closeDisk();
6301
6561
  }
6302
6562
  if (indexFileEntry == 0) {
6303
- cdStartDiskNumber = writer.diskNumber;
6304
- cdStartDiskOffset = writer.diskOffset;
6563
+ directoryStartDiskNumber = getDiskNumber(writer);
6564
+ directoryStartDiskOffset = getDiskOffset(writer);
6305
6565
  }
6306
6566
  if (!zip64UncompressedSize) {
6307
6567
  setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, uncompressedSize);
@@ -6341,18 +6601,18 @@
6341
6601
  }
6342
6602
  }
6343
6603
  await writeData(writer, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
6344
- return { cdStartDiskNumber, cdStartDiskOffset };
6604
+ return { diskNumber: directoryStartDiskNumber, diskOffset: directoryStartDiskOffset };
6345
6605
  }
6346
6606
 
6347
6607
  async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
6348
6608
  const { writer } = zipWriter;
6349
- const { cdStartDiskNumber, cdStartDiskOffset } = cdInfo;
6609
+ const { directoryStart } = cdInfo;
6350
6610
  let { directoryDataLength } = cdInfo;
6351
6611
  let filesLength = zipWriter.files.size;
6352
- let diskNumber = cdStartDiskNumber;
6353
- let directoryOffset = zipWriter.offset - cdStartDiskOffset - (cdStartDiskNumber ? zipWriter.initialOffset : 0);
6354
- let lastDiskNumber = writer.diskNumber;
6355
- if (writer.availableSize < END_OF_CENTRAL_DIR_LENGTH) {
6612
+ let diskNumber = directoryStart.diskNumber;
6613
+ let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
6614
+ let lastDiskNumber = getDiskNumber(writer);
6615
+ if (exceedsAvailableSize(writer, END_OF_CENTRAL_DIR_LENGTH)) {
6356
6616
  lastDiskNumber++;
6357
6617
  }
6358
6618
  let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
@@ -6368,11 +6628,10 @@
6368
6628
  throw new Error(ERR_INVALID_COMMENT);
6369
6629
  }
6370
6630
  const endOfdirectoryRecord = createRecordWriter(zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
6371
- if (getLength(endOfdirectoryRecord.array) + commentLength > writer.availableSize) {
6372
- writer.availableSize = 0;
6373
- await writeData(writer, EMPTY_UINT8_ARRAY);
6631
+ if (exceedsAvailableSize(writer, getLength(endOfdirectoryRecord.array) + commentLength)) {
6632
+ await writer.closeDisk();
6374
6633
  }
6375
- lastDiskNumber = writer.diskNumber;
6634
+ lastDiskNumber = getDiskNumber(writer);
6376
6635
  if (zip64) {
6377
6636
  endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
6378
6637
  endOfdirectoryRecord.uint64(44);
@@ -6386,7 +6645,7 @@
6386
6645
  endOfdirectoryRecord.uint64(directoryOffset);
6387
6646
  endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
6388
6647
  endOfdirectoryRecord.uint32(lastDiskNumber);
6389
- endOfdirectoryRecord.uint64(BigInt(zipWriter.offset) + BigInt(directoryDataLength) - BigInt(writer.diskOffset) - BigInt(writer.diskNumber ? zipWriter.initialOffset : 0));
6648
+ endOfdirectoryRecord.uint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength));
6390
6649
  endOfdirectoryRecord.uint32(lastDiskNumber + 1);
6391
6650
  const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
6392
6651
  if (supportZip64SplitFile) {
@@ -6426,8 +6685,23 @@
6426
6685
  };
6427
6686
  }
6428
6687
 
6429
- function getSegmentOffset(zipWriter, writer) {
6430
- return zipWriter.offset - writer.diskOffset - (writer.diskNumber ? zipWriter.initialOffset : 0);
6688
+ function getDiskNumber(writer) {
6689
+ const { diskNumber = 0 } = writer;
6690
+ return diskNumber;
6691
+ }
6692
+
6693
+ function getDiskOffset(writer) {
6694
+ const { diskOffset = 0 } = writer;
6695
+ return diskOffset;
6696
+ }
6697
+
6698
+ function exceedsAvailableSize(writer, length) {
6699
+ const { availableSize = INFINITY_VALUE } = writer;
6700
+ return length > availableSize;
6701
+ }
6702
+
6703
+ function getSegmentOffset(zipWriter, { diskNumber = 0, diskOffset = 0 }) {
6704
+ return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
6431
6705
  }
6432
6706
 
6433
6707
  async function writeData(writer, array) {
@@ -6504,9 +6778,6 @@
6504
6778
  array.set(typedArray, offset);
6505
6779
  }
6506
6780
 
6507
- function getDataView(array) {
6508
- return new DataView(array.buffer, array.byteOffset, array.byteLength);
6509
- }
6510
6781
 
6511
6782
  function getLength(...arrayLikes) {
6512
6783
  let result = 0;
@@ -7047,7 +7318,7 @@
7047
7318
 
7048
7319
 
7049
7320
  try {
7050
- configure({ baseURI: (typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('zip-native.js', document.baseURI).href)) });
7321
+ setDefaultConfiguration({ baseURI: (typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('zip-native.js', document.baseURI).href)) });
7051
7322
  } catch {
7052
7323
  // ignored
7053
7324
  }
@@ -7083,7 +7354,7 @@
7083
7354
  */
7084
7355
 
7085
7356
 
7086
- configure({
7357
+ setDefaultConfiguration({
7087
7358
  workerURI: "./core/web-worker-native.js",
7088
7359
  wasmURI: null,
7089
7360
  CompressionStreamZlib: E_,
@@ -7119,7 +7390,7 @@
7119
7390
  */
7120
7391
 
7121
7392
 
7122
- i(configure);
7393
+ Y(setDefaultConfiguration);
7123
7394
 
7124
7395
  exports.BlobReader = BlobReader;
7125
7396
  exports.BlobWriter = BlobWriter;
@@ -7134,6 +7405,7 @@
7134
7405
  exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
7135
7406
  exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
7136
7407
  exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
7408
+ exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
7137
7409
  exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
7138
7410
  exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
7139
7411
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
@@ -7175,6 +7447,7 @@
7175
7447
  exports.createOPFSTempStream = createOPFSTempStream;
7176
7448
  exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
7177
7449
  exports.getMimeType = getMimeType;
7450
+ exports.resetConfiguration = resetConfiguration;
7178
7451
  exports.terminateWorkers = terminateWorkers;
7179
7452
 
7180
7453
  }));