@zip.js/zip.js 2.11.4 → 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 +427 -110
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +437 -107
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +492 -230
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +505 -227
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +492 -230
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +507 -229
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +508 -230
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +439 -109
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +439 -109
- 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 +440 -110
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +507 -229
- package/index-native.min.js +1 -1
- package/index.cjs +508 -230
- package/index.d.cts +468 -59
- package/index.d.ts +468 -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 +13 -5
- package/lib/core/options.js +16 -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 -132
- package/lib/core/zip-reader.js +106 -48
- package/lib/core/zip-writer.js +236 -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.js
CHANGED
|
@@ -134,6 +134,7 @@
|
|
|
134
134
|
const BOOLEAN_TYPE = "boolean";
|
|
135
135
|
|
|
136
136
|
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
137
|
+
const SYMBOL_ASYNC_DISPOSE = Symbol.asyncDispose || Symbol();
|
|
137
138
|
|
|
138
139
|
/*
|
|
139
140
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -178,6 +179,7 @@
|
|
|
178
179
|
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
179
180
|
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
180
181
|
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
182
|
+
const OPTION_CHECK_LOCAL_FILENAME = "checkLocalFilename";
|
|
181
183
|
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
182
184
|
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
183
185
|
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
@@ -208,15 +210,18 @@
|
|
|
208
210
|
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
209
211
|
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
210
212
|
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
213
|
+
const OPTION_ENTRY = "entry";
|
|
211
214
|
const TEXT_TYPE_FILENAME = "filename";
|
|
212
215
|
const TEXT_TYPE_COMMENT = "comment";
|
|
213
216
|
const STRICTNESS_STRICT = "strict";
|
|
214
217
|
const STRICTNESS_BALANCED = "balanced";
|
|
215
218
|
const STRICTNESS_TOLERANT = "tolerant";
|
|
219
|
+
const PASS_THROUGH_COMPRESSED = "compressed";
|
|
216
220
|
|
|
217
221
|
const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
|
|
218
222
|
const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
|
|
219
223
|
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
224
|
+
const ERR_INVALID_PASS_THROUGH_VALUE = "Invalid passThrough option (must be a boolean or 'compressed')";
|
|
220
225
|
const ERR_ABORTED = "The operation was aborted";
|
|
221
226
|
const ABORT_ERROR_NAME = "AbortError";
|
|
222
227
|
|
|
@@ -246,6 +251,13 @@
|
|
|
246
251
|
}
|
|
247
252
|
}
|
|
248
253
|
|
|
254
|
+
function checkPassThroughOption(passThrough) {
|
|
255
|
+
if (passThrough !== UNDEFINED_VALUE && typeof passThrough != BOOLEAN_TYPE && passThrough !== PASS_THROUGH_COMPRESSED) {
|
|
256
|
+
throw new Error(ERR_INVALID_PASS_THROUGH_VALUE);
|
|
257
|
+
}
|
|
258
|
+
return passThrough;
|
|
259
|
+
}
|
|
260
|
+
|
|
249
261
|
function checkInteger(value, maxValue, errorMessage) {
|
|
250
262
|
if (!Number.isInteger(value) || value < 0 || value > maxValue) {
|
|
251
263
|
throw new Error(errorMessage);
|
|
@@ -295,6 +307,8 @@
|
|
|
295
307
|
const MINIMUM_CHUNK_SIZE = 64;
|
|
296
308
|
const MINIMUM_PROPERTY_VALUE = 1;
|
|
297
309
|
const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
|
|
310
|
+
const ERR_INVALID_BASE_URI = "Invalid baseURI (must be a string)";
|
|
311
|
+
const ERR_INVALID_URI = "Invalid URI (must be a string or a function returning a string)";
|
|
298
312
|
let maxWorkers = 2;
|
|
299
313
|
try {
|
|
300
314
|
if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
|
|
@@ -319,9 +333,9 @@
|
|
|
319
333
|
};
|
|
320
334
|
|
|
321
335
|
const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
|
|
336
|
+
const PROPERTY_NAME_BASE_URI = "baseURI";
|
|
322
337
|
|
|
323
|
-
const
|
|
324
|
-
"baseURI",
|
|
338
|
+
const URI_PROPERTY_NAMES = [
|
|
325
339
|
"wasmURI",
|
|
326
340
|
"workerURI"
|
|
327
341
|
];
|
|
@@ -345,7 +359,8 @@
|
|
|
345
359
|
"DecompressionStreamFallback"
|
|
346
360
|
];
|
|
347
361
|
const CONFIGURABLE_PROPERTY_NAMES = [
|
|
348
|
-
|
|
362
|
+
PROPERTY_NAME_BASE_URI,
|
|
363
|
+
...URI_PROPERTY_NAMES,
|
|
349
364
|
...BOOLEAN_PROPERTY_NAMES,
|
|
350
365
|
...NUMBER_PROPERTY_NAMES,
|
|
351
366
|
...FUNCTION_PROPERTY_NAMES
|
|
@@ -389,6 +404,14 @@
|
|
|
389
404
|
}
|
|
390
405
|
} else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
|
|
391
406
|
checkFunctionOption(propertyValue);
|
|
407
|
+
} else if (propertyName == PROPERTY_NAME_BASE_URI) {
|
|
408
|
+
if (propertyValue && typeof propertyValue != STRING_TYPE) {
|
|
409
|
+
throw new Error(ERR_INVALID_BASE_URI);
|
|
410
|
+
}
|
|
411
|
+
} else if (URI_PROPERTY_NAMES.includes(propertyName)) {
|
|
412
|
+
if (propertyValue && typeof propertyValue != STRING_TYPE && typeof propertyValue != FUNCTION_TYPE) {
|
|
413
|
+
throw new Error(ERR_INVALID_URI);
|
|
414
|
+
}
|
|
392
415
|
}
|
|
393
416
|
return propertyValue;
|
|
394
417
|
}
|
|
@@ -422,7 +445,7 @@
|
|
|
422
445
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
423
446
|
}
|
|
424
447
|
|
|
425
|
-
const 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)}});
|
|
426
449
|
|
|
427
450
|
/*
|
|
428
451
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -2607,6 +2630,7 @@
|
|
|
2607
2630
|
constructor(chunkSize) {
|
|
2608
2631
|
const pendingChunks = [];
|
|
2609
2632
|
let pendingLength = 0;
|
|
2633
|
+
let outputSize = 0;
|
|
2610
2634
|
if (!Number.isFinite(chunkSize) || chunkSize < 1) {
|
|
2611
2635
|
chunkSize = DEFAULT_CHUNK_SIZE;
|
|
2612
2636
|
}
|
|
@@ -2615,15 +2639,20 @@
|
|
|
2615
2639
|
pendingChunks.push(chunk);
|
|
2616
2640
|
pendingLength += chunk.length;
|
|
2617
2641
|
while (pendingLength > chunkSize) {
|
|
2642
|
+
outputSize += chunkSize;
|
|
2618
2643
|
controller.enqueue(shiftChunk());
|
|
2619
2644
|
}
|
|
2620
2645
|
},
|
|
2621
2646
|
flush(controller) {
|
|
2622
2647
|
if (pendingLength) {
|
|
2648
|
+
outputSize += pendingLength;
|
|
2623
2649
|
controller.enqueue(concatChunks(pendingChunks, pendingLength));
|
|
2624
2650
|
}
|
|
2625
2651
|
}
|
|
2626
2652
|
});
|
|
2653
|
+
Object.defineProperty(this, "outputSize", {
|
|
2654
|
+
get: () => outputSize
|
|
2655
|
+
});
|
|
2627
2656
|
|
|
2628
2657
|
function shiftChunk() {
|
|
2629
2658
|
const result = new Uint8Array(chunkSize);
|
|
@@ -2828,7 +2857,7 @@
|
|
|
2828
2857
|
}
|
|
2829
2858
|
|
|
2830
2859
|
async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
|
|
2831
|
-
let codecStream;
|
|
2860
|
+
let codecStream, chunkStream;
|
|
2832
2861
|
try {
|
|
2833
2862
|
if (options.compressed && !options.format) {
|
|
2834
2863
|
const deflate = options.codecType.startsWith(CODEC_DEFLATE);
|
|
@@ -2851,9 +2880,10 @@
|
|
|
2851
2880
|
}
|
|
2852
2881
|
}
|
|
2853
2882
|
codecStream = new CodecStream(options, config);
|
|
2883
|
+
chunkStream = new ChunkStream(getChunkSize(config));
|
|
2854
2884
|
await readable
|
|
2855
2885
|
.pipeThrough(codecStream)
|
|
2856
|
-
.pipeThrough(
|
|
2886
|
+
.pipeThrough(chunkStream)
|
|
2857
2887
|
.pipeTo(writable, { preventClose: true, preventAbort: true });
|
|
2858
2888
|
const {
|
|
2859
2889
|
crc32,
|
|
@@ -2867,7 +2897,7 @@
|
|
|
2867
2897
|
};
|
|
2868
2898
|
} catch (error) {
|
|
2869
2899
|
if (codecStream) {
|
|
2870
|
-
error.outputSize =
|
|
2900
|
+
error.outputSize = chunkStream ? chunkStream.outputSize : 0;
|
|
2871
2901
|
}
|
|
2872
2902
|
throw error;
|
|
2873
2903
|
} finally {
|
|
@@ -2976,11 +3006,17 @@
|
|
|
2976
3006
|
let resolveResult, rejectResult;
|
|
2977
3007
|
const result = new Promise((resolve, reject) => {
|
|
2978
3008
|
resolveResult = resolve;
|
|
2979
|
-
rejectResult =
|
|
3009
|
+
rejectResult = error => {
|
|
3010
|
+
if (error && error.outputSize === UNDEFINED_VALUE) {
|
|
3011
|
+
error.outputSize = workerData.outputSize;
|
|
3012
|
+
}
|
|
3013
|
+
reject(error);
|
|
3014
|
+
};
|
|
2980
3015
|
});
|
|
2981
3016
|
Object.assign(workerData, {
|
|
2982
3017
|
reader: null,
|
|
2983
3018
|
writer: null,
|
|
3019
|
+
outputSize: 0,
|
|
2984
3020
|
resolveResult,
|
|
2985
3021
|
rejectResult,
|
|
2986
3022
|
result
|
|
@@ -3264,8 +3300,10 @@
|
|
|
3264
3300
|
}
|
|
3265
3301
|
}
|
|
3266
3302
|
if (type == MESSAGE_DATA) {
|
|
3303
|
+
const chunk = new Uint8Array(value);
|
|
3267
3304
|
await writer.ready;
|
|
3268
|
-
await writer.write(
|
|
3305
|
+
await writer.write(chunk);
|
|
3306
|
+
workerData.outputSize += chunk.length;
|
|
3269
3307
|
if (!stale()) {
|
|
3270
3308
|
sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
|
|
3271
3309
|
}
|
|
@@ -3573,10 +3611,13 @@
|
|
|
3573
3611
|
|
|
3574
3612
|
|
|
3575
3613
|
const ERR_HTTP_STATUS = "HTTP error ";
|
|
3614
|
+
const MIN_SUCCESS_HTTP_STATUS = 200;
|
|
3615
|
+
const MAX_SUCCESS_HTTP_STATUS = 299;
|
|
3576
3616
|
const ERR_HTTP_RANGE = "HTTP Range not supported";
|
|
3577
3617
|
const ERR_HTTP_RESOURCE_CHANGED = "HTTP resource changed";
|
|
3578
3618
|
const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
|
|
3579
3619
|
const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
|
|
3620
|
+
const ERR_WRITER_SIZE_NOT_WRITABLE = "Invalid writer (size must be writable)";
|
|
3580
3621
|
|
|
3581
3622
|
const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
|
|
3582
3623
|
const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
|
|
@@ -3768,6 +3809,7 @@
|
|
|
3768
3809
|
const reader = this;
|
|
3769
3810
|
const { sourceBlob, size } = reader;
|
|
3770
3811
|
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
3812
|
+
// deno-lint-ignore valid-typeof
|
|
3771
3813
|
if (typeof sourceBlob.stream == FUNCTION_TYPE) {
|
|
3772
3814
|
if (!offset && readSize >= size) {
|
|
3773
3815
|
return toCompatibleReadable(sourceBlob.stream());
|
|
@@ -4154,7 +4196,7 @@
|
|
|
4154
4196
|
|
|
4155
4197
|
async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
|
|
4156
4198
|
const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
|
|
4157
|
-
if (response.status
|
|
4199
|
+
if (response.status >= MIN_SUCCESS_HTTP_STATUS && response.status <= MAX_SUCCESS_HTTP_STATUS) {
|
|
4158
4200
|
return response;
|
|
4159
4201
|
} else {
|
|
4160
4202
|
throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
|
|
@@ -4165,7 +4207,7 @@
|
|
|
4165
4207
|
return new Promise((resolve, reject) => {
|
|
4166
4208
|
const request = new XMLHttpRequest();
|
|
4167
4209
|
request.addEventListener("load", () => {
|
|
4168
|
-
if (request.status
|
|
4210
|
+
if (request.status >= MIN_SUCCESS_HTTP_STATUS && request.status <= MAX_SUCCESS_HTTP_STATUS) {
|
|
4169
4211
|
const headers = [];
|
|
4170
4212
|
request.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach(header => {
|
|
4171
4213
|
const splitHeader = header.trim().split(/\s*:\s*/);
|
|
@@ -4469,8 +4511,10 @@
|
|
|
4469
4511
|
writable: toCompatibleWritable(writer)
|
|
4470
4512
|
};
|
|
4471
4513
|
}
|
|
4472
|
-
|
|
4473
|
-
writer.size = 0;
|
|
4514
|
+
try {
|
|
4515
|
+
writer.size = writer.size === UNDEFINED_VALUE ? 0 : writer.size;
|
|
4516
|
+
} catch {
|
|
4517
|
+
throw new Error(ERR_WRITER_SIZE_NOT_WRITABLE);
|
|
4474
4518
|
}
|
|
4475
4519
|
return writer;
|
|
4476
4520
|
}
|
|
@@ -4518,6 +4562,45 @@
|
|
|
4518
4562
|
}
|
|
4519
4563
|
}
|
|
4520
4564
|
|
|
4565
|
+
/*
|
|
4566
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
4567
|
+
|
|
4568
|
+
Redistribution and use in source and binary forms, with or without
|
|
4569
|
+
modification, are permitted provided that the following conditions are met:
|
|
4570
|
+
|
|
4571
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
4572
|
+
this list of conditions and the following disclaimer.
|
|
4573
|
+
|
|
4574
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
4575
|
+
notice, this list of conditions and the following disclaimer in
|
|
4576
|
+
the documentation and/or other materials provided with the distribution.
|
|
4577
|
+
|
|
4578
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
4579
|
+
derived from this software without specific prior written permission.
|
|
4580
|
+
|
|
4581
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4582
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4583
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4584
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4585
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4586
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4587
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4588
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4589
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4590
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4591
|
+
*/
|
|
4592
|
+
|
|
4593
|
+
|
|
4594
|
+
function addWarning(warnings, reason, filename) {
|
|
4595
|
+
if (!warnings.some(warning => warning.reason == reason)) {
|
|
4596
|
+
const warning = { reason };
|
|
4597
|
+
if (filename !== UNDEFINED_VALUE) {
|
|
4598
|
+
warning.filename = filename;
|
|
4599
|
+
}
|
|
4600
|
+
warnings.push(warning);
|
|
4601
|
+
}
|
|
4602
|
+
}
|
|
4603
|
+
|
|
4521
4604
|
/*
|
|
4522
4605
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4523
4606
|
|
|
@@ -4546,6 +4629,7 @@
|
|
|
4546
4629
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4547
4630
|
*/
|
|
4548
4631
|
|
|
4632
|
+
|
|
4549
4633
|
const PROPERTY_NAME_FILENAME = "filename";
|
|
4550
4634
|
const PROPERTY_NAME_RAW_FILENAME = "rawFilename";
|
|
4551
4635
|
const PROPERTY_NAME_COMMENT = "comment";
|
|
@@ -4670,6 +4754,38 @@
|
|
|
4670
4754
|
|
|
4671
4755
|
}
|
|
4672
4756
|
|
|
4757
|
+
const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
|
|
4758
|
+
EXTRAFIELD_TYPE_ZIP64,
|
|
4759
|
+
EXTRAFIELD_TYPE_AES,
|
|
4760
|
+
EXTRAFIELD_TYPE_NTFS,
|
|
4761
|
+
EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
|
|
4762
|
+
EXTRAFIELD_TYPE_UNICODE_PATH,
|
|
4763
|
+
EXTRAFIELD_TYPE_UNICODE_COMMENT,
|
|
4764
|
+
EXTRAFIELD_TYPE_USDZ,
|
|
4765
|
+
EXTRAFIELD_TYPE_INFOZIP,
|
|
4766
|
+
EXTRAFIELD_TYPE_UNIX,
|
|
4767
|
+
EXTRAFIELD_TYPE_UNIX_TYPE1,
|
|
4768
|
+
EXTRAFIELD_TYPE_PKWARE_UNIX
|
|
4769
|
+
]);
|
|
4770
|
+
|
|
4771
|
+
function getUserExtraField(extraField) {
|
|
4772
|
+
if (extraField) {
|
|
4773
|
+
const userExtraField = new Map();
|
|
4774
|
+
extraField.forEach((field, type) => {
|
|
4775
|
+
if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
|
|
4776
|
+
userExtraField.set(type, field.data);
|
|
4777
|
+
}
|
|
4778
|
+
});
|
|
4779
|
+
if (userExtraField.size) {
|
|
4780
|
+
return userExtraField;
|
|
4781
|
+
}
|
|
4782
|
+
}
|
|
4783
|
+
}
|
|
4784
|
+
|
|
4785
|
+
function getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength) {
|
|
4786
|
+
return encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
4787
|
+
}
|
|
4788
|
+
|
|
4673
4789
|
/*
|
|
4674
4790
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4675
4791
|
|
|
@@ -4729,6 +4845,8 @@
|
|
|
4729
4845
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4730
4846
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4731
4847
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4848
|
+
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
4849
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = "mismatched local file header (filename)";
|
|
4732
4850
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
|
|
4733
4851
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
|
|
4734
4852
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
|
|
@@ -4799,7 +4917,7 @@
|
|
|
4799
4917
|
}
|
|
4800
4918
|
}
|
|
4801
4919
|
if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
|
|
4802
|
-
throwAmbiguousArchive(
|
|
4920
|
+
throwAmbiguousArchive(WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY);
|
|
4803
4921
|
}
|
|
4804
4922
|
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
4805
4923
|
let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
|
|
@@ -5097,7 +5215,8 @@
|
|
|
5097
5215
|
const writer = new TransformStream();
|
|
5098
5216
|
const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
|
|
5099
5217
|
arrayBufferPromise.catch(() => { });
|
|
5100
|
-
await fileEntry.getData(writer, entry, zipReader.readRanges,
|
|
5218
|
+
await fileEntry.getData(writer, entry, zipReader.readRanges,
|
|
5219
|
+
Object.assign({}, options, { preventClose: false }));
|
|
5101
5220
|
return arrayBufferPromise;
|
|
5102
5221
|
};
|
|
5103
5222
|
offset = endOffset;
|
|
@@ -5178,49 +5297,101 @@
|
|
|
5178
5297
|
await reader.readable.cancel();
|
|
5179
5298
|
}
|
|
5180
5299
|
}
|
|
5300
|
+
|
|
5301
|
+
[SYMBOL_ASYNC_DISPOSE]() {
|
|
5302
|
+
return this.close();
|
|
5303
|
+
}
|
|
5181
5304
|
}
|
|
5182
5305
|
|
|
5183
5306
|
class ZipReaderStream {
|
|
5184
5307
|
|
|
5185
5308
|
constructor(options = {}) {
|
|
5186
|
-
|
|
5187
|
-
const
|
|
5309
|
+
let sourceController;
|
|
5310
|
+
const { readable, writable } = new TransformStream({
|
|
5311
|
+
start(controller) {
|
|
5312
|
+
sourceController = controller;
|
|
5313
|
+
}
|
|
5314
|
+
});
|
|
5315
|
+
const zipReader = new ZipReader(readable, options);
|
|
5316
|
+
const gen = zipReader.getEntriesGenerator();
|
|
5317
|
+
const pendingEntries = new Set();
|
|
5188
5318
|
this.readable = new ReadableStream({
|
|
5189
5319
|
async pull(controller) {
|
|
5190
5320
|
const { done, value } = await gen.next();
|
|
5191
5321
|
if (done)
|
|
5192
5322
|
return controller.close();
|
|
5193
|
-
const
|
|
5194
|
-
const { readable, writable } = new TransformStream();
|
|
5195
|
-
if (value.getData) {
|
|
5196
|
-
getData();
|
|
5197
|
-
return readable;
|
|
5198
|
-
}
|
|
5199
|
-
|
|
5200
|
-
async function getData() {
|
|
5201
|
-
try {
|
|
5202
|
-
await value.getData(writable);
|
|
5203
|
-
} catch (error) {
|
|
5204
|
-
try {
|
|
5205
|
-
await writable.abort(error);
|
|
5206
|
-
} catch {
|
|
5207
|
-
// ignored
|
|
5208
|
-
}
|
|
5209
|
-
}
|
|
5210
|
-
}
|
|
5211
|
-
})();
|
|
5323
|
+
const entryStream = createEntryStream(value, pendingEntries);
|
|
5212
5324
|
const chunk = {
|
|
5213
5325
|
...value,
|
|
5214
|
-
readable:
|
|
5326
|
+
readable: entryStream.readable
|
|
5215
5327
|
};
|
|
5216
5328
|
delete chunk.getData;
|
|
5329
|
+
Object.defineProperties(chunk, {
|
|
5330
|
+
localDirectory: {
|
|
5331
|
+
get: () => value.localDirectory,
|
|
5332
|
+
enumerable: true
|
|
5333
|
+
},
|
|
5334
|
+
warnings: {
|
|
5335
|
+
get: () => value.warnings,
|
|
5336
|
+
enumerable: true
|
|
5337
|
+
}
|
|
5338
|
+
});
|
|
5217
5339
|
controller.enqueue(chunk);
|
|
5340
|
+
},
|
|
5341
|
+
async cancel(reason) {
|
|
5342
|
+
const entryStreams = Array.from(pendingEntries);
|
|
5343
|
+
pendingEntries.clear();
|
|
5344
|
+
sourceController.error(reason);
|
|
5345
|
+
await Promise.allSettled(entryStreams.map(entryStream => entryStream.cancel(reason)));
|
|
5346
|
+
await Promise.allSettled([gen.return(), zipReader.close()]);
|
|
5218
5347
|
}
|
|
5219
5348
|
});
|
|
5220
5349
|
this.writable = writable;
|
|
5221
5350
|
}
|
|
5222
5351
|
}
|
|
5223
5352
|
|
|
5353
|
+
function createEntryStream(entry, pendingEntries) {
|
|
5354
|
+
const { readable, writable } = new TransformStream();
|
|
5355
|
+
let dataReader;
|
|
5356
|
+
const entryStream = {
|
|
5357
|
+
cancel: async reason => {
|
|
5358
|
+
pendingEntries.delete(entryStream);
|
|
5359
|
+
await (dataReader ? dataReader.cancel(reason) : readable.cancel(reason));
|
|
5360
|
+
}
|
|
5361
|
+
};
|
|
5362
|
+
entryStream.readable = new ReadableStream({
|
|
5363
|
+
async pull(controller) {
|
|
5364
|
+
if (!dataReader) {
|
|
5365
|
+
dataReader = readable.getReader();
|
|
5366
|
+
pendingEntries.add(entryStream);
|
|
5367
|
+
getData();
|
|
5368
|
+
}
|
|
5369
|
+
const { done, value } = await dataReader.read();
|
|
5370
|
+
if (done) {
|
|
5371
|
+
controller.close();
|
|
5372
|
+
} else {
|
|
5373
|
+
controller.enqueue(value);
|
|
5374
|
+
}
|
|
5375
|
+
},
|
|
5376
|
+
cancel: reason => entryStream.cancel(reason)
|
|
5377
|
+
}, { highWaterMark: 0 });
|
|
5378
|
+
return entryStream;
|
|
5379
|
+
|
|
5380
|
+
async function getData() {
|
|
5381
|
+
try {
|
|
5382
|
+
await entry.getData(writable, { preventClose: false });
|
|
5383
|
+
} catch (error) {
|
|
5384
|
+
try {
|
|
5385
|
+
await writable.abort(error);
|
|
5386
|
+
} catch {
|
|
5387
|
+
// ignored
|
|
5388
|
+
}
|
|
5389
|
+
} finally {
|
|
5390
|
+
pendingEntries.delete(entryStream);
|
|
5391
|
+
}
|
|
5392
|
+
}
|
|
5393
|
+
}
|
|
5394
|
+
|
|
5224
5395
|
async function isZipFile(reader, options = {}) {
|
|
5225
5396
|
reader = new GenericReader(reader);
|
|
5226
5397
|
await initStream(reader);
|
|
@@ -5280,7 +5451,9 @@
|
|
|
5280
5451
|
const dataView = getDataView(dataArray);
|
|
5281
5452
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
5282
5453
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
5283
|
-
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
5454
|
+
const passThrough = checkPassThroughOption(getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH));
|
|
5455
|
+
const passThroughCompression = Boolean(passThrough);
|
|
5456
|
+
const passThroughEncryption = passThrough === true;
|
|
5284
5457
|
checkPasswordOption(password, rawPassword);
|
|
5285
5458
|
password = password && password.length && password;
|
|
5286
5459
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
@@ -5301,7 +5474,9 @@
|
|
|
5301
5474
|
const checkLocalDirectoryOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_DIRECTORY);
|
|
5302
5475
|
const entryStrictness = getStrictness(options, zipEntry.options);
|
|
5303
5476
|
const checkLocalDirectory = getCheckLocalDirectory(checkLocalDirectoryOption, entryStrictness);
|
|
5304
|
-
const
|
|
5477
|
+
const checkLocalFilenameOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_FILENAME);
|
|
5478
|
+
const checkLocalFilename = getCheckLocalFilename(
|
|
5479
|
+
checkLocalFilenameOption === UNDEFINED_VALUE ? checkLocalDirectoryOption : checkLocalFilenameOption, entryStrictness);
|
|
5305
5480
|
let rawLocalFilename = EMPTY_UINT8_ARRAY;
|
|
5306
5481
|
if (checkLocalFilename && (filenameLength || extraFieldLength)) {
|
|
5307
5482
|
const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
|
|
@@ -5332,16 +5507,17 @@
|
|
|
5332
5507
|
if (gid !== UNDEFINED_VALUE && fileEntry.gid === UNDEFINED_VALUE) {
|
|
5333
5508
|
fileEntry.gid = gid;
|
|
5334
5509
|
}
|
|
5335
|
-
const
|
|
5510
|
+
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5511
|
+
const encrypted = zipEntry.encrypted && localDirectory.encrypted && (!passThroughEncryption || checkPasswordOnly);
|
|
5336
5512
|
const zipCrypto = encrypted && !extraFieldAES;
|
|
5337
|
-
if (!
|
|
5513
|
+
if (!passThroughEncryption) {
|
|
5338
5514
|
fileEntry.zipCrypto = zipCrypto;
|
|
5339
5515
|
}
|
|
5340
5516
|
if (encrypted && (localDirectory.rawBitFlag & BITFLAG_STRONG_ENCRYPTION) == BITFLAG_STRONG_ENCRYPTION) {
|
|
5341
5517
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
|
|
5342
5518
|
}
|
|
5343
|
-
const registeredCodec =
|
|
5344
|
-
if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !
|
|
5519
|
+
const registeredCodec = passThroughCompression ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
5520
|
+
if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThroughCompression) {
|
|
5345
5521
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
5346
5522
|
}
|
|
5347
5523
|
if (encrypted) {
|
|
@@ -5358,15 +5534,16 @@
|
|
|
5358
5534
|
const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
|
|
5359
5535
|
const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
|
|
5360
5536
|
throwIfAborted(signal);
|
|
5361
|
-
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5362
5537
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
5363
5538
|
const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
|
|
5364
5539
|
if (checkOverlappingEntryOnly) {
|
|
5365
5540
|
checkOverlappingEntry = true;
|
|
5366
5541
|
}
|
|
5367
5542
|
const { onstart, onprogress, onend } = options;
|
|
5368
|
-
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !
|
|
5369
|
-
const outputSize =
|
|
5543
|
+
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThroughCompression;
|
|
5544
|
+
const outputSize = passThroughCompression ?
|
|
5545
|
+
compressedSize - getEncryptionOverhead(encrypted, zipCrypto, extraFieldAES && extraFieldAES.strength) :
|
|
5546
|
+
uncompressedSize;
|
|
5370
5547
|
const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
|
|
5371
5548
|
let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
|
|
5372
5549
|
if (deflate64) {
|
|
@@ -5375,7 +5552,7 @@
|
|
|
5375
5552
|
const checkCrc32Option = getOptionValue$1(zipEntry, options, OPTION_CHECK_CRC32);
|
|
5376
5553
|
const checkCrc32 = (checkCrc32Option === UNDEFINED_VALUE ?
|
|
5377
5554
|
getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) :
|
|
5378
|
-
checkCrc32Option) && !
|
|
5555
|
+
checkCrc32Option) && !passThroughCompression &&
|
|
5379
5556
|
(!encrypted || zipCrypto || (extraFieldAES && extraFieldAES.vendorVersion == VENDOR_VERSION_AE_1$1));
|
|
5380
5557
|
const workerOptions = {
|
|
5381
5558
|
options: {
|
|
@@ -5429,10 +5606,10 @@
|
|
|
5429
5606
|
await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
|
|
5430
5607
|
({ writable } = writer);
|
|
5431
5608
|
const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5432
|
-
writer.size += writtenSize;
|
|
5433
5609
|
if (writtenSize != outputSize) {
|
|
5434
|
-
throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
5610
|
+
throw Object.assign(new Error(ERR_INVALID_UNCOMPRESSED_SIZE), { outputSize: writtenSize });
|
|
5435
5611
|
}
|
|
5612
|
+
writer.size += writtenSize;
|
|
5436
5613
|
}
|
|
5437
5614
|
} catch (error) {
|
|
5438
5615
|
if (error.outputSize !== UNDEFINED_VALUE) {
|
|
@@ -6098,7 +6275,7 @@
|
|
|
6098
6275
|
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
6099
6276
|
(rawLocalFilename.length != rawFilename.length ||
|
|
6100
6277
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
6101
|
-
reportAmbiguity(reject, warnings,
|
|
6278
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME);
|
|
6102
6279
|
}
|
|
6103
6280
|
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
6104
6281
|
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
|
|
@@ -6123,16 +6300,6 @@
|
|
|
6123
6300
|
}
|
|
6124
6301
|
}
|
|
6125
6302
|
|
|
6126
|
-
function addWarning(warnings, reason, filename) {
|
|
6127
|
-
if (!warnings.some(warning => warning.reason == reason)) {
|
|
6128
|
-
const warning = { reason };
|
|
6129
|
-
if (filename !== UNDEFINED_VALUE) {
|
|
6130
|
-
warning.filename = filename;
|
|
6131
|
-
}
|
|
6132
|
-
warnings.push(warning);
|
|
6133
|
-
}
|
|
6134
|
-
}
|
|
6135
|
-
|
|
6136
6303
|
function throwAmbiguousArchive(reason) {
|
|
6137
6304
|
const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
|
|
6138
6305
|
error.reason = reason;
|
|
@@ -6212,7 +6379,9 @@
|
|
|
6212
6379
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6213
6380
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6214
6381
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6382
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6215
6383
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6384
|
+
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6216
6385
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6217
6386
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
6218
6387
|
WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
|
|
@@ -6265,7 +6434,7 @@
|
|
|
6265
6434
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
6266
6435
|
const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
|
|
6267
6436
|
const ERR_UNSUPPORTED_SPLIT_USDZ = "Split zip files are not supported in USDZ files";
|
|
6268
|
-
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
|
|
6437
|
+
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set to true (use 'compressed' instead)";
|
|
6269
6438
|
const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
|
|
6270
6439
|
const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
|
|
6271
6440
|
const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
|
|
@@ -6277,6 +6446,7 @@
|
|
|
6277
6446
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
6278
6447
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
6279
6448
|
const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
|
|
6449
|
+
const ERR_UNDEFINED_CRC32 = "Undefined CRC32";
|
|
6280
6450
|
const ERR_UNDETERMINED_SIZE = "Undetermined size";
|
|
6281
6451
|
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
6282
6452
|
const ERR_INVALID_READER = "Invalid reader (must be a Reader instance, a ReadableStream instance, or an object with a 'readable' property)";
|
|
@@ -6290,14 +6460,21 @@
|
|
|
6290
6460
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
6291
6461
|
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
6292
6462
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
6463
|
+
const ERR_INVALID_ENTRY = "Invalid entry option (must be an entry returned by ZipReader#getEntries())";
|
|
6464
|
+
const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
|
|
6465
|
+
const WARNING_COMPRESSION_UNAVAILABLE = "compression unavailable";
|
|
6466
|
+
const WARNING_CLAMPED_LAST_MODIFICATION_DATE = "clamped last modification date";
|
|
6293
6467
|
|
|
6294
6468
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
6295
6469
|
const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
|
|
6296
6470
|
const EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD = 9;
|
|
6297
6471
|
const EXTRAFIELD_USDZ_MAX_LENGTH = 67;
|
|
6472
|
+
const MIN_PRINTABLE_ASCII_CHARACTER_CODE = 0x20;
|
|
6473
|
+
const MAX_PRINTABLE_ASCII_CHARACTER_CODE = 0x7e;
|
|
6298
6474
|
const VENDOR_VERSION_AE_1 = 1;
|
|
6299
6475
|
const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
|
|
6300
6476
|
const UNIX_EXTRA_FIELD_TYPE = "unix";
|
|
6477
|
+
const LEVEL_BY_BITFLAG_LEVEL = [8, 9, 5, 3];
|
|
6301
6478
|
const MAX_LEVEL = 9;
|
|
6302
6479
|
|
|
6303
6480
|
let workers = 0;
|
|
@@ -6324,9 +6501,11 @@
|
|
|
6324
6501
|
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
6325
6502
|
pendingAddFileCalls: new Set(),
|
|
6326
6503
|
pendingErrors: [],
|
|
6504
|
+
warnings: [],
|
|
6327
6505
|
bufferedWrites: 0,
|
|
6328
6506
|
directWrites: 0,
|
|
6329
|
-
lastFileEntry: UNDEFINED_VALUE
|
|
6507
|
+
lastFileEntry: UNDEFINED_VALUE,
|
|
6508
|
+
archiveClosed: false
|
|
6330
6509
|
});
|
|
6331
6510
|
}
|
|
6332
6511
|
|
|
@@ -6491,6 +6670,9 @@
|
|
|
6491
6670
|
const zipWriter = this;
|
|
6492
6671
|
const { pendingAddFileCalls, writer } = this;
|
|
6493
6672
|
const { writable } = writer;
|
|
6673
|
+
if (zipWriter.archiveClosed) {
|
|
6674
|
+
return getWriterData(writer);
|
|
6675
|
+
}
|
|
6494
6676
|
if (!(comment instanceof Uint8Array)) {
|
|
6495
6677
|
throw new Error(ERR_INVALID_COMMENT_TYPE);
|
|
6496
6678
|
}
|
|
@@ -6514,11 +6696,16 @@
|
|
|
6514
6696
|
throw error;
|
|
6515
6697
|
}
|
|
6516
6698
|
await closeFile(zipWriter, comment, options);
|
|
6699
|
+
zipWriter.archiveClosed = true;
|
|
6517
6700
|
const preventClose = !ownsWritable(writer) && getOptionValue(zipWriter, options, OPTION_PREVENT_CLOSE);
|
|
6518
6701
|
if (!preventClose) {
|
|
6519
6702
|
await writable.getWriter().close();
|
|
6520
6703
|
}
|
|
6521
|
-
return writer
|
|
6704
|
+
return getWriterData(writer);
|
|
6705
|
+
}
|
|
6706
|
+
|
|
6707
|
+
[SYMBOL_ASYNC_DISPOSE]() {
|
|
6708
|
+
return this.close();
|
|
6522
6709
|
}
|
|
6523
6710
|
}
|
|
6524
6711
|
|
|
@@ -6597,6 +6784,10 @@
|
|
|
6597
6784
|
}
|
|
6598
6785
|
}
|
|
6599
6786
|
|
|
6787
|
+
function getWriterData(writer) {
|
|
6788
|
+
return writer.getData ? writer.getData() : writer.writable;
|
|
6789
|
+
}
|
|
6790
|
+
|
|
6600
6791
|
function watchPromiseError(zipWriter, promise) {
|
|
6601
6792
|
const watchedPromise = new WatchedPromise((resolve, reject) => Promise.prototype.then.call(promise, resolve, reject));
|
|
6602
6793
|
const watcher = {};
|
|
@@ -6615,6 +6806,14 @@
|
|
|
6615
6806
|
|
|
6616
6807
|
async function addFileEntry(zipWriter, name, reader, options) {
|
|
6617
6808
|
options = Object.assign({}, options);
|
|
6809
|
+
const entry = options[OPTION_ENTRY];
|
|
6810
|
+
if (entry !== UNDEFINED_VALUE) {
|
|
6811
|
+
const { entryOptions, passThroughOptions } = getSourceEntryOptions(entry,
|
|
6812
|
+
checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH)),
|
|
6813
|
+
getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE));
|
|
6814
|
+
delete options[OPTION_ENTRY];
|
|
6815
|
+
options = Object.assign(entryOptions, passThroughOptions, options);
|
|
6816
|
+
}
|
|
6618
6817
|
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
6619
6818
|
name += DIRECTORY_SIGNATURE;
|
|
6620
6819
|
}
|
|
@@ -6679,21 +6878,33 @@
|
|
|
6679
6878
|
try {
|
|
6680
6879
|
const { resolvedOptions } = metadataInfo;
|
|
6681
6880
|
if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
|
|
6682
|
-
!resolvedOptions.
|
|
6881
|
+
!resolvedOptions.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
|
|
6683
6882
|
resolvedOptions.level = 0;
|
|
6883
|
+
addWarning(zipWriter.warnings, WARNING_COMPRESSION_UNAVAILABLE, name);
|
|
6684
6884
|
}
|
|
6685
6885
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
6686
6886
|
({ reader } = sizesInfo);
|
|
6687
6887
|
const diskOffset = getDiskOffset(zipWriter.writer);
|
|
6688
6888
|
const diskNumber = getDiskNumber(zipWriter.writer);
|
|
6889
|
+
let crc32 = options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32;
|
|
6890
|
+
const storesAE2 = sizesInfo.resolvedOptions.encrypted && !resolvedOptions.zipCrypto;
|
|
6891
|
+
if (resolvedOptions.passThroughCompression && !resolvedOptions.passThroughEncryption && storesAE2) {
|
|
6892
|
+
crc32 = UNDEFINED_VALUE;
|
|
6893
|
+
}
|
|
6894
|
+
if (resolvedOptions.passThroughCompression && reader && !storesAE2 && crc32 === UNDEFINED_VALUE) {
|
|
6895
|
+
throw new Error(ERR_UNDEFINED_CRC32);
|
|
6896
|
+
}
|
|
6689
6897
|
options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
|
|
6690
6898
|
signature: options[PROPERTY_NAME_SIGNATURE],
|
|
6691
|
-
crc32
|
|
6899
|
+
crc32,
|
|
6692
6900
|
offset: zipWriter.offset - diskOffset,
|
|
6693
6901
|
diskNumberStart: diskNumber,
|
|
6694
6902
|
[OPTION_USDZ]: zipWriter.options[OPTION_USDZ]
|
|
6695
6903
|
});
|
|
6696
6904
|
const headerInfo = getHeaderInfo(options);
|
|
6905
|
+
if (headerInfo.lastModDateClamped) {
|
|
6906
|
+
addWarning(zipWriter.warnings, WARNING_CLAMPED_LAST_MODIFICATION_DATE, name);
|
|
6907
|
+
}
|
|
6697
6908
|
const dataDescriptorInfo = getDataDescriptorInfo(options);
|
|
6698
6909
|
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
6699
6910
|
fileEntry = await getFileEntry(zipWriter, name, reader, {
|
|
@@ -6720,6 +6931,95 @@
|
|
|
6720
6931
|
return new Entry(fileEntry);
|
|
6721
6932
|
}
|
|
6722
6933
|
|
|
6934
|
+
function getSourceEntryOptions(entry, passThrough, lastModDateOverride) {
|
|
6935
|
+
if (entry === null || typeof entry != OBJECT_TYPE || Array.isArray(entry)) {
|
|
6936
|
+
throw new Error(ERR_INVALID_ENTRY);
|
|
6937
|
+
}
|
|
6938
|
+
const {
|
|
6939
|
+
externalFileAttributes,
|
|
6940
|
+
versionMadeBy,
|
|
6941
|
+
comment,
|
|
6942
|
+
lastModDate,
|
|
6943
|
+
rawLastModDate,
|
|
6944
|
+
creationDate,
|
|
6945
|
+
lastAccessDate,
|
|
6946
|
+
uncompressedSize,
|
|
6947
|
+
encrypted,
|
|
6948
|
+
zipCrypto,
|
|
6949
|
+
crc32,
|
|
6950
|
+
compressionMethod,
|
|
6951
|
+
extraFieldAES,
|
|
6952
|
+
extraFieldUnix,
|
|
6953
|
+
internalFileAttributes,
|
|
6954
|
+
extraField,
|
|
6955
|
+
bitFlag,
|
|
6956
|
+
directory,
|
|
6957
|
+
uid,
|
|
6958
|
+
gid
|
|
6959
|
+
} = entry;
|
|
6960
|
+
const entryOptions = {
|
|
6961
|
+
externalFileAttributes,
|
|
6962
|
+
versionMadeBy,
|
|
6963
|
+
comment,
|
|
6964
|
+
lastModDate,
|
|
6965
|
+
creationDate,
|
|
6966
|
+
lastAccessDate,
|
|
6967
|
+
internalFileAttributes,
|
|
6968
|
+
directory
|
|
6969
|
+
};
|
|
6970
|
+
if (bitFlag && bitFlag.languageEncodingFlag) {
|
|
6971
|
+
entryOptions[OPTION_USE_UNICODE_FILE_NAMES] = true;
|
|
6972
|
+
}
|
|
6973
|
+
const userExtraField = getUserExtraField(extraField);
|
|
6974
|
+
if (userExtraField) {
|
|
6975
|
+
entryOptions[PROPERTY_NAME_EXTRA_FIELD] = userExtraField;
|
|
6976
|
+
}
|
|
6977
|
+
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
6978
|
+
Object.assign(entryOptions, {
|
|
6979
|
+
uid,
|
|
6980
|
+
gid,
|
|
6981
|
+
unixExtraFieldType: extraFieldUnix ? UNIX_EXTRA_FIELD_TYPE : INFOZIP_EXTRA_FIELD_TYPE
|
|
6982
|
+
});
|
|
6983
|
+
}
|
|
6984
|
+
const passThroughOptions = {};
|
|
6985
|
+
if (passThrough && !directory) {
|
|
6986
|
+
Object.assign(passThroughOptions, {
|
|
6987
|
+
uncompressedSize,
|
|
6988
|
+
crc32,
|
|
6989
|
+
compressionMethod
|
|
6990
|
+
});
|
|
6991
|
+
if (passThrough !== PASS_THROUGH_COMPRESSED) {
|
|
6992
|
+
Object.assign(passThroughOptions, {
|
|
6993
|
+
encrypted,
|
|
6994
|
+
zipCrypto,
|
|
6995
|
+
encryptionStrength: extraFieldAES ? extraFieldAES.strength : UNDEFINED_VALUE
|
|
6996
|
+
});
|
|
6997
|
+
}
|
|
6998
|
+
if (bitFlag) {
|
|
6999
|
+
passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
|
|
7000
|
+
passThroughOptions[OPTION_LEVEL] = LEVEL_BY_BITFLAG_LEVEL[bitFlag.level];
|
|
7001
|
+
}
|
|
7002
|
+
if (lastModDateOverride === UNDEFINED_VALUE) {
|
|
7003
|
+
passThroughOptions.rawLastModDate = rawLastModDate;
|
|
7004
|
+
} else if (passThrough !== PASS_THROUGH_COMPRESSED && zipCrypto && (!bitFlag || bitFlag.dataDescriptor) &&
|
|
7005
|
+
lastModDateOverride instanceof Date &&
|
|
7006
|
+
getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
|
|
7007
|
+
throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
|
|
7008
|
+
}
|
|
7009
|
+
}
|
|
7010
|
+
return { entryOptions, passThroughOptions };
|
|
7011
|
+
}
|
|
7012
|
+
|
|
7013
|
+
function getDosTimeHighByte(lastModDate) {
|
|
7014
|
+
let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
|
|
7015
|
+
if (dosLastModDate < MIN_DATE) {
|
|
7016
|
+
dosLastModDate = MIN_DATE;
|
|
7017
|
+
} else if (dosLastModDate > MAX_DATE) {
|
|
7018
|
+
dosLastModDate = MAX_DATE;
|
|
7019
|
+
}
|
|
7020
|
+
return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
|
|
7021
|
+
}
|
|
7022
|
+
|
|
6723
7023
|
function resolveAttributes(zipWriter, name, options) {
|
|
6724
7024
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
6725
7025
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
|
|
@@ -6873,7 +7173,9 @@
|
|
|
6873
7173
|
const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
|
|
6874
7174
|
const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
|
|
6875
7175
|
const internalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, 0);
|
|
6876
|
-
const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
|
|
7176
|
+
const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
|
|
7177
|
+
const passThroughCompression = Boolean(passThrough);
|
|
7178
|
+
const passThroughEncryption = passThrough === true;
|
|
6877
7179
|
const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6878
7180
|
const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6879
7181
|
checkPasswordOption(password, rawPassword);
|
|
@@ -6889,10 +7191,11 @@
|
|
|
6889
7191
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
6890
7192
|
const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
|
|
6891
7193
|
throwIfAborted(signal);
|
|
6892
|
-
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
|
|
7194
|
+
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
|
|
7195
|
+
!isPrintableASCIIText(rawFilename) || !isPrintableASCIIText(rawComment));
|
|
6893
7196
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
6894
|
-
const registeredCodec =
|
|
6895
|
-
if (!
|
|
7197
|
+
const registeredCodec = passThroughCompression || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
7198
|
+
if (!passThroughCompression && compressionMethod !== UNDEFINED_VALUE &&
|
|
6896
7199
|
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
|
|
6897
7200
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
6898
7201
|
}
|
|
@@ -6906,15 +7209,15 @@
|
|
|
6906
7209
|
level = 0;
|
|
6907
7210
|
}
|
|
6908
7211
|
}
|
|
6909
|
-
if (
|
|
6910
|
-
level =
|
|
7212
|
+
if (passThroughCompression) {
|
|
7213
|
+
level = toNumber(options[OPTION_LEVEL]);
|
|
6911
7214
|
}
|
|
6912
7215
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
6913
7216
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
6914
7217
|
if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
|
|
6915
7218
|
dataDescriptor = false;
|
|
6916
7219
|
}
|
|
6917
|
-
if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !
|
|
7220
|
+
if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThroughEncryption)) {
|
|
6918
7221
|
dataDescriptor = true;
|
|
6919
7222
|
}
|
|
6920
7223
|
if (level !== UNDEFINED_VALUE && level != 6) {
|
|
@@ -6938,7 +7241,8 @@
|
|
|
6938
7241
|
lastAccessDate,
|
|
6939
7242
|
creationDate,
|
|
6940
7243
|
internalFileAttributes,
|
|
6941
|
-
|
|
7244
|
+
passThroughCompression,
|
|
7245
|
+
passThroughEncryption,
|
|
6942
7246
|
password,
|
|
6943
7247
|
rawPassword,
|
|
6944
7248
|
encryptionStrength,
|
|
@@ -6999,7 +7303,7 @@
|
|
|
6999
7303
|
}
|
|
7000
7304
|
|
|
7001
7305
|
async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
|
|
7002
|
-
if (metadata.
|
|
7306
|
+
if (metadata.passThroughCompression && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
|
|
7003
7307
|
throw new Error(ERR_UNDEFINED_READER);
|
|
7004
7308
|
}
|
|
7005
7309
|
let contentSize;
|
|
@@ -7015,12 +7319,12 @@
|
|
|
7015
7319
|
}
|
|
7016
7320
|
|
|
7017
7321
|
function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options) {
|
|
7018
|
-
const {
|
|
7322
|
+
const { passThroughCompression, passThroughEncryption, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
|
|
7019
7323
|
let { dataDescriptor, zip64, level, compressionMethod } = metadata;
|
|
7020
7324
|
let maximumCompressedSize = 0;
|
|
7021
7325
|
let uncompressedSize = 0;
|
|
7022
7326
|
let unknownSize = false;
|
|
7023
|
-
if (
|
|
7327
|
+
if (passThroughCompression && hasContent) {
|
|
7024
7328
|
uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
|
|
7025
7329
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
7026
7330
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
@@ -7031,17 +7335,17 @@
|
|
|
7031
7335
|
}
|
|
7032
7336
|
const zip64Enabled = zip64 === true;
|
|
7033
7337
|
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
7034
|
-
if (hasContent &&
|
|
7338
|
+
if (hasContent && passThroughEncryption && !encrypted && getLength(password, rawPassword)) {
|
|
7035
7339
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH);
|
|
7036
7340
|
}
|
|
7037
|
-
const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (
|
|
7341
|
+
const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThroughEncryption && encrypted));
|
|
7038
7342
|
if (!hasContent) {
|
|
7039
7343
|
level = 0;
|
|
7040
7344
|
compressionMethod = COMPRESSION_METHOD_STORE;
|
|
7041
7345
|
}
|
|
7042
|
-
const encryptionOverhead = encryptedEntry
|
|
7346
|
+
const encryptionOverhead = getEncryptionOverhead(encryptedEntry, zipCrypto, encryptionStrength);
|
|
7043
7347
|
if (hasContent) {
|
|
7044
|
-
if (!
|
|
7348
|
+
if (!passThroughCompression) {
|
|
7045
7349
|
if (contentSize === UNDEFINED_VALUE) {
|
|
7046
7350
|
dataDescriptor = true;
|
|
7047
7351
|
if (zip64 || zip64 === UNDEFINED_VALUE) {
|
|
@@ -7054,10 +7358,12 @@
|
|
|
7054
7358
|
}
|
|
7055
7359
|
} else {
|
|
7056
7360
|
options.uncompressedSize = uncompressedSize;
|
|
7057
|
-
maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
|
|
7361
|
+
maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
|
|
7362
|
+
getMaximumCompressedSize(uncompressedSize) + encryptionOverhead :
|
|
7363
|
+
contentSize + (passThroughEncryption ? 0 : encryptionOverhead);
|
|
7058
7364
|
}
|
|
7059
7365
|
}
|
|
7060
|
-
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !
|
|
7366
|
+
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
|
|
7061
7367
|
if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
|
|
7062
7368
|
dataDescriptor = false;
|
|
7063
7369
|
}
|
|
@@ -7264,6 +7570,7 @@
|
|
|
7264
7570
|
localExtraFieldZip64Length,
|
|
7265
7571
|
rawExtraFieldExtendedTimestamp,
|
|
7266
7572
|
extraFieldExtendedTimestampFlag,
|
|
7573
|
+
extraFieldExtendedTimestampTime,
|
|
7267
7574
|
rawExtraFieldNTFS,
|
|
7268
7575
|
rawExtraFieldUnix,
|
|
7269
7576
|
rawExtraFieldAES,
|
|
@@ -7276,6 +7583,7 @@
|
|
|
7276
7583
|
password,
|
|
7277
7584
|
rawPassword,
|
|
7278
7585
|
level,
|
|
7586
|
+
useUnicodeFileNames,
|
|
7279
7587
|
zip64,
|
|
7280
7588
|
zip64Enabled,
|
|
7281
7589
|
zip64UncompressedSize,
|
|
@@ -7310,7 +7618,8 @@
|
|
|
7310
7618
|
msdosAttributesRaw,
|
|
7311
7619
|
msdosAttributes,
|
|
7312
7620
|
useCompressionStream,
|
|
7313
|
-
|
|
7621
|
+
passThroughCompression,
|
|
7622
|
+
passThroughEncryption,
|
|
7314
7623
|
format,
|
|
7315
7624
|
codecURI
|
|
7316
7625
|
} = options;
|
|
@@ -7321,9 +7630,9 @@
|
|
|
7321
7630
|
zip64Enabled,
|
|
7322
7631
|
directory: Boolean(directory),
|
|
7323
7632
|
executable: Boolean(executable),
|
|
7324
|
-
filenameUTF8:
|
|
7633
|
+
filenameUTF8: Boolean(useUnicodeFileNames),
|
|
7325
7634
|
rawFilename,
|
|
7326
|
-
commentUTF8:
|
|
7635
|
+
commentUTF8: Boolean(useUnicodeFileNames),
|
|
7327
7636
|
rawComment,
|
|
7328
7637
|
rawExtraFieldZip64,
|
|
7329
7638
|
localExtraFieldZip64Length,
|
|
@@ -7354,7 +7663,7 @@
|
|
|
7354
7663
|
uncompressedSize
|
|
7355
7664
|
} = options;
|
|
7356
7665
|
let compressedSize = 0;
|
|
7357
|
-
if (!
|
|
7666
|
+
if (!passThroughCompression) {
|
|
7358
7667
|
uncompressedSize = 0;
|
|
7359
7668
|
}
|
|
7360
7669
|
const { writable } = writer;
|
|
@@ -7371,9 +7680,9 @@
|
|
|
7371
7680
|
encryptionStrength,
|
|
7372
7681
|
zipCrypto: encrypted && zipCrypto,
|
|
7373
7682
|
passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & MAX_8_BITS,
|
|
7374
|
-
computeCrc32: !
|
|
7375
|
-
compressed: compressed && !
|
|
7376
|
-
encrypted: encrypted && !
|
|
7683
|
+
computeCrc32: !passThroughCompression,
|
|
7684
|
+
compressed: compressed && !passThroughCompression,
|
|
7685
|
+
encrypted: encrypted && !passThroughEncryption,
|
|
7377
7686
|
useWebWorkers,
|
|
7378
7687
|
useCompressionStream,
|
|
7379
7688
|
transferStreams,
|
|
@@ -7388,7 +7697,7 @@
|
|
|
7388
7697
|
const result = await runWorker({ readable, writable }, workerOptions);
|
|
7389
7698
|
compressedSize = result.outputSize;
|
|
7390
7699
|
writer.size += compressedSize;
|
|
7391
|
-
if (!
|
|
7700
|
+
if (!passThroughCompression) {
|
|
7392
7701
|
uncompressedSize = result.inputSize;
|
|
7393
7702
|
if (!encrypted || zipCrypto) {
|
|
7394
7703
|
crc32 = result.crc32;
|
|
@@ -7431,8 +7740,9 @@
|
|
|
7431
7740
|
headerArray,
|
|
7432
7741
|
headerView,
|
|
7433
7742
|
signature: crc32,
|
|
7434
|
-
crc32: encrypted && !zipCrypto && !
|
|
7743
|
+
crc32: encrypted && !zipCrypto && !passThroughCompression ? UNDEFINED_VALUE : crc32,
|
|
7435
7744
|
extraFieldExtendedTimestampFlag,
|
|
7745
|
+
extraFieldExtendedTimestampTime,
|
|
7436
7746
|
zip64UncompressedSize,
|
|
7437
7747
|
zip64CompressedSize
|
|
7438
7748
|
});
|
|
@@ -7457,7 +7767,7 @@
|
|
|
7457
7767
|
encryptionStrength,
|
|
7458
7768
|
extendedTimestamp,
|
|
7459
7769
|
ntfsTimestamp,
|
|
7460
|
-
|
|
7770
|
+
passThroughCompression,
|
|
7461
7771
|
encrypted,
|
|
7462
7772
|
zip64UncompressedSize,
|
|
7463
7773
|
zip64CompressedSize,
|
|
@@ -7468,7 +7778,7 @@
|
|
|
7468
7778
|
let { version, compressionMethod } = options;
|
|
7469
7779
|
const compressed = !directory && isCompressed(compressionMethod, level);
|
|
7470
7780
|
let rawLocalExtraFieldZip64;
|
|
7471
|
-
const uncompressedFile =
|
|
7781
|
+
const uncompressedFile = passThroughCompression || !compressed;
|
|
7472
7782
|
const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || (uncompressedFile && !unknownSize)));
|
|
7473
7783
|
const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
|
|
7474
7784
|
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
@@ -7480,8 +7790,8 @@
|
|
|
7480
7790
|
if (zip64ExtraFieldComplete) {
|
|
7481
7791
|
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7482
7792
|
if (uncompressedFile) {
|
|
7483
|
-
const encryptionOverhead = encrypted
|
|
7484
|
-
extraFieldZip64.writeUint64(
|
|
7793
|
+
const encryptionOverhead = getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength);
|
|
7794
|
+
extraFieldZip64.writeUint64(passThroughCompression ? 0 : uncompressedSize + encryptionOverhead);
|
|
7485
7795
|
}
|
|
7486
7796
|
}
|
|
7487
7797
|
} else {
|
|
@@ -7500,6 +7810,7 @@
|
|
|
7500
7810
|
let rawExtraFieldNTFS;
|
|
7501
7811
|
let rawExtraFieldExtendedTimestamp;
|
|
7502
7812
|
let extraFieldExtendedTimestampFlag;
|
|
7813
|
+
let extraFieldExtendedTimestampTime;
|
|
7503
7814
|
if (extendedTimestamp) {
|
|
7504
7815
|
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
7505
7816
|
const lastModTimeUnixInRange = inUnixTimeRange(lastModTimeUnix);
|
|
@@ -7507,6 +7818,7 @@
|
|
|
7507
7818
|
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
7508
7819
|
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
7509
7820
|
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
7821
|
+
extraFieldExtendedTimestampTime = lastModTimeUnix;
|
|
7510
7822
|
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7511
7823
|
extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
|
|
7512
7824
|
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
@@ -7590,7 +7902,7 @@
|
|
|
7590
7902
|
}
|
|
7591
7903
|
if (encrypted && !zipCrypto) {
|
|
7592
7904
|
version = version > VERSION_AES ? version : VERSION_AES;
|
|
7593
|
-
if (
|
|
7905
|
+
if (passThroughCompression && crc32 !== UNDEFINED_VALUE) {
|
|
7594
7906
|
rawExtraFieldAES[EXTRAFIELD_OFFSET_AES_VENDOR_VERSION] = VENDOR_VERSION_AE_1;
|
|
7595
7907
|
}
|
|
7596
7908
|
setUint16(getDataView(rawExtraFieldAES), EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD, compressionMethod);
|
|
@@ -7652,12 +7964,14 @@
|
|
|
7652
7964
|
headerArray,
|
|
7653
7965
|
headerView,
|
|
7654
7966
|
lastModDate: storedLastModDate,
|
|
7967
|
+
lastModDateClamped: storedLastModDate === clampedLastModDate && dosLastModDate.getTime() != clampedLastModDate.getTime(),
|
|
7655
7968
|
rawLastModDate,
|
|
7656
7969
|
encrypted,
|
|
7657
7970
|
compressed,
|
|
7658
7971
|
version,
|
|
7659
7972
|
compressionMethod,
|
|
7660
7973
|
extraFieldExtendedTimestampFlag,
|
|
7974
|
+
extraFieldExtendedTimestampTime,
|
|
7661
7975
|
rawExtraFieldZip64: EMPTY_UINT8_ARRAY,
|
|
7662
7976
|
localExtraFieldZip64Length,
|
|
7663
7977
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -7760,7 +8074,7 @@
|
|
|
7760
8074
|
}, {
|
|
7761
8075
|
zip64,
|
|
7762
8076
|
zipCrypto,
|
|
7763
|
-
|
|
8077
|
+
passThroughCompression,
|
|
7764
8078
|
dataDescriptor
|
|
7765
8079
|
}) {
|
|
7766
8080
|
const {
|
|
@@ -7771,7 +8085,7 @@
|
|
|
7771
8085
|
dataDescriptorView,
|
|
7772
8086
|
dataDescriptorOffset
|
|
7773
8087
|
} = dataDescriptorInfo;
|
|
7774
|
-
if ((!encrypted || zipCrypto ||
|
|
8088
|
+
if ((!encrypted || zipCrypto || passThroughCompression) && crc32 !== UNDEFINED_VALUE) {
|
|
7775
8089
|
setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
|
|
7776
8090
|
if (dataDescriptor) {
|
|
7777
8091
|
setUint32(dataDescriptorView, dataDescriptorOffset, crc32);
|
|
@@ -7802,9 +8116,9 @@
|
|
|
7802
8116
|
uncompressedSize,
|
|
7803
8117
|
zip64UncompressedSize,
|
|
7804
8118
|
zip64CompressedSize
|
|
7805
|
-
}, localHeaderView, { dataDescriptor,
|
|
8119
|
+
}, localHeaderView, { dataDescriptor, passThroughCompression }) {
|
|
7806
8120
|
if (!dataDescriptor) {
|
|
7807
|
-
if (!encrypted || (
|
|
8121
|
+
if (!encrypted || (passThroughCompression && crc32 !== UNDEFINED_VALUE)) {
|
|
7808
8122
|
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, crc32);
|
|
7809
8123
|
}
|
|
7810
8124
|
if (!zip64CompressedSize) {
|
|
@@ -7841,9 +8155,8 @@
|
|
|
7841
8155
|
rawExtraFieldUnix,
|
|
7842
8156
|
rawExtraField,
|
|
7843
8157
|
rawCentralExtraField,
|
|
7844
|
-
extendedTimestamp,
|
|
7845
8158
|
extraFieldExtendedTimestampFlag,
|
|
7846
|
-
|
|
8159
|
+
extraFieldExtendedTimestampTime,
|
|
7847
8160
|
zip64Enabled,
|
|
7848
8161
|
uncompressedSize,
|
|
7849
8162
|
compressedSize
|
|
@@ -7886,16 +8199,15 @@
|
|
|
7886
8199
|
fileEntry.zip64Offset = zip64Offset;
|
|
7887
8200
|
fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
|
|
7888
8201
|
let rawExtraFieldTimestamp;
|
|
7889
|
-
|
|
7890
|
-
|
|
8202
|
+
if (extraFieldExtendedTimestampTime === UNDEFINED_VALUE) {
|
|
8203
|
+
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
8204
|
+
} else {
|
|
7891
8205
|
const extraFieldTimestamp = createRecordWriter(9);
|
|
7892
8206
|
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7893
8207
|
extraFieldTimestamp.writeUint16(5);
|
|
7894
8208
|
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7895
|
-
extraFieldTimestamp.writeUint32(
|
|
8209
|
+
extraFieldTimestamp.writeUint32(extraFieldExtendedTimestampTime);
|
|
7896
8210
|
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
7897
|
-
} else {
|
|
7898
|
-
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
7899
8211
|
}
|
|
7900
8212
|
fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
|
|
7901
8213
|
const extraFieldLength = getLength(
|
|
@@ -8395,6 +8707,11 @@
|
|
|
8395
8707
|
};
|
|
8396
8708
|
}
|
|
8397
8709
|
|
|
8710
|
+
function isPrintableASCIIText(rawText) {
|
|
8711
|
+
return rawText.every(characterCode =>
|
|
8712
|
+
characterCode >= MIN_PRINTABLE_ASCII_CHARACTER_CODE && characterCode <= MAX_PRINTABLE_ASCII_CHARACTER_CODE);
|
|
8713
|
+
}
|
|
8714
|
+
|
|
8398
8715
|
function getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted, compressionMethod) {
|
|
8399
8716
|
let bitFlag = 0;
|
|
8400
8717
|
if (useUnicodeFileNames) {
|
|
@@ -8556,7 +8873,7 @@
|
|
|
8556
8873
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
8557
8874
|
*/
|
|
8558
8875
|
|
|
8559
|
-
const VERSION = "2.
|
|
8876
|
+
const VERSION = "2.12.0";
|
|
8560
8877
|
|
|
8561
8878
|
/*
|
|
8562
8879
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9378,9 +9695,9 @@
|
|
|
9378
9695
|
DecompressionStreamFallback: DecompressionStreamZlib
|
|
9379
9696
|
});
|
|
9380
9697
|
|
|
9381
|
-
function terminateWorkersAndModule() {
|
|
9698
|
+
async function terminateWorkersAndModule() {
|
|
9699
|
+
await terminateWorkers();
|
|
9382
9700
|
modulePromise = null;
|
|
9383
|
-
terminateWorkers();
|
|
9384
9701
|
resetWasmModule();
|
|
9385
9702
|
}
|
|
9386
9703
|
|
|
@@ -9450,6 +9767,7 @@
|
|
|
9450
9767
|
exports.BlobWriter = BlobWriter;
|
|
9451
9768
|
exports.Data64URIReader = Data64URIReader;
|
|
9452
9769
|
exports.Data64URIWriter = Data64URIWriter;
|
|
9770
|
+
exports.ERR_ABORTED = ERR_ABORTED;
|
|
9453
9771
|
exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
|
|
9454
9772
|
exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
|
|
9455
9773
|
exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
@@ -9462,7 +9780,9 @@
|
|
|
9462
9780
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
9463
9781
|
exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
|
|
9464
9782
|
exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
|
|
9783
|
+
exports.ERR_HTTP_STATUS = ERR_HTTP_STATUS;
|
|
9465
9784
|
exports.ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_AUTHENTICATION_CODE;
|
|
9785
|
+
exports.ERR_INVALID_BASE_URI = ERR_INVALID_BASE_URI;
|
|
9466
9786
|
exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
|
|
9467
9787
|
exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
|
|
9468
9788
|
exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
@@ -9471,6 +9791,7 @@
|
|
|
9471
9791
|
exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
|
|
9472
9792
|
exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
|
|
9473
9793
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
9794
|
+
exports.ERR_INVALID_ENTRY = ERR_INVALID_ENTRY;
|
|
9474
9795
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
9475
9796
|
exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
|
|
9476
9797
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
@@ -9488,6 +9809,7 @@
|
|
|
9488
9809
|
exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
|
|
9489
9810
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
9490
9811
|
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
9812
|
+
exports.ERR_INVALID_PASS_THROUGH_VALUE = ERR_INVALID_PASS_THROUGH_VALUE;
|
|
9491
9813
|
exports.ERR_INVALID_READER = ERR_INVALID_READER;
|
|
9492
9814
|
exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
|
|
9493
9815
|
exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
|
|
@@ -9497,6 +9819,7 @@
|
|
|
9497
9819
|
exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
|
|
9498
9820
|
exports.ERR_INVALID_UNIX_ID_SIZE = ERR_INVALID_UNIX_ID_SIZE;
|
|
9499
9821
|
exports.ERR_INVALID_UNIX_MODE = ERR_INVALID_UNIX_MODE;
|
|
9822
|
+
exports.ERR_INVALID_URI = ERR_INVALID_URI;
|
|
9500
9823
|
exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
|
|
9501
9824
|
exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
|
|
9502
9825
|
exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
|
|
@@ -9504,6 +9827,7 @@
|
|
|
9504
9827
|
exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
9505
9828
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
9506
9829
|
exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
|
|
9830
|
+
exports.ERR_UNDEFINED_CRC32 = ERR_UNDEFINED_CRC32;
|
|
9507
9831
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
9508
9832
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
9509
9833
|
exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
|
|
@@ -9519,6 +9843,8 @@
|
|
|
9519
9843
|
exports.ERR_UNSUPPORTED_UINT64 = ERR_UNSUPPORTED_UINT64;
|
|
9520
9844
|
exports.ERR_WORKER_STARTUP_TIMEOUT = ERR_WORKER_STARTUP_TIMEOUT;
|
|
9521
9845
|
exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
|
|
9846
|
+
exports.ERR_WRITER_SIZE_NOT_WRITABLE = ERR_WRITER_SIZE_NOT_WRITABLE;
|
|
9847
|
+
exports.ERR_ZIP_CRYPTO_LAST_MOD_DATE = ERR_ZIP_CRYPTO_LAST_MOD_DATE;
|
|
9522
9848
|
exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
|
|
9523
9849
|
exports.HttpRangeReader = HttpRangeReader;
|
|
9524
9850
|
exports.HttpReader = HttpReader;
|
|
@@ -9531,13 +9857,17 @@
|
|
|
9531
9857
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
9532
9858
|
exports.VERSION = VERSION;
|
|
9533
9859
|
exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
|
|
9860
|
+
exports.WARNING_CLAMPED_LAST_MODIFICATION_DATE = WARNING_CLAMPED_LAST_MODIFICATION_DATE;
|
|
9534
9861
|
exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
|
|
9862
|
+
exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
|
|
9535
9863
|
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
9536
9864
|
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
9537
9865
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
9538
9866
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
9539
9867
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
9868
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
|
|
9540
9869
|
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
9870
|
+
exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
|
|
9541
9871
|
exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
|
|
9542
9872
|
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|
|
9543
9873
|
exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
|