@zip.js/zip.js 2.8.34 → 2.8.35

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 +472 -220
  5. package/dist/zip-core.min.js +1 -1
  6. package/dist/zip-fs-core.js +449 -220
  7. package/dist/zip-fs-core.min.js +1 -1
  8. package/dist/zip-fs-native.js +476 -226
  9. package/dist/zip-fs-native.min.js +1 -1
  10. package/dist/zip-fs.js +478 -228
  11. package/dist/zip-fs.min.js +1 -1
  12. package/dist/zip-legacy.js +474 -222
  13. package/dist/zip-legacy.min.js +1 -1
  14. package/dist/zip-native.js +475 -223
  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 +477 -225
  19. package/dist/zip.min.js +1 -1
  20. package/index-native.cjs +476 -226
  21. package/index-native.min.js +1 -1
  22. package/index.cjs +478 -228
  23. package/index.d.cts +53 -0
  24. package/index.d.ts +53 -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 +209 -56
  30. package/lib/core/streams/aes-crypto-stream.js +1 -10
  31. package/lib/core/streams/codec-stream.js +36 -15
  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],e=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],t=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],f=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],o=[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 b=new Uint8Array(30).fill(5);function l(n){const e=new Uint16Array(16);for(const t of n)e[t]++;e[0]=0;const t=new Uint16Array(17);for(let n=1;15>=n;n++)t[n+1]=t[n]+e[n];const f=new Uint16Array(n.length);for(let e=0;e<n.length;e++)n[e]&&(f[t[n[e]]++]=e);return {o:e,symbols:f}}const c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function i(i){i({workerURI:i=>{const v="text/javascript",z=(c=>{let i=0,v=0,z=0,K=new Uint8Array(1024),u=0,j=0;for(;!j;){j=T(1);const n=T(2);if(0==n)s();else if(1==n)x(l(r),l(b));else {if(2!=n)throw Error("invalid deflate block type");x(...D());}}return K.subarray(0,u);function m(){if(i>=c.length)throw Error("unexpected end of deflate data");return c[i++]}function T(n){for(;n>z;)v|=m()<<z,z+=8;const e=v&(1<<n)-1;return v>>>=n,z-=n,e}function s(){v=0,z=0;const n=m()|m()<<8;i+=2,w(u+n);for(let e=0;n>e;e++)K[u++]=m();}function x(o,r){let b=F(o);for(;256!=b;){if(256>b)w(u+1),K[u++]=b;else {const o=b-257,l=n[o]+T(e[o]),c=F(r),i=t[c]+T(f[c]);w(u+l);const v=u-i;for(let n=0;l>n;n++)K[u++]=K[v+n];}b=F(o);}}function D(){const n=T(5)+257,e=T(5)+1,t=T(4)+4,f=new Uint8Array(19);for(let n=0;t>n;n++)f[o[n]]=T(3);const r=l(f),b=new Uint8Array(n+e);let c=0;for(;c<b.length;){const n=F(r);if(16>n)b[c++]=n;else if(16==n){const n=b[c-1];let e=T(2)+3;for(;e--;)b[c++]=n;}else c+=17==n?T(3)+3:T(7)+11;}return [l(b.subarray(0,n)),l(b.subarray(n))]}function F(n){const{o:e,symbols:t}=n;let f=0,o=0,r=0;for(let n=1;15>=n;n++){f|=T(1);const b=e[n];if(b>f-o)return t[r+(f-o)];r+=b,o=o+b<<1,f<<=1;}throw Error("invalid huffman code")}function w(n){if(K.length<n){let e=2*K.length;for(;n>e;)e*=2;const t=new Uint8Array(e);t.set(K.subarray(0,u)),K=t;}}})((n=>{const e=(n=(n+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,t=[];for(let f=0;e>f;f+=4){const e=c.indexOf(n[f])<<18|c.indexOf(n[f+1])<<12|(63&c.indexOf(n[f+2]))<<6|63&c.indexOf(n[f+3]);t.push(e>>16&255),"="!==n[f+2]&&t.push(e>>8&255),"="!==n[f+3]&&t.push(255&e);}return new Uint8Array(t)})("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"));if(i){const n=new Blob([z],{type:v});return URL.createObjectURL(n)}return "data:"+v+";base64,"+(n=>{let e="";const t=n.length;let f=0;for(;t>f+2;f+=3){const t=n[f]<<16|n[f+1]<<8|n[f+2];e+=c[t>>18&63]+c[t>>12&63]+c[t>>6&63]+c[63&t];}const o=t-f;if(1===o){const t=n[f]<<16;e+=c[t>>18&63]+c[t>>12&63]+"==";}else if(2===o){const t=n[f]<<16|n[f+1]<<8;e+=c[t>>18&63]+c[t>>12&63]+c[t>>6&63]+"=";}return e})(z)}});}
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;
2080
+ const pendingChunks = [];
2081
+ let pendingLength = 0;
2038
2082
  if (!(chunkSize >= 1)) {
2039
- chunkSize = DEFAULT_CHUNK_SIZE$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,15 @@ 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;
2718
2787
 
2719
2788
  const PROPERTY_NAME_WRITABLE = "writable";
2789
+ const DISK_BOUNDARY = Symbol();
2720
2790
 
2721
2791
  class Stream {
2722
2792
 
@@ -2735,13 +2805,13 @@ class Reader extends Stream {
2735
2805
  return this.createReadable();
2736
2806
  }
2737
2807
 
2738
- createReadable({ offset = 0, size, diskNumberStart, chunkSize = DEFAULT_CHUNK_SIZE } = {}) {
2808
+ createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
2739
2809
  const reader = this;
2740
2810
  let chunkOffset = 0;
2741
2811
  return new ReadableStream({
2742
2812
  async pull(controller) {
2743
2813
  const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
2744
- const data = await readUint8Array(reader, offset + chunkOffset, dataSize, diskNumberStart);
2814
+ const data = await readUint8Array(reader, offset + chunkOffset, dataSize);
2745
2815
  controller.enqueue(data);
2746
2816
  if ((chunkOffset + chunkSize > size) || (size === UNDEFINED_VALUE && !data.length && dataSize)) {
2747
2817
  controller.close();
@@ -2763,7 +2833,7 @@ class Writer extends Stream {
2763
2833
  if (!writer.initialized) {
2764
2834
  throw new Error(ERR_WRITER_NOT_INITIALIZED);
2765
2835
  }
2766
- return writer.writeUint8Array(chunk);
2836
+ return writer.writeUint8Array(toExactUint8Array(chunk));
2767
2837
  }
2768
2838
  });
2769
2839
  Object.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
@@ -2850,6 +2920,27 @@ class Data64URIWriter extends Writer {
2850
2920
  }
2851
2921
  }
2852
2922
 
2923
+ let blobSliceReliable;
2924
+ let blobSliceProbe;
2925
+
2926
+ function probeBlobSliceReliability() {
2927
+ blobSliceProbe = (async () => {
2928
+ try {
2929
+ const slicedBlob = new Blob([new Uint8Array(3)]).slice(1, 2);
2930
+ const streamReader = slicedBlob.stream().getReader();
2931
+ let streamedLength = 0;
2932
+ let result = await streamReader.read();
2933
+ while (!result.done) {
2934
+ streamedLength += result.value.length;
2935
+ result = await streamReader.read();
2936
+ }
2937
+ blobSliceReliable = streamedLength == 1;
2938
+ } catch {
2939
+ blobSliceReliable = false;
2940
+ }
2941
+ })();
2942
+ }
2943
+
2853
2944
  class BlobReader extends Reader {
2854
2945
 
2855
2946
  constructor(blob) {
@@ -2858,14 +2949,32 @@ class BlobReader extends Reader {
2858
2949
  blob,
2859
2950
  size: blob.size
2860
2951
  });
2952
+ if (!blobSliceProbe) {
2953
+ probeBlobSliceReliability();
2954
+ }
2955
+ }
2956
+
2957
+ createReadable(options) {
2958
+ const reader = this;
2959
+ const { blob, size } = reader;
2960
+ const { offset = 0, size: readSize = size - offset } = options || {};
2961
+ if (!offset && readSize >= size) {
2962
+ return blob.stream();
2963
+ }
2964
+ if (blobSliceReliable) {
2965
+ return blob.slice(offset, offset + readSize).stream();
2966
+ }
2967
+ return super.createReadable(options);
2861
2968
  }
2862
2969
 
2863
2970
  async readUint8Array(offset, length) {
2864
2971
  const reader = this;
2865
2972
  const offsetEnd = offset + length;
2866
- const blob = offset || offsetEnd < reader.size ? reader.blob.slice(offset, offsetEnd) : reader.blob;
2973
+ const readsWholeBlob = !offset && offsetEnd >= reader.size;
2974
+ const blob = readsWholeBlob ? reader.blob : reader.blob.slice(offset, offsetEnd);
2867
2975
  let arrayBuffer = await blob.arrayBuffer();
2868
- if (arrayBuffer.byteLength > length) {
2976
+ const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
2977
+ if (sliceIgnoredByBuggyImplementation) {
2869
2978
  arrayBuffer = arrayBuffer.slice(offset, offsetEnd);
2870
2979
  }
2871
2980
  return new Uint8Array(arrayBuffer);
@@ -2946,6 +3055,18 @@ class FetchReader extends Reader {
2946
3055
  super.init();
2947
3056
  }
2948
3057
 
3058
+ createReadable(options) {
3059
+ const reader = this;
3060
+ const { useRangeHeader, forceRangeRequests, size } = reader;
3061
+ if ((useRangeHeader || forceRangeRequests) && size !== UNDEFINED_VALUE) {
3062
+ const { offset = 0, size: readSize = size - offset } = options || {};
3063
+ if (readSize > 0 && offset < size) {
3064
+ return createRangeReadable(reader, offset, Math.min(readSize, size - offset));
3065
+ }
3066
+ }
3067
+ return super.createReadable(options);
3068
+ }
3069
+
2949
3070
  readUint8Array(index, length) {
2950
3071
  return readUint8ArrayHttpReader(this, index, length, sendFetchRequest, getFetchRequestData);
2951
3072
  }
@@ -2974,6 +3095,7 @@ function createHttpReader(httpReader, url, options) {
2974
3095
  useRangeHeader,
2975
3096
  forceRangeRequests,
2976
3097
  combineSizeEocd,
3098
+ checkResourceChanges = true,
2977
3099
  fetch
2978
3100
  } = options;
2979
3101
  options = Object.assign({}, options);
@@ -2981,6 +3103,7 @@ function createHttpReader(httpReader, url, options) {
2981
3103
  delete options.useRangeHeader;
2982
3104
  delete options.forceRangeRequests;
2983
3105
  delete options.combineSizeEocd;
3106
+ delete options.checkResourceChanges;
2984
3107
  delete options.useXHR;
2985
3108
  delete options.fetch;
2986
3109
  Object.assign(httpReader, {
@@ -2990,6 +3113,7 @@ function createHttpReader(httpReader, url, options) {
2990
3113
  useRangeHeader,
2991
3114
  forceRangeRequests,
2992
3115
  combineSizeEocd,
3116
+ checkResourceChanges,
2993
3117
  fetch
2994
3118
  });
2995
3119
  }
@@ -3014,17 +3138,8 @@ async function initHttpReader(httpReader, sendRequest, getRequestData) {
3014
3138
  httpReader.eocdCache = eocdCache;
3015
3139
  }
3016
3140
  }
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
- }
3141
+ setResourceValidators(httpReader, response);
3142
+ const contentSize = getContentRangeSize(response);
3028
3143
  if (contentSize === UNDEFINED_VALUE) {
3029
3144
  await getContentLength(httpReader, sendRequest, getRequestData);
3030
3145
  } else {
@@ -3065,6 +3180,8 @@ async function readUint8ArrayHttpReader(httpReader, index, length, sendRequest,
3065
3180
  throw new Error(ERR_HTTP_RANGE);
3066
3181
  }
3067
3182
  }
3183
+ checkResourceValidators(httpReader, response);
3184
+ setResourceValidators(httpReader, response);
3068
3185
  const data = new Uint8Array(await response.arrayBuffer());
3069
3186
  if (data.length != length) {
3070
3187
  throw new Error(ERR_HTTP_RANGE);
@@ -3076,7 +3193,97 @@ async function readUint8ArrayHttpReader(httpReader, index, length, sendRequest,
3076
3193
  if (!data) {
3077
3194
  await getRequestData(httpReader, options);
3078
3195
  }
3079
- return new Uint8Array(httpReader.data.subarray(index, index + length));
3196
+ return httpReader.data.subarray(index, index + length);
3197
+ }
3198
+ }
3199
+
3200
+ function createRangeReadable(httpReader, offset, size) {
3201
+ let bodyReader;
3202
+ let remainingLength = size;
3203
+ return new ReadableStream({
3204
+ async start() {
3205
+ const response = await sendFetchRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, offset, size));
3206
+ if (response.status != 206) {
3207
+ throw new Error(ERR_HTTP_RANGE);
3208
+ }
3209
+ const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
3210
+ if (contentRangeHeader) {
3211
+ const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
3212
+ if (!Number.isNaN(rangeStart) && rangeStart != offset) {
3213
+ throw new Error(ERR_HTTP_RANGE);
3214
+ }
3215
+ }
3216
+ checkResourceValidators(httpReader, response);
3217
+ setResourceValidators(httpReader, response);
3218
+ bodyReader = response.body.getReader();
3219
+ },
3220
+ async pull(controller) {
3221
+ const { value, done } = await bodyReader.read();
3222
+ if (done) {
3223
+ if (remainingLength) {
3224
+ throw new Error(ERR_HTTP_RANGE);
3225
+ }
3226
+ controller.close();
3227
+ } else {
3228
+ const chunk = value.length > remainingLength ? value.subarray(0, remainingLength) : value;
3229
+ remainingLength -= chunk.length;
3230
+ if (chunk.length) {
3231
+ controller.enqueue(chunk);
3232
+ }
3233
+ if (!remainingLength) {
3234
+ controller.close();
3235
+ await bodyReader.cancel();
3236
+ }
3237
+ }
3238
+ },
3239
+ cancel(reason) {
3240
+ return bodyReader && bodyReader.cancel(reason);
3241
+ }
3242
+ });
3243
+ }
3244
+
3245
+ function getContentRangeSize(response) {
3246
+ const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
3247
+ if (contentRangeHeader) {
3248
+ const headerValue = contentRangeHeader.trim().split(/\s*\/\s*/)[1];
3249
+ if (headerValue && headerValue != "*") {
3250
+ const contentSize = Number(headerValue);
3251
+ if (!Number.isNaN(contentSize)) {
3252
+ return contentSize;
3253
+ }
3254
+ }
3255
+ }
3256
+ }
3257
+
3258
+ function getResourceValidators({ headers }) {
3259
+ return {
3260
+ etag: headers.get(HTTP_HEADER_ETAG) || UNDEFINED_VALUE,
3261
+ lastModified: headers.get(HTTP_HEADER_LAST_MODIFIED) || UNDEFINED_VALUE
3262
+ };
3263
+ }
3264
+
3265
+ function setResourceValidators(httpReader, response) {
3266
+ const { checkResourceChanges, resourceValidators } = httpReader;
3267
+ if (checkResourceChanges && !resourceValidators && response.status == 206) {
3268
+ httpReader.resourceValidators = getResourceValidators(response);
3269
+ }
3270
+ }
3271
+
3272
+ function checkResourceValidators(httpReader, response) {
3273
+ const { checkResourceChanges, resourceValidators, size } = httpReader;
3274
+ if (checkResourceChanges) {
3275
+ const contentRangeSize = getContentRangeSize(response);
3276
+ if (contentRangeSize !== UNDEFINED_VALUE && size !== UNDEFINED_VALUE && contentRangeSize != size) {
3277
+ throw new Error(ERR_HTTP_RESOURCE_CHANGED);
3278
+ }
3279
+ if (resourceValidators) {
3280
+ const validators = getResourceValidators(response);
3281
+ const changed = Object.entries(resourceValidators).some(([name, value]) =>
3282
+ value !== UNDEFINED_VALUE && validators[name] !== UNDEFINED_VALUE && value != validators[name]);
3283
+ if (changed) {
3284
+ throw new Error(ERR_HTTP_RESOURCE_CHANGED);
3285
+ }
3286
+ }
3080
3287
  }
3081
3288
  }
3082
3289
 
@@ -3187,6 +3394,10 @@ class HttpReader extends Reader {
3187
3394
  super.init();
3188
3395
  }
3189
3396
 
3397
+ createReadable(options) {
3398
+ return this.reader.createReadable(options);
3399
+ }
3400
+
3190
3401
  readUint8Array(index, length) {
3191
3402
  return this.reader.readUint8Array(index, length);
3192
3403
  }
@@ -3267,25 +3478,26 @@ class SplitDataReader extends Reader {
3267
3478
  const reader = this;
3268
3479
  const { readers } = reader;
3269
3480
  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
- }
3481
+ await Promise.all(readers.map(diskReader => initStream(diskReader)));
3482
+ reader.diskOffsets = readers.map(diskReader => {
3483
+ const diskOffset = reader.size;
3276
3484
  reader.size += diskReader.size;
3277
- }));
3485
+ return diskOffset;
3486
+ });
3278
3487
  super.init();
3279
3488
  }
3280
3489
 
3281
- async readUint8Array(offset, length, diskNumber = 0) {
3490
+ getDiskOffset(diskNumber) {
3491
+ const { diskOffsets, size } = this;
3492
+ const diskOffset = diskOffsets.at(diskNumber);
3493
+ return diskOffset === UNDEFINED_VALUE ? size : diskOffset;
3494
+ }
3495
+
3496
+ async readUint8Array(offset, length) {
3282
3497
  const reader = this;
3283
3498
  const { readers } = this;
3284
3499
  let result;
3285
- let currentDiskNumber = diskNumber;
3286
- if (currentDiskNumber == -1) {
3287
- currentDiskNumber = readers.length - 1;
3288
- }
3500
+ let currentDiskNumber = 0;
3289
3501
  let currentReaderOffset = offset;
3290
3502
  while (readers[currentDiskNumber] && currentReaderOffset >= readers[currentDiskNumber].size) {
3291
3503
  currentReaderOffset -= readers[currentDiskNumber].size;
@@ -3298,14 +3510,9 @@ class SplitDataReader extends Reader {
3298
3510
  result = await readUint8Array(currentReader, currentReaderOffset, length);
3299
3511
  } else {
3300
3512
  const chunkLength = currentReaderSize - currentReaderOffset;
3301
- result = new Uint8Array(length);
3302
3513
  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
- }
3514
+ const secondPart = await reader.readUint8Array(offset + chunkLength, length - chunkLength);
3515
+ result = concat(firstPart, secondPart);
3309
3516
  }
3310
3517
  } else {
3311
3518
  result = EMPTY_UINT8_ARRAY;
@@ -3330,6 +3537,12 @@ class SplitDataWriter extends Stream {
3330
3537
  let diskSourceWriter, diskWritable, diskWriter;
3331
3538
  const writable = new WritableStream({
3332
3539
  async write(chunk) {
3540
+ if (chunk === DISK_BOUNDARY) {
3541
+ if (diskWriter) {
3542
+ await endDisk();
3543
+ }
3544
+ return;
3545
+ }
3333
3546
  const { availableSize } = writer;
3334
3547
  if (!diskWriter) {
3335
3548
  const { value, done } = await writerGenerator.next();
@@ -3349,11 +3562,7 @@ class SplitDataWriter extends Stream {
3349
3562
  await this.write(chunk);
3350
3563
  } else if (chunk.length >= availableSize) {
3351
3564
  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;
3565
+ await endDisk();
3357
3566
  if (chunk.length > availableSize) {
3358
3567
  await this.write(chunk.subarray(availableSize));
3359
3568
  }
@@ -3364,7 +3573,7 @@ class SplitDataWriter extends Stream {
3364
3573
  async close() {
3365
3574
  if (diskWriter) {
3366
3575
  await diskWriter.ready;
3367
- await closeDisk();
3576
+ await closeDiskWriter();
3368
3577
  }
3369
3578
  },
3370
3579
  async abort(reason) {
@@ -3389,10 +3598,28 @@ class SplitDataWriter extends Stream {
3389
3598
  }
3390
3599
  }
3391
3600
 
3392
- async function closeDisk() {
3601
+ async function endDisk() {
3602
+ await closeDiskWriter();
3603
+ writer.diskOffset += diskSourceWriter.size;
3604
+ writer.diskNumber++;
3605
+ diskWriter = null;
3606
+ writer.availableSize = writer.maxSize;
3607
+ }
3608
+
3609
+ async function closeDiskWriter() {
3393
3610
  await diskWriter.close();
3394
3611
  }
3395
3612
  }
3613
+
3614
+ async closeDisk() {
3615
+ const streamWriter = this.writable.getWriter();
3616
+ try {
3617
+ await streamWriter.ready;
3618
+ await streamWriter.write(DISK_BOUNDARY);
3619
+ } finally {
3620
+ streamWriter.releaseLock();
3621
+ }
3622
+ }
3396
3623
  }
3397
3624
 
3398
3625
  class GenericReader {
@@ -3424,14 +3651,6 @@ class GenericWriter {
3424
3651
  if (writer.size === UNDEFINED_VALUE) {
3425
3652
  writer.size = 0;
3426
3653
  }
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
3654
  return writer;
3436
3655
  }
3437
3656
  }
@@ -3450,8 +3669,8 @@ async function initStream(stream, initSize) {
3450
3669
  }
3451
3670
  }
3452
3671
 
3453
- function readUint8Array(reader, offset, size, diskNumber) {
3454
- return reader.readUint8Array(offset, size, diskNumber);
3672
+ function readUint8Array(reader, offset, size) {
3673
+ return reader.readUint8Array(offset, size);
3455
3674
  }
3456
3675
 
3457
3676
  /*
@@ -3827,7 +4046,7 @@ class ZipReader {
3827
4046
  const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
3828
4047
  if (!endOfDirectoryInfo) {
3829
4048
  const signatureArray = await readUint8Array(reader, 0, 4);
3830
- const signatureView = getDataView$1(signatureArray);
4049
+ const signatureView = getDataView(signatureArray);
3831
4050
  if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
3832
4051
  throw new Error(ERR_SPLIT_ZIP_FILE);
3833
4052
  } else {
@@ -3837,7 +4056,7 @@ class ZipReader {
3837
4056
  if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
3838
4057
  throwAmbiguousArchive("multiple end of central directory records");
3839
4058
  }
3840
- const endOfDirectoryView = getDataView$1(endOfDirectoryInfo);
4059
+ const endOfDirectoryView = getDataView(endOfDirectoryInfo);
3841
4060
  let directoryDataLength = getUint32(endOfDirectoryView, 12);
3842
4061
  let directoryDataOffset = getUint32(endOfDirectoryView, 16);
3843
4062
  const commentOffset = endOfDirectoryInfo.offset;
@@ -3853,17 +4072,21 @@ class ZipReader {
3853
4072
  let prependedDataLength = 0;
3854
4073
  let startOffset;
3855
4074
  let zip64EndOfDirectory;
3856
- if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS) {
4075
+ const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
4076
+ if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
4077
+ directoryDataOffset += getDiskOffset$1(reader, diskNumber);
4078
+ }
4079
+ if (requiresZip64) {
3857
4080
  const endOfDirectoryLocatorArray = endOfDirectoryInfo.offset >= ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH ?
3858
4081
  await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH) :
3859
4082
  EMPTY_UINT8_ARRAY;
3860
- const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray);
4083
+ const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
3861
4084
  if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
3862
4085
  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);
4086
+ directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
4087
+ let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4088
+ let endOfDirectoryView = getDataView(endOfDirectoryArray);
4089
+ const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
3867
4090
  if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
3868
4091
  directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
3869
4092
  const originalDirectoryDataOffset = directoryDataOffset;
@@ -3871,8 +4094,8 @@ class ZipReader {
3871
4094
  if (directoryDataOffset > originalDirectoryDataOffset) {
3872
4095
  prependedDataLength = directoryDataOffset - originalDirectoryDataOffset;
3873
4096
  }
3874
- endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH, -1);
3875
- endOfDirectoryView = getDataView$1(endOfDirectoryArray);
4097
+ endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
4098
+ endOfDirectoryView = getDataView(endOfDirectoryArray);
3876
4099
  }
3877
4100
  if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
3878
4101
  throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
@@ -3898,7 +4121,7 @@ class ZipReader {
3898
4121
  } else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
3899
4122
  throwAmbiguousArchive("mismatched zip64 end of central directory record");
3900
4123
  }
3901
- directoryDataOffset = getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
4124
+ directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
3902
4125
  }
3903
4126
  }
3904
4127
  const declaredDirectoryDataLength = directoryDataLength;
@@ -3915,19 +4138,19 @@ class ZipReader {
3915
4138
  throw new Error(ERR_BAD_FORMAT);
3916
4139
  }
3917
4140
  let offset = 0;
3918
- let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
3919
- let directoryView = getDataView$1(directoryArray);
4141
+ let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4142
+ let directoryView = getDataView(directoryArray);
3920
4143
  if (directoryDataLength) {
3921
4144
  if (directoryArray.length < 4) {
3922
4145
  throw new Error(ERR_BAD_FORMAT);
3923
4146
  }
3924
- const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength - (reader.lastDiskOffset || 0);
4147
+ const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
3925
4148
  if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
3926
4149
  const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE;
3927
4150
  let reconcile = !storedPointsAtDirectory;
3928
4151
  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;
4152
+ const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
4153
+ reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
3931
4154
  }
3932
4155
  if (reconcile) {
3933
4156
  const originalDirectoryDataOffset = directoryDataOffset;
@@ -3935,16 +4158,16 @@ class ZipReader {
3935
4158
  if (directoryDataOffset > originalDirectoryDataOffset) {
3936
4159
  prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
3937
4160
  }
3938
- directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
3939
- directoryView = getDataView$1(directoryArray);
4161
+ directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4162
+ directoryView = getDataView(directoryArray);
3940
4163
  }
3941
4164
  }
3942
4165
  }
3943
- const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset - (reader.lastDiskOffset || 0);
4166
+ const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset;
3944
4167
  if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0 && diskNumber == lastDiskNumber) {
3945
4168
  directoryDataLength = expectedDirectoryDataLength;
3946
- directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength, diskNumber);
3947
- directoryView = getDataView$1(directoryArray);
4169
+ directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
4170
+ directoryView = getDataView(directoryArray);
3948
4171
  }
3949
4172
  if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) {
3950
4173
  throw new Error(ERR_BAD_FORMAT);
@@ -4017,7 +4240,7 @@ class ZipReader {
4017
4240
  });
4018
4241
  readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
4019
4242
  fileEntry.offset += prependedDataLength;
4020
- startOffset = Math.min(fileEntry.offset, startOffset);
4243
+ startOffset = Math.min(getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset, startOffset);
4021
4244
  if (checkAmbiguity) {
4022
4245
  if (filenames.has(fileEntry.filename)) {
4023
4246
  duplicateFilename = true;
@@ -4171,8 +4394,9 @@ let ZipEntry$1 = class ZipEntry {
4171
4394
  dataDescriptor
4172
4395
  } = bitFlag;
4173
4396
  const localDirectory = fileEntry.localDirectory = {};
4174
- const dataArray = await readUint8Array(reader, offset, HEADER_SIZE, diskNumberStart);
4175
- const dataView = getDataView$1(dataArray);
4397
+ const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
4398
+ const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
4399
+ const dataView = getDataView(dataArray);
4176
4400
  let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
4177
4401
  let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
4178
4402
  const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
@@ -4197,12 +4421,12 @@ let ZipEntry$1 = class ZipEntry {
4197
4421
  const checkAmbiguity = getStrictness(getOptionValue$1(zipEntry, options, OPTION_STRICTNESS), getOptionValue$1(zipEntry, options, OPTION_CHECK_AMBIGUITY)) == STRICTNESS_STRICT;
4198
4422
  let rawLocalFilename = EMPTY_UINT8_ARRAY;
4199
4423
  if (checkAmbiguity && (filenameLength || extraFieldLength)) {
4200
- const trailingDataArray = await readUint8Array(reader, offset + HEADER_SIZE, filenameLength + extraFieldLength, diskNumberStart);
4424
+ const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
4201
4425
  rawLocalFilename = trailingDataArray.subarray(0, filenameLength);
4202
4426
  localDirectory.rawExtraField = trailingDataArray.subarray(filenameLength);
4203
4427
  } else {
4204
4428
  localDirectory.rawExtraField = extraFieldLength ?
4205
- await readUint8Array(reader, offset + HEADER_SIZE + filenameLength, extraFieldLength, diskNumberStart) :
4429
+ await readUint8Array(reader, localHeaderOffset + HEADER_SIZE + filenameLength, extraFieldLength) :
4206
4430
  EMPTY_UINT8_ARRAY;
4207
4431
  }
4208
4432
  readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
@@ -4228,9 +4452,9 @@ let ZipEntry$1 = class ZipEntry {
4228
4452
  throw new Error(ERR_ENCRYPTED);
4229
4453
  }
4230
4454
  }
4231
- const dataOffset = offset + HEADER_SIZE + filenameLength + extraFieldLength;
4455
+ const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
4232
4456
  const size = compressedSize;
4233
- const readable = reader.createReadable({ offset: dataOffset, size, diskNumberStart, chunkSize: getChunkSize(config) });
4457
+ const readable = reader.createReadable({ offset: dataOffset, size });
4234
4458
  const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
4235
4459
  const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
4236
4460
  let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
@@ -4271,8 +4495,7 @@ let ZipEntry$1 = class ZipEntry {
4271
4495
  reader,
4272
4496
  fileEntry,
4273
4497
  index,
4274
- offset,
4275
- diskNumberStart,
4498
+ offset: localHeaderOffset,
4276
4499
  signature,
4277
4500
  compressedSize,
4278
4501
  uncompressedSize,
@@ -4336,7 +4559,7 @@ function readCommonHeader(directory, dataView, offset) {
4336
4559
  function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory) {
4337
4560
  const { rawExtraField } = directory;
4338
4561
  const extraField = directory.extraField = new Map();
4339
- const rawExtraFieldView = getDataView$1(new Uint8Array(rawExtraField));
4562
+ const rawExtraFieldView = getDataView(rawExtraField);
4340
4563
  let offsetExtraField = 0;
4341
4564
  try {
4342
4565
  while (offsetExtraField < rawExtraField.length) {
@@ -4408,7 +4631,7 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
4408
4631
 
4409
4632
  function readExtraFieldZip64(extraFieldZip64, directory) {
4410
4633
  directory.zip64 = true;
4411
- const extraFieldView = getDataView$1(extraFieldZip64.data);
4634
+ const extraFieldView = getDataView(extraFieldZip64.data);
4412
4635
  const missingProperties = ZIP64_PROPERTIES.filter(([propertyName, max]) => directory[propertyName] == max);
4413
4636
  const requiredLength = missingProperties.reduce((length, [, max]) => length + ZIP64_EXTRACTION[max].bytes, 0);
4414
4637
  if (extraFieldZip64.data.length < requiredLength) {
@@ -4427,10 +4650,10 @@ function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName,
4427
4650
  extraFieldUnicode.valid = false;
4428
4651
  return;
4429
4652
  }
4430
- const extraFieldView = getDataView$1(extraFieldUnicode.data);
4653
+ const extraFieldView = getDataView(extraFieldUnicode.data);
4431
4654
  const crc32 = new Crc32();
4432
4655
  crc32.append(fileEntry[rawPropertyName]);
4433
- const dataViewSignature = getDataView$1(new Uint8Array(4));
4656
+ const dataViewSignature = getDataView(new Uint8Array(4));
4434
4657
  dataViewSignature.setUint32(0, crc32.get(), true);
4435
4658
  const signature = getUint32(extraFieldView, 1);
4436
4659
  Object.assign(extraFieldUnicode, {
@@ -4445,7 +4668,7 @@ function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName,
4445
4668
  }
4446
4669
 
4447
4670
  function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
4448
- const extraFieldView = getDataView$1(extraFieldAES.data);
4671
+ const extraFieldView = getDataView(extraFieldAES.data);
4449
4672
  const strength = getUint8(extraFieldView, 4);
4450
4673
  Object.assign(extraFieldAES, {
4451
4674
  vendorVersion: getUint8(extraFieldView, 0),
@@ -4458,7 +4681,7 @@ function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
4458
4681
  }
4459
4682
 
4460
4683
  function readExtraFieldNTFS(extraFieldNTFS, directory) {
4461
- const extraFieldView = getDataView$1(extraFieldNTFS.data);
4684
+ const extraFieldView = getDataView(extraFieldNTFS.data);
4462
4685
  let offsetExtraField = 4;
4463
4686
  let tag1Data;
4464
4687
  try {
@@ -4475,7 +4698,7 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
4475
4698
  }
4476
4699
  try {
4477
4700
  if (tag1Data && tag1Data.length == 24) {
4478
- const tag1View = getDataView$1(tag1Data);
4701
+ const tag1View = getDataView(tag1Data);
4479
4702
  const rawLastModDate = tag1View.getBigUint64(0, true);
4480
4703
  const rawLastAccessDate = tag1View.getBigUint64(8, true);
4481
4704
  const rawCreationDate = tag1View.getBigUint64(16, true);
@@ -4498,7 +4721,7 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
4498
4721
 
4499
4722
  function readExtraFieldUnix(extraField, directory, isInfoZip) {
4500
4723
  try {
4501
- const view = getDataView$1(new Uint8Array(extraField.data));
4724
+ const view = getDataView(extraField.data);
4502
4725
  let uid, gid;
4503
4726
  if (isInfoZip) {
4504
4727
  let offset = 0;
@@ -4536,7 +4759,7 @@ function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory,
4536
4759
  if (!extraFieldExtendedTimestamp.data.length) {
4537
4760
  return;
4538
4761
  }
4539
- const extraFieldView = getDataView$1(extraFieldExtendedTimestamp.data);
4762
+ const extraFieldView = getDataView(extraFieldExtendedTimestamp.data);
4540
4763
  const flags = getUint8(extraFieldView, 0);
4541
4764
  const timeProperties = [];
4542
4765
  const timeRawProperties = [];
@@ -4574,7 +4797,6 @@ async function detectOverlappingEntry({
4574
4797
  fileEntry,
4575
4798
  index,
4576
4799
  offset,
4577
- diskNumberStart,
4578
4800
  signature,
4579
4801
  compressedSize,
4580
4802
  uncompressedSize,
@@ -4583,12 +4805,6 @@ async function detectOverlappingEntry({
4583
4805
  extraFieldZip64,
4584
4806
  readRanges
4585
4807
  }) {
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
4808
  let dataDescriptorLength = 0;
4593
4809
  if (dataDescriptor) {
4594
4810
  if (extraFieldZip64) {
@@ -4598,19 +4814,19 @@ async function detectOverlappingEntry({
4598
4814
  }
4599
4815
  }
4600
4816
  if (dataDescriptorLength) {
4601
- const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, diskNumberStart);
4817
+ const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
4602
4818
  const dataDescriptorSignature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
4603
- getUint32(getDataView$1(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
4819
+ getUint32(getDataView(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
4604
4820
  if (dataDescriptorSignature) {
4605
- const readSignature = getUint32(getDataView$1(dataDescriptorArray), 4);
4821
+ const readSignature = getUint32(getDataView(dataDescriptorArray), 4);
4606
4822
  let readCompressedSize;
4607
4823
  let readUncompressedSize;
4608
4824
  if (extraFieldZip64) {
4609
- readCompressedSize = getBigUint64(getDataView$1(dataDescriptorArray), 8);
4610
- readUncompressedSize = getBigUint64(getDataView$1(dataDescriptorArray), 16);
4825
+ readCompressedSize = getBigUint64(getDataView(dataDescriptorArray), 8);
4826
+ readUncompressedSize = getBigUint64(getDataView(dataDescriptorArray), 16);
4611
4827
  } else {
4612
- readCompressedSize = getUint32(getDataView$1(dataDescriptorArray), 8);
4613
- readUncompressedSize = getUint32(getDataView$1(dataDescriptorArray), 12);
4828
+ readCompressedSize = getUint32(getDataView(dataDescriptorArray), 8);
4829
+ readUncompressedSize = getUint32(getDataView(dataDescriptorArray), 12);
4614
4830
  }
4615
4831
  const matchSignature = (fileEntry.encrypted && !fileEntry.zipCrypto) || readSignature == signature;
4616
4832
  if (matchSignature &&
@@ -4621,8 +4837,8 @@ async function detectOverlappingEntry({
4621
4837
  }
4622
4838
  }
4623
4839
  const range = {
4624
- start: diskOffset + offset,
4625
- end: diskOffset + dataOffset + compressedSize + dataDescriptorLength,
4840
+ start: offset,
4841
+ end: dataOffset + compressedSize + dataDescriptorLength,
4626
4842
  fileEntry
4627
4843
  };
4628
4844
  for (const [otherIndex, otherRange] of readRanges) {
@@ -4635,6 +4851,10 @@ async function detectOverlappingEntry({
4635
4851
  readRanges.set(index, range);
4636
4852
  }
4637
4853
 
4854
+ function getDiskOffset$1(reader, diskNumber) {
4855
+ return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
4856
+ }
4857
+
4638
4858
  function getStrictness(strictness, checkAmbiguity) {
4639
4859
  if (strictness === UNDEFINED_VALUE) {
4640
4860
  return checkAmbiguity ? STRICTNESS_STRICT : STRICTNESS_BALANCED;
@@ -4718,7 +4938,7 @@ async function seekEndOfCentralDirectory(reader, maxAppendedDataSize, remoteProb
4718
4938
  async function* scanEndOfCentralDirectory(reader, scanLength) {
4719
4939
  const scanOffset = reader.size - scanLength;
4720
4940
  const scanArray = await readUint8Array(reader, scanOffset, scanLength);
4721
- const scanView = getDataView$1(scanArray);
4941
+ const scanView = getDataView(scanArray);
4722
4942
  for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
4723
4943
  if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
4724
4944
  yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
@@ -4741,7 +4961,8 @@ async function getCentralDirectoryReachability(reader, view, anchoredOffset, ind
4741
4961
  if (!filesLength && !directoryDataLength) {
4742
4962
  return CENTRAL_DIRECTORY_PLAUSIBLE;
4743
4963
  }
4744
- for (const centralDirectoryOffset of [offset - directoryDataLength, directoryDataOffset]) {
4964
+ const directoryDiskNumber = getUint16(view, indexByte + 6);
4965
+ for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
4745
4966
  if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
4746
4967
  return CENTRAL_DIRECTORY_REACHABLE;
4747
4968
  }
@@ -4759,7 +4980,7 @@ async function readSignature(reader, view, anchoredOffset, signatureOffset, size
4759
4980
  if (remoteProbeBudget.count > 0) {
4760
4981
  remoteProbeBudget.count--;
4761
4982
  const signatureArray = await readUint8Array(reader, signatureOffset, 4);
4762
- return getUint32(getDataView$1(signatureArray), 0);
4983
+ return getUint32(getDataView(signatureArray), 0);
4763
4984
  }
4764
4985
  return UNDEFINED_VALUE;
4765
4986
  }
@@ -4824,9 +5045,27 @@ function getBigUint64(view, offset) {
4824
5045
  return Number(view.getBigUint64(offset, true));
4825
5046
  }
4826
5047
 
4827
- function getDataView$1(array) {
4828
- return new DataView(array.buffer, array.byteOffset, array.byteLength);
4829
- }
5048
+ var zipReader = /*#__PURE__*/Object.freeze({
5049
+ __proto__: null,
5050
+ ERR_AMBIGUOUS_ARCHIVE: ERR_AMBIGUOUS_ARCHIVE,
5051
+ ERR_BAD_FORMAT: ERR_BAD_FORMAT,
5052
+ ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
5053
+ ERR_ENCRYPTED: ERR_ENCRYPTED,
5054
+ ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
5055
+ ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
5056
+ ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
5057
+ ERR_INVALID_COMPRESSED_DATA: ERR_INVALID_COMPRESSED_DATA,
5058
+ ERR_INVALID_PASSWORD: ERR_INVALID_PASSWORD,
5059
+ ERR_INVALID_SIGNATURE: ERR_INVALID_SIGNATURE,
5060
+ ERR_INVALID_UNCOMPRESSED_SIZE: ERR_INVALID_UNCOMPRESSED_SIZE,
5061
+ ERR_LOCAL_FILE_HEADER_NOT_FOUND: ERR_LOCAL_FILE_HEADER_NOT_FOUND,
5062
+ ERR_OVERLAPPING_ENTRY: ERR_OVERLAPPING_ENTRY,
5063
+ ERR_SPLIT_ZIP_FILE: ERR_SPLIT_ZIP_FILE,
5064
+ ERR_UNSUPPORTED_COMPRESSION: ERR_UNSUPPORTED_COMPRESSION$1,
5065
+ ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
5066
+ ZipReader: ZipReader,
5067
+ ZipReaderStream: ZipReaderStream
5068
+ });
4830
5069
 
4831
5070
  /*
4832
5071
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -4891,9 +5130,10 @@ class ZipWriter {
4891
5130
 
4892
5131
  constructor(writer, options = {}) {
4893
5132
  writer = new GenericWriter(writer);
5133
+ const { availableSize = INFINITY_VALUE, maxSize = INFINITY_VALUE } = writer;
4894
5134
  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;
5135
+ availableSize > 0 && availableSize !== INFINITY_VALUE &&
5136
+ maxSize > 0 && maxSize !== INFINITY_VALUE;
4897
5137
  Object.assign(this, {
4898
5138
  writer,
4899
5139
  addSplitZipSignature,
@@ -4915,9 +5155,10 @@ class ZipWriter {
4915
5155
  }
4916
5156
  reader = new GenericReader(reader);
4917
5157
  await initStream(reader);
4918
- const zipReader = new ZipReader(reader.readable);
4919
- const entries = await zipReader.getEntries();
4920
- await zipReader.close();
5158
+ const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
5159
+ const zipReader$1 = new ZipReader(reader.readable);
5160
+ const entries = await zipReader$1.getEntries();
5161
+ await zipReader$1.close();
4921
5162
  await initStream(this.writer);
4922
5163
  await reader.readable.pipeTo(this.writer.writable, { preventClose: true, preventAbort: true });
4923
5164
  this.writer.size = this.offset = reader.size;
@@ -4933,8 +5174,6 @@ class ZipWriter {
4933
5174
  encrypted,
4934
5175
  uncompressedSize,
4935
5176
  compressedSize,
4936
- diskOffset,
4937
- diskNumber,
4938
5177
  zip64
4939
5178
  } = entry;
4940
5179
  let {
@@ -4982,8 +5221,9 @@ class ZipWriter {
4982
5221
  Object.assign(entry, {
4983
5222
  zip64UncompressedSize,
4984
5223
  zip64CompressedSize,
4985
- zip64Offset: zip64 && this.offset - diskOffset >= MAX_32_BITS,
4986
- zip64DiskNumberStart: zip64 && diskNumber >= MAX_16_BITS,
5224
+ zip64Offset: zip64 && entry.offset >= MAX_32_BITS,
5225
+ diskNumberStart: 0,
5226
+ zip64DiskNumberStart: false,
4987
5227
  rawExtraFieldZip64,
4988
5228
  rawExtraFieldAES,
4989
5229
  rawExtraFieldExtendedTimestamp,
@@ -5150,7 +5390,8 @@ async function addFile(zipWriter, name, reader, options) {
5150
5390
  try {
5151
5391
  const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
5152
5392
  ({ reader } = sizesInfo);
5153
- const { diskOffset, diskNumber } = zipWriter.writer;
5393
+ const diskOffset = getDiskOffset(zipWriter.writer);
5394
+ const diskNumber = getDiskNumber(zipWriter.writer);
5154
5395
  options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
5155
5396
  internalFileAttribute: metadataInfo.resolvedOptions.internalFileAttributes,
5156
5397
  externalFileAttribute: attributesInfo.resolvedOptions.externalFileAttributes,
@@ -5327,7 +5568,7 @@ function resolveMetadata(zipWriter, name, options) {
5327
5568
  const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
5328
5569
  const keepOrder = getOptionValue(zipWriter, options, OPTION_KEEP_ORDER, true);
5329
5570
  const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
5330
- const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS, true);
5571
+ const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
5331
5572
  const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
5332
5573
  const createTempStream = getOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
5333
5574
  const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
@@ -5525,7 +5766,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
5525
5766
  await requestLockWriter();
5526
5767
  }
5527
5768
  await initStream(fileWriter);
5528
- const { diskOffset } = writer;
5769
+ const diskOffset = getDiskOffset(writer);
5529
5770
  if (zipWriter.addSplitZipSignature) {
5530
5771
  delete zipWriter.addSplitZipSignature;
5531
5772
  const signatureArray = new Uint8Array(4);
@@ -5542,7 +5783,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
5542
5783
  await lockPreviousFileEntry;
5543
5784
  await skipDiskIfNeeded();
5544
5785
  }
5545
- const diskNumberStart = writer.diskNumber;
5786
+ const diskNumberStart = getDiskNumber(writer);
5546
5787
  const entryOffset = getSegmentOffset(zipWriter, writer);
5547
5788
  fileEntry.diskNumberStart = diskNumberStart;
5548
5789
  if (!bufferedWrite) {
@@ -5562,11 +5803,11 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
5562
5803
  writingBufferedEntryData = true;
5563
5804
  writerSizeBeforeEntry = writer.size;
5564
5805
  await skipDiskIfNeeded();
5565
- fileEntry.diskNumberStart = writer.diskNumber;
5806
+ fileEntry.diskNumberStart = getDiskNumber(writer);
5566
5807
  fileEntry.offset = getSegmentOffset(zipWriter, writer);
5567
5808
  if (usdz) {
5568
5809
  const previousMetadataSize = entryInfo.metadataSize;
5569
- appendExtraFieldUSDZ(entryInfo, zipWriter.offset - writer.diskOffset);
5810
+ appendExtraFieldUSDZ(entryInfo, zipWriter.offset - getDiskOffset(writer));
5570
5811
  fileEntry.size += entryInfo.metadataSize - previousMetadataSize;
5571
5812
  }
5572
5813
  updateLocalHeader(fileEntry, headerInfo.localHeaderView, options);
@@ -5631,9 +5872,8 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
5631
5872
  }
5632
5873
 
5633
5874
  async function skipDiskIfNeeded() {
5634
- if (getLength(headerInfo.localHeaderArray) > writer.availableSize) {
5635
- writer.availableSize = 0;
5636
- await writeData(writer, EMPTY_UINT8_ARRAY);
5875
+ if (exceedsAvailableSize(writer, getLength(headerInfo.localHeaderArray))) {
5876
+ await writer.closeDisk();
5637
5877
  }
5638
5878
  }
5639
5879
  }
@@ -5744,7 +5984,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
5744
5984
  }
5745
5985
  const { writable } = writer;
5746
5986
  if (reader) {
5747
- const readable = reader.createReadable ? reader.createReadable({ chunkSize: getChunkSize(config) }) : reader.readable;
5987
+ const readable = reader.createReadable ? reader.createReadable() : reader.readable;
5748
5988
  const size = reader.size;
5749
5989
  const workerOptions = {
5750
5990
  options: {
@@ -6176,8 +6416,8 @@ function updateLocalHeader({
6176
6416
 
6177
6417
  async function closeFile(zipWriter, comment, options) {
6178
6418
  const directoryDataLength = createDirectoryRecords(zipWriter.files);
6179
- const { cdStartDiskNumber, cdStartDiskOffset } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
6180
- await writeEndOfDirectoryRecord(zipWriter, comment, options, { cdStartDiskNumber, cdStartDiskOffset, directoryDataLength });
6419
+ const directoryStart = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
6420
+ await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength });
6181
6421
  }
6182
6422
 
6183
6423
  function createDirectoryRecords(files) {
@@ -6259,8 +6499,8 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
6259
6499
  await initStream(writer);
6260
6500
  let offset = 0;
6261
6501
  let directoryDiskOffset = 0;
6262
- let cdStartDiskNumber = writer.diskNumber;
6263
- let cdStartDiskOffset = writer.diskOffset;
6502
+ let directoryStartDiskNumber = getDiskNumber(writer);
6503
+ let directoryStartDiskOffset = getDiskOffset(writer);
6264
6504
  for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
6265
6505
  const {
6266
6506
  offset: fileEntryOffset,
@@ -6287,15 +6527,14 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
6287
6527
  } = fileEntry;
6288
6528
  const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
6289
6529
  const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
6290
- if (offset + directoryRecordLength - directoryDiskOffset > writer.availableSize) {
6530
+ if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
6291
6531
  await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
6292
6532
  directoryDiskOffset = offset;
6293
- writer.availableSize = 0;
6294
- await writeData(writer, EMPTY_UINT8_ARRAY);
6533
+ await writer.closeDisk();
6295
6534
  }
6296
6535
  if (indexFileEntry == 0) {
6297
- cdStartDiskNumber = writer.diskNumber;
6298
- cdStartDiskOffset = writer.diskOffset;
6536
+ directoryStartDiskNumber = getDiskNumber(writer);
6537
+ directoryStartDiskOffset = getDiskOffset(writer);
6299
6538
  }
6300
6539
  if (!zip64UncompressedSize) {
6301
6540
  setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, uncompressedSize);
@@ -6335,18 +6574,18 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
6335
6574
  }
6336
6575
  }
6337
6576
  await writeData(writer, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
6338
- return { cdStartDiskNumber, cdStartDiskOffset };
6577
+ return { diskNumber: directoryStartDiskNumber, diskOffset: directoryStartDiskOffset };
6339
6578
  }
6340
6579
 
6341
6580
  async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
6342
6581
  const { writer } = zipWriter;
6343
- const { cdStartDiskNumber, cdStartDiskOffset } = cdInfo;
6582
+ const { directoryStart } = cdInfo;
6344
6583
  let { directoryDataLength } = cdInfo;
6345
6584
  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) {
6585
+ let diskNumber = directoryStart.diskNumber;
6586
+ let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
6587
+ let lastDiskNumber = getDiskNumber(writer);
6588
+ if (exceedsAvailableSize(writer, END_OF_CENTRAL_DIR_LENGTH)) {
6350
6589
  lastDiskNumber++;
6351
6590
  }
6352
6591
  let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
@@ -6362,11 +6601,10 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
6362
6601
  throw new Error(ERR_INVALID_COMMENT);
6363
6602
  }
6364
6603
  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);
6604
+ if (exceedsAvailableSize(writer, getLength(endOfdirectoryRecord.array) + commentLength)) {
6605
+ await writer.closeDisk();
6368
6606
  }
6369
- lastDiskNumber = writer.diskNumber;
6607
+ lastDiskNumber = getDiskNumber(writer);
6370
6608
  if (zip64) {
6371
6609
  endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
6372
6610
  endOfdirectoryRecord.uint64(44);
@@ -6380,7 +6618,7 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
6380
6618
  endOfdirectoryRecord.uint64(directoryOffset);
6381
6619
  endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
6382
6620
  endOfdirectoryRecord.uint32(lastDiskNumber);
6383
- endOfdirectoryRecord.uint64(BigInt(zipWriter.offset) + BigInt(directoryDataLength) - BigInt(writer.diskOffset) - BigInt(writer.diskNumber ? zipWriter.initialOffset : 0));
6621
+ endOfdirectoryRecord.uint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength));
6384
6622
  endOfdirectoryRecord.uint32(lastDiskNumber + 1);
6385
6623
  const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
6386
6624
  if (supportZip64SplitFile) {
@@ -6420,8 +6658,23 @@ function createRecordWriter(length) {
6420
6658
  };
6421
6659
  }
6422
6660
 
6423
- function getSegmentOffset(zipWriter, writer) {
6424
- return zipWriter.offset - writer.diskOffset - (writer.diskNumber ? zipWriter.initialOffset : 0);
6661
+ function getDiskNumber(writer) {
6662
+ const { diskNumber = 0 } = writer;
6663
+ return diskNumber;
6664
+ }
6665
+
6666
+ function getDiskOffset(writer) {
6667
+ const { diskOffset = 0 } = writer;
6668
+ return diskOffset;
6669
+ }
6670
+
6671
+ function exceedsAvailableSize(writer, length) {
6672
+ const { availableSize = INFINITY_VALUE } = writer;
6673
+ return length > availableSize;
6674
+ }
6675
+
6676
+ function getSegmentOffset(zipWriter, { diskNumber = 0, diskOffset = 0 }) {
6677
+ return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
6425
6678
  }
6426
6679
 
6427
6680
  async function writeData(writer, array) {
@@ -6498,9 +6751,6 @@ function arraySet(array, typedArray, offset) {
6498
6751
  array.set(typedArray, offset);
6499
6752
  }
6500
6753
 
6501
- function getDataView(array) {
6502
- return new DataView(array.buffer, array.byteOffset, array.byteLength);
6503
- }
6504
6754
 
6505
6755
  function getLength(...arrayLikes) {
6506
6756
  let result = 0;
@@ -7041,7 +7291,7 @@ function createSyncAccessHandleTempStream(options = {}) {
7041
7291
 
7042
7292
 
7043
7293
  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)) });
7294
+ 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
7295
  } catch {
7046
7296
  // ignored
7047
7297
  }
@@ -7077,7 +7327,7 @@ var{Uint8Array:x,Uint16Array:g,Int32Array:R,TransformStream:H,Math:z,Error:L,Arr
7077
7327
  */
7078
7328
 
7079
7329
 
7080
- configure({
7330
+ setDefaultConfiguration({
7081
7331
  workerURI: "./core/web-worker-native.js",
7082
7332
  wasmURI: null,
7083
7333
  CompressionStreamZlib: E_,
@@ -7262,9 +7512,7 @@ class ZipFileEntry extends ZipEntry {
7262
7512
 
7263
7513
  async getArrayBuffer(options) {
7264
7514
  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;
7515
+ return toExactUint8Array(array).buffer;
7268
7516
  }
7269
7517
 
7270
7518
  replaceBlob(blob) {
@@ -9768,7 +10016,7 @@ function getMimeTypes() {
9768
10016
  */
9769
10017
 
9770
10018
 
9771
- i(configure);
10019
+ i(setDefaultConfiguration);
9772
10020
 
9773
10021
  exports.BlobReader = BlobReader;
9774
10022
  exports.BlobWriter = BlobWriter;
@@ -9783,6 +10031,7 @@ exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
9783
10031
  exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
9784
10032
  exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
9785
10033
  exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
10034
+ exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
9786
10035
  exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
9787
10036
  exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
9788
10037
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
@@ -9825,4 +10074,5 @@ exports.createOPFSTempStream = createOPFSTempStream;
9825
10074
  exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
9826
10075
  exports.fs = fs;
9827
10076
  exports.getMimeType = getMimeType;
10077
+ exports.resetConfiguration = resetConfiguration;
9828
10078
  exports.terminateWorkers = terminateWorkers;