@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
package/index-native.cjs CHANGED
@@ -156,6 +156,7 @@ const DEFAULT_CONFIGURATION = {
156
156
  workerStarvationTimeout: 5000,
157
157
  useWebWorkers: true,
158
158
  useCompressionStream: true,
159
+ transferStreams: true,
159
160
  CompressionStream: typeof CompressionStream != UNDEFINED_TYPE && CompressionStream,
160
161
  DecompressionStream: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream
161
162
  };
@@ -170,13 +171,14 @@ const CONFIGURABLE_PROPERTY_NAMES = [
170
171
  "workerStarvationTimeout",
171
172
  "useCompressionStream",
172
173
  "useWebWorkers",
174
+ "transferStreams",
173
175
  "CompressionStream",
174
176
  "DecompressionStream",
175
177
  "CompressionStreamZlib",
176
178
  "DecompressionStreamZlib"
177
179
  ];
178
180
 
179
- const config = Object.assign({}, DEFAULT_CONFIGURATION);
181
+ const config = { ...DEFAULT_CONFIGURATION };
180
182
 
181
183
  function getConfiguration() {
182
184
  return config;
@@ -195,7 +197,24 @@ function configure(configuration) {
195
197
  }
196
198
  }
197
199
 
198
- 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)}});}
200
+ function setDefaultConfiguration(configuration) {
201
+ for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
202
+ const propertyValue = configuration[propertyName];
203
+ if (propertyValue !== UNDEFINED_VALUE) {
204
+ DEFAULT_CONFIGURATION[propertyName] = propertyValue;
205
+ }
206
+ }
207
+ configure(configuration);
208
+ }
209
+
210
+ function resetConfiguration() {
211
+ for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
212
+ delete config[propertyName];
213
+ }
214
+ Object.assign(config, DEFAULT_CONFIGURATION);
215
+ }
216
+
217
+ 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)}});}
199
218
 
200
219
  /*
201
220
  Copyright (c) 2022 Gildas Lormeau. All rights reserved.
@@ -379,6 +398,50 @@ function encodeText(value) {
379
398
  }
380
399
  }
381
400
 
401
+ /*
402
+ Copyright (c) 2026 Gildas Lormeau. All rights reserved.
403
+
404
+ Redistribution and use in source and binary forms, with or without
405
+ modification, are permitted provided that the following conditions are met:
406
+
407
+ 1. Redistributions of source code must retain the above copyright notice,
408
+ this list of conditions and the following disclaimer.
409
+
410
+ 2. Redistributions in binary form must reproduce the above copyright
411
+ notice, this list of conditions and the following disclaimer in
412
+ the documentation and/or other materials provided with the distribution.
413
+
414
+ 3. The names of the authors may not be used to endorse or promote products
415
+ derived from this software without specific prior written permission.
416
+
417
+ THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
418
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
419
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
420
+ INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
421
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
422
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
423
+ OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
424
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
425
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
426
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
427
+ */
428
+
429
+
430
+ function concat(first, second) {
431
+ const result = new Uint8Array(first.length + second.length);
432
+ result.set(first);
433
+ result.set(second, first.length);
434
+ return result;
435
+ }
436
+
437
+ function toExactUint8Array(array) {
438
+ return array.byteOffset || array.byteLength != array.buffer.byteLength ? new Uint8Array(array) : array;
439
+ }
440
+
441
+ function getDataView(array) {
442
+ return new DataView(array.buffer, array.byteOffset, array.byteLength);
443
+ }
444
+
382
445
  // Derived from https://github.com/xqdoo00o/jszip/blob/master/lib/sjcl.js and https://github.com/bitwiseshiftleft/sjcl
383
446
 
384
447
  // deno-lint-ignore-file no-this-alias
@@ -1483,16 +1546,6 @@ function encodePassword(password, rawPassword) {
1483
1546
  }
1484
1547
  }
1485
1548
 
