@zip.js/zip.js 2.11.4 → 2.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deno.json +1 -1
- package/dist/zip-core-external.js +549 -139
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +559 -136
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +615 -260
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +628 -257
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +615 -260
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +630 -259
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +631 -260
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +561 -138
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +561 -138
- package/dist/zip-native.min.js +1 -1
- package/dist/zip-web-worker-native.js +1 -1
- package/dist/zip-web-worker.js +1 -1
- package/dist/zip.js +562 -139
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +630 -259
- package/index-native.min.js +1 -1
- package/index.cjs +631 -260
- package/index.d.cts +474 -59
- package/index.d.ts +474 -59
- package/index.min.js +1 -1
- package/lib/core/codec-worker-web.js +72 -22
- package/lib/core/codec-worker.js +18 -5
- package/lib/core/configuration.js +20 -5
- package/lib/core/constants.js +2 -0
- package/lib/core/io.js +13 -5
- package/lib/core/options.js +16 -0
- package/lib/core/streams/codec-stream.js +6 -0
- package/lib/core/util/error.js +35 -0
- package/lib/core/util/warnings.js +42 -0
- package/lib/core/version.js +1 -1
- package/lib/core/web-worker-base.js +46 -9
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-entry.js +49 -1
- package/lib/core/zip-fs.js +45 -133
- package/lib/core/zip-reader.js +115 -52
- package/lib/core/zip-writer.js +244 -57
- package/lib/zip-core-base.js +9 -3
- package/lib/zip-core-reader.js +2 -0
- package/lib/zip-core-writer.js +6 -1
- package/lib/zip-module-wasm-base.js +2 -2
- package/package.json +5 -3
- package/worker-message-property-names.js +1 -1
package/index.cjs
CHANGED
|
@@ -128,6 +128,7 @@ const NUMBER_TYPE = "number";
|
|
|
128
128
|
const BOOLEAN_TYPE = "boolean";
|
|
129
129
|
|
|
130
130
|
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
131
|
+
const SYMBOL_ASYNC_DISPOSE = Symbol.asyncDispose || Symbol();
|
|
131
132
|
|
|
132
133
|
/*
|
|
133
134
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -172,6 +173,7 @@ const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
|
172
173
|
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
173
174
|
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
174
175
|
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
176
|
+
const OPTION_CHECK_LOCAL_FILENAME = "checkLocalFilename";
|
|
175
177
|
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
176
178
|
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
177
179
|
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
@@ -202,15 +204,18 @@ const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
|
202
204
|
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
203
205
|
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
204
206
|
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
207
|
+
const OPTION_ENTRY = "entry";
|
|
205
208
|
const TEXT_TYPE_FILENAME = "filename";
|
|
206
209
|
const TEXT_TYPE_COMMENT = "comment";
|
|
207
210
|
const STRICTNESS_STRICT = "strict";
|
|
208
211
|
const STRICTNESS_BALANCED = "balanced";
|
|
209
212
|
const STRICTNESS_TOLERANT = "tolerant";
|
|
213
|
+
const PASS_THROUGH_COMPRESSED = "compressed";
|
|
210
214
|
|
|
211
215
|
const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
|
|
212
216
|
const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
|
|
213
217
|
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
218
|
+
const ERR_INVALID_PASS_THROUGH_VALUE = "Invalid passThrough option (must be a boolean or 'compressed')";
|
|
214
219
|
const ERR_ABORTED = "The operation was aborted";
|
|
215
220
|
const ABORT_ERROR_NAME = "AbortError";
|
|
216
221
|
|
|
@@ -240,6 +245,13 @@ function checkPasswordOption(password, rawPassword) {
|
|
|
240
245
|
}
|
|
241
246
|
}
|
|
242
247
|
|
|
248
|
+
function checkPassThroughOption(passThrough) {
|
|
249
|
+
if (passThrough !== UNDEFINED_VALUE && typeof passThrough != BOOLEAN_TYPE && passThrough !== PASS_THROUGH_COMPRESSED) {
|
|
250
|
+
throw new Error(ERR_INVALID_PASS_THROUGH_VALUE);
|
|
251
|
+
}
|
|
252
|
+
return passThrough;
|
|
253
|
+
}
|
|
254
|
+
|
|
243
255
|
function checkInteger(value, maxValue, errorMessage) {
|
|
244
256
|
if (!Number.isInteger(value) || value < 0 || value > maxValue) {
|
|
245
257
|
throw new Error(errorMessage);
|
|
@@ -289,6 +301,8 @@ const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
|
|
|
289
301
|
const MINIMUM_CHUNK_SIZE = 64;
|
|
290
302
|
const MINIMUM_PROPERTY_VALUE = 1;
|
|
291
303
|
const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
|
|
304
|
+
const ERR_INVALID_BASE_URI = "Invalid baseURI (must be a string)";
|
|
305
|
+
const ERR_INVALID_URI = "Invalid URI (must be a string or a function returning a string)";
|
|
292
306
|
let maxWorkers = 2;
|
|
293
307
|
try {
|
|
294
308
|
if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
|
|
@@ -313,9 +327,9 @@ const DEFAULT_CONFIGURATION = {
|
|
|
313
327
|
};
|
|
314
328
|
|
|
315
329
|
const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
|
|
330
|
+
const PROPERTY_NAME_BASE_URI = "baseURI";
|
|
316
331
|
|
|
317
|
-
const
|
|
318
|
-
"baseURI",
|
|
332
|
+
const URI_PROPERTY_NAMES = [
|
|
319
333
|
"wasmURI",
|
|
320
334
|
"workerURI"
|
|
321
335
|
];
|
|
@@ -339,7 +353,8 @@ const FUNCTION_PROPERTY_NAMES = [
|
|
|
339
353
|
"DecompressionStreamFallback"
|
|
340
354
|
];
|
|
341
355
|
const CONFIGURABLE_PROPERTY_NAMES = [
|
|
342
|
-
|
|
356
|
+
PROPERTY_NAME_BASE_URI,
|
|
357
|
+
...URI_PROPERTY_NAMES,
|
|
343
358
|
...BOOLEAN_PROPERTY_NAMES,
|
|
344
359
|
...NUMBER_PROPERTY_NAMES,
|
|
345
360
|
...FUNCTION_PROPERTY_NAMES
|
|
@@ -383,6 +398,14 @@ function checkPropertyValue(propertyName, propertyValue) {
|
|
|
383
398
|
}
|
|
384
399
|
} else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
|
|
385
400
|
checkFunctionOption(propertyValue);
|
|
401
|
+
} else if (propertyName == PROPERTY_NAME_BASE_URI) {
|
|
402
|
+
if (propertyValue && typeof propertyValue != STRING_TYPE) {
|
|
403
|
+
throw new Error(ERR_INVALID_BASE_URI);
|
|
404
|
+
}
|
|
405
|
+
} else if (URI_PROPERTY_NAMES.includes(propertyName)) {
|
|
406
|
+
if (propertyValue && typeof propertyValue != STRING_TYPE && typeof propertyValue != FUNCTION_TYPE) {
|
|
407
|
+
throw new Error(ERR_INVALID_URI);
|
|
408
|
+
}
|
|
386
409
|
}
|
|
387
410
|
return propertyValue;
|
|
388
411
|
}
|
|
@@ -416,7 +439,7 @@ function resetConfiguration() {
|
|
|
416
439
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
417
440
|
}
|
|
418
441
|
|
|
419
|
-
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)}});
|
|
442
|
+
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 r='!function(t){"function"==typeof define&&define.amd?define(t):t()}(function(){"use strict";const{Array:t,Object:n,Number:e,Math:r,Error:s,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 r=0;if(e>=8&&t.buffer){const s=new u(t.buffer,t.byteOffset,e),o=e-8;for(;r<=o;r+=8){const t=n^s.getInt32(r,!0),e=s.getInt32(r+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(;r<e;r++)n=n>>>8^I[255&(n^t[r])];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 V(t,n){const e=new o(t.length+n.length);return e.set(t),e.set(n,t.length),e}function W(t){return new u(t.buffer,t.byteOffset,t.byteLength)}const _={concat(t,n){if(0===t.length||0===n.length)return t.concat(n);const e=t[t.length-1],r=_.l(e);return 32===r?t.concat(n):_.h(n,r,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)+_.l(e)},m(t,n){if(32*t.length<n)return t;const e=(t=t.slice(0,r.ceil(n/32))).length;return n&=31,e>0&&n&&(t[e-1]=_.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=>r.round(t/1099511627776)||32,h(t,n,e,r){for(void 0===r&&(r=[]);n>=32;n-=32)r.push(e),e=0;if(0===n)return r.concat(t);for(let s=0;s<t.length;s++)r.push(e|t[s]>>>n),e=t[s]<<32-n;const s=t.length?t[t.length-1]:0,o=_.l(s);return r.push(_.S(n+o&31,n+o>32?e:r.pop(),1)),r}},T={bytes:{v(t){const n=_.bitLength(t)/8,e=new o(n);let r;for(let s=0;s<n;s++)3&s||(r=t[s/4]),e[s]=r>>>24,r<<=8;return e},C(t){const n=[];let e,r=0;for(e=0;e<t.length;e++)r=r<<8|t[e],3&~e||(n.push(r),r=0);return 3&e&&n.push(_.S(8*(3&e),r)),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=T.D.C(t));const e=n.P=_.concat(n.P,t),r=n.B,o=n.B=r+_.bitLength(t);if(o>9007199254740991)throw new s("Cannot hash more than 2^53 - 1 bits");const c=new i(e);let a=0;for(let t=n.blockSize+r-(n.blockSize+r&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=_.concat(n,[_.S(1,1)]);for(let t=n.length+2;15&t;t++)n.push(0);for(n.push(r.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,r){return t<=19?n&e|~n&r:t<=39?n^e^r:t<=59?n&e|n&r|e&r:t<=79?n^e^r:void 0}V(t,n){return n<<t|n>>>32-t}F(n){const e=this,s=e.M,o=t(80);for(let t=0;t<16;t++)o[t]=n[t];let c=s[0],i=s[1],a=s[2],f=s[3],u=s[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=e.V(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const n=e.V(5,c)+e.U(t,i,a,f)+u+o[t]+e.A[r.floor(t/20)]|0;u=f,f=a,a=e.V(30,i),i=c,c=n}s[0]=s[0]+c|0,s[1]=s[1]+i|0,s[2]=s[2]+a|0,s[3]=s[3]+f|0,s[4]=s[4]+u|0}},j={importKey:t=>new j.W(T.bytes.C(t)),_(t,n,e,r){if(e=e||1e4,r<0||e<0)throw new s("invalid params to pbkdf2");const o=1+(r>>5)<<2;let c,i,a,f,l;const w=new ArrayBuffer(o),h=new u(w);let p=0;const d=_;for(n=T.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,r/8)},W:class{constructor(t){const n=this,e=n.T=K,r=[[],[]];n.K=[new e,new e];const s=n.K[0].blockSize/32;t.length>s&&(t=(new e).update(t).R());for(let n=0;n<s;n++)r[0][n]=909522486^t[n],r[1][n]=1549556828^t[n];n.K[0].update(r[0]),n.K[1].update(r[1]),n.j=new e(n.K[0])}reset(){const t=this;t.j=new t.T(t.K[0]),t.L=!1}update(t){this.L=!0,this.j.update(t)}digest(){const t=this,n=t.j.R(),e=new t.T(t.K[1]).update(n).R();return t.reset(),e}encrypt(t){if(this.L)throw new s("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},E=typeof h!=b&&typeof h.getRandomValues==k,L="Invalid password",O="zipjs-abort-check-password";function H(t){if(E)return h.getRandomValues(t);throw new s("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,rt=T.bytes,st=class{constructor(t){const n=this;n.O=[[[],[],[],[],[]],[[],[],[],[],[]]],n.O[0][0][0]||n.H();const e=n.O[0][4],r=n.O[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new s("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:r[0][e[n>>>24]]^r[1][e[n>>16&255]]^r[2][e[n>>8&255]]^r[3][e[255&n]]}}encrypt(t){return this.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.O[0],n=this.O[1],e=t[4],r=n[4],s=[],o=[];let c,i,a,f;for(let t=0;t<256;t++)o[(s[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,r[o]=u,f=s[a=s[i=s[u]]];let l=16843009*f^65537*a^257*i^16843008*u,w=257*s[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 s("invalid aes block size");const e=this.A[n],r=e.length/4-2,o=[0,0,0,0],c=this.O[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<r;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,r=255&t;255===n?(n=0,255===e?(e=0,255===r?r=0:++r):++e):++n,t=0,t+=n<<16,t+=e<<8,t+=r}return t}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,n,e){let r;if(!(r=n.length))return[];const s=_.bitLength(n);for(let s=0;s<r;s+=4){this.$(e);const r=t.encrypt(e);n[s]^=r[0],n[s+1]^=r[1],n[s+2]^=r[2],n[s+3]^=r[3]}return _.m(n,s)}},ct=j.W;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:r,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,r){const o=await ht(t,n,e,dt(r,0,X[n])),c=dt(r,X[n]);if(o[0]!=c[0]||o[1]!=c[1])throw new s(L)}(e,i,c,dt(t,0,X[i]+2)),t=dt(t,X[i]+2),r?n.error(new s(O)):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:r,ready:o}=this;if(e&&n){await o;const i=dt(r,0,r.length-Z),a=dt(r,r.length-Z);let f=z;if(i.length){const t=mt(rt,i);e.update(t);const r=n.update(t);f=yt(rt,r)}const u=dt(yt(rt,e.digest()),0,Z);let l=r.length<Z?1:0;for(let t=0;t<Z;t++)l|=u[t]^a[t];if(l&&c)throw new s("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:r,strength:s,nt:c,ready:i}=e;let a=z;r?(a=await async function(t,n,e){const r=H(new o(X[n]));return V(r,await ht(t,n,e,r))}(e,s,r),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:r,ready:s}=this;if(e&&n){await s;let o=z;if(r.length){const t=n.update(mt(rt,r));e.update(t),o=yt(rt,t)}const c=yt(rt,e.digest()).slice(0,Z);t.enqueue(V(o,c))}}})}}function lt(t,e,r,s){n.assign(t,{ready:new l(n=>t.nt=n),password:pt(e,r),strength:s-1,ot:z})}function wt(t,n,e,r,s,c){const{et:i,st:a,ot:f}=t;f.length&&(n=V(f,n));const u=n.length-s;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,r+(u-u%N)),l=0;l<=u-N;l+=N){const t=mt(rt,dt(n,l,l+N));c&&a.update(t);const s=i.update(t);c||a.update(s),e.set(yt(rt,s),l+r)}return t.ot=dt(n,l),e}async function ht(e,r,s,c){e.password=null;const i=await async function(t,n,e,r,s){if(!it)return j.importKey(n);try{return await nt.importKey("raw",n,e,!1,s)}catch{return it=!1,j.importKey(n)}}(0,s,G,0,Q),a=await async function(t,n,e){if(!at)return j._(n,t.salt,J.iterations,e);try{return await nt.deriveBits(t,n,e)}catch{return at=!1,j._(n,t.salt,J.iterations,e)}}(n.assign({salt:c},J),i,8*(2*Y[r]+2)),f=new o(a),u=mt(rt,dt(f,0,Y[r])),l=mt(rt,dt(f,Y[r],2*Y[r])),w=dt(f,2*Y[r]);return n.assign(e,{keys:{key:u,ct:l,passwordVerification:w},et:new ot(new st(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:r}){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 s(L);t=t.subarray(12)}r?n.error(new s(O)):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 r,s;if(e.password||e.rawPassword){e.password=e.rawPassword=null;const n=H(new o(12));n[11]=e.passwordVerification,r=new o(t.length+n.length),r.set(kt(e,n),0),s=12}else r=new o(t.length),s=0;r.set(kt(e,t),s),n.enqueue(r)}})}}function vt(t,e,r,s){n.assign(t,{password:e,rawPassword:r,passwordVerification:s}),function(t,e,r){const s=[305419896,591751049,878082192];if(n.assign(t,{keys:s,it:new R(s[0]),ft:new R(s[2])}),r)for(let n=0;n<r.length;n++)zt(t,r[n]);else for(let n=0;n<e.length;n++)zt(t,e.charCodeAt(n))}(t,e,r)}function bt(t,n){const e=new o(n.length);for(let r=0;r<n.length;r++)e[r]=Ct(t)^n[r],zt(t,e[r]);return e}function kt(t,n){const e=new o(n.length);for(let r=0;r<n.length;r++)e[r]=Ct(t)^n[r],zt(t,n[r]);return e}function zt(t,n){let[,e]=t.keys;t.it.append([n]);const s=~t.it.get();e=At(r.imul(At(e+It(s)),134775813)+1),t.ft.append([e>>>24]);const o=~t.ft.get();t.keys=[s,e,o]}function Ct(t){const n=2|t.keys[2];return It(r.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:r}=await n.read();r?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:r}){super({});const{compressed:s,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&&s&&!l&&!v&&(!o||i)&&Boolean(c&&r);if(o&&!i||!a||b||(y=new U,g=Et(g,y)),s)if(v)g=Lt(g,Kt(v.CompressionStream,w,{level:f,chunkSize:n,compressionMethod:h,uncompressedSize:p}));else if(b)S=new Vt,g=Lt(g,new r(Ft)),g=Et(g,S);else try{g=jt(g,c,{level:f,chunkSize:n},r,e)}catch(t){let n;try{n=new r(Ft)}catch{throw t}g=Lt(g,n),g=Et(g,new Vt)}o&&(i?g=Et(g,new gt(t)):(m=new ut(t),g=Et(g,m))),Tt(d,g,()=>{o&&!i||!a||(d.crc32=b?S.crc32:new u(y.value.buffer).getUint32(0))})}}class Vt extends d{constructor(){let t,n=10,e=new o(0);super({transform(t,s){if(n){const e=r.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=V(e,t));const c=o-8,i=r.min(c,e.length);s.enqueue(V(e.subarray(0,i),t.subarray(0,c-i))),e=V(e.subarray(i),t.subarray(c-i))},flush(){const n=W(e);t.crc32=n.getUint32(0,!0),t.uncompressedSize=n.getUint32(4,!0)}}),t=this}}class Wt extends d{constructor(t,{chunkSize:n,DecompressionStreamFallback:e,DecompressionStream:r}){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=Et(C,new St(t)):(z=new ft(t),C=Et(C,z))),w){const t=m&&Pt(m);if(t)C=Lt(C,Kt(t.DecompressionStream,m,{chunkSize:n,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=jt(C,h,{chunkSize:n,deflate64:p},r,e)}catch(t){if(p||b===v)throw t;let n;try{n=new r(Ft)}catch{throw t}C=function(t,n,e){const r=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),s=W(n);s.setUint32(0,r.get(),!0),s.setUint32(4,e,!0),t.enqueue(n)},cancel(t){a(t)}}),p=new d({transform(t,n){r.append(t),f+=t.length,f>=e?i():u&&y(),n.enqueue(t)},cancel(t){a(t)}});return t=Et(t,h),Et(t=Lt(t,n),p);function y(){m(),c=setTimeout(()=>a(new s(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 s("Invalid compressed data");throw n.cause=t,n}const{value:r,done:o}=e;o?t.close():t.enqueue(r)},cancel:t=>n.cancel(t)})}(C)}a&&(k=new U,C=Et(C,k)),Tt(this,C,()=>{if(a){const t=new u(k.value.buffer);if(f!=t.getUint32(0,!1))throw new s("Invalid CRC32")}})}}const _t=new f;function Tt(t,e,r){e=Et(e,new d({flush:r})),n.defineProperty(t,"readable",{get:()=>e})}function Kt(t,n,e){if(!t)throw new s("Compression method not supported");return new t(n,e)}function jt(t,n,e,r,s){const o=n&&r?r:s||r,c=e.deflate64?"deflate64-raw":Dt;let i;try{i=new o(c,e)}catch(t){if(!n||!s||o==s)throw t;i=new s(c,e)}return Lt(t,i)}function Et(t,n){return xt(t).pipeThrough(n)}function Lt(t,n){const e=n.writable.getWriter(),r=t.getReader();return async function(){try{for(;;){await e.ready;const t=await r.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{}}(r,t)}}(),n.readable}const Ot="data",Ht="close",Nt="deflate";class qt extends d{constructor(t,e){super({});const r=this,{codecType:o}=t;let c;o.startsWith(Nt)?c=Ut:o.startsWith("inflate")&&(c=Wt),r.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(r,{inputSize:i})}}),l=new d({transform(n,e){if(n&&n.length&&(e.enqueue(n),r.outputSize+=n.length,t.outputSize!==v&&r.outputSize>t.outputSize))throw new s(Bt)},flush(){const{crc32:t}=a;n.assign(r,{crc32:t,inputSize:i})}});n.defineProperty(r,"readable",{get:()=>f.pipeThrough(u).pipeThrough(a).pipeThrough(l)})}}class Gt extends d{constructor(t){const r=[];let s=0,c=0;function i(){const n=new o(t);let e=0;for(;e<t;){const s=r[0],o=t-e;s.length<=o?(n.set(s,e),e+=s.length,r.shift()):(n.set(s.subarray(0,o),e),r[0]=s.subarray(o),e+=o)}return s-=t,n}(!e.isFinite(t)||t<1)&&(t=65536),super({transform(n,e){for(r.push(n),s+=n.length;s>t;)c+=t,e.enqueue(i())},flush(t){s&&(c+=s,t.enqueue(function(t,n){const e=new o(n);let r=0;for(const n of t)e.set(n,r),r+=n.length;return e}(r,s)))}}),n.defineProperty(this,"outputSize",{get:()=>c})}}let Jt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Jt=navigator.hardwareConcurrency)}catch{}function Qt(t){return Boolean(t)&&"object"==typeof t}const Xt=new f,Yt=new f,Zt=function(){try{return structuredClone(new s)instanceof s}catch{return!1}}();let $t,tn=0;async function nn(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:r}=n;if(typeof e!=k&&typeof r!=k)throw new s("Invalid codec module");Mt.set(t,{CompressionStream:e,DecompressionStream:r})}(t,await(import(n)))}(i.format,i.codecURI)}catch(t){if(Qt(t))try{t.codecImportFailed=!0}catch{}throw 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=_t.get(t);e||(e=new f,_t.set(t,e));let r=e.get(n);if(r===v){try{new t(n),r=!0}catch{r=!1}e.set(n,r)}return r}(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=>Xt.set(tn,t));en({type:"pull",messageId:tn}),tn=(tn+1)%e.MAX_SAFE_INTEGER;const{value:r,done:s}=await n;t.enqueue(r),s&&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 r=new l(t=>n=t);Yt.set(tn,n),en({type:Ot,value:t,messageId:tn}),tn=(tn+1)%e.MAX_SAFE_INTEGER,await r}},u),n=new qt(i,a),o=new Gt(function(t){return s="string"==typeof(n=s=t.chunkSize)&&n.trim()?e(n):n,e.isInteger(s)&&s>=1?r.max(s,64):65536;var n,s}(a)),$t=new AbortController;const{signal:h}=$t;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;en({type:Ht,result:{crc32:p,inputSize:d,outputSize:S}})}catch(t){const n=o?o.outputSize:0;if(Qt(t))try{t.outputSize=n}catch{}if(c&&!c.locked)try{await c.getWriter().close()}catch{}rn(t,n)}}function en(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 rn(t,n){const{message:e,stack:r,code:o,name:c,outputSize:i,cause:a,codecImportFailed:f}=function(t=new s("Unknown error")){return Qt(t)?t:new s(String(t))}(t),u={message:e,stack:r,code:o,name:c,outputSize:i===v?n:i};if(a&&(u.cause={name:a.name,message:a.message}),f&&(u.codecImportFailed=!0),Zt)try{return void p({error:u,errorValue:{value:t}})}catch{}p({error:u})}addEventListener("message",({data:t})=>{const{type:n,messageId:e,value:r,done:s}=t;try{if("start"==n&&nn(t),n==Ot){const t=Xt.get(e);Xt.delete(e),t({value:r||new o,done:s})}if("ack"==n){const t=Yt.get(e);Yt.delete(e),t()}n==Ht&&$t.abort()}catch(t){rn(t)}}),p({type:"ready"});const sn="deflate",on="deflate-raw",cn="deflate64-raw",an="gzip";let fn,un,ln,wn,hn;function pn(t,n,e={}){if(!fn){const t=new s("WASM module not loaded");throw t.cause=hn,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=un(i),this.in=un(a),this.inBufferSize=a,!this.ut||!this.in)throw new s("allocation failed");if(this.lt=new o(i),t?(this.wt=fn.deflate_process,this.ht=fn.deflate_last_consumed,this.yt=fn.deflate_end,this.St=fn.deflate_new(),e=n===an?fn.deflate_init_gzip(this.St,c):n===on?fn.deflate_init_raw(this.St,c):fn.deflate_init(this.St,c)):n===cn?(this.wt=fn.inflate9_process,this.ht=fn.inflate9_last_consumed,this.yt=fn.inflate9_end,this.St=fn.inflate9_new(),e=fn.inflate9_init_raw(this.St)):(this.wt=fn.inflate_process,this.ht=fn.inflate_last_consumed,this.yt=fn.inflate_end,this.St=fn.inflate_new(),e=n===on?fn.inflate_init_raw(this.St):n===an?fn.inflate_init_gzip(this.St):fn.inflate_init(this.St)),0!==e)throw new s("init failed:"+e)}catch(t){throw f(this),t}},transform(t,n){try{const e=t,c=new o(wn.buffer),a=this.wt,f=this.ht,u=this.ut,l=this.lt;let w=0;for(;w<e.length;){const t=r.min(e.length-w,32768);if((!this.in||this.inBufferSize<t)&&(this.in&&ln&&(ln(this.in),this.in=0),this.in=un(t),this.inBufferSize=t,!this.in))throw new s("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 s("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(wn.buffer),e=this.wt,r=this.ut,c=this.lt;for(;;){const o=e(this.St,0,0,r,i,4),a=o>>24&255,f=128&a?a-256:a;if(f<0)throw new s("process error:"+f);const u=16777215&o;if(u&&(c.set(n.subarray(r,r+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 s("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&&ln&&ln(t.in),t.in=0,t.ut&&ln&&ln(t.ut),t.ut=0,n}}class dn{constructor(t=sn,n){return pn(!0,t,n)}}class yn{constructor(t=sn,n){return pn(!1,t,n)}}dn.gt=!0,yn.gt=!0,dn.vt=[sn,on,an],yn.vt=[sn,on,an,cn];let mn=!1;!function(t={}){const{init:n}=t,e=t.CompressionStreamFallback||t.CompressionStreamZlib,r=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{n&&await n(t),e&&(t.CompressionStreamFallback=e),r&&(t.DecompressionStreamFallback=r)}}({CompressionStreamFallback:dn,DecompressionStreamFallback:yn,init:t=>async function(t,{baseURI:n}){if(!mn)try{await async function(t,n){let e,r;try{try{r=new URL(t,n)}catch{}const s=await fetch(r);e=await s.arrayBuffer()}catch(n){if(!t.startsWith("data:application/wasm;base64,"))throw n;e=function(t){const n=t.split(",")[1],e=atob(n),r=e.length,s=new o(r);for(let t=0;t<r;++t)s[t]=e.charCodeAt(t);return s.buffer}(t)}!function(t){if(fn=t,({malloc:un,free:ln,memory:wn}=fn),"function"!=typeof un||"function"!=typeof ln||!wn)throw fn=un=ln=wn=null,new s("Invalid WASM module")}((await WebAssembly.instantiate(e)).instance.exports)}(t,n),mn=!0}catch(t){throw function(t){hn=t}(t),t}}(t.wasmURI,t)})});\n';if("string"==typeof r&&(r=(new TextEncoder).encode(r)),t){const t=new Blob([r],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+function(t){let n="";const r=t.length;let s=0;for(;s+2<r;s+=3){const r=t[s]<<16|t[s+1]<<8|t[s+2];n+=e$1[r>>18&63]+e$1[r>>12&63]+e$1[r>>6&63]+e$1[63&r];}const o=r-s;if(1===o){const r=t[s]<<16;n+=e$1[r>>18&63]+e$1[r>>12&63]+"==";}else if(2===o){const r=t[s]<<16|t[s+1]<<8;n+=e$1[r>>18&63]+e$1[r>>12&63]+e$1[r>>6&63]+"=";}return n}(r)}});
|
|
420
443
|
|
|
421
444
|
/*
|
|
422
445
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -462,6 +485,39 @@ function getDataView(array) {
|
|
|
462
485
|
return new DataView(array.buffer, array.byteOffset, array.byteLength);
|
|
463
486
|
}
|
|
464
487
|
|
|
488
|
+
/*
|
|
489
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
490
|
+
|
|
491
|
+
Redistribution and use in source and binary forms, with or without
|
|
492
|
+
modification, are permitted provided that the following conditions are met:
|
|
493
|
+
|
|
494
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
495
|
+
this list of conditions and the following disclaimer.
|
|
496
|
+
|
|
497
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
498
|
+
notice, this list of conditions and the following disclaimer in
|
|
499
|
+
the documentation and/or other materials provided with the distribution.
|
|
500
|
+
|
|
501
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
502
|
+
derived from this software without specific prior written permission.
|
|
503
|
+
|
|
504
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
505
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
506
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
507
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
508
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
509
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
510
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
511
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
512
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
513
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
514
|
+
*/
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
function isErrorObject(error) {
|
|
518
|
+
return Boolean(error) && typeof error == "object";
|
|
519
|
+
}
|
|
520
|
+
|
|
465
521
|
/*
|
|
466
522
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
467
523
|
|
|
@@ -2601,6 +2657,7 @@ class ChunkStream extends TransformStream {
|
|
|
2601
2657
|
constructor(chunkSize) {
|
|
2602
2658
|
const pendingChunks = [];
|
|
2603
2659
|
let pendingLength = 0;
|
|
2660
|
+
let outputSize = 0;
|
|
2604
2661
|
if (!Number.isFinite(chunkSize) || chunkSize < 1) {
|
|
2605
2662
|
chunkSize = DEFAULT_CHUNK_SIZE;
|
|
2606
2663
|
}
|
|
@@ -2609,15 +2666,20 @@ class ChunkStream extends TransformStream {
|
|
|
2609
2666
|
pendingChunks.push(chunk);
|
|
2610
2667
|
pendingLength += chunk.length;
|
|
2611
2668
|
while (pendingLength > chunkSize) {
|
|
2669
|
+
outputSize += chunkSize;
|
|
2612
2670
|
controller.enqueue(shiftChunk());
|
|
2613
2671
|
}
|
|
2614
2672
|
},
|
|
2615
2673
|
flush(controller) {
|
|
2616
2674
|
if (pendingLength) {
|
|
2675
|
+
outputSize += pendingLength;
|
|
2617
2676
|
controller.enqueue(concatChunks(pendingChunks, pendingLength));
|
|
2618
2677
|
}
|
|
2619
2678
|
}
|
|
2620
2679
|
});
|
|
2680
|
+
Object.defineProperty(this, "outputSize", {
|
|
2681
|
+
get: () => outputSize
|
|
2682
|
+
});
|
|
2621
2683
|
|
|
2622
2684
|
function shiftChunk() {
|
|
2623
2685
|
const result = new Uint8Array(chunkSize);
|
|
@@ -2727,7 +2789,9 @@ function disableWebWorker(workerData) {
|
|
|
2727
2789
|
|
|
2728
2790
|
class CodecWorker {
|
|
2729
2791
|
|
|
2730
|
-
constructor(workerData, { readable, writable },
|
|
2792
|
+
constructor(workerData, { readable, writable }, workerOptions, onTaskFinished) {
|
|
2793
|
+
const { options, config, streamOptions, useWebWorkers, transferStreams, workerURI } = workerOptions;
|
|
2794
|
+
let { createWorker } = workerOptions;
|
|
2731
2795
|
const { signal } = streamOptions;
|
|
2732
2796
|
if (createWorkerFailed) {
|
|
2733
2797
|
createWorker = UNDEFINED_VALUE;
|
|
@@ -2740,6 +2804,7 @@ class CodecWorker {
|
|
|
2740
2804
|
.pipeThrough(new ProgressWatcherStream(streamOptions), { signal }),
|
|
2741
2805
|
writable,
|
|
2742
2806
|
options: Object.assign({}, options),
|
|
2807
|
+
workerOptions,
|
|
2743
2808
|
workerURI,
|
|
2744
2809
|
createWorker,
|
|
2745
2810
|
transferStreams,
|
|
@@ -2821,8 +2886,8 @@ function createWorkerInterface(workerData, config) {
|
|
|
2821
2886
|
};
|
|
2822
2887
|
}
|
|
2823
2888
|
|
|
2824
|
-
async function runWorker$1({ options, readable, writable, onTaskFinished }, config) {
|
|
2825
|
-
let codecStream;
|
|
2889
|
+
async function runWorker$1({ options, readable, writable, onTaskFinished, workerOptions }, config) {
|
|
2890
|
+
let codecStream, chunkStream;
|
|
2826
2891
|
try {
|
|
2827
2892
|
if (options.compressed && !options.format) {
|
|
2828
2893
|
const deflate = options.codecType.startsWith(CODEC_DEFLATE);
|
|
@@ -2845,9 +2910,10 @@ async function runWorker$1({ options, readable, writable, onTaskFinished }, conf
|
|
|
2845
2910
|
}
|
|
2846
2911
|
}
|
|
2847
2912
|
codecStream = new CodecStream(options, config);
|
|
2913
|
+
chunkStream = new ChunkStream(getChunkSize(config));
|
|
2848
2914
|
await readable
|
|
2849
2915
|
.pipeThrough(codecStream)
|
|
2850
|
-
.pipeThrough(
|
|
2916
|
+
.pipeThrough(chunkStream)
|
|
2851
2917
|
.pipeTo(writable, { preventClose: true, preventAbort: true });
|
|
2852
2918
|
const {
|
|
2853
2919
|
crc32,
|
|
@@ -2861,7 +2927,15 @@ async function runWorker$1({ options, readable, writable, onTaskFinished }, conf
|
|
|
2861
2927
|
};
|
|
2862
2928
|
} catch (error) {
|
|
2863
2929
|
if (codecStream) {
|
|
2864
|
-
|
|
2930
|
+
const outputSize = chunkStream ? chunkStream.outputSize : 0;
|
|
2931
|
+
workerOptions.outputSize = outputSize;
|
|
2932
|
+
if (isErrorObject(error)) {
|
|
2933
|
+
try {
|
|
2934
|
+
error.outputSize = outputSize;
|
|
2935
|
+
} catch {
|
|
2936
|
+
// ignored
|
|
2937
|
+
}
|
|
2938
|
+
}
|
|
2865
2939
|
}
|
|
2866
2940
|
throw error;
|
|
2867
2941
|
} finally {
|
|
@@ -2970,11 +3044,23 @@ async function runWebWorker(workerData, config) {
|
|
|
2970
3044
|
let resolveResult, rejectResult;
|
|
2971
3045
|
const result = new Promise((resolve, reject) => {
|
|
2972
3046
|
resolveResult = resolve;
|
|
2973
|
-
rejectResult =
|
|
3047
|
+
rejectResult = error => {
|
|
3048
|
+
const { outputSize, workerOptions } = workerData;
|
|
3049
|
+
workerOptions.outputSize = outputSize;
|
|
3050
|
+
if (isErrorObject(error) && error.outputSize === UNDEFINED_VALUE) {
|
|
3051
|
+
try {
|
|
3052
|
+
error.outputSize = outputSize;
|
|
3053
|
+
} catch {
|
|
3054
|
+
// ignored
|
|
3055
|
+
}
|
|
3056
|
+
}
|
|
3057
|
+
reject(error);
|
|
3058
|
+
};
|
|
2974
3059
|
});
|
|
2975
3060
|
Object.assign(workerData, {
|
|
2976
3061
|
reader: null,
|
|
2977
3062
|
writer: null,
|
|
3063
|
+
outputSize: 0,
|
|
2978
3064
|
resolveResult,
|
|
2979
3065
|
rejectResult,
|
|
2980
3066
|
result
|
|
@@ -3235,21 +3321,15 @@ function sendMessage(message, { worker, writer, transferStreams, workerAlive })
|
|
|
3235
3321
|
}
|
|
3236
3322
|
|
|
3237
3323
|
async function onMessage({ data }, workerData) {
|
|
3238
|
-
const { type, value, messageId, result, error } = data;
|
|
3324
|
+
const { type, value, messageId, result, error, errorValue } = data;
|
|
3239
3325
|
const { reader, writer, resolveResult, rejectResult, onTaskFinished, generation } = workerData;
|
|
3240
3326
|
const stale = () => workerData.generation != generation;
|
|
3241
3327
|
try {
|
|
3242
3328
|
if (error) {
|
|
3243
|
-
|
|
3244
|
-
|
|
3245
|
-
Object.assign(responseError, { stack, code, name, outputSize });
|
|
3246
|
-
if (cause) {
|
|
3247
|
-
responseError.cause = Object.assign(new Error(cause.message), { name: cause.name });
|
|
3248
|
-
}
|
|
3249
|
-
if (codecImportFailed) {
|
|
3250
|
-
responseError.codecImportFailed = true;
|
|
3329
|
+
if (error.outputSize !== UNDEFINED_VALUE) {
|
|
3330
|
+
workerData.outputSize = error.outputSize;
|
|
3251
3331
|
}
|
|
3252
|
-
|
|
3332
|
+
fail(getResponseError(error, errorValue));
|
|
3253
3333
|
} else {
|
|
3254
3334
|
if (type == MESSAGE_PULL) {
|
|
3255
3335
|
const { value, done } = await reader.read();
|
|
@@ -3258,39 +3338,82 @@ async function onMessage({ data }, workerData) {
|
|
|
3258
3338
|
}
|
|
3259
3339
|
}
|
|
3260
3340
|
if (type == MESSAGE_DATA) {
|
|
3341
|
+
const chunk = new Uint8Array(value);
|
|
3261
3342
|
await writer.ready;
|
|
3262
|
-
await writer.write(
|
|
3343
|
+
await writer.write(chunk);
|
|
3344
|
+
workerData.outputSize += chunk.length;
|
|
3263
3345
|
if (!stale()) {
|
|
3264
3346
|
sendMessage({ type: MESSAGE_ACK_DATA, messageId }, workerData);
|
|
3265
3347
|
}
|
|
3266
3348
|
}
|
|
3267
3349
|
if (type == MESSAGE_CLOSE) {
|
|
3268
|
-
|
|
3350
|
+
succeed(result);
|
|
3269
3351
|
}
|
|
3270
3352
|
}
|
|
3271
3353
|
} catch (error) {
|
|
3272
3354
|
if (!stale()) {
|
|
3273
3355
|
terminateWorker$1(workerData);
|
|
3274
|
-
|
|
3356
|
+
fail(error);
|
|
3275
3357
|
}
|
|
3276
3358
|
}
|
|
3277
3359
|
|
|
3278
|
-
function
|
|
3279
|
-
if (stale()) {
|
|
3280
|
-
return;
|
|
3281
|
-
}
|
|
3282
|
-
if (error) {
|
|
3360
|
+
function fail(error) {
|
|
3361
|
+
if (!stale()) {
|
|
3283
3362
|
rejectResult(error);
|
|
3284
|
-
|
|
3363
|
+
releaseWriter();
|
|
3364
|
+
if (!(isErrorObject(error) && error.codecImportFailed)) {
|
|
3365
|
+
onTaskFinished();
|
|
3366
|
+
}
|
|
3367
|
+
}
|
|
3368
|
+
}
|
|
3369
|
+
|
|
3370
|
+
function succeed(result) {
|
|
3371
|
+
if (!stale()) {
|
|
3285
3372
|
resolveResult(result);
|
|
3373
|
+
releaseWriter();
|
|
3374
|
+
onTaskFinished();
|
|
3286
3375
|
}
|
|
3376
|
+
}
|
|
3377
|
+
|
|
3378
|
+
function releaseWriter() {
|
|
3287
3379
|
if (writer) {
|
|
3288
3380
|
writer.releaseLock();
|
|
3289
3381
|
}
|
|
3290
|
-
|
|
3291
|
-
|
|
3382
|
+
}
|
|
3383
|
+
}
|
|
3384
|
+
|
|
3385
|
+
function getResponseError(errorData, errorValue) {
|
|
3386
|
+
const { message, stack, code, name, outputSize, cause, codecImportFailed } = errorData;
|
|
3387
|
+
let responseError;
|
|
3388
|
+
if (errorValue) {
|
|
3389
|
+
responseError = errorValue.value;
|
|
3390
|
+
} else {
|
|
3391
|
+
responseError = Object.assign(new Error(message), { stack, code, name });
|
|
3392
|
+
if (cause) {
|
|
3393
|
+
responseError.cause = Object.assign(new Error(cause.message), { name: cause.name });
|
|
3292
3394
|
}
|
|
3293
3395
|
}
|
|
3396
|
+
if (isErrorObject(responseError)) {
|
|
3397
|
+
try {
|
|
3398
|
+
if (outputSize !== UNDEFINED_VALUE) {
|
|
3399
|
+
responseError.outputSize = outputSize;
|
|
3400
|
+
}
|
|
3401
|
+
if (codecImportFailed) {
|
|
3402
|
+
responseError.codecImportFailed = true;
|
|
3403
|
+
}
|
|
3404
|
+
if (errorValue) {
|
|
3405
|
+
if (responseError.name !== name) {
|
|
3406
|
+
responseError.name = name;
|
|
3407
|
+
}
|
|
3408
|
+
if (responseError.code !== code) {
|
|
3409
|
+
responseError.code = code;
|
|
3410
|
+
}
|
|
3411
|
+
}
|
|
3412
|
+
} catch {
|
|
3413
|
+
// ignored
|
|
3414
|
+
}
|
|
3415
|
+
}
|
|
3416
|
+
return responseError;
|
|
3294
3417
|
}
|
|
3295
3418
|
|
|
3296
3419
|
/*
|
|
@@ -3567,10 +3690,13 @@ function decode(value, encoding, ignoreBOM) {
|
|
|
3567
3690
|
|
|
3568
3691
|
|
|
3569
3692
|
const ERR_HTTP_STATUS = "HTTP error ";
|
|
3693
|
+
const MIN_SUCCESS_HTTP_STATUS = 200;
|
|
3694
|
+
const MAX_SUCCESS_HTTP_STATUS = 299;
|
|
3570
3695
|
const ERR_HTTP_RANGE = "HTTP Range not supported";
|
|
3571
3696
|
const ERR_HTTP_RESOURCE_CHANGED = "HTTP resource changed";
|
|
3572
3697
|
const ERR_ITERATOR_COMPLETED_TOO_SOON = "Writer iterator completed too soon";
|
|
3573
3698
|
const ERR_WRITER_NOT_INITIALIZED = "Writer not initialized";
|
|
3699
|
+
const ERR_WRITER_SIZE_NOT_WRITABLE = "Invalid writer (size must be writable)";
|
|
3574
3700
|
|
|
3575
3701
|
const CONTENT_TYPE_TEXT_PLAIN = "text/plain";
|
|
3576
3702
|
const HTTP_HEADER_CONTENT_LENGTH = "Content-Length";
|
|
@@ -3762,6 +3888,7 @@ class BlobReader extends Reader {
|
|
|
3762
3888
|
const reader = this;
|
|
3763
3889
|
const { sourceBlob, size } = reader;
|
|
3764
3890
|
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
3891
|
+
// deno-lint-ignore valid-typeof
|
|
3765
3892
|
if (typeof sourceBlob.stream == FUNCTION_TYPE) {
|
|
3766
3893
|
if (!offset && readSize >= size) {
|
|
3767
3894
|
return toCompatibleReadable(sourceBlob.stream());
|
|
@@ -4168,7 +4295,7 @@ async function getContentLength(httpReader, sendRequest, getRequestData) {
|
|
|
4168
4295
|
|
|
4169
4296
|
async function sendFetchRequest(method, { fetch: fetchFunction = fetch, options, url }, headers) {
|
|
4170
4297
|
const response = await fetchFunction(url, Object.assign({}, options, { method, headers }));
|
|
4171
|
-
if (response.status
|
|
4298
|
+
if (response.status >= MIN_SUCCESS_HTTP_STATUS && response.status <= MAX_SUCCESS_HTTP_STATUS) {
|
|
4172
4299
|
return response;
|
|
4173
4300
|
} else {
|
|
4174
4301
|
throw response.status == 416 ? new Error(ERR_HTTP_RANGE) : new Error(ERR_HTTP_STATUS + (response.statusText || response.status));
|
|
@@ -4179,7 +4306,7 @@ function sendXMLHttpRequest(method, { url }, headers) {
|
|
|
4179
4306
|
return new Promise((resolve, reject) => {
|
|
4180
4307
|
const request = new XMLHttpRequest();
|
|
4181
4308
|
request.addEventListener("load", () => {
|
|
4182
|
-
if (request.status
|
|
4309
|
+
if (request.status >= MIN_SUCCESS_HTTP_STATUS && request.status <= MAX_SUCCESS_HTTP_STATUS) {
|
|
4183
4310
|
const headers = [];
|
|
4184
4311
|
request.getAllResponseHeaders().trim().split(/[\r\n]+/).forEach(header => {
|
|
4185
4312
|
const splitHeader = header.trim().split(/\s*:\s*/);
|
|
@@ -4483,8 +4610,10 @@ class GenericWriter {
|
|
|
4483
4610
|
writable: toCompatibleWritable(writer)
|
|
4484
4611
|
};
|
|
4485
4612
|
}
|
|
4486
|
-
|
|
4487
|
-
writer.size = 0;
|
|
4613
|
+
try {
|
|
4614
|
+
writer.size = writer.size === UNDEFINED_VALUE ? 0 : writer.size;
|
|
4615
|
+
} catch {
|
|
4616
|
+
throw new Error(ERR_WRITER_SIZE_NOT_WRITABLE);
|
|
4488
4617
|
}
|
|
4489
4618
|
return writer;
|
|
4490
4619
|
}
|
|
@@ -4532,6 +4661,45 @@ function createReadable(reader, options) {
|
|
|
4532
4661
|
}
|
|
4533
4662
|
}
|
|
4534
4663
|
|
|
4664
|
+
/*
|
|
4665
|
+
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
4666
|
+
|
|
4667
|
+
Redistribution and use in source and binary forms, with or without
|
|
4668
|
+
modification, are permitted provided that the following conditions are met:
|
|
4669
|
+
|
|
4670
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
4671
|
+
this list of conditions and the following disclaimer.
|
|
4672
|
+
|
|
4673
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
4674
|
+
notice, this list of conditions and the following disclaimer in
|
|
4675
|
+
the documentation and/or other materials provided with the distribution.
|
|
4676
|
+
|
|
4677
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
4678
|
+
derived from this software without specific prior written permission.
|
|
4679
|
+
|
|
4680
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4681
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4682
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4683
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4684
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4685
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4686
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4687
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4688
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4689
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4690
|
+
*/
|
|
4691
|
+
|
|
4692
|
+
|
|
4693
|
+
function addWarning(warnings, reason, filename) {
|
|
4694
|
+
if (!warnings.some(warning => warning.reason == reason)) {
|
|
4695
|
+
const warning = { reason };
|
|
4696
|
+
if (filename !== UNDEFINED_VALUE) {
|
|
4697
|
+
warning.filename = filename;
|
|
4698
|
+
}
|
|
4699
|
+
warnings.push(warning);
|
|
4700
|
+
}
|
|
4701
|
+
}
|
|
4702
|
+
|
|
4535
4703
|
/*
|
|
4536
4704
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4537
4705
|
|
|
@@ -4560,6 +4728,7 @@ function createReadable(reader, options) {
|
|
|
4560
4728
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4561
4729
|
*/
|
|
4562
4730
|
|
|
4731
|
+
|
|
4563
4732
|
const PROPERTY_NAME_FILENAME = "filename";
|
|
4564
4733
|
const PROPERTY_NAME_RAW_FILENAME = "rawFilename";
|
|
4565
4734
|
const PROPERTY_NAME_COMMENT = "comment";
|
|
@@ -4684,6 +4853,38 @@ class Entry {
|
|
|
4684
4853
|
|
|
4685
4854
|
}
|
|
4686
4855
|
|
|
4856
|
+
const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
|
|
4857
|
+
EXTRAFIELD_TYPE_ZIP64,
|
|
4858
|
+
EXTRAFIELD_TYPE_AES,
|
|
4859
|
+
EXTRAFIELD_TYPE_NTFS,
|
|
4860
|
+
EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
|
|
4861
|
+
EXTRAFIELD_TYPE_UNICODE_PATH,
|
|
4862
|
+
EXTRAFIELD_TYPE_UNICODE_COMMENT,
|
|
4863
|
+
EXTRAFIELD_TYPE_USDZ,
|
|
4864
|
+
EXTRAFIELD_TYPE_INFOZIP,
|
|
4865
|
+
EXTRAFIELD_TYPE_UNIX,
|
|
4866
|
+
EXTRAFIELD_TYPE_UNIX_TYPE1,
|
|
4867
|
+
EXTRAFIELD_TYPE_PKWARE_UNIX
|
|
4868
|
+
]);
|
|
4869
|
+
|
|
4870
|
+
function getUserExtraField(extraField) {
|
|
4871
|
+
if (extraField) {
|
|
4872
|
+
const userExtraField = new Map();
|
|
4873
|
+
extraField.forEach((field, type) => {
|
|
4874
|
+
if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
|
|
4875
|
+
userExtraField.set(type, field.data);
|
|
4876
|
+
}
|
|
4877
|
+
});
|
|
4878
|
+
if (userExtraField.size) {
|
|
4879
|
+
return userExtraField;
|
|
4880
|
+
}
|
|
4881
|
+
}
|
|
4882
|
+
}
|
|
4883
|
+
|
|
4884
|
+
function getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength) {
|
|
4885
|
+
return encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
4886
|
+
}
|
|
4887
|
+
|
|
4687
4888
|
/*
|
|
4688
4889
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4689
4890
|
|
|
@@ -4743,6 +4944,8 @@ const WARNING_PREPENDED_CENTRAL_DIRECTORY = "prepended central directory";
|
|
|
4743
4944
|
const WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = "trailing central directory data";
|
|
4744
4945
|
const WARNING_DUPLICATE_FILENAME = "duplicate filename";
|
|
4745
4946
|
const WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = "mismatched zip64 end of central directory record";
|
|
4947
|
+
const WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = "multiple end of central directory records";
|
|
4948
|
+
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = "mismatched local file header (filename)";
|
|
4746
4949
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = "mismatched local file header (general purpose bit flag)";
|
|
4747
4950
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = "mismatched local file header (compression method)";
|
|
4748
4951
|
const WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = "mismatched local file header (crc32 or sizes)";
|
|
@@ -4813,7 +5016,7 @@ class ZipReader {
|
|
|
4813
5016
|
}
|
|
4814
5017
|
}
|
|
4815
5018
|
if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
|
|
4816
|
-
throwAmbiguousArchive(
|
|
5019
|
+
throwAmbiguousArchive(WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY);
|
|
4817
5020
|
}
|
|
4818
5021
|
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
4819
5022
|
let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
|
|
@@ -5111,7 +5314,8 @@ class ZipReader {
|
|
|
5111
5314
|
const writer = new TransformStream();
|
|
5112
5315
|
const arrayBufferPromise = streamToBlob(writer.readable).then(blob => blob.arrayBuffer());
|
|
5113
5316
|
arrayBufferPromise.catch(() => { });
|
|
5114
|
-
await fileEntry.getData(writer, entry, zipReader.readRanges,
|
|
5317
|
+
await fileEntry.getData(writer, entry, zipReader.readRanges,
|
|
5318
|
+
Object.assign({}, options, { preventClose: false }));
|
|
5115
5319
|
return arrayBufferPromise;
|
|
5116
5320
|
};
|
|
5117
5321
|
offset = endOffset;
|
|
@@ -5192,49 +5396,101 @@ class ZipReader {
|
|
|
5192
5396
|
await reader.readable.cancel();
|
|
5193
5397
|
}
|
|
5194
5398
|
}
|
|
5399
|
+
|
|
5400
|
+
[SYMBOL_ASYNC_DISPOSE]() {
|
|
5401
|
+
return this.close();
|
|
5402
|
+
}
|
|
5195
5403
|
}
|
|
5196
5404
|
|
|
5197
5405
|
class ZipReaderStream {
|
|
5198
5406
|
|
|
5199
5407
|
constructor(options = {}) {
|
|
5200
|
-
|
|
5201
|
-
const
|
|
5408
|
+
let sourceController;
|
|
5409
|
+
const { readable, writable } = new TransformStream({
|
|
5410
|
+
start(controller) {
|
|
5411
|
+
sourceController = controller;
|
|
5412
|
+
}
|
|
5413
|
+
});
|
|
5414
|
+
const zipReader = new ZipReader(readable, options);
|
|
5415
|
+
const gen = zipReader.getEntriesGenerator();
|
|
5416
|
+
const pendingEntries = new Set();
|
|
5202
5417
|
this.readable = new ReadableStream({
|
|
5203
5418
|
async pull(controller) {
|
|
5204
5419
|
const { done, value } = await gen.next();
|
|
5205
5420
|
if (done)
|
|
5206
5421
|
return controller.close();
|
|
5207
|
-
const
|
|
5208
|
-
const { readable, writable } = new TransformStream();
|
|
5209
|
-
if (value.getData) {
|
|
5210
|
-
getData();
|
|
5211
|
-
return readable;
|
|
5212
|
-
}
|
|
5213
|
-
|
|
5214
|
-
async function getData() {
|
|
5215
|
-
try {
|
|
5216
|
-
await value.getData(writable);
|
|
5217
|
-
} catch (error) {
|
|
5218
|
-
try {
|
|
5219
|
-
await writable.abort(error);
|
|
5220
|
-
} catch {
|
|
5221
|
-
// ignored
|
|
5222
|
-
}
|
|
5223
|
-
}
|
|
5224
|
-
}
|
|
5225
|
-
})();
|
|
5422
|
+
const entryStream = createEntryStream(value, pendingEntries);
|
|
5226
5423
|
const chunk = {
|
|
5227
5424
|
...value,
|
|
5228
|
-
readable:
|
|
5425
|
+
readable: entryStream.readable
|
|
5229
5426
|
};
|
|
5230
5427
|
delete chunk.getData;
|
|
5428
|
+
Object.defineProperties(chunk, {
|
|
5429
|
+
localDirectory: {
|
|
5430
|
+
get: () => value.localDirectory,
|
|
5431
|
+
enumerable: true
|
|
5432
|
+
},
|
|
5433
|
+
warnings: {
|
|
5434
|
+
get: () => value.warnings,
|
|
5435
|
+
enumerable: true
|
|
5436
|
+
}
|
|
5437
|
+
});
|
|
5231
5438
|
controller.enqueue(chunk);
|
|
5439
|
+
},
|
|
5440
|
+
async cancel(reason) {
|
|
5441
|
+
const entryStreams = Array.from(pendingEntries);
|
|
5442
|
+
pendingEntries.clear();
|
|
5443
|
+
sourceController.error(reason);
|
|
5444
|
+
await Promise.allSettled(entryStreams.map(entryStream => entryStream.cancel(reason)));
|
|
5445
|
+
await Promise.allSettled([gen.return(), zipReader.close()]);
|
|
5232
5446
|
}
|
|
5233
5447
|
});
|
|
5234
5448
|
this.writable = writable;
|
|
5235
5449
|
}
|
|
5236
5450
|
}
|
|
5237
5451
|
|
|
5452
|
+
function createEntryStream(entry, pendingEntries) {
|
|
5453
|
+
const { readable, writable } = new TransformStream();
|
|
5454
|
+
let dataReader;
|
|
5455
|
+
const entryStream = {
|
|
5456
|
+
cancel: async reason => {
|
|
5457
|
+
pendingEntries.delete(entryStream);
|
|
5458
|
+
await (dataReader ? dataReader.cancel(reason) : readable.cancel(reason));
|
|
5459
|
+
}
|
|
5460
|
+
};
|
|
5461
|
+
entryStream.readable = new ReadableStream({
|
|
5462
|
+
async pull(controller) {
|
|
5463
|
+
if (!dataReader) {
|
|
5464
|
+
dataReader = readable.getReader();
|
|
5465
|
+
pendingEntries.add(entryStream);
|
|
5466
|
+
getData();
|
|
5467
|
+
}
|
|
5468
|
+
const { done, value } = await dataReader.read();
|
|
5469
|
+
if (done) {
|
|
5470
|
+
controller.close();
|
|
5471
|
+
} else {
|
|
5472
|
+
controller.enqueue(value);
|
|
5473
|
+
}
|
|
5474
|
+
},
|
|
5475
|
+
cancel: reason => entryStream.cancel(reason)
|
|
5476
|
+
}, { highWaterMark: 0 });
|
|
5477
|
+
return entryStream;
|
|
5478
|
+
|
|
5479
|
+
async function getData() {
|
|
5480
|
+
try {
|
|
5481
|
+
await entry.getData(writable, { preventClose: false });
|
|
5482
|
+
} catch (error) {
|
|
5483
|
+
try {
|
|
5484
|
+
await writable.abort(error);
|
|
5485
|
+
} catch {
|
|
5486
|
+
// ignored
|
|
5487
|
+
}
|
|
5488
|
+
} finally {
|
|
5489
|
+
pendingEntries.delete(entryStream);
|
|
5490
|
+
}
|
|
5491
|
+
}
|
|
5492
|
+
}
|
|
5493
|
+
|
|
5238
5494
|
async function isZipFile(reader, options = {}) {
|
|
5239
5495
|
reader = new GenericReader(reader);
|
|
5240
5496
|
await initStream(reader);
|
|
@@ -5294,7 +5550,9 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5294
5550
|
const dataView = getDataView(dataArray);
|
|
5295
5551
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
5296
5552
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
5297
|
-
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
5553
|
+
const passThrough = checkPassThroughOption(getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH));
|
|
5554
|
+
const passThroughCompression = Boolean(passThrough);
|
|
5555
|
+
const passThroughEncryption = passThrough === true;
|
|
5298
5556
|
checkPasswordOption(password, rawPassword);
|
|
5299
5557
|
password = password && password.length && password;
|
|
5300
5558
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
@@ -5315,7 +5573,9 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5315
5573
|
const checkLocalDirectoryOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_DIRECTORY);
|
|
5316
5574
|
const entryStrictness = getStrictness(options, zipEntry.options);
|
|
5317
5575
|
const checkLocalDirectory = getCheckLocalDirectory(checkLocalDirectoryOption, entryStrictness);
|
|
5318
|
-
const
|
|
5576
|
+
const checkLocalFilenameOption = getOptionValue$1(zipEntry, options, OPTION_CHECK_LOCAL_FILENAME);
|
|
5577
|
+
const checkLocalFilename = getCheckLocalFilename(
|
|
5578
|
+
checkLocalFilenameOption === UNDEFINED_VALUE ? checkLocalDirectoryOption : checkLocalFilenameOption, entryStrictness);
|
|
5319
5579
|
let rawLocalFilename = EMPTY_UINT8_ARRAY;
|
|
5320
5580
|
if (checkLocalFilename && (filenameLength || extraFieldLength)) {
|
|
5321
5581
|
const trailingDataArray = await readUint8Array(reader, localHeaderOffset + HEADER_SIZE, filenameLength + extraFieldLength);
|
|
@@ -5346,16 +5606,17 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5346
5606
|
if (gid !== UNDEFINED_VALUE && fileEntry.gid === UNDEFINED_VALUE) {
|
|
5347
5607
|
fileEntry.gid = gid;
|
|
5348
5608
|
}
|
|
5349
|
-
const
|
|
5609
|
+
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5610
|
+
const encrypted = zipEntry.encrypted && localDirectory.encrypted && (!passThroughEncryption || checkPasswordOnly);
|
|
5350
5611
|
const zipCrypto = encrypted && !extraFieldAES;
|
|
5351
|
-
if (!
|
|
5612
|
+
if (!passThroughEncryption) {
|
|
5352
5613
|
fileEntry.zipCrypto = zipCrypto;
|
|
5353
5614
|
}
|
|
5354
5615
|
if (encrypted && (localDirectory.rawBitFlag & BITFLAG_STRONG_ENCRYPTION) == BITFLAG_STRONG_ENCRYPTION) {
|
|
5355
5616
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION);
|
|
5356
5617
|
}
|
|
5357
|
-
const registeredCodec =
|
|
5358
|
-
if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !
|
|
5618
|
+
const registeredCodec = passThroughCompression ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
5619
|
+
if (compressionMethod != COMPRESSION_METHOD_STORE && compressionMethod != COMPRESSION_METHOD_DEFLATE && compressionMethod != COMPRESSION_METHOD_DEFLATE_64 && !registeredCodec && !passThroughCompression) {
|
|
5359
5620
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
5360
5621
|
}
|
|
5361
5622
|
if (encrypted) {
|
|
@@ -5372,15 +5633,16 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5372
5633
|
const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
|
|
5373
5634
|
const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
|
|
5374
5635
|
throwIfAborted(signal);
|
|
5375
|
-
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5376
5636
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
5377
5637
|
const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
|
|
5378
5638
|
if (checkOverlappingEntryOnly) {
|
|
5379
5639
|
checkOverlappingEntry = true;
|
|
5380
5640
|
}
|
|
5381
5641
|
const { onstart, onprogress, onend } = options;
|
|
5382
|
-
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !
|
|
5383
|
-
const outputSize =
|
|
5642
|
+
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThroughCompression;
|
|
5643
|
+
const outputSize = passThroughCompression ?
|
|
5644
|
+
compressedSize - getEncryptionOverhead(encrypted, zipCrypto, extraFieldAES && extraFieldAES.strength) :
|
|
5645
|
+
uncompressedSize;
|
|
5384
5646
|
const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
|
|
5385
5647
|
let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
|
|
5386
5648
|
if (deflate64) {
|
|
@@ -5389,7 +5651,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5389
5651
|
const checkCrc32Option = getOptionValue$1(zipEntry, options, OPTION_CHECK_CRC32);
|
|
5390
5652
|
const checkCrc32 = (checkCrc32Option === UNDEFINED_VALUE ?
|
|
5391
5653
|
getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) :
|
|
5392
|
-
checkCrc32Option) && !
|
|
5654
|
+
checkCrc32Option) && !passThroughCompression &&
|
|
5393
5655
|
(!encrypted || zipCrypto || (extraFieldAES && extraFieldAES.vendorVersion == VENDOR_VERSION_AE_1$1));
|
|
5394
5656
|
const workerOptions = {
|
|
5395
5657
|
options: {
|
|
@@ -5433,7 +5695,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5433
5695
|
readRanges
|
|
5434
5696
|
});
|
|
5435
5697
|
}
|
|
5436
|
-
let writable, abortError;
|
|
5698
|
+
let writable, abortError, aborted;
|
|
5437
5699
|
try {
|
|
5438
5700
|
if (!checkOverlappingEntryOnly) {
|
|
5439
5701
|
if (checkPasswordOnly) {
|
|
@@ -5443,24 +5705,28 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5443
5705
|
await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
|
|
5444
5706
|
({ writable } = writer);
|
|
5445
5707
|
const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5446
|
-
writer.size += writtenSize;
|
|
5447
5708
|
if (writtenSize != outputSize) {
|
|
5448
|
-
throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
5709
|
+
throw Object.assign(new Error(ERR_INVALID_UNCOMPRESSED_SIZE), { outputSize: writtenSize });
|
|
5449
5710
|
}
|
|
5711
|
+
writer.size += writtenSize;
|
|
5450
5712
|
}
|
|
5451
5713
|
} catch (error) {
|
|
5452
|
-
|
|
5714
|
+
const { outputSize: failedOutputSize } = workerOptions;
|
|
5715
|
+
if (failedOutputSize !== UNDEFINED_VALUE) {
|
|
5716
|
+
writer.size += failedOutputSize;
|
|
5717
|
+
} else if (isErrorObject(error) && error.outputSize !== UNDEFINED_VALUE) {
|
|
5453
5718
|
writer.size += error.outputSize;
|
|
5454
5719
|
}
|
|
5455
|
-
if (!checkPasswordOnly || error.message != ERR_ABORT_CHECK_PASSWORD) {
|
|
5720
|
+
if (!checkPasswordOnly || !isErrorObject(error) || error.message != ERR_ABORT_CHECK_PASSWORD) {
|
|
5456
5721
|
abortError = error;
|
|
5722
|
+
aborted = true;
|
|
5457
5723
|
throw error;
|
|
5458
5724
|
}
|
|
5459
5725
|
} finally {
|
|
5460
5726
|
const preventClose = !ownsWritable(writer) && getOptionValue$1(zipEntry, options, OPTION_PREVENT_CLOSE);
|
|
5461
5727
|
if (!preventClose && writable && !writable.locked) {
|
|
5462
5728
|
const writableWriter = writable.getWriter();
|
|
5463
|
-
if (
|
|
5729
|
+
if (aborted) {
|
|
5464
5730
|
try {
|
|
5465
5731
|
await writableWriter.abort(abortError);
|
|
5466
5732
|
} catch {
|
|
@@ -6112,7 +6378,7 @@ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, chec
|
|
|
6112
6378
|
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
6113
6379
|
(rawLocalFilename.length != rawFilename.length ||
|
|
6114
6380
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
6115
|
-
reportAmbiguity(reject, warnings,
|
|
6381
|
+
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME);
|
|
6116
6382
|
}
|
|
6117
6383
|
if ((localDirectory.rawBitFlag & BITFLAG_AMBIGUITY_MASK) != (zipEntry.rawBitFlag & BITFLAG_AMBIGUITY_MASK)) {
|
|
6118
6384
|
reportAmbiguity(reject, warnings, WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG);
|
|
@@ -6137,16 +6403,6 @@ function reportAmbiguity(reject, warnings, reason) {
|
|
|
6137
6403
|
}
|
|
6138
6404
|
}
|
|
6139
6405
|
|
|
6140
|
-
function addWarning(warnings, reason, filename) {
|
|
6141
|
-
if (!warnings.some(warning => warning.reason == reason)) {
|
|
6142
|
-
const warning = { reason };
|
|
6143
|
-
if (filename !== UNDEFINED_VALUE) {
|
|
6144
|
-
warning.filename = filename;
|
|
6145
|
-
}
|
|
6146
|
-
warnings.push(warning);
|
|
6147
|
-
}
|
|
6148
|
-
}
|
|
6149
|
-
|
|
6150
6406
|
function throwAmbiguousArchive(reason) {
|
|
6151
6407
|
const error = new Error(ERR_AMBIGUOUS_ARCHIVE);
|
|
6152
6408
|
error.reason = reason;
|
|
@@ -6226,7 +6482,9 @@ var zipReader = /*#__PURE__*/Object.freeze({
|
|
|
6226
6482
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG: WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG,
|
|
6227
6483
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD: WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD,
|
|
6228
6484
|
WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES: WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES,
|
|
6485
|
+
WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME: WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME,
|
|
6229
6486
|
WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY: WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY,
|
|
6487
|
+
WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY: WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY,
|
|
6230
6488
|
WARNING_PREPENDED_CENTRAL_DIRECTORY: WARNING_PREPENDED_CENTRAL_DIRECTORY,
|
|
6231
6489
|
WARNING_PREPENDED_DATA: WARNING_PREPENDED_DATA,
|
|
6232
6490
|
WARNING_TRAILING_CENTRAL_DIRECTORY_DATA: WARNING_TRAILING_CENTRAL_DIRECTORY_DATA,
|
|
@@ -6279,7 +6537,7 @@ const ERR_INVALID_VERSION = "Version exceeds 65535";
|
|
|
6279
6537
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
6280
6538
|
const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
|
|
6281
6539
|
const ERR_UNSUPPORTED_SPLIT_USDZ = "Split zip files are not supported in USDZ files";
|
|
6282
|
-
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
|
|
6540
|
+
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set to true (use 'compressed' instead)";
|
|
6283
6541
|
const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
|
|
6284
6542
|
const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
|
|
6285
6543
|
const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
|
|
@@ -6291,6 +6549,7 @@ const MAX_NTFS_TIME = BigInt("0x7fffffffffffffff");
|
|
|
6291
6549
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
6292
6550
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
6293
6551
|
const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
|
|
6552
|
+
const ERR_UNDEFINED_CRC32 = "Undefined CRC32";
|
|
6294
6553
|
const ERR_UNDETERMINED_SIZE = "Undetermined size";
|
|
6295
6554
|
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
6296
6555
|
const ERR_INVALID_READER = "Invalid reader (must be a Reader instance, a ReadableStream instance, or an object with a 'readable' property)";
|
|
@@ -6304,14 +6563,21 @@ const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be intege
|
|
|
6304
6563
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
6305
6564
|
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
6306
6565
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
6566
|
+
const ERR_INVALID_ENTRY = "Invalid entry option (must be an entry returned by ZipReader#getEntries())";
|
|
6567
|
+
const ERR_ZIP_CRYPTO_LAST_MOD_DATE = "The last modification date of an entry encrypted with ZipCrypto cannot be changed when passThrough is set";
|
|
6568
|
+
const WARNING_COMPRESSION_UNAVAILABLE = "compression unavailable";
|
|
6569
|
+
const WARNING_CLAMPED_LAST_MODIFICATION_DATE = "clamped last modification date";
|
|
6307
6570
|
|
|
6308
6571
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
6309
6572
|
const EXTRAFIELD_OFFSET_AES_VENDOR_VERSION = 4;
|
|
6310
6573
|
const EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD = 9;
|
|
6311
6574
|
const EXTRAFIELD_USDZ_MAX_LENGTH = 67;
|
|
6575
|
+
const MIN_PRINTABLE_ASCII_CHARACTER_CODE = 0x20;
|
|
6576
|
+
const MAX_PRINTABLE_ASCII_CHARACTER_CODE = 0x7e;
|
|
6312
6577
|
const VENDOR_VERSION_AE_1 = 1;
|
|
6313
|
-
const INFOZIP_EXTRA_FIELD_TYPE
|
|
6578
|
+
const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
|
|
6314
6579
|
const UNIX_EXTRA_FIELD_TYPE = "unix";
|
|
6580
|
+
const LEVEL_BY_BITFLAG_LEVEL = [8, 9, 5, 3];
|
|
6315
6581
|
const MAX_LEVEL = 9;
|
|
6316
6582
|
|
|
6317
6583
|
let workers = 0;
|
|
@@ -6338,9 +6604,11 @@ class ZipWriter {
|
|
|
6338
6604
|
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
6339
6605
|
pendingAddFileCalls: new Set(),
|
|
6340
6606
|
pendingErrors: [],
|
|
6607
|
+
warnings: [],
|
|
6341
6608
|
bufferedWrites: 0,
|
|
6342
6609
|
directWrites: 0,
|
|
6343
|
-
lastFileEntry: UNDEFINED_VALUE
|
|
6610
|
+
lastFileEntry: UNDEFINED_VALUE,
|
|
6611
|
+
archiveClosed: false
|
|
6344
6612
|
});
|
|
6345
6613
|
}
|
|
6346
6614
|
|
|
@@ -6505,6 +6773,9 @@ class ZipWriter {
|
|
|
6505
6773
|
const zipWriter = this;
|
|
6506
6774
|
const { pendingAddFileCalls, writer } = this;
|
|
6507
6775
|
const { writable } = writer;
|
|
6776
|
+
if (zipWriter.archiveClosed) {
|
|
6777
|
+
return getWriterData(writer);
|
|
6778
|
+
}
|
|
6508
6779
|
if (!(comment instanceof Uint8Array)) {
|
|
6509
6780
|
throw new Error(ERR_INVALID_COMMENT_TYPE);
|
|
6510
6781
|
}
|
|
@@ -6515,7 +6786,7 @@ class ZipWriter {
|
|
|
6515
6786
|
await Promise.allSettled(Array.from(pendingAddFileCalls));
|
|
6516
6787
|
}
|
|
6517
6788
|
await Promise.allSettled(zipWriter.pendingErrors.map(watcher => watcher.recorded));
|
|
6518
|
-
const unobservedWatchers = zipWriter.pendingErrors.filter(watcher => watcher.
|
|
6789
|
+
const unobservedWatchers = zipWriter.pendingErrors.filter(watcher => watcher.failed && !watcher.observed);
|
|
6519
6790
|
if (unobservedWatchers.length) {
|
|
6520
6791
|
const unobservedErrors = unobservedWatchers.map(watcher => watcher.error);
|
|
6521
6792
|
unobservedWatchers.forEach(watcher => watcher.observed = true);
|
|
@@ -6528,11 +6799,16 @@ class ZipWriter {
|
|
|
6528
6799
|
throw error;
|
|
6529
6800
|
}
|
|
6530
6801
|
await closeFile(zipWriter, comment, options);
|
|
6802
|
+
zipWriter.archiveClosed = true;
|
|
6531
6803
|
const preventClose = !ownsWritable(writer) && getOptionValue(zipWriter, options, OPTION_PREVENT_CLOSE);
|
|
6532
6804
|
if (!preventClose) {
|
|
6533
6805
|
await writable.getWriter().close();
|
|
6534
6806
|
}
|
|
6535
|
-
return writer
|
|
6807
|
+
return getWriterData(writer);
|
|
6808
|
+
}
|
|
6809
|
+
|
|
6810
|
+
[SYMBOL_ASYNC_DISPOSE]() {
|
|
6811
|
+
return this.close();
|
|
6536
6812
|
}
|
|
6537
6813
|
}
|
|
6538
6814
|
|
|
@@ -6611,11 +6887,16 @@ class WatchedPromise extends Promise {
|
|
|
6611
6887
|
}
|
|
6612
6888
|
}
|
|
6613
6889
|
|
|
6890
|
+
function getWriterData(writer) {
|
|
6891
|
+
return writer.getData ? writer.getData() : writer.writable;
|
|
6892
|
+
}
|
|
6893
|
+
|
|
6614
6894
|
function watchPromiseError(zipWriter, promise) {
|
|
6615
6895
|
const watchedPromise = new WatchedPromise((resolve, reject) => Promise.prototype.then.call(promise, resolve, reject));
|
|
6616
6896
|
const watcher = {};
|
|
6617
6897
|
watchedPromise.watcher = watcher;
|
|
6618
|
-
watcher.recorded = Promise.prototype.then.call(watchedPromise, UNDEFINED_VALUE,
|
|
6898
|
+
watcher.recorded = Promise.prototype.then.call(watchedPromise, UNDEFINED_VALUE,
|
|
6899
|
+
error => Object.assign(watcher, { failed: true, error }));
|
|
6619
6900
|
zipWriter.pendingErrors.push(watcher);
|
|
6620
6901
|
return watchedPromise;
|
|
6621
6902
|
}
|
|
@@ -6629,6 +6910,14 @@ async function prependZipEntries(zipWriter, reader) {
|
|
|
6629
6910
|
|
|
6630
6911
|
async function addFileEntry(zipWriter, name, reader, options) {
|
|
6631
6912
|
options = Object.assign({}, options);
|
|
6913
|
+
const entry = options[OPTION_ENTRY];
|
|
6914
|
+
if (entry !== UNDEFINED_VALUE) {
|
|
6915
|
+
const { entryOptions, passThroughOptions } = getSourceEntryOptions(entry,
|
|
6916
|
+
checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH)),
|
|
6917
|
+
getOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE));
|
|
6918
|
+
delete options[OPTION_ENTRY];
|
|
6919
|
+
options = Object.assign(entryOptions, passThroughOptions, options);
|
|
6920
|
+
}
|
|
6632
6921
|
if (getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY) && !name.endsWith(DIRECTORY_SIGNATURE)) {
|
|
6633
6922
|
name += DIRECTORY_SIGNATURE;
|
|
6634
6923
|
}
|
|
@@ -6693,21 +6982,33 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
6693
6982
|
try {
|
|
6694
6983
|
const { resolvedOptions } = metadataInfo;
|
|
6695
6984
|
if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
|
|
6696
|
-
!resolvedOptions.
|
|
6985
|
+
!resolvedOptions.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
|
|
6697
6986
|
resolvedOptions.level = 0;
|
|
6987
|
+
addWarning(zipWriter.warnings, WARNING_COMPRESSION_UNAVAILABLE, name);
|
|
6698
6988
|
}
|
|
6699
6989
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
6700
6990
|
({ reader } = sizesInfo);
|
|
6701
6991
|
const diskOffset = getDiskOffset(zipWriter.writer);
|
|
6702
6992
|
const diskNumber = getDiskNumber(zipWriter.writer);
|
|
6993
|
+
let crc32 = options.crc32 === UNDEFINED_VALUE ? options[PROPERTY_NAME_SIGNATURE] : options.crc32;
|
|
6994
|
+
const storesAE2 = sizesInfo.resolvedOptions.encrypted && !resolvedOptions.zipCrypto;
|
|
6995
|
+
if (resolvedOptions.passThroughCompression && !resolvedOptions.passThroughEncryption && storesAE2) {
|
|
6996
|
+
crc32 = UNDEFINED_VALUE;
|
|
6997
|
+
}
|
|
6998
|
+
if (resolvedOptions.passThroughCompression && reader && !storesAE2 && crc32 === UNDEFINED_VALUE) {
|
|
6999
|
+
throw new Error(ERR_UNDEFINED_CRC32);
|
|
7000
|
+
}
|
|
6703
7001
|
options = Object.assign({}, options, attributesInfo.resolvedOptions, metadataInfo.resolvedOptions, sizesInfo.resolvedOptions, {
|
|
6704
7002
|
signature: options[PROPERTY_NAME_SIGNATURE],
|
|
6705
|
-
crc32
|
|
7003
|
+
crc32,
|
|
6706
7004
|
offset: zipWriter.offset - diskOffset,
|
|
6707
7005
|
diskNumberStart: diskNumber,
|
|
6708
7006
|
[OPTION_USDZ]: zipWriter.options[OPTION_USDZ]
|
|
6709
7007
|
});
|
|
6710
7008
|
const headerInfo = getHeaderInfo(options);
|
|
7009
|
+
if (headerInfo.lastModDateClamped) {
|
|
7010
|
+
addWarning(zipWriter.warnings, WARNING_CLAMPED_LAST_MODIFICATION_DATE, name);
|
|
7011
|
+
}
|
|
6711
7012
|
const dataDescriptorInfo = getDataDescriptorInfo(options);
|
|
6712
7013
|
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
6713
7014
|
fileEntry = await getFileEntry(zipWriter, name, reader, {
|
|
@@ -6734,6 +7035,95 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
6734
7035
|
return new Entry(fileEntry);
|
|
6735
7036
|
}
|
|
6736
7037
|
|
|
7038
|
+
function getSourceEntryOptions(entry, passThrough, lastModDateOverride) {
|
|
7039
|
+
if (entry === null || typeof entry != OBJECT_TYPE || Array.isArray(entry)) {
|
|
7040
|
+
throw new Error(ERR_INVALID_ENTRY);
|
|
7041
|
+
}
|
|
7042
|
+
const {
|
|
7043
|
+
externalFileAttributes,
|
|
7044
|
+
versionMadeBy,
|
|
7045
|
+
comment,
|
|
7046
|
+
lastModDate,
|
|
7047
|
+
rawLastModDate,
|
|
7048
|
+
creationDate,
|
|
7049
|
+
lastAccessDate,
|
|
7050
|
+
uncompressedSize,
|
|
7051
|
+
encrypted,
|
|
7052
|
+
zipCrypto,
|
|
7053
|
+
crc32,
|
|
7054
|
+
compressionMethod,
|
|
7055
|
+
extraFieldAES,
|
|
7056
|
+
extraFieldUnix,
|
|
7057
|
+
internalFileAttributes,
|
|
7058
|
+
extraField,
|
|
7059
|
+
bitFlag,
|
|
7060
|
+
directory,
|
|
7061
|
+
uid,
|
|
7062
|
+
gid
|
|
7063
|
+
} = entry;
|
|
7064
|
+
const entryOptions = {
|
|
7065
|
+
externalFileAttributes,
|
|
7066
|
+
versionMadeBy,
|
|
7067
|
+
comment,
|
|
7068
|
+
lastModDate,
|
|
7069
|
+
creationDate,
|
|
7070
|
+
lastAccessDate,
|
|
7071
|
+
internalFileAttributes,
|
|
7072
|
+
directory
|
|
7073
|
+
};
|
|
7074
|
+
if (bitFlag && bitFlag.languageEncodingFlag) {
|
|
7075
|
+
entryOptions[OPTION_USE_UNICODE_FILE_NAMES] = true;
|
|
7076
|
+
}
|
|
7077
|
+
const userExtraField = getUserExtraField(extraField);
|
|
7078
|
+
if (userExtraField) {
|
|
7079
|
+
entryOptions[PROPERTY_NAME_EXTRA_FIELD] = userExtraField;
|
|
7080
|
+
}
|
|
7081
|
+
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
7082
|
+
Object.assign(entryOptions, {
|
|
7083
|
+
uid,
|
|
7084
|
+
gid,
|
|
7085
|
+
unixExtraFieldType: extraFieldUnix ? UNIX_EXTRA_FIELD_TYPE : INFOZIP_EXTRA_FIELD_TYPE
|
|
7086
|
+
});
|
|
7087
|
+
}
|
|
7088
|
+
const passThroughOptions = {};
|
|
7089
|
+
if (passThrough && !directory) {
|
|
7090
|
+
Object.assign(passThroughOptions, {
|
|
7091
|
+
uncompressedSize,
|
|
7092
|
+
crc32,
|
|
7093
|
+
compressionMethod
|
|
7094
|
+
});
|
|
7095
|
+
if (passThrough !== PASS_THROUGH_COMPRESSED) {
|
|
7096
|
+
Object.assign(passThroughOptions, {
|
|
7097
|
+
encrypted,
|
|
7098
|
+
zipCrypto,
|
|
7099
|
+
encryptionStrength: extraFieldAES ? extraFieldAES.strength : UNDEFINED_VALUE
|
|
7100
|
+
});
|
|
7101
|
+
}
|
|
7102
|
+
if (bitFlag) {
|
|
7103
|
+
passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
|
|
7104
|
+
passThroughOptions[OPTION_LEVEL] = LEVEL_BY_BITFLAG_LEVEL[bitFlag.level];
|
|
7105
|
+
}
|
|
7106
|
+
if (lastModDateOverride === UNDEFINED_VALUE) {
|
|
7107
|
+
passThroughOptions.rawLastModDate = rawLastModDate;
|
|
7108
|
+
} else if (passThrough !== PASS_THROUGH_COMPRESSED && zipCrypto && (!bitFlag || bitFlag.dataDescriptor) &&
|
|
7109
|
+
lastModDateOverride instanceof Date &&
|
|
7110
|
+
getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
|
|
7111
|
+
throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
|
|
7112
|
+
}
|
|
7113
|
+
}
|
|
7114
|
+
return { entryOptions, passThroughOptions };
|
|
7115
|
+
}
|
|
7116
|
+
|
|
7117
|
+
function getDosTimeHighByte(lastModDate) {
|
|
7118
|
+
let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
|
|
7119
|
+
if (dosLastModDate < MIN_DATE) {
|
|
7120
|
+
dosLastModDate = MIN_DATE;
|
|
7121
|
+
} else if (dosLastModDate > MAX_DATE) {
|
|
7122
|
+
dosLastModDate = MAX_DATE;
|
|
7123
|
+
}
|
|
7124
|
+
return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
|
|
7125
|
+
}
|
|
7126
|
+
|
|
6737
7127
|
function resolveAttributes(zipWriter, name, options) {
|
|
6738
7128
|
let msDosCompatible = getOptionValue(zipWriter, options, PROPERTY_NAME_MS_DOS_COMPATIBLE);
|
|
6739
7129
|
let versionMadeBy = getOptionValue(zipWriter, options, PROPERTY_NAME_VERSION_MADE_BY, msDosCompatible ? VERSION_MADE_BY_MSDOS : VERSION_MADE_BY_UNIX);
|
|
@@ -6748,7 +7138,7 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6748
7138
|
checkIntegerOption(uid, MAX_32_BITS, ERR_INVALID_UID);
|
|
6749
7139
|
checkIntegerOption(gid, MAX_32_BITS, ERR_INVALID_GID);
|
|
6750
7140
|
checkIntegerOption(unixMode, MAX_16_BITS, ERR_INVALID_UNIX_MODE);
|
|
6751
|
-
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE
|
|
7141
|
+
if (unixExtraFieldType !== UNDEFINED_VALUE && unixExtraFieldType !== INFOZIP_EXTRA_FIELD_TYPE && unixExtraFieldType !== UNIX_EXTRA_FIELD_TYPE) {
|
|
6752
7142
|
throw new Error(ERR_INVALID_UNIX_EXTRA_FIELD_TYPE);
|
|
6753
7143
|
}
|
|
6754
7144
|
if (unixExtraFieldType === UNIX_EXTRA_FIELD_TYPE &&
|
|
@@ -6756,7 +7146,7 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6756
7146
|
throw new Error(ERR_INVALID_UNIX_ID_SIZE);
|
|
6757
7147
|
}
|
|
6758
7148
|
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
6759
|
-
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE
|
|
7149
|
+
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
|
|
6760
7150
|
}
|
|
6761
7151
|
let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
6762
7152
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
@@ -6887,7 +7277,9 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6887
7277
|
const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
|
|
6888
7278
|
const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
|
|
6889
7279
|
const internalFileAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, 0);
|
|
6890
|
-
const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
|
|
7280
|
+
const passThrough = checkPassThroughOption(getOptionValue(zipWriter, options, OPTION_PASS_THROUGH));
|
|
7281
|
+
const passThroughCompression = Boolean(passThrough);
|
|
7282
|
+
const passThroughEncryption = passThrough === true;
|
|
6891
7283
|
const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6892
7284
|
const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6893
7285
|
checkPasswordOption(password, rawPassword);
|
|
@@ -6903,10 +7295,11 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6903
7295
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
6904
7296
|
const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
|
|
6905
7297
|
throwIfAborted(signal);
|
|
6906
|
-
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
|
|
7298
|
+
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES,
|
|
7299
|
+
!isPrintableASCIIText(rawFilename) || !isPrintableASCIIText(rawComment));
|
|
6907
7300
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
6908
|
-
const registeredCodec =
|
|
6909
|
-
if (!
|
|
7301
|
+
const registeredCodec = passThroughCompression || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
7302
|
+
if (!passThroughCompression && compressionMethod !== UNDEFINED_VALUE &&
|
|
6910
7303
|
compressionMethod !== COMPRESSION_METHOD_STORE && compressionMethod !== COMPRESSION_METHOD_DEFLATE && !registeredCodec) {
|
|
6911
7304
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION);
|
|
6912
7305
|
}
|
|
@@ -6920,15 +7313,15 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6920
7313
|
level = 0;
|
|
6921
7314
|
}
|
|
6922
7315
|
}
|
|
6923
|
-
if (
|
|
6924
|
-
level =
|
|
7316
|
+
if (passThroughCompression) {
|
|
7317
|
+
level = toNumber(options[OPTION_LEVEL]);
|
|
6925
7318
|
}
|
|
6926
7319
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
6927
7320
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
6928
7321
|
if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
|
|
6929
7322
|
dataDescriptor = false;
|
|
6930
7323
|
}
|
|
6931
|
-
if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !
|
|
7324
|
+
if (dataDescriptor === UNDEFINED_VALUE || (zipCrypto && !passThroughEncryption)) {
|
|
6932
7325
|
dataDescriptor = true;
|
|
6933
7326
|
}
|
|
6934
7327
|
if (level !== UNDEFINED_VALUE && level != 6) {
|
|
@@ -6952,7 +7345,8 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6952
7345
|
lastAccessDate,
|
|
6953
7346
|
creationDate,
|
|
6954
7347
|
internalFileAttributes,
|
|
6955
|
-
|
|
7348
|
+
passThroughCompression,
|
|
7349
|
+
passThroughEncryption,
|
|
6956
7350
|
password,
|
|
6957
7351
|
rawPassword,
|
|
6958
7352
|
encryptionStrength,
|
|
@@ -7013,7 +7407,7 @@ function serializeExtraField(extraField) {
|
|
|
7013
7407
|
}
|
|
7014
7408
|
|
|
7015
7409
|
async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, options) {
|
|
7016
|
-
if (metadata.
|
|
7410
|
+
if (metadata.passThroughCompression && !reader && !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY)) {
|
|
7017
7411
|
throw new Error(ERR_UNDEFINED_READER);
|
|
7018
7412
|
}
|
|
7019
7413
|
let contentSize;
|
|
@@ -7029,12 +7423,12 @@ async function resolveSizes(zipWriter, reader, { resolvedOptions: metadata }, op
|
|
|
7029
7423
|
}
|
|
7030
7424
|
|
|
7031
7425
|
function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options) {
|
|
7032
|
-
const {
|
|
7426
|
+
const { passThroughCompression, passThroughEncryption, zipCrypto, password, rawPassword, encryptionStrength } = metadata;
|
|
7033
7427
|
let { dataDescriptor, zip64, level, compressionMethod } = metadata;
|
|
7034
7428
|
let maximumCompressedSize = 0;
|
|
7035
7429
|
let uncompressedSize = 0;
|
|
7036
7430
|
let unknownSize = false;
|
|
7037
|
-
if (
|
|
7431
|
+
if (passThroughCompression && hasContent) {
|
|
7038
7432
|
uncompressedSize = options[PROPERTY_NAME_UNCOMPRESSED_SIZE];
|
|
7039
7433
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
7040
7434
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
@@ -7045,17 +7439,17 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
|
|
|
7045
7439
|
}
|
|
7046
7440
|
const zip64Enabled = zip64 === true;
|
|
7047
7441
|
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
7048
|
-
if (hasContent &&
|
|
7442
|
+
if (hasContent && passThroughEncryption && !encrypted && getLength(password, rawPassword)) {
|
|
7049
7443
|
throw new Error(ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH);
|
|
7050
7444
|
}
|
|
7051
|
-
const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (
|
|
7445
|
+
const encryptedEntry = hasContent && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThroughEncryption && encrypted));
|
|
7052
7446
|
if (!hasContent) {
|
|
7053
7447
|
level = 0;
|
|
7054
7448
|
compressionMethod = COMPRESSION_METHOD_STORE;
|
|
7055
7449
|
}
|
|
7056
|
-
const encryptionOverhead = encryptedEntry
|
|
7450
|
+
const encryptionOverhead = getEncryptionOverhead(encryptedEntry, zipCrypto, encryptionStrength);
|
|
7057
7451
|
if (hasContent) {
|
|
7058
|
-
if (!
|
|
7452
|
+
if (!passThroughCompression) {
|
|
7059
7453
|
if (contentSize === UNDEFINED_VALUE) {
|
|
7060
7454
|
dataDescriptor = true;
|
|
7061
7455
|
if (zip64 || zip64 === UNDEFINED_VALUE) {
|
|
@@ -7068,10 +7462,12 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
|
|
|
7068
7462
|
}
|
|
7069
7463
|
} else {
|
|
7070
7464
|
options.uncompressedSize = uncompressedSize;
|
|
7071
|
-
maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
|
|
7465
|
+
maximumCompressedSize = contentSize === UNDEFINED_VALUE ?
|
|
7466
|
+
getMaximumCompressedSize(uncompressedSize) + encryptionOverhead :
|
|
7467
|
+
contentSize + (passThroughEncryption ? 0 : encryptionOverhead);
|
|
7072
7468
|
}
|
|
7073
7469
|
}
|
|
7074
|
-
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !
|
|
7470
|
+
const emptyEntry = !encryptedEntry && (!hasContent || (contentSize === 0 && !passThroughCompression)) && !isCompressed(compressionMethod, level);
|
|
7075
7471
|
if (emptyEntry && !zipCrypto && getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR) === UNDEFINED_VALUE) {
|
|
7076
7472
|
dataDescriptor = false;
|
|
7077
7473
|
}
|
|
@@ -7120,6 +7516,8 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
7120
7516
|
const initialOffset = writerOptions[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : writerOptions[OPTION_OFFSET];
|
|
7121
7517
|
let offset = initialOffset;
|
|
7122
7518
|
let minimumEntrySize = INFINITY_VALUE;
|
|
7519
|
+
const entrySizes = [];
|
|
7520
|
+
const entriesAlreadyZip64 = new Set();
|
|
7123
7521
|
for (const entry of entries) {
|
|
7124
7522
|
let { name } = entry;
|
|
7125
7523
|
const { size } = entry;
|
|
@@ -7131,7 +7529,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
7131
7529
|
({ name } = attributesInfo);
|
|
7132
7530
|
const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
|
|
7133
7531
|
if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
|
|
7134
|
-
!metadata.
|
|
7532
|
+
!metadata.passThroughCompression && !(await supportsDeflate(getConfiguration()))) {
|
|
7135
7533
|
metadata.level = 0;
|
|
7136
7534
|
}
|
|
7137
7535
|
const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
|
|
@@ -7139,7 +7537,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
7139
7537
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7140
7538
|
}
|
|
7141
7539
|
const { maximumCompressedSize, resolvedOptions: sizes } = resolveEntrySizes(zipWriter, hasContent, size, metadata, options);
|
|
7142
|
-
if (hasContent && !metadata.
|
|
7540
|
+
if (hasContent && !metadata.passThroughCompression && isCompressed(sizes.compressionMethod, sizes.level)) {
|
|
7143
7541
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7144
7542
|
}
|
|
7145
7543
|
const entryOptions = Object.assign({}, options, attributesInfo.resolvedOptions, metadata, sizes, { [OPTION_USDZ]: usdz });
|
|
@@ -7159,10 +7557,15 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
7159
7557
|
compressedSize
|
|
7160
7558
|
}));
|
|
7161
7559
|
const entrySize = entryInfo.metadataSize + compressedSize;
|
|
7560
|
+
entrySizes.push(entrySize);
|
|
7561
|
+
entriesAlreadyZip64.add(Boolean(entryOptions.zip64Enabled ||
|
|
7562
|
+
entryOptions.uncompressedSize >= MAX_32_BITS || compressedSize >= MAX_32_BITS));
|
|
7162
7563
|
minimumEntrySize = Math.min(minimumEntrySize, entrySize);
|
|
7163
7564
|
offset += entrySize;
|
|
7164
7565
|
}
|
|
7165
|
-
const layoutDependsOnWriteOrder = files.size > 1 && (usdz ||
|
|
7566
|
+
const layoutDependsOnWriteOrder = files.size > 1 && (usdz ||
|
|
7567
|
+
(offset - minimumEntrySize >= MAX_32_BITS &&
|
|
7568
|
+
(entriesAlreadyZip64.size > 1 || countEntriesBefore4GB(entrySizes, initialOffset, true) != countEntriesBefore4GB(entrySizes, initialOffset, false))));
|
|
7166
7569
|
if (layoutDependsOnWriteOrder && !writeOrderGuaranteed) {
|
|
7167
7570
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
7168
7571
|
}
|
|
@@ -7180,6 +7583,20 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
7180
7583
|
return offset - initialOffset + directoryDataLength + commentLength + (zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
|
|
7181
7584
|
}
|
|
7182
7585
|
|
|
7586
|
+
function countEntriesBefore4GB(entrySizes, initialOffset, largestFirst) {
|
|
7587
|
+
const ordered = entrySizes.slice().sort((first, second) => largestFirst ? second - first : first - second);
|
|
7588
|
+
let position = initialOffset;
|
|
7589
|
+
let count = 0;
|
|
7590
|
+
for (const entrySize of ordered) {
|
|
7591
|
+
if (position >= MAX_32_BITS) {
|
|
7592
|
+
break;
|
|
7593
|
+
}
|
|
7594
|
+
position += entrySize;
|
|
7595
|
+
count++;
|
|
7596
|
+
}
|
|
7597
|
+
return count;
|
|
7598
|
+
}
|
|
7599
|
+
|
|
7183
7600
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
7184
7601
|
const {
|
|
7185
7602
|
fileEntries,
|
|
@@ -7355,6 +7772,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7355
7772
|
localExtraFieldZip64Length,
|
|
7356
7773
|
rawExtraFieldExtendedTimestamp,
|
|
7357
7774
|
extraFieldExtendedTimestampFlag,
|
|
7775
|
+
extraFieldExtendedTimestampTime,
|
|
7358
7776
|
rawExtraFieldNTFS,
|
|
7359
7777
|
rawExtraFieldUnix,
|
|
7360
7778
|
rawExtraFieldAES,
|
|
@@ -7367,6 +7785,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7367
7785
|
password,
|
|
7368
7786
|
rawPassword,
|
|
7369
7787
|
level,
|
|
7788
|
+
useUnicodeFileNames,
|
|
7370
7789
|
zip64,
|
|
7371
7790
|
zip64Enabled,
|
|
7372
7791
|
zip64UncompressedSize,
|
|
@@ -7401,7 +7820,8 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7401
7820
|
msdosAttributesRaw,
|
|
7402
7821
|
msdosAttributes,
|
|
7403
7822
|
useCompressionStream,
|
|
7404
|
-
|
|
7823
|
+
passThroughCompression,
|
|
7824
|
+
passThroughEncryption,
|
|
7405
7825
|
format,
|
|
7406
7826
|
codecURI
|
|
7407
7827
|
} = options;
|
|
@@ -7412,9 +7832,9 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7412
7832
|
zip64Enabled,
|
|
7413
7833
|
directory: Boolean(directory),
|
|
7414
7834
|
executable: Boolean(executable),
|
|
7415
|
-
filenameUTF8:
|
|
7835
|
+
filenameUTF8: Boolean(useUnicodeFileNames),
|
|
7416
7836
|
rawFilename,
|
|
7417
|
-
commentUTF8:
|
|
7837
|
+
commentUTF8: Boolean(useUnicodeFileNames),
|
|
7418
7838
|
rawComment,
|
|
7419
7839
|
rawExtraFieldZip64,
|
|
7420
7840
|
localExtraFieldZip64Length,
|
|
@@ -7445,7 +7865,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7445
7865
|
uncompressedSize
|
|
7446
7866
|
} = options;
|
|
7447
7867
|
let compressedSize = 0;
|
|
7448
|
-
if (!
|
|
7868
|
+
if (!passThroughCompression) {
|
|
7449
7869
|
uncompressedSize = 0;
|
|
7450
7870
|
}
|
|
7451
7871
|
const { writable } = writer;
|
|
@@ -7462,9 +7882,9 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7462
7882
|
encryptionStrength,
|
|
7463
7883
|
zipCrypto: encrypted && zipCrypto,
|
|
7464
7884
|
passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & MAX_8_BITS,
|
|
7465
|
-
computeCrc32: !
|
|
7466
|
-
compressed: compressed && !
|
|
7467
|
-
encrypted: encrypted && !
|
|
7885
|
+
computeCrc32: !passThroughCompression,
|
|
7886
|
+
compressed: compressed && !passThroughCompression,
|
|
7887
|
+
encrypted: encrypted && !passThroughEncryption,
|
|
7468
7888
|
useWebWorkers,
|
|
7469
7889
|
useCompressionStream,
|
|
7470
7890
|
transferStreams,
|
|
@@ -7479,7 +7899,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7479
7899
|
const result = await runWorker({ readable, writable }, workerOptions);
|
|
7480
7900
|
compressedSize = result.outputSize;
|
|
7481
7901
|
writer.size += compressedSize;
|
|
7482
|
-
if (!
|
|
7902
|
+
if (!passThroughCompression) {
|
|
7483
7903
|
uncompressedSize = result.inputSize;
|
|
7484
7904
|
if (!encrypted || zipCrypto) {
|
|
7485
7905
|
crc32 = result.crc32;
|
|
@@ -7490,7 +7910,10 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7490
7910
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
7491
7911
|
}
|
|
7492
7912
|
} catch (error) {
|
|
7493
|
-
|
|
7913
|
+
const { outputSize: failedOutputSize } = workerOptions;
|
|
7914
|
+
if (failedOutputSize !== UNDEFINED_VALUE) {
|
|
7915
|
+
writer.size += failedOutputSize;
|
|
7916
|
+
} else if (isErrorObject(error) && error.outputSize !== UNDEFINED_VALUE) {
|
|
7494
7917
|
writer.size += error.outputSize;
|
|
7495
7918
|
}
|
|
7496
7919
|
throw error;
|
|
@@ -7522,8 +7945,9 @@ async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry
|
|
|
7522
7945
|
headerArray,
|
|
7523
7946
|
headerView,
|
|
7524
7947
|
signature: crc32,
|
|
7525
|
-
crc32: encrypted && !zipCrypto && !
|
|
7948
|
+
crc32: encrypted && !zipCrypto && !passThroughCompression ? UNDEFINED_VALUE : crc32,
|
|
7526
7949
|
extraFieldExtendedTimestampFlag,
|
|
7950
|
+
extraFieldExtendedTimestampTime,
|
|
7527
7951
|
zip64UncompressedSize,
|
|
7528
7952
|
zip64CompressedSize
|
|
7529
7953
|
});
|
|
@@ -7548,7 +7972,7 @@ function getHeaderInfo(options) {
|
|
|
7548
7972
|
encryptionStrength,
|
|
7549
7973
|
extendedTimestamp,
|
|
7550
7974
|
ntfsTimestamp,
|
|
7551
|
-
|
|
7975
|
+
passThroughCompression,
|
|
7552
7976
|
encrypted,
|
|
7553
7977
|
zip64UncompressedSize,
|
|
7554
7978
|
zip64CompressedSize,
|
|
@@ -7559,7 +7983,7 @@ function getHeaderInfo(options) {
|
|
|
7559
7983
|
let { version, compressionMethod } = options;
|
|
7560
7984
|
const compressed = !directory && isCompressed(compressionMethod, level);
|
|
7561
7985
|
let rawLocalExtraFieldZip64;
|
|
7562
|
-
const uncompressedFile =
|
|
7986
|
+
const uncompressedFile = passThroughCompression || !compressed;
|
|
7563
7987
|
const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || (uncompressedFile && !unknownSize)));
|
|
7564
7988
|
const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
|
|
7565
7989
|
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
@@ -7571,8 +7995,8 @@ function getHeaderInfo(options) {
|
|
|
7571
7995
|
if (zip64ExtraFieldComplete) {
|
|
7572
7996
|
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7573
7997
|
if (uncompressedFile) {
|
|
7574
|
-
const encryptionOverhead = encrypted
|
|
7575
|
-
extraFieldZip64.writeUint64(
|
|
7998
|
+
const encryptionOverhead = getEncryptionOverhead(encrypted, zipCrypto, encryptionStrength);
|
|
7999
|
+
extraFieldZip64.writeUint64(passThroughCompression ? 0 : uncompressedSize + encryptionOverhead);
|
|
7576
8000
|
}
|
|
7577
8001
|
}
|
|
7578
8002
|
} else {
|
|
@@ -7591,6 +8015,7 @@ function getHeaderInfo(options) {
|
|
|
7591
8015
|
let rawExtraFieldNTFS;
|
|
7592
8016
|
let rawExtraFieldExtendedTimestamp;
|
|
7593
8017
|
let extraFieldExtendedTimestampFlag;
|
|
8018
|
+
let extraFieldExtendedTimestampTime;
|
|
7594
8019
|
if (extendedTimestamp) {
|
|
7595
8020
|
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
7596
8021
|
const lastModTimeUnixInRange = inUnixTimeRange(lastModTimeUnix);
|
|
@@ -7598,6 +8023,7 @@ function getHeaderInfo(options) {
|
|
|
7598
8023
|
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
7599
8024
|
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
7600
8025
|
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
8026
|
+
extraFieldExtendedTimestampTime = lastModTimeUnix;
|
|
7601
8027
|
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7602
8028
|
extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
|
|
7603
8029
|
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
@@ -7640,7 +8066,7 @@ function getHeaderInfo(options) {
|
|
|
7640
8066
|
let rawExtraFieldUnix;
|
|
7641
8067
|
try {
|
|
7642
8068
|
const { uid, gid, unixExtraFieldType } = options;
|
|
7643
|
-
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE
|
|
8069
|
+
if (unixExtraFieldType == INFOZIP_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
7644
8070
|
const uidBytes = packUnixId(uid === UNDEFINED_VALUE ? 0 : uid);
|
|
7645
8071
|
const gidBytes = packUnixId(gid === UNDEFINED_VALUE ? 0 : gid);
|
|
7646
8072
|
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
@@ -7681,7 +8107,7 @@ function getHeaderInfo(options) {
|
|
|
7681
8107
|
}
|
|
7682
8108
|
if (encrypted && !zipCrypto) {
|
|
7683
8109
|
version = version > VERSION_AES ? version : VERSION_AES;
|
|
7684
|
-
if (
|
|
8110
|
+
if (passThroughCompression && crc32 !== UNDEFINED_VALUE) {
|
|
7685
8111
|
rawExtraFieldAES[EXTRAFIELD_OFFSET_AES_VENDOR_VERSION] = VENDOR_VERSION_AE_1;
|
|
7686
8112
|
}
|
|
7687
8113
|
setUint16(getDataView(rawExtraFieldAES), EXTRAFIELD_OFFSET_AES_COMPRESSION_METHOD, compressionMethod);
|
|
@@ -7743,12 +8169,14 @@ function getHeaderInfo(options) {
|
|
|
7743
8169
|
headerArray,
|
|
7744
8170
|
headerView,
|
|
7745
8171
|
lastModDate: storedLastModDate,
|
|
8172
|
+
lastModDateClamped: storedLastModDate === clampedLastModDate && dosLastModDate.getTime() != clampedLastModDate.getTime(),
|
|
7746
8173
|
rawLastModDate,
|
|
7747
8174
|
encrypted,
|
|
7748
8175
|
compressed,
|
|
7749
8176
|
version,
|
|
7750
8177
|
compressionMethod,
|
|
7751
8178
|
extraFieldExtendedTimestampFlag,
|
|
8179
|
+
extraFieldExtendedTimestampTime,
|
|
7752
8180
|
rawExtraFieldZip64: EMPTY_UINT8_ARRAY,
|
|
7753
8181
|
localExtraFieldZip64Length,
|
|
7754
8182
|
rawExtraFieldExtendedTimestamp,
|
|
@@ -7851,7 +8279,7 @@ function setEntryInfo({
|
|
|
7851
8279
|
}, {
|
|
7852
8280
|
zip64,
|
|
7853
8281
|
zipCrypto,
|
|
7854
|
-
|
|
8282
|
+
passThroughCompression,
|
|
7855
8283
|
dataDescriptor
|
|
7856
8284
|
}) {
|
|
7857
8285
|
const {
|
|
@@ -7862,7 +8290,7 @@ function setEntryInfo({
|
|
|
7862
8290
|
dataDescriptorView,
|
|
7863
8291
|
dataDescriptorOffset
|
|
7864
8292
|
} = dataDescriptorInfo;
|
|
7865
|
-
if ((!encrypted || zipCrypto ||
|
|
8293
|
+
if ((!encrypted || zipCrypto || passThroughCompression) && crc32 !== UNDEFINED_VALUE) {
|
|
7866
8294
|
setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
|
|
7867
8295
|
if (dataDescriptor) {
|
|
7868
8296
|
setUint32(dataDescriptorView, dataDescriptorOffset, crc32);
|
|
@@ -7893,9 +8321,9 @@ function updateLocalHeader({
|
|
|
7893
8321
|
uncompressedSize,
|
|
7894
8322
|
zip64UncompressedSize,
|
|
7895
8323
|
zip64CompressedSize
|
|
7896
|
-
}, localHeaderView, { dataDescriptor,
|
|
8324
|
+
}, localHeaderView, { dataDescriptor, passThroughCompression }) {
|
|
7897
8325
|
if (!dataDescriptor) {
|
|
7898
|
-
if (!encrypted || (
|
|
8326
|
+
if (!encrypted || (passThroughCompression && crc32 !== UNDEFINED_VALUE)) {
|
|
7899
8327
|
setUint32(localHeaderView, HEADER_OFFSET_SIGNATURE + LOCAL_HEADER_COMMON_OFFSET, crc32);
|
|
7900
8328
|
}
|
|
7901
8329
|
if (!zip64CompressedSize) {
|
|
@@ -7932,9 +8360,8 @@ function createDirectoryRecords(files) {
|
|
|
7932
8360
|
rawExtraFieldUnix,
|
|
7933
8361
|
rawExtraField,
|
|
7934
8362
|
rawCentralExtraField,
|
|
7935
|
-
extendedTimestamp,
|
|
7936
8363
|
extraFieldExtendedTimestampFlag,
|
|
7937
|
-
|
|
8364
|
+
extraFieldExtendedTimestampTime,
|
|
7938
8365
|
zip64Enabled,
|
|
7939
8366
|
uncompressedSize,
|
|
7940
8367
|
compressedSize
|
|
@@ -7977,16 +8404,15 @@ function createDirectoryRecords(files) {
|
|
|
7977
8404
|
fileEntry.zip64Offset = zip64Offset;
|
|
7978
8405
|
fileEntry.zip64DiskNumberStart = zip64DiskNumberStart;
|
|
7979
8406
|
let rawExtraFieldTimestamp;
|
|
7980
|
-
|
|
7981
|
-
|
|
8407
|
+
if (extraFieldExtendedTimestampTime === UNDEFINED_VALUE) {
|
|
8408
|
+
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
8409
|
+
} else {
|
|
7982
8410
|
const extraFieldTimestamp = createRecordWriter(9);
|
|
7983
8411
|
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7984
8412
|
extraFieldTimestamp.writeUint16(5);
|
|
7985
8413
|
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7986
|
-
extraFieldTimestamp.writeUint32(
|
|
8414
|
+
extraFieldTimestamp.writeUint32(extraFieldExtendedTimestampTime);
|
|
7987
8415
|
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
7988
|
-
} else {
|
|
7989
|
-
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
7990
8416
|
}
|
|
7991
8417
|
fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
|
|
7992
8418
|
const extraFieldLength = getLength(
|
|
@@ -8486,6 +8912,11 @@ function getHeaderArrayData({
|
|
|
8486
8912
|
};
|
|
8487
8913
|
}
|
|
8488
8914
|
|
|
8915
|
+
function isPrintableASCIIText(rawText) {
|
|
8916
|
+
return rawText.every(characterCode =>
|
|
8917
|
+
characterCode >= MIN_PRINTABLE_ASCII_CHARACTER_CODE && characterCode <= MAX_PRINTABLE_ASCII_CHARACTER_CODE);
|
|
8918
|
+
}
|
|
8919
|
+
|
|
8489
8920
|
function getBitFlag(level, useUnicodeFileNames, dataDescriptor, encrypted, compressionMethod) {
|
|
8490
8921
|
let bitFlag = 0;
|
|
8491
8922
|
if (useUnicodeFileNames) {
|
|
@@ -8647,7 +9078,7 @@ function formatSupported(StreamClass, format) {
|
|
|
8647
9078
|
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
8648
9079
|
*/
|
|
8649
9080
|
|
|
8650
|
-
const VERSION = "2.
|
|
9081
|
+
const VERSION = "2.13.0";
|
|
8651
9082
|
|
|
8652
9083
|
/*
|
|
8653
9084
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -9469,9 +9900,9 @@ setDefaultConfiguration({
|
|
|
9469
9900
|
DecompressionStreamFallback: DecompressionStreamZlib
|
|
9470
9901
|
});
|
|
9471
9902
|
|
|
9472
|
-
function terminateWorkersAndModule() {
|
|
9903
|
+
async function terminateWorkersAndModule() {
|
|
9904
|
+
await terminateWorkers();
|
|
9473
9905
|
modulePromise = null;
|
|
9474
|
-
terminateWorkers();
|
|
9475
9906
|
resetWasmModule();
|
|
9476
9907
|
}
|
|
9477
9908
|
|
|
@@ -9538,7 +9969,10 @@ s(setDefaultConfiguration);
|
|
|
9538
9969
|
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
9539
9970
|
const ERR_DUPLICATE_IMPORTED_ENTRY = "Duplicate entry filename in the imported zip file";
|
|
9540
9971
|
const ERR_INVALID_DUPLICATES = "Invalid duplicates option (must be \"throw\", \"keep-first\" or \"keep-last\")";
|
|
9541
|
-
const ERR_ANCESTOR_ENTRY = "Entry is
|
|
9972
|
+
const ERR_ANCESTOR_ENTRY = "Entry is an ancestor of target entry";
|
|
9973
|
+
const ERR_ROOT_DIRECTORY_NOT_MOVABLE = "Root directory cannot be moved";
|
|
9974
|
+
const ERR_TARGET_NOT_DIRECTORY = "Target entry is not a directory";
|
|
9975
|
+
const ERR_PARENT_NOT_DIRECTORY = "Parent entry is not a directory";
|
|
9542
9976
|
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
9543
9977
|
const DUPLICATES_THROW = "throw";
|
|
9544
9978
|
const DUPLICATES_KEEP_FIRST = "keep-first";
|
|
@@ -9546,22 +9980,8 @@ const DUPLICATES_KEEP_LAST = "keep-last";
|
|
|
9546
9980
|
const DUPLICATES_VALUES = new Set([DUPLICATES_THROW, DUPLICATES_KEEP_FIRST, DUPLICATES_KEEP_LAST]);
|
|
9547
9981
|
const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
|
|
9548
9982
|
const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
|
|
9549
|
-
const
|
|
9983
|
+
const ERR_UNSUPPORTED_PASS_THROUGH_VALUE = "The 'compressed' passThrough option is only supported by Entry#getData() and ZipWriter#add()";
|
|
9550
9984
|
const ERR_ABORT_EXPORT = "zipjs-abort-export";
|
|
9551
|
-
const INFOZIP_EXTRA_FIELD_TYPE = "infozip";
|
|
9552
|
-
const INTERPRETED_EXTRA_FIELD_TYPES = new Set([
|
|
9553
|
-
EXTRAFIELD_TYPE_ZIP64,
|
|
9554
|
-
EXTRAFIELD_TYPE_AES,
|
|
9555
|
-
EXTRAFIELD_TYPE_NTFS,
|
|
9556
|
-
EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP,
|
|
9557
|
-
EXTRAFIELD_TYPE_UNICODE_PATH,
|
|
9558
|
-
EXTRAFIELD_TYPE_UNICODE_COMMENT,
|
|
9559
|
-
EXTRAFIELD_TYPE_USDZ,
|
|
9560
|
-
EXTRAFIELD_TYPE_INFOZIP,
|
|
9561
|
-
EXTRAFIELD_TYPE_UNIX,
|
|
9562
|
-
EXTRAFIELD_TYPE_UNIX_TYPE1,
|
|
9563
|
-
EXTRAFIELD_TYPE_PKWARE_UNIX
|
|
9564
|
-
]);
|
|
9565
9985
|
|
|
9566
9986
|
class ZipEntry {
|
|
9567
9987
|
|
|
@@ -9693,7 +10113,7 @@ class ZipFileEntry extends ZipEntry {
|
|
|
9693
10113
|
}));
|
|
9694
10114
|
return true;
|
|
9695
10115
|
} catch (error) {
|
|
9696
|
-
if (error.message == ERR_INVALID_PASSWORD) {
|
|
10116
|
+
if (isErrorObject(error) && error.message == ERR_INVALID_PASSWORD) {
|
|
9697
10117
|
return false;
|
|
9698
10118
|
} else {
|
|
9699
10119
|
throw error;
|
|
@@ -9933,6 +10353,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
9933
10353
|
await initStream(reader);
|
|
9934
10354
|
zipReader = new ZipReader(reader, options);
|
|
9935
10355
|
}
|
|
10356
|
+
checkPassThroughValue(options.passThrough);
|
|
9936
10357
|
const duplicates = checkDuplicatesOption(options.duplicates);
|
|
9937
10358
|
const importedEntries = [];
|
|
9938
10359
|
const entries = await zipReader.getEntries(options);
|
|
@@ -10023,18 +10444,25 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
10023
10444
|
|
|
10024
10445
|
async exportZip(writer, options = {}) {
|
|
10025
10446
|
const zipEntry = this;
|
|
10447
|
+
const zipWriterProvided = Boolean(writer) && typeof writer.add == FUNCTION_TYPE;
|
|
10026
10448
|
options = Object.assign({}, options);
|
|
10027
|
-
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
10449
|
+
if (!zipWriterProvided && options.bufferedWrite === UNDEFINED_VALUE) {
|
|
10028
10450
|
options.bufferedWrite = true;
|
|
10029
10451
|
}
|
|
10030
|
-
const [readers] = await Promise.all([
|
|
10031
|
-
|
|
10452
|
+
const [readers] = await Promise.all([
|
|
10453
|
+
initReaders(zipEntry, checkReaderOptions(options.readerOptions)),
|
|
10454
|
+
zipWriterProvided ? UNDEFINED_VALUE : initStream(writer)
|
|
10455
|
+
]);
|
|
10456
|
+
const zipWriter = zipWriterProvided ? writer : new ZipWriter(writer, options);
|
|
10032
10457
|
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
|
|
10458
|
+
if (zipWriterProvided) {
|
|
10459
|
+
return zipWriter;
|
|
10460
|
+
}
|
|
10033
10461
|
await zipWriter.close(options.globalComment);
|
|
10034
10462
|
return writer.getData ? writer.getData() : writer.writable;
|
|
10035
10463
|
}
|
|
10036
10464
|
|
|
10037
|
-
getExportedSize(options = {}) {
|
|
10465
|
+
async getExportedSize(options = {}) {
|
|
10038
10466
|
const zipEntry = this;
|
|
10039
10467
|
options = Object.assign({}, options);
|
|
10040
10468
|
checkReaderOptions(options.readerOptions);
|
|
@@ -10049,7 +10477,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
10049
10477
|
const writeOrderGuaranteed = !options.bufferedWrite ||
|
|
10050
10478
|
(entries.every(entry => entry.options.keepOrder !== false) &&
|
|
10051
10479
|
children.every(child => isImplicitDirectory(child) || !child.children.length));
|
|
10052
|
-
return getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
|
|
10480
|
+
return await getEntriesSize(options, entries, writeOrderGuaranteed, options.globalComment);
|
|
10053
10481
|
}
|
|
10054
10482
|
|
|
10055
10483
|
getChildByName(name) {
|
|
@@ -10110,7 +10538,7 @@ class ZipFS {
|
|
|
10110
10538
|
|
|
10111
10539
|
move(entry, destination) {
|
|
10112
10540
|
if (entry == this.root) {
|
|
10113
|
-
throw new Error(
|
|
10541
|
+
throw new Error(ERR_ROOT_DIRECTORY_NOT_MOVABLE);
|
|
10114
10542
|
} else {
|
|
10115
10543
|
if (destination.directory) {
|
|
10116
10544
|
if (!destination.isDescendantOf(entry)) {
|
|
@@ -10131,7 +10559,7 @@ class ZipFS {
|
|
|
10131
10559
|
throw new Error(ERR_ANCESTOR_ENTRY);
|
|
10132
10560
|
}
|
|
10133
10561
|
} else {
|
|
10134
|
-
throw new Error(
|
|
10562
|
+
throw new Error(ERR_TARGET_NOT_DIRECTORY);
|
|
10135
10563
|
}
|
|
10136
10564
|
}
|
|
10137
10565
|
}
|
|
@@ -10444,70 +10872,11 @@ function getChildEntryOptions(child, selectedEntry, options) {
|
|
|
10444
10872
|
let zipEntryMetadata = {};
|
|
10445
10873
|
let passThroughOptions = {};
|
|
10446
10874
|
if (child.data instanceof Entry) {
|
|
10447
|
-
const
|
|
10448
|
-
|
|
10449
|
-
|
|
10450
|
-
|
|
10451
|
-
|
|
10452
|
-
rawLastModDate,
|
|
10453
|
-
creationDate,
|
|
10454
|
-
lastAccessDate,
|
|
10455
|
-
uncompressedSize,
|
|
10456
|
-
encrypted,
|
|
10457
|
-
zipCrypto,
|
|
10458
|
-
crc32,
|
|
10459
|
-
compressionMethod,
|
|
10460
|
-
extraFieldAES,
|
|
10461
|
-
internalFileAttributes,
|
|
10462
|
-
extraField,
|
|
10463
|
-
bitFlag,
|
|
10464
|
-
uid,
|
|
10465
|
-
gid
|
|
10466
|
-
} = child.data;
|
|
10467
|
-
zipEntryMetadata = {
|
|
10468
|
-
externalFileAttributes,
|
|
10469
|
-
versionMadeBy,
|
|
10470
|
-
comment,
|
|
10471
|
-
lastModDate,
|
|
10472
|
-
creationDate,
|
|
10473
|
-
lastAccessDate,
|
|
10474
|
-
internalFileAttributes
|
|
10475
|
-
};
|
|
10476
|
-
const userExtraField = getUserExtraField(extraField);
|
|
10477
|
-
if (userExtraField) {
|
|
10478
|
-
zipEntryMetadata.extraField = userExtraField;
|
|
10479
|
-
}
|
|
10480
|
-
if (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE) {
|
|
10481
|
-
Object.assign(zipEntryMetadata, {
|
|
10482
|
-
uid,
|
|
10483
|
-
gid,
|
|
10484
|
-
unixExtraFieldType: INFOZIP_EXTRA_FIELD_TYPE
|
|
10485
|
-
});
|
|
10486
|
-
}
|
|
10487
|
-
if (isPassThrough(child, options)) {
|
|
10488
|
-
let encryptionStrength;
|
|
10489
|
-
if (extraFieldAES) {
|
|
10490
|
-
encryptionStrength = extraFieldAES.strength;
|
|
10491
|
-
}
|
|
10492
|
-
passThroughOptions = {
|
|
10493
|
-
passThrough: true,
|
|
10494
|
-
encrypted,
|
|
10495
|
-
zipCrypto,
|
|
10496
|
-
crc32,
|
|
10497
|
-
uncompressedSize,
|
|
10498
|
-
encryptionStrength,
|
|
10499
|
-
compressionMethod
|
|
10500
|
-
};
|
|
10501
|
-
if (bitFlag) {
|
|
10502
|
-
passThroughOptions.dataDescriptor = bitFlag.dataDescriptor;
|
|
10503
|
-
}
|
|
10504
|
-
const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
|
|
10505
|
-
if (lastModDateOverride === UNDEFINED_VALUE) {
|
|
10506
|
-
passThroughOptions.rawLastModDate = rawLastModDate;
|
|
10507
|
-
} else if (zipCrypto && (!bitFlag || bitFlag.dataDescriptor) && lastModDateOverride instanceof Date &&
|
|
10508
|
-
getDosTimeHighByte(lastModDateOverride) != ((rawLastModDate >>> 8) & MAX_8_BITS)) {
|
|
10509
|
-
throw new Error(ERR_ZIP_CRYPTO_LAST_MOD_DATE);
|
|
10510
|
-
}
|
|
10875
|
+
const passThrough = isPassThrough(child, options);
|
|
10876
|
+
const lastModDateOverride = childOptions.lastModDate === UNDEFINED_VALUE ? options.lastModDate : childOptions.lastModDate;
|
|
10877
|
+
({ entryOptions: zipEntryMetadata, passThroughOptions } = getSourceEntryOptions(child.data, passThrough, lastModDateOverride));
|
|
10878
|
+
if (passThrough) {
|
|
10879
|
+
passThroughOptions.passThrough = true;
|
|
10511
10880
|
}
|
|
10512
10881
|
}
|
|
10513
10882
|
const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
|
|
@@ -10517,16 +10886,6 @@ function getChildEntryOptions(child, selectedEntry, options) {
|
|
|
10517
10886
|
return { name, entryOptions };
|
|
10518
10887
|
}
|
|
10519
10888
|
|
|
10520
|
-
function getDosTimeHighByte(lastModDate) {
|
|
10521
|
-
let dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
|
|
10522
|
-
if (dosLastModDate < MIN_DATE) {
|
|
10523
|
-
dosLastModDate = MIN_DATE;
|
|
10524
|
-
} else if (dosLastModDate > MAX_DATE) {
|
|
10525
|
-
dosLastModDate = MAX_DATE;
|
|
10526
|
-
}
|
|
10527
|
-
return ((dosLastModDate.getHours() << 3) | (dosLastModDate.getMinutes() >> 3)) & MAX_8_BITS;
|
|
10528
|
-
}
|
|
10529
|
-
|
|
10530
10889
|
function getDeterminedSize(child, passThrough) {
|
|
10531
10890
|
const { reader } = child;
|
|
10532
10891
|
if (reader && reader.size !== UNDEFINED_VALUE) {
|
|
@@ -10539,9 +10898,18 @@ function checkReaderOptions(readerOptions) {
|
|
|
10539
10898
|
if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
|
|
10540
10899
|
throw new Error(ERR_INVALID_READER_OPTIONS);
|
|
10541
10900
|
}
|
|
10901
|
+
if (readerOptions) {
|
|
10902
|
+
checkPassThroughValue(readerOptions.passThrough);
|
|
10903
|
+
}
|
|
10542
10904
|
return readerOptions;
|
|
10543
10905
|
}
|
|
10544
10906
|
|
|
10907
|
+
function checkPassThroughValue(passThrough) {
|
|
10908
|
+
if (checkPassThroughOption(passThrough) === PASS_THROUGH_COMPRESSED) {
|
|
10909
|
+
throw new Error(ERR_UNSUPPORTED_PASS_THROUGH_VALUE);
|
|
10910
|
+
}
|
|
10911
|
+
}
|
|
10912
|
+
|
|
10545
10913
|
function replaceContent(zipEntry, params) {
|
|
10546
10914
|
const { uncompressedSize } = params;
|
|
10547
10915
|
Object.assign(zipEntry, params, {
|
|
@@ -10570,20 +10938,6 @@ function isImplicitDirectory(child) {
|
|
|
10570
10938
|
return child.directory && child.data === null;
|
|
10571
10939
|
}
|
|
10572
10940
|
|
|
10573
|
-
function getUserExtraField(extraField) {
|
|
10574
|
-
if (extraField) {
|
|
10575
|
-
const userExtraField = new Map();
|
|
10576
|
-
extraField.forEach((field, type) => {
|
|
10577
|
-
if (!INTERPRETED_EXTRA_FIELD_TYPES.has(type)) {
|
|
10578
|
-
userExtraField.set(type, field.data);
|
|
10579
|
-
}
|
|
10580
|
-
});
|
|
10581
|
-
if (userExtraField.size) {
|
|
10582
|
-
return userExtraField;
|
|
10583
|
-
}
|
|
10584
|
-
}
|
|
10585
|
-
}
|
|
10586
|
-
|
|
10587
10941
|
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
10588
10942
|
const { onstart, onprogress, onend, onentryprogress } = options;
|
|
10589
10943
|
const selectedEntry = entry;
|
|
@@ -10686,6 +11040,7 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
10686
11040
|
|
|
10687
11041
|
async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
10688
11042
|
const { onstart, onprogress, onend } = options;
|
|
11043
|
+
checkPassThroughValue(options.passThrough);
|
|
10689
11044
|
const readerOptions = checkReaderOptions(options.readerOptions);
|
|
10690
11045
|
const abortController = new AbortController();
|
|
10691
11046
|
const { signal } = abortController;
|
|
@@ -10761,7 +11116,7 @@ async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
|
10761
11116
|
if (exportAborted || isExportAborted(signal.reason)) {
|
|
10762
11117
|
return;
|
|
10763
11118
|
}
|
|
10764
|
-
|
|
11119
|
+
throwIfAborted(signal);
|
|
10765
11120
|
}
|
|
10766
11121
|
try {
|
|
10767
11122
|
if (child.directory) {
|
|
@@ -10894,7 +11249,7 @@ function addChild(parent, name, params, directory) {
|
|
|
10894
11249
|
}
|
|
10895
11250
|
return directory ? new ZipDirectoryEntry(parent.fs, name, params, parent) : new ZipFileEntry(parent.fs, name, params, parent);
|
|
10896
11251
|
} else {
|
|
10897
|
-
throw new Error(
|
|
11252
|
+
throw new Error(ERR_PARENT_NOT_DIRECTORY);
|
|
10898
11253
|
}
|
|
10899
11254
|
}
|
|
10900
11255
|
|
|
@@ -11036,6 +11391,7 @@ exports.Data64URIReader = Data64URIReader;
|
|
|
11036
11391
|
exports.Data64URIWriter = Data64URIWriter;
|
|
11037
11392
|
exports.ERR_ABORTED = ERR_ABORTED;
|
|
11038
11393
|
exports.ERR_AMBIGUOUS_ARCHIVE = ERR_AMBIGUOUS_ARCHIVE;
|
|
11394
|
+
exports.ERR_ANCESTOR_ENTRY = ERR_ANCESTOR_ENTRY;
|
|
11039
11395
|
exports.ERR_BAD_FORMAT = ERR_BAD_FORMAT;
|
|
11040
11396
|
exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
11041
11397
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
@@ -11049,7 +11405,9 @@ exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
|
|
|
11049
11405
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
11050
11406
|
exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
|
|
11051
11407
|
exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
|
|
11408
|
+
exports.ERR_HTTP_STATUS = ERR_HTTP_STATUS;
|
|
11052
11409
|
exports.ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_AUTHENTICATION_CODE;
|
|
11410
|
+
exports.ERR_INVALID_BASE_URI = ERR_INVALID_BASE_URI;
|
|
11053
11411
|
exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
|
|
11054
11412
|
exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
|
|
11055
11413
|
exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
@@ -11059,6 +11417,7 @@ exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
|
|
|
11059
11417
|
exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
|
|
11060
11418
|
exports.ERR_INVALID_DUPLICATES = ERR_INVALID_DUPLICATES;
|
|
11061
11419
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
11420
|
+
exports.ERR_INVALID_ENTRY = ERR_INVALID_ENTRY;
|
|
11062
11421
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
11063
11422
|
exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
|
|
11064
11423
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
@@ -11077,6 +11436,7 @@ exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
|
|
|
11077
11436
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
11078
11437
|
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
11079
11438
|
exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
|
|
11439
|
+
exports.ERR_INVALID_PASS_THROUGH_VALUE = ERR_INVALID_PASS_THROUGH_VALUE;
|
|
11080
11440
|
exports.ERR_INVALID_READER = ERR_INVALID_READER;
|
|
11081
11441
|
exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
|
|
11082
11442
|
exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
|
|
@@ -11087,14 +11447,19 @@ exports.ERR_INVALID_UNCOMPRESSED_SIZE = ERR_INVALID_UNCOMPRESSED_SIZE;
|
|
|
11087
11447
|
exports.ERR_INVALID_UNIX_EXTRA_FIELD_TYPE = ERR_INVALID_UNIX_EXTRA_FIELD_TYPE;
|
|
11088
11448
|
exports.ERR_INVALID_UNIX_ID_SIZE = ERR_INVALID_UNIX_ID_SIZE;
|
|
11089
11449
|
exports.ERR_INVALID_UNIX_MODE = ERR_INVALID_UNIX_MODE;
|
|
11450
|
+
exports.ERR_INVALID_URI = ERR_INVALID_URI;
|
|
11090
11451
|
exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
|
|
11091
11452
|
exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
|
|
11092
11453
|
exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
|
|
11093
11454
|
exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
11455
|
+
exports.ERR_PARENT_NOT_DIRECTORY = ERR_PARENT_NOT_DIRECTORY;
|
|
11094
11456
|
exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
|
|
11095
11457
|
exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
11458
|
+
exports.ERR_ROOT_DIRECTORY_NOT_MOVABLE = ERR_ROOT_DIRECTORY_NOT_MOVABLE;
|
|
11096
11459
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
11460
|
+
exports.ERR_TARGET_NOT_DIRECTORY = ERR_TARGET_NOT_DIRECTORY;
|
|
11097
11461
|
exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
|
|
11462
|
+
exports.ERR_UNDEFINED_CRC32 = ERR_UNDEFINED_CRC32;
|
|
11098
11463
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
11099
11464
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
11100
11465
|
exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
|
|
@@ -11106,10 +11471,12 @@ exports.ERR_UNSUPPORTED_ENCRYPTION = ERR_UNSUPPORTED_ENCRYPTION;
|
|
|
11106
11471
|
exports.ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH;
|
|
11107
11472
|
exports.ERR_UNSUPPORTED_ENCRYPTION_USDZ = ERR_UNSUPPORTED_ENCRYPTION_USDZ;
|
|
11108
11473
|
exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
|
|
11474
|
+
exports.ERR_UNSUPPORTED_PASS_THROUGH_VALUE = ERR_UNSUPPORTED_PASS_THROUGH_VALUE;
|
|
11109
11475
|
exports.ERR_UNSUPPORTED_SPLIT_USDZ = ERR_UNSUPPORTED_SPLIT_USDZ;
|
|
11110
11476
|
exports.ERR_UNSUPPORTED_UINT64 = ERR_UNSUPPORTED_UINT64;
|
|
11111
11477
|
exports.ERR_WORKER_STARTUP_TIMEOUT = ERR_WORKER_STARTUP_TIMEOUT;
|
|
11112
11478
|
exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
|
|
11479
|
+
exports.ERR_WRITER_SIZE_NOT_WRITABLE = ERR_WRITER_SIZE_NOT_WRITABLE;
|
|
11113
11480
|
exports.ERR_ZIP_CRYPTO_LAST_MOD_DATE = ERR_ZIP_CRYPTO_LAST_MOD_DATE;
|
|
11114
11481
|
exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
|
|
11115
11482
|
exports.HttpRangeReader = HttpRangeReader;
|
|
@@ -11123,13 +11490,17 @@ exports.Uint8ArrayReader = Uint8ArrayReader;
|
|
|
11123
11490
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
11124
11491
|
exports.VERSION = VERSION;
|
|
11125
11492
|
exports.WARNING_APPENDED_DATA = WARNING_APPENDED_DATA;
|
|
11493
|
+
exports.WARNING_CLAMPED_LAST_MODIFICATION_DATE = WARNING_CLAMPED_LAST_MODIFICATION_DATE;
|
|
11126
11494
|
exports.WARNING_COMPRESSED_PATCHED_DATA = WARNING_COMPRESSED_PATCHED_DATA;
|
|
11495
|
+
exports.WARNING_COMPRESSION_UNAVAILABLE = WARNING_COMPRESSION_UNAVAILABLE;
|
|
11127
11496
|
exports.WARNING_DUPLICATE_FILENAME = WARNING_DUPLICATE_FILENAME;
|
|
11128
11497
|
exports.WARNING_MALFORMED_EXTRA_FIELD = WARNING_MALFORMED_EXTRA_FIELD;
|
|
11129
11498
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG = WARNING_MISMATCHED_LOCAL_FILE_HEADER_BIT_FLAG;
|
|
11130
11499
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD = WARNING_MISMATCHED_LOCAL_FILE_HEADER_COMPRESSION_METHOD;
|
|
11131
11500
|
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES = WARNING_MISMATCHED_LOCAL_FILE_HEADER_CRC32_OR_SIZES;
|
|
11501
|
+
exports.WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME = WARNING_MISMATCHED_LOCAL_FILE_HEADER_FILENAME;
|
|
11132
11502
|
exports.WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY = WARNING_MISMATCHED_ZIP64_END_OF_CENTRAL_DIRECTORY;
|
|
11503
|
+
exports.WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY = WARNING_MULTIPLE_END_OF_CENTRAL_DIRECTORY;
|
|
11133
11504
|
exports.WARNING_PREPENDED_CENTRAL_DIRECTORY = WARNING_PREPENDED_CENTRAL_DIRECTORY;
|
|
11134
11505
|
exports.WARNING_PREPENDED_DATA = WARNING_PREPENDED_DATA;
|
|
11135
11506
|
exports.WARNING_TRAILING_CENTRAL_DIRECTORY_DATA = WARNING_TRAILING_CENTRAL_DIRECTORY_DATA;
|