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