@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-fs.js
CHANGED
|
@@ -134,6 +134,7 @@
|
|
|
134
134
|
const BOOLEAN_TYPE = "boolean";
|
|
135
135
|
|
|
136
136
|
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
137
|
+
const SYMBOL_ASYNC_DISPOSE = Symbol.asyncDispose || Symbol();
|
|
137
138
|
|
|
138
139
|
/*
|
|
139
140
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -178,6 +179,7 @@
|
|
|
178
179
|
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
179
180
|
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
180
181
|
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
182
|
+
const OPTION_CHECK_LOCAL_FILENAME = "checkLocalFilename";
|
|
181
183
|
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
182
184
|
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
183
185
|
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
@@ -208,15 +210,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());
|
|
@@ -4174,7 +4216,7 @@
|
|
|
4174
4216
|
|
|
4175
4217
|
async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
|
|
4176
4218
|
const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
|
|
4177
|
-
if (response.status
|
|
4219
|
+
if (response.status >= MIN_SUCCESS_HTTP_STATUS && response.status <= MAX_SUCCESS_HTTP_STATUS) {
|
|
4178
4220
|
return response;
|
|
4179
4221
|
} else {
|
|
4180
4222
|
throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
|
|
@@ -4185,7 +4227,7 @@
|
|
|
4185
4227
|
return new Promise((resolve, reject) => {
|
|
4186
4228
|
const request = new XMLHttpRequest();
|
|
4187
4229
|
request.addEventListener("load", () => {
|
|
4188
|
-
if (request.status
|
|
4230
|
+
if (request.status >= MIN_SUCCESS_HTTP_STATUS && request.status <= MAX_SUCCESS_HTTP_STATUS) {
|
|
4189
4231
|
const headers = [];
|
|
4190
4232
|
request.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach(header => {
|
|
4191
4233
|
const splitHeader = header.trim().split(/\s*:\s*/);
|
|
@@ -4489,8 +4531,10 @@
|
|
|
4489
4531
|
writable: toCompatibleWritable(writer)
|
|
4490
4532
|
};
|
|
4491
4533
|
}
|
|
4492
|
-
|
|
4493
|
-
writer.size = 0;
|
|
4534
|
+
try {
|
|
4535
|
+
writer.size = writer.size === UNDEFINED_VALUE ? 0 : writer.size;
|
|
4536
|
+
} catch {
|
|
4537
|
+
throw new Error(ERR_WRITER_SIZE_NOT_WRITABLE);
|
|
4494
4538
|
}
|
|
4495
4539
|
return writer;
|
|
4496
4540
|
}
|
|
@@ -4538,6 +4582,45 @@
|
|
|
4538
4582
|
}
|
|
4539
4583
|
}
|
|
4540
4584
|
|
|
4585
|
+
/*
|
|
4586
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
4587
|
+
|
|
4588
|
+
Redistribution and use in source and binary forms, with or without
|
|
4589
|
+
modification, are permitted provided that the following conditions are met:
|
|
4590
|
+
|
|
4591
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
4592
|
+
this list of conditions and the following disclaimer.
|
|
4593
|
+
|
|
4594
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
4595
|
+
notice, this list of conditions and the following disclaimer in
|
|
4596
|
+
the documentation and/or other materials provided with the distribution.
|
|
4597
|
+
|
|
4598
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
4599
|
+
derived from this software without specific prior written permission.
|
|
4600
|
+
|
|
4601
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4602
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4603
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4604
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4605
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4606
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4607
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4608
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4609
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4610
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4611
|
+
*/
|
|
4612
|
+
|
|
4613
|
+
|
|
4614
|
+
function addWarning(warnings, reason, filename) {
|
|
4615
|
+
if (!warnings.some(warning => warning.reason == reason)) {
|
|
4616
|
+
const warning = { reason };
|
|
4617
|
+
if (filename !== UNDEFINED_VALUE) {
|
|
4618
|
+
warning.filename = filename;
|
|
4619
|
+
}
|
|
4620
|
+
warnings.push(warning);
|
|
4621
|
+
}
|
|
4622
|
+
}
|
|
4623
|
+
|
|
4541
4624
|
/*
|
|
4542
4625
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4543
4626
|
|
|
@@ -4566,6 +4649,7 @@
|
|
|
4566
4649
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4567
4650
|
*/
|
|
4568
4651
|
|
|
4652
|
+
|
|
4569
4653
|
const PROPERTY_NAME_FILENAME = "filename";
|
|
4570
4654
|
const PROPERTY_NAME_RAW_FILENAME = "rawFilename";
|
|
4571
4655
|
const PROPERTY_NAME_COMMENT = "comment";
|
|
@@ -4690,6 +4774,38 @@
|
|
|
4690
4774
|
|
|
4691
4775
|
}
|
|
4692
4776
|
|
|
4777
|
+
const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
|
|
4778
|
+
EXTRAFIELD_TYPE_ZIP64,
|
|
4779
|
+
EXTRAFIELD_TYPE_AES,
|
|
4780
|
+
EXTRAFIELD_TYPE_NTFS,
|
|
4781
|
+
EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
|
|
4782
|
+
EXTRAFIELD_TYPE_UNICODE_PATH,
|
|
4783
|
+
EXTRAFIELD_TYPE_UNICODE_COMMENT,
|
|
4784
|
+
EXTRAFIELD_TYPE_USDZ,
|
|
4785
|
+
EXTRAFIELD_TYPE_INFOZIP,
|
|
4786
|
+
EXTRAFIELD_TYPE_UNIX,
|
|
4787
|
+
EXTRAFIELD_TYPE_UNIX_TYPE1,
|
|
4788
|
+
EXTRAFIELD_TYPE_PKWARE_UNIX
|
|
4789
|
+
]);
|
|
4790
|
+
|
|
4791
|
+
function getUserExtraField(extraField) {
|
|
4792
|
+
if (extraField) {
|
|
4793
|
+
const userExtraField = new Map();
|
|
4794
|
+
extraField.forEach((field, type) => {
|
|
4795
|
+
if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
|
|
4796
|
+
userExtraField.set(type, field.data);
|
|
4797
|
+
}
|
|
4798
|
+
});
|
|
4799
|
+
if (userExtraField.size) {
|
|
4800
|
+
return userExtraField;
|
|
4801
|
+
}
|
|
4802
|
+
}
|
|
4803
|
+
}
|
|
4804
|
+
|
|
4805
|
+
function getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength) {
|
|
4806
|
+
return encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
4807
|
+
}
|
|
4808
|
+
|
|
4693
4809
|
/*
|
|
4694
4810
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4695
4811
|
|
|
@@ -4749,6 +4865,8 @@
|
|
|
4749
4865
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4750
4866
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4751
4867
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4868
|
+
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
4869
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = "mismatched local file header (filename)";
|
|
4752
4870
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
|
|
4753
4871
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
|
|
4754
4872
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
|
|
@@ -4819,7 +4937,7 @@
|
|
|
4819
4937
|
}
|
|
4820
4938
|
}
|
|
4821
4939
|
if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
|
|
4822
|
-
throwAmbiguousArchive(
|
|
4940
|
+
throwAmbiguousArchive(WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY);
|
|
4823
4941
|
}
|
|
4824
4942
|
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
4825
4943
|
let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
|
|
@@ -5117,7 +5235,8 @@
|
|
|
5117
5235
|
const writer = new TransformStream();
|
|
5118
5236
|
const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
|
|
5119
5237
|
arrayBufferPromise.catch(() => { });
|
|
5120
|
-
await fileEntry.getData(writer, entry, zipReader.readRanges,
|
|
5238
|
+
await fileEntry.getData(writer, entry, zipReader.readRanges,
|
|
5239
|
+
Object.assign({}, options, { preventClose: false }));
|
|
5121
5240
|
return arrayBufferPromise;
|
|
5122
5241
|
};
|
|
5123
5242
|
offset = endOffset;
|
|
@@ -5198,49 +5317,101 @@
|
|
|
5198
5317
|
await reader.readable.cancel();
|
|
5199
5318
|
}
|
|
5200
5319
|
}
|
|
5320
|
+
|
|
5321
|
+
[SYMBOL_ASYNC_DISPOSE]() {
|
|
5322
|
+
return this.close();
|
|
5323
|
+
}
|
|
5201
5324
|
}
|
|
5202
5325
|
|
|
5203
5326
|
class ZipReaderStream {
|
|
5204
5327
|
|
|
5205
5328
|
constructor(options = {}) {
|
|
5206
|
-
|
|
5207
|
-
const
|
|
5329
|
+
let sourceController;
|
|
5330
|
+
const { readable, writable } = new TransformStream({
|
|
5331
|
+
start(controller) {
|
|
5332
|
+
sourceController = controller;
|
|
5333
|
+
}
|
|
5334
|
+
});
|
|
5335
|
+
const zipReader = new ZipReader(readable, options);
|
|
5336
|
+
const gen = zipReader.getEntriesGenerator();
|
|
5337
|
+
const pendingEntries = new Set();
|
|
5208
5338
|
this.readable = new ReadableStream({
|
|
5209
5339
|
async pull(controller) {
|
|
5210
5340
|
const { done, value } = await gen.next();
|
|
5211
5341
|
if (done)
|
|
5212
5342
|
return controller.close();
|
|
5213
|
-
const
|
|
5214
|
-
const { readable, writable } = new TransformStream();
|
|
5215
|
-
if (value.getData) {
|
|
5216
|
-
getData();
|
|
5217
|
-
return readable;
|
|
5218
|
-
}
|
|
5219
|
-
|
|
5220
|
-
async function getData() {
|
|
5221
|
-
try {
|
|
5222
|
-
await value.getData(writable);
|
|
5223
|
-
} catch (error) {
|
|
5224
|
-
try {
|
|
5225
|
-
await writable.abort(error);
|
|
5226
|
-
} catch {
|
|
5227
|
-
// ignored
|
|
5228
|
-
}
|
|
5229
|
-
}
|
|
5230
|
-
}
|
|
5231
|
-
})();
|
|
5343
|
+
const entryStream = createEntryStream(value, pendingEntries);
|
|
5232
5344
|
const chunk = {
|
|
5233
5345
|
...value,
|
|
5234
|
-
readable:
|
|
5346
|
+
readable: entryStream.readable
|
|
5235
5347
|
};
|
|
5236
5348
|
delete chunk.getData;
|
|
5349
|
+
Object.defineProperties(chunk, {
|
|
5350
|
+
localDirectory: {
|
|
5351
|
+
get: () => value.localDirectory,
|
|
5352
|
+
enumerable: true
|
|
5353
|
+
},
|
|
5354
|
+
warnings: {
|
|
5355
|
+
get: () => value.warnings,
|
|
5356
|
+
enumerable: true
|
|
5357
|
+
}
|
|
5358
|
+
});
|
|
5237
5359
|
controller.enqueue(chunk);
|
|
5360
|
+
},
|
|
5361
|
+
async cancel(reason) {
|
|
5362
|
+
const entryStreams = Array.from(pendingEntries);
|
|
5363
|
+
pendingEntries.clear();
|
|
5364
|
+
sourceController.error(reason);
|
|
5365
|
+
await Promise.allSettled(entryStreams.map(entryStream => entryStream.cancel(reason)));
|
|
5366
|
+
await Promise.allSettled([gen.return(), zipReader.close()]);
|
|
5238
5367
|
}
|
|
5239
5368
|
});
|
|
5240
5369
|
this.writable = writable;
|
|
5241
5370
|
}
|
|
5242
5371
|
}
|
|
5243
5372
|
|
|
5373
|
+
function createEntryStream(entry, pendingEntries) {
|
|
5374
|
+
const { readable, writable } = new TransformStream();
|
|
5375
|
+
let dataReader;
|
|
5376
|
+
const entryStream = {
|
|
5377
|
+
cancel: async reason => {
|
|
5378
|
+
pendingEntries.delete(entryStream);
|
|
5379
|
+
await (dataReader ? dataReader.cancel(reason) : readable.cancel(reason));
|
|
5380
|
+
}
|
|
5381
|
+
};
|
|
5382
|
+
entryStream.readable = new ReadableStream({
|
|
5383
|
+
async pull(controller) {
|
|
5384
|
+
if (!dataReader) {
|
|
5385
|
+
dataReader = readable.getReader();
|
|
5386
|
+
pendingEntries.add(entryStream);
|
|
5387
|
+
getData();
|
|
5388
|
+
}
|
|
5389
|
+
const { done, value } = await dataReader.read();
|
|
5390
|
+
if (done) {
|
|
5391
|
+
controller.close();
|
|
5392
|
+
} else {
|
|
5393
|
+
controller.enqueue(value);
|
|
5394
|
+
}
|
|
5395
|
+
},
|
|
5396
|
+
cancel: reason => entryStream.cancel(reason)
|
|
5397
|
+
}, { highWaterMark: 0 });
|
|
5398
|
+
return entryStream;
|
|
5399
|
+
|
|
5400
|
+
async function getData() {
|
|
5401
|
+
try {
|
|
5402
|
+
await entry.getData(writable, { preventClose: false });
|
|
5403
|
+
} catch (error) {
|
|
5404
|
+
try {
|
|
5405
|
+
await writable.abort(error);
|
|
5406
|
+
} catch {
|
|
5407
|
+
// ignored
|
|
5408
|
+
}
|
|
5409
|
+
} finally {
|
|
5410
|
+
pendingEntries.delete(entryStream);
|
|
5411
|
+
}
|
|
5412
|
+
}
|
|
5413
|
+
}
|
|
5414
|
+
|
|
5244
5415
|
async function isZipFile(reader, options = {}) {
|
|
5245
5416
|
reader = new GenericReader(reader);
|
|
5246
5417
|
await initStream(reader);
|
|
@@ -5300,7 +5471,9 @@
|
|
|
5300
5471
|
const dataView = getDataView(dataArray);
|
|
5301
5472
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
5302
5473
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
5303
|
-
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
5474
|
+
const passThrough = checkPassThroughOption(getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH));
|
|
5475
|
+
const passThroughCompression = Boolean(passThrough);
|
|
5476
|
+
const passThroughEncryption = passThrough === true;
|
|
5304
5477
|
checkPasswordOption(password, rawPassword);
|
|
5305
5478
|
password = password && password.length && password;
|
|
5306
5479
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
@@ -5321,7 +5494,9 @@
|
|
|
5321
5494
|
const checkLocalDirectoryOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_DIRECTORY);
|
|
5322
5495
|
const entryStrictness = getStrictness(options, zipEntry.options);
|
|
5323
5496
|
const checkLocalDirectory = getCheckLocalDirectory(checkLocalDirectoryOption, entryStrictness);
|
|
5324
|
-
const
|
|
5497
|
+
const checkLocalFilenameOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_FILENAME);
|
|
5498
|
+
const checkLocalFilename = getCheckLocalFilename(
|
|
5499
|
+
checkLocalFilenameOption === UNDEFINED_VALUE ? checkLocalDirectoryOption : checkLocalFilenameOption, entryStrictness);
|
|
5325
5500
|
let rawLocalFilename = EMPTY_UINT8_ARRAY;
|
|
5326
5501
|
if (checkLocalFilename && (filenameLength || extraFieldLength)) {
|
|
5327
5502
|
const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
|
|
@@ -5352,16 +5527,17 @@
|
|
|
5352
5527
|
if (gid !== UNDEFINED_VALUE && fileEntry.gid === UNDEFINED_VALUE) {
|
|
5353
5528
|
fileEntry.gid = gid;
|
|
5354
5529
|
}
|
|
5355
|
-
const
|
|
5530
|
+
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5531
|
+
const encrypted = zipEntry.encrypted && localDirectory.encrypted && (!passThroughEncryption || checkPasswordOnly);
|
|
5356
5532
|
const zipCrypto = encrypted && !extraFieldAES;
|
|
5357
|
-
if (!
|
|
5533
|
+
if (!passThroughEncryption) {
|
|
5358
5534
|
fileEntry.zipCrypto = zipCrypto;
|
|
5359
5535
|
}
|
|
5360
5536
|
if (encrypted && (localDirectory.rawBitFlag & BITFLAG_STRONG_ENCRYPTION) == BITFLAG_STRONG_ENCRYPTION) {
|
|
5361
5537
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
|
|
5362
5538
|
}
|
|
5363
|
-
const registeredCodec =
|
|
5364
|
-
if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !
|
|
5539
|
+
const registeredCodec = passThroughCompression ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
5540
|
+
if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThroughCompression) {
|
|
5365
5541
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
5366
5542
|
}
|
|
5367
5543
|
if (encrypted) {
|
|
@@ -5378,15 +5554,16 @@
|
|
|
5378
5554
|
const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
|
|
5379
5555
|
const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
|
|
5380
5556
|
throwIfAborted(signal);
|
|
5381
|
-
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5382
5557
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
5383
5558
|
const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
|
|
5384
5559
|
if (checkOverlappingEntryOnly) {
|
|
5385
5560
|
checkOverlappingEntry = true;
|
|
5386
5561
|
}
|
|
5387
5562
|
const { onstart, onprogress, onend } = options;
|
|
5388
|
-
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !
|
|
5389
|
-
const outputSize =
|
|
5563
|
+
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThroughCompression;
|
|
5564
|
+
const outputSize = passThroughCompression ?
|
|
5565
|
+
compressedSize - getEncryptionOverhead(encrypted, zipCrypto, extraFieldAES && extraFieldAES.strength) :
|
|
5566
|
+
uncompressedSize;
|
|
5390
5567
|
const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
|
|
5391
5568
|
let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
|
|
5392
5569
|
if (deflate64) {
|
|
@@ -5395,7 +5572,7 @@
|
|
|
5395
5572
|
const checkCrc32Option = getOptionValue$1(zipEntry, options, OPTION_CHECK_CRC32);
|
|
5396
5573
|
const checkCrc32 = (checkCrc32Option === UNDEFINED_VALUE ?
|
|
5397
5574
|
getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) :
|
|
5398
|
-
checkCrc32Option) && !
|
|
5575
|
+
checkCrc32Option) && !passThroughCompression &&
|
|
5399
5576
|
(!encrypted || zipCrypto || (extraFieldAES && extraFieldAES.vendorVersion == VENDOR_VERSION_AE_1$1));
|
|
5400
5577
|
const workerOptions = {
|
|
5401
5578
|
options: {
|
|
@@ -5449,10 +5626,10 @@
|
|
|
5449
5626
|
await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
|
|
5450
5627
|
({ writable } = writer);
|
|
5451
5628
|
const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5452
|
-
writer.size += writtenSize;
|
|
5453
5629
|
if (writtenSize != outputSize) {
|
|
5454
|
-
throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
5630
|
+
throw Object.assign(new Error(ERR_INVALID_UNCOMPRESSED_SIZE), { outputSize: writtenSize });
|
|
5455
5631
|
}
|
|
5632
|
+
writer.size += writtenSize;
|
|
5456
5633
|
}
|
|
5457
5634
|
} catch (error) {
|
|
5458
5635
|
if (error.outputSize !== UNDEFINED_VALUE) {
|
|
@@ -6118,7 +6295,7 @@
|
|
|
6118
6295
|
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
6119
6296
|
(rawLocalFilename.length != rawFilename.length ||
|
|
6120
6297
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
6121
|
-
reportAmbiguity(reject, warnings,
|
|
6298
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME);
|
|
6122
6299
|
}
|
|
6123
6300
|
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
6124
6301
|
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
|
|
@@ -6143,16 +6320,6 @@
|
|
|
6143
6320
|
}
|
|
6144
6321
|
}
|
|
6145
6322
|
|
|
6146
|
-
function addWarning(warnings, reason, filename) {
|
|
6147
|
-
if (!warnings.some(warning => warning.reason == reason)) {
|
|
6148
|
-
const warning = { reason };
|
|
6149
|
-
if (filename !== UNDEFINED_VALUE) {
|
|
6150
|
-
warning.filename = filename;
|
|
6151
|
-
}
|
|
6152
|
-
warnings.push(warning);
|
|
6153
|
-
}
|
|
6154
|
-
}
|
|
6155
|
-
|
|
6156
6323
|
function throwAmbiguousArchive(reason) {
|
|
6157
6324
|
const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
|
|
6158
6325
|
error.reason = reason;
|
|
@@ -6232,7 +6399,9 @@
|
|
|
6232
6399
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6233
6400
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6234
6401
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6402
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6235
6403
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6404
|
+
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6236
6405
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6237
6406
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
6238
6407
|
WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
|
|
@@ -6285,7 +6454,7 @@
|
|
|
6285
6454
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
6286
6455
|
const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
|
|
6287
6456
|
const ERR_UNSUPPORTED_SPLIT_USDZ = "Split zip files are not supported in USDZ files";
|
|
6288
|
-
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
|
|
6457
|
+
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set to true (use 'compressed' instead)";
|
|
6289
6458
|
const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
|
|
6290
6459
|
const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
|
|
6291
6460
|
const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
|
|
@@ -6297,6 +6466,7 @@
|
|
|
6297
6466
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
6298
6467
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
6299
6468
|
const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
|
|
6469
|
+
const ERR_UNDEFINED_CRC32 = "Undefined CRC32";
|
|
6300
6470
|
const ERR_UNDETERMINED_SIZE = "Undetermined size";
|
|
6301
6471
|
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
6302
6472
|
const ERR_INVALID_READER = "Invalid reader (must be a Reader instance, a ReadableStream instance, or an object with a 'readable' property)";
|
|
@@ -6310,14 +6480,21 @@
|
|
|
6310
6480
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
6311
6481
|
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
6312
6482
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
6483
|
+
const ERR_INVALID_ENTRY = "Invalid entry option (must be an entry returned by ZipReader#getEntries())";
|
|
6484
|
+
const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
|
|
6485
|
+
const WARNING_COMPRESSION_UNAVAILABLE = "compression unavailable";
|
|
6486
|
+
const WARNING_CLAMPED_LAST_MODIFICATION_DATE = "clamped last modification date";
|
|
6313
6487
|
|
|
6314
6488
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
6315
6489
|
const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
|
|
6316
6490
|
const EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD = 9;
|
|
6317
6491
|
const EXTRAFIELD_USDZ_MAX_LENGTH = 67;
|
|
6492
|
+
const MIN_PRINTABLE_ASCII_CHARACTER_CODE = 0x20;
|
|
6493
|
+
const MAX_PRINTABLE_ASCII_CHARACTER_CODE = 0x7e;
|
|
6318
6494
|
const VENDOR_VERSION_AE_1 = 1;
|
|
6319
|
-
const INFOZIP_EXTRA_FIELD_TYPE
|
|
6495
|
+
const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
|
|
6320
6496
|
const UNIX_EXTRA_FIELD_TYPE = "unix";
|
|
6497
|
+
const LEVEL_BY_BITFLAG_LEVEL = [8, 9, 5, 3];
|
|
6321
6498
|
const MAX_LEVEL = 9;
|
|
6322
6499
|
|
|
6323
6500
|
let workers = 0;
|
|
@@ -6344,9 +6521,11 @@
|
|
|
6344
6521
|
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
6345
6522
|
pendingAddFileCalls: new Set(),
|
|
6346
6523
|
pendingErrors: [],
|
|
6524
|
+
warnings: [],
|
|
6347
6525
|
bufferedWrites: 0,
|
|
6348
6526
|
directWrites: 0,
|
|
6349
|
-
lastFileEntry: UNDEFINED_VALUE
|
|
6527
|
+
lastFileEntry: UNDEFINED_VALUE,
|
|
6528
|
+
archiveClosed: false
|
|
6350
6529
|
});
|
|
6351
6530
|
}
|
|
6352
6531
|
|
|
@@ -6511,6 +6690,9 @@
|
|
|
6511
6690
|
const zipWriter = this;
|
|
6512
6691
|
const { pendingAddFileCalls, writer } = this;
|
|
6513
6692
|
const { writable } = writer;
|
|
6693
|
+
if (zipWriter.archiveClosed) {
|
|
6694
|
+
return getWriterData(writer);
|
|
6695
|
+
}
|
|
6514
6696
|
if (!(comment instanceof Uint8Array)) {
|
|
6515
6697
|
throw new Error(ERR_INVALID_COMMENT_TYPE);
|
|
6516
6698
|
}
|
|
@@ -6534,11 +6716,16 @@
|
|
|
6534
6716
|
throw error;
|
|
6535
6717
|
}
|
|
6536
6718
|
await closeFile(zipWriter, comment, options);
|
|
6719
|
+
zipWriter.archiveClosed = true;
|
|
6537
6720
|
const preventClose = !ownsWritable(writer) && getOptionValue(zipWriter, options, OPTION_PREVENT_CLOSE);
|
|
6538
6721
|
if (!preventClose) {
|
|
6539
6722
|
await writable.getWriter().close();
|
|
6540
6723
|
}
|
|
6541
|
-
return writer
|
|
6724
|
+
return getWriterData(writer);
|
|
6725
|
+
}
|
|
6726
|
+
|
|
6727
|
+
[SYMBOL_ASYNC_DISPOSE]() {
|
|
6728
|
+
return this.close();
|
|
6542
6729
|
}
|
|
6543
6730
|
}
|
|
6544
6731
|
|
|
@@ -6617,6 +6804,10 @@
|
|
|
6617
6804
|
}
|
|
6618
6805
|
}
|
|
6619
6806
|
|
|
6807
|
+
function getWriterData(writer) {
|
|
6808
|
+
return writer.getData ? writer.getData() : writer.writable;
|
|
6809
|
+
}
|
|
6810
|
+
|
|
6620
6811
|
function watchPromiseError(zipWriter, promise) {
|
|
6621
6812
|
const watchedPromise = new WatchedPromise((resolve, reject) => Promise.prototype.then.call(promise, resolve, reject));
|
|
6622
6813
|
const watcher = {};
|
|
@@ -6635,6 +6826,14 @@
|
|
|
6635
6826
|
|
|
6636
6827
|
async function addFileEntry(zipWriter, name, reader, options) {
|
|
6637
6828
|
options = Object.assign({}, options);
|
|
6829
|
+
const entry = options[OPTION_ENTRY];
|
|
6830
|
+
if (entry !== UNDEFINED_VALUE) {
|
|
6831
|
+
const { entryOptions, passThroughOptions } = getSourceEntryOptions(entry,
|
|
6832
|
+
checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH)),
|
|
6833
|
+
getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE));
|
|
6834
|
+
delete options[OPTION_ENTRY];
|
|
6835
|
+
options = Object.assign(entryOptions, passThroughOptions, options);
|
|
6836
|
+
}
|
|
6638
6837
|
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
6639
6838
|
name += DIRECTORY_SIGNATURE;
|
|
6640
6839
|
}
|
|
@@ -6699,21 +6898,33 @@
|
|
|
6699
6898
|
try {
|
|
6700
6899
|
const { resolvedOptions } = metadataInfo;
|
|
6701
6900
|
if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
|
|
6702
|
-
!resolvedOptions.
|
|
6901
|
+
!resolvedOptions.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
|
|
6703
6902
|
resolvedOptions.level = 0;
|
|
6903
|
+
addWarning(zipWriter.warnings, WARNING_COMPRESSION_UNAVAILABLE, name);
|
|
6704
6904
|
}
|
|
6705
6905
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
6706
6906
|
({ reader } = sizesInfo);
|
|
6707
6907
|
const diskOffset = getDiskOffset(zipWriter.writer);
|
|
6708
6908
|
const diskNumber = getDiskNumber(zipWriter.writer);
|
|
6909
|
+
let crc32 = options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32;
|
|
6910
|
+
const storesAE2 = sizesInfo.resolvedOptions.encrypted && !resolvedOptions.zipCrypto;
|
|
6911
|
+
if (resolvedOptions.passThroughCompression && !resolvedOptions.passThroughEncryption && storesAE2) {
|
|
6912
|
+
crc32 = UNDEFINED_VALUE;
|
|
6913
|
+
}
|
|
6914
|
+
if (resolvedOptions.passThroughCompression && reader && !storesAE2 && crc32 === UNDEFINED_VALUE) {
|
|
6915
|
+
throw new Error(ERR_UNDEFINED_CRC32);
|
|
6916
|
+
}
|
|
6709
6917
|
options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
|
|
6710
6918
|
signature: options[PROPERTY_NAME_SIGNATURE],
|
|
6711
|
-
crc32
|
|
6919
|
+
crc32,
|
|
6712
6920
|
offset: zipWriter.offset - diskOffset,
|
|
6713
6921
|
diskNumberStart: diskNumber,
|
|
6714
6922
|
[OPTION_USDZ]: zipWriter.options[OPTION_USDZ]
|
|
6715
6923
|
});
|
|
6716
6924
|
const headerInfo = getHeaderInfo(options);
|
|
6925
|
+
if (headerInfo.lastModDateClamped) {
|
|
6926
|
+
addWarning(zipWriter.warnings, WARNING_CLAMPED_LAST_MODIFICATION_DATE, name);
|
|
6927
|
+
}
|
|
6717
6928
|
const dataDescriptorInfo = getDataDescriptorInfo(options);
|
|
6718
6929
|
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
6719
6930
|
fileEntry = await getFileEntry(zipWriter, name, reader, {
|
|
@@ -6740,6 +6951,95 @@
|
|
|
6740
6951
|
return new Entry(fileEntry);
|
|
6741
6952
|
}
|
|
6742
6953
|
|
|
6954
|
+
function getSourceEntryOptions(entry, passThrough, lastModDateOverride) {
|
|
6955
|
+
if (entry === null || typeof entry != OBJECT_TYPE || Array.isArray(entry)) {
|
|
6956
|
+
throw new Error(ERR_INVALID_ENTRY);
|
|
6957
|
+
}
|
|
6958
|
+
const {
|
|
6959
|
+
externalFileAttributes,
|
|
6960
|
+
versionMadeBy,
|
|
6961
|
+
comment,
|
|
6962
|
+
lastModDate,
|
|
6963
|
+
rawLastModDate,
|
|
6964
|
+
creationDate,
|
|
6965
|
+
lastAccessDate,
|
|
6966
|
+
uncompressedSize,
|
|
6967
|
+
encrypted,
|
|
6968
|
+
zipCrypto,
|
|
6969
|
+
crc32,
|
|
6970
|
+
compressionMethod,
|
|
6971
|
+
extraFieldAES,
|
|
6972
|
+
extraFieldUnix,
|
|
6973
|
+
internalFileAttributes,
|
|
6974
|
+
extraField,
|
|
6975
|
+
bitFlag,
|
|
6976
|
+
directory,
|
|
6977
|
+
uid,
|
|
6978
|
+
gid
|
|
6979
|
+
} = entry;
|
|
6980
|
+
const entryOptions = {
|
|
6981
|
+
externalFileAttributes,
|
|
6982
|
+
versionMadeBy,
|
|
6983
|
+
comment,
|
|
6984
|
+
lastModDate,
|
|
6985
|
+
creationDate,
|
|
6986
|
+
lastAccessDate,
|
|
6987
|
+
internalFileAttributes,
|
|
6988
|
+
directory
|
|
6989
|
+
};
|
|
6990
|
+
if (bitFlag && bitFlag.languageEncodingFlag) {
|
|
6991
|
+
entryOptions[OPTION_USE_UNICODE_FILE_NAMES] = true;
|
|
6992
|
+
}
|
|
6993
|
+
const userExtraField = getUserExtraField(extraField);
|
|
6994
|
+
if (userExtraField) {
|
|
6995
|
+
entryOptions[PROPERTY_NAME_EXTRA_FIELD] = userExtraField;
|
|
6996
|
+
}
|
|
6997
|
+
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
6998
|
+
Object.assign(entryOptions, {
|
|
6999
|
+
uid,
|
|
7000
|
+
gid,
|
|
7001
|
+
unixExtraFieldType: extraFieldUnix ? UNIX_EXTRA_FIELD_TYPE : INFOZIP_EXTRA_FIELD_TYPE
|
|
7002
|
+
});
|
|
7003
|
+
}
|
|
7004
|
+
const passThroughOptions = {};
|
|
7005
|
+
if (passThrough && !directory) {
|
|
7006
|
+
Object.assign(passThroughOptions, {
|
|
7007
|
+
uncompressedSize,
|
|
7008
|
+
crc32,
|
|
7009
|
+
compressionMethod
|
|
7010
|
+
});
|
|
7011
|
+
if (passThrough !== PASS_THROUGH_COMPRESSED) {
|
|
7012
|
+
Object.assign(passThroughOptions, {
|
|
7013
|
+
encrypted,
|
|
7014
|
+
zipCrypto,
|
|
7015
|
+
encryptionStrength: extraFieldAES ? extraFieldAES.strength : UNDEFINED_VALUE
|
|
7016
|
+
});
|
|
7017
|
+
}
|
|
7018
|
+
if (bitFlag) {
|
|
7019
|
+
passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
|
|
7020
|
+
passThroughOptions[OPTION_LEVEL] = LEVEL_BY_BITFLAG_LEVEL[bitFlag.level];
|
|
7021
|
+
}
|
|
7022
|
+
if (lastModDateOverride === UNDEFINED_VALUE) {
|
|
7023
|
+
passThroughOptions.rawLastModDate = rawLastModDate;
|
|
7024
|
+
} else if (passThrough !== PASS_THROUGH_COMPRESSED && zipCrypto && (!bitFlag || bitFlag.dataDescriptor) &&
|
|
7025
|
+
lastModDateOverride instanceof Date &&
|
|
7026
|
+
getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
|
|
7027
|
+
throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
|
|
7028
|
+
}
|
|
7029
|
+
}
|
|
7030
|
+
return { entryOptions, passThroughOptions };
|
|
7031
|
+
}
|
|
7032
|
+
|
|
7033
|
+
function getDosTimeHighByte(lastModDate) {
|
|
7034
|
+
let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
|
|
7035
|
+
if (dosLastModDate < MIN_DATE) {
|
|
7036
|
+
dosLastModDate = MIN_DATE;
|
|
7037
|
+
} else if (dosLastModDate > MAX_DATE) {
|
|
7038
|
+
dosLastModDate = MAX_DATE;
|
|
7039
|
+
}
|
|
7040
|
+
return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
|
|
7041
|
+
}
|
|
7042
|
+
|
|
6743
7043
|
function resolveAttributes(zipWriter, name, options) {
|
|
6744
7044
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
6745
7045
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
|
|
@@ -6754,7 +7054,7 @@
|
|
|
6754
7054
|
checkIntegerOption(uid, MAX_32_BITS, ERR_INVALID_UID);
|
|
6755
7055
|
checkIntegerOption(gid, MAX_32_BITS, ERR_INVALID_GID);
|
|
6756
7056
|
checkIntegerOption(unixMode, MAX_16_BITS, ERR_INVALID_UNIX_MODE);
|
|
6757
|
-
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE
|
|
7057
|
+
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
|
|
6758
7058
|
throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
|
|
6759
7059
|
}
|
|
6760
7060
|
if (unixExtraFieldType === UNIX_EXTRA_FIELD_TYPE &&
|
|
@@ -6762,7 +7062,7 @@
|
|
|
6762
7062
|
throw new Error(ERR_INVALID_UNIX_ID_SIZE);
|
|
6763
7063
|
}
|
|
6764
7064
|
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
6765
|
-
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE
|
|
7065
|
+
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
|
|
6766
7066
|
}
|
|
6767
7067
|
let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
6768
7068
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
@@ -6893,7 +7193,9 @@
|
|
|
6893
7193
|
const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
|
|
6894
7194
|
const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
|
|
6895
7195
|
const internalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, 0);
|
|
6896
|
-
const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
|
|
7196
|
+
const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
|
|
7197
|
+
const passThroughCompression = Boolean(passThrough);
|
|
7198
|
+
const passThroughEncryption = passThrough === true;
|
|
6897
7199
|
const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6898
7200
|
const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6899
7201
|
checkPasswordOption(password, rawPassword);
|
|
@@ -6909,10 +7211,11 @@
|
|
|
6909
7211
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
6910
7212
|
const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
|
|
6911
7213
|
throwIfAborted(signal);
|
|
6912
|
-
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
|
|
7214
|
+
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
|
|
7215
|
+
!isPrintableASCIIText(rawFilename) || !isPrintableASCIIText(rawComment));
|
|
6913
7216
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
6914
|
-
const registeredCodec =
|
|
6915
|
-
if (!
|
|
7217
|
+
const registeredCodec = passThroughCompression || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
7218
|
+
if (!passThroughCompression && compressionMethod !== UNDEFINED_VALUE &&
|
|
6916
7219
|
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
|
|
6917
7220
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
6918
7221
|
}
|
|
@@ -6926,15 +7229,15 @@
|
|
|
6926
7229
|
level = 0;
|
|
6927
7230
|
}
|
|
6928
7231
|
}
|
|
6929
|
-
if (
|
|
6930
|
-
level =
|
|
7232
|
+
if (passThroughCompression) {
|
|
7233
|
+
level = toNumber(options[OPTION_LEVEL]);
|
|
6931
7234
|
}
|
|
6932
7235
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
6933
7236
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
6934
7237
|
if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
|
|
6935
7238
|
dataDescriptor = false;
|
|
6936
7239
|
}
|
|
6937
|
-
if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !
|
|
7240
|
+
if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThroughEncryption)) {
|
|
6938
7241
|
dataDescriptor = true;
|
|
6939
7242
|
}
|
|
6940
7243
|
if (level !== UNDEFINED_VALUE && level != 6) {
|
|
@@ -6958,7 +7261,8 @@
|
|
|
6958
7261
|
lastAccessDate,
|
|
6959
7262
|
creationDate,
|
|
6960
7263
|
internalFileAttributes,
|
|
6961
|
-
|
|
7264
|
+
passThroughCompression,
|
|
7265
|
+
passThroughEncryption,
|
|
6962
7266
|
password,
|
|
6963
7267
|
rawPassword,
|
|
6964
7268
|
encryptionStrength,
|
|
@@ -7019,7 +7323,7 @@
|
|
|
7019
7323
|
}
|
|
7020
7324
|
|
|
7021
7325
|
async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
|
|
7022
|
-
if (metadata.
|
|
7326
|
+
if (metadata.passThroughCompression && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
|
|
7023
7327
|
throw new Error(ERR_UNDEFINED_READER);
|
|
7024
7328
|
}
|
|
7025
7329
|
let contentSize;
|
|
@@ -7035,12 +7339,12 @@
|
|
|
7035
7339
|
}
|
|
7036
7340
|
|
|
7037
7341
|
function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options) {
|
|
7038
|
-
const {
|
|
7342
|
+
const { passThroughCompression, passThroughEncryption, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
|
|
7039
7343
|
let { dataDescriptor, zip64, level, compressionMethod } = metadata;
|
|
7040
7344
|
let maximumCompressedSize = 0;
|
|
7041
7345
|
let uncompressedSize = 0;
|
|
7042
7346
|
let unknownSize = false;
|
|
7043
|
-
if (
|
|
7347
|
+
if (passThroughCompression && hasContent) {
|
|
7044
7348
|
uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
|
|
7045
7349
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
7046
7350
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
@@ -7051,17 +7355,17 @@
|
|
|
7051
7355
|
}
|
|
7052
7356
|
const zip64Enabled = zip64 === true;
|
|
7053
7357
|
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
7054
|
-
if (hasContent &&
|
|
7358
|
+
if (hasContent && passThroughEncryption && !encrypted && getLength(password, rawPassword)) {
|
|
7055
7359
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH);
|
|
7056
7360
|
}
|
|
7057
|
-
const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (
|
|
7361
|
+
const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThroughEncryption && encrypted));
|
|
7058
7362
|
if (!hasContent) {
|
|
7059
7363
|
level = 0;
|
|
7060
7364
|
compressionMethod = COMPRESSION_METHOD_STORE;
|
|
7061
7365
|
}
|
|
7062
|
-
const encryptionOverhead = encryptedEntry
|
|
7366
|
+
const encryptionOverhead = getEncryptionOverhead(encryptedEntry, zipCrypto, encryptionStrength);
|
|
7063
7367
|
if (hasContent) {
|
|
7064
|
-
if (!
|
|
7368
|
+
if (!passThroughCompression) {
|
|
7065
7369
|
if (contentSize === UNDEFINED_VALUE) {
|
|
7066
7370
|
dataDescriptor = true;
|
|
7067
7371
|
if (zip64 || zip64 === UNDEFINED_VALUE) {
|
|
@@ -7074,10 +7378,12 @@
|
|
|
7074
7378
|
}
|
|
7075
7379
|
} else {
|
|
7076
7380
|
options.uncompressedSize = uncompressedSize;
|
|
7077
|
-
maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
|
|
7381
|
+
maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
|
|
7382
|
+
getMaximumCompressedSize(uncompressedSize) + encryptionOverhead :
|
|
7383
|
+
contentSize + (passThroughEncryption ? 0 : encryptionOverhead);
|
|
7078
7384
|
}
|
|
7079
7385
|
}
|
|
7080
|
-
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !
|
|
7386
|
+
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
|
|
7081
7387
|
if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
|
|
7082
7388
|
dataDescriptor = false;
|
|
7083
7389
|
}
|
|
@@ -7126,6 +7432,8 @@
|
|
|
7126
7432
|
const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
|
|
7127
7433
|
let offset = initialOffset;
|
|
7128
7434
|
let minimumEntrySize = INFINITY_VALUE;
|
|
7435
|
+
const entrySizes = [];
|
|
7436
|
+
const entriesAlreadyZip64 = new Set();
|
|
7129
7437
|
for (const entry of entries) {
|
|
7130
7438
|
let { name } = entry;
|
|
7131
7439
|
const { size } = entry;
|
|
@@ -7137,7 +7445,7 @@
|
|
|
7137
7445
|
({ name } = attributesInfo);
|
|
7138
7446
|
const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
|
|
7139
7447
|
if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
|
|
7140
|
-
!metadata.
|
|
7448
|
+
!metadata.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
|
|
7141
7449
|
metadata.level = 0;
|
|
7142
7450
|
}
|
|
7143
7451
|
const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
|
|
@@ -7145,7 +7453,7 @@
|
|
|
7145
7453
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7146
7454
|
}
|
|
7147
7455
|
const { maximumCompressedSize, resolvedOptions: sizes } = resolveEntrySizes(zipWriter, hasContent, size, metadata, options);
|
|
7148
|
-
if (hasContent && !metadata.
|
|
7456
|
+
if (hasContent && !metadata.passThroughCompression && isCompressed(sizes.compressionMethod, sizes.level)) {
|
|
7149
7457
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7150
7458
|
}
|
|
7151
7459
|
const entryOptions = Object.assign({}, options, attributesInfo.resolvedOptions, metadata, sizes, { [OPTION_USDZ]: usdz });
|
|
@@ -7165,10 +7473,15 @@
|
|
|
7165
7473
|
compressedSize
|
|
7166
7474
|
}));
|
|
7167
7475
|
const entrySize = entryInfo.metadataSize + compressedSize;
|
|
7476
|
+
entrySizes.push(entrySize);
|
|
7477
|
+
entriesAlreadyZip64.add(Boolean(entryOptions.zip64Enabled ||
|
|
7478
|
+
entryOptions.uncompressedSize >= MAX_32_BITS || compressedSize >= MAX_32_BITS));
|
|
7168
7479
|
minimumEntrySize = Math.min(minimumEntrySize, entrySize);
|
|
7169
7480
|
offset += entrySize;
|
|
7170
7481
|
}
|
|
7171
|
-
const layoutDependsOnWriteOrder = files.size > 1 && (usdz ||
|
|
7482
|
+
const layoutDependsOnWriteOrder = files.size > 1 && (usdz ||
|
|
7483
|
+
(offset - minimumEntrySize >= MAX_32_BITS &&
|
|
7484
|
+
(entriesAlreadyZip64.size > 1 || countEntriesBefore4GB(entrySizes, initialOffset, true) != countEntriesBefore4GB(entrySizes, initialOffset, false))));
|
|
7172
7485
|
if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
|
|
7173
7486
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7174
7487
|
}
|
|
@@ -7186,6 +7499,20 @@
|
|
|
7186
7499
|
return offset - initialOffset + directoryDataLength + commentLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
|
|
7187
7500
|
}
|
|
7188
7501
|
|
|
7502
|
+
function countEntriesBefore4GB(entrySizes, initialOffset, largestFirst) {
|
|
7503
|
+
const ordered = entrySizes.slice().sort((first, second) => largestFirst ? second - first : first - second);
|
|
7504
|
+
let position = initialOffset;
|
|
7505
|
+
let count = 0;
|
|
7506
|
+
for (const entrySize of ordered) {
|
|
7507
|
+
if (position >= MAX_32_BITS) {
|
|
7508
|
+
break;
|
|
7509
|
+
}
|
|
7510
|
+
position += entrySize;
|
|
7511
|
+
count++;
|
|
7512
|
+
}
|
|
7513
|
+
return count;
|
|
7514
|
+
}
|
|
7515
|
+
|
|
7189
7516
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
7190
7517
|
const {
|
|
7191
7518
|
fileEntries,
|
|
@@ -7361,6 +7688,7 @@
|
|
|
7361
7688
|
localExtraFieldZip64Length,
|
|
7362
7689
|
rawExtraFieldExtendedTimestamp,
|
|
7363
7690
|
extraFieldExtendedTimestampFlag,
|
|
7691
|
+
extraFieldExtendedTimestampTime,
|
|
7364
7692
|
rawExtraFieldNTFS,
|
|
7365
7693
|
rawExtraFieldUnix,
|
|
7366
7694
|
rawExtraFieldAES,
|
|
@@ -7373,6 +7701,7 @@
|
|
|
7373
7701
|
password,
|
|
7374
7702
|
rawPassword,
|
|
7375
7703
|
level,
|
|
7704
|
+
useUnicodeFileNames,
|
|
7376
7705
|
zip64,
|
|
7377
7706
|
zip64Enabled,
|
|
7378
7707
|
zip64UncompressedSize,
|
|
@@ -7407,7 +7736,8 @@
|
|
|
7407
7736
|
msdosAttributesRaw,
|
|
7408
7737
|
msdosAttributes,
|
|
7409
7738
|
useCompressionStream,
|
|
7410
|
-
|
|
7739
|
+
passThroughCompression,
|
|
7740
|
+
passThroughEncryption,
|
|
7411
7741
|
format,
|
|
7412
7742
|
codecURI
|
|
7413
7743
|
} = options;
|
|
@@ -7418,9 +7748,9 @@
|
|
|
7418
7748
|
zip64Enabled,
|
|
7419
7749
|
directory: Boolean(directory),
|
|
7420
7750
|
executable: Boolean(executable),
|
|
7421
|
-
filenameUTF8:
|
|
7751
|
+
filenameUTF8: Boolean(useUnicodeFileNames),
|
|
7422
7752
|
rawFilename,
|
|
7423
|
-
commentUTF8:
|
|
7753
|
+
commentUTF8: Boolean(useUnicodeFileNames),
|
|
7424
7754
|
rawComment,
|
|
7425
7755
|
rawExtraFieldZip64,
|
|
7426
7756
|
localExtraFieldZip64Length,
|
|
@@ -7451,7 +7781,7 @@
|
|
|
7451
7781
|
uncompressedSize
|
|
7452
7782
|
} = options;
|
|
7453
7783
|
let compressedSize = 0;
|
|
7454
|
-
if (!
|
|
7784
|
+
if (!passThroughCompression) {
|
|
7455
7785
|
uncompressedSize = 0;
|
|
7456
7786
|
}
|
|
7457
7787
|
const { writable } = writer;
|
|
@@ -7468,9 +7798,9 @@
|
|
|
7468
7798
|
encryptionStrength,
|
|
7469
7799
|
zipCrypto: encrypted && zipCrypto,
|
|
7470
7800
|
passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & MAX_8_BITS,
|
|
7471
|
-
computeCrc32: !
|
|
7472
|
-
compressed: compressed && !
|
|
7473
|
-
encrypted: encrypted && !
|
|
7801
|
+
computeCrc32: !passThroughCompression,
|
|
7802
|
+
compressed: compressed && !passThroughCompression,
|
|
7803
|
+
encrypted: encrypted && !passThroughEncryption,
|
|
7474
7804
|
useWebWorkers,
|
|
7475
7805
|
useCompressionStream,
|
|
7476
7806
|
transferStreams,
|
|
@@ -7485,7 +7815,7 @@
|
|
|
7485
7815
|
const result = await runWorker({ readable, writable }, workerOptions);
|
|
7486
7816
|
compressedSize = result.outputSize;
|
|
7487
7817
|
writer.size += compressedSize;
|
|
7488
|
-
if (!
|
|
7818
|
+
if (!passThroughCompression) {
|
|
7489
7819
|
uncompressedSize = result.inputSize;
|
|
7490
7820
|
if (!encrypted || zipCrypto) {
|
|
7491
7821
|
crc32 = result.crc32;
|
|
@@ -7528,8 +7858,9 @@
|
|
|
7528
7858
|
headerArray,
|
|
7529
7859
|
headerView,
|
|
7530
7860
|
signature: crc32,
|
|
7531
|
-
crc32: encrypted && !zipCrypto && !
|
|
7861
|
+
crc32: encrypted && !zipCrypto && !passThroughCompression ? UNDEFINED_VALUE : crc32,
|
|
7532
7862
|
extraFieldExtendedTimestampFlag,
|
|
7863
|
+
extraFieldExtendedTimestampTime,
|
|
7533
7864
|
zip64UncompressedSize,
|
|
7534
7865
|
zip64CompressedSize
|
|
7535
7866
|
});
|
|
@@ -7554,7 +7885,7 @@
|
|
|
7554
7885
|
encryptionStrength,
|
|
7555
7886
|
extendedTimestamp,
|
|
7556
7887
|
ntfsTimestamp,
|
|
7557
|
-
|
|
7888
|
+
passThroughCompression,
|
|
7558
7889
|
encrypted,
|
|
7559
7890
|
zip64UncompressedSize,
|
|
7560
7891
|
zip64CompressedSize,
|
|
@@ -7565,7 +7896,7 @@
|
|
|
7565
7896
|
let { version, compressionMethod } = options;
|
|
7566
7897
|
const compressed = !directory && isCompressed(compressionMethod, level);
|
|
7567
7898
|
let rawLocalExtraFieldZip64;
|
|
7568
|
-
const uncompressedFile =
|
|
7899
|
+
const uncompressedFile = passThroughCompression || !compressed;
|
|
7569
7900
|
const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || (uncompressedFile && !unknownSize)));
|
|
7570
7901
|
const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
|
|
7571
7902
|
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
@@ -7577,8 +7908,8 @@
|
|
|
7577
7908
|
if (zip64ExtraFieldComplete) {
|
|
7578
7909
|
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7579
7910
|
if (uncompressedFile) {
|
|
7580
|
-
const encryptionOverhead = encrypted
|
|
7581
|
-
extraFieldZip64.writeUint64(
|
|
7911
|
+
const encryptionOverhead = getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength);
|
|
7912
|
+
extraFieldZip64.writeUint64(passThroughCompression ? 0 : uncompressedSize + encryptionOverhead);
|
|
7582
7913
|
}
|
|
7583
7914
|
}
|
|
7584
7915
|
} else {
|
|
@@ -7597,6 +7928,7 @@
|
|
|
7597
7928
|
let rawExtraFieldNTFS;
|
|
7598
7929
|
let rawExtraFieldExtendedTimestamp;
|
|
7599
7930
|
let extraFieldExtendedTimestampFlag;
|
|
7931
|
+
let extraFieldExtendedTimestampTime;
|
|
7600
7932
|
if (extendedTimestamp) {
|
|
7601
7933
|
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
7602
7934
|
const lastModTimeUnixInRange = inUnixTimeRange(lastModTimeUnix);
|
|
@@ -7604,6 +7936,7 @@
|
|
|
7604
7936
|
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
7605
7937
|
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
7606
7938
|
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
7939
|
+
extraFieldExtendedTimestampTime = lastModTimeUnix;
|
|
7607
7940
|
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7608
7941
|
extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
|
|
7609
7942
|
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
@@ -7646,7 +7979,7 @@
|
|
|
7646
7979
|
let rawExtraFieldUnix;
|
|
7647
7980
|
try {
|
|
7648
7981
|
const { uid, gid, unixExtraFieldType } = options;
|
|
7649
|
-
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE
|
|
7982
|
+
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
7650
7983
|
const uidBytes = packUnixId(uid === UNDEFINED_VALUE ? 0 : uid);
|
|
7651
7984
|
const gidBytes = packUnixId(gid === UNDEFINED_VALUE ? 0 : gid);
|
|
7652
7985
|
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
@@ -7687,7 +8020,7 @@
|
|
|
7687
8020
|
}
|
|
7688
8021
|
if (encrypted && !zipCrypto) {
|
|
7689
8022
|
version = version > VERSION_AES ? version : VERSION_AES;
|
|
7690
|
-
if (
|
|
8023
|
+
if (passThroughCompression && crc32 !== UNDEFINED_VALUE) {
|
|
7691
8024
|
rawExtraFieldAES[EXTRAFIELD_OFFSET_AES_VENDOR_VERSION] = VENDOR_VERSION_AE_1;
|
|
7692
8025
|
}
|
|
7693
8026
|
setUint16(getDataView(rawExtraFieldAES), EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD, compressionMethod);
|
|
@@ -7749,12 +8082,14 @@
|
|
|
7749
8082
|
headerArray,
|
|
7750
8083
|
headerView,
|
|
7751
8084
|
lastModDate: storedLastModDate,
|
|
8085
|
+
lastModDateClamped: storedLastModDate === clampedLastModDate && dosLastModDate.getTime() != clampedLastModDate.getTime(),
|
|
7752
8086
|
rawLastModDate,
|
|
7753
8087
|
encrypted,
|
|
7754
8088
|
compressed,
|
|
7755
8089
|
version,
|
|
7756
8090
|
compressionMethod,
|
|
7757
8091
|
extraFieldExtendedTimestampFlag,
|
|
8092
|
+
extraFieldExtendedTimestampTime,
|
|
7758
8093
|
rawExtraFieldZip64: EMPTY_UINT8_ARRAY,
|
|
7759
8094
|
localExtraFieldZip64Length,
|
|
7760
8095
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -7857,7 +8192,7 @@
|
|
|
7857
8192
|
}, {
|
|
7858
8193
|
zip64,
|
|
7859
8194
|
zipCrypto,
|
|
7860
|
-
|
|
8195
|
+
passThroughCompression,
|
|
7861
8196
|
dataDescriptor
|
|
7862
8197
|
}) {
|
|
7863
8198
|
const {
|
|
@@ -7868,7 +8203,7 @@
|
|
|
7868
8203
|
dataDescriptorView,
|
|
7869
8204
|
dataDescriptorOffset
|
|
7870
8205
|
} = dataDescriptorInfo;
|
|
7871
|
-
if ((!encrypted || zipCrypto ||
|
|
8206
|
+
if ((!encrypted || zipCrypto || passThroughCompression) && crc32 !== UNDEFINED_VALUE) {
|
|
7872
8207
|
setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
|
|
7873
8208
|
if (dataDescriptor) {
|
|
7874
8209
|
setUint32(dataDescriptorView, dataDescriptorOffset, crc32);
|
|
@@ -7899,9 +8234,9 @@
|
|
|
7899
8234
|
uncompressedSize,
|
|
7900
8235
|
zip64UncompressedSize,
|
|
7901
8236
|
zip64CompressedSize
|
|
7902
|
-
}, localHeaderView, { dataDescriptor,
|
|
8237
|
+
}, localHeaderView, { dataDescriptor, passThroughCompression }) {
|
|
7903
8238
|
if (!dataDescriptor) {
|
|
7904
|
-
if (!encrypted || (
|
|
8239
|
+
if (!encrypted || (passThroughCompression && crc32 !== UNDEFINED_VALUE)) {
|
|
7905
8240
|
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, crc32);
|
|
7906
8241
|
}
|
|
7907
8242
|
if (!zip64CompressedSize) {
|
|
@@ -7938,9 +8273,8 @@
|
|
|
7938
8273
|
rawExtraFieldUnix,
|
|
7939
8274
|
rawExtraField,
|
|
7940
8275
|
rawCentralExtraField,
|
|
7941
|
-
extendedTimestamp,
|
|
7942
8276
|
extraFieldExtendedTimestampFlag,
|
|
7943
|
-
|
|
8277
|
+
extraFieldExtendedTimestampTime,
|
|
7944
8278
|
zip64Enabled,
|
|
7945
8279
|
uncompressedSize,
|
|
7946
8280
|
compressedSize
|
|
@@ -7983,16 +8317,15 @@
|
|
|
7983
8317
|
fileEntry.zip64Offset = zip64Offset;
|
|
7984
8318
|
fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
|
|
7985
8319
|
let rawExtraFieldTimestamp;
|
|
7986
|
-
|
|
7987
|
-
|
|
8320
|
+
if (extraFieldExtendedTimestampTime === UNDEFINED_VALUE) {
|
|
8321
|
+
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
8322
|
+
} else {
|
|
7988
8323
|
const extraFieldTimestamp = createRecordWriter(9);
|
|
7989
8324
|
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7990
8325
|
extraFieldTimestamp.writeUint16(5);
|
|
7991
8326
|
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7992
|
-
extraFieldTimestamp.writeUint32(
|
|
8327
|
+
extraFieldTimestamp.writeUint32(extraFieldExtendedTimestampTime);
|
|
7993
8328
|
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
7994
|
-
} else {
|
|
7995
|
-
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
7996
8329
|
}
|
|
7997
8330
|
fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
|
|
7998
8331
|
const extraFieldLength = getLength(
|
|
@@ -8492,6 +8825,11 @@
|
|
|
8492
8825
|
};
|
|
8493
8826
|
}
|
|
8494
8827
|
|
|
8828
|
+
function isPrintableASCIIText(rawText) {
|
|
8829
|
+
return rawText.every(characterCode =>
|
|
8830
|
+
characterCode >= MIN_PRINTABLE_ASCII_CHARACTER_CODE && characterCode <= MAX_PRINTABLE_ASCII_CHARACTER_CODE);
|
|
8831
|
+
}
|
|
8832
|
+
|
|
8495
8833
|
function getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted, compressionMethod) {
|
|
8496
8834
|
let bitFlag = 0;
|
|
8497
8835
|
if (useUnicodeFileNames) {
|
|
@@ -8653,7 +8991,7 @@
|
|
|
8653
8991
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
8654
8992
|
*/
|
|
8655
8993
|
|
|
8656
|
-
const VERSION = "2.
|
|
8994
|
+
const VERSION = "2.12.0";
|
|
8657
8995
|
|
|
8658
8996
|
/*
|
|
8659
8997
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9475,9 +9813,9 @@
|
|
|
9475
9813
|
DecompressionStreamFallback: DecompressionStreamZlib
|
|
9476
9814
|
});
|
|
9477
9815
|
|
|
9478
|
-
function terminateWorkersAndModule() {
|
|
9816
|
+
async function terminateWorkersAndModule() {
|
|
9817
|
+
await terminateWorkers();
|
|
9479
9818
|
modulePromise = null;
|
|
9480
|
-
terminateWorkers();
|
|
9481
9819
|
resetWasmModule();
|
|
9482
9820
|
}
|
|
9483
9821
|
|
|
@@ -9544,7 +9882,10 @@
|
|
|
9544
9882
|
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
9545
9883
|
const ERR_DUPLICATE_IMPORTED_ENTRY = "Duplicate entry filename in the imported zip file";
|
|
9546
9884
|
const ERR_INVALID_DUPLICATES = "Invalid duplicates option (must be \"throw\", \"keep-first\" or \"keep-last\")";
|
|
9547
|
-
const ERR_ANCESTOR_ENTRY = "Entry is
|
|
9885
|
+
const ERR_ANCESTOR_ENTRY = "Entry is an ancestor of target entry";
|
|
9886
|
+
const ERR_ROOT_DIRECTORY_NOT_MOVABLE = "Root directory cannot be moved";
|
|
9887
|
+
const ERR_TARGET_NOT_DIRECTORY = "Target entry is not a directory";
|
|
9888
|
+
const ERR_PARENT_NOT_DIRECTORY = "Parent entry is not a directory";
|
|
9548
9889
|
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
9549
9890
|
const DUPLICATES_THROW = "throw";
|
|
9550
9891
|
const DUPLICATES_KEEP_FIRST = "keep-first";
|
|
@@ -9552,22 +9893,8 @@
|
|
|
9552
9893
|
const DUPLICATES_VALUES = new Set([DUPLICATES_THROW, DUPLICATES_KEEP_FIRST, DUPLICATES_KEEP_LAST]);
|
|
9553
9894
|
const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
|
|
9554
9895
|
const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
|
|
9555
|
-
const
|
|
9896
|
+
const ERR_UNSUPPORTED_PASS_THROUGH_VALUE = "The 'compressed' passThrough option is only supported by Entry#getData() and ZipWriter#add()";
|
|
9556
9897
|
const ERR_ABORT_EXPORT = "zipjs-abort-export";
|
|
9557
|
-
const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
|
|
9558
|
-
const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
|
|
9559
|
-
EXTRAFIELD_TYPE_ZIP64,
|
|
9560
|
-
EXTRAFIELD_TYPE_AES,
|
|
9561
|
-
EXTRAFIELD_TYPE_NTFS,
|
|
9562
|
-
EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
|
|
9563
|
-
EXTRAFIELD_TYPE_UNICODE_PATH,
|
|
9564
|
-
EXTRAFIELD_TYPE_UNICODE_COMMENT,
|
|
9565
|
-
EXTRAFIELD_TYPE_USDZ,
|
|
9566
|
-
EXTRAFIELD_TYPE_INFOZIP,
|
|
9567
|
-
EXTRAFIELD_TYPE_UNIX,
|
|
9568
|
-
EXTRAFIELD_TYPE_UNIX_TYPE1,
|
|
9569
|
-
EXTRAFIELD_TYPE_PKWARE_UNIX
|
|
9570
|
-
]);
|
|
9571
9898
|
|
|
9572
9899
|
class ZipEntry {
|
|
9573
9900
|
|
|
@@ -9939,6 +10266,7 @@
|
|
|
9939
10266
|
await initStream(reader);
|
|
9940
10267
|
zipReader = new ZipReader(reader, options);
|
|
9941
10268
|
}
|
|
10269
|
+
checkPassThroughValue(options.passThrough);
|
|
9942
10270
|
const duplicates = checkDuplicatesOption(options.duplicates);
|
|
9943
10271
|
const importedEntries = [];
|
|
9944
10272
|
const entries = await zipReader.getEntries(options);
|
|
@@ -10029,18 +10357,25 @@
|
|
|
10029
10357
|
|
|
10030
10358
|
async exportZip(writer, options = {}) {
|
|
10031
10359
|
const zipEntry = this;
|
|
10360
|
+
const zipWriterProvided = Boolean(writer) && typeof writer.add == FUNCTION_TYPE;
|
|
10032
10361
|
options = Object.assign({}, options);
|
|
10033
|
-
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
10362
|
+
if (!zipWriterProvided && options.bufferedWrite === UNDEFINED_VALUE) {
|
|
10034
10363
|
options.bufferedWrite = true;
|
|
10035
10364
|
}
|
|
10036
|
-
const [readers] = await Promise.all([
|
|
10037
|
-
|
|
10365
|
+
const [readers] = await Promise.all([
|
|
10366
|
+
initReaders(zipEntry, checkReaderOptions(options.readerOptions)),
|
|
10367
|
+
zipWriterProvided ? UNDEFINED_VALUE : initStream(writer)
|
|
10368
|
+
]);
|
|
10369
|
+
const zipWriter = zipWriterProvided ? writer : new ZipWriter(writer, options);
|
|
10038
10370
|
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
|
|
10371
|
+
if (zipWriterProvided) {
|
|
10372
|
+
return zipWriter;
|
|
10373
|
+
}
|
|
10039
10374
|
await zipWriter.close(options.globalComment);
|
|
10040
10375
|
return writer.getData ? writer.getData() : writer.writable;
|
|
10041
10376
|
}
|
|
10042
10377
|
|
|
10043
|
-
getExportedSize(options = {}) {
|
|
10378
|
+
async getExportedSize(options = {}) {
|
|
10044
10379
|
const zipEntry = this;
|
|
10045
10380
|
options = Object.assign({}, options);
|
|
10046
10381
|
checkReaderOptions(options.readerOptions);
|
|
@@ -10055,7 +10390,7 @@
|
|
|
10055
10390
|
const writeOrderGuaranteed = !options.bufferedWrite ||
|
|
10056
10391
|
(entries.every(entry => entry.options.keepOrder !== false) &&
|
|
10057
10392
|
children.every(child => isImplicitDirectory(child) || !child.children.length));
|
|
10058
|
-
return getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
|
|
10393
|
+
return await getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
|
|
10059
10394
|
}
|
|
10060
10395
|
|
|
10061
10396
|
getChildByName(name) {
|
|
@@ -10116,7 +10451,7 @@
|
|
|
10116
10451
|
|
|
10117
10452
|
move(entry, destination) {
|
|
10118
10453
|
if (entry == this.root) {
|
|
10119
|
-
throw new Error(
|
|
10454
|
+
throw new Error(ERR_ROOT_DIRECTORY_NOT_MOVABLE);
|
|
10120
10455
|
} else {
|
|
10121
10456
|
if (destination.directory) {
|
|
10122
10457
|
if (!destination.isDescendantOf(entry)) {
|
|
@@ -10137,7 +10472,7 @@
|
|
|
10137
10472
|
throw new Error(ERR_ANCESTOR_ENTRY);
|
|
10138
10473
|
}
|
|
10139
10474
|
} else {
|
|
10140
|
-
throw new Error(
|
|
10475
|
+
throw new Error(ERR_TARGET_NOT_DIRECTORY);
|
|
10141
10476
|
}
|
|
10142
10477
|
}
|
|
10143
10478
|
}
|
|
@@ -10450,70 +10785,11 @@
|
|
|
10450
10785
|
let zipEntryMetadata = {};
|
|
10451
10786
|
let passThroughOptions = {};
|
|
10452
10787
|
if (child.data instanceof Entry) {
|
|
10453
|
-
const
|
|
10454
|
-
|
|
10455
|
-
|
|
10456
|
-
|
|
10457
|
-
|
|
10458
|
-
rawLastModDate,
|
|
10459
|
-
creationDate,
|
|
10460
|
-
lastAccessDate,
|
|
10461
|
-
uncompressedSize,
|
|
10462
|
-
encrypted,
|
|
10463
|
-
zipCrypto,
|
|
10464
|
-
crc32,
|
|
10465
|
-
compressionMethod,
|
|
10466
|
-
extraFieldAES,
|
|
10467
|
-
internalFileAttributes,
|
|
10468
|
-
extraField,
|
|
10469
|
-
bitFlag,
|
|
10470
|
-
uid,
|
|
10471
|
-
gid
|
|
10472
|
-
} = child.data;
|
|
10473
|
-
zipEntryMetadata = {
|
|
10474
|
-
externalFileAttributes,
|
|
10475
|
-
versionMadeBy,
|
|
10476
|
-
comment,
|
|
10477
|
-
lastModDate,
|
|
10478
|
-
creationDate,
|
|
10479
|
-
lastAccessDate,
|
|
10480
|
-
internalFileAttributes
|
|
10481
|
-
};
|
|
10482
|
-
const userExtraField = getUserExtraField(extraField);
|
|
10483
|
-
if (userExtraField) {
|
|
10484
|
-
zipEntryMetadata.extraField = userExtraField;
|
|
10485
|
-
}
|
|
10486
|
-
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
10487
|
-
Object.assign(zipEntryMetadata, {
|
|
10488
|
-
uid,
|
|
10489
|
-
gid,
|
|
10490
|
-
unixExtraFieldType: INFOZIP_EXTRA_FIELD_TYPE
|
|
10491
|
-
});
|
|
10492
|
-
}
|
|
10493
|
-
if (isPassThrough(child, options)) {
|
|
10494
|
-
let encryptionStrength;
|
|
10495
|
-
if (extraFieldAES) {
|
|
10496
|
-
encryptionStrength = extraFieldAES.strength;
|
|
10497
|
-
}
|
|
10498
|
-
passThroughOptions = {
|
|
10499
|
-
passThrough: true,
|
|
10500
|
-
encrypted,
|
|
10501
|
-
zipCrypto,
|
|
10502
|
-
crc32,
|
|
10503
|
-
uncompressedSize,
|
|
10504
|
-
encryptionStrength,
|
|
10505
|
-
compressionMethod
|
|
10506
|
-
};
|
|
10507
|
-
if (bitFlag) {
|
|
10508
|
-
passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
|
|
10509
|
-
}
|
|
10510
|
-
const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
|
|
10511
|
-
if (lastModDateOverride === UNDEFINED_VALUE) {
|
|
10512
|
-
passThroughOptions.rawLastModDate = rawLastModDate;
|
|
10513
|
-
} else if (zipCrypto && (!bitFlag || bitFlag.dataDescriptor) && lastModDateOverride instanceof Date &&
|
|
10514
|
-
getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
|
|
10515
|
-
throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
|
|
10516
|
-
}
|
|
10788
|
+
const passThrough = isPassThrough(child, options);
|
|
10789
|
+
const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
|
|
10790
|
+
({ entryOptions: zipEntryMetadata, passThroughOptions } = getSourceEntryOptions(child.data, passThrough, lastModDateOverride));
|
|
10791
|
+
if (passThrough) {
|
|
10792
|
+
passThroughOptions.passThrough = true;
|
|
10517
10793
|
}
|
|
10518
10794
|
}
|
|
10519
10795
|
const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
|
|
@@ -10523,16 +10799,6 @@
|
|
|
10523
10799
|
return { name, entryOptions };
|
|
10524
10800
|
}
|
|
10525
10801
|
|
|
10526
|
-
function getDosTimeHighByte(lastModDate) {
|
|
10527
|
-
let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
|
|
10528
|
-
if (dosLastModDate < MIN_DATE) {
|
|
10529
|
-
dosLastModDate = MIN_DATE;
|
|
10530
|
-
} else if (dosLastModDate > MAX_DATE) {
|
|
10531
|
-
dosLastModDate = MAX_DATE;
|
|
10532
|
-
}
|
|
10533
|
-
return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
|
|
10534
|
-
}
|
|
10535
|
-
|
|
10536
10802
|
function getDeterminedSize(child, passThrough) {
|
|
10537
10803
|
const { reader } = child;
|
|
10538
10804
|
if (reader && reader.size !== UNDEFINED_VALUE) {
|
|
@@ -10545,9 +10811,18 @@
|
|
|
10545
10811
|
if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
|
|
10546
10812
|
throw new Error(ERR_INVALID_READER_OPTIONS);
|
|
10547
10813
|
}
|
|
10814
|
+
if (readerOptions) {
|
|
10815
|
+
checkPassThroughValue(readerOptions.passThrough);
|
|
10816
|
+
}
|
|
10548
10817
|
return readerOptions;
|
|
10549
10818
|
}
|
|
10550
10819
|
|
|
10820
|
+
function checkPassThroughValue(passThrough) {
|
|
10821
|
+
if (checkPassThroughOption(passThrough) === PASS_THROUGH_COMPRESSED) {
|
|
10822
|
+
throw new Error(ERR_UNSUPPORTED_PASS_THROUGH_VALUE);
|
|
10823
|
+
}
|
|
10824
|
+
}
|
|
10825
|
+
|
|
10551
10826
|
function replaceContent(zipEntry, params) {
|
|
10552
10827
|
const { uncompressedSize } = params;
|
|
10553
10828
|
Object.assign(zipEntry, params, {
|
|
@@ -10576,20 +10851,6 @@
|
|
|
10576
10851
|
return child.directory && child.data === null;
|
|
10577
10852
|
}
|
|
10578
10853
|
|
|
10579
|
-
function getUserExtraField(extraField) {
|
|
10580
|
-
if (extraField) {
|
|
10581
|
-
const userExtraField = new Map();
|
|
10582
|
-
extraField.forEach((field, type) => {
|
|
10583
|
-
if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
|
|
10584
|
-
userExtraField.set(type, field.data);
|
|
10585
|
-
}
|
|
10586
|
-
});
|
|
10587
|
-
if (userExtraField.size) {
|
|
10588
|
-
return userExtraField;
|
|
10589
|
-
}
|
|
10590
|
-
}
|
|
10591
|
-
}
|
|
10592
|
-
|
|
10593
10854
|
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
10594
10855
|
const { onstart, onprogress, onend, onentryprogress } = options;
|
|
10595
10856
|
const selectedEntry = entry;
|
|
@@ -10692,6 +10953,7 @@
|
|
|
10692
10953
|
|
|
10693
10954
|
async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
10694
10955
|
const { onstart, onprogress, onend } = options;
|
|
10956
|
+
checkPassThroughValue(options.passThrough);
|
|
10695
10957
|
const readerOptions = checkReaderOptions(options.readerOptions);
|
|
10696
10958
|
const abortController = new AbortController();
|
|
10697
10959
|
const { signal } = abortController;
|
|
@@ -10767,7 +11029,7 @@
|
|
|
10767
11029
|
if (exportAborted || isExportAborted(signal.reason)) {
|
|
10768
11030
|
return;
|
|
10769
11031
|
}
|
|
10770
|
-
|
|
11032
|
+
throwIfAborted(signal);
|
|
10771
11033
|
}
|
|
10772
11034
|
try {
|
|
10773
11035
|
if (child.directory) {
|
|
@@ -10900,7 +11162,7 @@
|
|
|
10900
11162
|
}
|
|
10901
11163
|
return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent);
|
|
10902
11164
|
} else {
|
|
10903
|
-
throw new Error(
|
|
11165
|
+
throw new Error(ERR_PARENT_NOT_DIRECTORY);
|
|
10904
11166
|
}
|
|
10905
11167
|
}
|
|
10906
11168
|
|
|
@@ -11042,6 +11304,7 @@
|
|
|
11042
11304
|
exports.Data64URIWriter = Data64URIWriter;
|
|
11043
11305
|
exports.ERR_ABORTED = ERR_ABORTED;
|
|
11044
11306
|
exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
|
|
11307
|
+
exports.ERR_ANCESTOR_ENTRY = ERR_ANCESTOR_ENTRY;
|
|
11045
11308
|
exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
|
|
11046
11309
|
exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
11047
11310
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
@@ -11055,7 +11318,9 @@
|
|
|
11055
11318
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
11056
11319
|
exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
|
|
11057
11320
|
exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
|
|
11321
|
+
exports.ERR_HTTP_STATUS = ERR_HTTP_STATUS;
|
|
11058
11322
|
exports.ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_AUTHENTICATION_CODE;
|
|
11323
|
+
exports.ERR_INVALID_BASE_URI = ERR_INVALID_BASE_URI;
|
|
11059
11324
|
exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
|
|
11060
11325
|
exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
|
|
11061
11326
|
exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
@@ -11065,6 +11330,7 @@
|
|
|
11065
11330
|
exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
|
|
11066
11331
|
exports.ERR_INVALID_DUPLICATES = ERR_INVALID_DUPLICATES;
|
|
11067
11332
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
11333
|
+
exports.ERR_INVALID_ENTRY = ERR_INVALID_ENTRY;
|
|
11068
11334
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
11069
11335
|
exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
|
|
11070
11336
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
@@ -11083,6 +11349,7 @@
|
|
|
11083
11349
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
11084
11350
|
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
11085
11351
|
exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
|
|
11352
|
+
exports.ERR_INVALID_PASS_THROUGH_VALUE = ERR_INVALID_PASS_THROUGH_VALUE;
|
|
11086
11353
|
exports.ERR_INVALID_READER = ERR_INVALID_READER;
|
|
11087
11354
|
exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
|
|
11088
11355
|
exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
|
|
@@ -11093,14 +11360,19 @@
|
|
|
11093
11360
|
exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
|
|
11094
11361
|
exports.ERR_INVALID_UNIX_ID_SIZE = ERR_INVALID_UNIX_ID_SIZE;
|
|
11095
11362
|
exports.ERR_INVALID_UNIX_MODE = ERR_INVALID_UNIX_MODE;
|
|
11363
|
+
exports.ERR_INVALID_URI = ERR_INVALID_URI;
|
|
11096
11364
|
exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
|
|
11097
11365
|
exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
|
|
11098
11366
|
exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
|
|
11099
11367
|
exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
11368
|
+
exports.ERR_PARENT_NOT_DIRECTORY = ERR_PARENT_NOT_DIRECTORY;
|
|
11100
11369
|
exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
|
|
11101
11370
|
exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
11371
|
+
exports.ERR_ROOT_DIRECTORY_NOT_MOVABLE = ERR_ROOT_DIRECTORY_NOT_MOVABLE;
|
|
11102
11372
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
11373
|
+
exports.ERR_TARGET_NOT_DIRECTORY = ERR_TARGET_NOT_DIRECTORY;
|
|
11103
11374
|
exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
|
|
11375
|
+
exports.ERR_UNDEFINED_CRC32 = ERR_UNDEFINED_CRC32;
|
|
11104
11376
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
11105
11377
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
11106
11378
|
exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
|
|
@@ -11112,10 +11384,12 @@
|
|
|
11112
11384
|
exports.ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH;
|
|
11113
11385
|
exports.ERR_UNSUPPORTED_ENCRYPTION_USDZ = ERR_UNSUPPORTED_ENCRYPTION_USDZ;
|
|
11114
11386
|
exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
|
|
11387
|
+
exports.ERR_UNSUPPORTED_PASS_THROUGH_VALUE = ERR_UNSUPPORTED_PASS_THROUGH_VALUE;
|
|
11115
11388
|
exports.ERR_UNSUPPORTED_SPLIT_USDZ = ERR_UNSUPPORTED_SPLIT_USDZ;
|
|
11116
11389
|
exports.ERR_UNSUPPORTED_UINT64 = ERR_UNSUPPORTED_UINT64;
|
|
11117
11390
|
exports.ERR_WORKER_STARTUP_TIMEOUT = ERR_WORKER_STARTUP_TIMEOUT;
|
|
11118
11391
|
exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
|
|
11392
|
+
exports.ERR_WRITER_SIZE_NOT_WRITABLE = ERR_WRITER_SIZE_NOT_WRITABLE;
|
|
11119
11393
|
exports.ERR_ZIP_CRYPTO_LAST_MOD_DATE = ERR_ZIP_CRYPTO_LAST_MOD_DATE;
|
|
11120
11394
|
exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
|
|
11121
11395
|
exports.HttpRangeReader = HttpRangeReader;
|
|
@@ -11129,13 +11403,17 @@
|
|
|
11129
11403
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
11130
11404
|
exports.VERSION = VERSION;
|
|
11131
11405
|
exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
|
|
11406
|
+
exports.WARNING_CLAMPED_LAST_MODIFICATION_DATE = WARNING_CLAMPED_LAST_MODIFICATION_DATE;
|
|
11132
11407
|
exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
|
|
11408
|
+
exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
|
|
11133
11409
|
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
11134
11410
|
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
11135
11411
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
11136
11412
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
11137
11413
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
11414
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
|
|
11138
11415
|
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
11416
|
+
exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
|
|
11139
11417
|
exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
|
|
11140
11418
|
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|
|
11141
11419
|
exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
|