@zip.js/zip.js 2.11.4 → 2.13.0
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/deno.json +1 -1
- package/dist/zip-core-external.js +549 -139
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +559 -136
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +615 -260
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +628 -257
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +615 -260
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +630 -259
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +631 -260
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +561 -138
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +561 -138
- 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 +562 -139
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +630 -259
- package/index-native.min.js +1 -1
- package/index.cjs +631 -260
- package/index.d.cts +474 -59
- package/index.d.ts +474 -59
- package/index.min.js +1 -1
- package/lib/core/codec-worker-web.js +72 -22
- package/lib/core/codec-worker.js +18 -5
- package/lib/core/configuration.js +20 -5
- package/lib/core/constants.js +2 -0
- package/lib/core/io.js +13 -5
- package/lib/core/options.js +16 -0
- package/lib/core/streams/codec-stream.js +6 -0
- package/lib/core/util/error.js +35 -0
- package/lib/core/util/warnings.js +42 -0
- package/lib/core/version.js +1 -1
- package/lib/core/web-worker-base.js +46 -9
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-entry.js +49 -1
- package/lib/core/zip-fs.js +45 -133
- package/lib/core/zip-reader.js +115 -52
- package/lib/core/zip-writer.js +244 -57
- package/lib/zip-core-base.js +9 -3
- package/lib/zip-core-reader.js +2 -0
- package/lib/zip-core-writer.js +6 -1
- package/lib/zip-module-wasm-base.js +2 -2
- package/package.json +5 -3
- package/worker-message-property-names.js +1 -1
package/dist/zip-fs-native.js
CHANGED
|
@@ -134,6 +134,7 @@
|
|
|
134
134
|
const BOOLEAN_TYPE = "boolean";
|
|
135
135
|
|
|
136
136
|
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
137
|
+
const SYMBOL_ASYNC_DISPOSE = Symbol.asyncDispose || Symbol();
|
|
137
138
|
|
|
138
139
|
/*
|
|
139
140
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -178,6 +179,7 @@
|
|
|
178
179
|
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
179
180
|
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
180
181
|
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
182
|
+
const OPTION_CHECK_LOCAL_FILENAME = "checkLocalFilename";
|
|
181
183
|
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
182
184
|
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
183
185
|
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
@@ -208,15 +210,18 @@
|
|
|
208
210
|
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
209
211
|
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
210
212
|
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
213
|
+
const OPTION_ENTRY = "entry";
|
|
211
214
|
const TEXT_TYPE_FILENAME = "filename";
|
|
212
215
|
const TEXT_TYPE_COMMENT = "comment";
|
|
213
216
|
const STRICTNESS_STRICT = "strict";
|
|
214
217
|
const STRICTNESS_BALANCED = "balanced";
|
|
215
218
|
const STRICTNESS_TOLERANT = "tolerant";
|
|
219
|
+
const PASS_THROUGH_COMPRESSED = "compressed";
|
|
216
220
|
|
|
217
221
|
const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
|
|
218
222
|
const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
|
|
219
223
|
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
224
|
+
const ERR_INVALID_PASS_THROUGH_VALUE = "Invalid passThrough option (must be a boolean or 'compressed')";
|
|
220
225
|
const ERR_ABORTED = "The operation was aborted";
|
|
221
226
|
const ABORT_ERROR_NAME = "AbortError";
|
|
222
227
|
|
|
@@ -246,6 +251,13 @@
|
|
|
246
251
|
}
|
|
247
252
|
}
|
|
248
253
|
|
|
254
|
+
function checkPassThroughOption(passThrough) {
|
|
255
|
+
if (passThrough !== UNDEFINED_VALUE && typeof passThrough != BOOLEAN_TYPE && passThrough !== PASS_THROUGH_COMPRESSED) {
|
|
256
|
+
throw new Error(ERR_INVALID_PASS_THROUGH_VALUE);
|
|
257
|
+
}
|
|
258
|
+
return passThrough;
|
|
259
|
+
}
|
|
260
|
+
|
|
249
261
|
function checkInteger(value, maxValue, errorMessage) {
|
|
250
262
|
if (!Number.isInteger(value) || value < 0 || value > maxValue) {
|
|
251
263
|
throw new Error(errorMessage);
|
|
@@ -295,6 +307,8 @@
|
|
|
295
307
|
const MINIMUM_CHUNK_SIZE = 64;
|
|
296
308
|
const MINIMUM_PROPERTY_VALUE = 1;
|
|
297
309
|
const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
|
|
310
|
+
const ERR_INVALID_BASE_URI = "Invalid baseURI (must be a string)";
|
|
311
|
+
const ERR_INVALID_URI = "Invalid URI (must be a string or a function returning a string)";
|
|
298
312
|
let maxWorkers = 2;
|
|
299
313
|
try {
|
|
300
314
|
if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
|
|
@@ -319,9 +333,9 @@
|
|
|
319
333
|
};
|
|
320
334
|
|
|
321
335
|
const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
|
|
336
|
+
const PROPERTY_NAME_BASE_URI = "baseURI";
|
|
322
337
|
|
|
323
|
-
const
|
|
324
|
-
"baseURI",
|
|
338
|
+
const URI_PROPERTY_NAMES = [
|
|
325
339
|
"wasmURI",
|
|
326
340
|
"workerURI"
|
|
327
341
|
];
|
|
@@ -345,7 +359,8 @@
|
|
|
345
359
|
"DecompressionStreamFallback"
|
|
346
360
|
];
|
|
347
361
|
const CONFIGURABLE_PROPERTY_NAMES = [
|
|
348
|
-
|
|
362
|
+
PROPERTY_NAME_BASE_URI,
|
|
363
|
+
...URI_PROPERTY_NAMES,
|
|
349
364
|
...BOOLEAN_PROPERTY_NAMES,
|
|
350
365
|
...NUMBER_PROPERTY_NAMES,
|
|
351
366
|
...FUNCTION_PROPERTY_NAMES
|
|
@@ -389,6 +404,14 @@
|
|
|
389
404
|
}
|
|
390
405
|
} else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
|
|
391
406
|
checkFunctionOption(propertyValue);
|
|
407
|
+
} else if (propertyName == PROPERTY_NAME_BASE_URI) {
|
|
408
|
+
if (propertyValue && typeof propertyValue != STRING_TYPE) {
|
|
409
|
+
throw new Error(ERR_INVALID_BASE_URI);
|
|
410
|
+
}
|
|
411
|
+
} else if (URI_PROPERTY_NAMES.includes(propertyName)) {
|
|
412
|
+
if (propertyValue && typeof propertyValue != STRING_TYPE && typeof propertyValue != FUNCTION_TYPE) {
|
|
413
|
+
throw new Error(ERR_INVALID_URI);
|
|
414
|
+
}
|
|
392
415
|
}
|
|
393
416
|
return propertyValue;
|
|
394
417
|
}
|
|
@@ -422,7 +445,7 @@
|
|
|
422
445
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
423
446
|
}
|
|
424
447
|
|
|
425
|
-
const o=[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],s=[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],r=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],n=new Uint8Array(288);n.fill(8,0,144),n.fill(9,144,256),n.fill(7,256,280),n.fill(8,280,288);const i=new Uint8Array(30).fill(5);function A(o){const t=new Uint16Array(16);for(const e of o)t[e]++;t[0]=0;const e=new Uint16Array(17);for(let o=1;o<=15;o++)e[o+1]=e[o]+t[o];const s=new Uint16Array(o.length);for(let t=0;t<o.length;t++)o[t]&&(s[e[o[t]]++]=t);return {o:t,symbols:s}}const g$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",c=(O=()=>function(g){let c=0,O=0,B=0,f=new Uint8Array(1024),C=0,u=0;for(;!u;){u=w(1);const o=w(2);if(0==o)m();else if(1==o)d(A(n),A(i));else {if(2!=o)throw new Error("invalid deflate block type");d(...p());}}return f.subarray(0,C);function q(){if(c>=g.length)throw new Error("unexpected end of deflate data");return g[c++]}function w(o){for(;B<o;)O|=q()<<B,B+=8;const t=O&(1<<o)-1;return O>>>=o,B-=o,t}function m(){O=0,B=0;const o=q()|q()<<8;c+=2,z(C+o);for(let t=0;t<o;t++)f[C++]=q();}function d(r,n){let i=F(r);for(;256!=i;){if(i<256)z(C+1),f[C++]=i;else {const r=i-257,A=o[r]+w(t[r]),g=F(n),c=e[g]+w(s[g]);z(C+A);const O=C-c;for(let o=0;o<A;o++)f[C++]=f[O+o];}i=F(r);}}function p(){const o=w(5)+257,t=w(5)+1,e=w(4)+4,s=new Uint8Array(19);for(let o=0;o<e;o++)s[r[o]]=w(3);const n=A(s),i=new Uint8Array(o+t);let g=0;for(;g<i.length;){const o=F(n);if(o<16)i[g++]=o;else if(16==o){const o=i[g-1];let t=w(2)+3;for(;t--;)i[g++]=o;}else g+=17==o?w(3)+3:w(7)+11;}return [A(i.subarray(0,o)),A(i.subarray(o))]}function F(o){const{o:t,symbols:e}=o;let s=0,r=0,n=0;for(let o=1;o<=15;o++){s|=w(1);const i=t[o];if(s-r<i)return e[n+(s-r)];n+=i,r=r+i<<1,s<<=1;}throw new Error("invalid huffman code")}function z(o){if(f.length<o){let t=2*f.length;for(;t<o;)t*=2;const e=new Uint8Array(t);e.set(f.subarray(0,C)),f=e;}}}(function(o){const t=(o=String(o).replace(/[^A-Za-z0-9+/=]/g,"")).length,e=[];for(let s=0;s<t;s+=4){const t=g$1.indexOf(o[s])<<18|g$1.indexOf(o[s+1])<<12|(63&g$1.indexOf(o[s+2]))<<6|63&g$1.indexOf(o[s+3]);e.push(t>>16&255),"="!==o[s+2]&&e.push(t>>8&255),"="!==o[s+3]&&e.push(255&t);}return new Uint8Array(e)}("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")),o=>o({workerURI:o=>{const t="text/javascript";let e=O();if("string"==typeof e&&(e=(new TextEncoder).encode(e)),o){const o=new Blob([e],{type:t});return URL.createObjectURL(o)}return "data:"+t+";base64,"+function(o){let t="";const e=o.length;let s=0;for(;s+2<e;s+=3){const e=o[s]<<16|o[s+1]<<8|o[s+2];t+=g$1[e>>18&63]+g$1[e>>12&63]+g$1[e>>6&63]+g$1[63&e];}const r=e-s;if(1===r){const e=o[s]<<16;t+=g$1[e>>18&63]+g$1[e>>12&63]+"==";}else if(2===r){const e=o[s]<<16|o[s+1]<<8;t+=g$1[e>>18&63]+g$1[e>>12&63]+g$1[e>>6&63]+"=";}return t}(e)}}));var O;
|
|
448
|
+
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],o=[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],r=[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],e=[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],A=new Uint8Array(288);A.fill(8,0,144),A.fill(9,144,256),A.fill(7,256,280),A.fill(8,280,288);const s=new Uint8Array(30).fill(5);function B(t){const o=new Uint16Array(16);for(const r of t)o[r]++;o[0]=0;const r=new Uint16Array(17);for(let t=1;t<=15;t++)r[t+1]=r[t]+o[t];const e=new Uint16Array(t.length);for(let o=0;o<t.length;o++)t[o]&&(e[r[t[o]]++]=o);return {o:o,symbols:e}}const l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i=(z$1=()=>function(l){let i=0,z=0,V=0,w=new Uint8Array(1024),F=0,a=0;for(;!a;){a=d(1);const t=d(2);if(0==t)b();else if(1==t)f(B(A),B(s));else {if(2!=t)throw new Error("invalid deflate block type");f(...N());}}return w.subarray(0,F);function g(){if(i>=l.length)throw new Error("unexpected end of deflate data");return l[i++]}function d(t){for(;V<t;)z|=g()<<V,V+=8;const o=z&(1<<t)-1;return z>>>=t,V-=t,o}function b(){z=0,V=0;const t=g()|g()<<8;i+=2,v(F+t);for(let o=0;o<t;o++)w[F++]=g();}function f(n,A){let s=u(n);for(;256!=s;){if(s<256)v(F+1),w[F++]=s;else {const n=s-257,B=t[n]+d(o[n]),l=u(A),i=r[l]+d(e[l]);v(F+B);const z=F-i;for(let t=0;t<B;t++)w[F++]=w[z+t];}s=u(n);}}function N(){const t=d(5)+257,o=d(5)+1,r=d(4)+4,e=new Uint8Array(19);for(let t=0;t<r;t++)e[n[t]]=d(3);const A=B(e),s=new Uint8Array(t+o);let l=0;for(;l<s.length;){const t=u(A);if(t<16)s[l++]=t;else if(16==t){const t=s[l-1];let o=d(2)+3;for(;o--;)s[l++]=t;}else l+=17==t?d(3)+3:d(7)+11;}return [B(s.subarray(0,t)),B(s.subarray(t))]}function u(t){const{o:o,symbols:r}=t;let e=0,n=0,A=0;for(let t=1;t<=15;t++){e|=d(1);const s=o[t];if(e-n<s)return r[A+(e-n)];A+=s,n=n+s<<1,e<<=1;}throw new Error("invalid huffman code")}function v(t){if(w.length<t){let o=2*w.length;for(;o<t;)o*=2;const r=new Uint8Array(o);r.set(w.subarray(0,F)),w=r;}}}(function(t){const o=(t=String(t).replace(/[^A-Za-z0-9+/=]/g,"")).length,r=[];for(let e=0;e<o;e+=4){const o=l.indexOf(t[e])<<18|l.indexOf(t[e+1])<<12|(63&l.indexOf(t[e+2]))<<6|63&l.indexOf(t[e+3]);r.push(o>>16&255),"="!==t[e+2]&&r.push(o>>8&255),"="!==t[e+3]&&r.push(255&o);}return new Uint8Array(r)}("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")),t=>t({workerURI:t=>{const o="text/javascript";let r=z$1();if("string"==typeof r&&(r=(new TextEncoder).encode(r)),t){const t=new Blob([r],{type:o});return URL.createObjectURL(t)}return "data:"+o+";base64,"+function(t){let o="";const r=t.length;let e=0;for(;e+2<r;e+=3){const r=t[e]<<16|t[e+1]<<8|t[e+2];o+=l[r>>18&63]+l[r>>12&63]+l[r>>6&63]+l[63&r];}const n=r-e;if(1===n){const r=t[e]<<16;o+=l[r>>18&63]+l[r>>12&63]+"==";}else if(2===n){const r=t[e]<<16|t[e+1]<<8;o+=l[r>>18&63]+l[r>>12&63]+l[r>>6&63]+"=";}return o}(r)}}));var z$1;
|
|
426
449
|
|
|
427
450
|
/*
|
|
428
451
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -468,6 +491,39 @@
|
|
|
468
491
|
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
469
492
|
}
|
|
470
493
|
|
|
494
|
+
/*
|
|
495
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
496
|
+
|
|
497
|
+
Redistribution and use in source and binary forms, with or without
|
|
498
|
+
modification, are permitted provided that the following conditions are met:
|
|
499
|
+
|
|
500
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
501
|
+
this list of conditions and the following disclaimer.
|
|
502
|
+
|
|
503
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
504
|
+
notice, this list of conditions and the following disclaimer in
|
|
505
|
+
the documentation and/or other materials provided with the distribution.
|
|
506
|
+
|
|
507
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
508
|
+
derived from this software without specific prior written permission.
|
|
509
|
+
|
|
510
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
511
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
512
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
513
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
514
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
515
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
516
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
517
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
518
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
519
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
520
|
+
*/
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
function isErrorObject(error) {
|
|
524
|
+
return Boolean(error) && typeof error == "object";
|
|
525
|
+
}
|
|
526
|
+
|
|
471
527
|
/*
|
|
472
528
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
473
529
|
|
|
@@ -2607,6 +2663,7 @@
|
|
|
2607
2663
|
constructor(chunkSize) {
|
|
2608
2664
|
const pendingChunks = [];
|
|
2609
2665
|
let pendingLength = 0;
|
|
2666
|
+
let outputSize = 0;
|
|
2610
2667
|
if (!Number.isFinite(chunkSize) || chunkSize < 1) {
|
|
2611
2668
|
chunkSize = DEFAULT_CHUNK_SIZE;
|
|
2612
2669
|
}
|
|
@@ -2615,15 +2672,20 @@
|
|
|
2615
2672
|
pendingChunks.push(chunk);
|
|
2616
2673
|
pendingLength += chunk.length;
|
|
2617
2674
|
while (pendingLength > chunkSize) {
|
|
2675
|
+
outputSize += chunkSize;
|
|
2618
2676
|
controller.enqueue(shiftChunk());
|
|
2619
2677
|
}
|
|
2620
2678
|
},
|
|
2621
2679
|
flush(controller) {
|
|
2622
2680
|
if (pendingLength) {
|
|
2681
|
+
outputSize += pendingLength;
|
|
2623
2682
|
controller.enqueue(concatChunks(pendingChunks, pendingLength));
|
|
2624
2683
|
}
|
|
2625
2684
|
}
|
|
2626
2685
|
});
|
|
2686
|
+
Object.defineProperty(this, "outputSize", {
|
|
2687
|
+
get: () => outputSize
|
|
2688
|
+
});
|
|
2627
2689
|
|
|
2628
2690
|
function shiftChunk() {
|
|
2629
2691
|
const result = new Uint8Array(chunkSize);
|
|
@@ -2729,7 +2791,9 @@
|
|
|
2729
2791
|
|
|
2730
2792
|
class CodecWorker {
|
|
2731
2793
|
|
|
2732
|
-
constructor(workerData, { readable, writable },
|
|
2794
|
+
constructor(workerData, { readable, writable }, workerOptions, onTaskFinished) {
|
|
2795
|
+
const { options, config, streamOptions, useWebWorkers, transferStreams, workerURI } = workerOptions;
|
|
2796
|
+
let { createWorker } = workerOptions;
|
|
2733
2797
|
const { signal } = streamOptions;
|
|
2734
2798
|
if (createWorkerFailed) {
|
|
2735
2799
|
createWorker = UNDEFINED_VALUE;
|
|
@@ -2742,6 +2806,7 @@
|
|
|
2742
2806
|
.pipeThrough(new ProgressWatcherStream(streamOptions), { signal }),
|
|
2743
2807
|
writable,
|
|
2744
2808
|
options: Object.assign({}, options),
|
|
2809
|
+
workerOptions,
|
|
2745
2810
|
workerURI,
|
|
2746
2811
|
createWorker,
|
|
2747
2812
|
transferStreams,
|
|
@@ -2823,8 +2888,8 @@
|
|
|
2823
2888
|
};
|
|
2824
2889
|
}
|
|
2825
2890
|
|
|
2826
|
-
async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
|
|
2827
|
-
let codecStream;
|
|
2891
|
+
async function runWorker$1({ options, readable, writable, onTaskFinished, workerOptions }, config) {
|
|
2892
|
+
let codecStream, chunkStream;
|
|
2828
2893
|
try {
|
|
2829
2894
|
if (options.compressed && !options.format) {
|
|
2830
2895
|
const deflate = options.codecType.startsWith(CODEC_DEFLATE);
|
|
@@ -2847,9 +2912,10 @@
|
|
|
2847
2912
|
}
|
|
2848
2913
|
}
|
|
2849
2914
|
codecStream = new CodecStream(options, config);
|
|
2915
|
+
chunkStream = new ChunkStream(getChunkSize(config));
|
|
2850
2916
|
await readable
|
|
2851
2917
|
.pipeThrough(codecStream)
|
|
2852
|
-
.pipeThrough(
|
|
2918
|
+
.pipeThrough(chunkStream)
|
|
2853
2919
|
.pipeTo(writable, { preventClose: true, preventAbort: true });
|
|
2854
2920
|
const {
|
|
2855
2921
|
crc32,
|
|
@@ -2863,7 +2929,15 @@
|
|
|
2863
2929
|
};
|
|
2864
2930
|
} catch (error) {
|
|
2865
2931
|
if (codecStream) {
|
|
2866
|
-
|
|
2932
|
+
const outputSize = chunkStream ? chunkStream.outputSize : 0;
|
|
2933
|
+
workerOptions.outputSize = outputSize;
|
|
2934
|
+
if (isErrorObject(error)) {
|
|
2935
|
+
try {
|
|
2936
|
+
error.outputSize = outputSize;
|
|
2937
|
+
} catch {
|
|
2938
|
+
// ignored
|
|
2939
|
+
}
|
|
2940
|
+
}
|
|
2867
2941
|
}
|
|
2868
2942
|
throw error;
|
|
2869
2943
|
} finally {
|
|
@@ -2972,11 +3046,23 @@
|
|
|
2972
3046
|
let resolveResult, rejectResult;
|
|
2973
3047
|
const result = new Promise((resolve, reject) => {
|
|
2974
3048
|
resolveResult = resolve;
|
|
2975
|
-
rejectResult =
|
|
3049
|
+
rejectResult = error => {
|
|
3050
|
+
const { outputSize, workerOptions } = workerData;
|
|
3051
|
+
workerOptions.outputSize = outputSize;
|
|
3052
|
+
if (isErrorObject(error) && error.outputSize === UNDEFINED_VALUE) {
|
|
3053
|
+
try {
|
|
3054
|
+
error.outputSize = outputSize;
|
|
3055
|
+
} catch {
|
|
3056
|
+
// ignored
|
|
3057
|
+
}
|
|
3058
|
+
}
|
|
3059
|
+
reject(error);
|
|
3060
|
+
};
|
|
2976
3061
|
});
|
|
2977
3062
|
Object.assign(workerData, {
|
|
2978
3063
|
reader: null,
|
|
2979
3064
|
writer: null,
|
|
3065
|
+
outputSize: 0,
|
|
2980
3066
|
resolveResult,
|
|
2981
3067
|
rejectResult,
|
|
2982
3068
|
result
|
|
@@ -3237,21 +3323,15 @@
|
|
|
3237
3323
|
}
|
|
3238
3324
|
|
|
3239
3325
|
async function onMessage({ data }, workerData) {
|
|
3240
|
-
const { type, value, messageId, result, error } = data;
|
|
3326
|
+
const { type, value, messageId, result, error, errorValue } = data;
|
|
3241
3327
|
const { reader, writer, resolveResult, rejectResult, onTaskFinished, generation } = workerData;
|
|
3242
3328
|
const stale = () => workerData.generation != generation;
|
|
3243
3329
|
try {
|
|
3244
3330
|
if (error) {
|
|
3245
|
-
|
|
3246
|
-
|
|
3247
|
-
Object.assign(responseError, { stack, code, name, outputSize });
|
|
3248
|
-
if (cause) {
|
|
3249
|
-
responseError.cause = Object.assign(new Error(cause.message), { name: cause.name });
|
|
3250
|
-
}
|
|
3251
|
-
if (codecImportFailed) {
|
|
3252
|
-
responseError.codecImportFailed = true;
|
|
3331
|
+
if (error.outputSize !== UNDEFINED_VALUE) {
|
|
3332
|
+
workerData.outputSize = error.outputSize;
|
|
3253
3333
|
}
|
|
3254
|
-
|
|
3334
|
+
fail(getResponseError(error, errorValue));
|
|
3255
3335
|
} else {
|
|
3256
3336
|
if (type == MESSAGE_PULL) {
|
|
3257
3337
|
const { value, done } = await reader.read();
|
|
@@ -3260,39 +3340,82 @@
|
|
|
3260
3340
|
}
|
|
3261
3341
|
}
|
|
3262
3342
|
if (type == MESSAGE_DATA) {
|
|
3343
|
+
const chunk = new Uint8Array(value);
|
|
3263
3344
|
await writer.ready;
|
|
3264
|
-
await writer.write(
|
|
3345
|
+
await writer.write(chunk);
|
|
3346
|
+
workerData.outputSize += chunk.length;
|
|
3265
3347
|
if (!stale()) {
|
|
3266
3348
|
sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
|
|
3267
3349
|
}
|
|
3268
3350
|
}
|
|
3269
3351
|
if (type == MESSAGE_CLOSE) {
|
|
3270
|
-
|
|
3352
|
+
succeed(result);
|
|
3271
3353
|
}
|
|
3272
3354
|
}
|
|
3273
3355
|
} catch (error) {
|
|
3274
3356
|
if (!stale()) {
|
|
3275
3357
|
terminateWorker$1(workerData);
|
|
3276
|
-
|
|
3358
|
+
fail(error);
|
|
3277
3359
|
}
|
|
3278
3360
|
}
|
|
3279
3361
|
|
|
3280
|
-
function
|
|
3281
|
-
if (stale()) {
|
|
3282
|
-
return;
|
|
3283
|
-
}
|
|
3284
|
-
if (error) {
|
|
3362
|
+
function fail(error) {
|
|
3363
|
+
if (!stale()) {
|
|
3285
3364
|
rejectResult(error);
|
|
3286
|
-
|
|
3365
|
+
releaseWriter();
|
|
3366
|
+
if (!(isErrorObject(error) && error.codecImportFailed)) {
|
|
3367
|
+
onTaskFinished();
|
|
3368
|
+
}
|
|
3369
|
+
}
|
|
3370
|
+
}
|
|
3371
|
+
|
|
3372
|
+
function succeed(result) {
|
|
3373
|
+
if (!stale()) {
|
|
3287
3374
|
resolveResult(result);
|
|
3375
|
+
releaseWriter();
|
|
3376
|
+
onTaskFinished();
|
|
3288
3377
|
}
|
|
3378
|
+
}
|
|
3379
|
+
|
|
3380
|
+
function releaseWriter() {
|
|
3289
3381
|
if (writer) {
|
|
3290
3382
|
writer.releaseLock();
|
|
3291
3383
|
}
|
|
3292
|
-
|
|
3293
|
-
|
|
3384
|
+
}
|
|
3385
|
+
}
|
|
3386
|
+
|
|
3387
|
+
function getResponseError(errorData, errorValue) {
|
|
3388
|
+
const { message, stack, code, name, outputSize, cause, codecImportFailed } = errorData;
|
|
3389
|
+
let responseError;
|
|
3390
|
+
if (errorValue) {
|
|
3391
|
+
responseError = errorValue.value;
|
|
3392
|
+
} else {
|
|
3393
|
+
responseError = Object.assign(new Error(message), { stack, code, name });
|
|
3394
|
+
if (cause) {
|
|
3395
|
+
responseError.cause = Object.assign(new Error(cause.message), { name: cause.name });
|
|
3294
3396
|
}
|
|
3295
3397
|
}
|
|
3398
|
+
if (isErrorObject(responseError)) {
|
|
3399
|
+
try {
|
|
3400
|
+
if (outputSize !== UNDEFINED_VALUE) {
|
|
3401
|
+
responseError.outputSize = outputSize;
|
|
3402
|
+
}
|
|
3403
|
+
if (codecImportFailed) {
|
|
3404
|
+
responseError.codecImportFailed = true;
|
|
3405
|
+
}
|
|
3406
|
+
if (errorValue) {
|
|
3407
|
+
if (responseError.name !== name) {
|
|
3408
|
+
responseError.name = name;
|
|
3409
|
+
}
|
|
3410
|
+
if (responseError.code !== code) {
|
|
3411
|
+
responseError.code = code;
|
|
3412
|
+
}
|
|
3413
|
+
}
|
|
3414
|
+
} catch {
|
|
3415
|
+
// ignored
|
|
3416
|
+
}
|
|
3417
|
+
}
|
|
3418
|
+
return responseError;
|
|
3296
3419
|
}
|
|
3297
3420
|
|
|
3298
3421
|
/*
|
|
@@ -3569,10 +3692,13 @@
|
|
|
3569
3692
|
|
|
3570
3693
|
|
|
3571
3694
|
const ERR_HTTP_STATUS = "HTTP error ";
|
|
3695
|
+
const MIN_SUCCESS_HTTP_STATUS = 200;
|
|
3696
|
+
const MAX_SUCCESS_HTTP_STATUS = 299;
|
|
3572
3697
|
const ERR_HTTP_RANGE = "HTTP Range not supported";
|
|
3573
3698
|
const ERR_HTTP_RESOURCE_CHANGED = "HTTP resource changed";
|
|
3574
3699
|
const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
|
|
3575
3700
|
const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
|
|
3701
|
+
const ERR_WRITER_SIZE_NOT_WRITABLE = "Invalid writer (size must be writable)";
|
|
3576
3702
|
|
|
3577
3703
|
const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
|
|
3578
3704
|
const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
|
|
@@ -3764,6 +3890,7 @@
|
|
|
3764
3890
|
const reader = this;
|
|
3765
3891
|
const { sourceBlob, size } = reader;
|
|
3766
3892
|
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
3893
|
+
// deno-lint-ignore valid-typeof
|
|
3767
3894
|
if (typeof sourceBlob.stream == FUNCTION_TYPE) {
|
|
3768
3895
|
if (!offset && readSize >= size) {
|
|
3769
3896
|
return toCompatibleReadable(sourceBlob.stream());
|
|
@@ -4170,7 +4297,7 @@
|
|
|
4170
4297
|
|
|
4171
4298
|
async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
|
|
4172
4299
|
const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
|
|
4173
|
-
if (response.status
|
|
4300
|
+
if (response.status >= MIN_SUCCESS_HTTP_STATUS && response.status <= MAX_SUCCESS_HTTP_STATUS) {
|
|
4174
4301
|
return response;
|
|
4175
4302
|
} else {
|
|
4176
4303
|
throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
|
|
@@ -4181,7 +4308,7 @@
|
|
|
4181
4308
|
return new Promise((resolve, reject) => {
|
|
4182
4309
|
const request = new XMLHttpRequest();
|
|
4183
4310
|
request.addEventListener("load", () => {
|
|
4184
|
-
if (request.status
|
|
4311
|
+
if (request.status >= MIN_SUCCESS_HTTP_STATUS && request.status <= MAX_SUCCESS_HTTP_STATUS) {
|
|
4185
4312
|
const headers = [];
|
|
4186
4313
|
request.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach(header => {
|
|
4187
4314
|
const splitHeader = header.trim().split(/\s*:\s*/);
|
|
@@ -4485,8 +4612,10 @@
|
|
|
4485
4612
|
writable: toCompatibleWritable(writer)
|
|
4486
4613
|
};
|
|
4487
4614
|
}
|
|
4488
|
-
|
|
4489
|
-
writer.size = 0;
|
|
4615
|
+
try {
|
|
4616
|
+
writer.size = writer.size === UNDEFINED_VALUE ? 0 : writer.size;
|
|
4617
|
+
} catch {
|
|
4618
|
+
throw new Error(ERR_WRITER_SIZE_NOT_WRITABLE);
|
|
4490
4619
|
}
|
|
4491
4620
|
return writer;
|
|
4492
4621
|
}
|
|
@@ -4534,6 +4663,45 @@
|
|
|
4534
4663
|
}
|
|
4535
4664
|
}
|
|
4536
4665
|
|
|
4666
|
+
/*
|
|
4667
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
4668
|
+
|
|
4669
|
+
Redistribution and use in source and binary forms, with or without
|
|
4670
|
+
modification, are permitted provided that the following conditions are met:
|
|
4671
|
+
|
|
4672
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
4673
|
+
this list of conditions and the following disclaimer.
|
|
4674
|
+
|
|
4675
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
4676
|
+
notice, this list of conditions and the following disclaimer in
|
|
4677
|
+
the documentation and/or other materials provided with the distribution.
|
|
4678
|
+
|
|
4679
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
4680
|
+
derived from this software without specific prior written permission.
|
|
4681
|
+
|
|
4682
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4683
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4684
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4685
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4686
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4687
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4688
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4689
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4690
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4691
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4692
|
+
*/
|
|
4693
|
+
|
|
4694
|
+
|
|
4695
|
+
function addWarning(warnings, reason, filename) {
|
|
4696
|
+
if (!warnings.some(warning => warning.reason == reason)) {
|
|
4697
|
+
const warning = { reason };
|
|
4698
|
+
if (filename !== UNDEFINED_VALUE) {
|
|
4699
|
+
warning.filename = filename;
|
|
4700
|
+
}
|
|
4701
|
+
warnings.push(warning);
|
|
4702
|
+
}
|
|
4703
|
+
}
|
|
4704
|
+
|
|
4537
4705
|
/*
|
|
4538
4706
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4539
4707
|
|
|
@@ -4562,6 +4730,7 @@
|
|
|
4562
4730
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4563
4731
|
*/
|
|
4564
4732
|
|
|
4733
|
+
|
|
4565
4734
|
const PROPERTY_NAME_FILENAME = "filename";
|
|
4566
4735
|
const PROPERTY_NAME_RAW_FILENAME = "rawFilename";
|
|
4567
4736
|
const PROPERTY_NAME_COMMENT = "comment";
|
|
@@ -4686,6 +4855,38 @@
|
|
|
4686
4855
|
|
|
4687
4856
|
}
|
|
4688
4857
|
|
|
4858
|
+
const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
|
|
4859
|
+
EXTRAFIELD_TYPE_ZIP64,
|
|
4860
|
+
EXTRAFIELD_TYPE_AES,
|
|
4861
|
+
EXTRAFIELD_TYPE_NTFS,
|
|
4862
|
+
EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
|
|
4863
|
+
EXTRAFIELD_TYPE_UNICODE_PATH,
|
|
4864
|
+
EXTRAFIELD_TYPE_UNICODE_COMMENT,
|
|
4865
|
+
EXTRAFIELD_TYPE_USDZ,
|
|
4866
|
+
EXTRAFIELD_TYPE_INFOZIP,
|
|
4867
|
+
EXTRAFIELD_TYPE_UNIX,
|
|
4868
|
+
EXTRAFIELD_TYPE_UNIX_TYPE1,
|
|
4869
|
+
EXTRAFIELD_TYPE_PKWARE_UNIX
|
|
4870
|
+
]);
|
|
4871
|
+
|
|
4872
|
+
function getUserExtraField(extraField) {
|
|
4873
|
+
if (extraField) {
|
|
4874
|
+
const userExtraField = new Map();
|
|
4875
|
+
extraField.forEach((field, type) => {
|
|
4876
|
+
if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
|
|
4877
|
+
userExtraField.set(type, field.data);
|
|
4878
|
+
}
|
|
4879
|
+
});
|
|
4880
|
+
if (userExtraField.size) {
|
|
4881
|
+
return userExtraField;
|
|
4882
|
+
}
|
|
4883
|
+
}
|
|
4884
|
+
}
|
|
4885
|
+
|
|
4886
|
+
function getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength) {
|
|
4887
|
+
return encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
4888
|
+
}
|
|
4889
|
+
|
|
4689
4890
|
/*
|
|
4690
4891
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4691
4892
|
|
|
@@ -4745,6 +4946,8 @@
|
|
|
4745
4946
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4746
4947
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4747
4948
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4949
|
+
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
4950
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = "mismatched local file header (filename)";
|
|
4748
4951
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
|
|
4749
4952
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
|
|
4750
4953
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
|
|
@@ -4815,7 +5018,7 @@
|
|
|
4815
5018
|
}
|
|
4816
5019
|
}
|
|
4817
5020
|
if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
|
|
4818
|
-
throwAmbiguousArchive(
|
|
5021
|
+
throwAmbiguousArchive(WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY);
|
|
4819
5022
|
}
|
|
4820
5023
|
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
4821
5024
|
let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
|
|
@@ -5113,7 +5316,8 @@
|
|
|
5113
5316
|
const writer = new TransformStream();
|
|
5114
5317
|
const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
|
|
5115
5318
|
arrayBufferPromise.catch(() => { });
|
|
5116
|
-
await fileEntry.getData(writer, entry, zipReader.readRanges,
|
|
5319
|
+
await fileEntry.getData(writer, entry, zipReader.readRanges,
|
|
5320
|
+
Object.assign({}, options, { preventClose: false }));
|
|
5117
5321
|
return arrayBufferPromise;
|
|
5118
5322
|
};
|
|
5119
5323
|
offset = endOffset;
|
|
@@ -5194,49 +5398,101 @@
|
|
|
5194
5398
|
await reader.readable.cancel();
|
|
5195
5399
|
}
|
|
5196
5400
|
}
|
|
5401
|
+
|
|
5402
|
+
[SYMBOL_ASYNC_DISPOSE]() {
|
|
5403
|
+
return this.close();
|
|
5404
|
+
}
|
|
5197
5405
|
}
|
|
5198
5406
|
|
|
5199
5407
|
class ZipReaderStream {
|
|
5200
5408
|
|
|
5201
5409
|
constructor(options = {}) {
|
|
5202
|
-
|
|
5203
|
-
const
|
|
5410
|
+
let sourceController;
|
|
5411
|
+
const { readable, writable } = new TransformStream({
|
|
5412
|
+
start(controller) {
|
|
5413
|
+
sourceController = controller;
|
|
5414
|
+
}
|
|
5415
|
+
});
|
|
5416
|
+
const zipReader = new ZipReader(readable, options);
|
|
5417
|
+
const gen = zipReader.getEntriesGenerator();
|
|
5418
|
+
const pendingEntries = new Set();
|
|
5204
5419
|
this.readable = new ReadableStream({
|
|
5205
5420
|
async pull(controller) {
|
|
5206
5421
|
const { done, value } = await gen.next();
|
|
5207
5422
|
if (done)
|
|
5208
5423
|
return controller.close();
|
|
5209
|
-
const
|
|
5210
|
-
const { readable, writable } = new TransformStream();
|
|
5211
|
-
if (value.getData) {
|
|
5212
|
-
getData();
|
|
5213
|
-
return readable;
|
|
5214
|
-
}
|
|
5215
|
-
|
|
5216
|
-
async function getData() {
|
|
5217
|
-
try {
|
|
5218
|
-
await value.getData(writable);
|
|
5219
|
-
} catch (error) {
|
|
5220
|
-
try {
|
|
5221
|
-
await writable.abort(error);
|
|
5222
|
-
} catch {
|
|
5223
|
-
// ignored
|
|
5224
|
-
}
|
|
5225
|
-
}
|
|
5226
|
-
}
|
|
5227
|
-
})();
|
|
5424
|
+
const entryStream = createEntryStream(value, pendingEntries);
|
|
5228
5425
|
const chunk = {
|
|
5229
5426
|
...value,
|
|
5230
|
-
readable:
|
|
5427
|
+
readable: entryStream.readable
|
|
5231
5428
|
};
|
|
5232
5429
|
delete chunk.getData;
|
|
5430
|
+
Object.defineProperties(chunk, {
|
|
5431
|
+
localDirectory: {
|
|
5432
|
+
get: () => value.localDirectory,
|
|
5433
|
+
enumerable: true
|
|
5434
|
+
},
|
|
5435
|
+
warnings: {
|
|
5436
|
+
get: () => value.warnings,
|
|
5437
|
+
enumerable: true
|
|
5438
|
+
}
|
|
5439
|
+
});
|
|
5233
5440
|
controller.enqueue(chunk);
|
|
5441
|
+
},
|
|
5442
|
+
async cancel(reason) {
|
|
5443
|
+
const entryStreams = Array.from(pendingEntries);
|
|
5444
|
+
pendingEntries.clear();
|
|
5445
|
+
sourceController.error(reason);
|
|
5446
|
+
await Promise.allSettled(entryStreams.map(entryStream => entryStream.cancel(reason)));
|
|
5447
|
+
await Promise.allSettled([gen.return(), zipReader.close()]);
|
|
5234
5448
|
}
|
|
5235
5449
|
});
|
|
5236
5450
|
this.writable = writable;
|
|
5237
5451
|
}
|
|
5238
5452
|
}
|
|
5239
5453
|
|
|
5454
|
+
function createEntryStream(entry, pendingEntries) {
|
|
5455
|
+
const { readable, writable } = new TransformStream();
|
|
5456
|
+
let dataReader;
|
|
5457
|
+
const entryStream = {
|
|
5458
|
+
cancel: async reason => {
|
|
5459
|
+
pendingEntries.delete(entryStream);
|
|
5460
|
+
await (dataReader ? dataReader.cancel(reason) : readable.cancel(reason));
|
|
5461
|
+
}
|
|
5462
|
+
};
|
|
5463
|
+
entryStream.readable = new ReadableStream({
|
|
5464
|
+
async pull(controller) {
|
|
5465
|
+
if (!dataReader) {
|
|
5466
|
+
dataReader = readable.getReader();
|
|
5467
|
+
pendingEntries.add(entryStream);
|
|
5468
|
+
getData();
|
|
5469
|
+
}
|
|
5470
|
+
const { done, value } = await dataReader.read();
|
|
5471
|
+
if (done) {
|
|
5472
|
+
controller.close();
|
|
5473
|
+
} else {
|
|
5474
|
+
controller.enqueue(value);
|
|
5475
|
+
}
|
|
5476
|
+
},
|
|
5477
|
+
cancel: reason => entryStream.cancel(reason)
|
|
5478
|
+
}, { highWaterMark: 0 });
|
|
5479
|
+
return entryStream;
|
|
5480
|
+
|
|
5481
|
+
async function getData() {
|
|
5482
|
+
try {
|
|
5483
|
+
await entry.getData(writable, { preventClose: false });
|
|
5484
|
+
} catch (error) {
|
|
5485
|
+
try {
|
|
5486
|
+
await writable.abort(error);
|
|
5487
|
+
} catch {
|
|
5488
|
+
// ignored
|
|
5489
|
+
}
|
|
5490
|
+
} finally {
|
|
5491
|
+
pendingEntries.delete(entryStream);
|
|
5492
|
+
}
|
|
5493
|
+
}
|
|
5494
|
+
}
|
|
5495
|
+
|
|
5240
5496
|
async function isZipFile(reader, options = {}) {
|
|
5241
5497
|
reader = new GenericReader(reader);
|
|
5242
5498
|
await initStream(reader);
|
|
@@ -5296,7 +5552,9 @@
|
|
|
5296
5552
|
const dataView = getDataView(dataArray);
|
|
5297
5553
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
5298
5554
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
5299
|
-
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
5555
|
+
const passThrough = checkPassThroughOption(getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH));
|
|
5556
|
+
const passThroughCompression = Boolean(passThrough);
|
|
5557
|
+
const passThroughEncryption = passThrough === true;
|
|
5300
5558
|
checkPasswordOption(password, rawPassword);
|
|
5301
5559
|
password = password && password.length && password;
|
|
5302
5560
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
@@ -5317,7 +5575,9 @@
|
|
|
5317
5575
|
const checkLocalDirectoryOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_DIRECTORY);
|
|
5318
5576
|
const entryStrictness = getStrictness(options, zipEntry.options);
|
|
5319
5577
|
const checkLocalDirectory = getCheckLocalDirectory(checkLocalDirectoryOption, entryStrictness);
|
|
5320
|
-
const
|
|
5578
|
+
const checkLocalFilenameOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_FILENAME);
|
|
5579
|
+
const checkLocalFilename = getCheckLocalFilename(
|
|
5580
|
+
checkLocalFilenameOption === UNDEFINED_VALUE ? checkLocalDirectoryOption : checkLocalFilenameOption, entryStrictness);
|
|
5321
5581
|
let rawLocalFilename = EMPTY_UINT8_ARRAY;
|
|
5322
5582
|
if (checkLocalFilename && (filenameLength || extraFieldLength)) {
|
|
5323
5583
|
const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
|
|
@@ -5348,16 +5608,17 @@
|
|
|
5348
5608
|
if (gid !== UNDEFINED_VALUE && fileEntry.gid === UNDEFINED_VALUE) {
|
|
5349
5609
|
fileEntry.gid = gid;
|
|
5350
5610
|
}
|
|
5351
|
-
const
|
|
5611
|
+
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5612
|
+
const encrypted = zipEntry.encrypted && localDirectory.encrypted && (!passThroughEncryption || checkPasswordOnly);
|
|
5352
5613
|
const zipCrypto = encrypted && !extraFieldAES;
|
|
5353
|
-
if (!
|
|
5614
|
+
if (!passThroughEncryption) {
|
|
5354
5615
|
fileEntry.zipCrypto = zipCrypto;
|
|
5355
5616
|
}
|
|
5356
5617
|
if (encrypted && (localDirectory.rawBitFlag & BITFLAG_STRONG_ENCRYPTION) == BITFLAG_STRONG_ENCRYPTION) {
|
|
5357
5618
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
|
|
5358
5619
|
}
|
|
5359
|
-
const registeredCodec =
|
|
5360
|
-
if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !
|
|
5620
|
+
const registeredCodec = passThroughCompression ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
5621
|
+
if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThroughCompression) {
|
|
5361
5622
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
5362
5623
|
}
|
|
5363
5624
|
if (encrypted) {
|
|
@@ -5374,15 +5635,16 @@
|
|
|
5374
5635
|
const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
|
|
5375
5636
|
const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
|
|
5376
5637
|
throwIfAborted(signal);
|
|
5377
|
-
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5378
5638
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
5379
5639
|
const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
|
|
5380
5640
|
if (checkOverlappingEntryOnly) {
|
|
5381
5641
|
checkOverlappingEntry = true;
|
|
5382
5642
|
}
|
|
5383
5643
|
const { onstart, onprogress, onend } = options;
|
|
5384
|
-
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !
|
|
5385
|
-
const outputSize =
|
|
5644
|
+
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThroughCompression;
|
|
5645
|
+
const outputSize = passThroughCompression ?
|
|
5646
|
+
compressedSize - getEncryptionOverhead(encrypted, zipCrypto, extraFieldAES && extraFieldAES.strength) :
|
|
5647
|
+
uncompressedSize;
|
|
5386
5648
|
const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
|
|
5387
5649
|
let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
|
|
5388
5650
|
if (deflate64) {
|
|
@@ -5391,7 +5653,7 @@
|
|
|
5391
5653
|
const checkCrc32Option = getOptionValue$1(zipEntry, options, OPTION_CHECK_CRC32);
|
|
5392
5654
|
const checkCrc32 = (checkCrc32Option === UNDEFINED_VALUE ?
|
|
5393
5655
|
getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) :
|
|
5394
|
-
checkCrc32Option) && !
|
|
5656
|
+
checkCrc32Option) && !passThroughCompression &&
|
|
5395
5657
|
(!encrypted || zipCrypto || (extraFieldAES && extraFieldAES.vendorVersion == VENDOR_VERSION_AE_1$1));
|
|
5396
5658
|
const workerOptions = {
|
|
5397
5659
|
options: {
|
|
@@ -5435,7 +5697,7 @@
|
|
|
5435
5697
|
readRanges
|
|
5436
5698
|
});
|
|
5437
5699
|
}
|
|
5438
|
-
let writable, abortError;
|
|
5700
|
+
let writable, abortError, aborted;
|
|
5439
5701
|
try {
|
|
5440
5702
|
if (!checkOverlappingEntryOnly) {
|
|
5441
5703
|
if (checkPasswordOnly) {
|
|
@@ -5445,24 +5707,28 @@
|
|
|
5445
5707
|
await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
|
|
5446
5708
|
({ writable } = writer);
|
|
5447
5709
|
const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5448
|
-
writer.size += writtenSize;
|
|
5449
5710
|
if (writtenSize != outputSize) {
|
|
5450
|
-
throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
5711
|
+
throw Object.assign(new Error(ERR_INVALID_UNCOMPRESSED_SIZE), { outputSize: writtenSize });
|
|
5451
5712
|
}
|
|
5713
|
+
writer.size += writtenSize;
|
|
5452
5714
|
}
|
|
5453
5715
|
} catch (error) {
|
|
5454
|
-
|
|
5716
|
+
const { outputSize: failedOutputSize } = workerOptions;
|
|
5717
|
+
if (failedOutputSize !== UNDEFINED_VALUE) {
|
|
5718
|
+
writer.size += failedOutputSize;
|
|
5719
|
+
} else if (isErrorObject(error) && error.outputSize !== UNDEFINED_VALUE) {
|
|
5455
5720
|
writer.size += error.outputSize;
|
|
5456
5721
|
}
|
|
5457
|
-
if (!checkPasswordOnly || error.message != ERR_ABORT_CHECK_PASSWORD) {
|
|
5722
|
+
if (!checkPasswordOnly || !isErrorObject(error) || error.message != ERR_ABORT_CHECK_PASSWORD) {
|
|
5458
5723
|
abortError = error;
|
|
5724
|
+
aborted = true;
|
|
5459
5725
|
throw error;
|
|
5460
5726
|
}
|
|
5461
5727
|
} finally {
|
|
5462
5728
|
const preventClose = !ownsWritable(writer) && getOptionValue$1(zipEntry, options, OPTION_PREVENT_CLOSE);
|
|
5463
5729
|
if (!preventClose && writable && !writable.locked) {
|
|
5464
5730
|
const writableWriter = writable.getWriter();
|
|
5465
|
-
if (
|
|
5731
|
+
if (aborted) {
|
|
5466
5732
|
try {
|
|
5467
5733
|
await writableWriter.abort(abortError);
|
|
5468
5734
|
} catch {
|
|
@@ -6114,7 +6380,7 @@
|
|
|
6114
6380
|
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
6115
6381
|
(rawLocalFilename.length != rawFilename.length ||
|
|
6116
6382
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
6117
|
-
reportAmbiguity(reject, warnings,
|
|
6383
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME);
|
|
6118
6384
|
}
|
|
6119
6385
|
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
6120
6386
|
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
|
|
@@ -6139,16 +6405,6 @@
|
|
|
6139
6405
|
}
|
|
6140
6406
|
}
|
|
6141
6407
|
|
|
6142
|
-
function addWarning(warnings, reason, filename) {
|
|
6143
|
-
if (!warnings.some(warning => warning.reason == reason)) {
|
|
6144
|
-
const warning = { reason };
|
|
6145
|
-
if (filename !== UNDEFINED_VALUE) {
|
|
6146
|
-
warning.filename = filename;
|
|
6147
|
-
}
|
|
6148
|
-
warnings.push(warning);
|
|
6149
|
-
}
|
|
6150
|
-
}
|
|
6151
|
-
|
|
6152
6408
|
function throwAmbiguousArchive(reason) {
|
|
6153
6409
|
const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
|
|
6154
6410
|
error.reason = reason;
|
|
@@ -6228,7 +6484,9 @@
|
|
|
6228
6484
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6229
6485
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6230
6486
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6487
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6231
6488
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6489
|
+
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6232
6490
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6233
6491
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
6234
6492
|
WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
|
|
@@ -6281,7 +6539,7 @@
|
|
|
6281
6539
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
6282
6540
|
const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
|
|
6283
6541
|
const ERR_UNSUPPORTED_SPLIT_USDZ = "Split zip files are not supported in USDZ files";
|
|
6284
|
-
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
|
|
6542
|
+
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set to true (use 'compressed' instead)";
|
|
6285
6543
|
const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
|
|
6286
6544
|
const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
|
|
6287
6545
|
const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
|
|
@@ -6293,6 +6551,7 @@
|
|
|
6293
6551
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
6294
6552
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
6295
6553
|
const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
|
|
6554
|
+
const ERR_UNDEFINED_CRC32 = "Undefined CRC32";
|
|
6296
6555
|
const ERR_UNDETERMINED_SIZE = "Undetermined size";
|
|
6297
6556
|
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
6298
6557
|
const ERR_INVALID_READER = "Invalid reader (must be a Reader instance, a ReadableStream instance, or an object with a 'readable' property)";
|
|
@@ -6306,14 +6565,21 @@
|
|
|
6306
6565
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
6307
6566
|
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
6308
6567
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
6568
|
+
const ERR_INVALID_ENTRY = "Invalid entry option (must be an entry returned by ZipReader#getEntries())";
|
|
6569
|
+
const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
|
|
6570
|
+
const WARNING_COMPRESSION_UNAVAILABLE = "compression unavailable";
|
|
6571
|
+
const WARNING_CLAMPED_LAST_MODIFICATION_DATE = "clamped last modification date";
|
|
6309
6572
|
|
|
6310
6573
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
6311
6574
|
const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
|
|
6312
6575
|
const EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD = 9;
|
|
6313
6576
|
const EXTRAFIELD_USDZ_MAX_LENGTH = 67;
|
|
6577
|
+
const MIN_PRINTABLE_ASCII_CHARACTER_CODE = 0x20;
|
|
6578
|
+
const MAX_PRINTABLE_ASCII_CHARACTER_CODE = 0x7e;
|
|
6314
6579
|
const VENDOR_VERSION_AE_1 = 1;
|
|
6315
|
-
const INFOZIP_EXTRA_FIELD_TYPE
|
|
6580
|
+
const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
|
|
6316
6581
|
const UNIX_EXTRA_FIELD_TYPE = "unix";
|
|
6582
|
+
const LEVEL_BY_BITFLAG_LEVEL = [8, 9, 5, 3];
|
|
6317
6583
|
const MAX_LEVEL = 9;
|
|
6318
6584
|
|
|
6319
6585
|
let workers = 0;
|
|
@@ -6340,9 +6606,11 @@
|
|
|
6340
6606
|
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
6341
6607
|
pendingAddFileCalls: new Set(),
|
|
6342
6608
|
pendingErrors: [],
|
|
6609
|
+
warnings: [],
|
|
6343
6610
|
bufferedWrites: 0,
|
|
6344
6611
|
directWrites: 0,
|
|
6345
|
-
lastFileEntry: UNDEFINED_VALUE
|
|
6612
|
+
lastFileEntry: UNDEFINED_VALUE,
|
|
6613
|
+
archiveClosed: false
|
|
6346
6614
|
});
|
|
6347
6615
|
}
|
|
6348
6616
|
|
|
@@ -6507,6 +6775,9 @@
|
|
|
6507
6775
|
const zipWriter = this;
|
|
6508
6776
|
const { pendingAddFileCalls, writer } = this;
|
|
6509
6777
|
const { writable } = writer;
|
|
6778
|
+
if (zipWriter.archiveClosed) {
|
|
6779
|
+
return getWriterData(writer);
|
|
6780
|
+
}
|
|
6510
6781
|
if (!(comment instanceof Uint8Array)) {
|
|
6511
6782
|
throw new Error(ERR_INVALID_COMMENT_TYPE);
|
|
6512
6783
|
}
|
|
@@ -6517,7 +6788,7 @@
|
|
|
6517
6788
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
6518
6789
|
}
|
|
6519
6790
|
await Promise.allSettled(zipWriter.pendingErrors.map(watcher => watcher.recorded));
|
|
6520
|
-
const unobservedWatchers = zipWriter.pendingErrors.filter(watcher => watcher.
|
|
6791
|
+
const unobservedWatchers = zipWriter.pendingErrors.filter(watcher => watcher.failed && !watcher.observed);
|
|
6521
6792
|
if (unobservedWatchers.length) {
|
|
6522
6793
|
const unobservedErrors = unobservedWatchers.map(watcher => watcher.error);
|
|
6523
6794
|
unobservedWatchers.forEach(watcher => watcher.observed = true);
|
|
@@ -6530,11 +6801,16 @@
|
|
|
6530
6801
|
throw error;
|
|
6531
6802
|
}
|
|
6532
6803
|
await closeFile(zipWriter, comment, options);
|
|
6804
|
+
zipWriter.archiveClosed = true;
|
|
6533
6805
|
const preventClose = !ownsWritable(writer) && getOptionValue(zipWriter, options, OPTION_PREVENT_CLOSE);
|
|
6534
6806
|
if (!preventClose) {
|
|
6535
6807
|
await writable.getWriter().close();
|
|
6536
6808
|
}
|
|
6537
|
-
return writer
|
|
6809
|
+
return getWriterData(writer);
|
|
6810
|
+
}
|
|
6811
|
+
|
|
6812
|
+
[SYMBOL_ASYNC_DISPOSE]() {
|
|
6813
|
+
return this.close();
|
|
6538
6814
|
}
|
|
6539
6815
|
}
|
|
6540
6816
|
|
|
@@ -6613,11 +6889,16 @@
|
|
|
6613
6889
|
}
|
|
6614
6890
|
}
|
|
6615
6891
|
|
|
6892
|
+
function getWriterData(writer) {
|
|
6893
|
+
return writer.getData ? writer.getData() : writer.writable;
|
|
6894
|
+
}
|
|
6895
|
+
|
|
6616
6896
|
function watchPromiseError(zipWriter, promise) {
|
|
6617
6897
|
const watchedPromise = new WatchedPromise((resolve, reject) => Promise.prototype.then.call(promise, resolve, reject));
|
|
6618
6898
|
const watcher = {};
|
|
6619
6899
|
watchedPromise.watcher = watcher;
|
|
6620
|
-
watcher.recorded = Promise.prototype.then.call(watchedPromise, UNDEFINED_VALUE,
|
|
6900
|
+
watcher.recorded = Promise.prototype.then.call(watchedPromise, UNDEFINED_VALUE,
|
|
6901
|
+
error => Object.assign(watcher, { failed: true, error }));
|
|
6621
6902
|
zipWriter.pendingErrors.push(watcher);
|
|
6622
6903
|
return watchedPromise;
|
|
6623
6904
|
}
|
|
@@ -6631,6 +6912,14 @@
|
|
|
6631
6912
|
|
|
6632
6913
|
async function addFileEntry(zipWriter, name, reader, options) {
|
|
6633
6914
|
options = Object.assign({}, options);
|
|
6915
|
+
const entry = options[OPTION_ENTRY];
|
|
6916
|
+
if (entry !== UNDEFINED_VALUE) {
|
|
6917
|
+
const { entryOptions, passThroughOptions } = getSourceEntryOptions(entry,
|
|
6918
|
+
checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH)),
|
|
6919
|
+
getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE));
|
|
6920
|
+
delete options[OPTION_ENTRY];
|
|
6921
|
+
options = Object.assign(entryOptions, passThroughOptions, options);
|
|
6922
|
+
}
|
|
6634
6923
|
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
6635
6924
|
name += DIRECTORY_SIGNATURE;
|
|
6636
6925
|
}
|
|
@@ -6695,21 +6984,33 @@
|
|
|
6695
6984
|
try {
|
|
6696
6985
|
const { resolvedOptions } = metadataInfo;
|
|
6697
6986
|
if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
|
|
6698
|
-
!resolvedOptions.
|
|
6987
|
+
!resolvedOptions.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
|
|
6699
6988
|
resolvedOptions.level = 0;
|
|
6989
|
+
addWarning(zipWriter.warnings, WARNING_COMPRESSION_UNAVAILABLE, name);
|
|
6700
6990
|
}
|
|
6701
6991
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
6702
6992
|
({ reader } = sizesInfo);
|
|
6703
6993
|
const diskOffset = getDiskOffset(zipWriter.writer);
|
|
6704
6994
|
const diskNumber = getDiskNumber(zipWriter.writer);
|
|
6995
|
+
let crc32 = options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32;
|
|
6996
|
+
const storesAE2 = sizesInfo.resolvedOptions.encrypted && !resolvedOptions.zipCrypto;
|
|
6997
|
+
if (resolvedOptions.passThroughCompression && !resolvedOptions.passThroughEncryption && storesAE2) {
|
|
6998
|
+
crc32 = UNDEFINED_VALUE;
|
|
6999
|
+
}
|
|
7000
|
+
if (resolvedOptions.passThroughCompression && reader && !storesAE2 && crc32 === UNDEFINED_VALUE) {
|
|
7001
|
+
throw new Error(ERR_UNDEFINED_CRC32);
|
|
7002
|
+
}
|
|
6705
7003
|
options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
|
|
6706
7004
|
signature: options[PROPERTY_NAME_SIGNATURE],
|
|
6707
|
-
crc32
|
|
7005
|
+
crc32,
|
|
6708
7006
|
offset: zipWriter.offset - diskOffset,
|
|
6709
7007
|
diskNumberStart: diskNumber,
|
|
6710
7008
|
[OPTION_USDZ]: zipWriter.options[OPTION_USDZ]
|
|
6711
7009
|
});
|
|
6712
7010
|
const headerInfo = getHeaderInfo(options);
|
|
7011
|
+
if (headerInfo.lastModDateClamped) {
|
|
7012
|
+
addWarning(zipWriter.warnings, WARNING_CLAMPED_LAST_MODIFICATION_DATE, name);
|
|
7013
|
+
}
|
|
6713
7014
|
const dataDescriptorInfo = getDataDescriptorInfo(options);
|
|
6714
7015
|
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
6715
7016
|
fileEntry = await getFileEntry(zipWriter, name, reader, {
|
|
@@ -6736,6 +7037,95 @@
|
|
|
6736
7037
|
return new Entry(fileEntry);
|
|
6737
7038
|
}
|
|
6738
7039
|
|
|
7040
|
+
function getSourceEntryOptions(entry, passThrough, lastModDateOverride) {
|
|
7041
|
+
if (entry === null || typeof entry != OBJECT_TYPE || Array.isArray(entry)) {
|
|
7042
|
+
throw new Error(ERR_INVALID_ENTRY);
|
|
7043
|
+
}
|
|
7044
|
+
const {
|
|
7045
|
+
externalFileAttributes,
|
|
7046
|
+
versionMadeBy,
|
|
7047
|
+
comment,
|
|
7048
|
+
lastModDate,
|
|
7049
|
+
rawLastModDate,
|
|
7050
|
+
creationDate,
|
|
7051
|
+
lastAccessDate,
|
|
7052
|
+
uncompressedSize,
|
|
7053
|
+
encrypted,
|
|
7054
|
+
zipCrypto,
|
|
7055
|
+
crc32,
|
|
7056
|
+
compressionMethod,
|
|
7057
|
+
extraFieldAES,
|
|
7058
|
+
extraFieldUnix,
|
|
7059
|
+
internalFileAttributes,
|
|
7060
|
+
extraField,
|
|
7061
|
+
bitFlag,
|
|
7062
|
+
directory,
|
|
7063
|
+
uid,
|
|
7064
|
+
gid
|
|
7065
|
+
} = entry;
|
|
7066
|
+
const entryOptions = {
|
|
7067
|
+
externalFileAttributes,
|
|
7068
|
+
versionMadeBy,
|
|
7069
|
+
comment,
|
|
7070
|
+
lastModDate,
|
|
7071
|
+
creationDate,
|
|
7072
|
+
lastAccessDate,
|
|
7073
|
+
internalFileAttributes,
|
|
7074
|
+
directory
|
|
7075
|
+
};
|
|
7076
|
+
if (bitFlag && bitFlag.languageEncodingFlag) {
|
|
7077
|
+
entryOptions[OPTION_USE_UNICODE_FILE_NAMES] = true;
|
|
7078
|
+
}
|
|
7079
|
+
const userExtraField = getUserExtraField(extraField);
|
|
7080
|
+
if (userExtraField) {
|
|
7081
|
+
entryOptions[PROPERTY_NAME_EXTRA_FIELD] = userExtraField;
|
|
7082
|
+
}
|
|
7083
|
+
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
7084
|
+
Object.assign(entryOptions, {
|
|
7085
|
+
uid,
|
|
7086
|
+
gid,
|
|
7087
|
+
unixExtraFieldType: extraFieldUnix ? UNIX_EXTRA_FIELD_TYPE : INFOZIP_EXTRA_FIELD_TYPE
|
|
7088
|
+
});
|
|
7089
|
+
}
|
|
7090
|
+
const passThroughOptions = {};
|
|
7091
|
+
if (passThrough && !directory) {
|
|
7092
|
+
Object.assign(passThroughOptions, {
|
|
7093
|
+
uncompressedSize,
|
|
7094
|
+
crc32,
|
|
7095
|
+
compressionMethod
|
|
7096
|
+
});
|
|
7097
|
+
if (passThrough !== PASS_THROUGH_COMPRESSED) {
|
|
7098
|
+
Object.assign(passThroughOptions, {
|
|
7099
|
+
encrypted,
|
|
7100
|
+
zipCrypto,
|
|
7101
|
+
encryptionStrength: extraFieldAES ? extraFieldAES.strength : UNDEFINED_VALUE
|
|
7102
|
+
});
|
|
7103
|
+
}
|
|
7104
|
+
if (bitFlag) {
|
|
7105
|
+
passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
|
|
7106
|
+
passThroughOptions[OPTION_LEVEL] = LEVEL_BY_BITFLAG_LEVEL[bitFlag.level];
|
|
7107
|
+
}
|
|
7108
|
+
if (lastModDateOverride === UNDEFINED_VALUE) {
|
|
7109
|
+
passThroughOptions.rawLastModDate = rawLastModDate;
|
|
7110
|
+
} else if (passThrough !== PASS_THROUGH_COMPRESSED && zipCrypto && (!bitFlag || bitFlag.dataDescriptor) &&
|
|
7111
|
+
lastModDateOverride instanceof Date &&
|
|
7112
|
+
getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
|
|
7113
|
+
throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
|
|
7114
|
+
}
|
|
7115
|
+
}
|
|
7116
|
+
return { entryOptions, passThroughOptions };
|
|
7117
|
+
}
|
|
7118
|
+
|
|
7119
|
+
function getDosTimeHighByte(lastModDate) {
|
|
7120
|
+
let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
|
|
7121
|
+
if (dosLastModDate < MIN_DATE) {
|
|
7122
|
+
dosLastModDate = MIN_DATE;
|
|
7123
|
+
} else if (dosLastModDate > MAX_DATE) {
|
|
7124
|
+
dosLastModDate = MAX_DATE;
|
|
7125
|
+
}
|
|
7126
|
+
return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
|
|
7127
|
+
}
|
|
7128
|
+
|
|
6739
7129
|
function resolveAttributes(zipWriter, name, options) {
|
|
6740
7130
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
6741
7131
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
|
|
@@ -6750,7 +7140,7 @@
|
|
|
6750
7140
|
checkIntegerOption(uid, MAX_32_BITS, ERR_INVALID_UID);
|
|
6751
7141
|
checkIntegerOption(gid, MAX_32_BITS, ERR_INVALID_GID);
|
|
6752
7142
|
checkIntegerOption(unixMode, MAX_16_BITS, ERR_INVALID_UNIX_MODE);
|
|
6753
|
-
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE
|
|
7143
|
+
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
|
|
6754
7144
|
throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
|
|
6755
7145
|
}
|
|
6756
7146
|
if (unixExtraFieldType === UNIX_EXTRA_FIELD_TYPE &&
|
|
@@ -6758,7 +7148,7 @@
|
|
|
6758
7148
|
throw new Error(ERR_INVALID_UNIX_ID_SIZE);
|
|
6759
7149
|
}
|
|
6760
7150
|
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
6761
|
-
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE
|
|
7151
|
+
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
|
|
6762
7152
|
}
|
|
6763
7153
|
let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
6764
7154
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
@@ -6889,7 +7279,9 @@
|
|
|
6889
7279
|
const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
|
|
6890
7280
|
const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
|
|
6891
7281
|
const internalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, 0);
|
|
6892
|
-
const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
|
|
7282
|
+
const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
|
|
7283
|
+
const passThroughCompression = Boolean(passThrough);
|
|
7284
|
+
const passThroughEncryption = passThrough === true;
|
|
6893
7285
|
const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6894
7286
|
const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6895
7287
|
checkPasswordOption(password, rawPassword);
|
|
@@ -6905,10 +7297,11 @@
|
|
|
6905
7297
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
6906
7298
|
const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
|
|
6907
7299
|
throwIfAborted(signal);
|
|
6908
|
-
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
|
|
7300
|
+
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
|
|
7301
|
+
!isPrintableASCIIText(rawFilename) || !isPrintableASCIIText(rawComment));
|
|
6909
7302
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
6910
|
-
const registeredCodec =
|
|
6911
|
-
if (!
|
|
7303
|
+
const registeredCodec = passThroughCompression || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
7304
|
+
if (!passThroughCompression && compressionMethod !== UNDEFINED_VALUE &&
|
|
6912
7305
|
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
|
|
6913
7306
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
6914
7307
|
}
|
|
@@ -6922,15 +7315,15 @@
|
|
|
6922
7315
|
level = 0;
|
|
6923
7316
|
}
|
|
6924
7317
|
}
|
|
6925
|
-
if (
|
|
6926
|
-
level =
|
|
7318
|
+
if (passThroughCompression) {
|
|
7319
|
+
level = toNumber(options[OPTION_LEVEL]);
|
|
6927
7320
|
}
|
|
6928
7321
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
6929
7322
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
6930
7323
|
if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
|
|
6931
7324
|
dataDescriptor = false;
|
|
6932
7325
|
}
|
|
6933
|
-
if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !
|
|
7326
|
+
if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThroughEncryption)) {
|
|
6934
7327
|
dataDescriptor = true;
|
|
6935
7328
|
}
|
|
6936
7329
|
if (level !== UNDEFINED_VALUE && level != 6) {
|
|
@@ -6954,7 +7347,8 @@
|
|
|
6954
7347
|
lastAccessDate,
|
|
6955
7348
|
creationDate,
|
|
6956
7349
|
internalFileAttributes,
|
|
6957
|
-
|
|
7350
|
+
passThroughCompression,
|
|
7351
|
+
passThroughEncryption,
|
|
6958
7352
|
password,
|
|
6959
7353
|
rawPassword,
|
|
6960
7354
|
encryptionStrength,
|
|
@@ -7015,7 +7409,7 @@
|
|
|
7015
7409
|
}
|
|
7016
7410
|
|
|
7017
7411
|
async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
|
|
7018
|
-
if (metadata.
|
|
7412
|
+
if (metadata.passThroughCompression && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
|
|
7019
7413
|
throw new Error(ERR_UNDEFINED_READER);
|
|
7020
7414
|
}
|
|
7021
7415
|
let contentSize;
|
|
@@ -7031,12 +7425,12 @@
|
|
|
7031
7425
|
}
|
|
7032
7426
|
|
|
7033
7427
|
function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options) {
|
|
7034
|
-
const {
|
|
7428
|
+
const { passThroughCompression, passThroughEncryption, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
|
|
7035
7429
|
let { dataDescriptor, zip64, level, compressionMethod } = metadata;
|
|
7036
7430
|
let maximumCompressedSize = 0;
|
|
7037
7431
|
let uncompressedSize = 0;
|
|
7038
7432
|
let unknownSize = false;
|
|
7039
|
-
if (
|
|
7433
|
+
if (passThroughCompression && hasContent) {
|
|
7040
7434
|
uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
|
|
7041
7435
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
7042
7436
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
@@ -7047,17 +7441,17 @@
|
|
|
7047
7441
|
}
|
|
7048
7442
|
const zip64Enabled = zip64 === true;
|
|
7049
7443
|
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
7050
|
-
if (hasContent &&
|
|
7444
|
+
if (hasContent && passThroughEncryption && !encrypted && getLength(password, rawPassword)) {
|
|
7051
7445
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH);
|
|
7052
7446
|
}
|
|
7053
|
-
const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (
|
|
7447
|
+
const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThroughEncryption && encrypted));
|
|
7054
7448
|
if (!hasContent) {
|
|
7055
7449
|
level = 0;
|
|
7056
7450
|
compressionMethod = COMPRESSION_METHOD_STORE;
|
|
7057
7451
|
}
|
|
7058
|
-
const encryptionOverhead = encryptedEntry
|
|
7452
|
+
const encryptionOverhead = getEncryptionOverhead(encryptedEntry, zipCrypto, encryptionStrength);
|
|
7059
7453
|
if (hasContent) {
|
|
7060
|
-
if (!
|
|
7454
|
+
if (!passThroughCompression) {
|
|
7061
7455
|
if (contentSize === UNDEFINED_VALUE) {
|
|
7062
7456
|
dataDescriptor = true;
|
|
7063
7457
|
if (zip64 || zip64 === UNDEFINED_VALUE) {
|
|
@@ -7070,10 +7464,12 @@
|
|
|
7070
7464
|
}
|
|
7071
7465
|
} else {
|
|
7072
7466
|
options.uncompressedSize = uncompressedSize;
|
|
7073
|
-
maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
|
|
7467
|
+
maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
|
|
7468
|
+
getMaximumCompressedSize(uncompressedSize) + encryptionOverhead :
|
|
7469
|
+
contentSize + (passThroughEncryption ? 0 : encryptionOverhead);
|
|
7074
7470
|
}
|
|
7075
7471
|
}
|
|
7076
|
-
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !
|
|
7472
|
+
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
|
|
7077
7473
|
if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
|
|
7078
7474
|
dataDescriptor = false;
|
|
7079
7475
|
}
|
|
@@ -7122,6 +7518,8 @@
|
|
|
7122
7518
|
const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
|
|
7123
7519
|
let offset = initialOffset;
|
|
7124
7520
|
let minimumEntrySize = INFINITY_VALUE;
|
|
7521
|
+
const entrySizes = [];
|
|
7522
|
+
const entriesAlreadyZip64 = new Set();
|
|
7125
7523
|
for (const entry of entries) {
|
|
7126
7524
|
let { name } = entry;
|
|
7127
7525
|
const { size } = entry;
|
|
@@ -7133,7 +7531,7 @@
|
|
|
7133
7531
|
({ name } = attributesInfo);
|
|
7134
7532
|
const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
|
|
7135
7533
|
if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
|
|
7136
|
-
!metadata.
|
|
7534
|
+
!metadata.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
|
|
7137
7535
|
metadata.level = 0;
|
|
7138
7536
|
}
|
|
7139
7537
|
const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
|
|
@@ -7141,7 +7539,7 @@
|
|
|
7141
7539
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7142
7540
|
}
|
|
7143
7541
|
const { maximumCompressedSize, resolvedOptions: sizes } = resolveEntrySizes(zipWriter, hasContent, size, metadata, options);
|
|
7144
|
-
if (hasContent && !metadata.
|
|
7542
|
+
if (hasContent && !metadata.passThroughCompression && isCompressed(sizes.compressionMethod, sizes.level)) {
|
|
7145
7543
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7146
7544
|
}
|
|
7147
7545
|
const entryOptions = Object.assign({}, options, attributesInfo.resolvedOptions, metadata, sizes, { [OPTION_USDZ]: usdz });
|
|
@@ -7161,10 +7559,15 @@
|
|
|
7161
7559
|
compressedSize
|
|
7162
7560
|
}));
|
|
7163
7561
|
const entrySize = entryInfo.metadataSize + compressedSize;
|
|
7562
|
+
entrySizes.push(entrySize);
|
|
7563
|
+
entriesAlreadyZip64.add(Boolean(entryOptions.zip64Enabled ||
|
|
7564
|
+
entryOptions.uncompressedSize >= MAX_32_BITS || compressedSize >= MAX_32_BITS));
|
|
7164
7565
|
minimumEntrySize = Math.min(minimumEntrySize, entrySize);
|
|
7165
7566
|
offset += entrySize;
|
|
7166
7567
|
}
|
|
7167
|
-
const layoutDependsOnWriteOrder = files.size > 1 && (usdz ||
|
|
7568
|
+
const layoutDependsOnWriteOrder = files.size > 1 && (usdz ||
|
|
7569
|
+
(offset - minimumEntrySize >= MAX_32_BITS &&
|
|
7570
|
+
(entriesAlreadyZip64.size > 1 || countEntriesBefore4GB(entrySizes, initialOffset, true) != countEntriesBefore4GB(entrySizes, initialOffset, false))));
|
|
7168
7571
|
if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
|
|
7169
7572
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7170
7573
|
}
|
|
@@ -7182,6 +7585,20 @@
|
|
|
7182
7585
|
return offset - initialOffset + directoryDataLength + commentLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
|
|
7183
7586
|
}
|
|
7184
7587
|
|
|
7588
|
+
function countEntriesBefore4GB(entrySizes, initialOffset, largestFirst) {
|
|
7589
|
+
const ordered = entrySizes.slice().sort((first, second) => largestFirst ? second - first : first - second);
|
|
7590
|
+
let position = initialOffset;
|
|
7591
|
+
let count = 0;
|
|
7592
|
+
for (const entrySize of ordered) {
|
|
7593
|
+
if (position >= MAX_32_BITS) {
|
|
7594
|
+
break;
|
|
7595
|
+
}
|
|
7596
|
+
position += entrySize;
|
|
7597
|
+
count++;
|
|
7598
|
+
}
|
|
7599
|
+
return count;
|
|
7600
|
+
}
|
|
7601
|
+
|
|
7185
7602
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
7186
7603
|
const {
|
|
7187
7604
|
fileEntries,
|
|
@@ -7357,6 +7774,7 @@
|
|
|
7357
7774
|
localExtraFieldZip64Length,
|
|
7358
7775
|
rawExtraFieldExtendedTimestamp,
|
|
7359
7776
|
extraFieldExtendedTimestampFlag,
|
|
7777
|
+
extraFieldExtendedTimestampTime,
|
|
7360
7778
|
rawExtraFieldNTFS,
|
|
7361
7779
|
rawExtraFieldUnix,
|
|
7362
7780
|
rawExtraFieldAES,
|
|
@@ -7369,6 +7787,7 @@
|
|
|
7369
7787
|
password,
|
|
7370
7788
|
rawPassword,
|
|
7371
7789
|
level,
|
|
7790
|
+
useUnicodeFileNames,
|
|
7372
7791
|
zip64,
|
|
7373
7792
|
zip64Enabled,
|
|
7374
7793
|
zip64UncompressedSize,
|
|
@@ -7403,7 +7822,8 @@
|
|
|
7403
7822
|
msdosAttributesRaw,
|
|
7404
7823
|
msdosAttributes,
|
|
7405
7824
|
useCompressionStream,
|
|
7406
|
-
|
|
7825
|
+
passThroughCompression,
|
|
7826
|
+
passThroughEncryption,
|
|
7407
7827
|
format,
|
|
7408
7828
|
codecURI
|
|
7409
7829
|
} = options;
|
|
@@ -7414,9 +7834,9 @@
|
|
|
7414
7834
|
zip64Enabled,
|
|
7415
7835
|
directory: Boolean(directory),
|
|
7416
7836
|
executable: Boolean(executable),
|
|
7417
|
-
filenameUTF8:
|
|
7837
|
+
filenameUTF8: Boolean(useUnicodeFileNames),
|
|
7418
7838
|
rawFilename,
|
|
7419
|
-
commentUTF8:
|
|
7839
|
+
commentUTF8: Boolean(useUnicodeFileNames),
|
|
7420
7840
|
rawComment,
|
|
7421
7841
|
rawExtraFieldZip64,
|
|
7422
7842
|
localExtraFieldZip64Length,
|
|
@@ -7447,7 +7867,7 @@
|
|
|
7447
7867
|
uncompressedSize
|
|
7448
7868
|
} = options;
|
|
7449
7869
|
let compressedSize = 0;
|
|
7450
|
-
if (!
|
|
7870
|
+
if (!passThroughCompression) {
|
|
7451
7871
|
uncompressedSize = 0;
|
|
7452
7872
|
}
|
|
7453
7873
|
const { writable } = writer;
|
|
@@ -7464,9 +7884,9 @@
|
|
|
7464
7884
|
encryptionStrength,
|
|
7465
7885
|
zipCrypto: encrypted && zipCrypto,
|
|
7466
7886
|
passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & MAX_8_BITS,
|
|
7467
|
-
computeCrc32: !
|
|
7468
|
-
compressed: compressed && !
|
|
7469
|
-
encrypted: encrypted && !
|
|
7887
|
+
computeCrc32: !passThroughCompression,
|
|
7888
|
+
compressed: compressed && !passThroughCompression,
|
|
7889
|
+
encrypted: encrypted && !passThroughEncryption,
|
|
7470
7890
|
useWebWorkers,
|
|
7471
7891
|
useCompressionStream,
|
|
7472
7892
|
transferStreams,
|
|
@@ -7481,7 +7901,7 @@
|
|
|
7481
7901
|
const result = await runWorker({ readable, writable }, workerOptions);
|
|
7482
7902
|
compressedSize = result.outputSize;
|
|
7483
7903
|
writer.size += compressedSize;
|
|
7484
|
-
if (!
|
|
7904
|
+
if (!passThroughCompression) {
|
|
7485
7905
|
uncompressedSize = result.inputSize;
|
|
7486
7906
|
if (!encrypted || zipCrypto) {
|
|
7487
7907
|
crc32 = result.crc32;
|
|
@@ -7492,7 +7912,10 @@
|
|
|
7492
7912
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
7493
7913
|
}
|
|
7494
7914
|
} catch (error) {
|
|
7495
|
-
|
|
7915
|
+
const { outputSize: failedOutputSize } = workerOptions;
|
|
7916
|
+
if (failedOutputSize !== UNDEFINED_VALUE) {
|
|
7917
|
+
writer.size += failedOutputSize;
|
|
7918
|
+
} else if (isErrorObject(error) && error.outputSize !== UNDEFINED_VALUE) {
|
|
7496
7919
|
writer.size += error.outputSize;
|
|
7497
7920
|
}
|
|
7498
7921
|
throw error;
|
|
@@ -7524,8 +7947,9 @@
|
|
|
7524
7947
|
headerArray,
|
|
7525
7948
|
headerView,
|
|
7526
7949
|
signature: crc32,
|
|
7527
|
-
crc32: encrypted && !zipCrypto && !
|
|
7950
|
+
crc32: encrypted && !zipCrypto && !passThroughCompression ? UNDEFINED_VALUE : crc32,
|
|
7528
7951
|
extraFieldExtendedTimestampFlag,
|
|
7952
|
+
extraFieldExtendedTimestampTime,
|
|
7529
7953
|
zip64UncompressedSize,
|
|
7530
7954
|
zip64CompressedSize
|
|
7531
7955
|
});
|
|
@@ -7550,7 +7974,7 @@
|
|
|
7550
7974
|
encryptionStrength,
|
|
7551
7975
|
extendedTimestamp,
|
|
7552
7976
|
ntfsTimestamp,
|
|
7553
|
-
|
|
7977
|
+
passThroughCompression,
|
|
7554
7978
|
encrypted,
|
|
7555
7979
|
zip64UncompressedSize,
|
|
7556
7980
|
zip64CompressedSize,
|
|
@@ -7561,7 +7985,7 @@
|
|
|
7561
7985
|
let { version, compressionMethod } = options;
|
|
7562
7986
|
const compressed = !directory && isCompressed(compressionMethod, level);
|
|
7563
7987
|
let rawLocalExtraFieldZip64;
|
|
7564
|
-
const uncompressedFile =
|
|
7988
|
+
const uncompressedFile = passThroughCompression || !compressed;
|
|
7565
7989
|
const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || (uncompressedFile && !unknownSize)));
|
|
7566
7990
|
const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
|
|
7567
7991
|
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
@@ -7573,8 +7997,8 @@
|
|
|
7573
7997
|
if (zip64ExtraFieldComplete) {
|
|
7574
7998
|
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7575
7999
|
if (uncompressedFile) {
|
|
7576
|
-
const encryptionOverhead = encrypted
|
|
7577
|
-
extraFieldZip64.writeUint64(
|
|
8000
|
+
const encryptionOverhead = getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength);
|
|
8001
|
+
extraFieldZip64.writeUint64(passThroughCompression ? 0 : uncompressedSize + encryptionOverhead);
|
|
7578
8002
|
}
|
|
7579
8003
|
}
|
|
7580
8004
|
} else {
|
|
@@ -7593,6 +8017,7 @@
|
|
|
7593
8017
|
let rawExtraFieldNTFS;
|
|
7594
8018
|
let rawExtraFieldExtendedTimestamp;
|
|
7595
8019
|
let extraFieldExtendedTimestampFlag;
|
|
8020
|
+
let extraFieldExtendedTimestampTime;
|
|
7596
8021
|
if (extendedTimestamp) {
|
|
7597
8022
|
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
7598
8023
|
const lastModTimeUnixInRange = inUnixTimeRange(lastModTimeUnix);
|
|
@@ -7600,6 +8025,7 @@
|
|
|
7600
8025
|
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
7601
8026
|
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
7602
8027
|
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
8028
|
+
extraFieldExtendedTimestampTime = lastModTimeUnix;
|
|
7603
8029
|
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7604
8030
|
extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
|
|
7605
8031
|
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
@@ -7642,7 +8068,7 @@
|
|
|
7642
8068
|
let rawExtraFieldUnix;
|
|
7643
8069
|
try {
|
|
7644
8070
|
const { uid, gid, unixExtraFieldType } = options;
|
|
7645
|
-
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE
|
|
8071
|
+
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
7646
8072
|
const uidBytes = packUnixId(uid === UNDEFINED_VALUE ? 0 : uid);
|
|
7647
8073
|
const gidBytes = packUnixId(gid === UNDEFINED_VALUE ? 0 : gid);
|
|
7648
8074
|
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
@@ -7683,7 +8109,7 @@
|
|
|
7683
8109
|
}
|
|
7684
8110
|
if (encrypted && !zipCrypto) {
|
|
7685
8111
|
version = version > VERSION_AES ? version : VERSION_AES;
|
|
7686
|
-
if (
|
|
8112
|
+
if (passThroughCompression && crc32 !== UNDEFINED_VALUE) {
|
|
7687
8113
|
rawExtraFieldAES[EXTRAFIELD_OFFSET_AES_VENDOR_VERSION] = VENDOR_VERSION_AE_1;
|
|
7688
8114
|
}
|
|
7689
8115
|
setUint16(getDataView(rawExtraFieldAES), EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD, compressionMethod);
|
|
@@ -7745,12 +8171,14 @@
|
|
|
7745
8171
|
headerArray,
|
|
7746
8172
|
headerView,
|
|
7747
8173
|
lastModDate: storedLastModDate,
|
|
8174
|
+
lastModDateClamped: storedLastModDate === clampedLastModDate && dosLastModDate.getTime() != clampedLastModDate.getTime(),
|
|
7748
8175
|
rawLastModDate,
|
|
7749
8176
|
encrypted,
|
|
7750
8177
|
compressed,
|
|
7751
8178
|
version,
|
|
7752
8179
|
compressionMethod,
|
|
7753
8180
|
extraFieldExtendedTimestampFlag,
|
|
8181
|
+
extraFieldExtendedTimestampTime,
|
|
7754
8182
|
rawExtraFieldZip64: EMPTY_UINT8_ARRAY,
|
|
7755
8183
|
localExtraFieldZip64Length,
|
|
7756
8184
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -7853,7 +8281,7 @@
|
|
|
7853
8281
|
}, {
|
|
7854
8282
|
zip64,
|
|
7855
8283
|
zipCrypto,
|
|
7856
|
-
|
|
8284
|
+
passThroughCompression,
|
|
7857
8285
|
dataDescriptor
|
|
7858
8286
|
}) {
|
|
7859
8287
|
const {
|
|
@@ -7864,7 +8292,7 @@
|
|
|
7864
8292
|
dataDescriptorView,
|
|
7865
8293
|
dataDescriptorOffset
|
|
7866
8294
|
} = dataDescriptorInfo;
|
|
7867
|
-
if ((!encrypted || zipCrypto ||
|
|
8295
|
+
if ((!encrypted || zipCrypto || passThroughCompression) && crc32 !== UNDEFINED_VALUE) {
|
|
7868
8296
|
setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
|
|
7869
8297
|
if (dataDescriptor) {
|
|
7870
8298
|
setUint32(dataDescriptorView, dataDescriptorOffset, crc32);
|
|
@@ -7895,9 +8323,9 @@
|
|
|
7895
8323
|
uncompressedSize,
|
|
7896
8324
|
zip64UncompressedSize,
|
|
7897
8325
|
zip64CompressedSize
|
|
7898
|
-
}, localHeaderView, { dataDescriptor,
|
|
8326
|
+
}, localHeaderView, { dataDescriptor, passThroughCompression }) {
|
|
7899
8327
|
if (!dataDescriptor) {
|
|
7900
|
-
if (!encrypted || (
|
|
8328
|
+
if (!encrypted || (passThroughCompression && crc32 !== UNDEFINED_VALUE)) {
|
|
7901
8329
|
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, crc32);
|
|
7902
8330
|
}
|
|
7903
8331
|
if (!zip64CompressedSize) {
|
|
@@ -7934,9 +8362,8 @@
|
|
|
7934
8362
|
rawExtraFieldUnix,
|
|
7935
8363
|
rawExtraField,
|
|
7936
8364
|
rawCentralExtraField,
|
|
7937
|
-
extendedTimestamp,
|
|
7938
8365
|
extraFieldExtendedTimestampFlag,
|
|
7939
|
-
|
|
8366
|
+
extraFieldExtendedTimestampTime,
|
|
7940
8367
|
zip64Enabled,
|
|
7941
8368
|
uncompressedSize,
|
|
7942
8369
|
compressedSize
|
|
@@ -7979,16 +8406,15 @@
|
|
|
7979
8406
|
fileEntry.zip64Offset = zip64Offset;
|
|
7980
8407
|
fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
|
|
7981
8408
|
let rawExtraFieldTimestamp;
|
|
7982
|
-
|
|
7983
|
-
|
|
8409
|
+
if (extraFieldExtendedTimestampTime === UNDEFINED_VALUE) {
|
|
8410
|
+
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
8411
|
+
} else {
|
|
7984
8412
|
const extraFieldTimestamp = createRecordWriter(9);
|
|
7985
8413
|
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7986
8414
|
extraFieldTimestamp.writeUint16(5);
|
|
7987
8415
|
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7988
|
-
extraFieldTimestamp.writeUint32(
|
|
8416
|
+
extraFieldTimestamp.writeUint32(extraFieldExtendedTimestampTime);
|
|
7989
8417
|
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
7990
|
-
} else {
|
|
7991
|
-
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
7992
8418
|
}
|
|
7993
8419
|
fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
|
|
7994
8420
|
const extraFieldLength = getLength(
|
|
@@ -8488,6 +8914,11 @@
|
|
|
8488
8914
|
};
|
|
8489
8915
|
}
|
|
8490
8916
|
|
|
8917
|
+
function isPrintableASCIIText(rawText) {
|
|
8918
|
+
return rawText.every(characterCode =>
|
|
8919
|
+
characterCode >= MIN_PRINTABLE_ASCII_CHARACTER_CODE && characterCode <= MAX_PRINTABLE_ASCII_CHARACTER_CODE);
|
|
8920
|
+
}
|
|
8921
|
+
|
|
8491
8922
|
function getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted, compressionMethod) {
|
|
8492
8923
|
let bitFlag = 0;
|
|
8493
8924
|
if (useUnicodeFileNames) {
|
|
@@ -8649,7 +9080,7 @@
|
|
|
8649
9080
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
8650
9081
|
*/
|
|
8651
9082
|
|
|
8652
|
-
const VERSION = "2.
|
|
9083
|
+
const VERSION = "2.13.0";
|
|
8653
9084
|
|
|
8654
9085
|
/*
|
|
8655
9086
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9168,7 +9599,10 @@
|
|
|
9168
9599
|
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
9169
9600
|
const ERR_DUPLICATE_IMPORTED_ENTRY = "Duplicate entry filename in the imported zip file";
|
|
9170
9601
|
const ERR_INVALID_DUPLICATES = "Invalid duplicates option (must be \"throw\", \"keep-first\" or \"keep-last\")";
|
|
9171
|
-
const ERR_ANCESTOR_ENTRY = "Entry is
|
|
9602
|
+
const ERR_ANCESTOR_ENTRY = "Entry is an ancestor of target entry";
|
|
9603
|
+
const ERR_ROOT_DIRECTORY_NOT_MOVABLE = "Root directory cannot be moved";
|
|
9604
|
+
const ERR_TARGET_NOT_DIRECTORY = "Target entry is not a directory";
|
|
9605
|
+
const ERR_PARENT_NOT_DIRECTORY = "Parent entry is not a directory";
|
|
9172
9606
|
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
9173
9607
|
const DUPLICATES_THROW = "throw";
|
|
9174
9608
|
const DUPLICATES_KEEP_FIRST = "keep-first";
|
|
@@ -9176,22 +9610,8 @@
|
|
|
9176
9610
|
const DUPLICATES_VALUES = new Set([DUPLICATES_THROW, DUPLICATES_KEEP_FIRST, DUPLICATES_KEEP_LAST]);
|
|
9177
9611
|
const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
|
|
9178
9612
|
const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
|
|
9179
|
-
const
|
|
9613
|
+
const ERR_UNSUPPORTED_PASS_THROUGH_VALUE = "The 'compressed' passThrough option is only supported by Entry#getData() and ZipWriter#add()";
|
|
9180
9614
|
const ERR_ABORT_EXPORT = "zipjs-abort-export";
|
|
9181
|
-
const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
|
|
9182
|
-
const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
|
|
9183
|
-
EXTRAFIELD_TYPE_ZIP64,
|
|
9184
|
-
EXTRAFIELD_TYPE_AES,
|
|
9185
|
-
EXTRAFIELD_TYPE_NTFS,
|
|
9186
|
-
EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
|
|
9187
|
-
EXTRAFIELD_TYPE_UNICODE_PATH,
|
|
9188
|
-
EXTRAFIELD_TYPE_UNICODE_COMMENT,
|
|
9189
|
-
EXTRAFIELD_TYPE_USDZ,
|
|
9190
|
-
EXTRAFIELD_TYPE_INFOZIP,
|
|
9191
|
-
EXTRAFIELD_TYPE_UNIX,
|
|
9192
|
-
EXTRAFIELD_TYPE_UNIX_TYPE1,
|
|
9193
|
-
EXTRAFIELD_TYPE_PKWARE_UNIX
|
|
9194
|
-
]);
|
|
9195
9615
|
|
|
9196
9616
|
class ZipEntry {
|
|
9197
9617
|
|
|
@@ -9323,7 +9743,7 @@
|
|
|
9323
9743
|
}));
|
|
9324
9744
|
return true;
|
|
9325
9745
|
} catch (error) {
|
|
9326
|
-
if (error.message == ERR_INVALID_PASSWORD) {
|
|
9746
|
+
if (isErrorObject(error) && error.message == ERR_INVALID_PASSWORD) {
|
|
9327
9747
|
return false;
|
|
9328
9748
|
} else {
|
|
9329
9749
|
throw error;
|
|
@@ -9563,6 +9983,7 @@
|
|
|
9563
9983
|
await initStream(reader);
|
|
9564
9984
|
zipReader = new ZipReader(reader, options);
|
|
9565
9985
|
}
|
|
9986
|
+
checkPassThroughValue(options.passThrough);
|
|
9566
9987
|
const duplicates = checkDuplicatesOption(options.duplicates);
|
|
9567
9988
|
const importedEntries = [];
|
|
9568
9989
|
const entries = await zipReader.getEntries(options);
|
|
@@ -9653,18 +10074,25 @@
|
|
|
9653
10074
|
|
|
9654
10075
|
async exportZip(writer, options = {}) {
|
|
9655
10076
|
const zipEntry = this;
|
|
10077
|
+
const zipWriterProvided = Boolean(writer) && typeof writer.add == FUNCTION_TYPE;
|
|
9656
10078
|
options = Object.assign({}, options);
|
|
9657
|
-
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
10079
|
+
if (!zipWriterProvided && options.bufferedWrite === UNDEFINED_VALUE) {
|
|
9658
10080
|
options.bufferedWrite = true;
|
|
9659
10081
|
}
|
|
9660
|
-
const [readers] = await Promise.all([
|
|
9661
|
-
|
|
10082
|
+
const [readers] = await Promise.all([
|
|
10083
|
+
initReaders(zipEntry, checkReaderOptions(options.readerOptions)),
|
|
10084
|
+
zipWriterProvided ? UNDEFINED_VALUE : initStream(writer)
|
|
10085
|
+
]);
|
|
10086
|
+
const zipWriter = zipWriterProvided ? writer : new ZipWriter(writer, options);
|
|
9662
10087
|
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
|
|
10088
|
+
if (zipWriterProvided) {
|
|
10089
|
+
return zipWriter;
|
|
10090
|
+
}
|
|
9663
10091
|
await zipWriter.close(options.globalComment);
|
|
9664
10092
|
return writer.getData ? writer.getData() : writer.writable;
|
|
9665
10093
|
}
|
|
9666
10094
|
|
|
9667
|
-
getExportedSize(options = {}) {
|
|
10095
|
+
async getExportedSize(options = {}) {
|
|
9668
10096
|
const zipEntry = this;
|
|
9669
10097
|
options = Object.assign({}, options);
|
|
9670
10098
|
checkReaderOptions(options.readerOptions);
|
|
@@ -9679,7 +10107,7 @@
|
|
|
9679
10107
|
const writeOrderGuaranteed = !options.bufferedWrite ||
|
|
9680
10108
|
(entries.every(entry => entry.options.keepOrder !== false) &&
|
|
9681
10109
|
children.every(child => isImplicitDirectory(child) || !child.children.length));
|
|
9682
|
-
return getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
|
|
10110
|
+
return await getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
|
|
9683
10111
|
}
|
|
9684
10112
|
|
|
9685
10113
|
getChildByName(name) {
|
|
@@ -9740,7 +10168,7 @@
|
|
|
9740
10168
|
|
|
9741
10169
|
move(entry, destination) {
|
|
9742
10170
|
if (entry == this.root) {
|
|
9743
|
-
throw new Error(
|
|
10171
|
+
throw new Error(ERR_ROOT_DIRECTORY_NOT_MOVABLE);
|
|
9744
10172
|
} else {
|
|
9745
10173
|
if (destination.directory) {
|
|
9746
10174
|
if (!destination.isDescendantOf(entry)) {
|
|
@@ -9761,7 +10189,7 @@
|
|
|
9761
10189
|
throw new Error(ERR_ANCESTOR_ENTRY);
|
|
9762
10190
|
}
|
|
9763
10191
|
} else {
|
|
9764
|
-
throw new Error(
|
|
10192
|
+
throw new Error(ERR_TARGET_NOT_DIRECTORY);
|
|
9765
10193
|
}
|
|
9766
10194
|
}
|
|
9767
10195
|
}
|
|
@@ -10074,70 +10502,11 @@
|
|
|
10074
10502
|
let zipEntryMetadata = {};
|
|
10075
10503
|
let passThroughOptions = {};
|
|
10076
10504
|
if (child.data instanceof Entry) {
|
|
10077
|
-
const
|
|
10078
|
-
|
|
10079
|
-
|
|
10080
|
-
|
|
10081
|
-
|
|
10082
|
-
rawLastModDate,
|
|
10083
|
-
creationDate,
|
|
10084
|
-
lastAccessDate,
|
|
10085
|
-
uncompressedSize,
|
|
10086
|
-
encrypted,
|
|
10087
|
-
zipCrypto,
|
|
10088
|
-
crc32,
|
|
10089
|
-
compressionMethod,
|
|
10090
|
-
extraFieldAES,
|
|
10091
|
-
internalFileAttributes,
|
|
10092
|
-
extraField,
|
|
10093
|
-
bitFlag,
|
|
10094
|
-
uid,
|
|
10095
|
-
gid
|
|
10096
|
-
} = child.data;
|
|
10097
|
-
zipEntryMetadata = {
|
|
10098
|
-
externalFileAttributes,
|
|
10099
|
-
versionMadeBy,
|
|
10100
|
-
comment,
|
|
10101
|
-
lastModDate,
|
|
10102
|
-
creationDate,
|
|
10103
|
-
lastAccessDate,
|
|
10104
|
-
internalFileAttributes
|
|
10105
|
-
};
|
|
10106
|
-
const userExtraField = getUserExtraField(extraField);
|
|
10107
|
-
if (userExtraField) {
|
|
10108
|
-
zipEntryMetadata.extraField = userExtraField;
|
|
10109
|
-
}
|
|
10110
|
-
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
10111
|
-
Object.assign(zipEntryMetadata, {
|
|
10112
|
-
uid,
|
|
10113
|
-
gid,
|
|
10114
|
-
unixExtraFieldType: INFOZIP_EXTRA_FIELD_TYPE
|
|
10115
|
-
});
|
|
10116
|
-
}
|
|
10117
|
-
if (isPassThrough(child, options)) {
|
|
10118
|
-
let encryptionStrength;
|
|
10119
|
-
if (extraFieldAES) {
|
|
10120
|
-
encryptionStrength = extraFieldAES.strength;
|
|
10121
|
-
}
|
|
10122
|
-
passThroughOptions = {
|
|
10123
|
-
passThrough: true,
|
|
10124
|
-
encrypted,
|
|
10125
|
-
zipCrypto,
|
|
10126
|
-
crc32,
|
|
10127
|
-
uncompressedSize,
|
|
10128
|
-
encryptionStrength,
|
|
10129
|
-
compressionMethod
|
|
10130
|
-
};
|
|
10131
|
-
if (bitFlag) {
|
|
10132
|
-
passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
|
|
10133
|
-
}
|
|
10134
|
-
const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
|
|
10135
|
-
if (lastModDateOverride === UNDEFINED_VALUE) {
|
|
10136
|
-
passThroughOptions.rawLastModDate = rawLastModDate;
|
|
10137
|
-
} else if (zipCrypto && (!bitFlag || bitFlag.dataDescriptor) && lastModDateOverride instanceof Date &&
|
|
10138
|
-
getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
|
|
10139
|
-
throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
|
|
10140
|
-
}
|
|
10505
|
+
const passThrough = isPassThrough(child, options);
|
|
10506
|
+
const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
|
|
10507
|
+
({ entryOptions: zipEntryMetadata, passThroughOptions } = getSourceEntryOptions(child.data, passThrough, lastModDateOverride));
|
|
10508
|
+
if (passThrough) {
|
|
10509
|
+
passThroughOptions.passThrough = true;
|
|
10141
10510
|
}
|
|
10142
10511
|
}
|
|
10143
10512
|
const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
|
|
@@ -10147,16 +10516,6 @@
|
|
|
10147
10516
|
return { name, entryOptions };
|
|
10148
10517
|
}
|
|
10149
10518
|
|
|
10150
|
-
function getDosTimeHighByte(lastModDate) {
|
|
10151
|
-
let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
|
|
10152
|
-
if (dosLastModDate < MIN_DATE) {
|
|
10153
|
-
dosLastModDate = MIN_DATE;
|
|
10154
|
-
} else if (dosLastModDate > MAX_DATE) {
|
|
10155
|
-
dosLastModDate = MAX_DATE;
|
|
10156
|
-
}
|
|
10157
|
-
return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
|
|
10158
|
-
}
|
|
10159
|
-
|
|
10160
10519
|
function getDeterminedSize(child, passThrough) {
|
|
10161
10520
|
const { reader } = child;
|
|
10162
10521
|
if (reader && reader.size !== UNDEFINED_VALUE) {
|
|
@@ -10169,9 +10528,18 @@
|
|
|
10169
10528
|
if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
|
|
10170
10529
|
throw new Error(ERR_INVALID_READER_OPTIONS);
|
|
10171
10530
|
}
|
|
10531
|
+
if (readerOptions) {
|
|
10532
|
+
checkPassThroughValue(readerOptions.passThrough);
|
|
10533
|
+
}
|
|
10172
10534
|
return readerOptions;
|
|
10173
10535
|
}
|
|
10174
10536
|
|
|
10537
|
+
function checkPassThroughValue(passThrough) {
|
|
10538
|
+
if (checkPassThroughOption(passThrough) === PASS_THROUGH_COMPRESSED) {
|
|
10539
|
+
throw new Error(ERR_UNSUPPORTED_PASS_THROUGH_VALUE);
|
|
10540
|
+
}
|
|
10541
|
+
}
|
|
10542
|
+
|
|
10175
10543
|
function replaceContent(zipEntry, params) {
|
|
10176
10544
|
const { uncompressedSize } = params;
|
|
10177
10545
|
Object.assign(zipEntry, params, {
|
|
@@ -10200,20 +10568,6 @@
|
|
|
10200
10568
|
return child.directory && child.data === null;
|
|
10201
10569
|
}
|
|
10202
10570
|
|
|
10203
|
-
function getUserExtraField(extraField) {
|
|
10204
|
-
if (extraField) {
|
|
10205
|
-
const userExtraField = new Map();
|
|
10206
|
-
extraField.forEach((field, type) => {
|
|
10207
|
-
if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
|
|
10208
|
-
userExtraField.set(type, field.data);
|
|
10209
|
-
}
|
|
10210
|
-
});
|
|
10211
|
-
if (userExtraField.size) {
|
|
10212
|
-
return userExtraField;
|
|
10213
|
-
}
|
|
10214
|
-
}
|
|
10215
|
-
}
|
|
10216
|
-
|
|
10217
10571
|
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
10218
10572
|
const { onstart, onprogress, onend, onentryprogress } = options;
|
|
10219
10573
|
const selectedEntry = entry;
|
|
@@ -10316,6 +10670,7 @@
|
|
|
10316
10670
|
|
|
10317
10671
|
async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
10318
10672
|
const { onstart, onprogress, onend } = options;
|
|
10673
|
+
checkPassThroughValue(options.passThrough);
|
|
10319
10674
|
const readerOptions = checkReaderOptions(options.readerOptions);
|
|
10320
10675
|
const abortController = new AbortController();
|
|
10321
10676
|
const { signal } = abortController;
|
|
@@ -10391,7 +10746,7 @@
|
|
|
10391
10746
|
if (exportAborted || isExportAborted(signal.reason)) {
|
|
10392
10747
|
return;
|
|
10393
10748
|
}
|
|
10394
|
-
|
|
10749
|
+
throwIfAborted(signal);
|
|
10395
10750
|
}
|
|
10396
10751
|
try {
|
|
10397
10752
|
if (child.directory) {
|
|
@@ -10524,7 +10879,7 @@
|
|
|
10524
10879
|
}
|
|
10525
10880
|
return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent);
|
|
10526
10881
|
} else {
|
|
10527
|
-
throw new Error(
|
|
10882
|
+
throw new Error(ERR_PARENT_NOT_DIRECTORY);
|
|
10528
10883
|
}
|
|
10529
10884
|
}
|
|
10530
10885
|
|
|
@@ -10658,7 +11013,7 @@
|
|
|
10658
11013
|
*/
|
|
10659
11014
|
|
|
10660
11015
|
|
|
10661
|
-
|
|
11016
|
+
i(setDefaultConfiguration);
|
|
10662
11017
|
|
|
10663
11018
|
exports.BlobReader = BlobReader;
|
|
10664
11019
|
exports.BlobWriter = BlobWriter;
|
|
@@ -10666,6 +11021,7 @@
|
|
|
10666
11021
|
exports.Data64URIWriter = Data64URIWriter;
|
|
10667
11022
|
exports.ERR_ABORTED = ERR_ABORTED;
|
|
10668
11023
|
exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
|
|
11024
|
+
exports.ERR_ANCESTOR_ENTRY = ERR_ANCESTOR_ENTRY;
|
|
10669
11025
|
exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
|
|
10670
11026
|
exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
10671
11027
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
@@ -10679,7 +11035,9 @@
|
|
|
10679
11035
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
10680
11036
|
exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
|
|
10681
11037
|
exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
|
|
11038
|
+
exports.ERR_HTTP_STATUS = ERR_HTTP_STATUS;
|
|
10682
11039
|
exports.ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_AUTHENTICATION_CODE;
|
|
11040
|
+
exports.ERR_INVALID_BASE_URI = ERR_INVALID_BASE_URI;
|
|
10683
11041
|
exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
|
|
10684
11042
|
exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
|
|
10685
11043
|
exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
@@ -10689,6 +11047,7 @@
|
|
|
10689
11047
|
exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
|
|
10690
11048
|
exports.ERR_INVALID_DUPLICATES = ERR_INVALID_DUPLICATES;
|
|
10691
11049
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
11050
|
+
exports.ERR_INVALID_ENTRY = ERR_INVALID_ENTRY;
|
|
10692
11051
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
10693
11052
|
exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
|
|
10694
11053
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
@@ -10707,6 +11066,7 @@
|
|
|
10707
11066
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
10708
11067
|
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
10709
11068
|
exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
|
|
11069
|
+
exports.ERR_INVALID_PASS_THROUGH_VALUE = ERR_INVALID_PASS_THROUGH_VALUE;
|
|
10710
11070
|
exports.ERR_INVALID_READER = ERR_INVALID_READER;
|
|
10711
11071
|
exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
|
|
10712
11072
|
exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
|
|
@@ -10717,14 +11077,19 @@
|
|
|
10717
11077
|
exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
|
|
10718
11078
|
exports.ERR_INVALID_UNIX_ID_SIZE = ERR_INVALID_UNIX_ID_SIZE;
|
|
10719
11079
|
exports.ERR_INVALID_UNIX_MODE = ERR_INVALID_UNIX_MODE;
|
|
11080
|
+
exports.ERR_INVALID_URI = ERR_INVALID_URI;
|
|
10720
11081
|
exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
|
|
10721
11082
|
exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
|
|
10722
11083
|
exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
|
|
10723
11084
|
exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
11085
|
+
exports.ERR_PARENT_NOT_DIRECTORY = ERR_PARENT_NOT_DIRECTORY;
|
|
10724
11086
|
exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
|
|
10725
11087
|
exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
11088
|
+
exports.ERR_ROOT_DIRECTORY_NOT_MOVABLE = ERR_ROOT_DIRECTORY_NOT_MOVABLE;
|
|
10726
11089
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
11090
|
+
exports.ERR_TARGET_NOT_DIRECTORY = ERR_TARGET_NOT_DIRECTORY;
|
|
10727
11091
|
exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
|
|
11092
|
+
exports.ERR_UNDEFINED_CRC32 = ERR_UNDEFINED_CRC32;
|
|
10728
11093
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
10729
11094
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
10730
11095
|
exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
|
|
@@ -10736,10 +11101,12 @@
|
|
|
10736
11101
|
exports.ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH;
|
|
10737
11102
|
exports.ERR_UNSUPPORTED_ENCRYPTION_USDZ = ERR_UNSUPPORTED_ENCRYPTION_USDZ;
|
|
10738
11103
|
exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
|
|
11104
|
+
exports.ERR_UNSUPPORTED_PASS_THROUGH_VALUE = ERR_UNSUPPORTED_PASS_THROUGH_VALUE;
|
|
10739
11105
|
exports.ERR_UNSUPPORTED_SPLIT_USDZ = ERR_UNSUPPORTED_SPLIT_USDZ;
|
|
10740
11106
|
exports.ERR_UNSUPPORTED_UINT64 = ERR_UNSUPPORTED_UINT64;
|
|
10741
11107
|
exports.ERR_WORKER_STARTUP_TIMEOUT = ERR_WORKER_STARTUP_TIMEOUT;
|
|
10742
11108
|
exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
|
|
11109
|
+
exports.ERR_WRITER_SIZE_NOT_WRITABLE = ERR_WRITER_SIZE_NOT_WRITABLE;
|
|
10743
11110
|
exports.ERR_ZIP_CRYPTO_LAST_MOD_DATE = ERR_ZIP_CRYPTO_LAST_MOD_DATE;
|
|
10744
11111
|
exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
|
|
10745
11112
|
exports.HttpRangeReader = HttpRangeReader;
|
|
@@ -10753,13 +11120,17 @@
|
|
|
10753
11120
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
10754
11121
|
exports.VERSION = VERSION;
|
|
10755
11122
|
exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
|
|
11123
|
+
exports.WARNING_CLAMPED_LAST_MODIFICATION_DATE = WARNING_CLAMPED_LAST_MODIFICATION_DATE;
|
|
10756
11124
|
exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
|
|
11125
|
+
exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
|
|
10757
11126
|
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
10758
11127
|
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
10759
11128
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
10760
11129
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
10761
11130
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
11131
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
|
|
10762
11132
|
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
11133
|
+
exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
|
|
10763
11134
|
exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
|
|
10764
11135
|
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|
|
10765
11136
|
exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
|