1486
- function concat(leftArray, rightArray) {
1487
- let array = leftArray;
1488
- if (leftArray.length + rightArray.length) {
1489
- array = new Uint8Array(leftArray.length + rightArray.length);
1490
- array.set(leftArray, 0);
1491
- array.set(rightArray, leftArray.length);
1492
- }
1493
- return array;
1494
- }
1495
-
1496
1549
  function expand(inputArray, length) {
1497
1550
  if (length && length > inputArray.length) {
1498
1551
  const array = inputArray;
@@ -1754,44 +1807,34 @@ class GzipToRawDeflateStream extends TransformStream {
1754
1807
  constructor() {
1755
1808
  // deno-lint-ignore prefer-const
1756
1809
  let stream;
1757
- let headerLeft = GZIP_HEADER_LENGTH;
1758
- let tail = new Uint8Array(0);
1810
+ let headerBytesLeft = GZIP_HEADER_LENGTH;
1811
+ let trailerCandidate = new Uint8Array(0);
1759
1812
  super({
1760
1813
  transform(chunk, controller) {
1761
- if (headerLeft) {
1762
- const dropped = Math.min(headerLeft, chunk.length);
1763
- headerLeft -= dropped;
1764
- chunk = chunk.subarray(dropped);
1814
+ if (headerBytesLeft) {
1815
+ const droppedLength = Math.min(headerBytesLeft, chunk.length);
1816
+ headerBytesLeft -= droppedLength;
1817
+ chunk = chunk.subarray(droppedLength);
1765
1818
  if (!chunk.length) {
1766
1819
  return;
1767
1820
  }
1768
1821
  }
1769
- const available = tail.length + chunk.length;
1770
- if (available <= GZIP_TRAILER_LENGTH) {
1771
- const pending = new Uint8Array(available);
1772
- pending.set(tail);
1773
- pending.set(chunk, tail.length);
1774
- tail = pending;
1822
+ const availableLength = trailerCandidate.length + chunk.length;
1823
+ if (availableLength <= GZIP_TRAILER_LENGTH) {
1824
+ trailerCandidate = concat(trailerCandidate, chunk);
1775
1825
  return;
1776
1826
  }
1777
- const emitLength = available - GZIP_TRAILER_LENGTH;
1778
- const output = new Uint8Array(emitLength);
1779
- const fromTail = Math.min(emitLength, tail.length);
1780
- output.set(tail.subarray(0, fromTail), 0);
1781
- if (emitLength > fromTail) {
1782
- output.set(chunk.subarray(0, emitLength - fromTail), fromTail);
1783
- }
1784
- controller.enqueue(output);
1785
- const nextTail = new Uint8Array(GZIP_TRAILER_LENGTH);
1786
- const tailRemaining = tail.length - fromTail;
1787
- if (tailRemaining) {
1788
- nextTail.set(tail.subarray(fromTail), 0);
1789
- }
1790
- nextTail.set(chunk.subarray(emitLength - fromTail), tailRemaining);
1791
- tail = nextTail;
1827
+ const emitLength = availableLength - GZIP_TRAILER_LENGTH;
1828
+ const emittedFromTrailer = Math.min(emitLength, trailerCandidate.length);
1829
+ controller.enqueue(concat(
1830
+ trailerCandidate.subarray(0, emittedFromTrailer),
1831
+ chunk.subarray(0, emitLength - emittedFromTrailer)));
1832
+ trailerCandidate = concat(
1833
+ trailerCandidate.subarray(emittedFromTrailer),
1834
+ chunk.subarray(emitLength - emittedFromTrailer));
1792
1835
  },
1793
1836
  flush() {
1794
- const dataView = new DataView(tail.buffer, tail.byteOffset, tail.byteLength);
1837
+ const dataView = getDataView(trailerCandidate);
1795
1838
  stream.signature = dataView.getUint32(0, true);
1796
1839
  stream.uncompressedSize = dataView.getUint32(4, true);
1797
1840
  }
@@ -1966,7 +2009,7 @@ function mapInflateStreamError(readable) {
1966
2009
  */
1967
2010
 
1968
2011
 
1969
- const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
2012
+ const DEFAULT_CHUNK_SIZE = 64 * 1024;
1970
2013
  const MESSAGE_EVENT_TYPE = "message";
1971
2014
  const MESSAGE_START = "start";
1972
2015
  const MESSAGE_PULL = "pull";
@@ -2034,33 +2077,54 @@ class CodecStream extends TransformStream {
2034
2077
  class ChunkStream extends TransformStream {
2035
2078
 
2036
2079
  constructor(chunkSize) {
2037
- let pendingChunk;
2038
- if (!(chunkSize >= 1)) {
2039
- chunkSize = DEFAULT_CHUNK_SIZE$1;
2080
+ const pendingChunks = [];
2081
+ let pendingLength = 0;
2082
+ if (!Number.isFinite(chunkSize) || chunkSize < 1) {
2083
+ chunkSize = DEFAULT_CHUNK_SIZE;
2040
2084
  }
2041
2085
  super({
2042
- transform,
2086
+ transform(chunk, controller) {
2087
+ pendingChunks.push(chunk);
2088
+ pendingLength += chunk.length;
2089
+ while (pendingLength > chunkSize) {
2090
+ controller.enqueue(shiftChunk());
2091
+ }
2092
+ },
2043
2093
  flush(controller) {
2044
- if (pendingChunk && pendingChunk.length) {
2045
- controller.enqueue(pendingChunk);
2094
+ if (pendingLength) {
2095
+ controller.enqueue(concatChunks(pendingChunks, pendingLength));
2046
2096
  }
2047
2097
  }
2048
2098
  });
2049
2099
 
2050
- function transform(chunk, controller) {
2051
- if (pendingChunk) {
2052
- const newChunk = new Uint8Array(pendingChunk.length + chunk.length);
2053
- newChunk.set(pendingChunk);
2054
- newChunk.set(chunk, pendingChunk.length);
2055
- chunk = newChunk;
2056
- pendingChunk = null;
2100
+ function shiftChunk() {
2101
+ const result = new Uint8Array(chunkSize);
2102
+ let resultOffset = 0;
2103
+ while (resultOffset < chunkSize) {
2104
+ const firstChunk = pendingChunks[0];
2105
+ const remainingLength = chunkSize - resultOffset;
2106
+ if (firstChunk.length <= remainingLength) {
2107
+ result.set(firstChunk, resultOffset);
2108
+ resultOffset += firstChunk.length;
2109
+ pendingChunks.shift();
2110
+ } else {
2111
+ result.set(firstChunk.subarray(0, remainingLength), resultOffset);
2112
+ pendingChunks[0] = firstChunk.subarray(remainingLength);
2113
+ resultOffset += remainingLength;
2114
+ }
2057
2115
  }
2116
+ pendingLength -= chunkSize;
2117
+ return result;
2118
+ }
2119
+
2120
+ function concatChunks(chunks, length) {
2121
+ const result = new Uint8Array(length);
2058
2122
  let offset = 0;
2059
- while (chunk.length - offset > chunkSize) {
2060
- controller.enqueue(chunk.slice(offset, offset + chunkSize));
2061
- offset += chunkSize;
2123
+ for (const chunk of chunks) {
2124
+ result.set(chunk, offset);
2125
+ offset += chunk.length;
2062
2126
  }
2063
- pendingChunk = offset ? chunk.slice(offset) : chunk;
2127
+ return result;
2064
2128
  }
2065
2129
  }
2066
2130
  }
@@ -2242,7 +2306,10 @@ async function runWorker$1({ options, readable, writable, onTaskFinished }, conf
2242
2306
  }
2243
2307
  }
2244
2308
  codecStream = new CodecStream(options, config);
2245
- await readable.pipeThrough(codecStream).pipeTo(writable, { preventClose: true, preventAbort: true });
2309
+ await readable
2310
+ .pipeThrough(codecStream)
2311
+ .pipeThrough(new ChunkStream(getChunkSize(config)))
2312
+ .pipeTo(writable, { preventClose: true, preventAbort: true });
2246
2313
  const {
2247
2314
  signature,
2248
2315
  inputSize,
@@ -2441,7 +2508,7 @@ function sendMessage(message, { worker, writer, transferStreams }) {
2441
2508
  const { value, readable, writable } = message;
2442
2509
  const transferables = [];
2443
2510
  if (value) {
2444
- message.value = value.byteOffset || value.byteLength != value.buffer.byteLength ? new Uint8Array(value) : value;
2511
+ message.value = toExactUint8Array(value);
2445
2512
  transferables.push(message.value.buffer);
2446
2513
  }
2447
2514
  if (transferStreams && transferStreamsSupported) {
@@ -2565,8 +2632,8 @@ async function runWorker(stream, workerOptions) {
2565
2632
  const { options, config } = workerOptions;
2566
2633
  const { transferStreams, useWebWorkers, useCompressionStream, compressed, signed, encrypted } = options;
2567
2634
  const { workerURI, maxWorkers } = config;
2568
- workerOptions.transferStreams = transferStreams || transferStreams === UNDEFINED_VALUE;
2569
- const streamCopy = !compressed && !signed && !encrypted && !workerOptions.transferStreams;
2635
+ workerOptions.transferStreams = transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams);
2636
+ const streamCopy = !compressed && !signed && !encrypted;
2570
2637
  workerOptions.useWebWorkers = !streamCopy && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
2571
2638
  workerOptions.workerURI = workerOptions.useWebWorkers && workerURI ? workerURI : UNDEFINED_VALUE;
2572
2639
  options.useCompressionStream = useCompressionStream || (useCompressionStream === UNDEFINED_VALUE && config.useCompressionStream);
@@ -2700,6 +2767,7 @@ async function terminateWorkers() {
2700
2767
 
2701
2768
  const ERR_HTTP_STATUS = "HTTP error ";
2702
2769
  const ERR_HTTP_RANGE = "HTTP Range not supported";
2770
+ const ERR_HTTP_RESOURCE_CHANGED = "HTTP resource changed";
2703
2771
  const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
2704
2772
  const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
2705
2773
 
@@ -2710,13 +2778,16 @@ const HTTP_HEADER_CONTENT_RANGE = "Content-Range";
2710
2778
  const HTTP_HEADER_ACCEPT_RANGES = "Accept-Ranges";
2711
2779
  const HTTP_HEADER_RANGE = "Range";
2712
2780
  const HTTP_HEADER_CONTENT_TYPE = "Content-Type";
2781
+ const HTTP_HEADER_ETAG = "Etag";
2782
+ const HTTP_HEADER_LAST_MODIFIED = "Last-Modified";
2713
2783
  const HTTP_METHOD_HEAD = "HEAD";
2714
2784
  const HTTP_METHOD_GET = "GET";
2715
2785
  const HTTP_RANGE_UNIT = "bytes";
2716
- const DEFAULT_CHUNK_SIZE = 64 * 1024;
2717
2786
  const DEFAULT_BUFFER_SIZE = 256 * 1024;
2787
+ const DEFAULT_MAXIMUM_RANGE_SIZE = 16 * 1024 * 1024;
2718
2788
 
2719
2789
  const PROPERTY_NAME_WRITABLE = "writable";
2790
+ const DISK_BOUNDARY = Symbol();
2720
2791
 
2721
2792
  class Stream {
2722
2793
 
@@ -2735,13 +2806,13 @@ class Reader extends Stream {
2735
2806
  return this.createReadable();
2736
2807
  }
2737
2808
 
2738
- createReadable({ offset = 0, size, diskNumberStart, chunkSize = DEFAULT_CHUNK_SIZE } = {}) {
2809
+ createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
2739
2810
  const reader = this;
2740
2811
  let chunkOffset = 0;
2741
2812
  return new ReadableStream({
2742
2813
  async pull(controller) {
2743
2814
  const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
2744
- const data = await readUint8Array(reader, offset + chunkOffset, dataSize, diskNumberStart);
2815
+ const data = await readUint8Array(reader, offset + chunkOffset, dataSize);
2745
2816
  controller.enqueue(data);
2746
2817
  if ((chunkOffset + chunkSize > size) || (size === UNDEFINED_VALUE && !data.length && dataSize)) {
2747
2818
  controller.close();
@@ -2763,7 +2834,7 @@ class Writer extends Stream {
2763
2834
  if (!writer.initialized) {
2764
2835
  throw new Error(ERR_WRITER_NOT_INITIALIZED);
2765
2836
  }
2766
- return writer.writeUint8Array(chunk);
2837
+ return writer.writeUint8Array(toExactUint8Array(chunk));
2767
2838
  }
2768
2839
  });
2769
2840
  Object.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
@@ -2850,6 +2921,27 @@ class Data64URIWriter extends Writer {
2850
2921
  }
2851
2922
  }
2852
2923
 
2924
+ let blobSliceReliable;
2925
+ let blobSliceProbe;
2926
+
2927
+ function probeBlobSliceReliability() {
2928
+ blobSliceProbe = (async () => {
2929
+ try {
2930
+ const slicedBlob = new Blob([new Uint8Array(3)]).slice(1, 2);
2931
+ const streamReader = slicedBlob.stream().getReader();
2932
+ let streamedLength = 0;
2933
+ let result = await streamReader.read();
2934
+ while (!result.done) {
2935
+ streamedLength += result.value.length;
2936
+ result = await streamReader.read();
2937
+ }
2938
+ blobSliceReliable = streamedLength == 1;
2939
+ } catch {
2940
+ blobSliceReliable = false;
2941
+ }
2942
+ })();
2943
+ }
2944
+
2853
2945
  class BlobReader extends Reader {
2854
2946
 
2855
2947
  constructor(blob) {
@@ -2858,14 +2950,32 @@ class BlobReader extends Reader {
2858
2950
  blob,
2859
2951
  size: blob.size
2860
2952
  });
2953
+ if (!blobSliceProbe) {
2954
+ probeBlobSliceReliability();
2955
+ }
2956
+ }
2957
+
2958
+ createReadable(options) {
2959
+ const reader = this;
2960
+ const { blob, size } = reader;
2961
+ const { offset = 0, size: readSize = size - offset } = options || {};
2962
+ if (!offset && readSize >= size) {
2963
+ return blob.stream();
2964
+ }
2965
+ if (blobSliceReliable) {
2966
+ return blob.slice(offset, offset + readSize).stream();
2967
+ }
2968
+ return super.createReadable(options);
2861
2969
  }
2862
2970
 
2863
2971
  async readUint8Array(offset, length) {
2864
2972
  const reader = this;
2865
2973
  const offsetEnd = offset + length;
2866
- const blob = offset || offsetEnd < reader.size ? reader.blob.slice(offset, offsetEnd) : reader.blob;
2974
+ const readsWholeBlob = !offset && offsetEnd >= reader.size;
2975
+ const blob = readsWholeBlob ? reader.blob : reader.blob.slice(offset, offsetEnd);
2867
2976
  let arrayBuffer = await blob.arrayBuffer();
2868
- if (arrayBuffer.byteLength > length) {
2977
+ const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
2978
+ if (sliceIgnoredByBuggyImplementation) {
2869
2979
  arrayBuffer = arrayBuffer.slice(offset, offsetEnd);
2870
2980
  }
2871
2981
  return new Uint8Array(arrayBuffer);
@@ -2946,6 +3056,18 @@ class FetchReader extends Reader {
2946
3056
  super.init();
2947
3057
  }
2948
3058
 
3059
+ createReadable(options) {
3060
+ const reader = this;
3061
+ const { useRangeHeader, forceRangeRequests, size } = reader;
3062
+ if ((useRangeHeader || forceRangeRequests) && size !== UNDEFINED_VALUE) {
3063
+ const { offset = 0, size: readSize = size - offset } = options || {};
3064
+ if (readSize > 0 && offset < size) {
3065
+ return createRangeReadable(reader, offset, Math.min(readSize, size - offset));
3066
+ }
3067
+ }
3068
+ return super.createReadable(options);
3069
+ }
3070
+
2949
3071
  readUint8Array(index, length) {
2950
3072
  return readUint8ArrayHttpReader(this, index, length, sendFetchRequest, getFetchRequestData);
2951
3073
  }
@@ -2974,6 +3096,8 @@ function createHttpReader(httpReader, url, options) {
2974
3096
  useRangeHeader,
2975
3097
  forceRangeRequests,
2976
3098
  combineSizeEocd,
3099
+ checkResourceChanges = true,
3100
+ maximumRangeSize = DEFAULT_MAXIMUM_RANGE_SIZE,
2977
3101
  fetch
2978
3102
  } = options;
2979
3103
  options = Object.assign({}, options);
@@ -2981,6 +3105,8 @@ function createHttpReader(httpReader, url, options) {
2981
3105
  delete options.useRangeHeader;
2982
3106
  delete options.forceRangeRequests;
2983
3107
  delete options.combineSizeEocd;
3108
+ delete options.checkResourceChanges;
3109
+ delete options.maximumRangeSize;
2984
3110
  delete options.useXHR;
2985
3111
  delete options.fetch;
2986
3112
  Object.assign(httpReader, {
@@ -2990,6 +3116,8 @@ function createHttpReader(httpReader, url, options) {
2990
3116
  useRangeHeader,
2991
3117
  forceRangeRequests,
2992
3118
  combineSizeEocd,
3119
+ checkResourceChanges,
3120
+ maximumRangeSize,
2993
3121
  fetch
2994
3122
  });
2995
3123
  }
@@ -3014,17 +3142,8 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
3014
3142
  httpReader.eocdCache = eocdCache;
3015
3143
  }
3016
3144
  }
3017
- let contentSize;
3018
- const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
3019
- if (contentRangeHeader) {
3020
- const splitHeader = contentRangeHeader.trim().split(/\s*\/\s*/);
3021
- if (splitHeader.length) {
3022
- const headerValue = splitHeader[1];
3023
- if (headerValue && headerValue != "*") {
3024
- contentSize = Number(headerValue);
3025
- }
3026
- }
3027
- }
3145
+ setResourceValidators(httpReader, response);
3146
+ const contentSize = getContentRangeSize(response);
3028
3147
  if (contentSize === UNDEFINED_VALUE) {
3029
3148
  await getContentLength(httpReader, sendRequest, getRequestData);
3030
3149
  } else {
@@ -3065,6 +3184,8 @@ async function readUint8ArrayHttpReader(httpReader, index, length, sendRequest,
3065
3184
  throw new Error(ERR_HTTP_RANGE);
3066
3185
  }
3067
3186
  }
3187
+ checkResourceValidators(httpReader, response);
3188
+ setResourceValidators(httpReader, response);
3068
3189
  const data = new Uint8Array(await response.arrayBuffer());
3069
3190
  if (data.length != length) {
3070
3191
  throw new Error(ERR_HTTP_RANGE);
@@ -3076,7 +3197,114 @@ async function readUint8ArrayHttpReader(httpReader, index, length, sendRequest,
3076
3197
  if (!data) {
3077
3198
  await getRequestData(httpReader, options);
3078
3199
  }
3079
- return new Uint8Array(httpReader.data.subarray(index, index + length));
3200
+ return httpReader.data.subarray(index, index + length);
3201
+ }
3202
+ }
3203
+
3204
+ function createRangeReadable(httpReader, offset, size) {
3205
+ let bodyReader;
3206
+ let windowOffset = offset;
3207
+ let windowRemainingLength = 0;
3208
+ let remainingLength = size;
3209
+ return new ReadableStream({
3210
+ start() {
3211
+ return openWindow();
3212
+ },
3213
+ async pull(controller) {
3214
+ if (!bodyReader) {
3215
+ await openWindow();
3216
+ }
3217
+ const { value, done } = await bodyReader.read();
3218
+ if (done) {
3219
+ throw new Error(ERR_HTTP_RANGE);
3220
+ }
3221
+ const chunk = value.length > windowRemainingLength ? value.subarray(0, windowRemainingLength) : value;
3222
+ windowRemainingLength -= chunk.length;
3223
+ remainingLength -= chunk.length;
3224
+ if (chunk.length) {
3225
+ controller.enqueue(chunk);
3226
+ }
3227
+ if (!windowRemainingLength) {
3228
+ await closeWindow();
3229
+ if (!remainingLength) {
3230
+ controller.close();
3231
+ }
3232
+ }
3233
+ },
3234
+ cancel(reason) {
3235
+ return bodyReader && bodyReader.cancel(reason);
3236
+ }
3237
+ });
3238
+
3239
+ async function openWindow() {
3240
+ const windowLength = Math.min(httpReader.maximumRangeSize, remainingLength);
3241
+ const response = await sendFetchRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, windowOffset, windowLength));
3242
+ if (response.status != 206) {
3243
+ throw new Error(ERR_HTTP_RANGE);
3244
+ }
3245
+ const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
3246
+ if (contentRangeHeader) {
3247
+ const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
3248
+ if (!Number.isNaN(rangeStart) && rangeStart != windowOffset) {
3249
+ throw new Error(ERR_HTTP_RANGE);
3250
+ }
3251
+ }
3252
+ checkResourceValidators(httpReader, response);
3253
+ setResourceValidators(httpReader, response);
3254
+ windowOffset += windowLength;
3255
+ windowRemainingLength = windowLength;
3256
+ bodyReader = response.body.getReader();
3257
+ }
3258
+
3259
+ async function closeWindow() {
3260
+ const currentBodyReader = bodyReader;
3261
+ bodyReader = UNDEFINED_VALUE;
3262
+ await currentBodyReader.cancel();
3263
+ }
3264
+ }
3265
+
3266
+ function getContentRangeSize(response) {
3267
+ const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
3268
+ if (contentRangeHeader) {
3269
+ const headerValue = contentRangeHeader.trim().split(/\s*\/\s*/)[1];
3270
+ if (headerValue && headerValue != "*") {
3271
+ const contentSize = Number(headerValue);
3272
+ if (!Number.isNaN(contentSize)) {
3273
+ return contentSize;
3274
+ }
3275
+ }
3276
+ }
3277
+ }
3278
+
3279
+ function getResourceValidators({ headers }) {
3280
+ return {
3281
+ etag: headers.get(HTTP_HEADER_ETAG) || UNDEFINED_VALUE,
3282
+ lastModified: headers.get(HTTP_HEADER_LAST_MODIFIED) || UNDEFINED_VALUE
3283
+ };
3284
+ }
3285
+
3286
+ function setResourceValidators(httpReader, response) {
3287
+ const { checkResourceChanges, resourceValidators } = httpReader;
3288
+ if (checkResourceChanges && !resourceValidators && response.status == 206) {
3289
+ httpReader.resourceValidators = getResourceValidators(response);
3290
+ }
3291
+ }
3292
+
3293
+ function checkResourceValidators(httpReader, response) {
3294
+ const { checkResourceChanges, resourceValidators, size } = httpReader;
3295
+ if (checkResourceChanges) {
3296
+ const contentRangeSize = getContentRangeSize(response);
3297
+ if (contentRangeSize !== UNDEFINED_VALUE && size !== UNDEFINED_VALUE && contentRangeSize != size) {
3298
+ throw new Error(ERR_HTTP_RESOURCE_CHANGED);
3299
+ }
3300
+ if (resourceValidators) {
3301
+ const validators = getResourceValidators(response);
3302
+ const changed = Object.entries(resourceValidators).some(([name, value]) =>
3303
+ value !== UNDEFINED_VALUE && validators[name] !== UNDEFINED_VALUE && value != validators[name]);
3304
+ if (changed) {
3305
+ throw new Error(ERR_HTTP_RESOURCE_CHANGED);
3306
+ }
3307
+ }
3080
3308
  }
3081
3309
  }
3082
3310
 
@@ -3187,6 +3415,10 @@ class HttpReader extends Reader {
3187
3415
  super.init();
3188
3416
  }
3189
3417
 
3418
+ createReadable(options) {
3419
+ return this.reader.createReadable(options);
3420
+ }
3421
+
3190
3422
  readUint8Array(index, length) {
3191
3423
  return this.reader.readUint8Array(index, length);
3192
3424
  }
@@ -3267,25 +3499,26 @@ class SplitDataReader extends Reader {
3267
3499
  const reader = this;
3268
3500
  const { readers } = reader;
3269
3501
  reader.lastDiskNumber = 0;
3270
- reader.lastDiskOffset = 0;
3271
- await Promise.all(readers.map(async (diskReader, indexDiskReader) => {
3272
- await initStream(diskReader);
3273
- if (indexDiskReader != readers.length - 1) {
3274
- reader.lastDiskOffset += diskReader.size;
3275
- }
3502
+ await Promise.all(readers.map(diskReader => initStream(diskReader)));
3503
+ reader.diskOffsets = readers.map(diskReader => {
3504
+ const diskOffset = reader.size;
3276
3505
  reader.size += diskReader.size;
3277
- }));
3506
+ return diskOffset;
3507
+ });
3278
3508
  super.init();
3279
3509
  }
3280
3510
 
3281
- async readUint8Array(offset, length, diskNumber = 0) {
3511
+ getDiskOffset(diskNumber) {
3512
+ const { diskOffsets, size } = this;
3513
+ const diskOffset = diskOffsets.at(diskNumber);
3514
+ return diskOffset === UNDEFINED_VALUE ? size : diskOffset;
3515
+ }
3516
+
3517
+ async readUint8Array(offset, length) {
3282
3518
  const reader = this;
3283
3519
  const { readers } = this;
3284
3520
  let result;
3285
- let currentDiskNumber = diskNumber;
3286
- if (currentDiskNumber == -1) {
3287
- currentDiskNumber = readers.length - 1;
3288
- }
3521
+ let currentDiskNumber = 0;
3289
3522
  let currentReaderOffset = offset;
3290
3523
  while (readers[currentDiskNumber] && currentReaderOffset >= readers[currentDiskNumber].size) {
3291
3524
  currentReaderOffset -= readers[currentDiskNumber].size;
@@ -3298,14 +3531,9 @@ class SplitDataReader extends Reader {
3298
3531
  result = await readUint8Array(currentReader, currentReaderOffset, length);
3299
3532
  } else {
3300
3533
  const chunkLength = currentReaderSize - currentReaderOffset;
3301
- result = new Uint8Array(length);
3302
3534
  const firstPart = await readUint8Array(currentReader, currentReaderOffset, chunkLength);
3303
- result.set(firstPart, 0);
3304
- const secondPart = await reader.readUint8Array(offset + chunkLength, length - chunkLength, diskNumber);
3305
- result.set(secondPart, chunkLength);
3306
- if (firstPart.length + secondPart.length < length) {
3307
- result = result.subarray(0, firstPart.length + secondPart.length);
3308
- }
3535
+ const secondPart = await reader.readUint8Array(offset + chunkLength, length - chunkLength);
3536
+ result = concat(firstPart, secondPart);
3309
3537
  }
3310
3538
  } else {
3311
3539
  result = EMPTY_UINT8_ARRAY;
@@ -3330,6 +3558,12 @@ class SplitDataWriter extends Stream {
3330
3558
  let diskSourceWriter, diskWritable, diskWriter;
3331
3559
  const writable = new WritableStream({
3332
3560
  async write(chunk) {
3561
+ if (chunk === DISK_BOUNDARY) {
3562
+ if (diskWriter) {
3563
+ await endDisk();
3564
+ }
3565
+ return;
3566
+ }
3333
3567
  const { availableSize } = writer;
3334
3568
  if (!diskWriter) {
3335
3569
  const { value, done } = await writerGenerator.next();
@@ -3349,11 +3583,7 @@ class SplitDataWriter extends Stream {
3349
3583
  await this.write(chunk);
3350
3584
  } else if (chunk.length >= availableSize) {
3351
3585
  await writeChunk(chunk.subarray(0, availableSize));
3352
- await closeDisk();
3353
- writer.diskOffset += diskSourceWriter.size;
3354
- writer.diskNumber++;
3355
- diskWriter = null;
3356
- writer.availableSize = writer.maxSize;
3586
+ await endDisk();
3357
3587
  if (chunk.length > availableSize) {
3358
3588
  await this.write(chunk.subarray(availableSize));
3359
3589
  }
@@ -3364,7 +3594,7 @@ class SplitDataWriter extends Stream {
3364
3594
  async close() {
3365
3595
  if (diskWriter) {
3366
3596
  await diskWriter.ready;
3367
- await closeDisk();
3597
+ await closeDiskWriter();
3368
3598
  }
3369
3599
  },
3370
3600
  async abort(reason) {
@@ -3389,10 +3619,28 @@ class SplitDataWriter extends Stream {
3389
3619
  }
3390
3620
  }
3391
3621
 
3392
- async function closeDisk() {
3622
+ async function endDisk() {
3623
+ await closeDiskWriter();
3624
+ writer.diskOffset += diskSourceWriter.size;
3625
+ writer.diskNumber++;
3626
+ diskWriter = null;
3627
+ writer.availableSize = writer.maxSize;
3628
+ }
3629
+
3630
+ async function closeDiskWriter() {
3393
3631
  await diskWriter.close();
3394
3632
  }
3395
3633
  }
3634
+
3635
+ async closeDisk() {
3636
+ const streamWriter = this.writable.getWriter();
3637
+ try {
3638
+ await streamWriter.ready;
3639
+ await streamWriter.write(DISK_BOUNDARY);
3640
+ } finally {
3641
+ streamWriter.releaseLock();
3642
+ }
3643
+ }
3396
3644
  }
3397
3645
 
3398
3646
  class GenericReader {
@@ -3424,14 +3672,6 @@ class GenericWriter {
3424
3672
  if (writer.size === UNDEFINED_VALUE) {
3425
3673
  writer.size = 0;
3426
3674
  }
3427
- if (!(writer instanceof SplitDataWriter)) {
3428
- Object.assign(writer, {
3429
- diskNumber: 0,
3430
- diskOffset: 0,
3431
- availableSize: INFINITY_VALUE,
3432
- maxSize: INFINITY_VALUE
3433
- });
3434
- }
3435
3675
  return writer;
3436
3676
  }
3437
3677
  }
@@ -3450,8 +3690,8 @@ async function initStream(stream, initSize) {
3450
3690
  }
3451
3691
  }
3452
3692
 
3453
- function readUint8Array(reader, offset, size, diskNumber) {
3454
- return reader.readUint8Array(offset, size, diskNumber);
3693
+ function readUint8Array(reader, offset, size) {
3694
+ return reader.readUint8Array(offset, size);
3455
3695
  }
3456
3696
 
3457
3697
  /*
@@ -3827,7 +4067,7 @@ class ZipReader {
3827
4067
  const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
3828
4068
  if (!endOfDirectoryInfo) {
3829
4069
  const signatureArray = await readUint8Array(reader, 0, 4);
3830
- const signatureView = getDataView$1(signatureArray);
4070
+ const signatureView = getDataView(signatureArray);
3831
4071
  if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
3832
4072
  throw new Error(ERR_SPLIT_ZIP_FILE);
3833
4073
  } else {
@@ -3837,7 +4077,7 @@ class ZipReader {
3837
4077
  if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
3838
4078
  throwAmbiguousArchive("multiple end of central directory records");
3839
4079
  }
3840
- const endOfDirectoryView = getDataView$1(endOfDirectoryInfo);
4080
+ const endOfDirectoryView = getDataView(endOfDirectoryInfo);
3841
4081
  let directoryDataLength = getUint32(endOfDirectoryView, 12);
3842
4082
  let directoryDataOffset = getUint32(endOfDirectoryView, 16);
3843
4083
  const commentOffset = endOfDirectoryInfo.offset;
@@ -3853,17 +4093,21 @@ class ZipReader {
3853
4093
  let prependedDataLength = 0;
3854
4094
  let startOffset;
3855
4095
  let zip64EndOfDirectory;
3856
- if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS) {
4096
+ const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
4097
+ if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
4098
+ directoryDataOffset += getDiskOffset$1(reader, diskNumber);
4099
+ }
4100
+ if (requiresZip64) {
3857
4101
  const endOfDirectoryLocatorArray = endOfDirectoryInfo.offset >= ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH ?
3858
4102
  await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH) :
3859
4103
  EMPTY_UINT8_ARRAY;
3860
- const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray);
4104
+ const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
3861
4105
  if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
3862
4106
  getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
3863
- directoryDataOffset = getBigUint64(endOfDirectoryLocatorView, 8);
3864
- let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
3865
- let endOfDirectoryView = getDataView$1(endOfDirectoryArray);
3866
- const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH - (reader.lastDiskOffset || 0);
4107
+ directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
4108
+ let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4109
+ let endOfDirectoryView = getDataView(endOfDirectoryArray);
4110
+ const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
3867
4111
  if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
3868
4112
  directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
3869
4113
  const originalDirectoryDataOffset = directoryDataOffset;
@@ -3871,8 +4115,8 @@ class ZipReader {
3871
4115
  if (directoryDataOffset > originalDirectoryDataOffset) {
3872
4116
  prependedDataLength = directoryDataOffset - originalDirectoryDataOffset;
3873
4117
  }
3874
- endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
3875
- endOfDirectoryView = getDataView$1(endOfDirectoryArray);
4118
+ endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4119
+ endOfDirectoryView = getDataView(endOfDirectoryArray);
3876
4120
  }
3877
4121
  if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
3878
4122
  throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
@@ -3898,7 +4142,7 @@ class ZipReader {
3898
4142
  } else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
3899
4143
  throwAmbiguousArchive("mismatched zip64 end of central directory record");
3900
4144
  }
3901
- directoryDataOffset = getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4145
+ directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
3902
4146
  }
3903
4147
  }
3904
4148
  const declaredDirectoryDataLength = directoryDataLength;
@@ -3915,19 +4159,19 @@ class ZipReader {
3915
4159
  throw new Error(ERR_BAD_FORMAT);
3916
4160
  }
3917
4161
  let offset = 0;
3918
- let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
3919
- let directoryView = getDataView$1(directoryArray);
4162
+ let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4163
+ let directoryView = getDataView(directoryArray);
3920
4164
  if (directoryDataLength) {
3921
4165
  if (directoryArray.length < 4) {
3922
4166
  throw new Error(ERR_BAD_FORMAT);
3923
4167
  }
3924
- const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength - (reader.lastDiskOffset || 0);
4168
+ const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
3925
4169
  if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
3926
4170
  const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE;
3927
4171
  let reconcile = !storedPointsAtDirectory;
3928
4172
  if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
3929
- const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4, diskNumber);
3930
- reconcile = getUint32(getDataView$1(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
4173
+ const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
4174
+ reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
3931
4175
  }
3932
4176
  if (reconcile) {
3933
4177
  const originalDirectoryDataOffset = directoryDataOffset;
@@ -3935,16 +4179,16 @@ class ZipReader {
3935
4179
  if (directoryDataOffset > originalDirectoryDataOffset) {
3936
4180
  prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
3937
4181
  }
3938
- directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
3939
- directoryView = getDataView$1(directoryArray);
4182
+ directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4183
+ directoryView = getDataView(directoryArray);
3940
4184
  }
3941
4185
  }
3942
4186
  }
3943
- const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset - (reader.lastDiskOffset || 0);
4187
+ const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset;
3944
4188
  if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0 && diskNumber == lastDiskNumber) {
3945
4189
  directoryDataLength = expectedDirectoryDataLength;
3946
- directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
3947
- directoryView = getDataView$1(directoryArray);
4190
+ directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4191
+ directoryView = getDataView(directoryArray);
3948
4192
  }
3949
4193
  if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) {
3950
4194
  throw new Error(ERR_BAD_FORMAT);
@@ -4017,7 +4261,7 @@ class ZipReader {
4017
4261
  });
4018
4262
  readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
4019
4263
  fileEntry.offset += prependedDataLength;
4020
- startOffset = Math.min(fileEntry.offset, startOffset);
4264
+ startOffset = Math.min(getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset, startOffset);
4021
4265
  if (checkAmbiguity) {
4022
4266
  if (filenames.has(fileEntry.filename)) {
4023
4267
  duplicateFilename = true;
@@ -4171,8 +4415,9 @@ let ZipEntry$1 = class ZipEntry {
4171
4415
  dataDescriptor
4172
4416
  } = bitFlag;
4173
4417
  const localDirectory = fileEntry.localDirectory = {};
4174
- const dataArray = await readUint8Array(reader, offset, HEADER_SIZE, diskNumberStart);
4175
- const dataView = getDataView$1(dataArray);
4418
+ const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
4419
+ const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
4420
+ const dataView = getDataView(dataArray);
4176
4421
  let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
4177
4422
  let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
4178
4423
  const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
@@ -4197,12 +4442,12 @@ let ZipEntry$1 = class ZipEntry {
4197
4442
  const checkAmbiguity = getStrictness(getOptionValue$1(zipEntry, options, OPTION_STRICTNESS), getOptionValue$1(zipEntry, options, OPTION_CHECK_AMBIGUITY)) == STRICTNESS_STRICT;
4198
4443
  let rawLocalFilename = EMPTY_UINT8_ARRAY;
4199
4444
  if (checkAmbiguity && (filenameLength || extraFieldLength)) {
4200
- const trailingDataArray = await readUint8Array(reader, offset + HEADER_SIZE, filenameLength + extraFieldLength, diskNumberStart);
4445
+ const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
4201
4446
  rawLocalFilename = trailingDataArray.subarray(0, filenameLength);
4202
4447
  localDirectory.rawExtraField = trailingDataArray.subarray(filenameLength);
4203
4448
  } else {
4204
4449
  localDirectory.rawExtraField = extraFieldLength ?
4205
- await readUint8Array(reader, offset + HEADER_SIZE + filenameLength, extraFieldLength, diskNumberStart) :
4450
+ await readUint8Array(reader, localHeaderOffset + HEADER_SIZE + filenameLength, extraFieldLength) :
4206
4451
  EMPTY_UINT8_ARRAY;
4207
4452
  }
4208
4453
  readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
@@ -4228,9 +4473,9 @@ let ZipEntry$1 = class ZipEntry {
4228
4473
  throw new Error(ERR_ENCRYPTED);
4229
4474
  }
4230
4475
  }
4231
- const dataOffset = offset + HEADER_SIZE + filenameLength + extraFieldLength;
4476
+ const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
4232
4477
  const size = compressedSize;
4233
- const readable = reader.createReadable({ offset: dataOffset, size, diskNumberStart, chunkSize: getChunkSize(config) });
4478
+ const readable = reader.createReadable({ offset: dataOffset, size });
4234
4479
  const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
4235
4480
  const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
4236
4481
  let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
@@ -4271,8 +4516,7 @@ let ZipEntry$1 = class ZipEntry {
4271
4516
  reader,
4272
4517
  fileEntry,
4273
4518
  index,
4274
- offset,
4275
- diskNumberStart,
4519
+ offset: localHeaderOffset,
4276
4520
  signature,
4277
4521
  compressedSize,
4278
4522
  uncompressedSize,
@@ -4336,7 +4580,7 @@ function readCommonHeader(directory, dataView, offset) {
4336
4580
  function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory) {
4337
4581
  const { rawExtraField } = directory;
4338
4582
  const extraField = directory.extraField = new Map();
4339
- const rawExtraFieldView = getDataView$1(new Uint8Array(rawExtraField));
4583
+ const rawExtraFieldView = getDataView(rawExtraField);
4340
4584
  let offsetExtraField = 0;
4341
4585
  try {
4342
4586
  while (offsetExtraField < rawExtraField.length) {
@@ -4408,7 +4652,7 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
4408
4652
 
4409
4653
  function readExtraFieldZip64(extraFieldZip64, directory) {
4410
4654
  directory.zip64 = true;
4411
- const extraFieldView = getDataView$1(extraFieldZip64.data);
4655
+ const extraFieldView = getDataView(extraFieldZip64.data);
4412
4656
  const missingProperties = ZIP64_PROPERTIES.filter(([propertyName, max]) => directory[propertyName] == max);
4413
4657
  const requiredLength = missingProperties.reduce((length, [, max]) => length + ZIP64_EXTRACTION[max].bytes, 0);
4414
4658
  if (extraFieldZip64.data.length < requiredLength) {
@@ -4427,10 +4671,10 @@ function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName,
4427
4671
  extraFieldUnicode.valid = false;
4428
4672
  return;
4429
4673
  }
4430
- const extraFieldView = getDataView$1(extraFieldUnicode.data);
4674
+ const extraFieldView = getDataView(extraFieldUnicode.data);
4431
4675
  const crc32 = new Crc32();
4432
4676
  crc32.append(fileEntry[rawPropertyName]);
4433
- const dataViewSignature = getDataView$1(new Uint8Array(4));
4677
+ const dataViewSignature = getDataView(new Uint8Array(4));
4434
4678
  dataViewSignature.setUint32(0, crc32.get(), true);
4435
4679
  const signature = getUint32(extraFieldView, 1);
4436
4680
  Object.assign(extraFieldUnicode, {
@@ -4445,7 +4689,7 @@ function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName,
4445
4689
  }
4446
4690
 
4447
4691
  function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
4448
- const extraFieldView = getDataView$1(extraFieldAES.data);
4692
+ const extraFieldView = getDataView(extraFieldAES.data);
4449
4693
  const strength = getUint8(extraFieldView, 4);
4450
4694
  Object.assign(extraFieldAES, {
4451
4695
  vendorVersion: getUint8(extraFieldView, 0),
@@ -4458,7 +4702,7 @@ function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
4458
4702
  }
4459
4703
 
4460
4704
  function readExtraFieldNTFS(extraFieldNTFS, directory) {
4461
- const extraFieldView = getDataView$1(extraFieldNTFS.data);
4705
+ const extraFieldView = getDataView(extraFieldNTFS.data);
4462
4706
  let offsetExtraField = 4;
4463
4707
  let tag1Data;
4464
4708
  try {
@@ -4475,7 +4719,7 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
4475
4719
  }
4476
4720
  try {
4477
4721
  if (tag1Data && tag1Data.length == 24) {
4478
- const tag1View = getDataView$1(tag1Data);
4722
+ const tag1View = getDataView(tag1Data);
4479
4723
  const rawLastModDate = tag1View.getBigUint64(0, true);
4480
4724
  const rawLastAccessDate = tag1View.getBigUint64(8, true);
4481
4725
  const rawCreationDate = tag1View.getBigUint64(16, true);
@@ -4498,7 +4742,7 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
4498
4742
 
4499
4743
  function readExtraFieldUnix(extraField, directory, isInfoZip) {
4500
4744
  try {
4501
- const view = getDataView$1(new Uint8Array(extraField.data));
4745
+ const view = getDataView(extraField.data);
4502
4746
  let uid, gid;
4503
4747
  if (isInfoZip) {
4504
4748
  let offset = 0;
@@ -4536,7 +4780,7 @@ function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory,
4536
4780
  if (!extraFieldExtendedTimestamp.data.length) {
4537
4781
  return;
4538
4782
  }
4539
- const extraFieldView = getDataView$1(extraFieldExtendedTimestamp.data);
4783
+ const extraFieldView = getDataView(extraFieldExtendedTimestamp.data);
4540
4784
  const flags = getUint8(extraFieldView, 0);
4541
4785
  const timeProperties = [];
4542
4786
  const timeRawProperties = [];
@@ -4574,7 +4818,6 @@ async function detectOverlappingEntry({
4574
4818
  fileEntry,
4575
4819
  index,
4576
4820
  offset,
4577
- diskNumberStart,
4578
4821
  signature,
4579
4822
  compressedSize,
4580
4823
  uncompressedSize,
@@ -4583,12 +4826,6 @@ async function detectOverlappingEntry({
4583
4826
  extraFieldZip64,
4584
4827
  readRanges
4585
4828
  }) {
4586
- let diskOffset = 0;
4587
- if (diskNumberStart && reader.readers) {
4588
- for (let indexReader = 0; indexReader < Math.min(diskNumberStart, reader.readers.length); indexReader++) {
4589
- diskOffset += reader.readers[indexReader].size;
4590
- }
4591
- }
4592
4829
  let dataDescriptorLength = 0;
4593
4830
  if (dataDescriptor) {
4594
4831
  if (extraFieldZip64) {
@@ -4598,19 +4835,19 @@ async function detectOverlappingEntry({
4598
4835
  }
4599
4836
  }
4600
4837
  if (dataDescriptorLength) {
4601
- const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, diskNumberStart);
4838
+ const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
4602
4839
  const dataDescriptorSignature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
4603
- getUint32(getDataView$1(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
4840
+ getUint32(getDataView(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
4604
4841
  if (dataDescriptorSignature) {
4605
- const readSignature = getUint32(getDataView$1(dataDescriptorArray), 4);
4842
+ const readSignature = getUint32(getDataView(dataDescriptorArray), 4);
4606
4843
  let readCompressedSize;
4607
4844
  let readUncompressedSize;
4608
4845
  if (extraFieldZip64) {
4609
- readCompressedSize = getBigUint64(getDataView$1(dataDescriptorArray), 8);
4610
- readUncompressedSize = getBigUint64(getDataView$1(dataDescriptorArray), 16);
4846
+ readCompressedSize = getBigUint64(getDataView(dataDescriptorArray), 8);
4847
+ readUncompressedSize = getBigUint64(getDataView(dataDescriptorArray), 16);
4611
4848
  } else {
4612
- readCompressedSize = getUint32(getDataView$1(dataDescriptorArray), 8);
4613
- readUncompressedSize = getUint32(getDataView$1(dataDescriptorArray), 12);
4849
+ readCompressedSize = getUint32(getDataView(dataDescriptorArray), 8);
4850
+ readUncompressedSize = getUint32(getDataView(dataDescriptorArray), 12);
4614
4851
  }
4615
4852
  const matchSignature = (fileEntry.encrypted && !fileEntry.zipCrypto) || readSignature == signature;
4616
4853
  if (matchSignature &&
@@ -4621,8 +4858,8 @@ async function detectOverlappingEntry({
4621
4858
  }
4622
4859
  }
4623
4860
  const range = {
4624
- start: diskOffset + offset,
4625
- end: diskOffset + dataOffset + compressedSize + dataDescriptorLength,
4861
+ start: offset,
4862
+ end: dataOffset + compressedSize + dataDescriptorLength,
4626
4863
  fileEntry
4627
4864
  };
4628
4865
  for (const [otherIndex, otherRange] of readRanges) {
@@ -4635,6 +4872,10 @@ async function detectOverlappingEntry({
4635
4872
  readRanges.set(index, range);
4636
4873
  }
4637
4874
 
4875
+ function getDiskOffset$1(reader, diskNumber) {
4876
+ return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
4877
+ }
4878
+
4638
4879
  function getStrictness(strictness, checkAmbiguity) {
4639
4880
  if (strictness === UNDEFINED_VALUE) {
4640
4881
  return checkAmbiguity ? STRICTNESS_STRICT : STRICTNESS_BALANCED;
@@ -4718,7 +4959,7 @@ async function seekEndOfCentralDirectory(reader, maxAppendedDataSize, remoteProb
4718
4959
  async function* scanEndOfCentralDirectory(reader, scanLength) {
4719
4960
  const scanOffset = reader.size - scanLength;
4720
4961
  const scanArray = await readUint8Array(reader, scanOffset, scanLength);
4721
- const scanView = getDataView$1(scanArray);
4962
+ const scanView = getDataView(scanArray);
4722
4963
  for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
4723
4964
  if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
4724
4965
  yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
@@ -4741,7 +4982,8 @@ async function getCentralDirectoryReachability(reader, view, anchoredOffset, ind
4741
4982
  if (!filesLength && !directoryDataLength) {
4742
4983
  return CENTRAL_DIRECTORY_PLAUSIBLE;
4743
4984
  }
4744
- for (const centralDirectoryOffset of [offset - directoryDataLength, directoryDataOffset]) {
4985
+ const directoryDiskNumber = getUint16(view, indexByte + 6);
4986
+ for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
4745
4987
  if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
4746
4988
  return CENTRAL_DIRECTORY_REACHABLE;
4747
4989
  }
@@ -4759,7 +5001,7 @@ async function readSignature(reader, view, anchoredOffset, signatureOffset, size
4759
5001
  if (remoteProbeBudget.count > 0) {
4760
5002
  remoteProbeBudget.count--;
4761
5003
  const signatureArray = await readUint8Array(reader, signatureOffset, 4);
4762
- return getUint32(getDataView$1(signatureArray), 0);
5004
+ return getUint32(getDataView(signatureArray), 0);
4763
5005
  }
4764
5006
  return UNDEFINED_VALUE;
4765
5007
  }
@@ -4824,9 +5066,27 @@ function getBigUint64(view, offset) {
4824
5066
  return Number(view.getBigUint64(offset, true));
4825
5067
  }
4826
5068
 
4827
- function getDataView$1(array) {
4828
- return new DataView(array.buffer, array.byteOffset, array.byteLength);
4829
- }
5069
+ var zipReader = /*#__PURE__*/Object.freeze({
5070
+ __proto__: null,
5071
+ ERR_AMBIGUOUS_ARCHIVE: ERR_AMBIGUOUS_ARCHIVE,
5072
+ ERR_BAD_FORMAT: ERR_BAD_FORMAT,
5073
+ ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
5074
+ ERR_ENCRYPTED: ERR_ENCRYPTED,
5075
+ ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
5076
+ ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
5077
+ ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
5078
+ ERR_INVALID_COMPRESSED_DATA: ERR_INVALID_COMPRESSED_DATA,
5079
+ ERR_INVALID_PASSWORD: ERR_INVALID_PASSWORD,
5080
+ ERR_INVALID_SIGNATURE: ERR_INVALID_SIGNATURE,
5081
+ ERR_INVALID_UNCOMPRESSED_SIZE: ERR_INVALID_UNCOMPRESSED_SIZE,
5082
+ ERR_LOCAL_FILE_HEADER_NOT_FOUND: ERR_LOCAL_FILE_HEADER_NOT_FOUND,
5083
+ ERR_OVERLAPPING_ENTRY: ERR_OVERLAPPING_ENTRY,
5084
+ ERR_SPLIT_ZIP_FILE: ERR_SPLIT_ZIP_FILE,
5085
+ ERR_UNSUPPORTED_COMPRESSION: ERR_UNSUPPORTED_COMPRESSION$1,
5086
+ ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
5087
+ ZipReader: ZipReader,
5088
+ ZipReaderStream: ZipReaderStream
5089
+ });
4830
5090
 
4831
5091
  /*
4832
5092
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -4891,9 +5151,10 @@ class ZipWriter {
4891
5151
 
4892
5152
  constructor(writer, options = {}) {
4893
5153
  writer = new GenericWriter(writer);
5154
+ const { availableSize = INFINITY_VALUE, maxSize = INFINITY_VALUE } = writer;
4894
5155
  const addSplitZipSignature =
4895
- writer.availableSize !== UNDEFINED_VALUE && writer.availableSize > 0 && writer.availableSize !== INFINITY_VALUE &&
4896
- writer.maxSize !== UNDEFINED_VALUE && writer.maxSize > 0 && writer.maxSize !== INFINITY_VALUE;
5156
+ availableSize > 0 && availableSize !== INFINITY_VALUE &&
5157
+ maxSize > 0 && maxSize !== INFINITY_VALUE;
4897
5158
  Object.assign(this, {
4898
5159
  writer,
4899
5160
  addSplitZipSignature,
@@ -4915,9 +5176,10 @@ class ZipWriter {
4915
5176
  }
4916
5177
  reader = new GenericReader(reader);
4917
5178
  await initStream(reader);
4918
- const zipReader = new ZipReader(reader.readable);
4919
- const entries = await zipReader.getEntries();
4920
- await zipReader.close();
5179
+ const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
5180
+ const zipReader$1 = new ZipReader(reader.readable);
5181
+ const entries = await zipReader$1.getEntries();
5182
+ await zipReader$1.close();
4921
5183
  await initStream(this.writer);
4922
5184
  await reader.readable.pipeTo(this.writer.writable, { preventClose: true, preventAbort: true });
4923
5185
  this.writer.size = this.offset = reader.size;
@@ -4933,8 +5195,6 @@ class ZipWriter {
4933
5195
  encrypted,
4934
5196
  uncompressedSize,
4935
5197
  compressedSize,
4936
- diskOffset,
4937
- diskNumber,
4938
5198
  zip64
4939
5199
  } = entry;
4940
5200
  let {
@@ -4982,8 +5242,9 @@ class ZipWriter {
4982
5242
  Object.assign(entry, {
4983
5243
  zip64UncompressedSize,
4984
5244
  zip64CompressedSize,
4985
- zip64Offset: zip64 && this.offset - diskOffset >= MAX_32_BITS,
4986
- zip64DiskNumberStart: zip64 && diskNumber >= MAX_16_BITS,
5245
+ zip64Offset: zip64 && entry.offset >= MAX_32_BITS,
5246
+ diskNumberStart: 0,
5247
+ zip64DiskNumberStart: false,
4987
5248
  rawExtraFieldZip64,
4988
5249
  rawExtraFieldAES,
4989
5250
  rawExtraFieldExtendedTimestamp,
@@ -5150,7 +5411,8 @@ async function addFile(zipWriter, name, reader, options) {
5150
5411
  try {
5151
5412
  const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
5152
5413
  ({ reader } = sizesInfo);
5153
- const { diskOffset, diskNumber } = zipWriter.writer;
5414
+ const diskOffset = getDiskOffset(zipWriter.writer);
5415
+ const diskNumber = getDiskNumber(zipWriter.writer);
5154
5416
  options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
5155
5417
  internalFileAttribute: metadataInfo.resolvedOptions.internalFileAttributes,
5156
5418
  externalFileAttribute: attributesInfo.resolvedOptions.externalFileAttributes,
@@ -5327,7 +5589,7 @@ function resolveMetadata(zipWriter, name, options) {
5327
5589
  const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
5328
5590
  const keepOrder = getOptionValue(zipWriter, options, OPTION_KEEP_ORDER, true);
5329
5591
  const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
5330
- const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS, true);
5592
+ const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
5331
5593
  const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
5332
5594
  const createTempStream = getOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
5333
5595
  const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
@@ -5525,7 +5787,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
5525
5787
  await requestLockWriter();
5526
5788
  }
5527
5789
  await initStream(fileWriter);
5528
- const { diskOffset } = writer;
5790
+ const diskOffset = getDiskOffset(writer);
5529
5791
  if (zipWriter.addSplitZipSignature) {
5530
5792
  delete zipWriter.addSplitZipSignature;
5531
5793
  const signatureArray = new Uint8Array(4);
@@ -5542,7 +5804,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
5542
5804
  await lockPreviousFileEntry;
5543
5805
  await skipDiskIfNeeded();
5544
5806
  }
5545
- const diskNumberStart = writer.diskNumber;
5807
+ const diskNumberStart = getDiskNumber(writer);
5546
5808
  const entryOffset = getSegmentOffset(zipWriter, writer);
5547
5809
  fileEntry.diskNumberStart = diskNumberStart;
5548
5810
  if (!bufferedWrite) {
@@ -5562,11 +5824,11 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
5562
5824
  writingBufferedEntryData = true;
5563
5825
  writerSizeBeforeEntry = writer.size;
5564
5826
  await skipDiskIfNeeded();
5565
- fileEntry.diskNumberStart = writer.diskNumber;
5827
+ fileEntry.diskNumberStart = getDiskNumber(writer);
5566
5828
  fileEntry.offset = getSegmentOffset(zipWriter, writer);
5567
5829
  if (usdz) {
5568
5830
  const previousMetadataSize = entryInfo.metadataSize;
5569
- appendExtraFieldUSDZ(entryInfo, zipWriter.offset - writer.diskOffset);
5831
+ appendExtraFieldUSDZ(entryInfo, zipWriter.offset - getDiskOffset(writer));
5570
5832
  fileEntry.size += entryInfo.metadataSize - previousMetadataSize;
5571
5833
  }
5572
5834
  updateLocalHeader(fileEntry, headerInfo.localHeaderView, options);
@@ -5631,9 +5893,8 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
5631
5893
  }
5632
5894
 
5633
5895
  async function skipDiskIfNeeded() {
5634
- if (getLength(headerInfo.localHeaderArray) > writer.availableSize) {
5635
- writer.availableSize = 0;
5636
- await writeData(writer, EMPTY_UINT8_ARRAY);
5896
+ if (exceedsAvailableSize(writer, getLength(headerInfo.localHeaderArray))) {
5897
+ await writer.closeDisk();
5637
5898
  }
5638
5899
  }
5639
5900
  }
@@ -5744,7 +6005,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
5744
6005
  }
5745
6006
  const { writable } = writer;
5746
6007
  if (reader) {
5747
- const readable = reader.createReadable ? reader.createReadable({ chunkSize: getChunkSize(config) }) : reader.readable;
6008
+ const readable = reader.createReadable ? reader.createReadable() : reader.readable;
5748
6009
  const size = reader.size;
5749
6010
  const workerOptions = {
5750
6011
  options: {
@@ -6176,8 +6437,8 @@ function updateLocalHeader({
6176
6437
 
6177
6438
  async function closeFile(zipWriter, comment, options) {
6178
6439
  const directoryDataLength = createDirectoryRecords(zipWriter.files);
6179
- const { cdStartDiskNumber, cdStartDiskOffset } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
6180
- await writeEndOfDirectoryRecord(zipWriter, comment, options, { cdStartDiskNumber, cdStartDiskOffset, directoryDataLength });
6440
+ const directoryStart = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
6441
+ await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength });
6181
6442
  }
6182
6443
 
6183
6444
  function createDirectoryRecords(files) {
@@ -6259,8 +6520,8 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
6259
6520
  await initStream(writer);
6260
6521
  let offset = 0;
6261
6522
  let directoryDiskOffset = 0;
6262
- let cdStartDiskNumber = writer.diskNumber;
6263
- let cdStartDiskOffset = writer.diskOffset;
6523
+ let directoryStartDiskNumber = getDiskNumber(writer);
6524
+ let directoryStartDiskOffset = getDiskOffset(writer);
6264
6525
  for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
6265
6526
  const {
6266
6527
  offset: fileEntryOffset,
@@ -6287,15 +6548,14 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
6287
6548
  } = fileEntry;
6288
6549
  const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
6289
6550
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
6290
- if (offset + directoryRecordLength - directoryDiskOffset > writer.availableSize) {
6551
+ if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
6291
6552
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
6292
6553
  directoryDiskOffset = offset;
6293
- writer.availableSize = 0;
6294
- await writeData(writer, EMPTY_UINT8_ARRAY);
6554
+ await writer.closeDisk();
6295
6555
  }
6296
6556
  if (indexFileEntry == 0) {
6297
- cdStartDiskNumber = writer.diskNumber;
6298
- cdStartDiskOffset = writer.diskOffset;
6557
+ directoryStartDiskNumber = getDiskNumber(writer);
6558
+ directoryStartDiskOffset = getDiskOffset(writer);
6299
6559
  }
6300
6560
  if (!zip64UncompressedSize) {
6301
6561
  setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, uncompressedSize);
@@ -6335,18 +6595,18 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
6335
6595
  }
6336
6596
  }
6337
6597
  await writeData(writer, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
6338
- return { cdStartDiskNumber, cdStartDiskOffset };
6598
+ return { diskNumber: directoryStartDiskNumber, diskOffset: directoryStartDiskOffset };
6339
6599
  }
6340
6600
 
6341
6601
  async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
6342
6602
  const { writer } = zipWriter;
6343
- const { cdStartDiskNumber, cdStartDiskOffset } = cdInfo;
6603
+ const { directoryStart } = cdInfo;
6344
6604
  let { directoryDataLength } = cdInfo;
6345
6605
  let filesLength = zipWriter.files.size;
6346
- let diskNumber = cdStartDiskNumber;
6347
- let directoryOffset = zipWriter.offset - cdStartDiskOffset - (cdStartDiskNumber ? zipWriter.initialOffset : 0);
6348
- let lastDiskNumber = writer.diskNumber;
6349
- if (writer.availableSize < END_OF_CENTRAL_DIR_LENGTH) {
6606
+ let diskNumber = directoryStart.diskNumber;
6607
+ let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
6608
+ let lastDiskNumber = getDiskNumber(writer);
6609
+ if (exceedsAvailableSize(writer, END_OF_CENTRAL_DIR_LENGTH)) {
6350
6610
  lastDiskNumber++;
6351
6611
  }
6352
6612
  let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
@@ -6362,11 +6622,10 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
6362
6622
  throw new Error(ERR_INVALID_COMMENT);
6363
6623
  }
6364
6624
  const endOfdirectoryRecord = createRecordWriter(zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
6365
- if (getLength(endOfdirectoryRecord.array) + commentLength > writer.availableSize) {
6366
- writer.availableSize = 0;
6367
- await writeData(writer, EMPTY_UINT8_ARRAY);
6625
+ if (exceedsAvailableSize(writer, getLength(endOfdirectoryRecord.array) + commentLength)) {
6626
+ await writer.closeDisk();
6368
6627
  }
6369
- lastDiskNumber = writer.diskNumber;
6628
+ lastDiskNumber = getDiskNumber(writer);
6370
6629
  if (zip64) {
6371
6630
  endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
6372
6631
  endOfdirectoryRecord.uint64(44);
@@ -6380,7 +6639,7 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
6380
6639
  endOfdirectoryRecord.uint64(directoryOffset);
6381
6640
  endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
6382
6641
  endOfdirectoryRecord.uint32(lastDiskNumber);
6383
- endOfdirectoryRecord.uint64(BigInt(zipWriter.offset) + BigInt(directoryDataLength) - BigInt(writer.diskOffset) - BigInt(writer.diskNumber ? zipWriter.initialOffset : 0));
6642
+ endOfdirectoryRecord.uint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength));
6384
6643
  endOfdirectoryRecord.uint32(lastDiskNumber + 1);
6385
6644
  const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
6386
6645
  if (supportZip64SplitFile) {
@@ -6420,8 +6679,23 @@ function createRecordWriter(length) {
6420
6679
  };
6421
6680
  }
6422
6681
 
6423
- function getSegmentOffset(zipWriter, writer) {
6424
- return zipWriter.offset - writer.diskOffset - (writer.diskNumber ? zipWriter.initialOffset : 0);
6682
+ function getDiskNumber(writer) {
6683
+ const { diskNumber = 0 } = writer;
6684
+ return diskNumber;
6685
+ }
6686
+
6687
+ function getDiskOffset(writer) {
6688
+ const { diskOffset = 0 } = writer;
6689
+ return diskOffset;
6690
+ }
6691
+
6692
+ function exceedsAvailableSize(writer, length) {
6693
+ const { availableSize = INFINITY_VALUE } = writer;
6694
+ return length > availableSize;
6695
+ }
6696
+
6697
+ function getSegmentOffset(zipWriter, { diskNumber = 0, diskOffset = 0 }) {
6698
+ return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
6425
6699
  }
6426
6700
 
6427
6701
  async function writeData(writer, array) {
@@ -6498,9 +6772,6 @@ function arraySet(array, typedArray, offset) {
6498
6772
  array.set(typedArray, offset);
6499
6773
  }
6500
6774
 
6501
- function getDataView(array) {
6502
- return new DataView(array.buffer, array.byteOffset, array.byteLength);
6503
- }
6504
6775
 
6505
6776
  function getLength(...arrayLikes) {
6506
6777
  let result = 0;
@@ -7041,7 +7312,7 @@ function createSyncAccessHandleTempStream(options = {}) {
7041
7312
 
7042
7313
 
7043
7314
  try {
7044
- configure({ baseURI: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-native.cjs', document.baseURI).href)) });
7315
+ setDefaultConfiguration({ baseURI: (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index-native.cjs', document.baseURI).href)) });
7045
7316
  } catch {
7046
7317
  // ignored
7047
7318
  }
@@ -7077,7 +7348,7 @@ var{Uint8Array:x,Uint16Array:g,Int32Array:R,TransformStream:H,Math:z,Error:L,Arr
7077
7348
  */
7078
7349
 
7079
7350
 
7080
- configure({
7351
+ setDefaultConfiguration({
7081
7352
  workerURI: "./core/web-worker-native.js",
7082
7353
  wasmURI: null,
7083
7354
  CompressionStreamZlib: E_,
@@ -7262,9 +7533,7 @@ class ZipFileEntry extends ZipEntry {
7262
7533
 
7263
7534
  async getArrayBuffer(options) {
7264
7535
  const array = await this.getUint8Array(options);
7265
- return array.byteOffset || array.byteLength != array.buffer.byteLength
7266
- ? array.buffer.slice(array.byteOffset, array.byteOffset + array.byteLength)
7267
- : array.buffer;
7536
+ return toExactUint8Array(array).buffer;
7268
7537
  }
7269
7538
 
7270
7539
  replaceBlob(blob) {
@@ -9768,7 +10037,7 @@ function getMimeTypes() {
9768
10037
  */
9769
10038
 
9770
10039
 
9771
- i(configure);
10040
+ Y(setDefaultConfiguration);
9772
10041
 
9773
10042
  exports.BlobReader = BlobReader;
9774
10043
  exports.BlobWriter = BlobWriter;
@@ -9783,6 +10052,7 @@ exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
9783
10052
  exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
9784
10053
  exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
9785
10054
  exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
10055
+ exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
9786
10056
  exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
9787
10057
  exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
9788
10058
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
@@ -9825,4 +10095,5 @@ exports.createOPFSTempStream = createOPFSTempStream;
9825
10095
  exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
9826
10096
  exports.fs = fs;
9827
10097
  exports.getMimeType = getMimeType;
10098
+ exports.resetConfiguration = resetConfiguration;
9828
10099
  exports.terminateWorkers = terminateWorkers;