@zip.js/zip.js 2.8.34 → 2.8.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -1
- package/deno.json +5 -2
- package/dist/README.md +3 -1
- package/dist/zip-core.js +472 -220
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core.js +449 -220
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-native.js +476 -226
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +478 -228
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +474 -222
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +475 -223
- 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 +477 -225
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +476 -226
- package/index-native.min.js +1 -1
- package/index.cjs +478 -228
- package/index.d.cts +53 -0
- package/index.d.ts +53 -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 +209 -56
- package/lib/core/streams/aes-crypto-stream.js +1 -10
- package/lib/core/streams/codec-stream.js +36 -15
- 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-native.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],e=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],t=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],f=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],o=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],r=new Uint8Array(288);r.fill(8,0,144),r.fill(9,144,256),r.fill(7,256,280),r.fill(8,280,288);const b=new Uint8Array(30).fill(5);function l(n){const e=new Uint16Array(16);for(const t of n)e[t]++;e[0]=0;const t=new Uint16Array(17);for(let n=1;15>=n;n++)t[n+1]=t[n]+e[n];const f=new Uint16Array(n.length);for(let e=0;e<n.length;e++)n[e]&&(f[t[n[e]]++]=e);return {o:e,symbols:f}}const c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function i(i){i({workerURI:i=>{const v="text/javascript",z=(c=>{let i=0,v=0,z=0,K=new Uint8Array(1024),u=0,j=0;for(;!j;){j=T(1);const n=T(2);if(0==n)s();else if(1==n)x(l(r),l(b));else {if(2!=n)throw Error("invalid deflate block type");x(...D());}}return K.subarray(0,u);function m(){if(i>=c.length)throw Error("unexpected end of deflate data");return c[i++]}function T(n){for(;n>z;)v|=m()<<z,z+=8;const e=v&(1<<n)-1;return v>>>=n,z-=n,e}function s(){v=0,z=0;const n=m()|m()<<8;i+=2,w(u+n);for(let e=0;n>e;e++)K[u++]=m();}function x(o,r){let b=F(o);for(;256!=b;){if(256>b)w(u+1),K[u++]=b;else {const o=b-257,l=n[o]+T(e[o]),c=F(r),i=t[c]+T(f[c]);w(u+l);const v=u-i;for(let n=0;l>n;n++)K[u++]=K[v+n];}b=F(o);}}function D(){const n=T(5)+257,e=T(5)+1,t=T(4)+4,f=new Uint8Array(19);for(let n=0;t>n;n++)f[o[n]]=T(3);const r=l(f),b=new Uint8Array(n+e);let c=0;for(;c<b.length;){const n=F(r);if(16>n)b[c++]=n;else if(16==n){const n=b[c-1];let e=T(2)+3;for(;e--;)b[c++]=n;}else c+=17==n?T(3)+3:T(7)+11;}return [l(b.subarray(0,n)),l(b.subarray(n))]}function F(n){const{o:e,symbols:t}=n;let f=0,o=0,r=0;for(let n=1;15>=n;n++){f|=T(1);const b=e[n];if(b>f-o)return t[r+(f-o)];r+=b,o=o+b<<1,f<<=1;}throw Error("invalid huffman code")}function w(n){if(K.length<n){let e=2*K.length;for(;n>e;)e*=2;const t=new Uint8Array(e);t.set(K.subarray(0,u)),K=t;}}})((n=>{const e=(n=(n+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,t=[];for(let f=0;e>f;f+=4){const e=c.indexOf(n[f])<<18|c.indexOf(n[f+1])<<12|(63&c.indexOf(n[f+2]))<<6|63&c.indexOf(n[f+3]);t.push(e>>16&255),"="!==n[f+2]&&t.push(e>>8&255),"="!==n[f+3]&&t.push(255&e);}return new Uint8Array(t)})("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"));if(i){const n=new Blob([z],{type:v});return URL.createObjectURL(n)}return "data:"+v+";base64,"+(n=>{let e="";const t=n.length;let f=0;for(;t>f+2;f+=3){const t=n[f]<<16|n[f+1]<<8|n[f+2];e+=c[t>>18&63]+c[t>>12&63]+c[t>>6&63]+c[63&t];}const o=t-f;if(1===o){const t=n[f]<<16;e+=c[t>>18&63]+c[t>>12&63]+"==";}else if(2===o){const t=n[f]<<16|n[f+1]<<8;e+=c[t>>18&63]+c[t>>12&63]+c[t>>6&63]+"=";}return e})(z)}});}
|
|
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
|
-
|
|
2086
|
+
const pendingChunks = [];
|
|
2087
|
+
let pendingLength = 0;
|
|
2044
2088
|
if (!(chunkSize >= 1)) {
|
|
2045
|
-
chunkSize = DEFAULT_CHUNK_SIZE
|
|
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,15 @@
|
|
|
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;
|
|
2724
2793
|
|
|
2725
2794
|
const PROPERTY_NAME_WRITABLE = "writable";
|
|
2795
|
+
const DISK_BOUNDARY = Symbol();
|
|
2726
2796
|
|
|
2727
2797
|
class Stream {
|
|
2728
2798
|
|
|
@@ -2741,13 +2811,13 @@
|
|
|
2741
2811
|
return this.createReadable();
|
|
2742
2812
|
}
|
|
2743
2813
|
|
|
2744
|
-
createReadable({ offset = 0, size,
|
|
2814
|
+
createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
|
|
2745
2815
|
const reader = this;
|
|
2746
2816
|
let chunkOffset = 0;
|
|
2747
2817
|
return new ReadableStream({
|
|
2748
2818
|
async pull(controller) {
|
|
2749
2819
|
const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
|
|
2750
|
-
const data = await readUint8Array(reader, offset + chunkOffset, dataSize
|
|
2820
|
+
const data = await readUint8Array(reader, offset + chunkOffset, dataSize);
|
|
2751
2821
|
controller.enqueue(data);
|
|
2752
2822
|
if ((chunkOffset + chunkSize > size) || (size === UNDEFINED_VALUE && !data.length && dataSize)) {
|
|
2753
2823
|
controller.close();
|
|
@@ -2769,7 +2839,7 @@
|
|
|
2769
2839
|
if (!writer.initialized) {
|
|
2770
2840
|
throw new Error(ERR_WRITER_NOT_INITIALIZED);
|
|
2771
2841
|
}
|
|
2772
|
-
return writer.writeUint8Array(chunk);
|
|
2842
|
+
return writer.writeUint8Array(toExactUint8Array(chunk));
|
|
2773
2843
|
}
|
|
2774
2844
|
});
|
|
2775
2845
|
Object.defineProperty(writer, PROPERTY_NAME_WRITABLE, {
|
|
@@ -2856,6 +2926,27 @@
|
|
|
2856
2926
|
}
|
|
2857
2927
|
}
|
|
2858
2928
|
|
|
2929
|
+
let blobSliceReliable;
|
|
2930
|
+
let blobSliceProbe;
|
|
2931
|
+
|
|
2932
|
+
function probeBlobSliceReliability() {
|
|
2933
|
+
blobSliceProbe = (async () => {
|
|
2934
|
+
try {
|
|
2935
|
+
const slicedBlob = new Blob([new Uint8Array(3)]).slice(1, 2);
|
|
2936
|
+
const streamReader = slicedBlob.stream().getReader();
|
|
2937
|
+
let streamedLength = 0;
|
|
2938
|
+
let result = await streamReader.read();
|
|
2939
|
+
while (!result.done) {
|
|
2940
|
+
streamedLength += result.value.length;
|
|
2941
|
+
result = await streamReader.read();
|
|
2942
|
+
}
|
|
2943
|
+
blobSliceReliable = streamedLength == 1;
|
|
2944
|
+
} catch {
|
|
2945
|
+
blobSliceReliable = false;
|
|
2946
|
+
}
|
|
2947
|
+
})();
|
|
2948
|
+
}
|
|
2949
|
+
|
|
2859
2950
|
class BlobReader extends Reader {
|
|
2860
2951
|
|
|
2861
2952
|
constructor(blob) {
|
|
@@ -2864,14 +2955,32 @@
|
|
|
2864
2955
|
blob,
|
|
2865
2956
|
size: blob.size
|
|
2866
2957
|
});
|
|
2958
|
+
if (!blobSliceProbe) {
|
|
2959
|
+
probeBlobSliceReliability();
|
|
2960
|
+
}
|
|
2961
|
+
}
|
|
2962
|
+
|
|
2963
|
+
createReadable(options) {
|
|
2964
|
+
const reader = this;
|
|
2965
|
+
const { blob, size } = reader;
|
|
2966
|
+
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
2967
|
+
if (!offset && readSize >= size) {
|
|
2968
|
+
return blob.stream();
|
|
2969
|
+
}
|
|
2970
|
+
if (blobSliceReliable) {
|
|
2971
|
+
return blob.slice(offset, offset + readSize).stream();
|
|
2972
|
+
}
|
|
2973
|
+
return super.createReadable(options);
|
|
2867
2974
|
}
|
|
2868
2975
|
|
|
2869
2976
|
async readUint8Array(offset, length) {
|
|
2870
2977
|
const reader = this;
|
|
2871
2978
|
const offsetEnd = offset + length;
|
|
2872
|
-
const
|
|
2979
|
+
const readsWholeBlob = !offset && offsetEnd >= reader.size;
|
|
2980
|
+
const blob = readsWholeBlob ? reader.blob : reader.blob.slice(offset, offsetEnd);
|
|
2873
2981
|
let arrayBuffer = await blob.arrayBuffer();
|
|
2874
|
-
|
|
2982
|
+
const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
|
|
2983
|
+
if (sliceIgnoredByBuggyImplementation) {
|
|
2875
2984
|
arrayBuffer = arrayBuffer.slice(offset, offsetEnd);
|
|
2876
2985
|
}
|
|
2877
2986
|
return new Uint8Array(arrayBuffer);
|
|
@@ -2952,6 +3061,18 @@
|
|
|
2952
3061
|
super.init();
|
|
2953
3062
|
}
|
|
2954
3063
|
|
|
3064
|
+
createReadable(options) {
|
|
3065
|
+
const reader = this;
|
|
3066
|
+
const { useRangeHeader, forceRangeRequests, size } = reader;
|
|
3067
|
+
if ((useRangeHeader || forceRangeRequests) && size !== UNDEFINED_VALUE) {
|
|
3068
|
+
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
3069
|
+
if (readSize > 0 && offset < size) {
|
|
3070
|
+
return createRangeReadable(reader, offset, Math.min(readSize, size - offset));
|
|
3071
|
+
}
|
|
3072
|
+
}
|
|
3073
|
+
return super.createReadable(options);
|
|
3074
|
+
}
|
|
3075
|
+
|
|
2955
3076
|
readUint8Array(index, length) {
|
|
2956
3077
|
return readUint8ArrayHttpReader(this, index, length, sendFetchRequest, getFetchRequestData);
|
|
2957
3078
|
}
|
|
@@ -2980,6 +3101,7 @@
|
|
|
2980
3101
|
useRangeHeader,
|
|
2981
3102
|
forceRangeRequests,
|
|
2982
3103
|
combineSizeEocd,
|
|
3104
|
+
checkResourceChanges = true,
|
|
2983
3105
|
fetch
|
|
2984
3106
|
} = options;
|
|
2985
3107
|
options = Object.assign({}, options);
|
|
@@ -2987,6 +3109,7 @@
|
|
|
2987
3109
|
delete options.useRangeHeader;
|
|
2988
3110
|
delete options.forceRangeRequests;
|
|
2989
3111
|
delete options.combineSizeEocd;
|
|
3112
|
+
delete options.checkResourceChanges;
|
|
2990
3113
|
delete options.useXHR;
|
|
2991
3114
|
delete options.fetch;
|
|
2992
3115
|
Object.assign(httpReader, {
|
|
@@ -2996,6 +3119,7 @@
|
|
|
2996
3119
|
useRangeHeader,
|
|
2997
3120
|
forceRangeRequests,
|
|
2998
3121
|
combineSizeEocd,
|
|
3122
|
+
checkResourceChanges,
|
|
2999
3123
|
fetch
|
|
3000
3124
|
});
|
|
3001
3125
|
}
|
|
@@ -3020,17 +3144,8 @@
|
|
|
3020
3144
|
httpReader.eocdCache = eocdCache;
|
|
3021
3145
|
}
|
|
3022
3146
|
}
|
|
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
|
-
}
|
|
3147
|
+
setResourceValidators(httpReader, response);
|
|
3148
|
+
const contentSize = getContentRangeSize(response);
|
|
3034
3149
|
if (contentSize === UNDEFINED_VALUE) {
|
|
3035
3150
|
await getContentLength(httpReader, sendRequest, getRequestData);
|
|
3036
3151
|
} else {
|
|
@@ -3071,6 +3186,8 @@
|
|
|
3071
3186
|
throw new Error(ERR_HTTP_RANGE);
|
|
3072
3187
|
}
|
|
3073
3188
|
}
|
|
3189
|
+
checkResourceValidators(httpReader, response);
|
|
3190
|
+
setResourceValidators(httpReader, response);
|
|
3074
3191
|
const data = new Uint8Array(await response.arrayBuffer());
|
|
3075
3192
|
if (data.length != length) {
|
|
3076
3193
|
throw new Error(ERR_HTTP_RANGE);
|
|
@@ -3082,7 +3199,97 @@
|
|
|
3082
3199
|
if (!data) {
|
|
3083
3200
|
await getRequestData(httpReader, options);
|
|
3084
3201
|
}
|
|
3085
|
-
return
|
|
3202
|
+
return httpReader.data.subarray(index, index + length);
|
|
3203
|
+
}
|
|
3204
|
+
}
|
|
3205
|
+
|
|
3206
|
+
function createRangeReadable(httpReader, offset, size) {
|
|
3207
|
+
let bodyReader;
|
|
3208
|
+
let remainingLength = size;
|
|
3209
|
+
return new ReadableStream({
|
|
3210
|
+
async start() {
|
|
3211
|
+
const response = await sendFetchRequest(HTTP_METHOD_GET, httpReader, getRangeHeaders(httpReader, offset, size));
|
|
3212
|
+
if (response.status != 206) {
|
|
3213
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
3214
|
+
}
|
|
3215
|
+
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
3216
|
+
if (contentRangeHeader) {
|
|
3217
|
+
const rangeStart = Number(contentRangeHeader.trim().split(/[\s-]+/)[1]);
|
|
3218
|
+
if (!Number.isNaN(rangeStart) && rangeStart != offset) {
|
|
3219
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
3220
|
+
}
|
|
3221
|
+
}
|
|
3222
|
+
checkResourceValidators(httpReader, response);
|
|
3223
|
+
setResourceValidators(httpReader, response);
|
|
3224
|
+
bodyReader = response.body.getReader();
|
|
3225
|
+
},
|
|
3226
|
+
async pull(controller) {
|
|
3227
|
+
const { value, done } = await bodyReader.read();
|
|
3228
|
+
if (done) {
|
|
3229
|
+
if (remainingLength) {
|
|
3230
|
+
throw new Error(ERR_HTTP_RANGE);
|
|
3231
|
+
}
|
|
3232
|
+
controller.close();
|
|
3233
|
+
} else {
|
|
3234
|
+
const chunk = value.length > remainingLength ? value.subarray(0, remainingLength) : value;
|
|
3235
|
+
remainingLength -= chunk.length;
|
|
3236
|
+
if (chunk.length) {
|
|
3237
|
+
controller.enqueue(chunk);
|
|
3238
|
+
}
|
|
3239
|
+
if (!remainingLength) {
|
|
3240
|
+
controller.close();
|
|
3241
|
+
await bodyReader.cancel();
|
|
3242
|
+
}
|
|
3243
|
+
}
|
|
3244
|
+
},
|
|
3245
|
+
cancel(reason) {
|
|
3246
|
+
return bodyReader && bodyReader.cancel(reason);
|
|
3247
|
+
}
|
|
3248
|
+
});
|
|
3249
|
+
}
|
|
3250
|
+
|
|
3251
|
+
function getContentRangeSize(response) {
|
|
3252
|
+
const contentRangeHeader = response.headers.get(HTTP_HEADER_CONTENT_RANGE);
|
|
3253
|
+
if (contentRangeHeader) {
|
|
3254
|
+
const headerValue = contentRangeHeader.trim().split(/\s*\/\s*/)[1];
|
|
3255
|
+
if (headerValue && headerValue != "*") {
|
|
3256
|
+
const contentSize = Number(headerValue);
|
|
3257
|
+
if (!Number.isNaN(contentSize)) {
|
|
3258
|
+
return contentSize;
|
|
3259
|
+
}
|
|
3260
|
+
}
|
|
3261
|
+
}
|
|
3262
|
+
}
|
|
3263
|
+
|
|
3264
|
+
function getResourceValidators({ headers }) {
|
|
3265
|
+
return {
|
|
3266
|
+
etag: headers.get(HTTP_HEADER_ETAG) || UNDEFINED_VALUE,
|
|
3267
|
+
lastModified: headers.get(HTTP_HEADER_LAST_MODIFIED) || UNDEFINED_VALUE
|
|
3268
|
+
};
|
|
3269
|
+
}
|
|
3270
|
+
|
|
3271
|
+
function setResourceValidators(httpReader, response) {
|
|
3272
|
+
const { checkResourceChanges, resourceValidators } = httpReader;
|
|
3273
|
+
if (checkResourceChanges && !resourceValidators && response.status == 206) {
|
|
3274
|
+
httpReader.resourceValidators = getResourceValidators(response);
|
|
3275
|
+
}
|
|
3276
|
+
}
|
|
3277
|
+
|
|
3278
|
+
function checkResourceValidators(httpReader, response) {
|
|
3279
|
+
const { checkResourceChanges, resourceValidators, size } = httpReader;
|
|
3280
|
+
if (checkResourceChanges) {
|
|
3281
|
+
const contentRangeSize = getContentRangeSize(response);
|
|
3282
|
+
if (contentRangeSize !== UNDEFINED_VALUE && size !== UNDEFINED_VALUE && contentRangeSize != size) {
|
|
3283
|
+
throw new Error(ERR_HTTP_RESOURCE_CHANGED);
|
|
3284
|
+
}
|
|
3285
|
+
if (resourceValidators) {
|
|
3286
|
+
const validators = getResourceValidators(response);
|
|
3287
|
+
const changed = Object.entries(resourceValidators).some(([name, value]) =>
|
|
3288
|
+
value !== UNDEFINED_VALUE && validators[name] !== UNDEFINED_VALUE && value != validators[name]);
|
|
3289
|
+
if (changed) {
|
|
3290
|
+
throw new Error(ERR_HTTP_RESOURCE_CHANGED);
|
|
3291
|
+
}
|
|
3292
|
+
}
|
|
3086
3293
|
}
|
|
3087
3294
|
}
|
|
3088
3295
|
|
|
@@ -3193,6 +3400,10 @@
|
|
|
3193
3400
|
super.init();
|
|
3194
3401
|
}
|
|
3195
3402
|
|
|
3403
|
+
createReadable(options) {
|
|
3404
|
+
return this.reader.createReadable(options);
|
|
3405
|
+
}
|
|
3406
|
+
|
|
3196
3407
|
readUint8Array(index, length) {
|
|
3197
3408
|
return this.reader.readUint8Array(index, length);
|
|
3198
3409
|
}
|
|
@@ -3273,25 +3484,26 @@
|
|
|
3273
3484
|
const reader = this;
|
|
3274
3485
|
const { readers } = reader;
|
|
3275
3486
|
reader.lastDiskNumber = 0;
|
|
3276
|
-
|
|
3277
|
-
|
|
3278
|
-
|
|
3279
|
-
if (indexDiskReader != readers.length - 1) {
|
|
3280
|
-
reader.lastDiskOffset += diskReader.size;
|
|
3281
|
-
}
|
|
3487
|
+
await Promise.all(readers.map(diskReader => initStream(diskReader)));
|
|
3488
|
+
reader.diskOffsets = readers.map(diskReader => {
|
|
3489
|
+
const diskOffset = reader.size;
|
|
3282
3490
|
reader.size += diskReader.size;
|
|
3283
|
-
|
|
3491
|
+
return diskOffset;
|
|
3492
|
+
});
|
|
3284
3493
|
super.init();
|
|
3285
3494
|
}
|
|
3286
3495
|
|
|
3287
|
-
|
|
3496
|
+
getDiskOffset(diskNumber) {
|
|
3497
|
+
const { diskOffsets, size } = this;
|
|
3498
|
+
const diskOffset = diskOffsets.at(diskNumber);
|
|
3499
|
+
return diskOffset === UNDEFINED_VALUE ? size : diskOffset;
|
|
3500
|
+
}
|
|
3501
|
+
|
|
3502
|
+
async readUint8Array(offset, length) {
|
|
3288
3503
|
const reader = this;
|
|
3289
3504
|
const { readers } = this;
|
|
3290
3505
|
let result;
|
|
3291
|
-
let currentDiskNumber =
|
|
3292
|
-
if (currentDiskNumber == -1) {
|
|
3293
|
-
currentDiskNumber = readers.length - 1;
|
|
3294
|
-
}
|
|
3506
|
+
let currentDiskNumber = 0;
|
|
3295
3507
|
let currentReaderOffset = offset;
|
|
3296
3508
|
while (readers[currentDiskNumber] && currentReaderOffset >= readers[currentDiskNumber].size) {
|
|
3297
3509
|
currentReaderOffset -= readers[currentDiskNumber].size;
|
|
@@ -3304,14 +3516,9 @@
|
|
|
3304
3516
|
result = await readUint8Array(currentReader, currentReaderOffset, length);
|
|
3305
3517
|
} else {
|
|
3306
3518
|
const chunkLength = currentReaderSize - currentReaderOffset;
|
|
3307
|
-
result = new Uint8Array(length);
|
|
3308
3519
|
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
|
-
}
|
|
3520
|
+
const secondPart = await reader.readUint8Array(offset + chunkLength, length - chunkLength);
|
|
3521
|
+
result = concat(firstPart, secondPart);
|
|
3315
3522
|
}
|
|
3316
3523
|
} else {
|
|
3317
3524
|
result = EMPTY_UINT8_ARRAY;
|
|
@@ -3336,6 +3543,12 @@
|
|
|
3336
3543
|
let diskSourceWriter, diskWritable, diskWriter;
|
|
3337
3544
|
const writable = new WritableStream({
|
|
3338
3545
|
async write(chunk) {
|
|
3546
|
+
if (chunk === DISK_BOUNDARY) {
|
|
3547
|
+
if (diskWriter) {
|
|
3548
|
+
await endDisk();
|
|
3549
|
+
}
|
|
3550
|
+
return;
|
|
3551
|
+
}
|
|
3339
3552
|
const { availableSize } = writer;
|
|
3340
3553
|
if (!diskWriter) {
|
|
3341
3554
|
const { value, done } = await writerGenerator.next();
|
|
@@ -3355,11 +3568,7 @@
|
|
|
3355
3568
|
await this.write(chunk);
|
|
3356
3569
|
} else if (chunk.length >= availableSize) {
|
|
3357
3570
|
await writeChunk(chunk.subarray(0, availableSize));
|
|
3358
|
-
await
|
|
3359
|
-
writer.diskOffset += diskSourceWriter.size;
|
|
3360
|
-
writer.diskNumber++;
|
|
3361
|
-
diskWriter = null;
|
|
3362
|
-
writer.availableSize = writer.maxSize;
|
|
3571
|
+
await endDisk();
|
|
3363
3572
|
if (chunk.length > availableSize) {
|
|
3364
3573
|
await this.write(chunk.subarray(availableSize));
|
|
3365
3574
|
}
|
|
@@ -3370,7 +3579,7 @@
|
|
|
3370
3579
|
async close() {
|
|
3371
3580
|
if (diskWriter) {
|
|
3372
3581
|
await diskWriter.ready;
|
|
3373
|
-
await
|
|
3582
|
+
await closeDiskWriter();
|
|
3374
3583
|
}
|
|
3375
3584
|
},
|
|
3376
3585
|
async abort(reason) {
|
|
@@ -3395,10 +3604,28 @@
|
|
|
3395
3604
|
}
|
|
3396
3605
|
}
|
|
3397
3606
|
|
|
3398
|
-
async function
|
|
3607
|
+
async function endDisk() {
|
|
3608
|
+
await closeDiskWriter();
|
|
3609
|
+
writer.diskOffset += diskSourceWriter.size;
|
|
3610
|
+
writer.diskNumber++;
|
|
3611
|
+
diskWriter = null;
|
|
3612
|
+
writer.availableSize = writer.maxSize;
|
|
3613
|
+
}
|
|
3614
|
+
|
|
3615
|
+
async function closeDiskWriter() {
|
|
3399
3616
|
await diskWriter.close();
|
|
3400
3617
|
}
|
|
3401
3618
|
}
|
|
3619
|
+
|
|
3620
|
+
async closeDisk() {
|
|
3621
|
+
const streamWriter = this.writable.getWriter();
|
|
3622
|
+
try {
|
|
3623
|
+
await streamWriter.ready;
|
|
3624
|
+
await streamWriter.write(DISK_BOUNDARY);
|
|
3625
|
+
} finally {
|
|
3626
|
+
streamWriter.releaseLock();
|
|
3627
|
+
}
|
|
3628
|
+
}
|
|
3402
3629
|
}
|
|
3403
3630
|
|
|
3404
3631
|
class GenericReader {
|
|
@@ -3430,14 +3657,6 @@
|
|
|
3430
3657
|
if (writer.size === UNDEFINED_VALUE) {
|
|
3431
3658
|
writer.size = 0;
|
|
3432
3659
|
}
|
|
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
3660
|
return writer;
|
|
3442
3661
|
}
|
|
3443
3662
|
}
|
|
@@ -3456,8 +3675,8 @@
|
|
|
3456
3675
|
}
|
|
3457
3676
|
}
|
|
3458
3677
|
|
|
3459
|
-
function readUint8Array(reader, offset, size
|
|
3460
|
-
return reader.readUint8Array(offset, size
|
|
3678
|
+
function readUint8Array(reader, offset, size) {
|
|
3679
|
+
return reader.readUint8Array(offset, size);
|
|
3461
3680
|
}
|
|
3462
3681
|
|
|
3463
3682
|
/*
|
|
@@ -3833,7 +4052,7 @@
|
|
|
3833
4052
|
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
3834
4053
|
if (!endOfDirectoryInfo) {
|
|
3835
4054
|
const signatureArray = await readUint8Array(reader, 0, 4);
|
|
3836
|
-
const signatureView = getDataView
|
|
4055
|
+
const signatureView = getDataView(signatureArray);
|
|
3837
4056
|
if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
|
|
3838
4057
|
throw new Error(ERR_SPLIT_ZIP_FILE);
|
|
3839
4058
|
} else {
|
|
@@ -3843,7 +4062,7 @@
|
|
|
3843
4062
|
if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
|
|
3844
4063
|
throwAmbiguousArchive("multiple end of central directory records");
|
|
3845
4064
|
}
|
|
3846
|
-
const endOfDirectoryView = getDataView
|
|
4065
|
+
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
3847
4066
|
let directoryDataLength = getUint32(endOfDirectoryView, 12);
|
|
3848
4067
|
let directoryDataOffset = getUint32(endOfDirectoryView, 16);
|
|
3849
4068
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
@@ -3859,17 +4078,21 @@
|
|
|
3859
4078
|
let prependedDataLength = 0;
|
|
3860
4079
|
let startOffset;
|
|
3861
4080
|
let zip64EndOfDirectory;
|
|
3862
|
-
|
|
4081
|
+
const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
|
|
4082
|
+
if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
|
|
4083
|
+
directoryDataOffset += getDiskOffset$1(reader, diskNumber);
|
|
4084
|
+
}
|
|
4085
|
+
if (requiresZip64) {
|
|
3863
4086
|
const endOfDirectoryLocatorArray = endOfDirectoryInfo.offset >= ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH ?
|
|
3864
4087
|
await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH) :
|
|
3865
4088
|
EMPTY_UINT8_ARRAY;
|
|
3866
|
-
const endOfDirectoryLocatorView = getDataView
|
|
4089
|
+
const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
|
|
3867
4090
|
if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
|
|
3868
4091
|
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
|
|
4092
|
+
directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4093
|
+
let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4094
|
+
let endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4095
|
+
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
3873
4096
|
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
3874
4097
|
directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
|
|
3875
4098
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
@@ -3877,8 +4100,8 @@
|
|
|
3877
4100
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
3878
4101
|
prependedDataLength = directoryDataOffset - originalDirectoryDataOffset;
|
|
3879
4102
|
}
|
|
3880
|
-
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH
|
|
3881
|
-
endOfDirectoryView = getDataView
|
|
4103
|
+
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4104
|
+
endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
3882
4105
|
}
|
|
3883
4106
|
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
3884
4107
|
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
@@ -3904,7 +4127,7 @@
|
|
|
3904
4127
|
} else if (checkAmbiguity && directoryDataLength != getBigUint64(endOfDirectoryView, 40)) {
|
|
3905
4128
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
3906
4129
|
}
|
|
3907
|
-
directoryDataOffset = getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
4130
|
+
directoryDataOffset = getDiskOffset$1(reader, diskNumber) + getBigUint64(endOfDirectoryView, 48) + prependedDataLength;
|
|
3908
4131
|
}
|
|
3909
4132
|
}
|
|
3910
4133
|
const declaredDirectoryDataLength = directoryDataLength;
|
|
@@ -3921,19 +4144,19 @@
|
|
|
3921
4144
|
throw new Error(ERR_BAD_FORMAT);
|
|
3922
4145
|
}
|
|
3923
4146
|
let offset = 0;
|
|
3924
|
-
let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength
|
|
3925
|
-
let directoryView = getDataView
|
|
4147
|
+
let directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
4148
|
+
let directoryView = getDataView(directoryArray);
|
|
3926
4149
|
if (directoryDataLength) {
|
|
3927
4150
|
if (directoryArray.length < 4) {
|
|
3928
4151
|
throw new Error(ERR_BAD_FORMAT);
|
|
3929
4152
|
}
|
|
3930
|
-
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength
|
|
4153
|
+
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
3931
4154
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
3932
4155
|
const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
3933
4156
|
let reconcile = !storedPointsAtDirectory;
|
|
3934
4157
|
if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
3935
|
-
const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4
|
|
3936
|
-
reconcile = getUint32(getDataView
|
|
4158
|
+
const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
|
|
4159
|
+
reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
3937
4160
|
}
|
|
3938
4161
|
if (reconcile) {
|
|
3939
4162
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
@@ -3941,16 +4164,16 @@
|
|
|
3941
4164
|
if (directoryDataOffset > originalDirectoryDataOffset) {
|
|
3942
4165
|
prependedDataLength += directoryDataOffset - originalDirectoryDataOffset;
|
|
3943
4166
|
}
|
|
3944
|
-
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength
|
|
3945
|
-
directoryView = getDataView
|
|
4167
|
+
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
4168
|
+
directoryView = getDataView(directoryArray);
|
|
3946
4169
|
}
|
|
3947
4170
|
}
|
|
3948
4171
|
}
|
|
3949
|
-
const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset
|
|
4172
|
+
const expectedDirectoryDataLength = centralDirectoryEndOffset - directoryDataOffset;
|
|
3950
4173
|
if (directoryDataLength != expectedDirectoryDataLength && expectedDirectoryDataLength >= 0 && diskNumber == lastDiskNumber) {
|
|
3951
4174
|
directoryDataLength = expectedDirectoryDataLength;
|
|
3952
|
-
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength
|
|
3953
|
-
directoryView = getDataView
|
|
4175
|
+
directoryArray = await readUint8Array(reader, directoryDataOffset, directoryDataLength);
|
|
4176
|
+
directoryView = getDataView(directoryArray);
|
|
3954
4177
|
}
|
|
3955
4178
|
if (directoryDataOffset < 0 || directoryDataOffset >= reader.size) {
|
|
3956
4179
|
throw new Error(ERR_BAD_FORMAT);
|
|
@@ -4023,7 +4246,7 @@
|
|
|
4023
4246
|
});
|
|
4024
4247
|
readCommonFooter(fileEntry, fileEntry, directoryView, offset + 6);
|
|
4025
4248
|
fileEntry.offset += prependedDataLength;
|
|
4026
|
-
startOffset = Math.min(fileEntry.offset, startOffset);
|
|
4249
|
+
startOffset = Math.min(getDiskOffset$1(reader, fileEntry.diskNumberStart) + fileEntry.offset, startOffset);
|
|
4027
4250
|
if (checkAmbiguity) {
|
|
4028
4251
|
if (filenames.has(fileEntry.filename)) {
|
|
4029
4252
|
duplicateFilename = true;
|
|
@@ -4177,8 +4400,9 @@
|
|
|
4177
4400
|
dataDescriptor
|
|
4178
4401
|
} = bitFlag;
|
|
4179
4402
|
const localDirectory = fileEntry.localDirectory = {};
|
|
4180
|
-
const
|
|
4181
|
-
const
|
|
4403
|
+
const localHeaderOffset = getDiskOffset$1(reader, diskNumberStart) + offset;
|
|
4404
|
+
const dataArray = await readUint8Array(reader, localHeaderOffset, HEADER_SIZE);
|
|
4405
|
+
const dataView = getDataView(dataArray);
|
|
4182
4406
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
4183
4407
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
4184
4408
|
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
@@ -4203,12 +4427,12 @@
|
|
|
4203
4427
|
const checkAmbiguity = getStrictness(getOptionValue$1(zipEntry, options, OPTION_STRICTNESS), getOptionValue$1(zipEntry, options, OPTION_CHECK_AMBIGUITY)) == STRICTNESS_STRICT;
|
|
4204
4428
|
let rawLocalFilename = EMPTY_UINT8_ARRAY;
|
|
4205
4429
|
if (checkAmbiguity && (filenameLength || extraFieldLength)) {
|
|
4206
|
-
const trailingDataArray = await readUint8Array(reader,
|
|
4430
|
+
const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
|
|
4207
4431
|
rawLocalFilename = trailingDataArray.subarray(0, filenameLength);
|
|
4208
4432
|
localDirectory.rawExtraField = trailingDataArray.subarray(filenameLength);
|
|
4209
4433
|
} else {
|
|
4210
4434
|
localDirectory.rawExtraField = extraFieldLength ?
|
|
4211
|
-
await readUint8Array(reader,
|
|
4435
|
+
await readUint8Array(reader, localHeaderOffset + HEADER_SIZE + filenameLength, extraFieldLength) :
|
|
4212
4436
|
EMPTY_UINT8_ARRAY;
|
|
4213
4437
|
}
|
|
4214
4438
|
readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
|
|
@@ -4234,9 +4458,9 @@
|
|
|
4234
4458
|
throw new Error(ERR_ENCRYPTED);
|
|
4235
4459
|
}
|
|
4236
4460
|
}
|
|
4237
|
-
const dataOffset =
|
|
4461
|
+
const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
|
|
4238
4462
|
const size = compressedSize;
|
|
4239
|
-
const readable = reader.createReadable({ offset: dataOffset, size
|
|
4463
|
+
const readable = reader.createReadable({ offset: dataOffset, size });
|
|
4240
4464
|
const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
|
|
4241
4465
|
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
4242
4466
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
@@ -4277,8 +4501,7 @@
|
|
|
4277
4501
|
reader,
|
|
4278
4502
|
fileEntry,
|
|
4279
4503
|
index,
|
|
4280
|
-
offset,
|
|
4281
|
-
diskNumberStart,
|
|
4504
|
+
offset: localHeaderOffset,
|
|
4282
4505
|
signature,
|
|
4283
4506
|
compressedSize,
|
|
4284
4507
|
uncompressedSize,
|
|
@@ -4342,7 +4565,7 @@
|
|
|
4342
4565
|
function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory) {
|
|
4343
4566
|
const { rawExtraField } = directory;
|
|
4344
4567
|
const extraField = directory.extraField = new Map();
|
|
4345
|
-
const rawExtraFieldView = getDataView
|
|
4568
|
+
const rawExtraFieldView = getDataView(rawExtraField);
|
|
4346
4569
|
let offsetExtraField = 0;
|
|
4347
4570
|
try {
|
|
4348
4571
|
while (offsetExtraField < rawExtraField.length) {
|
|
@@ -4414,7 +4637,7 @@
|
|
|
4414
4637
|
|
|
4415
4638
|
function readExtraFieldZip64(extraFieldZip64, directory) {
|
|
4416
4639
|
directory.zip64 = true;
|
|
4417
|
-
const extraFieldView = getDataView
|
|
4640
|
+
const extraFieldView = getDataView(extraFieldZip64.data);
|
|
4418
4641
|
const missingProperties = ZIP64_PROPERTIES.filter(([propertyName, max]) => directory[propertyName] == max);
|
|
4419
4642
|
const requiredLength = missingProperties.reduce((length, [, max]) => length + ZIP64_EXTRACTION[max].bytes, 0);
|
|
4420
4643
|
if (extraFieldZip64.data.length < requiredLength) {
|
|
@@ -4433,10 +4656,10 @@
|
|
|
4433
4656
|
extraFieldUnicode.valid = false;
|
|
4434
4657
|
return;
|
|
4435
4658
|
}
|
|
4436
|
-
const extraFieldView = getDataView
|
|
4659
|
+
const extraFieldView = getDataView(extraFieldUnicode.data);
|
|
4437
4660
|
const crc32 = new Crc32();
|
|
4438
4661
|
crc32.append(fileEntry[rawPropertyName]);
|
|
4439
|
-
const dataViewSignature = getDataView
|
|
4662
|
+
const dataViewSignature = getDataView(new Uint8Array(4));
|
|
4440
4663
|
dataViewSignature.setUint32(0, crc32.get(), true);
|
|
4441
4664
|
const signature = getUint32(extraFieldView, 1);
|
|
4442
4665
|
Object.assign(extraFieldUnicode, {
|
|
@@ -4451,7 +4674,7 @@
|
|
|
4451
4674
|
}
|
|
4452
4675
|
|
|
4453
4676
|
function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
|
|
4454
|
-
const extraFieldView = getDataView
|
|
4677
|
+
const extraFieldView = getDataView(extraFieldAES.data);
|
|
4455
4678
|
const strength = getUint8(extraFieldView, 4);
|
|
4456
4679
|
Object.assign(extraFieldAES, {
|
|
4457
4680
|
vendorVersion: getUint8(extraFieldView, 0),
|
|
@@ -4464,7 +4687,7 @@
|
|
|
4464
4687
|
}
|
|
4465
4688
|
|
|
4466
4689
|
function readExtraFieldNTFS(extraFieldNTFS, directory) {
|
|
4467
|
-
const extraFieldView = getDataView
|
|
4690
|
+
const extraFieldView = getDataView(extraFieldNTFS.data);
|
|
4468
4691
|
let offsetExtraField = 4;
|
|
4469
4692
|
let tag1Data;
|
|
4470
4693
|
try {
|
|
@@ -4481,7 +4704,7 @@
|
|
|
4481
4704
|
}
|
|
4482
4705
|
try {
|
|
4483
4706
|
if (tag1Data && tag1Data.length == 24) {
|
|
4484
|
-
const tag1View = getDataView
|
|
4707
|
+
const tag1View = getDataView(tag1Data);
|
|
4485
4708
|
const rawLastModDate = tag1View.getBigUint64(0, true);
|
|
4486
4709
|
const rawLastAccessDate = tag1View.getBigUint64(8, true);
|
|
4487
4710
|
const rawCreationDate = tag1View.getBigUint64(16, true);
|
|
@@ -4504,7 +4727,7 @@
|
|
|
4504
4727
|
|
|
4505
4728
|
function readExtraFieldUnix(extraField, directory, isInfoZip) {
|
|
4506
4729
|
try {
|
|
4507
|
-
const view = getDataView
|
|
4730
|
+
const view = getDataView(extraField.data);
|
|
4508
4731
|
let uid, gid;
|
|
4509
4732
|
if (isInfoZip) {
|
|
4510
4733
|
let offset = 0;
|
|
@@ -4542,7 +4765,7 @@
|
|
|
4542
4765
|
if (!extraFieldExtendedTimestamp.data.length) {
|
|
4543
4766
|
return;
|
|
4544
4767
|
}
|
|
4545
|
-
const extraFieldView = getDataView
|
|
4768
|
+
const extraFieldView = getDataView(extraFieldExtendedTimestamp.data);
|
|
4546
4769
|
const flags = getUint8(extraFieldView, 0);
|
|
4547
4770
|
const timeProperties = [];
|
|
4548
4771
|
const timeRawProperties = [];
|
|
@@ -4580,7 +4803,6 @@
|
|
|
4580
4803
|
fileEntry,
|
|
4581
4804
|
index,
|
|
4582
4805
|
offset,
|
|
4583
|
-
diskNumberStart,
|
|
4584
4806
|
signature,
|
|
4585
4807
|
compressedSize,
|
|
4586
4808
|
uncompressedSize,
|
|
@@ -4589,12 +4811,6 @@
|
|
|
4589
4811
|
extraFieldZip64,
|
|
4590
4812
|
readRanges
|
|
4591
4813
|
}) {
|
|
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
4814
|
let dataDescriptorLength = 0;
|
|
4599
4815
|
if (dataDescriptor) {
|
|
4600
4816
|
if (extraFieldZip64) {
|
|
@@ -4604,19 +4820,19 @@
|
|
|
4604
4820
|
}
|
|
4605
4821
|
}
|
|
4606
4822
|
if (dataDescriptorLength) {
|
|
4607
|
-
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH
|
|
4823
|
+
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
|
|
4608
4824
|
const dataDescriptorSignature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
|
|
4609
|
-
getUint32(getDataView
|
|
4825
|
+
getUint32(getDataView(dataDescriptorArray), 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
4610
4826
|
if (dataDescriptorSignature) {
|
|
4611
|
-
const readSignature = getUint32(getDataView
|
|
4827
|
+
const readSignature = getUint32(getDataView(dataDescriptorArray), 4);
|
|
4612
4828
|
let readCompressedSize;
|
|
4613
4829
|
let readUncompressedSize;
|
|
4614
4830
|
if (extraFieldZip64) {
|
|
4615
|
-
readCompressedSize = getBigUint64(getDataView
|
|
4616
|
-
readUncompressedSize = getBigUint64(getDataView
|
|
4831
|
+
readCompressedSize = getBigUint64(getDataView(dataDescriptorArray), 8);
|
|
4832
|
+
readUncompressedSize = getBigUint64(getDataView(dataDescriptorArray), 16);
|
|
4617
4833
|
} else {
|
|
4618
|
-
readCompressedSize = getUint32(getDataView
|
|
4619
|
-
readUncompressedSize = getUint32(getDataView
|
|
4834
|
+
readCompressedSize = getUint32(getDataView(dataDescriptorArray), 8);
|
|
4835
|
+
readUncompressedSize = getUint32(getDataView(dataDescriptorArray), 12);
|
|
4620
4836
|
}
|
|
4621
4837
|
const matchSignature = (fileEntry.encrypted && !fileEntry.zipCrypto) || readSignature == signature;
|
|
4622
4838
|
if (matchSignature &&
|
|
@@ -4627,8 +4843,8 @@
|
|
|
4627
4843
|
}
|
|
4628
4844
|
}
|
|
4629
4845
|
const range = {
|
|
4630
|
-
start:
|
|
4631
|
-
end:
|
|
4846
|
+
start: offset,
|
|
4847
|
+
end: dataOffset + compressedSize + dataDescriptorLength,
|
|
4632
4848
|
fileEntry
|
|
4633
4849
|
};
|
|
4634
4850
|
for (const [otherIndex, otherRange] of readRanges) {
|
|
@@ -4641,6 +4857,10 @@
|
|
|
4641
4857
|
readRanges.set(index, range);
|
|
4642
4858
|
}
|
|
4643
4859
|
|
|
4860
|
+
function getDiskOffset$1(reader, diskNumber) {
|
|
4861
|
+
return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
|
|
4862
|
+
}
|
|
4863
|
+
|
|
4644
4864
|
function getStrictness(strictness, checkAmbiguity) {
|
|
4645
4865
|
if (strictness === UNDEFINED_VALUE) {
|
|
4646
4866
|
return checkAmbiguity ? STRICTNESS_STRICT : STRICTNESS_BALANCED;
|
|
@@ -4724,7 +4944,7 @@
|
|
|
4724
4944
|
async function* scanEndOfCentralDirectory(reader, scanLength) {
|
|
4725
4945
|
const scanOffset = reader.size - scanLength;
|
|
4726
4946
|
const scanArray = await readUint8Array(reader, scanOffset, scanLength);
|
|
4727
|
-
const scanView = getDataView
|
|
4947
|
+
const scanView = getDataView(scanArray);
|
|
4728
4948
|
for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
|
|
4729
4949
|
if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4730
4950
|
yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
|
|
@@ -4747,7 +4967,8 @@
|
|
|
4747
4967
|
if (!filesLength && !directoryDataLength) {
|
|
4748
4968
|
return CENTRAL_DIRECTORY_PLAUSIBLE;
|
|
4749
4969
|
}
|
|
4750
|
-
|
|
4970
|
+
const directoryDiskNumber = getUint16(view, indexByte + 6);
|
|
4971
|
+
for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
|
|
4751
4972
|
if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4752
4973
|
return CENTRAL_DIRECTORY_REACHABLE;
|
|
4753
4974
|
}
|
|
@@ -4765,7 +4986,7 @@
|
|
|
4765
4986
|
if (remoteProbeBudget.count > 0) {
|
|
4766
4987
|
remoteProbeBudget.count--;
|
|
4767
4988
|
const signatureArray = await readUint8Array(reader, signatureOffset, 4);
|
|
4768
|
-
return getUint32(getDataView
|
|
4989
|
+
return getUint32(getDataView(signatureArray), 0);
|
|
4769
4990
|
}
|
|
4770
4991
|
return UNDEFINED_VALUE;
|
|
4771
4992
|
}
|
|
@@ -4830,9 +5051,27 @@
|
|
|
4830
5051
|
return Number(view.getBigUint64(offset, true));
|
|
4831
5052
|
}
|
|
4832
5053
|
|
|
4833
|
-
|
|
4834
|
-
|
|
4835
|
-
|
|
5054
|
+
var zipReader = /*#__PURE__*/Object.freeze({
|
|
5055
|
+
__proto__: null,
|
|
5056
|
+
ERR_AMBIGUOUS_ARCHIVE: ERR_AMBIGUOUS_ARCHIVE,
|
|
5057
|
+
ERR_BAD_FORMAT: ERR_BAD_FORMAT,
|
|
5058
|
+
ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
|
|
5059
|
+
ERR_ENCRYPTED: ERR_ENCRYPTED,
|
|
5060
|
+
ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
|
|
5061
|
+
ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
|
|
5062
|
+
ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
|
|
5063
|
+
ERR_INVALID_COMPRESSED_DATA: ERR_INVALID_COMPRESSED_DATA,
|
|
5064
|
+
ERR_INVALID_PASSWORD: ERR_INVALID_PASSWORD,
|
|
5065
|
+
ERR_INVALID_SIGNATURE: ERR_INVALID_SIGNATURE,
|
|
5066
|
+
ERR_INVALID_UNCOMPRESSED_SIZE: ERR_INVALID_UNCOMPRESSED_SIZE,
|
|
5067
|
+
ERR_LOCAL_FILE_HEADER_NOT_FOUND: ERR_LOCAL_FILE_HEADER_NOT_FOUND,
|
|
5068
|
+
ERR_OVERLAPPING_ENTRY: ERR_OVERLAPPING_ENTRY,
|
|
5069
|
+
ERR_SPLIT_ZIP_FILE: ERR_SPLIT_ZIP_FILE,
|
|
5070
|
+
ERR_UNSUPPORTED_COMPRESSION: ERR_UNSUPPORTED_COMPRESSION$1,
|
|
5071
|
+
ERR_UNSUPPORTED_ENCRYPTION: ERR_UNSUPPORTED_ENCRYPTION,
|
|
5072
|
+
ZipReader: ZipReader,
|
|
5073
|
+
ZipReaderStream: ZipReaderStream
|
|
5074
|
+
});
|
|
4836
5075
|
|
|
4837
5076
|
/*
|
|
4838
5077
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -4897,9 +5136,10 @@
|
|
|
4897
5136
|
|
|
4898
5137
|
constructor(writer, options = {}) {
|
|
4899
5138
|
writer = new GenericWriter(writer);
|
|
5139
|
+
const { availableSize = INFINITY_VALUE, maxSize = INFINITY_VALUE } = writer;
|
|
4900
5140
|
const addSplitZipSignature =
|
|
4901
|
-
|
|
4902
|
-
|
|
5141
|
+
availableSize > 0 && availableSize !== INFINITY_VALUE &&
|
|
5142
|
+
maxSize > 0 && maxSize !== INFINITY_VALUE;
|
|
4903
5143
|
Object.assign(this, {
|
|
4904
5144
|
writer,
|
|
4905
5145
|
addSplitZipSignature,
|
|
@@ -4921,9 +5161,10 @@
|
|
|
4921
5161
|
}
|
|
4922
5162
|
reader = new GenericReader(reader);
|
|
4923
5163
|
await initStream(reader);
|
|
4924
|
-
const
|
|
4925
|
-
const
|
|
4926
|
-
await zipReader.
|
|
5164
|
+
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
5165
|
+
const zipReader$1 = new ZipReader(reader.readable);
|
|
5166
|
+
const entries = await zipReader$1.getEntries();
|
|
5167
|
+
await zipReader$1.close();
|
|
4927
5168
|
await initStream(this.writer);
|
|
4928
5169
|
await reader.readable.pipeTo(this.writer.writable, { preventClose: true, preventAbort: true });
|
|
4929
5170
|
this.writer.size = this.offset = reader.size;
|
|
@@ -4939,8 +5180,6 @@
|
|
|
4939
5180
|
encrypted,
|
|
4940
5181
|
uncompressedSize,
|
|
4941
5182
|
compressedSize,
|
|
4942
|
-
diskOffset,
|
|
4943
|
-
diskNumber,
|
|
4944
5183
|
zip64
|
|
4945
5184
|
} = entry;
|
|
4946
5185
|
let {
|
|
@@ -4988,8 +5227,9 @@
|
|
|
4988
5227
|
Object.assign(entry, {
|
|
4989
5228
|
zip64UncompressedSize,
|
|
4990
5229
|
zip64CompressedSize,
|
|
4991
|
-
zip64Offset: zip64 &&
|
|
4992
|
-
|
|
5230
|
+
zip64Offset: zip64 && entry.offset >= MAX_32_BITS,
|
|
5231
|
+
diskNumberStart: 0,
|
|
5232
|
+
zip64DiskNumberStart: false,
|
|
4993
5233
|
rawExtraFieldZip64,
|
|
4994
5234
|
rawExtraFieldAES,
|
|
4995
5235
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -5156,7 +5396,8 @@
|
|
|
5156
5396
|
try {
|
|
5157
5397
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
5158
5398
|
({ reader } = sizesInfo);
|
|
5159
|
-
const
|
|
5399
|
+
const diskOffset = getDiskOffset(zipWriter.writer);
|
|
5400
|
+
const diskNumber = getDiskNumber(zipWriter.writer);
|
|
5160
5401
|
options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
|
|
5161
5402
|
internalFileAttribute: metadataInfo.resolvedOptions.internalFileAttributes,
|
|
5162
5403
|
externalFileAttribute: attributesInfo.resolvedOptions.externalFileAttributes,
|
|
@@ -5333,7 +5574,7 @@
|
|
|
5333
5574
|
const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
|
|
5334
5575
|
const keepOrder = getOptionValue(zipWriter, options, OPTION_KEEP_ORDER, true);
|
|
5335
5576
|
const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
|
|
5336
|
-
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS
|
|
5577
|
+
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
|
|
5337
5578
|
const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
|
|
5338
5579
|
const createTempStream = getOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
5339
5580
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
@@ -5531,7 +5772,7 @@
|
|
|
5531
5772
|
await requestLockWriter();
|
|
5532
5773
|
}
|
|
5533
5774
|
await initStream(fileWriter);
|
|
5534
|
-
const
|
|
5775
|
+
const diskOffset = getDiskOffset(writer);
|
|
5535
5776
|
if (zipWriter.addSplitZipSignature) {
|
|
5536
5777
|
delete zipWriter.addSplitZipSignature;
|
|
5537
5778
|
const signatureArray = new Uint8Array(4);
|
|
@@ -5548,7 +5789,7 @@
|
|
|
5548
5789
|
await lockPreviousFileEntry;
|
|
5549
5790
|
await skipDiskIfNeeded();
|
|
5550
5791
|
}
|
|
5551
|
-
const diskNumberStart = writer
|
|
5792
|
+
const diskNumberStart = getDiskNumber(writer);
|
|
5552
5793
|
const entryOffset = getSegmentOffset(zipWriter, writer);
|
|
5553
5794
|
fileEntry.diskNumberStart = diskNumberStart;
|
|
5554
5795
|
if (!bufferedWrite) {
|
|
@@ -5568,11 +5809,11 @@
|
|
|
5568
5809
|
writingBufferedEntryData = true;
|
|
5569
5810
|
writerSizeBeforeEntry = writer.size;
|
|
5570
5811
|
await skipDiskIfNeeded();
|
|
5571
|
-
fileEntry.diskNumberStart = writer
|
|
5812
|
+
fileEntry.diskNumberStart = getDiskNumber(writer);
|
|
5572
5813
|
fileEntry.offset = getSegmentOffset(zipWriter, writer);
|
|
5573
5814
|
if (usdz) {
|
|
5574
5815
|
const previousMetadataSize = entryInfo.metadataSize;
|
|
5575
|
-
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - writer
|
|
5816
|
+
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - getDiskOffset(writer));
|
|
5576
5817
|
fileEntry.size += entryInfo.metadataSize - previousMetadataSize;
|
|
5577
5818
|
}
|
|
5578
5819
|
updateLocalHeader(fileEntry, headerInfo.localHeaderView, options);
|
|
@@ -5637,9 +5878,8 @@
|
|
|
5637
5878
|
}
|
|
5638
5879
|
|
|
5639
5880
|
async function skipDiskIfNeeded() {
|
|
5640
|
-
if (getLength(headerInfo.localHeaderArray)
|
|
5641
|
-
writer.
|
|
5642
|
-
await writeData(writer, EMPTY_UINT8_ARRAY);
|
|
5881
|
+
if (exceedsAvailableSize(writer, getLength(headerInfo.localHeaderArray))) {
|
|
5882
|
+
await writer.closeDisk();
|
|
5643
5883
|
}
|
|
5644
5884
|
}
|
|
5645
5885
|
}
|
|
@@ -5750,7 +5990,7 @@
|
|
|
5750
5990
|
}
|
|
5751
5991
|
const { writable } = writer;
|
|
5752
5992
|
if (reader) {
|
|
5753
|
-
const readable = reader.createReadable ? reader.createReadable(
|
|
5993
|
+
const readable = reader.createReadable ? reader.createReadable() : reader.readable;
|
|
5754
5994
|
const size = reader.size;
|
|
5755
5995
|
const workerOptions = {
|
|
5756
5996
|
options: {
|
|
@@ -6182,8 +6422,8 @@
|
|
|
6182
6422
|
|
|
6183
6423
|
async function closeFile(zipWriter, comment, options) {
|
|
6184
6424
|
const directoryDataLength = createDirectoryRecords(zipWriter.files);
|
|
6185
|
-
const
|
|
6186
|
-
await writeEndOfDirectoryRecord(zipWriter, comment, options, {
|
|
6425
|
+
const directoryStart = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
|
|
6426
|
+
await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength });
|
|
6187
6427
|
}
|
|
6188
6428
|
|
|
6189
6429
|
function createDirectoryRecords(files) {
|
|
@@ -6265,8 +6505,8 @@
|
|
|
6265
6505
|
await initStream(writer);
|
|
6266
6506
|
let offset = 0;
|
|
6267
6507
|
let directoryDiskOffset = 0;
|
|
6268
|
-
let
|
|
6269
|
-
let
|
|
6508
|
+
let directoryStartDiskNumber = getDiskNumber(writer);
|
|
6509
|
+
let directoryStartDiskOffset = getDiskOffset(writer);
|
|
6270
6510
|
for (const [indexFileEntry, fileEntry] of Array.from(files.values()).entries()) {
|
|
6271
6511
|
const {
|
|
6272
6512
|
offset: fileEntryOffset,
|
|
@@ -6293,15 +6533,14 @@
|
|
|
6293
6533
|
} = fileEntry;
|
|
6294
6534
|
const extraFieldLength = getLength(rawExtraFieldZip64, rawExtraFieldAES, rawExtraFieldExtendedTimestamp, rawExtraFieldNTFS, rawExtraFieldUnix, rawExtraField);
|
|
6295
6535
|
const directoryRecordLength = CENTRAL_FILE_HEADER_LENGTH + getLength(rawFilename, rawComment) + extraFieldLength;
|
|
6296
|
-
if (offset + directoryRecordLength - directoryDiskOffset
|
|
6536
|
+
if (exceedsAvailableSize(writer, offset + directoryRecordLength - directoryDiskOffset)) {
|
|
6297
6537
|
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
6298
6538
|
directoryDiskOffset = offset;
|
|
6299
|
-
writer.
|
|
6300
|
-
await writeData(writer, EMPTY_UINT8_ARRAY);
|
|
6539
|
+
await writer.closeDisk();
|
|
6301
6540
|
}
|
|
6302
6541
|
if (indexFileEntry == 0) {
|
|
6303
|
-
|
|
6304
|
-
|
|
6542
|
+
directoryStartDiskNumber = getDiskNumber(writer);
|
|
6543
|
+
directoryStartDiskOffset = getDiskOffset(writer);
|
|
6305
6544
|
}
|
|
6306
6545
|
if (!zip64UncompressedSize) {
|
|
6307
6546
|
setUint32(headerView, HEADER_OFFSET_UNCOMPRESSED_SIZE, uncompressedSize);
|
|
@@ -6341,18 +6580,18 @@
|
|
|
6341
6580
|
}
|
|
6342
6581
|
}
|
|
6343
6582
|
await writeData(writer, directoryDiskOffset ? directoryArray.slice(directoryDiskOffset) : directoryArray);
|
|
6344
|
-
return {
|
|
6583
|
+
return { diskNumber: directoryStartDiskNumber, diskOffset: directoryStartDiskOffset };
|
|
6345
6584
|
}
|
|
6346
6585
|
|
|
6347
6586
|
async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
6348
6587
|
const { writer } = zipWriter;
|
|
6349
|
-
const {
|
|
6588
|
+
const { directoryStart } = cdInfo;
|
|
6350
6589
|
let { directoryDataLength } = cdInfo;
|
|
6351
6590
|
let filesLength = zipWriter.files.size;
|
|
6352
|
-
let diskNumber =
|
|
6353
|
-
let directoryOffset =
|
|
6354
|
-
let lastDiskNumber = writer
|
|
6355
|
-
if (writer
|
|
6591
|
+
let diskNumber = directoryStart.diskNumber;
|
|
6592
|
+
let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
|
|
6593
|
+
let lastDiskNumber = getDiskNumber(writer);
|
|
6594
|
+
if (exceedsAvailableSize(writer, END_OF_CENTRAL_DIR_LENGTH)) {
|
|
6356
6595
|
lastDiskNumber++;
|
|
6357
6596
|
}
|
|
6358
6597
|
let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
@@ -6368,11 +6607,10 @@
|
|
|
6368
6607
|
throw new Error(ERR_INVALID_COMMENT);
|
|
6369
6608
|
}
|
|
6370
6609
|
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);
|
|
6610
|
+
if (exceedsAvailableSize(writer, getLength(endOfdirectoryRecord.array) + commentLength)) {
|
|
6611
|
+
await writer.closeDisk();
|
|
6374
6612
|
}
|
|
6375
|
-
lastDiskNumber = writer
|
|
6613
|
+
lastDiskNumber = getDiskNumber(writer);
|
|
6376
6614
|
if (zip64) {
|
|
6377
6615
|
endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
|
|
6378
6616
|
endOfdirectoryRecord.uint64(44);
|
|
@@ -6386,7 +6624,7 @@
|
|
|
6386
6624
|
endOfdirectoryRecord.uint64(directoryOffset);
|
|
6387
6625
|
endOfdirectoryRecord.uint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
|
|
6388
6626
|
endOfdirectoryRecord.uint32(lastDiskNumber);
|
|
6389
|
-
endOfdirectoryRecord.uint64(BigInt(zipWriter
|
|
6627
|
+
endOfdirectoryRecord.uint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength));
|
|
6390
6628
|
endOfdirectoryRecord.uint32(lastDiskNumber + 1);
|
|
6391
6629
|
const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
|
|
6392
6630
|
if (supportZip64SplitFile) {
|
|
@@ -6426,8 +6664,23 @@
|
|
|
6426
6664
|
};
|
|
6427
6665
|
}
|
|
6428
6666
|
|
|
6429
|
-
function
|
|
6430
|
-
|
|
6667
|
+
function getDiskNumber(writer) {
|
|
6668
|
+
const { diskNumber = 0 } = writer;
|
|
6669
|
+
return diskNumber;
|
|
6670
|
+
}
|
|
6671
|
+
|
|
6672
|
+
function getDiskOffset(writer) {
|
|
6673
|
+
const { diskOffset = 0 } = writer;
|
|
6674
|
+
return diskOffset;
|
|
6675
|
+
}
|
|
6676
|
+
|
|
6677
|
+
function exceedsAvailableSize(writer, length) {
|
|
6678
|
+
const { availableSize = INFINITY_VALUE } = writer;
|
|
6679
|
+
return length > availableSize;
|
|
6680
|
+
}
|
|
6681
|
+
|
|
6682
|
+
function getSegmentOffset(zipWriter, { diskNumber = 0, diskOffset = 0 }) {
|
|
6683
|
+
return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
|
|
6431
6684
|
}
|
|
6432
6685
|
|
|
6433
6686
|
async function writeData(writer, array) {
|
|
@@ -6504,9 +6757,6 @@
|
|
|
6504
6757
|
array.set(typedArray, offset);
|
|
6505
6758
|
}
|
|
6506
6759
|
|
|
6507
|
-
function getDataView(array) {
|
|
6508
|
-
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
6509
|
-
}
|
|
6510
6760
|
|
|
6511
6761
|
function getLength(...arrayLikes) {
|
|
6512
6762
|
let result = 0;
|
|
@@ -7047,7 +7297,7 @@
|
|
|
7047
7297
|
|
|
7048
7298
|
|
|
7049
7299
|
try {
|
|
7050
|
-
|
|
7300
|
+
setDefaultConfiguration({ baseURI: (typeof document === 'undefined' && typeof location === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : typeof document === 'undefined' ? location.href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('zip-native.js', document.baseURI).href)) });
|
|
7051
7301
|
} catch {
|
|
7052
7302
|
// ignored
|
|
7053
7303
|
}
|
|
@@ -7083,7 +7333,7 @@
|
|
|
7083
7333
|
*/
|
|
7084
7334
|
|
|
7085
7335
|
|
|
7086
|
-
|
|
7336
|
+
setDefaultConfiguration({
|
|
7087
7337
|
workerURI: "./core/web-worker-native.js",
|
|
7088
7338
|
wasmURI: null,
|
|
7089
7339
|
CompressionStreamZlib: E_,
|
|
@@ -7119,7 +7369,7 @@
|
|
|
7119
7369
|
*/
|
|
7120
7370
|
|
|
7121
7371
|
|
|
7122
|
-
i(
|
|
7372
|
+
i(setDefaultConfiguration);
|
|
7123
7373
|
|
|
7124
7374
|
exports.BlobReader = BlobReader;
|
|
7125
7375
|
exports.BlobWriter = BlobWriter;
|
|
@@ -7134,6 +7384,7 @@
|
|
|
7134
7384
|
exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
|
|
7135
7385
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
7136
7386
|
exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
|
|
7387
|
+
exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
|
|
7137
7388
|
exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
7138
7389
|
exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
|
|
7139
7390
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
@@ -7175,6 +7426,7 @@
|
|
|
7175
7426
|
exports.createOPFSTempStream = createOPFSTempStream;
|
|
7176
7427
|
exports.createSyncAccessHandleTempStream = createSyncAccessHandleTempStream;
|
|
7177
7428
|
exports.getMimeType = getMimeType;
|
|
7429
|
+
exports.resetConfiguration = resetConfiguration;
|
|
7178
7430
|
exports.terminateWorkers = terminateWorkers;
|
|
7179
7431
|
|
|
7180
7432
|
}));
|