@zip.js/zip.js 2.11.3 → 2.12.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 +444 -114
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +454 -111
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +509 -236
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +522 -233
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +509 -236
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +524 -235
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +525 -236
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +456 -113
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +456 -113
- 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 +457 -114
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +524 -235
- package/index-native.min.js +1 -1
- package/index.cjs +525 -236
- package/index.d.cts +480 -59
- package/index.d.ts +480 -59
- package/index.min.js +1 -1
- package/lib/core/codec-worker-web.js +10 -2
- package/lib/core/codec-worker.js +4 -3
- package/lib/core/configuration.js +20 -5
- package/lib/core/constants.js +2 -0
- package/lib/core/io.js +20 -10
- package/lib/core/options.js +29 -0
- package/lib/core/streams/codec-stream.js +6 -0
- package/lib/core/util/warnings.js +42 -0
- package/lib/core/version.js +1 -1
- package/lib/core/web-worker-base.js +4 -3
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-entry.js +49 -1
- package/lib/core/zip-fs.js +43 -134
- package/lib/core/zip-reader.js +108 -47
- package/lib/core/zip-writer.js +238 -54
- 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/dist/zip-fs.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,20 @@
|
|
|
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')";
|
|
225
|
+
const ERR_ABORTED = "The operation was aborted";
|
|
226
|
+
const ABORT_ERROR_NAME = "AbortError";
|
|
220
227
|
|
|
221
228
|
function checkFunctionOption(value) {
|
|
222
229
|
if (value && typeof value != FUNCTION_TYPE) {
|
|
@@ -232,12 +239,25 @@
|
|
|
232
239
|
return signal || UNDEFINED_VALUE;
|
|
233
240
|
}
|
|
234
241
|
|
|
242
|
+
function throwIfAborted(signal) {
|
|
243
|
+
if (signal && signal.aborted) {
|
|
244
|
+
throw signal.reason === UNDEFINED_VALUE ? new DOMException(ERR_ABORTED, ABORT_ERROR_NAME) : signal.reason;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
235
248
|
function checkPasswordOption(password, rawPassword) {
|
|
236
249
|
if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
|
|
237
250
|
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
238
251
|
}
|
|
239
252
|
}
|
|
240
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
|
+
|
|
241
261
|
function checkInteger(value, maxValue, errorMessage) {
|
|
242
262
|
if (!Number.isInteger(value) || value < 0 || value > maxValue) {
|
|
243
263
|
throw new Error(errorMessage);
|
|
@@ -287,6 +307,8 @@
|
|
|
287
307
|
const MINIMUM_CHUNK_SIZE = 64;
|
|
288
308
|
const MINIMUM_PROPERTY_VALUE = 1;
|
|
289
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)";
|
|
290
312
|
let maxWorkers = 2;
|
|
291
313
|
try {
|
|
292
314
|
if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
|
|
@@ -311,9 +333,9 @@
|
|
|
311
333
|
};
|
|
312
334
|
|
|
313
335
|
const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
|
|
336
|
+
const PROPERTY_NAME_BASE_URI = "baseURI";
|
|
314
337
|
|
|
315
|
-
const
|
|
316
|
-
"baseURI",
|
|
338
|
+
const URI_PROPERTY_NAMES = [
|
|
317
339
|
"wasmURI",
|
|
318
340
|
"workerURI"
|
|
319
341
|
];
|
|
@@ -337,7 +359,8 @@
|
|
|
337
359
|
"DecompressionStreamFallback"
|
|
338
360
|
];
|
|
339
361
|
const CONFIGURABLE_PROPERTY_NAMES = [
|
|
340
|
-
|
|
362
|
+
PROPERTY_NAME_BASE_URI,
|
|
363
|
+
...URI_PROPERTY_NAMES,
|
|
341
364
|
...BOOLEAN_PROPERTY_NAMES,
|
|
342
365
|
...NUMBER_PROPERTY_NAMES,
|
|
343
366
|
...FUNCTION_PROPERTY_NAMES
|
|
@@ -381,6 +404,14 @@
|
|
|
381
404
|
}
|
|
382
405
|
} else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
|
|
383
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
|
+
}
|
|
384
415
|
}
|
|
385
416
|
return propertyValue;
|
|
386
417
|
}
|
|
@@ -414,7 +445,7 @@
|
|
|
414
445
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
415
446
|
}
|
|
416
447
|
|
|
417
|
-
const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='!function(t){"function"==typeof define&&define.amd?define(t):t()}(function(){"use strict";const{Array:t,Object:n,Number:e,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:u,Promise:l,TextEncoder:w,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;t<256;t++){let n=t;for(let t=0;t<8;t++)n=1&n?n>>>1^3988292384:n>>>1;C[0][t]=n}for(let t=0;t<256;t++)for(let n=1;n<8;n++){const e=C[n-1][t];C[n][t]=e>>>8^C[0][255&e]}const[I,A,x,M,P,B,D,F]=C;class R{constructor(t){this.o=t||-1}append(t){let n=0|this.o;const e=0|t.length;let s=0;if(e>=8&&t.buffer){const r=new u(t.buffer,t.byteOffset,e),o=e-8;for(;s<=o;s+=8){const t=n^r.getInt32(s,!0),e=r.getInt32(s+4,!0);n=F[255&t]^D[t>>>8&255]^B[t>>>16&255]^P[t>>>24&255]^M[255&e]^x[e>>>8&255]^A[e>>>16&255]^I[e>>>24&255]}}for(;s<e;s++)n=n>>>8^I[255&(n^t[s])];this.o=n}get(){return~this.o}}class U extends d{constructor(){let t;const n=new R;super({transform(t,e){n.append(t),e.enqueue(t)},flush(){const e=new o(4);new u(e.buffer).setUint32(0,n.get()),t.value=e}}),t=this}}function W(t,n){const e=new o(t.length+n.length);return e.set(t),e.set(n,t.length),e}function _(t){return new u(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,n){if(0===t.length||0===n.length)return t.concat(n);const e=t[t.length-1],s=T.l(e);return 32===s?t.concat(n):T.h(n,s,0|e,t.slice(0,t.length-1))},bitLength(t){const n=t.length;if(0===n)return 0;const e=t[n-1];return 32*(n-1)+T.l(e)},m(t,n){if(32*t.length<n)return t;const e=(t=t.slice(0,s.ceil(n/32))).length;return n&=31,e>0&&n&&(t[e-1]=T.S(n,t[e-1]&2147483648>>n-1,1)),t},S:(t,n,e)=>32===t?n:(e?0|n:n<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,n,e,s){for(void 0===s&&(s=[]);n>=32;n-=32)s.push(e),e=0;if(0===n)return s.concat(t);for(let r=0;r<t.length;r++)s.push(e|t[r]>>>n),e=t[r]<<32-n;const r=t.length?t[t.length-1]:0,o=T.l(r);return s.push(T.S(n+o&31,n+o>32?e:s.pop(),1)),s}},V={bytes:{v(t){const n=T.bitLength(t)/8,e=new o(n);let s;for(let r=0;r<n;r++)3&r||(s=t[r/4]),e[r]=s>>>24,s<<=8;return e},C(t){const n=[];let e,s=0;for(e=0;e<t.length;e++)s=s<<8|t[e],3&~e||(n.push(s),s=0);return 3&e&&n.push(T.S(8*(3&e),s)),n}}},K=class{constructor(t){const n=this;n.blockSize=512,n.I=[1732584193,4023233417,2562383102,271733878,3285377520],n.A=[1518500249,1859775393,2400959708,3395469782],t?(n.M=t.M.slice(0),n.P=t.P.slice(0),n.B=t.B):n.reset()}reset(){const t=this;return t.M=t.I.slice(0),t.P=[],t.B=0,t}update(t){const n=this;"string"==typeof t&&(t=V.D.C(t));const e=n.P=T.concat(n.P,t),s=n.B,o=n.B=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(e);let a=0;for(let t=n.blockSize+s-(n.blockSize+s&n.blockSize-1);t<=o;t+=n.blockSize)n.F(c.subarray(16*a,16*(a+1))),a+=1;return e.splice(0,16*a),n}R(){const t=this;let n=t.P;const e=t.M;n=T.concat(n,[T.S(1,1)]);for(let t=n.length+2;15&t;t++)n.push(0);for(n.push(s.floor(t.B/4294967296)),n.push(0|t.B);n.length;)t.F(n.splice(0,16));return t.reset(),e}U(t,n,e,s){return t<=19?n&e|~n&s:t<=39?n^e^s:t<=59?n&e|n&s|e&s:t<=79?n^e^s:void 0}W(t,n){return n<<t|n>>>32-t}F(n){const e=this,r=e.M,o=t(80);for(let t=0;t<16;t++)o[t]=n[t];let c=r[0],i=r[1],a=r[2],f=r[3],u=r[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=e.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const n=e.W(5,c)+e.U(t,i,a,f)+u+o[t]+e.A[s.floor(t/20)]|0;u=f,f=a,a=e.W(30,i),i=c,c=n}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+u|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(t,n,e,s){if(e=e||1e4,s<0||e<0)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,l;const w=new ArrayBuffer(o),h=new u(w);let p=0;const d=T;for(n=V.bytes.C(n),l=1;p<(o||1);l++){for(c=i=t.encrypt(d.concat(n,[l])),a=1;a<e;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;p<(o||1)&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return w.slice(0,s/8)},_:class{constructor(t){const n=this,e=n.V=K,s=[[],[]];n.K=[new e,new e];const r=n.K[0].blockSize/32;t.length>r&&(t=(new e).update(t).R());for(let n=0;n<r;n++)s[0][n]=909522486^t[n],s[1][n]=1549556828^t[n];n.K[0].update(s[0]),n.K[1].update(s[1]),n.L=new e(n.K[0])}reset(){const t=this;t.L=new t.V(t.K[0]),t.O=!1}update(t){this.O=!0,this.L.update(t)}digest(){const t=this,n=t.L.R(),e=new t.V(t.K[1]).update(n).R();return t.reset(),e}encrypt(t){if(this.O)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==k,O="Invalid password",j="zipjs-abort-check-password";function H(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const N=16,q={name:"PBKDF2"},G=n.assign({hash:{name:"HMAC"}},q),J=n.assign({iterations:1e3,hash:{name:"SHA-1"}},q),Q=["deriveBits"],X=[8,12,16],Y=[16,24,32],Z=10,$=[0,0,0,0],tt=typeof h!=b,nt=tt&&h.subtle,et=tt&&typeof nt!=b,st=V.bytes,rt=class{constructor(t){const n=this;n.j=[[[],[],[],[],[]],[[],[],[],[],[]]],n.j[0][0][0]||n.H();const e=n.j[0][4],s=n.j[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(n.A=[i=t.slice(0),a=[]],c=o;c<4*o+28;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=e[t>>>24]<<24^e[t>>16&255]<<16^e[t>>8&255]<<8^e[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const n=i[3&t?c:c-4];a[t]=c<=4||t<4?n:s[0][e[n>>>24]]^s[1][e[n>>16&255]]^s[2][e[n>>8&255]]^s[3][e[255&n]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],n=this.j[1],e=t[4],s=n[4],r=[],o=[];let c,i,a,f;for(let t=0;t<256;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let u=c=0;!e[u];u^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,e[u]=o,s[o]=u,f=r[a=r[i=r[u]]];let l=16843009*f^65537*a^257*i^16843008*u,w=257*r[o]^16843008*o;for(let e=0;e<4;e++)t[e][u]=w=w<<24^w>>>8,n[e][o]=l=l<<24^l>>>8}for(let e=0;e<5;e++)t[e]=t[e].slice(0),n[e]=n[e].slice(0)}N(t,n){if(4!==t.length)throw new r("invalid aes block size");const e=this.A[n],s=e.length/4-2,o=[0,0,0,0],c=this.j[n],i=c[0],a=c[1],f=c[2],u=c[3],l=c[4];let w,h,p,d=t[0]^e[0],y=t[n?3:1]^e[1],m=t[2]^e[2],S=t[n?1:3]^e[3],g=4;for(let t=0;t<s;t++)w=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^u[255&S]^e[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^u[255&d]^e[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^u[255&y]^e[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^u[255&m]^e[g+3],g+=4,d=w,y=h,m=p;for(let t=0;t<4;t++)o[n?3&-t:t]=l[d>>>24]<<24^l[y>>16&255]<<16^l[m>>8&255]<<8^l[255&S]^e[g++],w=d,d=y,y=m,m=S,S=w;return o}},ot=class{constructor(t,n){this.G=t,this.J=n,this.X=n}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let n=t>>16&255,e=t>>8&255,s=255&t;255===n?(n=0,255===e?(e=0,255===s?s=0:++s):++e):++n,t=0,t+=n<<16,t+=e<<8,t+=s}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,n,e){let s;if(!(s=n.length))return[];const r=T.bitLength(n);for(let r=0;r<s;r+=4){this.$(e);const s=t.encrypt(e);n[r]^=s[0],n[r+1]^=s[1],n[r+2]^=s[2],n[r+3]^=s[3]}return T.m(n,r)}},ct=E._;let it=tt&&et&&typeof nt.importKey==k,at=tt&&et&&typeof nt.deriveBits==k;class ft extends d{constructor({password:t,rawPassword:n,encryptionStrength:e,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:c,strength:i,nt:a,ready:f}=e;c?(await async function(t,n,e,s){const o=await ht(t,n,e,dt(s,0,X[n])),c=dt(s,X[n]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)}(e,i,c,dt(t,0,X[i]+2)),t=dt(t,X[i]+2),s?n.error(new r(j)):a()):await f;const u=new o(t.length-Z-(t.length-Z)%N);n.enqueue(wt(e,t,u,0,Z,!0))},async flush(t){const{et:n,st:e,ot:s,ready:o}=this;if(e&&n){await o;const i=dt(s,0,s.length-Z),a=dt(s,s.length-Z);let f=z;if(i.length){const t=mt(st,i);e.update(t);const s=n.update(t);f=yt(st,s)}const u=dt(yt(st,e.digest()),0,Z);let l=s.length<Z?1:0;for(let t=0;t<Z;t++)l|=u[t]^a[t];if(l&&c)throw new r("Invalid authentication code");t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:n,encryptionStrength:e}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:s,strength:r,nt:c,ready:i}=e;let a=z;s?(a=await async function(t,n,e){const s=H(new o(X[n]));return W(s,await ht(t,n,e,s))}(e,r,s),c()):await i;const f=new o(a.length+t.length-t.length%N);f.set(a,0),n.enqueue(wt(e,t,f,a.length,0))},async flush(t){const{et:n,st:e,ot:s,ready:r}=this;if(e&&n){await r;let o=z;if(s.length){const t=n.update(mt(st,s));e.update(t),o=yt(st,t)}const c=yt(st,e.digest()).slice(0,Z);t.enqueue(W(o,c))}}})}}function lt(t,e,s,r){n.assign(t,{ready:new l(n=>t.nt=n),password:pt(e,s),strength:r-1,ot:z})}function wt(t,n,e,s,r,c){const{et:i,st:a,ot:f}=t;f.length&&(n=W(f,n));const u=n.length-r;let l;for(e=function(t,n){if(n&&n>t.length){const e=t;(t=new o(n)).set(e,0)}return t}(e,s+(u-u%N)),l=0;l<=u-N;l+=N){const t=mt(st,dt(n,l,l+N));c&&a.update(t);const r=i.update(t);c||a.update(r),e.set(yt(st,r),l+s)}return t.ot=dt(n,l),e}async function ht(e,s,r,c){e.password=null;const i=await async function(t,n,e,s,r){if(!it)return E.importKey(n);try{return await nt.importKey("raw",n,e,!1,r)}catch{return it=!1,E.importKey(n)}}(0,r,G,0,Q),a=await async function(t,n,e){if(!at)return E.T(n,t.salt,J.iterations,e);try{return await nt.deriveBits(t,n,e)}catch{return at=!1,E.T(n,t.salt,J.iterations,e)}}(n.assign({salt:c},J),i,8*(2*Y[s]+2)),f=new o(a),u=mt(st,dt(f,0,Y[s])),l=mt(st,dt(f,Y[s],2*Y[s])),w=dt(f,2*Y[s]);return n.assign(e,{keys:{key:u,ct:l,passwordVerification:w},et:new ot(new rt(u),t.from($)),st:new ct(l)}),w}function pt(t,n){return n===v?function(t){if(typeof w==b){t=unescape(encodeURIComponent(t));const n=new o(t.length);for(let e=0;e<n.length;e++)n[e]=t.charCodeAt(e);return n}return(new w).encode(t)}(t):n}function dt(t,n,e){return t.subarray(n,e)}function yt(t,n){return t.v(n)}function mt(t,n){return t.C(n)}class St extends d{constructor({password:t,rawPassword:n,passwordVerification:e,checkPasswordOnly:s}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;if(e.password||e.rawPassword){const n=bt(e,t.subarray(0,12));if(e.password=e.rawPassword=null,0!=(n[11]^e.passwordVerification))throw new r(O);t=t.subarray(12)}s?n.error(new r(j)):n.enqueue(bt(e,t))}})}}class gt extends d{constructor({password:t,rawPassword:n,passwordVerification:e}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;let s,r;if(e.password||e.rawPassword){e.password=e.rawPassword=null;const n=H(new o(12));n[11]=e.passwordVerification,s=new o(t.length+n.length),s.set(kt(e,n),0),r=12}else s=new o(t.length),r=0;s.set(kt(e,t),r),n.enqueue(s)}})}}function vt(t,e,s,r){n.assign(t,{password:e,rawPassword:s,passwordVerification:r}),function(t,e,s){const r=[305419896,591751049,878082192];if(n.assign(t,{keys:r,it:new R(r[0]),ft:new R(r[2])}),s)for(let n=0;n<s.length;n++)zt(t,s[n]);else for(let n=0;n<e.length;n++)zt(t,e.charCodeAt(n))}(t,e,s)}function bt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,e[s]);return e}function kt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,n[s]);return e}function zt(t,n){let[,e]=t.keys;t.it.append([n]);const r=~t.it.get();e=At(s.imul(At(e+It(r)),134775813)+1),t.ft.append([e>>>24]);const o=~t.ft.get();t.keys=[r,e,o]}function Ct(t){const n=2|t.keys[2];return It(s.imul(n,1^n)>>>8)}function It(t){return 255&t}function At(t){return 4294967295&t}function xt(t){if(t instanceof y)return t;const n=t.getReader();return new y({async pull(t){const{value:e,done:s}=await n.read();s?t.close():t.enqueue(e)},cancel:t=>n.cancel(t)})}const Mt=new f;function Pt(t){return Mt.get(t)}const Bt="Invalid uncompressed size",Dt="deflate-raw",Ft="gzip",Rt=[31,139,8];class Ut extends d{constructor(t,{chunkSize:n,CompressionStreamFallback:e,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:l,format:w,compressionMethod:h,inputSize:p}=t,d=this;let y,m,S,g=super.readable;const v=w&&Pt(w),b=a&&r&&!l&&!v&&(!o||i)&&Boolean(c&&s);if(o&&!i||!a||b||(y=new U,g=Lt(g,y)),r)if(v)g=Ot(g,Kt(v.CompressionStream,w,{level:f,chunkSize:n,compressionMethod:h,uncompressedSize:p}));else if(b)S=new Wt,g=Ot(g,new s(Ft)),g=Lt(g,S);else try{g=Et(g,c,{level:f,chunkSize:n},s,e)}catch(t){let n;try{n=new s(Ft)}catch{throw t}g=Ot(g,n),g=Lt(g,new Wt)}o&&(i?g=Lt(g,new gt(t)):(m=new ut(t),g=Lt(g,m))),Vt(d,g,()=>{o&&!i||!a||(d.crc32=b?S.crc32:new u(y.value.buffer).getUint32(0))})}}class Wt extends d{constructor(){let t,n=10,e=new o(0);super({transform(t,r){if(n){const e=s.min(n,t.length);if(n-=e,!(t=t.subarray(e)).length)return}const o=e.length+t.length;if(o<=8)return void(e=W(e,t));const c=o-8,i=s.min(c,e.length);r.enqueue(W(e.subarray(0,i),t.subarray(0,c-i))),e=W(e.subarray(i),t.subarray(c-i))},flush(){const n=_(e);t.crc32=n.getUint32(0,!0),t.uncompressedSize=n.getUint32(4,!0)}}),t=this}}class _t extends d{constructor(t,{chunkSize:n,DecompressionStreamFallback:e,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:w,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=Lt(C,new St(t)):(z=new ft(t),C=Lt(C,z))),w){const t=m&&Pt(m);if(t)C=Ot(C,Kt(t.DecompressionStream,m,{chunkSize:n,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=Et(C,h,{chunkSize:n,deflate64:p},s,e)}catch(t){if(p||b===v)throw t;let n;try{n=new s(Ft)}catch{throw t}C=function(t,n,e){const s=new R;let c,i,a,f=0,u=!1;const w=new l((t,n)=>{i=t,a=n});w.catch(()=>{}),e||i();const h=new d({start(t){const n=new o(10);n.set(Rt),t.enqueue(n)},transform(t,n){n.enqueue(t)},async flush(t){u=!0,y();try{await w}finally{m()}const n=new o(8),r=_(n);r.setUint32(0,s.get(),!0),r.setUint32(4,e,!0),t.enqueue(n)},cancel(t){a(t)}}),p=new d({transform(t,n){s.append(t),f+=t.length,f>=e?i():u&&y(),n.enqueue(t)},cancel(t){a(t)}});return t=Lt(t,h),Lt(t=Ot(t,n),p);function y(){m(),c=setTimeout(()=>a(new r(Bt)),5e3)}function m(){clearTimeout(c)}}(C,n,b)}C=function(t){const n=t.getReader();return new y({async pull(t){let e;try{e=await n.read()}catch(t){if(t&&t.message)throw t;const n=new r("Invalid compressed data");throw n.cause=t,n}const{value:s,done:o}=e;o?t.close():t.enqueue(s)},cancel:t=>n.cancel(t)})}(C)}a&&(k=new U,C=Lt(C,k)),Vt(this,C,()=>{if(a){const t=new u(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r("Invalid CRC32")}})}}const Tt=new f;function Vt(t,e,s){e=Lt(e,new d({flush:s})),n.defineProperty(t,"readable",{get:()=>e})}function Kt(t,n,e){if(!t)throw new r("Compression method not supported");return new t(n,e)}function Et(t,n,e,s,r){const o=n&&s?s:r||s,c=e.deflate64?"deflate64-raw":Dt;let i;try{i=new o(c,e)}catch(t){if(!n||!r||o==r)throw t;i=new r(c,e)}return Ot(t,i)}function Lt(t,n){return xt(t).pipeThrough(n)}function Ot(t,n){const e=n.writable.getWriter(),s=t.getReader();return async function(){try{for(;;){await e.ready;const t=await s.read();if(t.done){await e.close();break}await e.write(t.value)}}catch(t){await async function(t,n){try{await t.abort(n)}catch{}}(e,t),await async function(t,n){try{await t.cancel(n)}catch{}}(s,t)}}(),n.readable}const jt="data",Ht="close",Nt="deflate";class qt extends d{constructor(t,e){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Nt)?c=Ut:o.startsWith("inflate")&&(c=_t),s.outputSize=0;let i=0;const a=new c(t,e),f=super.readable,u=new d({transform(t,n){t&&t.length&&(i+=t.length,n.enqueue(t))},flush(){n.assign(s,{inputSize:i})}}),l=new d({transform(n,e){if(n&&n.length&&(e.enqueue(n),s.outputSize+=n.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Bt)},flush(){const{crc32:t}=a;n.assign(s,{crc32:t,inputSize:i})}});n.defineProperty(s,"readable",{get:()=>f.pipeThrough(u).pipeThrough(a).pipeThrough(l)})}}class Gt extends d{constructor(t){const n=[];let s=0;function r(){const e=new o(t);let r=0;for(;r<t;){const s=n[0],o=t-r;s.length<=o?(e.set(s,r),r+=s.length,n.shift()):(e.set(s.subarray(0,o),r),n[0]=s.subarray(o),r+=o)}return s-=t,e}(!e.isFinite(t)||t<1)&&(t=65536),super({transform(e,o){for(n.push(e),s+=e.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(function(t,n){const e=new o(n);let s=0;for(const n of t)e.set(n,s),s+=n.length;return e}(n,s))}})}}let Jt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Jt=navigator.hardwareConcurrency)}catch{}const Qt=new f,Xt=new f;let Yt,Zt=0;async function $t(t){let n,o;try{const{options:c,config:i}=t;if(c.format)try{await async function(t,n){!Mt.has(t)&&n&&function(t,n){const{CompressionStream:e,DecompressionStream:s}=n;if(typeof e!=k&&typeof s!=k)throw new r("Invalid codec module");Mt.set(t,{CompressionStream:e,DecompressionStream:s})}(t,await(import(n)))}(c.format,c.codecURI)}catch(t){throw t.codecImportFailed=!0,t}if(i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream,c.compressed&&!c.format)if(c.useCompressionStream){if(!function(t,n){if(!t)return!1;let e=Tt.get(t);e||(e=new f,Tt.set(t,e));let s=e.get(n);if(s===v){try{new t(n),s=!0}catch{s=!1}e.set(n,s)}return s}(c.codecType.startsWith(Nt)?i.CompressionStream:i.DecompressionStream,Dt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{c.useCompressionStream=!0}!i.CompressionStreamFallback&&i.CompressionStreamZlib&&(i.CompressionStreamFallback=i.CompressionStreamZlib),!i.DecompressionStreamFallback&&i.DecompressionStreamZlib&&(i.DecompressionStreamFallback=i.DecompressionStreamZlib);const a={highWaterMark:1},u=t.readable?xt(t.readable):new y({async pull(t){const n=new l(t=>Qt.set(Zt,t));tn({type:"pull",messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER;const{value:s,done:r}=await n;t.enqueue(s),r&&t.close()}},a);o=t.writable?function(t){if(t instanceof m)return t;const n=t.getWriter();return new m({write:t=>n.write(t),close:()=>n.close(),abort:t=>n.abort(t)})}(t.writable):new m({async write(t){let n;const s=new l(t=>n=t);Xt.set(Zt,n),tn({type:jt,value:t,messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER,await s}},a),n=new qt(c,i),Yt=new AbortController;const{signal:w}=Yt;await u.pipeThrough(n).pipeThrough(new Gt(function(t){return r="string"==typeof(n=r=t.chunkSize)&&n.trim()?e(n):n,e.isInteger(r)&&r>=1?s.max(r,64):65536;var n,r}(i))).pipeTo(o,{signal:w,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{crc32:h,inputSize:p,outputSize:d}=n;tn({type:Ht,result:{crc32:h,inputSize:p,outputSize:d}})}catch(t){if(t.outputSize=n?n.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}nn(t)}}function tn(t){const{value:n}=t;if(n)if(n.length)try{t.value=(e=n,e.byteOffset||e.byteLength!=e.buffer.byteLength?new o(e):e).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var e}function nn(t=new r("Unknown error")){const{message:n,stack:e,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:n,stack:e,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}addEventListener("message",({data:t})=>{const{type:n,messageId:e,value:s,done:r}=t;try{if("start"==n&&$t(t),n==jt){const t=Qt.get(e);Qt.delete(e),t({value:s||new o,done:r})}if("ack"==n){const t=Xt.get(e);Xt.delete(e),t()}n==Ht&&Yt.abort()}catch(t){nn(t)}}),p({type:"ready"});const en="deflate",sn="deflate-raw",rn="deflate64-raw",on="gzip";let cn,an,fn,un,ln;function wn(t,n,e={}){if(!cn){const t=new r("WASM module not loaded");throw t.cause=ln,t}const c="number"==typeof e.level?e.level:-1,i="number"==typeof e.outBuffer?e.outBuffer:65536,a="number"==typeof e.inBufferSize?e.inBufferSize:65536;return new d({start(){try{let e;if(this.ut=an(i),this.in=an(a),this.inBufferSize=a,!this.ut||!this.in)throw new r("allocation failed");if(this.lt=new o(i),t?(this.wt=cn.deflate_process,this.ht=cn.deflate_last_consumed,this.yt=cn.deflate_end,this.St=cn.deflate_new(),e=n===on?cn.deflate_init_gzip(this.St,c):n===sn?cn.deflate_init_raw(this.St,c):cn.deflate_init(this.St,c)):n===rn?(this.wt=cn.inflate9_process,this.ht=cn.inflate9_last_consumed,this.yt=cn.inflate9_end,this.St=cn.inflate9_new(),e=cn.inflate9_init_raw(this.St)):(this.wt=cn.inflate_process,this.ht=cn.inflate_last_consumed,this.yt=cn.inflate_end,this.St=cn.inflate_new(),e=n===sn?cn.inflate_init_raw(this.St):n===on?cn.inflate_init_gzip(this.St):cn.inflate_init(this.St)),0!==e)throw new r("init failed:"+e)}catch(t){throw f(this),t}},transform(t,n){try{const e=t,c=new o(un.buffer),a=this.wt,f=this.ht,u=this.ut,l=this.lt;let w=0;for(;w<e.length;){const t=s.min(e.length-w,32768);if((!this.in||this.inBufferSize<t)&&(this.in&&fn&&(fn(this.in),this.in=0),this.in=an(t),this.inBufferSize=t,!this.in))throw new r("allocation failed");c.set(e.subarray(w,w+t),this.in);const o=a(this.St,this.in,t,u,i,0),h=o>>24&255,p=128&h?h-256:h;if(p<0)throw new r("process error:"+p);const d=16777215&o;d&&(l.set(c.subarray(u,u+d),0),n.enqueue(l.slice(0,d)));const y=f(this.St);if(0===y&&0===d)break;w+=y}}catch(t){f(this),n.error(t)}},flush(t){try{const n=new o(un.buffer),e=this.wt,s=this.ut,c=this.lt;for(;;){const o=e(this.St,0,0,s,i,4),a=o>>24&255,f=128&a?a-256:a;if(f<0)throw new r("process error:"+f);const u=16777215&o;if(u&&(c.set(n.subarray(s,s+u),0),t.enqueue(c.slice(0,u))),1===a||0===u)break}}catch(n){t.error(n)}finally{const n=f(this);0!==n&&t.error(new r("end error:"+n))}},cancel(){f(this)}});function f(t){let n=0;return t.St&&t.yt&&(n=t.yt(t.St)),t.St=0,t.in&&fn&&fn(t.in),t.in=0,t.ut&&fn&&fn(t.ut),t.ut=0,n}}class hn{constructor(t=en,n){return wn(!0,t,n)}}class pn{constructor(t=en,n){return wn(!1,t,n)}}hn.gt=!0,pn.gt=!0,hn.vt=[en,sn,on],pn.vt=[en,sn,on,rn];let dn=!1;!function(t={}){const{init:n}=t,e=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{n&&await n(t),e&&(t.CompressionStreamFallback=e),s&&(t.DecompressionStreamFallback=s)}}({CompressionStreamFallback:hn,DecompressionStreamFallback:pn,init:t=>async function(t,{baseURI:n}){if(!dn)try{await async function(t,n){let e,s;try{try{s=new URL(t,n)}catch{}const r=await fetch(s);e=await r.arrayBuffer()}catch(n){if(!t.startsWith("data:application/wasm;base64,"))throw n;e=function(t){const n=t.split(",")[1],e=atob(n),s=e.length,r=new o(s);for(let t=0;t<s;++t)r[t]=e.charCodeAt(t);return r.buffer}(t)}!function(t){if(cn=t,({malloc:an,free:fn,memory:un}=cn),"function"!=typeof an||"function"!=typeof fn||!un)throw cn=an=fn=un=null,new r("Invalid WASM module")}((await WebAssembly.instantiate(e)).instance.exports)}(t,n),dn=!0}catch(t){throw function(t){ln=t}(t),t}}(t.wasmURI,t)})});\n';if("string"==typeof s&&(s=(new TextEncoder).encode(s)),t){const t=new Blob([s],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+function(t){let n="";const s=t.length;let r=0;for(;r+2<s;r+=3){const s=t[r]<<16|t[r+1]<<8|t[r+2];n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+e$1[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e$1[s>>18&63]+e$1[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+"=";}return n}(s)}});
|
|
448
|
+
const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='!function(t){"function"==typeof define&&define.amd?define(t):t()}(function(){"use strict";const{Array:t,Object:n,Number:e,Math:s,Error:r,Uint8Array:o,Uint16Array:c,Uint32Array:i,Int32Array:a,Map:f,DataView:u,Promise:l,TextEncoder:w,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;t<256;t++){let n=t;for(let t=0;t<8;t++)n=1&n?n>>>1^3988292384:n>>>1;C[0][t]=n}for(let t=0;t<256;t++)for(let n=1;n<8;n++){const e=C[n-1][t];C[n][t]=e>>>8^C[0][255&e]}const[I,A,x,M,P,B,D,F]=C;class R{constructor(t){this.o=t||-1}append(t){let n=0|this.o;const e=0|t.length;let s=0;if(e>=8&&t.buffer){const r=new u(t.buffer,t.byteOffset,e),o=e-8;for(;s<=o;s+=8){const t=n^r.getInt32(s,!0),e=r.getInt32(s+4,!0);n=F[255&t]^D[t>>>8&255]^B[t>>>16&255]^P[t>>>24&255]^M[255&e]^x[e>>>8&255]^A[e>>>16&255]^I[e>>>24&255]}}for(;s<e;s++)n=n>>>8^I[255&(n^t[s])];this.o=n}get(){return~this.o}}class U extends d{constructor(){let t;const n=new R;super({transform(t,e){n.append(t),e.enqueue(t)},flush(){const e=new o(4);new u(e.buffer).setUint32(0,n.get()),t.value=e}}),t=this}}function W(t,n){const e=new o(t.length+n.length);return e.set(t),e.set(n,t.length),e}function _(t){return new u(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,n){if(0===t.length||0===n.length)return t.concat(n);const e=t[t.length-1],s=T.l(e);return 32===s?t.concat(n):T.h(n,s,0|e,t.slice(0,t.length-1))},bitLength(t){const n=t.length;if(0===n)return 0;const e=t[n-1];return 32*(n-1)+T.l(e)},m(t,n){if(32*t.length<n)return t;const e=(t=t.slice(0,s.ceil(n/32))).length;return n&=31,e>0&&n&&(t[e-1]=T.S(n,t[e-1]&2147483648>>n-1,1)),t},S:(t,n,e)=>32===t?n:(e?0|n:n<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(t,n,e,s){for(void 0===s&&(s=[]);n>=32;n-=32)s.push(e),e=0;if(0===n)return s.concat(t);for(let r=0;r<t.length;r++)s.push(e|t[r]>>>n),e=t[r]<<32-n;const r=t.length?t[t.length-1]:0,o=T.l(r);return s.push(T.S(n+o&31,n+o>32?e:s.pop(),1)),s}},V={bytes:{v(t){const n=T.bitLength(t)/8,e=new o(n);let s;for(let r=0;r<n;r++)3&r||(s=t[r/4]),e[r]=s>>>24,s<<=8;return e},C(t){const n=[];let e,s=0;for(e=0;e<t.length;e++)s=s<<8|t[e],3&~e||(n.push(s),s=0);return 3&e&&n.push(T.S(8*(3&e),s)),n}}},K=class{constructor(t){const n=this;n.blockSize=512,n.I=[1732584193,4023233417,2562383102,271733878,3285377520],n.A=[1518500249,1859775393,2400959708,3395469782],t?(n.M=t.M.slice(0),n.P=t.P.slice(0),n.B=t.B):n.reset()}reset(){const t=this;return t.M=t.I.slice(0),t.P=[],t.B=0,t}update(t){const n=this;"string"==typeof t&&(t=V.D.C(t));const e=n.P=T.concat(n.P,t),s=n.B,o=n.B=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(e);let a=0;for(let t=n.blockSize+s-(n.blockSize+s&n.blockSize-1);t<=o;t+=n.blockSize)n.F(c.subarray(16*a,16*(a+1))),a+=1;return e.splice(0,16*a),n}R(){const t=this;let n=t.P;const e=t.M;n=T.concat(n,[T.S(1,1)]);for(let t=n.length+2;15&t;t++)n.push(0);for(n.push(s.floor(t.B/4294967296)),n.push(0|t.B);n.length;)t.F(n.splice(0,16));return t.reset(),e}U(t,n,e,s){return t<=19?n&e|~n&s:t<=39?n^e^s:t<=59?n&e|n&s|e&s:t<=79?n^e^s:void 0}W(t,n){return n<<t|n>>>32-t}F(n){const e=this,r=e.M,o=t(80);for(let t=0;t<16;t++)o[t]=n[t];let c=r[0],i=r[1],a=r[2],f=r[3],u=r[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=e.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const n=e.W(5,c)+e.U(t,i,a,f)+u+o[t]+e.A[s.floor(t/20)]|0;u=f,f=a,a=e.W(30,i),i=c,c=n}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+u|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(t,n,e,s){if(e=e||1e4,s<0||e<0)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,l;const w=new ArrayBuffer(o),h=new u(w);let p=0;const d=T;for(n=V.bytes.C(n),l=1;p<(o||1);l++){for(c=i=t.encrypt(d.concat(n,[l])),a=1;a<e;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;p<(o||1)&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return w.slice(0,s/8)},_:class{constructor(t){const n=this,e=n.V=K,s=[[],[]];n.K=[new e,new e];const r=n.K[0].blockSize/32;t.length>r&&(t=(new e).update(t).R());for(let n=0;n<r;n++)s[0][n]=909522486^t[n],s[1][n]=1549556828^t[n];n.K[0].update(s[0]),n.K[1].update(s[1]),n.L=new e(n.K[0])}reset(){const t=this;t.L=new t.V(t.K[0]),t.O=!1}update(t){this.O=!0,this.L.update(t)}digest(){const t=this,n=t.L.R(),e=new t.V(t.K[1]).update(n).R();return t.reset(),e}encrypt(t){if(this.O)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==k,O="Invalid password",j="zipjs-abort-check-password";function H(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const N=16,q={name:"PBKDF2"},G=n.assign({hash:{name:"HMAC"}},q),J=n.assign({iterations:1e3,hash:{name:"SHA-1"}},q),Q=["deriveBits"],X=[8,12,16],Y=[16,24,32],Z=10,$=[0,0,0,0],tt=typeof h!=b,nt=tt&&h.subtle,et=tt&&typeof nt!=b,st=V.bytes,rt=class{constructor(t){const n=this;n.j=[[[],[],[],[],[]],[[],[],[],[],[]]],n.j[0][0][0]||n.H();const e=n.j[0][4],s=n.j[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(n.A=[i=t.slice(0),a=[]],c=o;c<4*o+28;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=e[t>>>24]<<24^e[t>>16&255]<<16^e[t>>8&255]<<8^e[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const n=i[3&t?c:c-4];a[t]=c<=4||t<4?n:s[0][e[n>>>24]]^s[1][e[n>>16&255]]^s[2][e[n>>8&255]]^s[3][e[255&n]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],n=this.j[1],e=t[4],s=n[4],r=[],o=[];let c,i,a,f;for(let t=0;t<256;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let u=c=0;!e[u];u^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,e[u]=o,s[o]=u,f=r[a=r[i=r[u]]];let l=16843009*f^65537*a^257*i^16843008*u,w=257*r[o]^16843008*o;for(let e=0;e<4;e++)t[e][u]=w=w<<24^w>>>8,n[e][o]=l=l<<24^l>>>8}for(let e=0;e<5;e++)t[e]=t[e].slice(0),n[e]=n[e].slice(0)}N(t,n){if(4!==t.length)throw new r("invalid aes block size");const e=this.A[n],s=e.length/4-2,o=[0,0,0,0],c=this.j[n],i=c[0],a=c[1],f=c[2],u=c[3],l=c[4];let w,h,p,d=t[0]^e[0],y=t[n?3:1]^e[1],m=t[2]^e[2],S=t[n?1:3]^e[3],g=4;for(let t=0;t<s;t++)w=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^u[255&S]^e[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^u[255&d]^e[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^u[255&y]^e[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^u[255&m]^e[g+3],g+=4,d=w,y=h,m=p;for(let t=0;t<4;t++)o[n?3&-t:t]=l[d>>>24]<<24^l[y>>16&255]<<16^l[m>>8&255]<<8^l[255&S]^e[g++],w=d,d=y,y=m,m=S,S=w;return o}},ot=class{constructor(t,n){this.G=t,this.J=n,this.X=n}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let n=t>>16&255,e=t>>8&255,s=255&t;255===n?(n=0,255===e?(e=0,255===s?s=0:++s):++e):++n,t=0,t+=n<<16,t+=e<<8,t+=s}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,n,e){let s;if(!(s=n.length))return[];const r=T.bitLength(n);for(let r=0;r<s;r+=4){this.$(e);const s=t.encrypt(e);n[r]^=s[0],n[r+1]^=s[1],n[r+2]^=s[2],n[r+3]^=s[3]}return T.m(n,r)}},ct=E._;let it=tt&&et&&typeof nt.importKey==k,at=tt&&et&&typeof nt.deriveBits==k;class ft extends d{constructor({password:t,rawPassword:n,encryptionStrength:e,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:c,strength:i,nt:a,ready:f}=e;c?(await async function(t,n,e,s){const o=await ht(t,n,e,dt(s,0,X[n])),c=dt(s,X[n]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)}(e,i,c,dt(t,0,X[i]+2)),t=dt(t,X[i]+2),s?n.error(new r(j)):a()):await f;const u=new o(t.length-Z-(t.length-Z)%N);n.enqueue(wt(e,t,u,0,Z,!0))},async flush(t){const{et:n,st:e,ot:s,ready:o}=this;if(e&&n){await o;const i=dt(s,0,s.length-Z),a=dt(s,s.length-Z);let f=z;if(i.length){const t=mt(st,i);e.update(t);const s=n.update(t);f=yt(st,s)}const u=dt(yt(st,e.digest()),0,Z);let l=s.length<Z?1:0;for(let t=0;t<Z;t++)l|=u[t]^a[t];if(l&&c)throw new r("Invalid authentication code");t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:n,encryptionStrength:e}){super({start(){lt(this,t,n,e)},async transform(t,n){const e=this,{password:s,strength:r,nt:c,ready:i}=e;let a=z;s?(a=await async function(t,n,e){const s=H(new o(X[n]));return W(s,await ht(t,n,e,s))}(e,r,s),c()):await i;const f=new o(a.length+t.length-t.length%N);f.set(a,0),n.enqueue(wt(e,t,f,a.length,0))},async flush(t){const{et:n,st:e,ot:s,ready:r}=this;if(e&&n){await r;let o=z;if(s.length){const t=n.update(mt(st,s));e.update(t),o=yt(st,t)}const c=yt(st,e.digest()).slice(0,Z);t.enqueue(W(o,c))}}})}}function lt(t,e,s,r){n.assign(t,{ready:new l(n=>t.nt=n),password:pt(e,s),strength:r-1,ot:z})}function wt(t,n,e,s,r,c){const{et:i,st:a,ot:f}=t;f.length&&(n=W(f,n));const u=n.length-r;let l;for(e=function(t,n){if(n&&n>t.length){const e=t;(t=new o(n)).set(e,0)}return t}(e,s+(u-u%N)),l=0;l<=u-N;l+=N){const t=mt(st,dt(n,l,l+N));c&&a.update(t);const r=i.update(t);c||a.update(r),e.set(yt(st,r),l+s)}return t.ot=dt(n,l),e}async function ht(e,s,r,c){e.password=null;const i=await async function(t,n,e,s,r){if(!it)return E.importKey(n);try{return await nt.importKey("raw",n,e,!1,r)}catch{return it=!1,E.importKey(n)}}(0,r,G,0,Q),a=await async function(t,n,e){if(!at)return E.T(n,t.salt,J.iterations,e);try{return await nt.deriveBits(t,n,e)}catch{return at=!1,E.T(n,t.salt,J.iterations,e)}}(n.assign({salt:c},J),i,8*(2*Y[s]+2)),f=new o(a),u=mt(st,dt(f,0,Y[s])),l=mt(st,dt(f,Y[s],2*Y[s])),w=dt(f,2*Y[s]);return n.assign(e,{keys:{key:u,ct:l,passwordVerification:w},et:new ot(new rt(u),t.from($)),st:new ct(l)}),w}function pt(t,n){return n===v?function(t){if(typeof w==b){t=unescape(encodeURIComponent(t));const n=new o(t.length);for(let e=0;e<n.length;e++)n[e]=t.charCodeAt(e);return n}return(new w).encode(t)}(t):n}function dt(t,n,e){return t.subarray(n,e)}function yt(t,n){return t.v(n)}function mt(t,n){return t.C(n)}class St extends d{constructor({password:t,rawPassword:n,passwordVerification:e,checkPasswordOnly:s}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;if(e.password||e.rawPassword){const n=bt(e,t.subarray(0,12));if(e.password=e.rawPassword=null,0!=(n[11]^e.passwordVerification))throw new r(O);t=t.subarray(12)}s?n.error(new r(j)):n.enqueue(bt(e,t))}})}}class gt extends d{constructor({password:t,rawPassword:n,passwordVerification:e}){super({start(){vt(this,t,n,e)},transform(t,n){const e=this;let s,r;if(e.password||e.rawPassword){e.password=e.rawPassword=null;const n=H(new o(12));n[11]=e.passwordVerification,s=new o(t.length+n.length),s.set(kt(e,n),0),r=12}else s=new o(t.length),r=0;s.set(kt(e,t),r),n.enqueue(s)}})}}function vt(t,e,s,r){n.assign(t,{password:e,rawPassword:s,passwordVerification:r}),function(t,e,s){const r=[305419896,591751049,878082192];if(n.assign(t,{keys:r,it:new R(r[0]),ft:new R(r[2])}),s)for(let n=0;n<s.length;n++)zt(t,s[n]);else for(let n=0;n<e.length;n++)zt(t,e.charCodeAt(n))}(t,e,s)}function bt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,e[s]);return e}function kt(t,n){const e=new o(n.length);for(let s=0;s<n.length;s++)e[s]=Ct(t)^n[s],zt(t,n[s]);return e}function zt(t,n){let[,e]=t.keys;t.it.append([n]);const r=~t.it.get();e=At(s.imul(At(e+It(r)),134775813)+1),t.ft.append([e>>>24]);const o=~t.ft.get();t.keys=[r,e,o]}function Ct(t){const n=2|t.keys[2];return It(s.imul(n,1^n)>>>8)}function It(t){return 255&t}function At(t){return 4294967295&t}function xt(t){if(t instanceof y)return t;const n=t.getReader();return new y({async pull(t){const{value:e,done:s}=await n.read();s?t.close():t.enqueue(e)},cancel:t=>n.cancel(t)})}const Mt=new f;function Pt(t){return Mt.get(t)}const Bt="Invalid uncompressed size",Dt="deflate-raw",Ft="gzip",Rt=[31,139,8];class Ut extends d{constructor(t,{chunkSize:n,CompressionStreamFallback:e,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:l,format:w,compressionMethod:h,inputSize:p}=t,d=this;let y,m,S,g=super.readable;const v=w&&Pt(w),b=a&&r&&!l&&!v&&(!o||i)&&Boolean(c&&s);if(o&&!i||!a||b||(y=new U,g=Lt(g,y)),r)if(v)g=Ot(g,Kt(v.CompressionStream,w,{level:f,chunkSize:n,compressionMethod:h,uncompressedSize:p}));else if(b)S=new Wt,g=Ot(g,new s(Ft)),g=Lt(g,S);else try{g=Et(g,c,{level:f,chunkSize:n},s,e)}catch(t){let n;try{n=new s(Ft)}catch{throw t}g=Ot(g,n),g=Lt(g,new Wt)}o&&(i?g=Lt(g,new gt(t)):(m=new ut(t),g=Lt(g,m))),Vt(d,g,()=>{o&&!i||!a||(d.crc32=b?S.crc32:new u(y.value.buffer).getUint32(0))})}}class Wt extends d{constructor(){let t,n=10,e=new o(0);super({transform(t,r){if(n){const e=s.min(n,t.length);if(n-=e,!(t=t.subarray(e)).length)return}const o=e.length+t.length;if(o<=8)return void(e=W(e,t));const c=o-8,i=s.min(c,e.length);r.enqueue(W(e.subarray(0,i),t.subarray(0,c-i))),e=W(e.subarray(i),t.subarray(c-i))},flush(){const n=_(e);t.crc32=n.getUint32(0,!0),t.uncompressedSize=n.getUint32(4,!0)}}),t=this}}class _t extends d{constructor(t,{chunkSize:n,DecompressionStreamFallback:e,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:w,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=Lt(C,new St(t)):(z=new ft(t),C=Lt(C,z))),w){const t=m&&Pt(m);if(t)C=Ot(C,Kt(t.DecompressionStream,m,{chunkSize:n,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=Et(C,h,{chunkSize:n,deflate64:p},s,e)}catch(t){if(p||b===v)throw t;let n;try{n=new s(Ft)}catch{throw t}C=function(t,n,e){const s=new R;let c,i,a,f=0,u=!1;const w=new l((t,n)=>{i=t,a=n});w.catch(()=>{}),e||i();const h=new d({start(t){const n=new o(10);n.set(Rt),t.enqueue(n)},transform(t,n){n.enqueue(t)},async flush(t){u=!0,y();try{await w}finally{m()}const n=new o(8),r=_(n);r.setUint32(0,s.get(),!0),r.setUint32(4,e,!0),t.enqueue(n)},cancel(t){a(t)}}),p=new d({transform(t,n){s.append(t),f+=t.length,f>=e?i():u&&y(),n.enqueue(t)},cancel(t){a(t)}});return t=Lt(t,h),Lt(t=Ot(t,n),p);function y(){m(),c=setTimeout(()=>a(new r(Bt)),5e3)}function m(){clearTimeout(c)}}(C,n,b)}C=function(t){const n=t.getReader();return new y({async pull(t){let e;try{e=await n.read()}catch(t){if(t&&t.message)throw t;const n=new r("Invalid compressed data");throw n.cause=t,n}const{value:s,done:o}=e;o?t.close():t.enqueue(s)},cancel:t=>n.cancel(t)})}(C)}a&&(k=new U,C=Lt(C,k)),Vt(this,C,()=>{if(a){const t=new u(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r("Invalid CRC32")}})}}const Tt=new f;function Vt(t,e,s){e=Lt(e,new d({flush:s})),n.defineProperty(t,"readable",{get:()=>e})}function Kt(t,n,e){if(!t)throw new r("Compression method not supported");return new t(n,e)}function Et(t,n,e,s,r){const o=n&&s?s:r||s,c=e.deflate64?"deflate64-raw":Dt;let i;try{i=new o(c,e)}catch(t){if(!n||!r||o==r)throw t;i=new r(c,e)}return Ot(t,i)}function Lt(t,n){return xt(t).pipeThrough(n)}function Ot(t,n){const e=n.writable.getWriter(),s=t.getReader();return async function(){try{for(;;){await e.ready;const t=await s.read();if(t.done){await e.close();break}await e.write(t.value)}}catch(t){await async function(t,n){try{await t.abort(n)}catch{}}(e,t),await async function(t,n){try{await t.cancel(n)}catch{}}(s,t)}}(),n.readable}const jt="data",Ht="close",Nt="deflate";class qt extends d{constructor(t,e){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Nt)?c=Ut:o.startsWith("inflate")&&(c=_t),s.outputSize=0;let i=0;const a=new c(t,e),f=super.readable,u=new d({transform(t,n){t&&t.length&&(i+=t.length,n.enqueue(t))},flush(){n.assign(s,{inputSize:i})}}),l=new d({transform(n,e){if(n&&n.length&&(e.enqueue(n),s.outputSize+=n.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Bt)},flush(){const{crc32:t}=a;n.assign(s,{crc32:t,inputSize:i})}});n.defineProperty(s,"readable",{get:()=>f.pipeThrough(u).pipeThrough(a).pipeThrough(l)})}}class Gt extends d{constructor(t){const s=[];let r=0,c=0;function i(){const n=new o(t);let e=0;for(;e<t;){const r=s[0],o=t-e;r.length<=o?(n.set(r,e),e+=r.length,s.shift()):(n.set(r.subarray(0,o),e),s[0]=r.subarray(o),e+=o)}return r-=t,n}(!e.isFinite(t)||t<1)&&(t=65536),super({transform(n,e){for(s.push(n),r+=n.length;r>t;)c+=t,e.enqueue(i())},flush(t){r&&(c+=r,t.enqueue(function(t,n){const e=new o(n);let s=0;for(const n of t)e.set(n,s),s+=n.length;return e}(s,r)))}}),n.defineProperty(this,"outputSize",{get:()=>c})}}let Jt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Jt=navigator.hardwareConcurrency)}catch{}const Qt=new f,Xt=new f;let Yt,Zt=0;async function $t(t){let n,o,c;try{const{options:i,config:a}=t;if(i.format)try{await async function(t,n){!Mt.has(t)&&n&&function(t,n){const{CompressionStream:e,DecompressionStream:s}=n;if(typeof e!=k&&typeof s!=k)throw new r("Invalid codec module");Mt.set(t,{CompressionStream:e,DecompressionStream:s})}(t,await(import(n)))}(i.format,i.codecURI)}catch(t){throw t.codecImportFailed=!0,t}if(a.CompressionStream=self.CompressionStream,a.DecompressionStream=self.DecompressionStream,i.compressed&&!i.format)if(i.useCompressionStream){if(!function(t,n){if(!t)return!1;let e=Tt.get(t);e||(e=new f,Tt.set(t,e));let s=e.get(n);if(s===v){try{new t(n),s=!0}catch{s=!1}e.set(n,s)}return s}(i.codecType.startsWith(Nt)?a.CompressionStream:a.DecompressionStream,Dt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{i.useCompressionStream=!0}!a.CompressionStreamFallback&&a.CompressionStreamZlib&&(a.CompressionStreamFallback=a.CompressionStreamZlib),!a.DecompressionStreamFallback&&a.DecompressionStreamZlib&&(a.DecompressionStreamFallback=a.DecompressionStreamZlib);const u={highWaterMark:1},w=t.readable?xt(t.readable):new y({async pull(t){const n=new l(t=>Qt.set(Zt,t));tn({type:"pull",messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER;const{value:s,done:r}=await n;t.enqueue(s),r&&t.close()}},u);c=t.writable?function(t){if(t instanceof m)return t;const n=t.getWriter();return new m({write:t=>n.write(t),close:()=>n.close(),abort:t=>n.abort(t)})}(t.writable):new m({async write(t){let n;const s=new l(t=>n=t);Xt.set(Zt,n),tn({type:jt,value:t,messageId:Zt}),Zt=(Zt+1)%e.MAX_SAFE_INTEGER,await s}},u),n=new qt(i,a),o=new Gt(function(t){return r="string"==typeof(n=r=t.chunkSize)&&n.trim()?e(n):n,e.isInteger(r)&&r>=1?s.max(r,64):65536;var n,r}(a)),Yt=new AbortController;const{signal:h}=Yt;await w.pipeThrough(n).pipeThrough(o).pipeTo(c,{signal:h,preventClose:!0,preventAbort:!0}),await c.getWriter().close();const{crc32:p,inputSize:d,outputSize:S}=n;tn({type:Ht,result:{crc32:p,inputSize:d,outputSize:S}})}catch(t){if(t.outputSize=o?o.outputSize:0,c&&!c.locked)try{await c.getWriter().close()}catch{}nn(t)}}function tn(t){const{value:n}=t;if(n)if(n.length)try{t.value=(e=n,e.byteOffset||e.byteLength!=e.buffer.byteLength?new o(e):e).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var e}function nn(t=new r("Unknown error")){const{message:n,stack:e,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:n,stack:e,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}addEventListener("message",({data:t})=>{const{type:n,messageId:e,value:s,done:r}=t;try{if("start"==n&&$t(t),n==jt){const t=Qt.get(e);Qt.delete(e),t({value:s||new o,done:r})}if("ack"==n){const t=Xt.get(e);Xt.delete(e),t()}n==Ht&&Yt.abort()}catch(t){nn(t)}}),p({type:"ready"});const en="deflate",sn="deflate-raw",rn="deflate64-raw",on="gzip";let cn,an,fn,un,ln;function wn(t,n,e={}){if(!cn){const t=new r("WASM module not loaded");throw t.cause=ln,t}const c="number"==typeof e.level?e.level:-1,i="number"==typeof e.outBuffer?e.outBuffer:65536,a="number"==typeof e.inBufferSize?e.inBufferSize:65536;return new d({start(){try{let e;if(this.ut=an(i),this.in=an(a),this.inBufferSize=a,!this.ut||!this.in)throw new r("allocation failed");if(this.lt=new o(i),t?(this.wt=cn.deflate_process,this.ht=cn.deflate_last_consumed,this.yt=cn.deflate_end,this.St=cn.deflate_new(),e=n===on?cn.deflate_init_gzip(this.St,c):n===sn?cn.deflate_init_raw(this.St,c):cn.deflate_init(this.St,c)):n===rn?(this.wt=cn.inflate9_process,this.ht=cn.inflate9_last_consumed,this.yt=cn.inflate9_end,this.St=cn.inflate9_new(),e=cn.inflate9_init_raw(this.St)):(this.wt=cn.inflate_process,this.ht=cn.inflate_last_consumed,this.yt=cn.inflate_end,this.St=cn.inflate_new(),e=n===sn?cn.inflate_init_raw(this.St):n===on?cn.inflate_init_gzip(this.St):cn.inflate_init(this.St)),0!==e)throw new r("init failed:"+e)}catch(t){throw f(this),t}},transform(t,n){try{const e=t,c=new o(un.buffer),a=this.wt,f=this.ht,u=this.ut,l=this.lt;let w=0;for(;w<e.length;){const t=s.min(e.length-w,32768);if((!this.in||this.inBufferSize<t)&&(this.in&&fn&&(fn(this.in),this.in=0),this.in=an(t),this.inBufferSize=t,!this.in))throw new r("allocation failed");c.set(e.subarray(w,w+t),this.in);const o=a(this.St,this.in,t,u,i,0),h=o>>24&255,p=128&h?h-256:h;if(p<0)throw new r("process error:"+p);const d=16777215&o;d&&(l.set(c.subarray(u,u+d),0),n.enqueue(l.slice(0,d)));const y=f(this.St);if(0===y&&0===d)break;w+=y}}catch(t){f(this),n.error(t)}},flush(t){try{const n=new o(un.buffer),e=this.wt,s=this.ut,c=this.lt;for(;;){const o=e(this.St,0,0,s,i,4),a=o>>24&255,f=128&a?a-256:a;if(f<0)throw new r("process error:"+f);const u=16777215&o;if(u&&(c.set(n.subarray(s,s+u),0),t.enqueue(c.slice(0,u))),1===a||0===u)break}}catch(n){t.error(n)}finally{const n=f(this);0!==n&&t.error(new r("end error:"+n))}},cancel(){f(this)}});function f(t){let n=0;return t.St&&t.yt&&(n=t.yt(t.St)),t.St=0,t.in&&fn&&fn(t.in),t.in=0,t.ut&&fn&&fn(t.ut),t.ut=0,n}}class hn{constructor(t=en,n){return wn(!0,t,n)}}class pn{constructor(t=en,n){return wn(!1,t,n)}}hn.gt=!0,pn.gt=!0,hn.vt=[en,sn,on],pn.vt=[en,sn,on,rn];let dn=!1;!function(t={}){const{init:n}=t,e=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{n&&await n(t),e&&(t.CompressionStreamFallback=e),s&&(t.DecompressionStreamFallback=s)}}({CompressionStreamFallback:hn,DecompressionStreamFallback:pn,init:t=>async function(t,{baseURI:n}){if(!dn)try{await async function(t,n){let e,s;try{try{s=new URL(t,n)}catch{}const r=await fetch(s);e=await r.arrayBuffer()}catch(n){if(!t.startsWith("data:application/wasm;base64,"))throw n;e=function(t){const n=t.split(",")[1],e=atob(n),s=e.length,r=new o(s);for(let t=0;t<s;++t)r[t]=e.charCodeAt(t);return r.buffer}(t)}!function(t){if(cn=t,({malloc:an,free:fn,memory:un}=cn),"function"!=typeof an||"function"!=typeof fn||!un)throw cn=an=fn=un=null,new r("Invalid WASM module")}((await WebAssembly.instantiate(e)).instance.exports)}(t,n),dn=!0}catch(t){throw function(t){ln=t}(t),t}}(t.wasmURI,t)})});\n';if("string"==typeof s&&(s=(new TextEncoder).encode(s)),t){const t=new Blob([s],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+function(t){let n="";const s=t.length;let r=0;for(;r+2<s;r+=3){const s=t[r]<<16|t[r+1]<<8|t[r+2];n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+e$1[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e$1[s>>18&63]+e$1[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e$1[s>>18&63]+e$1[s>>12&63]+e$1[s>>6&63]+"=";}return n}(s)}});
|
|
418
449
|
|
|
419
450
|
/*
|
|
420
451
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -2599,6 +2630,7 @@
|
|
|
2599
2630
|
constructor(chunkSize) {
|
|
2600
2631
|
const pendingChunks = [];
|
|
2601
2632
|
let pendingLength = 0;
|
|
2633
|
+
let outputSize = 0;
|
|
2602
2634
|
if (!Number.isFinite(chunkSize) || chunkSize < 1) {
|
|
2603
2635
|
chunkSize = DEFAULT_CHUNK_SIZE;
|
|
2604
2636
|
}
|
|
@@ -2607,15 +2639,20 @@
|
|
|
2607
2639
|
pendingChunks.push(chunk);
|
|
2608
2640
|
pendingLength += chunk.length;
|
|
2609
2641
|
while (pendingLength > chunkSize) {
|
|
2642
|
+
outputSize += chunkSize;
|
|
2610
2643
|
controller.enqueue(shiftChunk());
|
|
2611
2644
|
}
|
|
2612
2645
|
},
|
|
2613
2646
|
flush(controller) {
|
|
2614
2647
|
if (pendingLength) {
|
|
2648
|
+
outputSize += pendingLength;
|
|
2615
2649
|
controller.enqueue(concatChunks(pendingChunks, pendingLength));
|
|
2616
2650
|
}
|
|
2617
2651
|
}
|
|
2618
2652
|
});
|
|
2653
|
+
Object.defineProperty(this, "outputSize", {
|
|
2654
|
+
get: () => outputSize
|
|
2655
|
+
});
|
|
2619
2656
|
|
|
2620
2657
|
function shiftChunk() {
|
|
2621
2658
|
const result = new Uint8Array(chunkSize);
|
|
@@ -2820,7 +2857,7 @@
|
|
|
2820
2857
|
}
|
|
2821
2858
|
|
|
2822
2859
|
async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
|
|
2823
|
-
let codecStream;
|
|
2860
|
+
let codecStream, chunkStream;
|
|
2824
2861
|
try {
|
|
2825
2862
|
if (options.compressed && !options.format) {
|
|
2826
2863
|
const deflate = options.codecType.startsWith(CODEC_DEFLATE);
|
|
@@ -2843,9 +2880,10 @@
|
|
|
2843
2880
|
}
|
|
2844
2881
|
}
|
|
2845
2882
|
codecStream = new CodecStream(options, config);
|
|
2883
|
+
chunkStream = new ChunkStream(getChunkSize(config));
|
|
2846
2884
|
await readable
|
|
2847
2885
|
.pipeThrough(codecStream)
|
|
2848
|
-
.pipeThrough(
|
|
2886
|
+
.pipeThrough(chunkStream)
|
|
2849
2887
|
.pipeTo(writable, { preventClose: true, preventAbort: true });
|
|
2850
2888
|
const {
|
|
2851
2889
|
crc32,
|
|
@@ -2859,7 +2897,7 @@
|
|
|
2859
2897
|
};
|
|
2860
2898
|
} catch (error) {
|
|
2861
2899
|
if (codecStream) {
|
|
2862
|
-
error.outputSize =
|
|
2900
|
+
error.outputSize = chunkStream ? chunkStream.outputSize : 0;
|
|
2863
2901
|
}
|
|
2864
2902
|
throw error;
|
|
2865
2903
|
} finally {
|
|
@@ -2968,11 +3006,17 @@
|
|
|
2968
3006
|
let resolveResult, rejectResult;
|
|
2969
3007
|
const result = new Promise((resolve, reject) => {
|
|
2970
3008
|
resolveResult = resolve;
|
|
2971
|
-
rejectResult =
|
|
3009
|
+
rejectResult = error => {
|
|
3010
|
+
if (error && error.outputSize === UNDEFINED_VALUE) {
|
|
3011
|
+
error.outputSize = workerData.outputSize;
|
|
3012
|
+
}
|
|
3013
|
+
reject(error);
|
|
3014
|
+
};
|
|
2972
3015
|
});
|
|
2973
3016
|
Object.assign(workerData, {
|
|
2974
3017
|
reader: null,
|
|
2975
3018
|
writer: null,
|
|
3019
|
+
outputSize: 0,
|
|
2976
3020
|
resolveResult,
|
|
2977
3021
|
rejectResult,
|
|
2978
3022
|
result
|
|
@@ -3256,8 +3300,10 @@
|
|
|
3256
3300
|
}
|
|
3257
3301
|
}
|
|
3258
3302
|
if (type == MESSAGE_DATA) {
|
|
3303
|
+
const chunk = new Uint8Array(value);
|
|
3259
3304
|
await writer.ready;
|
|
3260
|
-
await writer.write(
|
|
3305
|
+
await writer.write(chunk);
|
|
3306
|
+
workerData.outputSize += chunk.length;
|
|
3261
3307
|
if (!stale()) {
|
|
3262
3308
|
sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
|
|
3263
3309
|
}
|
|
@@ -3565,10 +3611,13 @@
|
|
|
3565
3611
|
|
|
3566
3612
|
|
|
3567
3613
|
const ERR_HTTP_STATUS = "HTTP error ";
|
|
3614
|
+
const MIN_SUCCESS_HTTP_STATUS = 200;
|
|
3615
|
+
const MAX_SUCCESS_HTTP_STATUS = 299;
|
|
3568
3616
|
const ERR_HTTP_RANGE = "HTTP Range not supported";
|
|
3569
3617
|
const ERR_HTTP_RESOURCE_CHANGED = "HTTP resource changed";
|
|
3570
3618
|
const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
|
|
3571
3619
|
const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
|
|
3620
|
+
const ERR_WRITER_SIZE_NOT_WRITABLE = "Invalid writer (size must be writable)";
|
|
3572
3621
|
|
|
3573
3622
|
const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
|
|
3574
3623
|
const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
|
|
@@ -3760,11 +3809,14 @@
|
|
|
3760
3809
|
const reader = this;
|
|
3761
3810
|
const { sourceBlob, size } = reader;
|
|
3762
3811
|
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
3763
|
-
|
|
3764
|
-
|
|
3765
|
-
|
|
3766
|
-
|
|
3767
|
-
|
|
3812
|
+
// deno-lint-ignore valid-typeof
|
|
3813
|
+
if (typeof sourceBlob.stream == FUNCTION_TYPE) {
|
|
3814
|
+
if (!offset && readSize >= size) {
|
|
3815
|
+
return toCompatibleReadable(sourceBlob.stream());
|
|
3816
|
+
}
|
|
3817
|
+
if (blobSliceReliable) {
|
|
3818
|
+
return toCompatibleReadable(sourceBlob.slice(offset, offset + readSize).stream());
|
|
3819
|
+
}
|
|
3768
3820
|
}
|
|
3769
3821
|
return super.createReadable(options);
|
|
3770
3822
|
}
|
|
@@ -4164,7 +4216,7 @@
|
|
|
4164
4216
|
|
|
4165
4217
|
async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
|
|
4166
4218
|
const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
|
|
4167
|
-
if (response.status
|
|
4219
|
+
if (response.status >= MIN_SUCCESS_HTTP_STATUS && response.status <= MAX_SUCCESS_HTTP_STATUS) {
|
|
4168
4220
|
return response;
|
|
4169
4221
|
} else {
|
|
4170
4222
|
throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
|
|
@@ -4175,7 +4227,7 @@
|
|
|
4175
4227
|
return new Promise((resolve, reject) => {
|
|
4176
4228
|
const request = new XMLHttpRequest();
|
|
4177
4229
|
request.addEventListener("load", () => {
|
|
4178
|
-
if (request.status
|
|
4230
|
+
if (request.status >= MIN_SUCCESS_HTTP_STATUS && request.status <= MAX_SUCCESS_HTTP_STATUS) {
|
|
4179
4231
|
const headers = [];
|
|
4180
4232
|
request.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach(header => {
|
|
4181
4233
|
const splitHeader = header.trim().split(/\s*:\s*/);
|
|
@@ -4479,8 +4531,10 @@
|
|
|
4479
4531
|
writable: toCompatibleWritable(writer)
|
|
4480
4532
|
};
|
|
4481
4533
|
}
|
|
4482
|
-
|
|
4483
|
-
writer.size = 0;
|
|
4534
|
+
try {
|
|
4535
|
+
writer.size = writer.size === UNDEFINED_VALUE ? 0 : writer.size;
|
|
4536
|
+
} catch {
|
|
4537
|
+
throw new Error(ERR_WRITER_SIZE_NOT_WRITABLE);
|
|
4484
4538
|
}
|
|
4485
4539
|
return writer;
|
|
4486
4540
|
}
|
|
@@ -4528,6 +4582,45 @@
|
|
|
4528
4582
|
}
|
|
4529
4583
|
}
|
|
4530
4584
|
|
|
4585
|
+
/*
|
|
4586
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
4587
|
+
|
|
4588
|
+
Redistribution and use in source and binary forms, with or without
|
|
4589
|
+
modification, are permitted provided that the following conditions are met:
|
|
4590
|
+
|
|
4591
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
4592
|
+
this list of conditions and the following disclaimer.
|
|
4593
|
+
|
|
4594
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
4595
|
+
notice, this list of conditions and the following disclaimer in
|
|
4596
|
+
the documentation and/or other materials provided with the distribution.
|
|
4597
|
+
|
|
4598
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
4599
|
+
derived from this software without specific prior written permission.
|
|
4600
|
+
|
|
4601
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4602
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4603
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4604
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4605
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4606
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4607
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4608
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4609
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4610
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4611
|
+
*/
|
|
4612
|
+
|
|
4613
|
+
|
|
4614
|
+
function addWarning(warnings, reason, filename) {
|
|
4615
|
+
if (!warnings.some(warning => warning.reason == reason)) {
|
|
4616
|
+
const warning = { reason };
|
|
4617
|
+
if (filename !== UNDEFINED_VALUE) {
|
|
4618
|
+
warning.filename = filename;
|
|
4619
|
+
}
|
|
4620
|
+
warnings.push(warning);
|
|
4621
|
+
}
|
|
4622
|
+
}
|
|
4623
|
+
|
|
4531
4624
|
/*
|
|
4532
4625
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4533
4626
|
|
|
@@ -4556,6 +4649,7 @@
|
|
|
4556
4649
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4557
4650
|
*/
|
|
4558
4651
|
|
|
4652
|
+
|
|
4559
4653
|
const PROPERTY_NAME_FILENAME = "filename";
|
|
4560
4654
|
const PROPERTY_NAME_RAW_FILENAME = "rawFilename";
|
|
4561
4655
|
const PROPERTY_NAME_COMMENT = "comment";
|
|
@@ -4680,6 +4774,38 @@
|
|
|
4680
4774
|
|
|
4681
4775
|
}
|
|
4682
4776
|
|
|
4777
|
+
const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
|
|
4778
|
+
EXTRAFIELD_TYPE_ZIP64,
|
|
4779
|
+
EXTRAFIELD_TYPE_AES,
|
|
4780
|
+
EXTRAFIELD_TYPE_NTFS,
|
|
4781
|
+
EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
|
|
4782
|
+
EXTRAFIELD_TYPE_UNICODE_PATH,
|
|
4783
|
+
EXTRAFIELD_TYPE_UNICODE_COMMENT,
|
|
4784
|
+
EXTRAFIELD_TYPE_USDZ,
|
|
4785
|
+
EXTRAFIELD_TYPE_INFOZIP,
|
|
4786
|
+
EXTRAFIELD_TYPE_UNIX,
|
|
4787
|
+
EXTRAFIELD_TYPE_UNIX_TYPE1,
|
|
4788
|
+
EXTRAFIELD_TYPE_PKWARE_UNIX
|
|
4789
|
+
]);
|
|
4790
|
+
|
|
4791
|
+
function getUserExtraField(extraField) {
|
|
4792
|
+
if (extraField) {
|
|
4793
|
+
const userExtraField = new Map();
|
|
4794
|
+
extraField.forEach((field, type) => {
|
|
4795
|
+
if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
|
|
4796
|
+
userExtraField.set(type, field.data);
|
|
4797
|
+
}
|
|
4798
|
+
});
|
|
4799
|
+
if (userExtraField.size) {
|
|
4800
|
+
return userExtraField;
|
|
4801
|
+
}
|
|
4802
|
+
}
|
|
4803
|
+
}
|
|
4804
|
+
|
|
4805
|
+
function getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength) {
|
|
4806
|
+
return encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
4807
|
+
}
|
|
4808
|
+
|
|
4683
4809
|
/*
|
|
4684
4810
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4685
4811
|
|
|
@@ -4739,6 +4865,8 @@
|
|
|
4739
4865
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4740
4866
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4741
4867
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4868
|
+
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
4869
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = "mismatched local file header (filename)";
|
|
4742
4870
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
|
|
4743
4871
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
|
|
4744
4872
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
|
|
@@ -4809,7 +4937,7 @@
|
|
|
4809
4937
|
}
|
|
4810
4938
|
}
|
|
4811
4939
|
if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
|
|
4812
|
-
throwAmbiguousArchive(
|
|
4940
|
+
throwAmbiguousArchive(WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY);
|
|
4813
4941
|
}
|
|
4814
4942
|
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
4815
4943
|
let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
|
|
@@ -5107,7 +5235,8 @@
|
|
|
5107
5235
|
const writer = new TransformStream();
|
|
5108
5236
|
const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
|
|
5109
5237
|
arrayBufferPromise.catch(() => { });
|
|
5110
|
-
await fileEntry.getData(writer, entry, zipReader.readRanges,
|
|
5238
|
+
await fileEntry.getData(writer, entry, zipReader.readRanges,
|
|
5239
|
+
Object.assign({}, options, { preventClose: false }));
|
|
5111
5240
|
return arrayBufferPromise;
|
|
5112
5241
|
};
|
|
5113
5242
|
offset = endOffset;
|
|
@@ -5188,48 +5317,101 @@
|
|
|
5188
5317
|
await reader.readable.cancel();
|
|
5189
5318
|
}
|
|
5190
5319
|
}
|
|
5320
|
+
|
|
5321
|
+
[SYMBOL_ASYNC_DISPOSE]() {
|
|
5322
|
+
return this.close();
|
|
5323
|
+
}
|
|
5191
5324
|
}
|
|
5192
5325
|
|
|
5193
5326
|
class ZipReaderStream {
|
|
5194
5327
|
|
|
5195
5328
|
constructor(options = {}) {
|
|
5196
|
-
|
|
5197
|
-
const
|
|
5329
|
+
let sourceController;
|
|
5330
|
+
const { readable, writable } = new TransformStream({
|
|
5331
|
+
start(controller) {
|
|
5332
|
+
sourceController = controller;
|
|
5333
|
+
}
|
|
5334
|
+
});
|
|
5335
|
+
const zipReader = new ZipReader(readable, options);
|
|
5336
|
+
const gen = zipReader.getEntriesGenerator();
|
|
5337
|
+
const pendingEntries = new Set();
|
|
5198
5338
|
this.readable = new ReadableStream({
|
|
5199
5339
|
async pull(controller) {
|
|
5200
5340
|
const { done, value } = await gen.next();
|
|
5201
5341
|
if (done)
|
|
5202
5342
|
return controller.close();
|
|
5343
|
+
const entryStream = createEntryStream(value, pendingEntries);
|
|
5203
5344
|
const chunk = {
|
|
5204
5345
|
...value,
|
|
5205
|
-
readable:
|
|
5206
|
-
const { readable, writable } = new TransformStream();
|
|
5207
|
-
if (value.getData) {
|
|
5208
|
-
getData();
|
|
5209
|
-
return readable;
|
|
5210
|
-
}
|
|
5211
|
-
|
|
5212
|
-
async function getData() {
|
|
5213
|
-
try {
|
|
5214
|
-
await value.getData(writable);
|
|
5215
|
-
} catch (error) {
|
|
5216
|
-
try {
|
|
5217
|
-
await writable.abort(error);
|
|
5218
|
-
} catch {
|
|
5219
|
-
// ignored
|
|
5220
|
-
}
|
|
5221
|
-
}
|
|
5222
|
-
}
|
|
5223
|
-
})()
|
|
5346
|
+
readable: entryStream.readable
|
|
5224
5347
|
};
|
|
5225
5348
|
delete chunk.getData;
|
|
5349
|
+
Object.defineProperties(chunk, {
|
|
5350
|
+
localDirectory: {
|
|
5351
|
+
get: () => value.localDirectory,
|
|
5352
|
+
enumerable: true
|
|
5353
|
+
},
|
|
5354
|
+
warnings: {
|
|
5355
|
+
get: () => value.warnings,
|
|
5356
|
+
enumerable: true
|
|
5357
|
+
}
|
|
5358
|
+
});
|
|
5226
5359
|
controller.enqueue(chunk);
|
|
5360
|
+
},
|
|
5361
|
+
async cancel(reason) {
|
|
5362
|
+
const entryStreams = Array.from(pendingEntries);
|
|
5363
|
+
pendingEntries.clear();
|
|
5364
|
+
sourceController.error(reason);
|
|
5365
|
+
await Promise.allSettled(entryStreams.map(entryStream => entryStream.cancel(reason)));
|
|
5366
|
+
await Promise.allSettled([gen.return(), zipReader.close()]);
|
|
5227
5367
|
}
|
|
5228
5368
|
});
|
|
5229
5369
|
this.writable = writable;
|
|
5230
5370
|
}
|
|
5231
5371
|
}
|
|
5232
5372
|
|
|
5373
|
+
function createEntryStream(entry, pendingEntries) {
|
|
5374
|
+
const { readable, writable } = new TransformStream();
|
|
5375
|
+
let dataReader;
|
|
5376
|
+
const entryStream = {
|
|
5377
|
+
cancel: async reason => {
|
|
5378
|
+
pendingEntries.delete(entryStream);
|
|
5379
|
+
await (dataReader ? dataReader.cancel(reason) : readable.cancel(reason));
|
|
5380
|
+
}
|
|
5381
|
+
};
|
|
5382
|
+
entryStream.readable = new ReadableStream({
|
|
5383
|
+
async pull(controller) {
|
|
5384
|
+
if (!dataReader) {
|
|
5385
|
+
dataReader = readable.getReader();
|
|
5386
|
+
pendingEntries.add(entryStream);
|
|
5387
|
+
getData();
|
|
5388
|
+
}
|
|
5389
|
+
const { done, value } = await dataReader.read();
|
|
5390
|
+
if (done) {
|
|
5391
|
+
controller.close();
|
|
5392
|
+
} else {
|
|
5393
|
+
controller.enqueue(value);
|
|
5394
|
+
}
|
|
5395
|
+
},
|
|
5396
|
+
cancel: reason => entryStream.cancel(reason)
|
|
5397
|
+
}, { highWaterMark: 0 });
|
|
5398
|
+
return entryStream;
|
|
5399
|
+
|
|
5400
|
+
async function getData() {
|
|
5401
|
+
try {
|
|
5402
|
+
await entry.getData(writable, { preventClose: false });
|
|
5403
|
+
} catch (error) {
|
|
5404
|
+
try {
|
|
5405
|
+
await writable.abort(error);
|
|
5406
|
+
} catch {
|
|
5407
|
+
// ignored
|
|
5408
|
+
}
|
|
5409
|
+
} finally {
|
|
5410
|
+
pendingEntries.delete(entryStream);
|
|
5411
|
+
}
|
|
5412
|
+
}
|
|
5413
|
+
}
|
|
5414
|
+
|
|
5233
5415
|
async function isZipFile(reader, options = {}) {
|
|
5234
5416
|
reader = new GenericReader(reader);
|
|
5235
5417
|
await initStream(reader);
|
|
@@ -5289,7 +5471,9 @@
|
|
|
5289
5471
|
const dataView = getDataView(dataArray);
|
|
5290
5472
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
5291
5473
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
5292
|
-
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
5474
|
+
const passThrough = checkPassThroughOption(getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH));
|
|
5475
|
+
const passThroughCompression = Boolean(passThrough);
|
|
5476
|
+
const passThroughEncryption = passThrough === true;
|
|
5293
5477
|
checkPasswordOption(password, rawPassword);
|
|
5294
5478
|
password = password && password.length && password;
|
|
5295
5479
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
@@ -5310,7 +5494,9 @@
|
|
|
5310
5494
|
const checkLocalDirectoryOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_DIRECTORY);
|
|
5311
5495
|
const entryStrictness = getStrictness(options, zipEntry.options);
|
|
5312
5496
|
const checkLocalDirectory = getCheckLocalDirectory(checkLocalDirectoryOption, entryStrictness);
|
|
5313
|
-
const
|
|
5497
|
+
const checkLocalFilenameOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_FILENAME);
|
|
5498
|
+
const checkLocalFilename = getCheckLocalFilename(
|
|
5499
|
+
checkLocalFilenameOption === UNDEFINED_VALUE ? checkLocalDirectoryOption : checkLocalFilenameOption, entryStrictness);
|
|
5314
5500
|
let rawLocalFilename = EMPTY_UINT8_ARRAY;
|
|
5315
5501
|
if (checkLocalFilename && (filenameLength || extraFieldLength)) {
|
|
5316
5502
|
const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
|
|
@@ -5341,16 +5527,17 @@
|
|
|
5341
5527
|
if (gid !== UNDEFINED_VALUE && fileEntry.gid === UNDEFINED_VALUE) {
|
|
5342
5528
|
fileEntry.gid = gid;
|
|
5343
5529
|
}
|
|
5344
|
-
const
|
|
5530
|
+
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5531
|
+
const encrypted = zipEntry.encrypted && localDirectory.encrypted && (!passThroughEncryption || checkPasswordOnly);
|
|
5345
5532
|
const zipCrypto = encrypted && !extraFieldAES;
|
|
5346
|
-
if (!
|
|
5533
|
+
if (!passThroughEncryption) {
|
|
5347
5534
|
fileEntry.zipCrypto = zipCrypto;
|
|
5348
5535
|
}
|
|
5349
5536
|
if (encrypted && (localDirectory.rawBitFlag & BITFLAG_STRONG_ENCRYPTION) == BITFLAG_STRONG_ENCRYPTION) {
|
|
5350
5537
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
|
|
5351
5538
|
}
|
|
5352
|
-
const registeredCodec =
|
|
5353
|
-
if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !
|
|
5539
|
+
const registeredCodec = passThroughCompression ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
5540
|
+
if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThroughCompression) {
|
|
5354
5541
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
5355
5542
|
}
|
|
5356
5543
|
if (encrypted) {
|
|
@@ -5366,15 +5553,17 @@
|
|
|
5366
5553
|
const size = compressedSize;
|
|
5367
5554
|
const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
|
|
5368
5555
|
const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
|
|
5369
|
-
|
|
5556
|
+
throwIfAborted(signal);
|
|
5370
5557
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
5371
5558
|
const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
|
|
5372
5559
|
if (checkOverlappingEntryOnly) {
|
|
5373
5560
|
checkOverlappingEntry = true;
|
|
5374
5561
|
}
|
|
5375
5562
|
const { onstart, onprogress, onend } = options;
|
|
5376
|
-
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !
|
|
5377
|
-
const outputSize =
|
|
5563
|
+
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThroughCompression;
|
|
5564
|
+
const outputSize = passThroughCompression ?
|
|
5565
|
+
compressedSize - getEncryptionOverhead(encrypted, zipCrypto, extraFieldAES && extraFieldAES.strength) :
|
|
5566
|
+
uncompressedSize;
|
|
5378
5567
|
const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
|
|
5379
5568
|
let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
|
|
5380
5569
|
if (deflate64) {
|
|
@@ -5383,7 +5572,7 @@
|
|
|
5383
5572
|
const checkCrc32Option = getOptionValue$1(zipEntry, options, OPTION_CHECK_CRC32);
|
|
5384
5573
|
const checkCrc32 = (checkCrc32Option === UNDEFINED_VALUE ?
|
|
5385
5574
|
getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) :
|
|
5386
|
-
checkCrc32Option) && !
|
|
5575
|
+
checkCrc32Option) && !passThroughCompression &&
|
|
5387
5576
|
(!encrypted || zipCrypto || (extraFieldAES && extraFieldAES.vendorVersion == VENDOR_VERSION_AE_1$1));
|
|
5388
5577
|
const workerOptions = {
|
|
5389
5578
|
options: {
|
|
@@ -5437,10 +5626,10 @@
|
|
|
5437
5626
|
await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
|
|
5438
5627
|
({ writable } = writer);
|
|
5439
5628
|
const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5440
|
-
writer.size += writtenSize;
|
|
5441
5629
|
if (writtenSize != outputSize) {
|
|
5442
|
-
throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
5630
|
+
throw Object.assign(new Error(ERR_INVALID_UNCOMPRESSED_SIZE), { outputSize: writtenSize });
|
|
5443
5631
|
}
|
|
5632
|
+
writer.size += writtenSize;
|
|
5444
5633
|
}
|
|
5445
5634
|
} catch (error) {
|
|
5446
5635
|
if (error.outputSize !== UNDEFINED_VALUE) {
|
|
@@ -6106,7 +6295,7 @@
|
|
|
6106
6295
|
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
6107
6296
|
(rawLocalFilename.length != rawFilename.length ||
|
|
6108
6297
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
6109
|
-
reportAmbiguity(reject, warnings,
|
|
6298
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME);
|
|
6110
6299
|
}
|
|
6111
6300
|
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
6112
6301
|
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
|
|
@@ -6131,16 +6320,6 @@
|
|
|
6131
6320
|
}
|
|
6132
6321
|
}
|
|
6133
6322
|
|
|
6134
|
-
function addWarning(warnings, reason, filename) {
|
|
6135
|
-
if (!warnings.some(warning => warning.reason == reason)) {
|
|
6136
|
-
const warning = { reason };
|
|
6137
|
-
if (filename !== UNDEFINED_VALUE) {
|
|
6138
|
-
warning.filename = filename;
|
|
6139
|
-
}
|
|
6140
|
-
warnings.push(warning);
|
|
6141
|
-
}
|
|
6142
|
-
}
|
|
6143
|
-
|
|
6144
6323
|
function throwAmbiguousArchive(reason) {
|
|
6145
6324
|
const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
|
|
6146
6325
|
error.reason = reason;
|
|
@@ -6220,7 +6399,9 @@
|
|
|
6220
6399
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6221
6400
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6222
6401
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6402
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6223
6403
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6404
|
+
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6224
6405
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6225
6406
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
6226
6407
|
WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
|
|
@@ -6273,7 +6454,7 @@
|
|
|
6273
6454
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
6274
6455
|
const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
|
|
6275
6456
|
const ERR_UNSUPPORTED_SPLIT_USDZ = "Split zip files are not supported in USDZ files";
|
|
6276
|
-
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
|
|
6457
|
+
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set to true (use 'compressed' instead)";
|
|
6277
6458
|
const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
|
|
6278
6459
|
const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
|
|
6279
6460
|
const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
|
|
@@ -6285,6 +6466,7 @@
|
|
|
6285
6466
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
6286
6467
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
6287
6468
|
const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
|
|
6469
|
+
const ERR_UNDEFINED_CRC32 = "Undefined CRC32";
|
|
6288
6470
|
const ERR_UNDETERMINED_SIZE = "Undetermined size";
|
|
6289
6471
|
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
6290
6472
|
const ERR_INVALID_READER = "Invalid reader (must be a Reader instance, a ReadableStream instance, or an object with a 'readable' property)";
|
|
@@ -6298,14 +6480,21 @@
|
|
|
6298
6480
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
6299
6481
|
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
6300
6482
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
6483
|
+
const ERR_INVALID_ENTRY = "Invalid entry option (must be an entry returned by ZipReader#getEntries())";
|
|
6484
|
+
const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
|
|
6485
|
+
const WARNING_COMPRESSION_UNAVAILABLE = "compression unavailable";
|
|
6486
|
+
const WARNING_CLAMPED_LAST_MODIFICATION_DATE = "clamped last modification date";
|
|
6301
6487
|
|
|
6302
6488
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
6303
6489
|
const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
|
|
6304
6490
|
const EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD = 9;
|
|
6305
6491
|
const EXTRAFIELD_USDZ_MAX_LENGTH = 67;
|
|
6492
|
+
const MIN_PRINTABLE_ASCII_CHARACTER_CODE = 0x20;
|
|
6493
|
+
const MAX_PRINTABLE_ASCII_CHARACTER_CODE = 0x7e;
|
|
6306
6494
|
const VENDOR_VERSION_AE_1 = 1;
|
|
6307
|
-
const INFOZIP_EXTRA_FIELD_TYPE
|
|
6495
|
+
const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
|
|
6308
6496
|
const UNIX_EXTRA_FIELD_TYPE = "unix";
|
|
6497
|
+
const LEVEL_BY_BITFLAG_LEVEL = [8, 9, 5, 3];
|
|
6309
6498
|
const MAX_LEVEL = 9;
|
|
6310
6499
|
|
|
6311
6500
|
let workers = 0;
|
|
@@ -6332,9 +6521,11 @@
|
|
|
6332
6521
|
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
6333
6522
|
pendingAddFileCalls: new Set(),
|
|
6334
6523
|
pendingErrors: [],
|
|
6524
|
+
warnings: [],
|
|
6335
6525
|
bufferedWrites: 0,
|
|
6336
6526
|
directWrites: 0,
|
|
6337
|
-
lastFileEntry: UNDEFINED_VALUE
|
|
6527
|
+
lastFileEntry: UNDEFINED_VALUE,
|
|
6528
|
+
archiveClosed: false
|
|
6338
6529
|
});
|
|
6339
6530
|
}
|
|
6340
6531
|
|
|
@@ -6499,6 +6690,9 @@
|
|
|
6499
6690
|
const zipWriter = this;
|
|
6500
6691
|
const { pendingAddFileCalls, writer } = this;
|
|
6501
6692
|
const { writable } = writer;
|
|
6693
|
+
if (zipWriter.archiveClosed) {
|
|
6694
|
+
return getWriterData(writer);
|
|
6695
|
+
}
|
|
6502
6696
|
if (!(comment instanceof Uint8Array)) {
|
|
6503
6697
|
throw new Error(ERR_INVALID_COMMENT_TYPE);
|
|
6504
6698
|
}
|
|
@@ -6522,11 +6716,16 @@
|
|
|
6522
6716
|
throw error;
|
|
6523
6717
|
}
|
|
6524
6718
|
await closeFile(zipWriter, comment, options);
|
|
6719
|
+
zipWriter.archiveClosed = true;
|
|
6525
6720
|
const preventClose = !ownsWritable(writer) && getOptionValue(zipWriter, options, OPTION_PREVENT_CLOSE);
|
|
6526
6721
|
if (!preventClose) {
|
|
6527
6722
|
await writable.getWriter().close();
|
|
6528
6723
|
}
|
|
6529
|
-
return writer
|
|
6724
|
+
return getWriterData(writer);
|
|
6725
|
+
}
|
|
6726
|
+
|
|
6727
|
+
[SYMBOL_ASYNC_DISPOSE]() {
|
|
6728
|
+
return this.close();
|
|
6530
6729
|
}
|
|
6531
6730
|
}
|
|
6532
6731
|
|
|
@@ -6605,6 +6804,10 @@
|
|
|
6605
6804
|
}
|
|
6606
6805
|
}
|
|
6607
6806
|
|
|
6807
|
+
function getWriterData(writer) {
|
|
6808
|
+
return writer.getData ? writer.getData() : writer.writable;
|
|
6809
|
+
}
|
|
6810
|
+
|
|
6608
6811
|
function watchPromiseError(zipWriter, promise) {
|
|
6609
6812
|
const watchedPromise = new WatchedPromise((resolve, reject) => Promise.prototype.then.call(promise, resolve, reject));
|
|
6610
6813
|
const watcher = {};
|
|
@@ -6623,6 +6826,14 @@
|
|
|
6623
6826
|
|
|
6624
6827
|
async function addFileEntry(zipWriter, name, reader, options) {
|
|
6625
6828
|
options = Object.assign({}, options);
|
|
6829
|
+
const entry = options[OPTION_ENTRY];
|
|
6830
|
+
if (entry !== UNDEFINED_VALUE) {
|
|
6831
|
+
const { entryOptions, passThroughOptions } = getSourceEntryOptions(entry,
|
|
6832
|
+
checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH)),
|
|
6833
|
+
getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE));
|
|
6834
|
+
delete options[OPTION_ENTRY];
|
|
6835
|
+
options = Object.assign(entryOptions, passThroughOptions, options);
|
|
6836
|
+
}
|
|
6626
6837
|
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
6627
6838
|
name += DIRECTORY_SIGNATURE;
|
|
6628
6839
|
}
|
|
@@ -6687,21 +6898,33 @@
|
|
|
6687
6898
|
try {
|
|
6688
6899
|
const { resolvedOptions } = metadataInfo;
|
|
6689
6900
|
if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
|
|
6690
|
-
!resolvedOptions.
|
|
6901
|
+
!resolvedOptions.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
|
|
6691
6902
|
resolvedOptions.level = 0;
|
|
6903
|
+
addWarning(zipWriter.warnings, WARNING_COMPRESSION_UNAVAILABLE, name);
|
|
6692
6904
|
}
|
|
6693
6905
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
6694
6906
|
({ reader } = sizesInfo);
|
|
6695
6907
|
const diskOffset = getDiskOffset(zipWriter.writer);
|
|
6696
6908
|
const diskNumber = getDiskNumber(zipWriter.writer);
|
|
6909
|
+
let crc32 = options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32;
|
|
6910
|
+
const storesAE2 = sizesInfo.resolvedOptions.encrypted && !resolvedOptions.zipCrypto;
|
|
6911
|
+
if (resolvedOptions.passThroughCompression && !resolvedOptions.passThroughEncryption && storesAE2) {
|
|
6912
|
+
crc32 = UNDEFINED_VALUE;
|
|
6913
|
+
}
|
|
6914
|
+
if (resolvedOptions.passThroughCompression && reader && !storesAE2 && crc32 === UNDEFINED_VALUE) {
|
|
6915
|
+
throw new Error(ERR_UNDEFINED_CRC32);
|
|
6916
|
+
}
|
|
6697
6917
|
options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
|
|
6698
6918
|
signature: options[PROPERTY_NAME_SIGNATURE],
|
|
6699
|
-
crc32
|
|
6919
|
+
crc32,
|
|
6700
6920
|
offset: zipWriter.offset - diskOffset,
|
|
6701
6921
|
diskNumberStart: diskNumber,
|
|
6702
6922
|
[OPTION_USDZ]: zipWriter.options[OPTION_USDZ]
|
|
6703
6923
|
});
|
|
6704
6924
|
const headerInfo = getHeaderInfo(options);
|
|
6925
|
+
if (headerInfo.lastModDateClamped) {
|
|
6926
|
+
addWarning(zipWriter.warnings, WARNING_CLAMPED_LAST_MODIFICATION_DATE, name);
|
|
6927
|
+
}
|
|
6705
6928
|
const dataDescriptorInfo = getDataDescriptorInfo(options);
|
|
6706
6929
|
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
6707
6930
|
fileEntry = await getFileEntry(zipWriter, name, reader, {
|
|
@@ -6728,6 +6951,95 @@
|
|
|
6728
6951
|
return new Entry(fileEntry);
|
|
6729
6952
|
}
|
|
6730
6953
|
|
|
6954
|
+
function getSourceEntryOptions(entry, passThrough, lastModDateOverride) {
|
|
6955
|
+
if (entry === null || typeof entry != OBJECT_TYPE || Array.isArray(entry)) {
|
|
6956
|
+
throw new Error(ERR_INVALID_ENTRY);
|
|
6957
|
+
}
|
|
6958
|
+
const {
|
|
6959
|
+
externalFileAttributes,
|
|
6960
|
+
versionMadeBy,
|
|
6961
|
+
comment,
|
|
6962
|
+
lastModDate,
|
|
6963
|
+
rawLastModDate,
|
|
6964
|
+
creationDate,
|
|
6965
|
+
lastAccessDate,
|
|
6966
|
+
uncompressedSize,
|
|
6967
|
+
encrypted,
|
|
6968
|
+
zipCrypto,
|
|
6969
|
+
crc32,
|
|
6970
|
+
compressionMethod,
|
|
6971
|
+
extraFieldAES,
|
|
6972
|
+
extraFieldUnix,
|
|
6973
|
+
internalFileAttributes,
|
|
6974
|
+
extraField,
|
|
6975
|
+
bitFlag,
|
|
6976
|
+
directory,
|
|
6977
|
+
uid,
|
|
6978
|
+
gid
|
|
6979
|
+
} = entry;
|
|
6980
|
+
const entryOptions = {
|
|
6981
|
+
externalFileAttributes,
|
|
6982
|
+
versionMadeBy,
|
|
6983
|
+
comment,
|
|
6984
|
+
lastModDate,
|
|
6985
|
+
creationDate,
|
|
6986
|
+
lastAccessDate,
|
|
6987
|
+
internalFileAttributes,
|
|
6988
|
+
directory
|
|
6989
|
+
};
|
|
6990
|
+
if (bitFlag && bitFlag.languageEncodingFlag) {
|
|
6991
|
+
entryOptions[OPTION_USE_UNICODE_FILE_NAMES] = true;
|
|
6992
|
+
}
|
|
6993
|
+
const userExtraField = getUserExtraField(extraField);
|
|
6994
|
+
if (userExtraField) {
|
|
6995
|
+
entryOptions[PROPERTY_NAME_EXTRA_FIELD] = userExtraField;
|
|
6996
|
+
}
|
|
6997
|
+
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
6998
|
+
Object.assign(entryOptions, {
|
|
6999
|
+
uid,
|
|
7000
|
+
gid,
|
|
7001
|
+
unixExtraFieldType: extraFieldUnix ? UNIX_EXTRA_FIELD_TYPE : INFOZIP_EXTRA_FIELD_TYPE
|
|
7002
|
+
});
|
|
7003
|
+
}
|
|
7004
|
+
const passThroughOptions = {};
|
|
7005
|
+
if (passThrough && !directory) {
|
|
7006
|
+
Object.assign(passThroughOptions, {
|
|
7007
|
+
uncompressedSize,
|
|
7008
|
+
crc32,
|
|
7009
|
+
compressionMethod
|
|
7010
|
+
});
|
|
7011
|
+
if (passThrough !== PASS_THROUGH_COMPRESSED) {
|
|
7012
|
+
Object.assign(passThroughOptions, {
|
|
7013
|
+
encrypted,
|
|
7014
|
+
zipCrypto,
|
|
7015
|
+
encryptionStrength: extraFieldAES ? extraFieldAES.strength : UNDEFINED_VALUE
|
|
7016
|
+
});
|
|
7017
|
+
}
|
|
7018
|
+
if (bitFlag) {
|
|
7019
|
+
passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
|
|
7020
|
+
passThroughOptions[OPTION_LEVEL] = LEVEL_BY_BITFLAG_LEVEL[bitFlag.level];
|
|
7021
|
+
}
|
|
7022
|
+
if (lastModDateOverride === UNDEFINED_VALUE) {
|
|
7023
|
+
passThroughOptions.rawLastModDate = rawLastModDate;
|
|
7024
|
+
} else if (passThrough !== PASS_THROUGH_COMPRESSED && zipCrypto && (!bitFlag || bitFlag.dataDescriptor) &&
|
|
7025
|
+
lastModDateOverride instanceof Date &&
|
|
7026
|
+
getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
|
|
7027
|
+
throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
|
|
7028
|
+
}
|
|
7029
|
+
}
|
|
7030
|
+
return { entryOptions, passThroughOptions };
|
|
7031
|
+
}
|
|
7032
|
+
|
|
7033
|
+
function getDosTimeHighByte(lastModDate) {
|
|
7034
|
+
let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
|
|
7035
|
+
if (dosLastModDate < MIN_DATE) {
|
|
7036
|
+
dosLastModDate = MIN_DATE;
|
|
7037
|
+
} else if (dosLastModDate > MAX_DATE) {
|
|
7038
|
+
dosLastModDate = MAX_DATE;
|
|
7039
|
+
}
|
|
7040
|
+
return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
|
|
7041
|
+
}
|
|
7042
|
+
|
|
6731
7043
|
function resolveAttributes(zipWriter, name, options) {
|
|
6732
7044
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
6733
7045
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
|
|
@@ -6742,7 +7054,7 @@
|
|
|
6742
7054
|
checkIntegerOption(uid, MAX_32_BITS, ERR_INVALID_UID);
|
|
6743
7055
|
checkIntegerOption(gid, MAX_32_BITS, ERR_INVALID_GID);
|
|
6744
7056
|
checkIntegerOption(unixMode, MAX_16_BITS, ERR_INVALID_UNIX_MODE);
|
|
6745
|
-
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE
|
|
7057
|
+
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
|
|
6746
7058
|
throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
|
|
6747
7059
|
}
|
|
6748
7060
|
if (unixExtraFieldType === UNIX_EXTRA_FIELD_TYPE &&
|
|
@@ -6750,7 +7062,7 @@
|
|
|
6750
7062
|
throw new Error(ERR_INVALID_UNIX_ID_SIZE);
|
|
6751
7063
|
}
|
|
6752
7064
|
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
6753
|
-
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE
|
|
7065
|
+
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
|
|
6754
7066
|
}
|
|
6755
7067
|
let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
6756
7068
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
@@ -6881,7 +7193,9 @@
|
|
|
6881
7193
|
const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
|
|
6882
7194
|
const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
|
|
6883
7195
|
const internalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, 0);
|
|
6884
|
-
const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
|
|
7196
|
+
const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
|
|
7197
|
+
const passThroughCompression = Boolean(passThrough);
|
|
7198
|
+
const passThroughEncryption = passThrough === true;
|
|
6885
7199
|
const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6886
7200
|
const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6887
7201
|
checkPasswordOption(password, rawPassword);
|
|
@@ -6896,10 +7210,12 @@
|
|
|
6896
7210
|
const createTempStream = getFunctionOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
6897
7211
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
6898
7212
|
const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
|
|
6899
|
-
|
|
7213
|
+
throwIfAborted(signal);
|
|
7214
|
+
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
|
|
7215
|
+
!isPrintableASCIIText(rawFilename) || !isPrintableASCIIText(rawComment));
|
|
6900
7216
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
6901
|
-
const registeredCodec =
|
|
6902
|
-
if (!
|
|
7217
|
+
const registeredCodec = passThroughCompression || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
7218
|
+
if (!passThroughCompression && compressionMethod !== UNDEFINED_VALUE &&
|
|
6903
7219
|
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
|
|
6904
7220
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
6905
7221
|
}
|
|
@@ -6913,15 +7229,15 @@
|
|
|
6913
7229
|
level = 0;
|
|
6914
7230
|
}
|
|
6915
7231
|
}
|
|
6916
|
-
if (
|
|
6917
|
-
level =
|
|
7232
|
+
if (passThroughCompression) {
|
|
7233
|
+
level = toNumber(options[OPTION_LEVEL]);
|
|
6918
7234
|
}
|
|
6919
7235
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
6920
7236
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
6921
7237
|
if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
|
|
6922
7238
|
dataDescriptor = false;
|
|
6923
7239
|
}
|
|
6924
|
-
if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !
|
|
7240
|
+
if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThroughEncryption)) {
|
|
6925
7241
|
dataDescriptor = true;
|
|
6926
7242
|
}
|
|
6927
7243
|
if (level !== UNDEFINED_VALUE && level != 6) {
|
|
@@ -6945,7 +7261,8 @@
|
|
|
6945
7261
|
lastAccessDate,
|
|
6946
7262
|
creationDate,
|
|
6947
7263
|
internalFileAttributes,
|
|
6948
|
-
|
|
7264
|
+
passThroughCompression,
|
|
7265
|
+
passThroughEncryption,
|
|
6949
7266
|
password,
|
|
6950
7267
|
rawPassword,
|
|
6951
7268
|
encryptionStrength,
|
|
@@ -7006,7 +7323,7 @@
|
|
|
7006
7323
|
}
|
|
7007
7324
|
|
|
7008
7325
|
async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
|
|
7009
|
-
if (metadata.
|
|
7326
|
+
if (metadata.passThroughCompression && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
|
|
7010
7327
|
throw new Error(ERR_UNDEFINED_READER);
|
|
7011
7328
|
}
|
|
7012
7329
|
let contentSize;
|
|
@@ -7022,12 +7339,12 @@
|
|
|
7022
7339
|
}
|
|
7023
7340
|
|
|
7024
7341
|
function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options) {
|
|
7025
|
-
const {
|
|
7342
|
+
const { passThroughCompression, passThroughEncryption, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
|
|
7026
7343
|
let { dataDescriptor, zip64, level, compressionMethod } = metadata;
|
|
7027
7344
|
let maximumCompressedSize = 0;
|
|
7028
7345
|
let uncompressedSize = 0;
|
|
7029
7346
|
let unknownSize = false;
|
|
7030
|
-
if (
|
|
7347
|
+
if (passThroughCompression && hasContent) {
|
|
7031
7348
|
uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
|
|
7032
7349
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
7033
7350
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
@@ -7038,17 +7355,17 @@
|
|
|
7038
7355
|
}
|
|
7039
7356
|
const zip64Enabled = zip64 === true;
|
|
7040
7357
|
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
7041
|
-
if (hasContent &&
|
|
7358
|
+
if (hasContent && passThroughEncryption && !encrypted && getLength(password, rawPassword)) {
|
|
7042
7359
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH);
|
|
7043
7360
|
}
|
|
7044
|
-
const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (
|
|
7361
|
+
const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThroughEncryption && encrypted));
|
|
7045
7362
|
if (!hasContent) {
|
|
7046
7363
|
level = 0;
|
|
7047
7364
|
compressionMethod = COMPRESSION_METHOD_STORE;
|
|
7048
7365
|
}
|
|
7049
|
-
const encryptionOverhead = encryptedEntry
|
|
7366
|
+
const encryptionOverhead = getEncryptionOverhead(encryptedEntry, zipCrypto, encryptionStrength);
|
|
7050
7367
|
if (hasContent) {
|
|
7051
|
-
if (!
|
|
7368
|
+
if (!passThroughCompression) {
|
|
7052
7369
|
if (contentSize === UNDEFINED_VALUE) {
|
|
7053
7370
|
dataDescriptor = true;
|
|
7054
7371
|
if (zip64 || zip64 === UNDEFINED_VALUE) {
|
|
@@ -7061,10 +7378,12 @@
|
|
|
7061
7378
|
}
|
|
7062
7379
|
} else {
|
|
7063
7380
|
options.uncompressedSize = uncompressedSize;
|
|
7064
|
-
maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
|
|
7381
|
+
maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
|
|
7382
|
+
getMaximumCompressedSize(uncompressedSize) + encryptionOverhead :
|
|
7383
|
+
contentSize + (passThroughEncryption ? 0 : encryptionOverhead);
|
|
7065
7384
|
}
|
|
7066
7385
|
}
|
|
7067
|
-
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !
|
|
7386
|
+
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
|
|
7068
7387
|
if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
|
|
7069
7388
|
dataDescriptor = false;
|
|
7070
7389
|
}
|
|
@@ -7113,6 +7432,8 @@
|
|
|
7113
7432
|
const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
|
|
7114
7433
|
let offset = initialOffset;
|
|
7115
7434
|
let minimumEntrySize = INFINITY_VALUE;
|
|
7435
|
+
const entrySizes = [];
|
|
7436
|
+
const entriesAlreadyZip64 = new Set();
|
|
7116
7437
|
for (const entry of entries) {
|
|
7117
7438
|
let { name } = entry;
|
|
7118
7439
|
const { size } = entry;
|
|
@@ -7124,7 +7445,7 @@
|
|
|
7124
7445
|
({ name } = attributesInfo);
|
|
7125
7446
|
const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
|
|
7126
7447
|
if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
|
|
7127
|
-
!metadata.
|
|
7448
|
+
!metadata.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
|
|
7128
7449
|
metadata.level = 0;
|
|
7129
7450
|
}
|
|
7130
7451
|
const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
|
|
@@ -7132,7 +7453,7 @@
|
|
|
7132
7453
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7133
7454
|
}
|
|
7134
7455
|
const { maximumCompressedSize, resolvedOptions: sizes } = resolveEntrySizes(zipWriter, hasContent, size, metadata, options);
|
|
7135
|
-
if (hasContent && !metadata.
|
|
7456
|
+
if (hasContent && !metadata.passThroughCompression && isCompressed(sizes.compressionMethod, sizes.level)) {
|
|
7136
7457
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7137
7458
|
}
|
|
7138
7459
|
const entryOptions = Object.assign({}, options, attributesInfo.resolvedOptions, metadata, sizes, { [OPTION_USDZ]: usdz });
|
|
@@ -7152,10 +7473,15 @@
|
|
|
7152
7473
|
compressedSize
|
|
7153
7474
|
}));
|
|
7154
7475
|
const entrySize = entryInfo.metadataSize + compressedSize;
|
|
7476
|
+
entrySizes.push(entrySize);
|
|
7477
|
+
entriesAlreadyZip64.add(Boolean(entryOptions.zip64Enabled ||
|
|
7478
|
+
entryOptions.uncompressedSize >= MAX_32_BITS || compressedSize >= MAX_32_BITS));
|
|
7155
7479
|
minimumEntrySize = Math.min(minimumEntrySize, entrySize);
|
|
7156
7480
|
offset += entrySize;
|
|
7157
7481
|
}
|
|
7158
|
-
const layoutDependsOnWriteOrder = files.size > 1 && (usdz ||
|
|
7482
|
+
const layoutDependsOnWriteOrder = files.size > 1 && (usdz ||
|
|
7483
|
+
(offset - minimumEntrySize >= MAX_32_BITS &&
|
|
7484
|
+
(entriesAlreadyZip64.size > 1 || countEntriesBefore4GB(entrySizes, initialOffset, true) != countEntriesBefore4GB(entrySizes, initialOffset, false))));
|
|
7159
7485
|
if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
|
|
7160
7486
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7161
7487
|
}
|
|
@@ -7173,6 +7499,20 @@
|
|
|
7173
7499
|
return offset - initialOffset + directoryDataLength + commentLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
|
|
7174
7500
|
}
|
|
7175
7501
|
|
|
7502
|
+
function countEntriesBefore4GB(entrySizes, initialOffset, largestFirst) {
|
|
7503
|
+
const ordered = entrySizes.slice().sort((first, second) => largestFirst ? second - first : first - second);
|
|
7504
|
+
let position = initialOffset;
|
|
7505
|
+
let count = 0;
|
|
7506
|
+
for (const entrySize of ordered) {
|
|
7507
|
+
if (position >= MAX_32_BITS) {
|
|
7508
|
+
break;
|
|
7509
|
+
}
|
|
7510
|
+
position += entrySize;
|
|
7511
|
+
count++;
|
|
7512
|
+
}
|
|
7513
|
+
return count;
|
|
7514
|
+
}
|
|
7515
|
+
|
|
7176
7516
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
7177
7517
|
const {
|
|
7178
7518
|
fileEntries,
|
|
@@ -7348,6 +7688,7 @@
|
|
|
7348
7688
|
localExtraFieldZip64Length,
|
|
7349
7689
|
rawExtraFieldExtendedTimestamp,
|
|
7350
7690
|
extraFieldExtendedTimestampFlag,
|
|
7691
|
+
extraFieldExtendedTimestampTime,
|
|
7351
7692
|
rawExtraFieldNTFS,
|
|
7352
7693
|
rawExtraFieldUnix,
|
|
7353
7694
|
rawExtraFieldAES,
|
|
@@ -7360,6 +7701,7 @@
|
|
|
7360
7701
|
password,
|
|
7361
7702
|
rawPassword,
|
|
7362
7703
|
level,
|
|
7704
|
+
useUnicodeFileNames,
|
|
7363
7705
|
zip64,
|
|
7364
7706
|
zip64Enabled,
|
|
7365
7707
|
zip64UncompressedSize,
|
|
@@ -7394,7 +7736,8 @@
|
|
|
7394
7736
|
msdosAttributesRaw,
|
|
7395
7737
|
msdosAttributes,
|
|
7396
7738
|
useCompressionStream,
|
|
7397
|
-
|
|
7739
|
+
passThroughCompression,
|
|
7740
|
+
passThroughEncryption,
|
|
7398
7741
|
format,
|
|
7399
7742
|
codecURI
|
|
7400
7743
|
} = options;
|
|
@@ -7405,9 +7748,9 @@
|
|
|
7405
7748
|
zip64Enabled,
|
|
7406
7749
|
directory: Boolean(directory),
|
|
7407
7750
|
executable: Boolean(executable),
|
|
7408
|
-
filenameUTF8:
|
|
7751
|
+
filenameUTF8: Boolean(useUnicodeFileNames),
|
|
7409
7752
|
rawFilename,
|
|
7410
|
-
commentUTF8:
|
|
7753
|
+
commentUTF8: Boolean(useUnicodeFileNames),
|
|
7411
7754
|
rawComment,
|
|
7412
7755
|
rawExtraFieldZip64,
|
|
7413
7756
|
localExtraFieldZip64Length,
|
|
@@ -7438,7 +7781,7 @@
|
|
|
7438
7781
|
uncompressedSize
|
|
7439
7782
|
} = options;
|
|
7440
7783
|
let compressedSize = 0;
|
|
7441
|
-
if (!
|
|
7784
|
+
if (!passThroughCompression) {
|
|
7442
7785
|
uncompressedSize = 0;
|
|
7443
7786
|
}
|
|
7444
7787
|
const { writable } = writer;
|
|
@@ -7455,9 +7798,9 @@
|
|
|
7455
7798
|
encryptionStrength,
|
|
7456
7799
|
zipCrypto: encrypted && zipCrypto,
|
|
7457
7800
|
passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & MAX_8_BITS,
|
|
7458
|
-
computeCrc32: !
|
|
7459
|
-
compressed: compressed && !
|
|
7460
|
-
encrypted: encrypted && !
|
|
7801
|
+
computeCrc32: !passThroughCompression,
|
|
7802
|
+
compressed: compressed && !passThroughCompression,
|
|
7803
|
+
encrypted: encrypted && !passThroughEncryption,
|
|
7461
7804
|
useWebWorkers,
|
|
7462
7805
|
useCompressionStream,
|
|
7463
7806
|
transferStreams,
|
|
@@ -7472,7 +7815,7 @@
|
|
|
7472
7815
|
const result = await runWorker({ readable, writable }, workerOptions);
|
|
7473
7816
|
compressedSize = result.outputSize;
|
|
7474
7817
|
writer.size += compressedSize;
|
|
7475
|
-
if (!
|
|
7818
|
+
if (!passThroughCompression) {
|
|
7476
7819
|
uncompressedSize = result.inputSize;
|
|
7477
7820
|
if (!encrypted || zipCrypto) {
|
|
7478
7821
|
crc32 = result.crc32;
|
|
@@ -7515,8 +7858,9 @@
|
|
|
7515
7858
|
headerArray,
|
|
7516
7859
|
headerView,
|
|
7517
7860
|
signature: crc32,
|
|
7518
|
-
crc32: encrypted && !zipCrypto && !
|
|
7861
|
+
crc32: encrypted && !zipCrypto && !passThroughCompression ? UNDEFINED_VALUE : crc32,
|
|
7519
7862
|
extraFieldExtendedTimestampFlag,
|
|
7863
|
+
extraFieldExtendedTimestampTime,
|
|
7520
7864
|
zip64UncompressedSize,
|
|
7521
7865
|
zip64CompressedSize
|
|
7522
7866
|
});
|
|
@@ -7541,7 +7885,7 @@
|
|
|
7541
7885
|
encryptionStrength,
|
|
7542
7886
|
extendedTimestamp,
|
|
7543
7887
|
ntfsTimestamp,
|
|
7544
|
-
|
|
7888
|
+
passThroughCompression,
|
|
7545
7889
|
encrypted,
|
|
7546
7890
|
zip64UncompressedSize,
|
|
7547
7891
|
zip64CompressedSize,
|
|
@@ -7552,7 +7896,7 @@
|
|
|
7552
7896
|
let { version, compressionMethod } = options;
|
|
7553
7897
|
const compressed = !directory && isCompressed(compressionMethod, level);
|
|
7554
7898
|
let rawLocalExtraFieldZip64;
|
|
7555
|
-
const uncompressedFile =
|
|
7899
|
+
const uncompressedFile = passThroughCompression || !compressed;
|
|
7556
7900
|
const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || (uncompressedFile && !unknownSize)));
|
|
7557
7901
|
const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
|
|
7558
7902
|
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
@@ -7564,8 +7908,8 @@
|
|
|
7564
7908
|
if (zip64ExtraFieldComplete) {
|
|
7565
7909
|
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7566
7910
|
if (uncompressedFile) {
|
|
7567
|
-
const encryptionOverhead = encrypted
|
|
7568
|
-
extraFieldZip64.writeUint64(
|
|
7911
|
+
const encryptionOverhead = getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength);
|
|
7912
|
+
extraFieldZip64.writeUint64(passThroughCompression ? 0 : uncompressedSize + encryptionOverhead);
|
|
7569
7913
|
}
|
|
7570
7914
|
}
|
|
7571
7915
|
} else {
|
|
@@ -7584,6 +7928,7 @@
|
|
|
7584
7928
|
let rawExtraFieldNTFS;
|
|
7585
7929
|
let rawExtraFieldExtendedTimestamp;
|
|
7586
7930
|
let extraFieldExtendedTimestampFlag;
|
|
7931
|
+
let extraFieldExtendedTimestampTime;
|
|
7587
7932
|
if (extendedTimestamp) {
|
|
7588
7933
|
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
7589
7934
|
const lastModTimeUnixInRange = inUnixTimeRange(lastModTimeUnix);
|
|
@@ -7591,6 +7936,7 @@
|
|
|
7591
7936
|
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
7592
7937
|
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
7593
7938
|
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
7939
|
+
extraFieldExtendedTimestampTime = lastModTimeUnix;
|
|
7594
7940
|
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7595
7941
|
extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
|
|
7596
7942
|
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
@@ -7633,7 +7979,7 @@
|
|
|
7633
7979
|
let rawExtraFieldUnix;
|
|
7634
7980
|
try {
|
|
7635
7981
|
const { uid, gid, unixExtraFieldType } = options;
|
|
7636
|
-
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE
|
|
7982
|
+
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
7637
7983
|
const uidBytes = packUnixId(uid === UNDEFINED_VALUE ? 0 : uid);
|
|
7638
7984
|
const gidBytes = packUnixId(gid === UNDEFINED_VALUE ? 0 : gid);
|
|
7639
7985
|
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
@@ -7674,7 +8020,7 @@
|
|
|
7674
8020
|
}
|
|
7675
8021
|
if (encrypted && !zipCrypto) {
|
|
7676
8022
|
version = version > VERSION_AES ? version : VERSION_AES;
|
|
7677
|
-
if (
|
|
8023
|
+
if (passThroughCompression && crc32 !== UNDEFINED_VALUE) {
|
|
7678
8024
|
rawExtraFieldAES[EXTRAFIELD_OFFSET_AES_VENDOR_VERSION] = VENDOR_VERSION_AE_1;
|
|
7679
8025
|
}
|
|
7680
8026
|
setUint16(getDataView(rawExtraFieldAES), EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD, compressionMethod);
|
|
@@ -7736,12 +8082,14 @@
|
|
|
7736
8082
|
headerArray,
|
|
7737
8083
|
headerView,
|
|
7738
8084
|
lastModDate: storedLastModDate,
|
|
8085
|
+
lastModDateClamped: storedLastModDate === clampedLastModDate && dosLastModDate.getTime() != clampedLastModDate.getTime(),
|
|
7739
8086
|
rawLastModDate,
|
|
7740
8087
|
encrypted,
|
|
7741
8088
|
compressed,
|
|
7742
8089
|
version,
|
|
7743
8090
|
compressionMethod,
|
|
7744
8091
|
extraFieldExtendedTimestampFlag,
|
|
8092
|
+
extraFieldExtendedTimestampTime,
|
|
7745
8093
|
rawExtraFieldZip64: EMPTY_UINT8_ARRAY,
|
|
7746
8094
|
localExtraFieldZip64Length,
|
|
7747
8095
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -7844,7 +8192,7 @@
|
|
|
7844
8192
|
}, {
|
|
7845
8193
|
zip64,
|
|
7846
8194
|
zipCrypto,
|
|
7847
|
-
|
|
8195
|
+
passThroughCompression,
|
|
7848
8196
|
dataDescriptor
|
|
7849
8197
|
}) {
|
|
7850
8198
|
const {
|
|
@@ -7855,7 +8203,7 @@
|
|
|
7855
8203
|
dataDescriptorView,
|
|
7856
8204
|
dataDescriptorOffset
|
|
7857
8205
|
} = dataDescriptorInfo;
|
|
7858
|
-
if ((!encrypted || zipCrypto ||
|
|
8206
|
+
if ((!encrypted || zipCrypto || passThroughCompression) && crc32 !== UNDEFINED_VALUE) {
|
|
7859
8207
|
setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
|
|
7860
8208
|
if (dataDescriptor) {
|
|
7861
8209
|
setUint32(dataDescriptorView, dataDescriptorOffset, crc32);
|
|
@@ -7886,9 +8234,9 @@
|
|
|
7886
8234
|
uncompressedSize,
|
|
7887
8235
|
zip64UncompressedSize,
|
|
7888
8236
|
zip64CompressedSize
|
|
7889
|
-
}, localHeaderView, { dataDescriptor,
|
|
8237
|
+
}, localHeaderView, { dataDescriptor, passThroughCompression }) {
|
|
7890
8238
|
if (!dataDescriptor) {
|
|
7891
|
-
if (!encrypted || (
|
|
8239
|
+
if (!encrypted || (passThroughCompression && crc32 !== UNDEFINED_VALUE)) {
|
|
7892
8240
|
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, crc32);
|
|
7893
8241
|
}
|
|
7894
8242
|
if (!zip64CompressedSize) {
|
|
@@ -7925,9 +8273,8 @@
|
|
|
7925
8273
|
rawExtraFieldUnix,
|
|
7926
8274
|
rawExtraField,
|
|
7927
8275
|
rawCentralExtraField,
|
|
7928
|
-
extendedTimestamp,
|
|
7929
8276
|
extraFieldExtendedTimestampFlag,
|
|
7930
|
-
|
|
8277
|
+
extraFieldExtendedTimestampTime,
|
|
7931
8278
|
zip64Enabled,
|
|
7932
8279
|
uncompressedSize,
|
|
7933
8280
|
compressedSize
|
|
@@ -7970,16 +8317,15 @@
|
|
|
7970
8317
|
fileEntry.zip64Offset = zip64Offset;
|
|
7971
8318
|
fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
|
|
7972
8319
|
let rawExtraFieldTimestamp;
|
|
7973
|
-
|
|
7974
|
-
|
|
8320
|
+
if (extraFieldExtendedTimestampTime === UNDEFINED_VALUE) {
|
|
8321
|
+
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
8322
|
+
} else {
|
|
7975
8323
|
const extraFieldTimestamp = createRecordWriter(9);
|
|
7976
8324
|
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7977
8325
|
extraFieldTimestamp.writeUint16(5);
|
|
7978
8326
|
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7979
|
-
extraFieldTimestamp.writeUint32(
|
|
8327
|
+
extraFieldTimestamp.writeUint32(extraFieldExtendedTimestampTime);
|
|
7980
8328
|
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
7981
|
-
} else {
|
|
7982
|
-
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
7983
8329
|
}
|
|
7984
8330
|
fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
|
|
7985
8331
|
const extraFieldLength = getLength(
|
|
@@ -8479,6 +8825,11 @@
|
|
|
8479
8825
|
};
|
|
8480
8826
|
}
|
|
8481
8827
|
|
|
8828
|
+
function isPrintableASCIIText(rawText) {
|
|
8829
|
+
return rawText.every(characterCode =>
|
|
8830
|
+
characterCode >= MIN_PRINTABLE_ASCII_CHARACTER_CODE && characterCode <= MAX_PRINTABLE_ASCII_CHARACTER_CODE);
|
|
8831
|
+
}
|
|
8832
|
+
|
|
8482
8833
|
function getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted, compressionMethod) {
|
|
8483
8834
|
let bitFlag = 0;
|
|
8484
8835
|
if (useUnicodeFileNames) {
|
|
@@ -8640,7 +8991,7 @@
|
|
|
8640
8991
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
8641
8992
|
*/
|
|
8642
8993
|
|
|
8643
|
-
const VERSION = "2.
|
|
8994
|
+
const VERSION = "2.12.0";
|
|
8644
8995
|
|
|
8645
8996
|
/*
|
|
8646
8997
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9462,9 +9813,9 @@
|
|
|
9462
9813
|
DecompressionStreamFallback: DecompressionStreamZlib
|
|
9463
9814
|
});
|
|
9464
9815
|
|
|
9465
|
-
function terminateWorkersAndModule() {
|
|
9816
|
+
async function terminateWorkersAndModule() {
|
|
9817
|
+
await terminateWorkers();
|
|
9466
9818
|
modulePromise = null;
|
|
9467
|
-
terminateWorkers();
|
|
9468
9819
|
resetWasmModule();
|
|
9469
9820
|
}
|
|
9470
9821
|
|
|
@@ -9531,7 +9882,10 @@
|
|
|
9531
9882
|
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
9532
9883
|
const ERR_DUPLICATE_IMPORTED_ENTRY = "Duplicate entry filename in the imported zip file";
|
|
9533
9884
|
const ERR_INVALID_DUPLICATES = "Invalid duplicates option (must be \"throw\", \"keep-first\" or \"keep-last\")";
|
|
9534
|
-
const ERR_ANCESTOR_ENTRY = "Entry is
|
|
9885
|
+
const ERR_ANCESTOR_ENTRY = "Entry is an ancestor of target entry";
|
|
9886
|
+
const ERR_ROOT_DIRECTORY_NOT_MOVABLE = "Root directory cannot be moved";
|
|
9887
|
+
const ERR_TARGET_NOT_DIRECTORY = "Target entry is not a directory";
|
|
9888
|
+
const ERR_PARENT_NOT_DIRECTORY = "Parent entry is not a directory";
|
|
9535
9889
|
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
9536
9890
|
const DUPLICATES_THROW = "throw";
|
|
9537
9891
|
const DUPLICATES_KEEP_FIRST = "keep-first";
|
|
@@ -9539,24 +9893,8 @@
|
|
|
9539
9893
|
const DUPLICATES_VALUES = new Set([DUPLICATES_THROW, DUPLICATES_KEEP_FIRST, DUPLICATES_KEEP_LAST]);
|
|
9540
9894
|
const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
|
|
9541
9895
|
const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
|
|
9542
|
-
const
|
|
9896
|
+
const ERR_UNSUPPORTED_PASS_THROUGH_VALUE = "The 'compressed' passThrough option is only supported by Entry#getData() and ZipWriter#add()";
|
|
9543
9897
|
const ERR_ABORT_EXPORT = "zipjs-abort-export";
|
|
9544
|
-
const ERR_ABORTED = "The operation was aborted";
|
|
9545
|
-
const ABORT_ERROR_NAME = "AbortError";
|
|
9546
|
-
const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
|
|
9547
|
-
const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
|
|
9548
|
-
EXTRAFIELD_TYPE_ZIP64,
|
|
9549
|
-
EXTRAFIELD_TYPE_AES,
|
|
9550
|
-
EXTRAFIELD_TYPE_NTFS,
|
|
9551
|
-
EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
|
|
9552
|
-
EXTRAFIELD_TYPE_UNICODE_PATH,
|
|
9553
|
-
EXTRAFIELD_TYPE_UNICODE_COMMENT,
|
|
9554
|
-
EXTRAFIELD_TYPE_USDZ,
|
|
9555
|
-
EXTRAFIELD_TYPE_INFOZIP,
|
|
9556
|
-
EXTRAFIELD_TYPE_UNIX,
|
|
9557
|
-
EXTRAFIELD_TYPE_UNIX_TYPE1,
|
|
9558
|
-
EXTRAFIELD_TYPE_PKWARE_UNIX
|
|
9559
|
-
]);
|
|
9560
9898
|
|
|
9561
9899
|
class ZipEntry {
|
|
9562
9900
|
|
|
@@ -9928,6 +10266,7 @@
|
|
|
9928
10266
|
await initStream(reader);
|
|
9929
10267
|
zipReader = new ZipReader(reader, options);
|
|
9930
10268
|
}
|
|
10269
|
+
checkPassThroughValue(options.passThrough);
|
|
9931
10270
|
const duplicates = checkDuplicatesOption(options.duplicates);
|
|
9932
10271
|
const importedEntries = [];
|
|
9933
10272
|
const entries = await zipReader.getEntries(options);
|
|
@@ -10018,18 +10357,25 @@
|
|
|
10018
10357
|
|
|
10019
10358
|
async exportZip(writer, options = {}) {
|
|
10020
10359
|
const zipEntry = this;
|
|
10360
|
+
const zipWriterProvided = Boolean(writer) && typeof writer.add == FUNCTION_TYPE;
|
|
10021
10361
|
options = Object.assign({}, options);
|
|
10022
|
-
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
10362
|
+
if (!zipWriterProvided && options.bufferedWrite === UNDEFINED_VALUE) {
|
|
10023
10363
|
options.bufferedWrite = true;
|
|
10024
10364
|
}
|
|
10025
|
-
const [readers] = await Promise.all([
|
|
10026
|
-
|
|
10365
|
+
const [readers] = await Promise.all([
|
|
10366
|
+
initReaders(zipEntry, checkReaderOptions(options.readerOptions)),
|
|
10367
|
+
zipWriterProvided ? UNDEFINED_VALUE : initStream(writer)
|
|
10368
|
+
]);
|
|
10369
|
+
const zipWriter = zipWriterProvided ? writer : new ZipWriter(writer, options);
|
|
10027
10370
|
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
|
|
10371
|
+
if (zipWriterProvided) {
|
|
10372
|
+
return zipWriter;
|
|
10373
|
+
}
|
|
10028
10374
|
await zipWriter.close(options.globalComment);
|
|
10029
10375
|
return writer.getData ? writer.getData() : writer.writable;
|
|
10030
10376
|
}
|
|
10031
10377
|
|
|
10032
|
-
getExportedSize(options = {}) {
|
|
10378
|
+
async getExportedSize(options = {}) {
|
|
10033
10379
|
const zipEntry = this;
|
|
10034
10380
|
options = Object.assign({}, options);
|
|
10035
10381
|
checkReaderOptions(options.readerOptions);
|
|
@@ -10044,7 +10390,7 @@
|
|
|
10044
10390
|
const writeOrderGuaranteed = !options.bufferedWrite ||
|
|
10045
10391
|
(entries.every(entry => entry.options.keepOrder !== false) &&
|
|
10046
10392
|
children.every(child => isImplicitDirectory(child) || !child.children.length));
|
|
10047
|
-
return getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
|
|
10393
|
+
return await getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
|
|
10048
10394
|
}
|
|
10049
10395
|
|
|
10050
10396
|
getChildByName(name) {
|
|
@@ -10105,7 +10451,7 @@
|
|
|
10105
10451
|
|
|
10106
10452
|
move(entry, destination) {
|
|
10107
10453
|
if (entry == this.root) {
|
|
10108
|
-
throw new Error(
|
|
10454
|
+
throw new Error(ERR_ROOT_DIRECTORY_NOT_MOVABLE);
|
|
10109
10455
|
} else {
|
|
10110
10456
|
if (destination.directory) {
|
|
10111
10457
|
if (!destination.isDescendantOf(entry)) {
|
|
@@ -10126,7 +10472,7 @@
|
|
|
10126
10472
|
throw new Error(ERR_ANCESTOR_ENTRY);
|
|
10127
10473
|
}
|
|
10128
10474
|
} else {
|
|
10129
|
-
throw new Error(
|
|
10475
|
+
throw new Error(ERR_TARGET_NOT_DIRECTORY);
|
|
10130
10476
|
}
|
|
10131
10477
|
}
|
|
10132
10478
|
}
|
|
@@ -10439,70 +10785,11 @@
|
|
|
10439
10785
|
let zipEntryMetadata = {};
|
|
10440
10786
|
let passThroughOptions = {};
|
|
10441
10787
|
if (child.data instanceof Entry) {
|
|
10442
|
-
const
|
|
10443
|
-
|
|
10444
|
-
|
|
10445
|
-
|
|
10446
|
-
|
|
10447
|
-
rawLastModDate,
|
|
10448
|
-
creationDate,
|
|
10449
|
-
lastAccessDate,
|
|
10450
|
-
uncompressedSize,
|
|
10451
|
-
encrypted,
|
|
10452
|
-
zipCrypto,
|
|
10453
|
-
crc32,
|
|
10454
|
-
compressionMethod,
|
|
10455
|
-
extraFieldAES,
|
|
10456
|
-
internalFileAttributes,
|
|
10457
|
-
extraField,
|
|
10458
|
-
bitFlag,
|
|
10459
|
-
uid,
|
|
10460
|
-
gid
|
|
10461
|
-
} = child.data;
|
|
10462
|
-
zipEntryMetadata = {
|
|
10463
|
-
externalFileAttributes,
|
|
10464
|
-
versionMadeBy,
|
|
10465
|
-
comment,
|
|
10466
|
-
lastModDate,
|
|
10467
|
-
creationDate,
|
|
10468
|
-
lastAccessDate,
|
|
10469
|
-
internalFileAttributes
|
|
10470
|
-
};
|
|
10471
|
-
const userExtraField = getUserExtraField(extraField);
|
|
10472
|
-
if (userExtraField) {
|
|
10473
|
-
zipEntryMetadata.extraField = userExtraField;
|
|
10474
|
-
}
|
|
10475
|
-
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
10476
|
-
Object.assign(zipEntryMetadata, {
|
|
10477
|
-
uid,
|
|
10478
|
-
gid,
|
|
10479
|
-
unixExtraFieldType: INFOZIP_EXTRA_FIELD_TYPE
|
|
10480
|
-
});
|
|
10481
|
-
}
|
|
10482
|
-
if (isPassThrough(child, options)) {
|
|
10483
|
-
let encryptionStrength;
|
|
10484
|
-
if (extraFieldAES) {
|
|
10485
|
-
encryptionStrength = extraFieldAES.strength;
|
|
10486
|
-
}
|
|
10487
|
-
passThroughOptions = {
|
|
10488
|
-
passThrough: true,
|
|
10489
|
-
encrypted,
|
|
10490
|
-
zipCrypto,
|
|
10491
|
-
crc32,
|
|
10492
|
-
uncompressedSize,
|
|
10493
|
-
encryptionStrength,
|
|
10494
|
-
compressionMethod
|
|
10495
|
-
};
|
|
10496
|
-
if (bitFlag) {
|
|
10497
|
-
passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
|
|
10498
|
-
}
|
|
10499
|
-
const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
|
|
10500
|
-
if (lastModDateOverride === UNDEFINED_VALUE) {
|
|
10501
|
-
passThroughOptions.rawLastModDate = rawLastModDate;
|
|
10502
|
-
} else if (zipCrypto && (!bitFlag || bitFlag.dataDescriptor) && lastModDateOverride instanceof Date &&
|
|
10503
|
-
getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
|
|
10504
|
-
throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
|
|
10505
|
-
}
|
|
10788
|
+
const passThrough = isPassThrough(child, options);
|
|
10789
|
+
const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
|
|
10790
|
+
({ entryOptions: zipEntryMetadata, passThroughOptions } = getSourceEntryOptions(child.data, passThrough, lastModDateOverride));
|
|
10791
|
+
if (passThrough) {
|
|
10792
|
+
passThroughOptions.passThrough = true;
|
|
10506
10793
|
}
|
|
10507
10794
|
}
|
|
10508
10795
|
const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
|
|
@@ -10512,16 +10799,6 @@
|
|
|
10512
10799
|
return { name, entryOptions };
|
|
10513
10800
|
}
|
|
10514
10801
|
|
|
10515
|
-
function getDosTimeHighByte(lastModDate) {
|
|
10516
|
-
let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
|
|
10517
|
-
if (dosLastModDate < MIN_DATE) {
|
|
10518
|
-
dosLastModDate = MIN_DATE;
|
|
10519
|
-
} else if (dosLastModDate > MAX_DATE) {
|
|
10520
|
-
dosLastModDate = MAX_DATE;
|
|
10521
|
-
}
|
|
10522
|
-
return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
|
|
10523
|
-
}
|
|
10524
|
-
|
|
10525
10802
|
function getDeterminedSize(child, passThrough) {
|
|
10526
10803
|
const { reader } = child;
|
|
10527
10804
|
if (reader && reader.size !== UNDEFINED_VALUE) {
|
|
@@ -10534,9 +10811,18 @@
|
|
|
10534
10811
|
if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
|
|
10535
10812
|
throw new Error(ERR_INVALID_READER_OPTIONS);
|
|
10536
10813
|
}
|
|
10814
|
+
if (readerOptions) {
|
|
10815
|
+
checkPassThroughValue(readerOptions.passThrough);
|
|
10816
|
+
}
|
|
10537
10817
|
return readerOptions;
|
|
10538
10818
|
}
|
|
10539
10819
|
|
|
10820
|
+
function checkPassThroughValue(passThrough) {
|
|
10821
|
+
if (checkPassThroughOption(passThrough) === PASS_THROUGH_COMPRESSED) {
|
|
10822
|
+
throw new Error(ERR_UNSUPPORTED_PASS_THROUGH_VALUE);
|
|
10823
|
+
}
|
|
10824
|
+
}
|
|
10825
|
+
|
|
10540
10826
|
function replaceContent(zipEntry, params) {
|
|
10541
10827
|
const { uncompressedSize } = params;
|
|
10542
10828
|
Object.assign(zipEntry, params, {
|
|
@@ -10565,20 +10851,6 @@
|
|
|
10565
10851
|
return child.directory && child.data === null;
|
|
10566
10852
|
}
|
|
10567
10853
|
|
|
10568
|
-
function getUserExtraField(extraField) {
|
|
10569
|
-
if (extraField) {
|
|
10570
|
-
const userExtraField = new Map();
|
|
10571
|
-
extraField.forEach((field, type) => {
|
|
10572
|
-
if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
|
|
10573
|
-
userExtraField.set(type, field.data);
|
|
10574
|
-
}
|
|
10575
|
-
});
|
|
10576
|
-
if (userExtraField.size) {
|
|
10577
|
-
return userExtraField;
|
|
10578
|
-
}
|
|
10579
|
-
}
|
|
10580
|
-
}
|
|
10581
|
-
|
|
10582
10854
|
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
10583
10855
|
const { onstart, onprogress, onend, onentryprogress } = options;
|
|
10584
10856
|
const selectedEntry = entry;
|
|
@@ -10681,6 +10953,7 @@
|
|
|
10681
10953
|
|
|
10682
10954
|
async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
10683
10955
|
const { onstart, onprogress, onend } = options;
|
|
10956
|
+
checkPassThroughValue(options.passThrough);
|
|
10684
10957
|
const readerOptions = checkReaderOptions(options.readerOptions);
|
|
10685
10958
|
const abortController = new AbortController();
|
|
10686
10959
|
const { signal } = abortController;
|
|
@@ -10756,7 +11029,7 @@
|
|
|
10756
11029
|
if (exportAborted || isExportAborted(signal.reason)) {
|
|
10757
11030
|
return;
|
|
10758
11031
|
}
|
|
10759
|
-
|
|
11032
|
+
throwIfAborted(signal);
|
|
10760
11033
|
}
|
|
10761
11034
|
try {
|
|
10762
11035
|
if (child.directory) {
|
|
@@ -10889,7 +11162,7 @@
|
|
|
10889
11162
|
}
|
|
10890
11163
|
return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent);
|
|
10891
11164
|
} else {
|
|
10892
|
-
throw new Error(
|
|
11165
|
+
throw new Error(ERR_PARENT_NOT_DIRECTORY);
|
|
10893
11166
|
}
|
|
10894
11167
|
}
|
|
10895
11168
|
|
|
@@ -11031,6 +11304,7 @@
|
|
|
11031
11304
|
exports.Data64URIWriter = Data64URIWriter;
|
|
11032
11305
|
exports.ERR_ABORTED = ERR_ABORTED;
|
|
11033
11306
|
exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
|
|
11307
|
+
exports.ERR_ANCESTOR_ENTRY = ERR_ANCESTOR_ENTRY;
|
|
11034
11308
|
exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
|
|
11035
11309
|
exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
11036
11310
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
@@ -11044,7 +11318,9 @@
|
|
|
11044
11318
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
11045
11319
|
exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
|
|
11046
11320
|
exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
|
|
11321
|
+
exports.ERR_HTTP_STATUS = ERR_HTTP_STATUS;
|
|
11047
11322
|
exports.ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_AUTHENTICATION_CODE;
|
|
11323
|
+
exports.ERR_INVALID_BASE_URI = ERR_INVALID_BASE_URI;
|
|
11048
11324
|
exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
|
|
11049
11325
|
exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
|
|
11050
11326
|
exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
@@ -11054,6 +11330,7 @@
|
|
|
11054
11330
|
exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
|
|
11055
11331
|
exports.ERR_INVALID_DUPLICATES = ERR_INVALID_DUPLICATES;
|
|
11056
11332
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
11333
|
+
exports.ERR_INVALID_ENTRY = ERR_INVALID_ENTRY;
|
|
11057
11334
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
11058
11335
|
exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
|
|
11059
11336
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
@@ -11072,6 +11349,7 @@
|
|
|
11072
11349
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
11073
11350
|
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
11074
11351
|
exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
|
|
11352
|
+
exports.ERR_INVALID_PASS_THROUGH_VALUE = ERR_INVALID_PASS_THROUGH_VALUE;
|
|
11075
11353
|
exports.ERR_INVALID_READER = ERR_INVALID_READER;
|
|
11076
11354
|
exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
|
|
11077
11355
|
exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
|
|
@@ -11082,14 +11360,19 @@
|
|
|
11082
11360
|
exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
|
|
11083
11361
|
exports.ERR_INVALID_UNIX_ID_SIZE = ERR_INVALID_UNIX_ID_SIZE;
|
|
11084
11362
|
exports.ERR_INVALID_UNIX_MODE = ERR_INVALID_UNIX_MODE;
|
|
11363
|
+
exports.ERR_INVALID_URI = ERR_INVALID_URI;
|
|
11085
11364
|
exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
|
|
11086
11365
|
exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
|
|
11087
11366
|
exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
|
|
11088
11367
|
exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
11368
|
+
exports.ERR_PARENT_NOT_DIRECTORY = ERR_PARENT_NOT_DIRECTORY;
|
|
11089
11369
|
exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
|
|
11090
11370
|
exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
11371
|
+
exports.ERR_ROOT_DIRECTORY_NOT_MOVABLE = ERR_ROOT_DIRECTORY_NOT_MOVABLE;
|
|
11091
11372
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
11373
|
+
exports.ERR_TARGET_NOT_DIRECTORY = ERR_TARGET_NOT_DIRECTORY;
|
|
11092
11374
|
exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
|
|
11375
|
+
exports.ERR_UNDEFINED_CRC32 = ERR_UNDEFINED_CRC32;
|
|
11093
11376
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
11094
11377
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
11095
11378
|
exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
|
|
@@ -11101,10 +11384,12 @@
|
|
|
11101
11384
|
exports.ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH;
|
|
11102
11385
|
exports.ERR_UNSUPPORTED_ENCRYPTION_USDZ = ERR_UNSUPPORTED_ENCRYPTION_USDZ;
|
|
11103
11386
|
exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
|
|
11387
|
+
exports.ERR_UNSUPPORTED_PASS_THROUGH_VALUE = ERR_UNSUPPORTED_PASS_THROUGH_VALUE;
|
|
11104
11388
|
exports.ERR_UNSUPPORTED_SPLIT_USDZ = ERR_UNSUPPORTED_SPLIT_USDZ;
|
|
11105
11389
|
exports.ERR_UNSUPPORTED_UINT64 = ERR_UNSUPPORTED_UINT64;
|
|
11106
11390
|
exports.ERR_WORKER_STARTUP_TIMEOUT = ERR_WORKER_STARTUP_TIMEOUT;
|
|
11107
11391
|
exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
|
|
11392
|
+
exports.ERR_WRITER_SIZE_NOT_WRITABLE = ERR_WRITER_SIZE_NOT_WRITABLE;
|
|
11108
11393
|
exports.ERR_ZIP_CRYPTO_LAST_MOD_DATE = ERR_ZIP_CRYPTO_LAST_MOD_DATE;
|
|
11109
11394
|
exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
|
|
11110
11395
|
exports.HttpRangeReader = HttpRangeReader;
|
|
@@ -11118,13 +11403,17 @@
|
|
|
11118
11403
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
11119
11404
|
exports.VERSION = VERSION;
|
|
11120
11405
|
exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
|
|
11406
|
+
exports.WARNING_CLAMPED_LAST_MODIFICATION_DATE = WARNING_CLAMPED_LAST_MODIFICATION_DATE;
|
|
11121
11407
|
exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
|
|
11408
|
+
exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
|
|
11122
11409
|
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
11123
11410
|
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
11124
11411
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
11125
11412
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
11126
11413
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
11414
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
|
|
11127
11415
|
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
11416
|
+
exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
|
|
11128
11417
|
exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
|
|
11129
11418
|
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|
|
11130
11419
|
exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
|