@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.
- package/README.md +13 -1
- package/deno.json +5 -2
- package/dist/README.md +3 -1
- package/dist/zip-core.js +494 -221
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core.js +471 -221
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-native.js +498 -227
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +500 -229
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +496 -223
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +497 -224
- package/dist/zip-native.min.js +1 -1
- package/dist/zip-web-worker-native.js +1 -1
- package/dist/zip-web-worker.js +1 -1
- package/dist/zip.js +499 -226
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +498 -227
- package/index-native.min.js +1 -1
- package/index.cjs +500 -229
- package/index.d.cts +61 -0
- package/index.d.ts +61 -0
- package/index.min.js +1 -1
- package/lib/core/codec-pool.js +2 -2
- package/lib/core/codec-worker.js +6 -2
- package/lib/core/configuration.js +22 -1
- package/lib/core/io.js +230 -56
- package/lib/core/streams/aes-crypto-stream.js +1 -10
- package/lib/core/streams/codec-stream.js +37 -16
- package/lib/core/streams/zip-entry-stream.js +19 -28
- package/lib/core/util/array.js +48 -0
- package/lib/core/web-worker-base.js +3 -3
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-fs.js +2 -3
- package/lib/core/zip-reader.js +37 -40
- package/lib/core/zip-writer.js +58 -51
- package/lib/core/zlib-streams-inline.js +1 -1
- package/lib/zip-core-base.js +5 -3
- package/lib/zip-fs-native.js +2 -2
- package/lib/zip-fs-wasm.js +2 -2
- package/lib/zip-legacy.js +2 -2
- package/lib/zip-module-native.js +2 -2
- package/lib/zip-module-wasm.js +3 -3
- package/lib/zip-native.js +2 -2
- package/lib/zip-wasm.js +2 -2
- package/package.json +3 -3
- package/worker-message-property-names.js +3 -0
- package/.github/workflows/publish.yml +0 -30
- 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 =
|
|
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
|
|
1758
|
-
let
|
|
1810
|
+
let headerBytesLeft = GZIP_HEADER_LENGTH;
|
|
1811
|
+
let trailerCandidate = new Uint8Array(0);
|
|
1759
1812
|
super({
|
|
1760
1813
|
transform(chunk, controller) {
|
|
1761
|
-
if (
|
|
1762
|
-
const
|
|
1763
|
-
|
|
1764
|
-
chunk = chunk.subarray(
|
|
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
|
|
1770
|
-
if (
|
|
1771
|
-
|
|
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 =
|
|
1778
|
-
const
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
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 =
|
|
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
|
|
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
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
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 (
|
|
2045
|
-
controller.enqueue(
|
|
2094
|
+
if (pendingLength) {
|
|
2095
|
+
controller.enqueue(concatChunks(pendingChunks, pendingLength));
|
|
2046
2096
|
}
|
|
2047
2097
|
}
|
|
2048
2098
|
});
|
|
2049
2099
|
|
|
2050
|
-
function
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
|
-
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
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
|
-
|
|
2060
|
-
|
|
2061
|
-
offset +=
|
|
2123
|
+
for (const chunk of chunks) {
|
|
2124
|
+
result.set(chunk, offset);
|
|
2125
|
+
offset += chunk.length;
|
|
2062
2126
|
}
|
|
2063
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
3018
|
-
const
|
|
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
|
|
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
|
-
|
|
3271
|
-
|
|
3272
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
3304
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
3454
|
-
return reader.readUint8Array(offset, size
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
3865
|
-
let endOfDirectoryView = getDataView
|
|
3866
|
-
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH
|
|
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
|
|
3875
|
-
endOfDirectoryView = getDataView
|
|
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
|
|
3919
|
-
let directoryView = getDataView
|
|
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
|
|
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
|
|
3930
|
-
reconcile = getUint32(getDataView
|
|
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
|
|
3939
|
-
directoryView = getDataView
|
|
4182
|
+
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
4183
|
+
directoryView = getDataView(directoryArray);
|
|
3940
4184
|
}
|
|
3941
4185
|
}
|
|
3942
4186
|
}
|
|
3943
|
-
const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset
|
|
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
|
|
3947
|
-
directoryView = getDataView
|
|
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
|
|
4175
|
-
const
|
|
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,
|
|
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,
|
|
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 =
|
|
4476
|
+
const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
|
|
4232
4477
|
const size = compressedSize;
|
|
4233
|
-
const readable = reader.createReadable({ offset: dataOffset, size
|
|
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
|
|
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
|
|
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
|
|
4674
|
+
const extraFieldView = getDataView(extraFieldUnicode.data);
|
|
4431
4675
|
const crc32 = new Crc32();
|
|
4432
4676
|
crc32.append(fileEntry[rawPropertyName]);
|
|
4433
|
-
const dataViewSignature = getDataView
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
4840
|
+
getUint32(getDataView(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
4604
4841
|
if (dataDescriptorSignature) {
|
|
4605
|
-
const readSignature = getUint32(getDataView
|
|
4842
|
+
const readSignature = getUint32(getDataView(dataDescriptorArray), 4);
|
|
4606
4843
|
let readCompressedSize;
|
|
4607
4844
|
let readUncompressedSize;
|
|
4608
4845
|
if (extraFieldZip64) {
|
|
4609
|
-
readCompressedSize = getBigUint64(getDataView
|
|
4610
|
-
readUncompressedSize = getBigUint64(getDataView
|
|
4846
|
+
readCompressedSize = getBigUint64(getDataView(dataDescriptorArray), 8);
|
|
4847
|
+
readUncompressedSize = getBigUint64(getDataView(dataDescriptorArray), 16);
|
|
4611
4848
|
} else {
|
|
4612
|
-
readCompressedSize = getUint32(getDataView
|
|
4613
|
-
readUncompressedSize = getUint32(getDataView
|
|
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:
|
|
4625
|
-
end:
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
4828
|
-
|
|
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
|
-
|
|
4896
|
-
|
|
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
|
|
4919
|
-
const
|
|
4920
|
-
await zipReader.
|
|
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 &&
|
|
4986
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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)
|
|
5635
|
-
writer.
|
|
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(
|
|
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
|
|
6180
|
-
await writeEndOfDirectoryRecord(zipWriter, comment, options, {
|
|
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
|
|
6263
|
-
let
|
|
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
|
|
6551
|
+
if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
|
|
6291
6552
|
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
6292
6553
|
directoryDiskOffset = offset;
|
|
6293
|
-
writer.
|
|
6294
|
-
await writeData(writer, EMPTY_UINT8_ARRAY);
|
|
6554
|
+
await writer.closeDisk();
|
|
6295
6555
|
}
|
|
6296
6556
|
if (indexFileEntry == 0) {
|
|
6297
|
-
|
|
6298
|
-
|
|
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 {
|
|
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 {
|
|
6603
|
+
const { directoryStart } = cdInfo;
|
|
6344
6604
|
let { directoryDataLength } = cdInfo;
|
|
6345
6605
|
let filesLength = zipWriter.files.size;
|
|
6346
|
-
let diskNumber =
|
|
6347
|
-
let directoryOffset =
|
|
6348
|
-
let lastDiskNumber = writer
|
|
6349
|
-
if (writer
|
|
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
|
|
6366
|
-
writer.
|
|
6367
|
-
await writeData(writer, EMPTY_UINT8_ARRAY);
|
|
6625
|
+
if (exceedsAvailableSize(writer, getLength(endOfdirectoryRecord.array) + commentLength)) {
|
|
6626
|
+
await writer.closeDisk();
|
|
6368
6627
|
}
|
|
6369
|
-
lastDiskNumber = writer
|
|
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
|
|
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
|
|
6424
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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;
|