@zip.js/zip.js 2.8.30 → 2.8.31
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 +5 -4
- package/dist/zip-core.js +133 -334
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core.js +115 -277
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-native.js +170 -373
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +169 -372
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +138 -339
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-module.wasm +0 -0
- package/dist/zip-native.js +141 -342
- 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 +140 -341
- package/dist/zip.min.js +1 -1
- package/index-native.cjs +170 -373
- package/index-native.min.js +1 -1
- package/index.cjs +169 -372
- package/index.d.cts +2814 -0
- package/index.d.ts +238 -0
- package/index.min.js +1 -1
- package/lib/core/codec-worker.js +0 -10
- package/lib/core/configuration.js +21 -33
- package/lib/core/constants.js +3 -0
- package/lib/core/io.js +11 -19
- package/lib/core/streams/aes-crypto-stream.js +16 -20
- package/lib/core/streams/common-crypto.js +0 -2
- package/lib/core/streams/zip-crypto-stream.js +12 -16
- package/lib/core/streams/zip-entry-stream.js +2 -32
- package/lib/core/streams/zlib-js/zlib-streams.min.js +1 -1
- package/lib/core/streams/zlib-wasm/zlib-streams-loader.js +1 -3
- package/lib/core/streams/zlib-wasm/zlib-streams.wasm +0 -0
- package/lib/core/util/base64.js +68 -0
- package/lib/core/util/decode-text.js +0 -1
- package/lib/core/util/default-mime-type.js +0 -3
- package/lib/core/util/inflate.js +194 -0
- package/lib/core/util/mime-type.js +26 -22
- package/lib/core/util/opfs-temp-stream.js +1 -37
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-template-native.js +5 -5
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-fs.js +6 -13
- package/lib/core/zip-reader.js +48 -127
- package/lib/core/zip-writer.js +27 -45
- package/lib/core/zlib-streams-inline-template.js +3 -2
- package/lib/core/zlib-streams-inline.js +1 -1
- package/lib/zip-core-base.js +3 -1
- package/package.json +9 -6
- package/reserved-property-names.js +50 -0
- package/lib/core/util/mini-lz.js +0 -198
package/dist/zip-fs.js
CHANGED
|
@@ -113,6 +113,8 @@
|
|
|
113
113
|
const FUNCTION_TYPE = "function";
|
|
114
114
|
const OBJECT_TYPE = "object";
|
|
115
115
|
|
|
116
|
+
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
117
|
+
|
|
116
118
|
/*
|
|
117
119
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
118
120
|
|
|
@@ -164,6 +166,22 @@
|
|
|
164
166
|
DecompressionStream: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream
|
|
165
167
|
};
|
|
166
168
|
|
|
169
|
+
const CONFIGURABLE_PROPERTY_NAMES = [
|
|
170
|
+
"baseURI",
|
|
171
|
+
"wasmURI",
|
|
172
|
+
"workerURI",
|
|
173
|
+
"chunkSize",
|
|
174
|
+
"maxWorkers",
|
|
175
|
+
"terminateWorkerTimeout",
|
|
176
|
+
"workerStarvationTimeout",
|
|
177
|
+
"useCompressionStream",
|
|
178
|
+
"useWebWorkers",
|
|
179
|
+
"CompressionStream",
|
|
180
|
+
"DecompressionStream",
|
|
181
|
+
"CompressionStreamZlib",
|
|
182
|
+
"DecompressionStreamZlib"
|
|
183
|
+
];
|
|
184
|
+
|
|
167
185
|
const config = Object.assign({}, DEFAULT_CONFIGURATION);
|
|
168
186
|
|
|
169
187
|
function getConfiguration() {
|
|
@@ -175,43 +193,15 @@
|
|
|
175
193
|
}
|
|
176
194
|
|
|
177
195
|
function configure(configuration) {
|
|
178
|
-
const {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
CompressionStream,
|
|
187
|
-
DecompressionStream,
|
|
188
|
-
CompressionStreamZlib,
|
|
189
|
-
DecompressionStreamZlib,
|
|
190
|
-
workerURI,
|
|
191
|
-
wasmURI
|
|
192
|
-
} = configuration;
|
|
193
|
-
setIfDefined("baseURI", baseURI);
|
|
194
|
-
setIfDefined("wasmURI", wasmURI);
|
|
195
|
-
setIfDefined("workerURI", workerURI);
|
|
196
|
-
setIfDefined("chunkSize", chunkSize);
|
|
197
|
-
setIfDefined("maxWorkers", maxWorkers);
|
|
198
|
-
setIfDefined("terminateWorkerTimeout", terminateWorkerTimeout);
|
|
199
|
-
setIfDefined("workerStarvationTimeout", workerStarvationTimeout);
|
|
200
|
-
setIfDefined("useCompressionStream", useCompressionStream);
|
|
201
|
-
setIfDefined("useWebWorkers", useWebWorkers);
|
|
202
|
-
setIfDefined("CompressionStream", CompressionStream);
|
|
203
|
-
setIfDefined("DecompressionStream", DecompressionStream);
|
|
204
|
-
setIfDefined("CompressionStreamZlib", CompressionStreamZlib);
|
|
205
|
-
setIfDefined("DecompressionStreamZlib", DecompressionStreamZlib);
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
function setIfDefined(propertyName, propertyValue) {
|
|
209
|
-
if (propertyValue !== UNDEFINED_VALUE) {
|
|
210
|
-
config[propertyName] = propertyValue;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
function t(t){const e='(t=>{"function"==typeof define&&define.amd?define(t):t()})(function(){"use strict";const{Array:t,Object:e,Number:n,Math:s,Error:r,Uint8Array:o,Uint16Array:i,Uint32Array:a,Int32Array:c,Map:w,DataView:f,Promise:l,TextEncoder:u,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:g,DecompressionStream:S}=self,b=void 0,k="undefined",v="function",z=[[],[],[],[],[],[],[],[]];for(let t=0;256>t;t++){let e=t;for(let t=0;8>t;t++)e=1&e?e>>>1^3988292384:e>>>1;z[0][t]=e}for(let t=0;256>t;t++)for(let e=1;8>e;e++){const n=z[e-1][t];z[e][t]=n>>>8^z[0][255&n]}const[C,I,A,x,P,R,U,W]=z;class D{constructor(t){this.t=t||-1}append(t){let e=0|this.t;const n=0|t.length;let s=0;if(n>=8&&t.buffer){const r=new f(t.buffer,t.byteOffset,n),o=n-8;for(;o>=s;s+=8){const t=e^r.getInt32(s,!0),n=r.getInt32(s+4,!0);e=W[255&t]^U[t>>>8&255]^R[t>>>16&255]^P[t>>>24&255]^x[255&n]^A[n>>>8&255]^I[n>>>16&255]^C[n>>>24&255]}}for(;n>s;s++)e=e>>>8^C[255&(e^t[s])];this.t=e}get(){return~this.t}}class M extends d{constructor(){let t;const e=new D;super({transform(t,n){e.append(t),n.enqueue(t)},flush(){const n=new o(4);new f(n.buffer).setUint32(0,e.get()),t.value=n}}),t=this}}const V={concat(t,e){if(0===t.length||0===e.length)return t.concat(e);const n=t[t.length-1],s=V.o(n);return 32===s?t.concat(e):V.i(e,s,0|n,t.slice(0,t.length-1))},l(t){const e=t.length;if(0===e)return 0;const n=t[e-1];return 32*(e-1)+V.o(n)},u(t,e){if(32*t.length<e)return t;const n=(t=t.slice(0,s.ceil(e/32))).length;return e&=31,n>0&&e&&(t[n-1]=V.h(e,t[n-1]&2147483648>>e-1,1)),t},h:(t,e,n)=>32===t?e:(n?0|e:e<<32-t)+1099511627776*t,o:t=>s.round(t/1099511627776)||32,i(t,e,n,s){for(void 0===s&&(s=[]);e>=32;e-=32)s.push(n),n=0;if(0===e)return s.concat(t);for(let r=0;r<t.length;r++)s.push(n|t[r]>>>e),n=t[r]<<32-e;const r=t.length?t[t.length-1]:0,o=V.o(r);return s.push(V.h(e+o&31,e+o>32?n:s.pop(),1)),s}},_={bytes:{p(t){const e=V.l(t)/8,n=new o(e);let s;for(let r=0;e>r;r++)3&r||(s=t[r/4]),n[r]=s>>>24,s<<=8;return n},m(t){const e=[];let n,s=0;for(n=0;n<t.length;n++)s=s<<8|t[n],3&~n||(e.push(s),s=0);return 3&n&&e.push(V.h(8*(3&n),s)),e}}},B=class{constructor(t){const e=this;e.blockSize=512,e.S=[1732584193,4023233417,2562383102,271733878,3285377520],e.k=[1518500249,1859775393,2400959708,3395469782],t?(e.v=t.v.slice(0),e.C=t.C.slice(0),e.I=t.I):e.reset()}reset(){const t=this;return t.v=t.S.slice(0),t.C=[],t.I=0,t}update(t){const e=this;"string"==typeof t&&(t=_.A.m(t));const n=e.C=V.concat(e.C,t),s=e.I,o=e.I=s+V.l(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const i=new a(n);let c=0;for(let t=e.blockSize+s-(e.blockSize+s&e.blockSize-1);o>=t;t+=e.blockSize)e.P(i.subarray(16*c,16*(c+1))),c+=1;return n.splice(0,16*c),e}R(){const t=this;let e=t.C;const n=t.v;e=V.concat(e,[V.h(1,1)]);for(let t=e.length+2;15&t;t++)e.push(0);for(e.push(s.floor(t.I/4294967296)),e.push(0|t.I);e.length;)t.P(e.splice(0,16));return t.reset(),n}U(t,e,n,s){return t>19?t>39?t>59?t>79?void 0:e^n^s:e&n|e&s|n&s:e^n^s:e&n|~e&s}W(t,e){return e<<t|e>>>32-t}P(e){const n=this,r=n.v,o=t(80);for(let t=0;16>t;t++)o[t]=e[t];let i=r[0],a=r[1],c=r[2],w=r[3],f=r[4];for(let t=0;79>=t;t++){16>t||(o[t]=n.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const e=n.W(5,i)+n.U(t,a,c,w)+f+o[t]+n.k[s.floor(t/20)]|0;f=w,w=c,c=n.W(30,a),a=i,i=e}r[0]=r[0]+i|0,r[1]=r[1]+a|0,r[2]=r[2]+c|0,r[3]=r[3]+w|0,r[4]=r[4]+f|0}},T={importKey:t=>new T.D(_.bytes.m(t)),M(t,e,n,s){if(n=n||1e4,0>s||0>n)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let i,a,c,w,l;const u=new ArrayBuffer(o),h=new f(u);let p=0;const d=V;for(e=_.bytes.m(e),l=1;(o||1)>p;l++){for(i=a=t.encrypt(d.concat(e,[l])),c=1;n>c;c++)for(a=t.encrypt(a),w=0;w<a.length;w++)i[w]^=a[w];for(c=0;(o||1)>p&&c<i.length;c++)h.setInt32(p,i[c]),p+=4}return u.slice(0,s/8)},D:class{constructor(t){const e=this,n=e.V=B,s=[[],[]];e._=[new n,new n];const r=e._[0].blockSize/32;t.length>r&&(t=(new n).update(t).R());for(let e=0;r>e;e++)s[0][e]=909522486^t[e],s[1][e]=1549556828^t[e];e._[0].update(s[0]),e._[1].update(s[1]),e.B=new n(e._[0])}reset(){const t=this;t.B=new t.V(t._[0]),t.T=!1}update(t){this.T=!0,this.B.update(t)}digest(){const t=this,e=t.B.R(),n=new t.V(t._[1]).update(e).R();return t.reset(),n}encrypt(t){if(this.T)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},K=typeof h!=k&&typeof h.getRandomValues==v,j="Invalid password",E="Invalid signature",L="zipjs-abort-check-password";function O(t){if(K)return h.getRandomValues(t);throw new r("Crypto API not supported")}const H=16,Z={name:"PBKDF2"},F=e.assign({hash:{name:"HMAC"}},Z),N=e.assign({iterations:1e3,hash:{name:"SHA-1"}},Z),q=["deriveBits"],G=[8,12,16],J=[16,24,32],Q=10,X=[0,0,0,0],Y=typeof h!=k,$=Y&&h.subtle,tt=Y&&typeof $!=k,et=_.bytes,nt=class{constructor(t){const e=this;e.K=[[[],[],[],[],[]],[[],[],[],[],[]]],e.K[0][0][0]||e.j();const n=e.K[0][4],s=e.K[1],o=t.length;let i,a,c,w=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(e.k=[a=t.slice(0),c=[]],i=o;4*o+28>i;i++){let t=a[i-1];(i%o===0||8===o&&i%o===4)&&(t=n[t>>>24]<<24^n[t>>16&255]<<16^n[t>>8&255]<<8^n[255&t],i%o===0&&(t=t<<8^t>>>24^w<<24,w=w<<1^283*(w>>7))),a[i]=a[i-o]^t}for(let t=0;i;t++,i--){const e=a[3&t?i:i-4];c[t]=4>=i||4>t?e:s[0][n[e>>>24]]^s[1][n[e>>16&255]]^s[2][n[e>>8&255]]^s[3][n[255&e]]}}encrypt(t){return this.L(t,0)}decrypt(t){return this.L(t,1)}j(){const t=this.K[0],e=this.K[1],n=t[4],s=e[4],r=[],o=[];let i,a,c,w;for(let t=0;256>t;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let f=i=0;!n[f];f^=a||1,i=o[i]||1){let o=i^i<<1^i<<2^i<<3^i<<4;o=o>>8^255&o^99,n[f]=o,s[o]=f,w=r[c=r[a=r[f]]];let l=16843009*w^65537*c^257*a^16843008*f,u=257*r[o]^16843008*o;for(let n=0;4>n;n++)t[n][f]=u=u<<24^u>>>8,e[n][o]=l=l<<24^l>>>8}for(let n=0;5>n;n++)t[n]=t[n].slice(0),e[n]=e[n].slice(0)}L(t,e){if(4!==t.length)throw new r("invalid aes block size");const n=this.k[e],s=n.length/4-2,o=[0,0,0,0],i=this.K[e],a=i[0],c=i[1],w=i[2],f=i[3],l=i[4];let u,h,p,d=t[0]^n[0],y=t[e?3:1]^n[1],m=t[2]^n[2],g=t[e?1:3]^n[3],S=4;for(let t=0;s>t;t++)u=a[d>>>24]^c[y>>16&255]^w[m>>8&255]^f[255&g]^n[S],h=a[y>>>24]^c[m>>16&255]^w[g>>8&255]^f[255&d]^n[S+1],p=a[m>>>24]^c[g>>16&255]^w[d>>8&255]^f[255&y]^n[S+2],g=a[g>>>24]^c[d>>16&255]^w[y>>8&255]^f[255&m]^n[S+3],S+=4,d=u,y=h,m=p;for(let t=0;4>t;t++)o[e?3&-t:t]=l[d>>>24]<<24^l[y>>16&255]<<16^l[m>>8&255]<<8^l[255&g]^n[S++],u=d,d=y,y=m,m=g,g=u;return o}},st=class{constructor(t,e){this.O=t,this.H=e,this.Z=e}reset(){this.Z=this.H}update(t){return this.F(this.O,t,this.Z)}N(t){if(255&~(t>>24))t+=1<<24;else{let e=t>>16&255,n=t>>8&255,s=255&t;255===e?(e=0,255===n?(n=0,255===s?s=0:++s):++n):++e,t=0,t+=e<<16,t+=n<<8,t+=s}return t}q(t){0===(t[0]=this.N(t[0]))&&(t[1]=this.N(t[1]))}F(t,e,n){let s;if(!(s=e.length))return[];const r=V.l(e);for(let r=0;s>r;r+=4){this.q(n);const s=t.encrypt(n);e[r]^=s[0],e[r+1]^=s[1],e[r+2]^=s[2],e[r+3]^=s[3]}return V.u(e,r)}},rt=T.D;let ot=Y&&tt&&typeof $.importKey==v,it=Y&&tt&&typeof $.deriveBits==v;class at extends d{constructor({password:t,rawPassword:n,encryptionStrength:s,checkPasswordOnly:i}){super({start(){e.assign(this,{ready:new l(t=>this.G=t),password:lt(t,n),J:s-1,pending:new o})},async transform(t,e){const n=this,{password:s,J:a,G:c,ready:w}=n;s?(await(async(t,e,n,s)=>{const o=await ft(t,e,n,ht(s,0,G[e])),i=ht(s,G[e]);if(o[0]!=i[0]||o[1]!=i[1])throw new r(j)})(n,a,s,ht(t,0,G[a]+2)),t=ht(t,G[a]+2),i?e.error(new r(L)):c()):await w;const f=new o(t.length-Q-(t.length-Q)%H);e.enqueue(wt(n,t,f,0,Q,!0))},async flush(t){const{X:e,Y:n,pending:s,ready:i}=this;if(n&&e){await i;const a=ht(s,0,s.length-Q),c=ht(s,s.length-Q);let w=new o;if(a.length){const t=dt(et,a);n.update(t);const s=e.update(t);w=pt(et,s)}const f=ht(pt(et,n.digest()),0,Q);let l=s.length<Q?1:0;for(let t=0;Q>t;t++)l|=f[t]^c[t];if(l)throw new r(E);t.enqueue(w)}}})}}class ct extends d{constructor({password:t,rawPassword:n,encryptionStrength:s}){let r;super({start(){e.assign(this,{ready:new l(t=>this.G=t),password:lt(t,n),J:s-1,pending:new o})},async transform(t,e){const n=this,{password:s,J:r,G:i,ready:a}=n;let c=new o;s?(c=await(async(t,e,n)=>{const s=O(new o(G[e]));return ut(s,await ft(t,e,n,s))})(n,r,s),i()):await a;const w=new o(c.length+t.length-t.length%H);w.set(c,0),e.enqueue(wt(n,t,w,c.length,0))},async flush(t){const{X:e,Y:n,pending:s,ready:i}=this;if(n&&e){await i;let a=new o;if(s.length){const t=e.update(dt(et,s));n.update(t),a=pt(et,t)}r.signature=pt(et,n.digest()).slice(0,Q),t.enqueue(ut(a,r.signature))}}}),r=this}}function wt(t,e,n,s,r,i){const{X:a,Y:c,pending:w}=t;w.length&&(e=ut(w,e));const f=e.length-r;let l;for(n=((t,e)=>{if(e&&e>t.length){const n=t;(t=new o(e)).set(n,0)}return t})(n,s+(f-f%H)),l=0;f-H>=l;l+=H){const t=dt(et,ht(e,l,l+H));i&&c.update(t);const r=a.update(t);i||c.update(r),n.set(pt(et,r),l+s)}return t.pending=ht(e,l),n}async function ft(n,s,r,i){n.password=null;const a=await(async(t,e,n,s,r)=>{if(!ot)return T.importKey(e);try{return await $.importKey("raw",e,n,!1,r)}catch{return ot=!1,T.importKey(e)}})(0,r,F,0,q),c=await(async(t,e,n)=>{if(!it)return T.M(e,t.salt,N.iterations,n);try{return await $.deriveBits(t,e,n)}catch{return it=!1,T.M(e,t.salt,N.iterations,n)}})(e.assign({salt:i},N),a,8*(2*J[s]+2)),w=new o(c),f=dt(et,ht(w,0,J[s])),l=dt(et,ht(w,J[s],2*J[s])),u=ht(w,2*J[s]);return e.assign(n,{keys:{key:f,$:l,passwordVerification:u},X:new st(new nt(f),t.from(X)),Y:new rt(l)}),u}function lt(t,e){return e===b?(t=>{if(typeof u==k){const e=new o((t=unescape(encodeURIComponent(t))).length);for(let n=0;n<e.length;n++)e[n]=t.charCodeAt(n);return e}return(new u).encode(t)})(t):e}function ut(t,e){let n=t;return t.length+e.length&&(n=new o(t.length+e.length),n.set(t,0),n.set(e,t.length)),n}function ht(t,e,n){return t.subarray(e,n)}function pt(t,e){return t.p(e)}function dt(t,e){return t.m(e)}class yt extends d{constructor({password:t,rawPassword:n,passwordVerification:s,checkPasswordOnly:o}){super({start(){e.assign(this,{password:t,rawPassword:n,passwordVerification:s}),bt(this,t,n)},transform(t,e){const n=this;if(n.password||n.rawPassword){const e=gt(n,t.subarray(0,12));if(n.password=n.rawPassword=null,0!=(e.at(-1)^n.passwordVerification))throw new r(j);t=t.subarray(12)}o?e.error(new r(L)):e.enqueue(gt(n,t))}})}}class mt extends d{constructor({password:t,rawPassword:n,passwordVerification:s}){super({start(){e.assign(this,{password:t,rawPassword:n,passwordVerification:s}),bt(this,t,n)},transform(t,e){const n=this;let s,r;if(n.password||n.rawPassword){n.password=n.rawPassword=null;const e=O(new o(12));e[11]=n.passwordVerification,s=new o(t.length+e.length),s.set(St(n,e),0),r=12}else s=new o(t.length),r=0;s.set(St(n,t),r),e.enqueue(s)}})}}function gt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=vt(t)^e[s],kt(t,n[s]);return n}function St(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=vt(t)^e[s],kt(t,e[s]);return n}function bt(t,n,s){const r=[305419896,591751049,878082192];if(e.assign(t,{keys:r,tt:new D(r[0]),et:new D(r[2])}),s)for(let e=0;e<s.length;e++)kt(t,s[e]);else for(let e=0;e<n.length;e++)kt(t,n.charCodeAt(e))}function kt(t,e){let[,n]=t.keys;t.tt.append([e]);const r=~t.tt.get();n=Ct(s.imul(Ct(n+zt(r)),134775813)+1),t.et.append([n>>>24]);const o=~t.et.get();t.keys=[r,n,o]}function vt(t){const e=2|t.keys[2];return zt(s.imul(e,1^e)>>>8)}function zt(t){return 255&t}function Ct(t){return 4294967295&t}class It extends d{constructor(t,{chunkSize:e,nt:n,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:i,zipCrypto:a,signed:c,level:w,deflate64:l}=t,u=this;let h,p,d,y=super.readable;const m=c&&r&&!l&&(!o||a)&&!(!i||!s);o&&!a||!c||m||(h=new M,y=Ut(y,h)),r&&(m?(d=new At,y=Wt(y,new s("gzip")),y=Ut(y,d)):y=Rt(y,i,{level:w,chunkSize:e},s,n,s)),o&&(a?y=Ut(y,new mt(t)):(p=new ct(t),y=Ut(y,p))),Pt(u,y,()=>{let t;o&&!a&&(t=p.signature),o&&!a||!c||(t=m?d.signature:new f(h.value.buffer).getUint32(0)),u.signature=t})}}class At extends d{constructor(){let t,e=10,n=new o(0);super({transform(t,r){if(e){const n=s.min(e,t.length);if(e-=n,!(t=t.subarray(n)).length)return}const i=n.length+t.length;if(8>=i){const e=new o(i);return e.set(n),e.set(t,n.length),void(n=e)}const a=i-8,c=new o(a),w=s.min(a,n.length);c.set(n.subarray(0,w),0),a>w&&c.set(t.subarray(0,a-w),w),r.enqueue(c);const f=new o(8),l=n.length-w;l&&f.set(n.subarray(w),0),f.set(t.subarray(a-w),l),n=f},flush(){const e=new f(n.buffer,n.byteOffset,n.byteLength);t.signature=e.getUint32(0,!0),t.st=e.getUint32(4,!0)}}),t=this}}class xt extends d{constructor(t,{chunkSize:e,rt:n,DecompressionStream:s}){super({});const{zipCrypto:o,encrypted:i,signed:a,signature:c,compressed:w,useCompressionStream:l,deflate64:u}=t;let h,p,d=super.readable;i&&(o?d=Ut(d,new yt(t)):(p=new at(t),d=Ut(d,p))),w&&(d=Rt(d,l,{chunkSize:e,deflate64:u},s,n,s),d=(t=>{const e=t.getReader();return new y({async pull(t){let n;try{n=await e.read()}catch(t){if(t&&t.message)throw t;const e=new r("Invalid compressed data");throw e.cause=t,e}const{value:s,done:o}=n;o?t.close():t.enqueue(s)},cancel:t=>e.cancel(t)})})(d)),i&&!o||!a||(h=new M,d=Ut(d,h)),Pt(this,d,()=>{if((!i||o)&&a){const t=new f(h.value.buffer);if(c!=t.getUint32(0,!1))throw new r(E)}})}}function Pt(t,n,s){n=Ut(n,new d({flush:s})),e.defineProperty(t,"readable",{get:()=>n})}function Rt(t,e,n,s,r,o){const i=e&&s?s:r||o,a=n.deflate64?"deflate64-raw":"deflate-raw";let c;try{c=new i(a,n)}catch(t){if(!e)throw t;if(r)c=new r(a,n);else{if(!o)throw t;c=new o(a,n)}}return Wt(t,c)}function Ut(t,e){return t.pipeThrough(e)}function Wt(t,e){const n=e.writable.getWriter(),s=t.getReader();return(async()=>{try{for(;;){await n.ready;const t=await s.read();if(t.done){await n.close();break}await n.write(t.value)}}catch(t){await(async(t,e)=>{try{await t.abort(e)}catch{}})(n,t),await(async(t,e)=>{try{await t.cancel(e)}catch{}})(s,t)}})(),e.readable}const Dt="data",Mt="close";class Vt extends d{constructor(t,n){super({});const s=this,{codecType:o}=t;let i;o.startsWith("deflate")?i=It:o.startsWith("inflate")&&(i=xt),s.outputSize=0;let a=0;const c=new i(t,n),w=super.readable,f=new d({transform(t,e){t&&t.length&&(a+=t.length,e.enqueue(t))},flush(){e.assign(s,{inputSize:a})}}),l=new d({transform(e,n){if(e&&e.length&&(n.enqueue(e),s.outputSize+=e.length,t.outputSize!==b&&s.outputSize>t.outputSize))throw new r("Invalid uncompressed size")},flush(){const{signature:t}=c;e.assign(s,{signature:t,inputSize:a})}});e.defineProperty(s,"readable",{get:()=>w.pipeThrough(f).pipeThrough(c).pipeThrough(l)})}}class _t extends d{constructor(t){let e;1>t&&(t=65536),super({transform:(n,s)=>{if(e){const t=new o(e.length+n.length);t.set(e),t.set(n,e.length),n=t,e=null}let r=0;for(;n.length-r>t;)s.enqueue(n.slice(r,r+t)),r+=t;e=r?n.slice(r):n},flush(t){e&&e.length&&t.enqueue(e)}})}}let Bt=2;try{typeof navigator!=k&&navigator.hardwareConcurrency&&(Bt=navigator.hardwareConcurrency)}catch{}const Tt={ot:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,it:Bt,ct:5e3,wt:5e3,ft:!0,useCompressionStream:!0,CompressionStream:typeof g!=k&&g,DecompressionStream:typeof S!=k&&S};e.assign({},Tt);const Kt=new w,jt=new w;let Et,Lt,Ot,Ht,Zt,Ft=0;async function Nt(t){let e,r;try{const{options:o,config:i}=t;if(!o.useCompressionStream)try{await self.initModule(t.config)}catch{o.useCompressionStream=!0}i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream;const a={highWaterMark:1},c=t.readable||new y({async pull(t){const e=new l(t=>Kt.set(Ft,t));qt({type:"pull",messageId:Ft}),Ft=(Ft+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await e;t.enqueue(s),r&&t.close()}},a);r=t.writable||new m({async write(t){let e;const s=new l(t=>e=t);jt.set(Ft,e),qt({type:Dt,value:t,messageId:Ft}),Ft=(Ft+1)%n.MAX_SAFE_INTEGER,await s}},a),e=new Vt(o,i),Et=new AbortController;const{signal:w}=Et;await c.pipeThrough(e).pipeThrough(new _t((t=>s.max(t.chunkSize,64))(i))).pipeTo(r,{signal:w,preventClose:!0,preventAbort:!0}),await r.getWriter().close();const{signature:f,inputSize:u,outputSize:h}=e;qt({type:Mt,result:{signature:f,inputSize:u,outputSize:h}})}catch(t){if(t.outputSize=e?e.outputSize:0,r&&!r.locked)try{await r.getWriter().close()}catch{}Gt(t)}}function qt(t){let{value:e}=t;if(e)if(e.length)try{e=new o(e),t.value=e.buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t)}function Gt(t=new r("Unknown error")){const{message:e,stack:n,code:s,name:o,outputSize:i}=t;p({error:{message:e,stack:n,code:s,name:o,outputSize:i}})}function Jt(t,e,n={}){const i="number"==typeof n.level?n.level:-1,a="number"==typeof n.lt?n.lt:65536,c="number"==typeof n.ut?n.ut:65536;return new d({start(){try{let n;if(this.ht=Ot(a),this.in=Ot(c),this.ut=c,!this.ht||!this.in)throw new r("allocation failed");if(this.dt=new o(a),t?(this.yt=Lt.deflate_process,this.gt=Lt.deflate_last_consumed,this.St=Lt.deflate_end,this.bt=Lt.deflate_new(),n="gzip"===e?Lt.deflate_init_gzip(this.bt,i):"deflate-raw"===e?Lt.deflate_init_raw(this.bt,i):Lt.deflate_init(this.bt,i)):"deflate64-raw"===e?(this.yt=Lt.inflate9_process,this.gt=Lt.inflate9_last_consumed,this.St=Lt.inflate9_end,this.bt=Lt.inflate9_new(),n=Lt.inflate9_init_raw(this.bt)):(this.yt=Lt.inflate_process,this.gt=Lt.inflate_last_consumed,this.St=Lt.inflate_end,this.bt=Lt.inflate_new(),n="deflate-raw"===e?Lt.inflate_init_raw(this.bt):"gzip"===e?Lt.inflate_init_gzip(this.bt):Lt.inflate_init(this.bt)),0!==n)throw new r("init failed:"+n)}catch(t){throw w(this),t}},transform(e,n){try{const i=e,c=new o(Zt.buffer),w=this.yt,f=this.gt,l=this.ht,u=this.dt;let h=0;for(;h<i.length;){const e=s.min(i.length-h,32768);if((!this.in||this.ut<e)&&(this.in&&Ht&&(Ht(this.in),this.in=0),this.in=Ot(e),this.ut=e,!this.in))throw new r("allocation failed");c.set(i.subarray(h,h+e),this.in);const o=w(this.bt,this.in,e,l,a,0),p=16777215&o;if(p&&(u.set(c.subarray(l,l+p),0),n.enqueue(u.slice(0,p))),!t){const t=o>>24&255,e=128&t?t-256:t;if(0>e)throw new r("process error:"+e)}const d=f(this.bt);if(0===d)break;h+=d}}catch(t){w(this),n.error(t)}},flush(e){try{const n=new o(Zt.buffer),s=this.yt,i=this.ht,c=this.dt;for(;;){const o=s(this.bt,0,0,i,a,4),w=16777215&o,f=o>>24&255;if(!t){const t=128&f?f-256:f;if(0>t)throw new r("process error:"+t)}if(w&&(c.set(n.subarray(i,i+w),0),e.enqueue(c.slice(0,w))),1===f||0===w)break}}catch(t){e.error(t)}finally{const t=w(this);0!==t&&e.error(new r("end error:"+t))}},cancel(){w(this)}});function w(t){let e=0;return t.bt&&t.St&&(e=t.St(t.bt)),t.bt=0,t.in&&Ht&&Ht(t.in),t.in=0,t.ht&&Ht&&Ht(t.ht),t.ht=0,e}}addEventListener("message",({data:t})=>{const{type:e,messageId:n,value:s,done:r}=t;try{if("start"==e&&Nt(t),e==Dt){const t=Kt.get(n);Kt.delete(n),t({value:new o(s),done:r})}if("ack"==e){const t=jt.get(n);jt.delete(n),t()}e==Mt&&Et.abort()}catch(t){Gt(t)}});class Qt{constructor(t="deflate",e){return Jt(!0,t,e)}}class Xt{constructor(t="deflate",e){return Jt(!1,t,e)}}Qt.kt=!0,Xt.kt=!0;let Yt=!1;self.initModule=async t=>{try{const e=await(async(t,{baseURI:e})=>{if(!Yt){let n,s;try{try{s=new URL(t,e)}catch{}const r=await fetch(s);n=await r.arrayBuffer()}catch(e){if(!t.startsWith("data:application/wasm;base64,"))throw e;n=(t=>{const e=t.split(",")[1],n=atob(e),s=n.length,r=new o(s);for(let t=0;s>t;++t)r[t]=n.charCodeAt(t);return r.buffer})(t)}(t=>{if(Lt=t,({malloc:Ot,free:Ht,memory:Zt}=Lt),"function"!=typeof Ot||"function"!=typeof Ht||!Zt)throw Lt=Ot=Ht=Zt=null,new r("Invalid WASM module")})((await WebAssembly.instantiate(n)).instance.exports),Yt=!0}})(t.wasmURI,t);return t.nt=Qt,t.rt=Xt,e}catch{}}});\n';t({workerURI:t=>{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return "data:"+n+","+encodeURIComponent(e)}});}
|
|
196
|
+
for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
|
|
197
|
+
const propertyValue = configuration[propertyName];
|
|
198
|
+
if (propertyValue !== UNDEFINED_VALUE) {
|
|
199
|
+
config[propertyName] = propertyValue;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function t$1(t){const e='(t=>{"function"==typeof define&&define.amd?define(t):t()})(function(){"use strict";const{Array:t,Object:e,Number:n,Math:s,Error:r,Uint8Array:o,Uint16Array:i,Uint32Array:a,Int32Array:c,Map:f,DataView:l,Promise:w,TextEncoder:u,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:g,DecompressionStream:S}=self,b=void 0,k="undefined",v="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;256>t;t++){let e=t;for(let t=0;8>t;t++)e=1&e?e>>>1^3988292384:e>>>1;C[0][t]=e}for(let t=0;256>t;t++)for(let e=1;8>e;e++){const n=C[e-1][t];C[e][t]=n>>>8^C[0][255&n]}const[I,A,x,P,R,U,W,D]=C;class M{constructor(t){this.t=t||-1}append(t){let e=0|this.t;const n=0|t.length;let s=0;if(n>=8&&t.buffer){const r=new l(t.buffer,t.byteOffset,n),o=n-8;for(;o>=s;s+=8){const t=e^r.getInt32(s,!0),n=r.getInt32(s+4,!0);e=D[255&t]^W[t>>>8&255]^U[t>>>16&255]^R[t>>>24&255]^P[255&n]^x[n>>>8&255]^A[n>>>16&255]^I[n>>>24&255]}}for(;n>s;s++)e=e>>>8^I[255&(e^t[s])];this.t=e}get(){return~this.t}}class _ extends d{constructor(){let t;const e=new M;super({transform(t,n){e.append(t),n.enqueue(t)},flush(){const n=new o(4);new l(n.buffer).setUint32(0,e.get()),t.value=n}}),t=this}}const B={concat(t,e){if(0===t.length||0===e.length)return t.concat(e);const n=t[t.length-1],s=B.o(n);return 32===s?t.concat(e):B.i(e,s,0|n,t.slice(0,t.length-1))},l(t){const e=t.length;if(0===e)return 0;const n=t[e-1];return 32*(e-1)+B.o(n)},u(t,e){if(32*t.length<e)return t;const n=(t=t.slice(0,s.ceil(e/32))).length;return e&=31,n>0&&e&&(t[n-1]=B.h(e,t[n-1]&2147483648>>e-1,1)),t},h:(t,e,n)=>32===t?e:(n?0|e:e<<32-t)+1099511627776*t,o:t=>s.round(t/1099511627776)||32,i(t,e,n,s){for(void 0===s&&(s=[]);e>=32;e-=32)s.push(n),n=0;if(0===e)return s.concat(t);for(let r=0;r<t.length;r++)s.push(n|t[r]>>>e),n=t[r]<<32-e;const r=t.length?t[t.length-1]:0,o=B.o(r);return s.push(B.h(e+o&31,e+o>32?n:s.pop(),1)),s}},T={bytes:{p(t){const e=B.l(t)/8,n=new o(e);let s;for(let r=0;e>r;r++)3&r||(s=t[r/4]),n[r]=s>>>24,s<<=8;return n},m(t){const e=[];let n,s=0;for(n=0;n<t.length;n++)s=s<<8|t[n],3&~n||(e.push(s),s=0);return 3&n&&e.push(B.h(8*(3&n),s)),e}}},V=class{constructor(t){const e=this;e.blockSize=512,e.S=[1732584193,4023233417,2562383102,271733878,3285377520],e.k=[1518500249,1859775393,2400959708,3395469782],t?(e.v=t.v.slice(0),e.C=t.C.slice(0),e.I=t.I):e.reset()}reset(){const t=this;return t.v=t.S.slice(0),t.C=[],t.I=0,t}update(t){const e=this;"string"==typeof t&&(t=T.A.m(t));const n=e.C=B.concat(e.C,t),s=e.I,o=e.I=s+B.l(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const i=new a(n);let c=0;for(let t=e.blockSize+s-(e.blockSize+s&e.blockSize-1);o>=t;t+=e.blockSize)e.P(i.subarray(16*c,16*(c+1))),c+=1;return n.splice(0,16*c),e}R(){const t=this;let e=t.C;const n=t.v;e=B.concat(e,[B.h(1,1)]);for(let t=e.length+2;15&t;t++)e.push(0);for(e.push(s.floor(t.I/4294967296)),e.push(0|t.I);e.length;)t.P(e.splice(0,16));return t.reset(),n}U(t,e,n,s){return t>19?t>39?t>59?t>79?void 0:e^n^s:e&n|e&s|n&s:e^n^s:e&n|~e&s}W(t,e){return e<<t|e>>>32-t}P(e){const n=this,r=n.v,o=t(80);for(let t=0;16>t;t++)o[t]=e[t];let i=r[0],a=r[1],c=r[2],f=r[3],l=r[4];for(let t=0;79>=t;t++){16>t||(o[t]=n.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const e=n.W(5,i)+n.U(t,a,c,f)+l+o[t]+n.k[s.floor(t/20)]|0;l=f,f=c,c=n.W(30,a),a=i,i=e}r[0]=r[0]+i|0,r[1]=r[1]+a|0,r[2]=r[2]+c|0,r[3]=r[3]+f|0,r[4]=r[4]+l|0}},K={importKey:t=>new K.D(T.bytes.m(t)),M(t,e,n,s){if(n=n||1e4,0>s||0>n)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let i,a,c,f,w;const u=new ArrayBuffer(o),h=new l(u);let p=0;const d=B;for(e=T.bytes.m(e),w=1;(o||1)>p;w++){for(i=a=t.encrypt(d.concat(e,[w])),c=1;n>c;c++)for(a=t.encrypt(a),f=0;f<a.length;f++)i[f]^=a[f];for(c=0;(o||1)>p&&c<i.length;c++)h.setInt32(p,i[c]),p+=4}return u.slice(0,s/8)},D:class{constructor(t){const e=this,n=e._=V,s=[[],[]];e.B=[new n,new n];const r=e.B[0].blockSize/32;t.length>r&&(t=(new n).update(t).R());for(let e=0;r>e;e++)s[0][e]=909522486^t[e],s[1][e]=1549556828^t[e];e.B[0].update(s[0]),e.B[1].update(s[1]),e.T=new n(e.B[0])}reset(){const t=this;t.T=new t._(t.B[0]),t.V=!1}update(t){this.V=!0,this.T.update(t)}digest(){const t=this,e=t.T.R(),n=new t._(t.B[1]).update(e).R();return t.reset(),n}encrypt(t){if(this.V)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},j=typeof h!=k&&typeof h.getRandomValues==v,E="Invalid password",L="Invalid signature",O="zipjs-abort-check-password";function H(t){if(j)return h.getRandomValues(t);throw new r("Crypto API not supported")}const Z=16,F={name:"PBKDF2"},N=e.assign({hash:{name:"HMAC"}},F),q=e.assign({iterations:1e3,hash:{name:"SHA-1"}},F),G=["deriveBits"],J=[8,12,16],Q=[16,24,32],X=10,Y=[0,0,0,0],$=typeof h!=k,tt=$&&h.subtle,et=$&&typeof tt!=k,nt=T.bytes,st=class{constructor(t){const e=this;e.K=[[[],[],[],[],[]],[[],[],[],[],[]]],e.K[0][0][0]||e.j();const n=e.K[0][4],s=e.K[1],o=t.length;let i,a,c,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(e.k=[a=t.slice(0),c=[]],i=o;4*o+28>i;i++){let t=a[i-1];(i%o===0||8===o&&i%o===4)&&(t=n[t>>>24]<<24^n[t>>16&255]<<16^n[t>>8&255]<<8^n[255&t],i%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),a[i]=a[i-o]^t}for(let t=0;i;t++,i--){const e=a[3&t?i:i-4];c[t]=4>=i||4>t?e:s[0][n[e>>>24]]^s[1][n[e>>16&255]]^s[2][n[e>>8&255]]^s[3][n[255&e]]}}encrypt(t){return this.L(t,0)}decrypt(t){return this.L(t,1)}j(){const t=this.K[0],e=this.K[1],n=t[4],s=e[4],r=[],o=[];let i,a,c,f;for(let t=0;256>t;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let l=i=0;!n[l];l^=a||1,i=o[i]||1){let o=i^i<<1^i<<2^i<<3^i<<4;o=o>>8^255&o^99,n[l]=o,s[o]=l,f=r[c=r[a=r[l]]];let w=16843009*f^65537*c^257*a^16843008*l,u=257*r[o]^16843008*o;for(let n=0;4>n;n++)t[n][l]=u=u<<24^u>>>8,e[n][o]=w=w<<24^w>>>8}for(let n=0;5>n;n++)t[n]=t[n].slice(0),e[n]=e[n].slice(0)}L(t,e){if(4!==t.length)throw new r("invalid aes block size");const n=this.k[e],s=n.length/4-2,o=[0,0,0,0],i=this.K[e],a=i[0],c=i[1],f=i[2],l=i[3],w=i[4];let u,h,p,d=t[0]^n[0],y=t[e?3:1]^n[1],m=t[2]^n[2],g=t[e?1:3]^n[3],S=4;for(let t=0;s>t;t++)u=a[d>>>24]^c[y>>16&255]^f[m>>8&255]^l[255&g]^n[S],h=a[y>>>24]^c[m>>16&255]^f[g>>8&255]^l[255&d]^n[S+1],p=a[m>>>24]^c[g>>16&255]^f[d>>8&255]^l[255&y]^n[S+2],g=a[g>>>24]^c[d>>16&255]^f[y>>8&255]^l[255&m]^n[S+3],S+=4,d=u,y=h,m=p;for(let t=0;4>t;t++)o[e?3&-t:t]=w[d>>>24]<<24^w[y>>16&255]<<16^w[m>>8&255]<<8^w[255&g]^n[S++],u=d,d=y,y=m,m=g,g=u;return o}},rt=class{constructor(t,e){this.O=t,this.H=e,this.Z=e}reset(){this.Z=this.H}update(t){return this.F(this.O,t,this.Z)}N(t){if(255&~(t>>24))t+=1<<24;else{let e=t>>16&255,n=t>>8&255,s=255&t;255===e?(e=0,255===n?(n=0,255===s?s=0:++s):++n):++e,t=0,t+=e<<16,t+=n<<8,t+=s}return t}q(t){0===(t[0]=this.N(t[0]))&&(t[1]=this.N(t[1]))}F(t,e,n){let s;if(!(s=e.length))return[];const r=B.l(e);for(let r=0;s>r;r+=4){this.q(n);const s=t.encrypt(n);e[r]^=s[0],e[r+1]^=s[1],e[r+2]^=s[2],e[r+3]^=s[3]}return B.u(e,r)}},ot=K.D;let it=$&&et&&typeof tt.importKey==v,at=$&&et&&typeof tt.deriveBits==v;class ct extends d{constructor({password:t,rawPassword:e,encryptionStrength:n,checkPasswordOnly:s}){super({start(){lt(this,t,e,n)},async transform(t,e){const n=this,{password:i,G:a,J:c,ready:f}=n;i?(await(async(t,e,n,s)=>{const o=await ut(t,e,n,dt(s,0,J[e])),i=dt(s,J[e]);if(o[0]!=i[0]||o[1]!=i[1])throw new r(E)})(n,a,i,dt(t,0,J[a]+2)),t=dt(t,J[a]+2),s?e.error(new r(O)):c()):await f;const l=new o(t.length-X-(t.length-X)%Z);e.enqueue(wt(n,t,l,0,X,!0))},async flush(t){const{X:e,Y:n,pending:s,ready:o}=this;if(n&&e){await o;const i=dt(s,0,s.length-X),a=dt(s,s.length-X);let c=z;if(i.length){const t=mt(nt,i);n.update(t);const s=e.update(t);c=yt(nt,s)}const f=dt(yt(nt,n.digest()),0,X);let l=s.length<X?1:0;for(let t=0;X>t;t++)l|=f[t]^a[t];if(l)throw new r(L);t.enqueue(c)}}})}}class ft extends d{constructor({password:t,rawPassword:e,encryptionStrength:n}){let s;super({start(){lt(this,t,e,n)},async transform(t,e){const n=this,{password:s,G:r,J:i,ready:a}=n;let c=z;s?(c=await(async(t,e,n)=>{const s=H(new o(J[e]));return pt(s,await ut(t,e,n,s))})(n,r,s),i()):await a;const f=new o(c.length+t.length-t.length%Z);f.set(c,0),e.enqueue(wt(n,t,f,c.length,0))},async flush(t){const{X:e,Y:n,pending:r,ready:o}=this;if(n&&e){await o;let i=z;if(r.length){const t=e.update(mt(nt,r));n.update(t),i=yt(nt,t)}s.signature=yt(nt,n.digest()).slice(0,X),t.enqueue(pt(i,s.signature))}}}),s=this}}function lt(t,n,s,r){e.assign(t,{ready:new w(e=>t.J=e),password:ht(n,s),G:r-1,pending:z})}function wt(t,e,n,s,r,i){const{X:a,Y:c,pending:f}=t;f.length&&(e=pt(f,e));const l=e.length-r;let w;for(n=((t,e)=>{if(e&&e>t.length){const n=t;(t=new o(e)).set(n,0)}return t})(n,s+(l-l%Z)),w=0;l-Z>=w;w+=Z){const t=mt(nt,dt(e,w,w+Z));i&&c.update(t);const r=a.update(t);i||c.update(r),n.set(yt(nt,r),w+s)}return t.pending=dt(e,w),n}async function ut(n,s,r,i){n.password=null;const a=await(async(t,e,n,s,r)=>{if(!it)return K.importKey(e);try{return await tt.importKey("raw",e,n,!1,r)}catch{return it=!1,K.importKey(e)}})(0,r,N,0,G),c=await(async(t,e,n)=>{if(!at)return K.M(e,t.salt,q.iterations,n);try{return await tt.deriveBits(t,e,n)}catch{return at=!1,K.M(e,t.salt,q.iterations,n)}})(e.assign({salt:i},q),a,8*(2*Q[s]+2)),f=new o(c),l=mt(nt,dt(f,0,Q[s])),w=mt(nt,dt(f,Q[s],2*Q[s])),u=dt(f,2*Q[s]);return e.assign(n,{keys:{key:l,$:w,passwordVerification:u},X:new rt(new st(l),t.from(Y)),Y:new ot(w)}),u}function ht(t,e){return e===b?(t=>{if(typeof u==k){const e=new o((t=unescape(encodeURIComponent(t))).length);for(let n=0;n<e.length;n++)e[n]=t.charCodeAt(n);return e}return(new u).encode(t)})(t):e}function pt(t,e){let n=t;return t.length+e.length&&(n=new o(t.length+e.length),n.set(t,0),n.set(e,t.length)),n}function dt(t,e,n){return t.subarray(e,n)}function yt(t,e){return t.p(e)}function mt(t,e){return t.m(e)}class gt extends d{constructor({password:t,rawPassword:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){bt(this,t,e,n)},transform(t,e){const n=this;if(n.password||n.rawPassword){const e=kt(n,t.subarray(0,12));if(n.password=n.rawPassword=null,0!=(e.at(-1)^n.passwordVerification))throw new r(E);t=t.subarray(12)}s?e.error(new r(O)):e.enqueue(kt(n,t))}})}}class St extends d{constructor({password:t,rawPassword:e,passwordVerification:n}){super({start(){bt(this,t,e,n)},transform(t,e){const n=this;let s,r;if(n.password||n.rawPassword){n.password=n.rawPassword=null;const e=H(new o(12));e[11]=n.passwordVerification,s=new o(t.length+e.length),s.set(vt(n,e),0),r=12}else s=new o(t.length),r=0;s.set(vt(n,t),r),e.enqueue(s)}})}}function bt(t,n,s,r){e.assign(t,{password:n,rawPassword:s,passwordVerification:r}),((t,n,s)=>{const r=[305419896,591751049,878082192];if(e.assign(t,{keys:r,tt:new M(r[0]),et:new M(r[2])}),s)for(let e=0;e<s.length;e++)zt(t,s[e]);else for(let e=0;e<n.length;e++)zt(t,n.charCodeAt(e))})(t,n,s)}function kt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=Ct(t)^e[s],zt(t,n[s]);return n}function vt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=Ct(t)^e[s],zt(t,e[s]);return n}function zt(t,e){let[,n]=t.keys;t.tt.append([e]);const r=~t.tt.get();n=At(s.imul(At(n+It(r)),134775813)+1),t.et.append([n>>>24]);const o=~t.et.get();t.keys=[r,n,o]}function Ct(t){const e=2|t.keys[2];return It(s.imul(e,1^e)>>>8)}function It(t){return 255&t}function At(t){return 4294967295&t}class xt extends d{constructor(t,{chunkSize:e,nt:n,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:i,zipCrypto:a,signed:c,level:f,deflate64:w}=t,u=this;let h,p,d,y=super.readable;const m=c&&r&&!w&&(!o||a)&&!(!i||!s);o&&!a||!c||m||(h=new _,y=Dt(y,h)),r&&(m?(d=new Pt,y=Mt(y,new s("gzip")),y=Dt(y,d)):y=Wt(y,i,{level:f,chunkSize:e},s,n,s)),o&&(a?y=Dt(y,new St(t)):(p=new ft(t),y=Dt(y,p))),Ut(u,y,()=>{let t;o&&!a&&(t=p.signature),o&&!a||!c||(t=m?d.signature:new l(h.value.buffer).getUint32(0)),u.signature=t})}}class Pt extends d{constructor(){let t,e=10,n=new o(0);super({transform(t,r){if(e){const n=s.min(e,t.length);if(e-=n,!(t=t.subarray(n)).length)return}const i=n.length+t.length;if(8>=i){const e=new o(i);return e.set(n),e.set(t,n.length),void(n=e)}const a=i-8,c=new o(a),f=s.min(a,n.length);c.set(n.subarray(0,f),0),a>f&&c.set(t.subarray(0,a-f),f),r.enqueue(c);const l=new o(8),w=n.length-f;w&&l.set(n.subarray(f),0),l.set(t.subarray(a-f),w),n=l},flush(){const e=new l(n.buffer,n.byteOffset,n.byteLength);t.signature=e.getUint32(0,!0),t.st=e.getUint32(4,!0)}}),t=this}}class Rt extends d{constructor(t,{chunkSize:e,rt:n,DecompressionStream:s}){super({});const{zipCrypto:o,encrypted:i,signed:a,signature:c,compressed:f,useCompressionStream:w,deflate64:u}=t;let h,p,d=super.readable;i&&(o?d=Dt(d,new gt(t)):(p=new ct(t),d=Dt(d,p))),f&&(d=Wt(d,w,{chunkSize:e,deflate64:u},s,n,s),d=(t=>{const e=t.getReader();return new y({async pull(t){let n;try{n=await e.read()}catch(t){if(t&&t.message)throw t;const e=new r("Invalid compressed data");throw e.cause=t,e}const{value:s,done:o}=n;o?t.close():t.enqueue(s)},cancel:t=>e.cancel(t)})})(d)),i&&!o||!a||(h=new _,d=Dt(d,h)),Ut(this,d,()=>{if((!i||o)&&a){const t=new l(h.value.buffer);if(c!=t.getUint32(0,!1))throw new r(L)}})}}function Ut(t,n,s){n=Dt(n,new d({flush:s})),e.defineProperty(t,"readable",{get:()=>n})}function Wt(t,e,n,s,r,o){const i=e&&s?s:r||o,a=n.deflate64?"deflate64-raw":"deflate-raw";let c;try{c=new i(a,n)}catch(t){if(!e)throw t;if(r)c=new r(a,n);else{if(!o)throw t;c=new o(a,n)}}return Mt(t,c)}function Dt(t,e){return t.pipeThrough(e)}function Mt(t,e){const n=e.writable.getWriter(),s=t.getReader();return(async()=>{try{for(;;){await n.ready;const t=await s.read();if(t.done){await n.close();break}await n.write(t.value)}}catch(t){await(async(t,e)=>{try{await t.abort(e)}catch{}})(n,t),await(async(t,e)=>{try{await t.cancel(e)}catch{}})(s,t)}})(),e.readable}const _t="data",Bt="close";class Tt extends d{constructor(t,n){super({});const s=this,{codecType:o}=t;let i;o.startsWith("deflate")?i=xt:o.startsWith("inflate")&&(i=Rt),s.outputSize=0;let a=0;const c=new i(t,n),f=super.readable,l=new d({transform(t,e){t&&t.length&&(a+=t.length,e.enqueue(t))},flush(){e.assign(s,{inputSize:a})}}),w=new d({transform(e,n){if(e&&e.length&&(n.enqueue(e),s.outputSize+=e.length,t.outputSize!==b&&s.outputSize>t.outputSize))throw new r("Invalid uncompressed size")},flush(){const{signature:t}=c;e.assign(s,{signature:t,inputSize:a})}});e.defineProperty(s,"readable",{get:()=>f.pipeThrough(l).pipeThrough(c).pipeThrough(w)})}}class Vt extends d{constructor(t){let e;1>t&&(t=65536),super({transform:(n,s)=>{if(e){const t=new o(e.length+n.length);t.set(e),t.set(n,e.length),n=t,e=null}let r=0;for(;n.length-r>t;)s.enqueue(n.slice(r,r+t)),r+=t;e=r?n.slice(r):n},flush(t){e&&e.length&&t.enqueue(e)}})}}let Kt=2;try{typeof navigator!=k&&navigator.hardwareConcurrency&&(Kt=navigator.hardwareConcurrency)}catch{}const jt={ot:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,it:Kt,ct:5e3,ft:5e3,lt:!0,useCompressionStream:!0,CompressionStream:typeof g!=k&&g,DecompressionStream:typeof S!=k&&S};e.assign({},jt);const Et=new f,Lt=new f;let Ot,Ht,Zt,Ft,Nt,qt=0;async function Gt(t){let e,r;try{const{options:o,config:i}=t;if(!o.useCompressionStream)try{await self.initModule(t.config)}catch{o.useCompressionStream=!0}i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream;const a={highWaterMark:1},c=t.readable||new y({async pull(t){const e=new w(t=>Et.set(qt,t));Jt({type:"pull",messageId:qt}),qt=(qt+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await e;t.enqueue(s),r&&t.close()}},a);r=t.writable||new m({async write(t){let e;const s=new w(t=>e=t);Lt.set(qt,e),Jt({type:_t,value:t,messageId:qt}),qt=(qt+1)%n.MAX_SAFE_INTEGER,await s}},a),e=new Tt(o,i),Ot=new AbortController;const{signal:f}=Ot;await c.pipeThrough(e).pipeThrough(new Vt((t=>s.max(t.chunkSize,64))(i))).pipeTo(r,{signal:f,preventClose:!0,preventAbort:!0}),await r.getWriter().close();const{signature:l,inputSize:u,outputSize:h}=e;Jt({type:Bt,result:{signature:l,inputSize:u,outputSize:h}})}catch(t){if(t.outputSize=e?e.outputSize:0,r&&!r.locked)try{await r.getWriter().close()}catch{}Qt(t)}}function Jt(t){let{value:e}=t;if(e)if(e.length)try{e=new o(e),t.value=e.buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t)}function Qt(t=new r("Unknown error")){const{message:e,stack:n,code:s,name:o,outputSize:i}=t;p({error:{message:e,stack:n,code:s,name:o,outputSize:i}})}function Xt(t,e,n={}){const i="number"==typeof n.level?n.level:-1,a="number"==typeof n.outBuffer?n.outBuffer:65536,c="number"==typeof n.inBufferSize?n.inBufferSize:65536;return new d({start(){try{let n;if(this.wt=Zt(a),this.in=Zt(c),this.inBufferSize=c,!this.wt||!this.in)throw new r("allocation failed");if(this.ut=new o(a),t?(this.ht=Ht.deflate_process,this.dt=Ht.deflate_last_consumed,this.yt=Ht.deflate_end,this.gt=Ht.deflate_new(),n="gzip"===e?Ht.deflate_init_gzip(this.gt,i):"deflate-raw"===e?Ht.deflate_init_raw(this.gt,i):Ht.deflate_init(this.gt,i)):"deflate64-raw"===e?(this.ht=Ht.inflate9_process,this.dt=Ht.inflate9_last_consumed,this.yt=Ht.inflate9_end,this.gt=Ht.inflate9_new(),n=Ht.inflate9_init_raw(this.gt)):(this.ht=Ht.inflate_process,this.dt=Ht.inflate_last_consumed,this.yt=Ht.inflate_end,this.gt=Ht.inflate_new(),n="deflate-raw"===e?Ht.inflate_init_raw(this.gt):"gzip"===e?Ht.inflate_init_gzip(this.gt):Ht.inflate_init(this.gt)),0!==n)throw new r("init failed:"+n)}catch(t){throw f(this),t}},transform(e,n){try{const i=e,c=new o(Nt.buffer),f=this.ht,l=this.dt,w=this.wt,u=this.ut;let h=0;for(;h<i.length;){const e=s.min(i.length-h,32768);if((!this.in||this.inBufferSize<e)&&(this.in&&Ft&&(Ft(this.in),this.in=0),this.in=Zt(e),this.inBufferSize=e,!this.in))throw new r("allocation failed");c.set(i.subarray(h,h+e),this.in);const o=f(this.gt,this.in,e,w,a,0),p=16777215&o;if(p&&(u.set(c.subarray(w,w+p),0),n.enqueue(u.slice(0,p))),!t){const t=o>>24&255,e=128&t?t-256:t;if(0>e)throw new r("process error:"+e)}const d=l(this.gt);if(0===d)break;h+=d}}catch(t){f(this),n.error(t)}},flush(e){try{const n=new o(Nt.buffer),s=this.ht,i=this.wt,c=this.ut;for(;;){const o=s(this.gt,0,0,i,a,4),f=16777215&o,l=o>>24&255;if(!t){const t=128&l?l-256:l;if(0>t)throw new r("process error:"+t)}if(f&&(c.set(n.subarray(i,i+f),0),e.enqueue(c.slice(0,f))),1===l||0===f)break}}catch(t){e.error(t)}finally{const t=f(this);0!==t&&e.error(new r("end error:"+t))}},cancel(){f(this)}});function f(t){let e=0;return t.gt&&t.yt&&(e=t.yt(t.gt)),t.gt=0,t.in&&Ft&&Ft(t.in),t.in=0,t.wt&&Ft&&Ft(t.wt),t.wt=0,e}}addEventListener("message",({data:t})=>{const{type:e,messageId:n,value:s,done:r}=t;try{if("start"==e&&Gt(t),e==_t){const t=Et.get(n);Et.delete(n),t({value:new o(s),done:r})}if("ack"==e){const t=Lt.get(n);Lt.delete(n),t()}e==Bt&&Ot.abort()}catch(t){Qt(t)}});class Yt{constructor(t="deflate",e){return Xt(!0,t,e)}}class $t{constructor(t="deflate",e){return Xt(!1,t,e)}}Yt.St=!0,$t.St=!0;let te=!1;self.initModule=async t=>{try{const e=await(async(t,{baseURI:e})=>{if(!te){let n,s;try{try{s=new URL(t,e)}catch{}const r=await fetch(s);n=await r.arrayBuffer()}catch(e){if(!t.startsWith("data:application/wasm;base64,"))throw e;n=(t=>{const e=t.split(",")[1],n=atob(e),s=n.length,r=new o(s);for(let t=0;s>t;++t)r[t]=n.charCodeAt(t);return r.buffer})(t)}(t=>{if(Ht=t,({malloc:Zt,free:Ft,memory:Nt}=Ht),"function"!=typeof Zt||"function"!=typeof Ft||!Nt)throw Ht=Zt=Ft=Nt=null,new r("Invalid WASM module")})((await WebAssembly.instantiate(n)).instance.exports),te=!0}})(t.wasmURI,t);return t.nt=Yt,t.rt=$t,e}catch{}}});\n';t({workerURI:t=>{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return "data:"+n+","+encodeURIComponent(e)}});}
|
|
215
205
|
|
|
216
206
|
/*
|
|
217
207
|
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
@@ -1224,8 +1214,6 @@
|
|
|
1224
1214
|
if (GET_RANDOM_VALUES_SUPPORTED) {
|
|
1225
1215
|
return crypto.getRandomValues(array);
|
|
1226
1216
|
} else {
|
|
1227
|
-
// all supported runtimes expose crypto.getRandomValues; failing hard beats
|
|
1228
|
-
// silently generating predictable encryption salts
|
|
1229
1217
|
throw new Error(ERR_UNSUPPORTED_CRYPTO_API);
|
|
1230
1218
|
}
|
|
1231
1219
|
}
|
|
@@ -1288,12 +1276,7 @@
|
|
|
1288
1276
|
constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly }) {
|
|
1289
1277
|
super({
|
|
1290
1278
|
start() {
|
|
1291
|
-
|
|
1292
|
-
ready: new Promise(resolve => this.resolveReady = resolve),
|
|
1293
|
-
password: encodePassword(password, rawPassword),
|
|
1294
|
-
strength: encryptionStrength - 1,
|
|
1295
|
-
pending: new Uint8Array()
|
|
1296
|
-
});
|
|
1279
|
+
initAesCrypto(this, password, rawPassword, encryptionStrength);
|
|
1297
1280
|
},
|
|
1298
1281
|
async transform(chunk, controller) {
|
|
1299
1282
|
const aesCrypto = this;
|
|
@@ -1328,7 +1311,7 @@
|
|
|
1328
1311
|
await ready;
|
|
1329
1312
|
const chunkToDecrypt = subarray(pending, 0, pending.length - SIGNATURE_LENGTH);
|
|
1330
1313
|
const originalSignature = subarray(pending, pending.length - SIGNATURE_LENGTH);
|
|
1331
|
-
let decryptedChunkArray =
|
|
1314
|
+
let decryptedChunkArray = EMPTY_UINT8_ARRAY;
|
|
1332
1315
|
if (chunkToDecrypt.length) {
|
|
1333
1316
|
const encryptedChunk = toBits(codecBytes, chunkToDecrypt);
|
|
1334
1317
|
hmac.update(encryptedChunk);
|
|
@@ -1336,8 +1319,6 @@
|
|
|
1336
1319
|
decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
|
|
1337
1320
|
}
|
|
1338
1321
|
const signature = subarray(fromBits(codecBytes, hmac.digest()), 0, SIGNATURE_LENGTH);
|
|
1339
|
-
// branch-free comparison: accumulate the differences instead of
|
|
1340
|
-
// short-circuiting on the first mismatching byte
|
|
1341
1322
|
let invalidSignature = pending.length < SIGNATURE_LENGTH ? 1 : 0;
|
|
1342
1323
|
for (let indexSignature = 0; indexSignature < SIGNATURE_LENGTH; indexSignature++) {
|
|
1343
1324
|
invalidSignature |= signature[indexSignature] ^ originalSignature[indexSignature];
|
|
@@ -1359,12 +1340,7 @@
|
|
|
1359
1340
|
let stream;
|
|
1360
1341
|
super({
|
|
1361
1342
|
start() {
|
|
1362
|
-
|
|
1363
|
-
ready: new Promise(resolve => this.resolveReady = resolve),
|
|
1364
|
-
password: encodePassword(password, rawPassword),
|
|
1365
|
-
strength: encryptionStrength - 1,
|
|
1366
|
-
pending: new Uint8Array()
|
|
1367
|
-
});
|
|
1343
|
+
initAesCrypto(this, password, rawPassword, encryptionStrength);
|
|
1368
1344
|
},
|
|
1369
1345
|
async transform(chunk, controller) {
|
|
1370
1346
|
const aesCrypto = this;
|
|
@@ -1374,7 +1350,7 @@
|
|
|
1374
1350
|
resolveReady,
|
|
1375
1351
|
ready
|
|
1376
1352
|
} = aesCrypto;
|
|
1377
|
-
let preamble =
|
|
1353
|
+
let preamble = EMPTY_UINT8_ARRAY;
|
|
1378
1354
|
if (password) {
|
|
1379
1355
|
preamble = await createEncryptionKeys(aesCrypto, strength, password);
|
|
1380
1356
|
resolveReady();
|
|
@@ -1394,7 +1370,7 @@
|
|
|
1394
1370
|
} = this;
|
|
1395
1371
|
if (hmac && ctr) {
|
|
1396
1372
|
await ready;
|
|
1397
|
-
let encryptedChunkArray =
|
|
1373
|
+
let encryptedChunkArray = EMPTY_UINT8_ARRAY;
|
|
1398
1374
|
if (pending.length) {
|
|
1399
1375
|
const encryptedChunk = ctr.update(toBits(codecBytes, pending));
|
|
1400
1376
|
hmac.update(encryptedChunk);
|
|
@@ -1409,6 +1385,15 @@
|
|
|
1409
1385
|
}
|
|
1410
1386
|
}
|
|
1411
1387
|
|
|
1388
|
+
function initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength) {
|
|
1389
|
+
Object.assign(aesCrypto, {
|
|
1390
|
+
ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
|
|
1391
|
+
password: encodePassword(password, rawPassword),
|
|
1392
|
+
strength: encryptionStrength - 1,
|
|
1393
|
+
pending: EMPTY_UINT8_ARRAY
|
|
1394
|
+
});
|
|
1395
|
+
}
|
|
1396
|
+
|
|
1412
1397
|
function append(aesCrypto, input, output, paddingStart, paddingEnd, verifySignature) {
|
|
1413
1398
|
const {
|
|
1414
1399
|
ctr,
|
|
@@ -1570,20 +1555,13 @@
|
|
|
1570
1555
|
constructor({ password, rawPassword, passwordVerification, checkPasswordOnly }) {
|
|
1571
1556
|
super({
|
|
1572
1557
|
start() {
|
|
1573
|
-
|
|
1574
|
-
password,
|
|
1575
|
-
rawPassword,
|
|
1576
|
-
passwordVerification
|
|
1577
|
-
});
|
|
1578
|
-
createKeys(this, password, rawPassword);
|
|
1558
|
+
initZipCrypto(this, password, rawPassword, passwordVerification);
|
|
1579
1559
|
},
|
|
1580
1560
|
transform(chunk, controller) {
|
|
1581
1561
|
const zipCrypto = this;
|
|
1582
1562
|
if (zipCrypto.password || zipCrypto.rawPassword) {
|
|
1583
1563
|
const decryptedHeader = decrypt(zipCrypto, chunk.subarray(0, HEADER_LENGTH));
|
|
1584
1564
|
zipCrypto.password = zipCrypto.rawPassword = null;
|
|
1585
|
-
// verify the password with a branch-free comparison of the verification byte, mirroring
|
|
1586
|
-
// the constant-time AES HMAC signature check
|
|
1587
1565
|
if ((decryptedHeader.at(-1) ^ zipCrypto.passwordVerification) != 0) {
|
|
1588
1566
|
throw new Error(ERR_INVALID_PASSWORD);
|
|
1589
1567
|
}
|
|
@@ -1604,12 +1582,7 @@
|
|
|
1604
1582
|
constructor({ password, rawPassword, passwordVerification }) {
|
|
1605
1583
|
super({
|
|
1606
1584
|
start() {
|
|
1607
|
-
|
|
1608
|
-
password,
|
|
1609
|
-
rawPassword,
|
|
1610
|
-
passwordVerification
|
|
1611
|
-
});
|
|
1612
|
-
createKeys(this, password, rawPassword);
|
|
1585
|
+
initZipCrypto(this, password, rawPassword, passwordVerification);
|
|
1613
1586
|
},
|
|
1614
1587
|
transform(chunk, controller) {
|
|
1615
1588
|
const zipCrypto = this;
|
|
@@ -1633,6 +1606,15 @@
|
|
|
1633
1606
|
}
|
|
1634
1607
|
}
|
|
1635
1608
|
|
|
1609
|
+
function initZipCrypto(zipCrypto, password, rawPassword, passwordVerification) {
|
|
1610
|
+
Object.assign(zipCrypto, {
|
|
1611
|
+
password,
|
|
1612
|
+
rawPassword,
|
|
1613
|
+
passwordVerification
|
|
1614
|
+
});
|
|
1615
|
+
createKeys(zipCrypto, password, rawPassword);
|
|
1616
|
+
}
|
|
1617
|
+
|
|
1636
1618
|
function decrypt(target, input) {
|
|
1637
1619
|
const output = new Uint8Array(input.length);
|
|
1638
1620
|
for (let index = 0; index < input.length; index++) {
|
|
@@ -1737,14 +1719,6 @@
|
|
|
1737
1719
|
const stream = this;
|
|
1738
1720
|
let crc32Stream, encryptionStream, gzipCrc32Stream;
|
|
1739
1721
|
let readable = super.readable;
|
|
1740
|
-
// The gzip trailer carries a CRC-32 of the uncompressed data (same polynomial as zip),
|
|
1741
|
-
// computed in native code for free during compression. On the native CompressionStream,
|
|
1742
|
-
// harvest it instead of running a separate CRC pass: compress as gzip, then strip the
|
|
1743
|
-
// fixed 10-byte header and 8-byte trailer to recover the exact raw-deflate payload
|
|
1744
|
-
// (byte-identical to a deflate-raw compression) while capturing the CRC. The CRC becomes
|
|
1745
|
-
// available at end-of-stream, exactly like Crc32Stream, so nothing downstream (data
|
|
1746
|
-
// descriptor, central directory, ZipCrypto) needs it any earlier. Not applied for the
|
|
1747
|
-
// pure-JS/WASM ports (a separate slice-by-8 CRC pass is as fast or faster there).
|
|
1748
1722
|
const useGzipCrc32 = signed && compressed && !deflate64 && (!encrypted || zipCrypto) &&
|
|
1749
1723
|
Boolean(useCompressionStream && CompressionStream);
|
|
1750
1724
|
if ((!encrypted || zipCrypto) && signed && !useGzipCrc32) {
|
|
@@ -1781,12 +1755,6 @@
|
|
|
1781
1755
|
}
|
|
1782
1756
|
}
|
|
1783
1757
|
|
|
1784
|
-
// Converts a gzip stream into its raw-deflate payload while capturing the CRC-32 from the gzip
|
|
1785
|
-
// trailer. The CompressionStream gzip header is always the fixed 10-byte form (FLG=0, no optional
|
|
1786
|
-
// fields) per the Compression Streams spec, so it is stripped by length; the trailer is the last
|
|
1787
|
-
// 8 bytes (CRC-32 LE, then ISIZE LE). Bounded memory: at most GZIP_TRAILER_LENGTH bytes are held
|
|
1788
|
-
// back across chunks. The signature is read big-endian-agnostically as a number, matching the
|
|
1789
|
-
// value Crc32Stream produces, so the writer path is unchanged.
|
|
1790
1758
|
class GzipToRawDeflateStream extends TransformStream {
|
|
1791
1759
|
|
|
1792
1760
|
constructor() {
|
|
@@ -1812,10 +1780,6 @@
|
|
|
1812
1780
|
tail = pending;
|
|
1813
1781
|
return;
|
|
1814
1782
|
}
|
|
1815
|
-
// Emit everything except the trailing GZIP_TRAILER_LENGTH bytes as a standalone,
|
|
1816
|
-
// right-sized Uint8Array. Consumers may read chunk.buffer directly (e.g. custom
|
|
1817
|
-
// writers), so an aliased subarray of a larger buffer would leak the held-back
|
|
1818
|
-
// trailer bytes. Bytes are copied exactly once, into `output` or `tail`.
|
|
1819
1783
|
const emitLength = available - GZIP_TRAILER_LENGTH;
|
|
1820
1784
|
const output = new Uint8Array(emitLength);
|
|
1821
1785
|
const fromTail = Math.min(emitLength, tail.length);
|
|
@@ -1904,11 +1868,6 @@
|
|
|
1904
1868
|
throw error;
|
|
1905
1869
|
}
|
|
1906
1870
|
}
|
|
1907
|
-
// The native CompressionStream/DecompressionStream and the pure-JS zlib port do not signal
|
|
1908
|
-
// backpressure on their writable side (their `ready` never pends), so a plain pipeThrough drains
|
|
1909
|
-
// the whole source into them and peak memory grows with the entry size. Awaiting each write()
|
|
1910
|
-
// paces the source to the codec's consumption rate, keeping streaming memory bounded. The WASM
|
|
1911
|
-
// codec already backpressures, so this is a no-op cost for it.
|
|
1912
1871
|
return pipeThroughBackpressured(readable, codecStream);
|
|
1913
1872
|
}
|
|
1914
1873
|
|
|
@@ -1916,10 +1875,6 @@
|
|
|
1916
1875
|
return readable.pipeThrough(transformStream);
|
|
1917
1876
|
}
|
|
1918
1877
|
|
|
1919
|
-
// Like readable.pipeThrough(transformStream), but drives the writable side manually and awaits each
|
|
1920
|
-
// write() so that a codec which under-reports backpressure cannot pull the whole source into memory.
|
|
1921
|
-
// Errors propagate in both directions: a source error aborts the codec; a downstream cancel/error
|
|
1922
|
-
// (surfaced through the codec's writable rejecting) cancels the source.
|
|
1923
1878
|
function pipeThroughBackpressured(readable, transformStream) {
|
|
1924
1879
|
const writer = transformStream.writable.getWriter();
|
|
1925
1880
|
const reader = readable.getReader();
|
|
@@ -1948,7 +1903,7 @@
|
|
|
1948
1903
|
try {
|
|
1949
1904
|
await writer.abort(error);
|
|
1950
1905
|
} catch {
|
|
1951
|
-
// the writable may already be errored/closed
|
|
1906
|
+
// ignored: the writable may already be errored/closed
|
|
1952
1907
|
}
|
|
1953
1908
|
}
|
|
1954
1909
|
|
|
@@ -1956,13 +1911,10 @@
|
|
|
1956
1911
|
try {
|
|
1957
1912
|
await reader.cancel(error);
|
|
1958
1913
|
} catch {
|
|
1959
|
-
// the readable may already be errored/closed
|
|
1914
|
+
// ignored: the readable may already be errored/closed
|
|
1960
1915
|
}
|
|
1961
1916
|
}
|
|
1962
1917
|
|
|
1963
|
-
// DecompressionStream implementations can fail with a message-less TypeError on malformed
|
|
1964
|
-
// input; give these errors an identifiable message (errors raised by the other stages of
|
|
1965
|
-
// the pipeline, e.g. ERR_INVALID_PASSWORD, always carry a message and pass through as-is)
|
|
1966
1918
|
function mapInflateStreamError(readable) {
|
|
1967
1919
|
const reader = readable.getReader();
|
|
1968
1920
|
return new ReadableStream({
|
|
@@ -2291,9 +2243,6 @@
|
|
|
2291
2243
|
try {
|
|
2292
2244
|
await initModule$1(config);
|
|
2293
2245
|
} catch {
|
|
2294
|
-
// The WASM module failed to load. Fall back to the native CompressionStream only if the
|
|
2295
|
-
// zlib codec that would otherwise run depends on that module; a self-contained codec
|
|
2296
|
-
// supplied through config (e.g. the pure-JS port) stays usable and is kept as requested.
|
|
2297
2246
|
const ZlibStream = options.codecType.startsWith(CODEC_DEFLATE) ?
|
|
2298
2247
|
config.CompressionStreamZlib :
|
|
2299
2248
|
config.DecompressionStreamZlib;
|
|
@@ -2371,7 +2320,6 @@
|
|
|
2371
2320
|
return resultValue;
|
|
2372
2321
|
} catch (error) {
|
|
2373
2322
|
await closeWritable();
|
|
2374
|
-
// unblock the pipe watcher if the worker died before closing its end of the stream
|
|
2375
2323
|
abortPipe();
|
|
2376
2324
|
try {
|
|
2377
2325
|
await closed;
|
|
@@ -2396,8 +2344,6 @@
|
|
|
2396
2344
|
const abortController = new AbortController();
|
|
2397
2345
|
const { writable, readable } = new TransformStream();
|
|
2398
2346
|
const closed = readable.pipeTo(writableSource, { preventClose: true, preventAbort: true, signal: abortController.signal });
|
|
2399
|
-
// the pipe can fail before `closed` is awaited (e.g. the destination write fails);
|
|
2400
|
-
// mark the rejection as handled so it cannot kill the process in the meantime
|
|
2401
2347
|
closed.catch(() => { });
|
|
2402
2348
|
return { writable, closed, abortPipe: () => abortController.abort() };
|
|
2403
2349
|
}
|
|
@@ -2490,8 +2436,6 @@
|
|
|
2490
2436
|
event.preventDefault();
|
|
2491
2437
|
}
|
|
2492
2438
|
const { rejectResult, writer, onTaskFinished } = workerData;
|
|
2493
|
-
// the worker is unusable (e.g. its script failed to load); terminate it and
|
|
2494
|
-
// fail the current task instead of letting it hang forever
|
|
2495
2439
|
terminateWorker$1(workerData);
|
|
2496
2440
|
if (rejectResult) {
|
|
2497
2441
|
rejectResult(event.error || new Error(event.message || ERROR_EVENT_TYPE));
|
|
@@ -2543,8 +2487,6 @@
|
|
|
2543
2487
|
async function onMessage({ data }, workerData) {
|
|
2544
2488
|
const { type, value, messageId, result, error } = data;
|
|
2545
2489
|
const { reader, writer, resolveResult, rejectResult, onTaskFinished, generation } = workerData;
|
|
2546
|
-
// continuations below can settle after the worker slot has been reassigned to a new
|
|
2547
|
-
// task (e.g. a pending pull read failing late); they must not touch the new task
|
|
2548
2490
|
const stale = () => workerData.generation != generation;
|
|
2549
2491
|
try {
|
|
2550
2492
|
if (error) {
|
|
@@ -2800,26 +2742,24 @@
|
|
|
2800
2742
|
class Reader extends Stream {
|
|
2801
2743
|
|
|
2802
2744
|
get readable() {
|
|
2745
|
+
return this.createReadable();
|
|
2746
|
+
}
|
|
2747
|
+
|
|
2748
|
+
createReadable({ offset = 0, size, diskNumberStart, chunkSize = DEFAULT_CHUNK_SIZE } = {}) {
|
|
2803
2749
|
const reader = this;
|
|
2804
|
-
|
|
2805
|
-
|
|
2806
|
-
start() {
|
|
2807
|
-
this.chunkOffset = 0;
|
|
2808
|
-
},
|
|
2750
|
+
let chunkOffset = 0;
|
|
2751
|
+
return new ReadableStream({
|
|
2809
2752
|
async pull(controller) {
|
|
2810
|
-
const { offset = 0, size, diskNumberStart } = readable;
|
|
2811
|
-
const { chunkOffset } = this;
|
|
2812
2753
|
const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
|
|
2813
2754
|
const data = await readUint8Array(reader, offset + chunkOffset, dataSize, diskNumberStart);
|
|
2814
2755
|
controller.enqueue(data);
|
|
2815
2756
|
if ((chunkOffset + chunkSize > size) || (size === UNDEFINED_VALUE && !data.length && dataSize)) {
|
|
2816
2757
|
controller.close();
|
|
2817
2758
|
} else {
|
|
2818
|
-
|
|
2759
|
+
chunkOffset += chunkSize;
|
|
2819
2760
|
}
|
|
2820
2761
|
}
|
|
2821
2762
|
});
|
|
2822
|
-
return readable;
|
|
2823
2763
|
}
|
|
2824
2764
|
}
|
|
2825
2765
|
|
|
@@ -2958,8 +2898,6 @@
|
|
|
2958
2898
|
}
|
|
2959
2899
|
});
|
|
2960
2900
|
writer.blob = new Response(transformStream.readable, { headers }).blob();
|
|
2961
|
-
// mark early rejections (e.g. aborted pipe) as handled; awaiting getData() still
|
|
2962
|
-
// surfaces them
|
|
2963
2901
|
writer.blob.catch(() => { });
|
|
2964
2902
|
}
|
|
2965
2903
|
|
|
@@ -3121,7 +3059,7 @@
|
|
|
3121
3059
|
return eocdCache;
|
|
3122
3060
|
}
|
|
3123
3061
|
if (index >= size || length === 0) {
|
|
3124
|
-
return
|
|
3062
|
+
return EMPTY_UINT8_ARRAY;
|
|
3125
3063
|
} else {
|
|
3126
3064
|
if (index + length > size) {
|
|
3127
3065
|
length = size - index;
|
|
@@ -3178,8 +3116,6 @@
|
|
|
3178
3116
|
async function getRequestData(httpReader, sendRequest) {
|
|
3179
3117
|
const response = await sendRequest(HTTP_METHOD_GET, httpReader, getHeaders(httpReader));
|
|
3180
3118
|
httpReader.data = new Uint8Array(await response.arrayBuffer());
|
|
3181
|
-
// the downloaded content is authoritative, e.g. the Content-Length response header
|
|
3182
|
-
// of the HEAD request can be the encoded size when the content is compressed
|
|
3183
3119
|
httpReader.size = httpReader.data.length;
|
|
3184
3120
|
}
|
|
3185
3121
|
|
|
@@ -3244,7 +3180,6 @@
|
|
|
3244
3180
|
super();
|
|
3245
3181
|
Object.assign(this, {
|
|
3246
3182
|
url,
|
|
3247
|
-
// an explicit fetch implementation takes precedence over useXHR
|
|
3248
3183
|
reader: options.useXHR && !options.fetch ? new XHRReader(url, options) : new FetchReader(url, options)
|
|
3249
3184
|
});
|
|
3250
3185
|
}
|
|
@@ -3383,7 +3318,7 @@
|
|
|
3383
3318
|
}
|
|
3384
3319
|
}
|
|
3385
3320
|
} else {
|
|
3386
|
-
result =
|
|
3321
|
+
result = EMPTY_UINT8_ARRAY;
|
|
3387
3322
|
}
|
|
3388
3323
|
reader.lastDiskNumber = Math.max(currentDiskNumber, reader.lastDiskNumber);
|
|
3389
3324
|
return result;
|
|
@@ -3428,8 +3363,6 @@
|
|
|
3428
3363
|
writer.diskOffset += diskSourceWriter.size;
|
|
3429
3364
|
writer.diskNumber++;
|
|
3430
3365
|
diskWriter = null;
|
|
3431
|
-
// the next disk is not opened yet but its space is available; leaving a
|
|
3432
|
-
// stale value here would force a new disk for every subsequent write
|
|
3433
3366
|
writer.availableSize = writer.maxSize;
|
|
3434
3367
|
if (chunk.length > availableSize) {
|
|
3435
3368
|
await this.write(chunk.subarray(availableSize));
|
|
@@ -3609,7 +3542,6 @@
|
|
|
3609
3542
|
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
3610
3543
|
return decodeCP437(value);
|
|
3611
3544
|
} else {
|
|
3612
|
-
// ignoreBOM keeps a leading U+FEFF in filenames/comments instead of dropping it
|
|
3613
3545
|
return new TextDecoder(encoding, { ignoreBOM: true }).decode(value);
|
|
3614
3546
|
}
|
|
3615
3547
|
}
|
|
@@ -3857,8 +3789,6 @@
|
|
|
3857
3789
|
const CHARSET_UTF8 = "utf-8";
|
|
3858
3790
|
const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
|
|
3859
3791
|
const CHARSET_CP437 = "cp437";
|
|
3860
|
-
// bits of the general purpose flag that change how an entry is interpreted; the level bits (1-2) are excluded
|
|
3861
|
-
// because they are informative only
|
|
3862
3792
|
const BITFLAG_AMBIGUITY_MASK = BITFLAG_ENCRYPTED | BITFLAG_DATA_DESCRIPTOR | BITFLAG_LANG_ENCODING_FLAG;
|
|
3863
3793
|
const ZIP64_PROPERTIES = [
|
|
3864
3794
|
[PROPERTY_NAME_UNCOMPRESSED_SIZE, MAX_32_BITS],
|
|
@@ -3900,7 +3830,6 @@
|
|
|
3900
3830
|
if (reader.size < END_OF_CENTRAL_DIR_LENGTH) {
|
|
3901
3831
|
throw new Error(ERR_BAD_FORMAT);
|
|
3902
3832
|
}
|
|
3903
|
-
reader.chunkSize = getChunkSize(config);
|
|
3904
3833
|
const strictness = getStrictness(getOptionValue$1(zipReader, options, OPTION_STRICTNESS), getOptionValue$1(zipReader, options, OPTION_CHECK_AMBIGUITY));
|
|
3905
3834
|
const checkAmbiguity = strictness == STRICTNESS_STRICT;
|
|
3906
3835
|
const rejectAmbiguousEndOfDirectory = strictness != STRICTNESS_TOLERANT;
|
|
@@ -3915,8 +3844,6 @@
|
|
|
3915
3844
|
throw new Error(ERR_EOCDR_NOT_FOUND);
|
|
3916
3845
|
}
|
|
3917
3846
|
}
|
|
3918
|
-
// two or more end-anchored records that each dereference to a valid central directory cannot be told
|
|
3919
|
-
// apart (see comment_length ⟺ EOF): the archive is genuinely ambiguous, so refuse rather than guess
|
|
3920
3847
|
if (rejectAmbiguousEndOfDirectory && endOfDirectoryReachingEndCount > 1) {
|
|
3921
3848
|
throwAmbiguousArchive("multiple end of central directory records");
|
|
3922
3849
|
}
|
|
@@ -3939,7 +3866,7 @@
|
|
|
3939
3866
|
if (directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS) {
|
|
3940
3867
|
const endOfDirectoryLocatorArray = endOfDirectoryInfo.offset >= ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH ?
|
|
3941
3868
|
await readUint8Array(reader, endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH) :
|
|
3942
|
-
|
|
3869
|
+
EMPTY_UINT8_ARRAY;
|
|
3943
3870
|
const endOfDirectoryLocatorView = getDataView$1(endOfDirectoryLocatorArray);
|
|
3944
3871
|
if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
|
|
3945
3872
|
getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
@@ -4006,12 +3933,6 @@
|
|
|
4006
3933
|
}
|
|
4007
3934
|
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength - (reader.lastDiskOffset || 0);
|
|
4008
3935
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4009
|
-
// the reconciled offset (the directory ends exactly where the canonical record begins) is anchored
|
|
4010
|
-
// to the unforgeable end of the archive; the stored offset is not. Prefer the reconciled offset
|
|
4011
|
-
// unless the stored one points at a directory and the reconciled one does not — that exception
|
|
4012
|
-
// keeps a corrupt declared directory length from sending the read astray, while still moving off a
|
|
4013
|
-
// stored offset that only looks valid because an append remnant left the previous (identically
|
|
4014
|
-
// laid out) directory sitting there.
|
|
4015
3936
|
const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4016
3937
|
let reconcile = !storedPointsAtDirectory;
|
|
4017
3938
|
if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
@@ -4168,11 +4089,11 @@
|
|
|
4168
4089
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
4169
4090
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
4170
4091
|
if (extractPrependedData) {
|
|
4171
|
-
zipReader.prependedData = startOffset > 0 ? await readUint8Array(reader, 0, startOffset) :
|
|
4092
|
+
zipReader.prependedData = startOffset > 0 ? await readUint8Array(reader, 0, startOffset) : EMPTY_UINT8_ARRAY;
|
|
4172
4093
|
}
|
|
4173
|
-
zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) :
|
|
4094
|
+
zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : EMPTY_UINT8_ARRAY;
|
|
4174
4095
|
if (extractAppendedData) {
|
|
4175
|
-
zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) :
|
|
4096
|
+
zipReader.appendedData = appendedDataOffset < reader.size ? await readUint8Array(reader, appendedDataOffset, reader.size - appendedDataOffset) : EMPTY_UINT8_ARRAY;
|
|
4176
4097
|
}
|
|
4177
4098
|
return true;
|
|
4178
4099
|
}
|
|
@@ -4284,7 +4205,7 @@
|
|
|
4284
4205
|
filenameLength
|
|
4285
4206
|
} = localDirectory;
|
|
4286
4207
|
const checkAmbiguity = getStrictness(getOptionValue$1(zipEntry, options, OPTION_STRICTNESS), getOptionValue$1(zipEntry, options, OPTION_CHECK_AMBIGUITY)) == STRICTNESS_STRICT;
|
|
4287
|
-
let rawLocalFilename =
|
|
4208
|
+
let rawLocalFilename = EMPTY_UINT8_ARRAY;
|
|
4288
4209
|
if (checkAmbiguity && (filenameLength || extraFieldLength)) {
|
|
4289
4210
|
const trailingDataArray = await readUint8Array(reader, offset + HEADER_SIZE, filenameLength + extraFieldLength, diskNumberStart);
|
|
4290
4211
|
rawLocalFilename = trailingDataArray.subarray(0, filenameLength);
|
|
@@ -4292,7 +4213,7 @@
|
|
|
4292
4213
|
} else {
|
|
4293
4214
|
localDirectory.rawExtraField = extraFieldLength ?
|
|
4294
4215
|
await readUint8Array(reader, offset + HEADER_SIZE + filenameLength, extraFieldLength, diskNumberStart) :
|
|
4295
|
-
|
|
4216
|
+
EMPTY_UINT8_ARRAY;
|
|
4296
4217
|
}
|
|
4297
4218
|
readCommonFooter(zipEntry, localDirectory, dataView, 4, true);
|
|
4298
4219
|
if (checkAmbiguity) {
|
|
@@ -4319,12 +4240,7 @@
|
|
|
4319
4240
|
}
|
|
4320
4241
|
const dataOffset = offset + HEADER_SIZE + filenameLength + extraFieldLength;
|
|
4321
4242
|
const size = compressedSize;
|
|
4322
|
-
const readable = reader.
|
|
4323
|
-
Object.assign(readable, {
|
|
4324
|
-
diskNumberStart,
|
|
4325
|
-
offset: dataOffset,
|
|
4326
|
-
size
|
|
4327
|
-
});
|
|
4243
|
+
const readable = reader.createReadable({ offset: dataOffset, size, diskNumberStart, chunkSize: getChunkSize(config) });
|
|
4328
4244
|
const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
|
|
4329
4245
|
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
4330
4246
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
@@ -4595,7 +4511,6 @@
|
|
|
4595
4511
|
const view = getDataView$1(new Uint8Array(extraField.data));
|
|
4596
4512
|
let uid, gid;
|
|
4597
4513
|
if (isInfoZip) {
|
|
4598
|
-
// Info-ZIP New Unix "ux" field (0x7875): version + variable-length uid/gid
|
|
4599
4514
|
let offset = 0;
|
|
4600
4515
|
const version = getUint8(view, offset++);
|
|
4601
4516
|
const uidSize = getUint8(view, offset++);
|
|
@@ -4605,8 +4520,6 @@
|
|
|
4605
4520
|
gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
|
|
4606
4521
|
Object.assign(extraField, { version, uid, gid });
|
|
4607
4522
|
} else if (extraField.data.length >= 4) {
|
|
4608
|
-
// Info-ZIP Unix "Ux" field (0x7855): fixed 2-byte uid + gid (the file mode, if any, is
|
|
4609
|
-
// carried in the external file attributes, not here)
|
|
4610
4523
|
uid = getUint16(view, 0);
|
|
4611
4524
|
gid = getUint16(view, 2);
|
|
4612
4525
|
Object.assign(extraField, { uid, gid });
|
|
@@ -4658,7 +4571,6 @@
|
|
|
4658
4571
|
timeProperties.forEach((propertyName, indexProperty) => {
|
|
4659
4572
|
if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
|
|
4660
4573
|
const time = getUint32(extraFieldView, offset);
|
|
4661
|
-
// the extended timestamp is a signed 32-bit time_t value
|
|
4662
4574
|
directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
|
|
4663
4575
|
const rawPropertyName = timeRawProperties[indexProperty];
|
|
4664
4576
|
extraFieldExtendedTimestamp[rawPropertyName] = time;
|
|
@@ -4735,7 +4647,6 @@
|
|
|
4735
4647
|
|
|
4736
4648
|
function getStrictness(strictness, checkAmbiguity) {
|
|
4737
4649
|
if (strictness === UNDEFINED_VALUE) {
|
|
4738
|
-
// `checkAmbiguity: true` is kept as a backward-compatible alias for the strictest mode
|
|
4739
4650
|
return checkAmbiguity ? STRICTNESS_STRICT : STRICTNESS_BALANCED;
|
|
4740
4651
|
}
|
|
4741
4652
|
return strictness;
|
|
@@ -4746,81 +4657,45 @@
|
|
|
4746
4657
|
return maxAppendedDataSize;
|
|
4747
4658
|
}
|
|
4748
4659
|
if (strictness == STRICTNESS_STRICT) {
|
|
4749
|
-
// the comment must reach the end of the file: no trailing data tolerated
|
|
4750
4660
|
return 0;
|
|
4751
4661
|
}
|
|
4752
4662
|
if (strictness == STRICTNESS_TOLERANT) {
|
|
4753
4663
|
return Infinity;
|
|
4754
4664
|
}
|
|
4755
|
-
// balanced: tolerate up to a legal comment's worth of trailing data (a 16-bit length); beyond that the
|
|
4756
|
-
// trailing bytes cannot hide inside a comment, so they are treated as a second thing bolted onto the file
|
|
4757
4665
|
return MAX_16_BITS;
|
|
4758
4666
|
}
|
|
4759
4667
|
|
|
4760
|
-
// cap on how many out-of-window central directory probes the scan below may issue. A legitimate archive needs
|
|
4761
|
-
// at most a couple (the canonical record, plus one more to detect genuine ambiguity); every other reachability
|
|
4762
|
-
// check is served from the tail window already in memory. The cap keeps an archive whose comment is stuffed
|
|
4763
|
-
// with unreachable end-anchored records from forcing an unbounded number of (potentially remote) reads.
|
|
4764
4668
|
const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
|
|
4765
4669
|
|
|
4766
|
-
// reachability rankings for an end-anchored candidate record (see getCentralDirectoryReachability)
|
|
4767
4670
|
const CENTRAL_DIRECTORY_UNREACHABLE = 0;
|
|
4768
4671
|
const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
|
|
4769
4672
|
const CENTRAL_DIRECTORY_REACHABLE = 2;
|
|
4770
4673
|
|
|
4771
|
-
// Locates the authoritative end of central directory record. The canonical record is the last one whose
|
|
4772
|
-
// declared comment reaches exactly the end of the file ("end-anchored") and that points to a central directory
|
|
4773
|
-
// ("reachable"); earlier signatures (stale append remnants, bytes embedded in a comment) are ignored. When two
|
|
4774
|
-
// or more end-anchored records point to a central directory the archive is ambiguous, and the count is returned
|
|
4775
|
-
// so the caller can refuse it. A record that reaches the end of the file but points to no central directory (an
|
|
4776
|
-
// empty archive) is only "plausible": it cannot be corroborated, so it never counts towards ambiguity and is
|
|
4777
|
-
// chosen only when no reachable record exists — otherwise an empty record forged in a comment could outrank the
|
|
4778
|
-
// genuine directory. When no record is end-anchored (appended data or an oversized comment), falls back to the
|
|
4779
|
-
// last record within the tolerated window that points to a directory (see seekEndOfCentralDirectory).
|
|
4780
4674
|
async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDataSize) {
|
|
4781
4675
|
const { size } = reader;
|
|
4782
|
-
// an end-anchored record can only live within the last END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS bytes,
|
|
4783
|
-
// since the comment length that ties it to the end of the file is a 16-bit field
|
|
4784
4676
|
const anchoredLength = Math.min(size, END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS);
|
|
4785
|
-
const anchoredOffset = size - anchoredLength;
|
|
4786
|
-
const anchoredArray = await readUint8Array(reader, anchoredOffset, anchoredLength);
|
|
4787
|
-
const anchoredView = getDataView$1(anchoredArray);
|
|
4788
4677
|
const remoteProbeBudget = { count: MAX_END_OF_CENTRAL_DIR_PROBES };
|
|
4789
4678
|
let endOfDirectoryInfo;
|
|
4790
4679
|
let plausibleEndOfDirectoryInfo;
|
|
4791
4680
|
let endOfDirectoryReachingEndCount = 0;
|
|
4792
|
-
for (
|
|
4793
|
-
|
|
4794
|
-
|
|
4795
|
-
const
|
|
4796
|
-
|
|
4797
|
-
|
|
4798
|
-
|
|
4799
|
-
|
|
4800
|
-
|
|
4801
|
-
|
|
4802
|
-
|
|
4803
|
-
offset,
|
|
4804
|
-
buffer: anchoredArray.slice(indexByte, indexByte + END_OF_CENTRAL_DIR_LENGTH).buffer
|
|
4805
|
-
};
|
|
4806
|
-
}
|
|
4807
|
-
endOfDirectoryReachingEndCount++;
|
|
4808
|
-
// the canonical record (highest offset) is found first; a second one is enough to flag ambiguity
|
|
4809
|
-
if (!rejectAmbiguous || endOfDirectoryReachingEndCount > 1) {
|
|
4810
|
-
break;
|
|
4811
|
-
}
|
|
4812
|
-
} else if (reachability == CENTRAL_DIRECTORY_PLAUSIBLE && !plausibleEndOfDirectoryInfo) {
|
|
4813
|
-
plausibleEndOfDirectoryInfo = {
|
|
4814
|
-
offset,
|
|
4815
|
-
buffer: anchoredArray.slice(indexByte, indexByte + END_OF_CENTRAL_DIR_LENGTH).buffer
|
|
4816
|
-
};
|
|
4681
|
+
for await (const [anchoredView, anchoredOffset, anchoredArray, indexByte, offset] of scanEndOfCentralDirectory(reader, anchoredLength)) {
|
|
4682
|
+
const commentLength = getUint16(anchoredView, indexByte + 20);
|
|
4683
|
+
if (offset + END_OF_CENTRAL_DIR_LENGTH + commentLength == size) {
|
|
4684
|
+
const reachability = await getCentralDirectoryReachability(reader, anchoredView, anchoredOffset, indexByte, offset, size, remoteProbeBudget);
|
|
4685
|
+
if (reachability == CENTRAL_DIRECTORY_REACHABLE) {
|
|
4686
|
+
if (!endOfDirectoryInfo) {
|
|
4687
|
+
endOfDirectoryInfo = getEndOfCentralDirectoryInfo(anchoredArray, indexByte, offset);
|
|
4688
|
+
}
|
|
4689
|
+
endOfDirectoryReachingEndCount++;
|
|
4690
|
+
if (!rejectAmbiguous || endOfDirectoryReachingEndCount > 1) {
|
|
4691
|
+
break;
|
|
4817
4692
|
}
|
|
4693
|
+
} else if (reachability == CENTRAL_DIRECTORY_PLAUSIBLE && !plausibleEndOfDirectoryInfo) {
|
|
4694
|
+
plausibleEndOfDirectoryInfo = getEndOfCentralDirectoryInfo(anchoredArray, indexByte, offset);
|
|
4818
4695
|
}
|
|
4819
4696
|
}
|
|
4820
4697
|
}
|
|
4821
4698
|
if (!endOfDirectoryInfo) {
|
|
4822
|
-
// no record points to a directory: prefer a plausible (empty) end-anchored record before scanning the
|
|
4823
|
-
// tolerated window for a bare signature
|
|
4824
4699
|
endOfDirectoryInfo = plausibleEndOfDirectoryInfo;
|
|
4825
4700
|
}
|
|
4826
4701
|
if (!endOfDirectoryInfo) {
|
|
@@ -4829,69 +4704,53 @@
|
|
|
4829
4704
|
return { endOfDirectoryInfo, endOfDirectoryReachingEndCount };
|
|
4830
4705
|
}
|
|
4831
4706
|
|
|
4832
|
-
// Fallback for findEndOfCentralDirectory when no record is end-anchored: appended data or an oversized comment
|
|
4833
|
-
// pushed the record's declared comment past the end of the file, so its position can no longer be reconciled
|
|
4834
|
-
// against the end of the file. Scans the tolerated window from the end and returns the first record that points
|
|
4835
|
-
// to a central directory, so a stray signature embedded in appended data cannot hijack discovery (which the
|
|
4836
|
-
// anchored scan already prevents for anchored records). Falls back to the first plausible (empty) record, then
|
|
4837
|
-
// to the last bare signature, so a degenerate archive still opens as before. The window ends at the file, so the
|
|
4838
|
-
// same in-window / metered reads as the anchored scan apply.
|
|
4839
4707
|
async function seekEndOfCentralDirectory(reader, maxAppendedDataSize, remoteProbeBudget) {
|
|
4840
4708
|
const { size } = reader;
|
|
4841
4709
|
const searchLength = Math.min(size, maxAppendedDataSize == Infinity ? size :
|
|
4842
4710
|
END_OF_CENTRAL_DIR_LENGTH + MAX_16_BITS + maxAppendedDataSize);
|
|
4843
|
-
const searchOffset = size - searchLength;
|
|
4844
|
-
const searchArray = await readUint8Array(reader, searchOffset, searchLength);
|
|
4845
|
-
const searchView = getDataView$1(searchArray);
|
|
4846
4711
|
let firstSignatureInfo, plausibleInfo;
|
|
4847
|
-
for (
|
|
4848
|
-
|
|
4849
|
-
|
|
4850
|
-
|
|
4851
|
-
|
|
4852
|
-
|
|
4853
|
-
|
|
4854
|
-
|
|
4855
|
-
|
|
4856
|
-
|
|
4857
|
-
|
|
4858
|
-
if (reachability == CENTRAL_DIRECTORY_PLAUSIBLE && !plausibleInfo) {
|
|
4859
|
-
plausibleInfo = record;
|
|
4860
|
-
}
|
|
4712
|
+
for await (const [searchView, searchOffset, searchArray, indexByte, offset] of scanEndOfCentralDirectory(reader, searchLength)) {
|
|
4713
|
+
const record = getEndOfCentralDirectoryInfo(searchArray, indexByte, offset);
|
|
4714
|
+
if (!firstSignatureInfo) {
|
|
4715
|
+
firstSignatureInfo = record;
|
|
4716
|
+
}
|
|
4717
|
+
const reachability = await getCentralDirectoryReachability(reader, searchView, searchOffset, indexByte, offset, size, remoteProbeBudget);
|
|
4718
|
+
if (reachability == CENTRAL_DIRECTORY_REACHABLE) {
|
|
4719
|
+
return record;
|
|
4720
|
+
}
|
|
4721
|
+
if (reachability == CENTRAL_DIRECTORY_PLAUSIBLE && !plausibleInfo) {
|
|
4722
|
+
plausibleInfo = record;
|
|
4861
4723
|
}
|
|
4862
4724
|
}
|
|
4863
4725
|
return plausibleInfo || firstSignatureInfo;
|
|
4864
4726
|
}
|
|
4865
4727
|
|
|
4866
|
-
|
|
4867
|
-
|
|
4868
|
-
|
|
4869
|
-
|
|
4870
|
-
|
|
4871
|
-
|
|
4872
|
-
|
|
4873
|
-
|
|
4874
|
-
|
|
4875
|
-
|
|
4876
|
-
|
|
4877
|
-
|
|
4878
|
-
|
|
4728
|
+
async function* scanEndOfCentralDirectory(reader, scanLength) {
|
|
4729
|
+
const scanOffset = reader.size - scanLength;
|
|
4730
|
+
const scanArray = await readUint8Array(reader, scanOffset, scanLength);
|
|
4731
|
+
const scanView = getDataView$1(scanArray);
|
|
4732
|
+
for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
|
|
4733
|
+
if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4734
|
+
yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
|
|
4735
|
+
}
|
|
4736
|
+
}
|
|
4737
|
+
}
|
|
4738
|
+
|
|
4739
|
+
function getEndOfCentralDirectoryInfo(scanArray, indexByte, offset) {
|
|
4740
|
+
return { offset, buffer: scanArray.slice(indexByte, indexByte + END_OF_CENTRAL_DIR_LENGTH).buffer };
|
|
4741
|
+
}
|
|
4742
|
+
|
|
4879
4743
|
async function getCentralDirectoryReachability(reader, view, anchoredOffset, indexByte, offset, size, remoteProbeBudget) {
|
|
4880
4744
|
const filesLength = getUint16(view, indexByte + 10);
|
|
4881
4745
|
const directoryDataLength = getUint32(view, indexByte + 12);
|
|
4882
4746
|
const directoryDataOffset = getUint32(view, indexByte + 16);
|
|
4883
4747
|
if (filesLength == MAX_16_BITS || directoryDataLength == MAX_32_BITS || directoryDataOffset == MAX_32_BITS) {
|
|
4884
|
-
// saturated fields imply a zip64 record; corroborate it with the zip64 end of central directory locator
|
|
4885
|
-
// that sits immediately before it, so saturated bytes inside a comment cannot masquerade as one
|
|
4886
4748
|
const locatorSignature = await readSignature(reader, view, anchoredOffset, offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, size, remoteProbeBudget);
|
|
4887
4749
|
return locatorSignature == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE ? CENTRAL_DIRECTORY_REACHABLE : CENTRAL_DIRECTORY_UNREACHABLE;
|
|
4888
4750
|
}
|
|
4889
4751
|
if (!filesLength && !directoryDataLength) {
|
|
4890
|
-
// a valid empty archive has no central directory to dereference
|
|
4891
4752
|
return CENTRAL_DIRECTORY_PLAUSIBLE;
|
|
4892
4753
|
}
|
|
4893
|
-
// the central directory ends where this record starts; reconcile the stored offset against that actual
|
|
4894
|
-
// position (see stored_cd_offset ⟺ eocd_pos − cd_size) so prepended data does not hide the directory
|
|
4895
4754
|
for (const centralDirectoryOffset of [offset - directoryDataLength, directoryDataOffset]) {
|
|
4896
4755
|
if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4897
4756
|
return CENTRAL_DIRECTORY_REACHABLE;
|
|
@@ -4900,15 +4759,11 @@
|
|
|
4900
4759
|
return CENTRAL_DIRECTORY_UNREACHABLE;
|
|
4901
4760
|
}
|
|
4902
4761
|
|
|
4903
|
-
// Reads a 4-byte little-endian signature at `signatureOffset`, served from the tail window (`view`, spanning
|
|
4904
|
-
// `[anchoredOffset, size)`) when it falls inside it and otherwise from a metered (possibly remote) read. Returns
|
|
4905
|
-
// UNDEFINED_VALUE when the position is out of range or the out-of-window read budget is exhausted.
|
|
4906
4762
|
async function readSignature(reader, view, anchoredOffset, signatureOffset, size, remoteProbeBudget) {
|
|
4907
4763
|
if (signatureOffset < 0 || signatureOffset + 4 > size) {
|
|
4908
4764
|
return UNDEFINED_VALUE;
|
|
4909
4765
|
}
|
|
4910
4766
|
if (signatureOffset >= anchoredOffset) {
|
|
4911
|
-
// the target sits inside the tail window already in memory: no extra read needed
|
|
4912
4767
|
return getUint32(view, signatureOffset - anchoredOffset);
|
|
4913
4768
|
}
|
|
4914
4769
|
if (remoteProbeBudget.count > 0) {
|
|
@@ -4916,7 +4771,6 @@
|
|
|
4916
4771
|
const signatureArray = await readUint8Array(reader, signatureOffset, 4);
|
|
4917
4772
|
return getUint32(getDataView$1(signatureArray), 0);
|
|
4918
4773
|
}
|
|
4919
|
-
// out of budget: leave this candidate unverified rather than issue another read
|
|
4920
4774
|
return UNDEFINED_VALUE;
|
|
4921
4775
|
}
|
|
4922
4776
|
|
|
@@ -4932,8 +4786,6 @@
|
|
|
4932
4786
|
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
4933
4787
|
throwAmbiguousArchive("mismatched local file header (compression method)");
|
|
4934
4788
|
}
|
|
4935
|
-
// when the data descriptor flag is set, the local signature and sizes are zeroed out; all-zero values are
|
|
4936
|
-
// also tolerated when the flag is clear because some tools produce them (streaming writers predating bit 3)
|
|
4937
4789
|
if (!localDirectory.bitFlag.dataDescriptor &&
|
|
4938
4790
|
(localDirectory.signature || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
4939
4791
|
(localDirectory.signature != zipEntry.signature ||
|
|
@@ -5023,7 +4875,6 @@
|
|
|
5023
4875
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
5024
4876
|
const ERR_INVALID_EXTRAFIELD_TYPE = "Extra field type exceeds 65535";
|
|
5025
4877
|
const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
|
|
5026
|
-
// same message as the constant exported by zip-reader.js
|
|
5027
4878
|
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
5028
4879
|
const MIN_UNIX_TIME = -2147483648;
|
|
5029
4880
|
const MAX_UNIX_TIME = 2147483647;
|
|
@@ -5106,12 +4957,12 @@
|
|
|
5106
4957
|
rawExtraField,
|
|
5107
4958
|
} = entry;
|
|
5108
4959
|
const { level, languageEncodingFlag, dataDescriptor } = bitFlag;
|
|
5109
|
-
rawExtraFieldZip64 = rawExtraFieldZip64 ||
|
|
5110
|
-
rawExtraFieldAES = rawExtraFieldAES ||
|
|
5111
|
-
rawExtraFieldExtendedTimestamp = rawExtraFieldExtendedTimestamp ||
|
|
5112
|
-
rawExtraFieldNTFS = rawExtraFieldNTFS ||
|
|
5113
|
-
rawExtraFieldUnix = rawExtraFieldUnix ||
|
|
5114
|
-
rawExtraField = rawExtraField ||
|
|
4960
|
+
rawExtraFieldZip64 = rawExtraFieldZip64 || EMPTY_UINT8_ARRAY;
|
|
4961
|
+
rawExtraFieldAES = rawExtraFieldAES || EMPTY_UINT8_ARRAY;
|
|
4962
|
+
rawExtraFieldExtendedTimestamp = rawExtraFieldExtendedTimestamp || EMPTY_UINT8_ARRAY;
|
|
4963
|
+
rawExtraFieldNTFS = rawExtraFieldNTFS || EMPTY_UINT8_ARRAY;
|
|
4964
|
+
rawExtraFieldUnix = rawExtraFieldUnix || EMPTY_UINT8_ARRAY;
|
|
4965
|
+
rawExtraField = rawExtraField || EMPTY_UINT8_ARRAY;
|
|
5115
4966
|
if (entry.extraFieldAES) {
|
|
5116
4967
|
compressionMethod = COMPRESSION_METHOD_AES;
|
|
5117
4968
|
}
|
|
@@ -5217,7 +5068,7 @@
|
|
|
5217
5068
|
return false;
|
|
5218
5069
|
}
|
|
5219
5070
|
|
|
5220
|
-
async close(comment =
|
|
5071
|
+
async close(comment = EMPTY_UINT8_ARRAY, options = {}) {
|
|
5221
5072
|
const zipWriter = this;
|
|
5222
5073
|
const { pendingAddFileCalls, writer } = this;
|
|
5223
5074
|
const { writable } = writer;
|
|
@@ -5516,7 +5367,7 @@
|
|
|
5516
5367
|
if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(encryptionStrength >= 1 && encryptionStrength <= 3)) {
|
|
5517
5368
|
throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH);
|
|
5518
5369
|
}
|
|
5519
|
-
let rawExtraField =
|
|
5370
|
+
let rawExtraField = EMPTY_UINT8_ARRAY;
|
|
5520
5371
|
const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
|
|
5521
5372
|
if (extraField) {
|
|
5522
5373
|
let extraFieldSize = 0;
|
|
@@ -5577,8 +5428,6 @@
|
|
|
5577
5428
|
let maximumCompressedSize = 0;
|
|
5578
5429
|
let uncompressedSize = 0;
|
|
5579
5430
|
if (passThrough) {
|
|
5580
|
-
// the headers of a passThrough entry describe the payload verbatim: without a
|
|
5581
|
-
// reader they would declare content that is not there
|
|
5582
5431
|
if (!reader) {
|
|
5583
5432
|
throw new Error(ERR_UNDEFINED_READER);
|
|
5584
5433
|
}
|
|
@@ -5589,8 +5438,6 @@
|
|
|
5589
5438
|
}
|
|
5590
5439
|
const zip64Enabled = zip64 === true;
|
|
5591
5440
|
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
5592
|
-
// entries without a reader have no payload: write them as empty stored files instead of
|
|
5593
|
-
// declaring a compressed or encrypted content that does not exist
|
|
5594
5441
|
const encryptedEntry = Boolean(reader) && (Boolean((password && getLength(password)) || (rawPassword && getLength(rawPassword))) || (passThrough && encrypted));
|
|
5595
5442
|
if (!reader) {
|
|
5596
5443
|
level = 0;
|
|
@@ -5728,7 +5575,6 @@
|
|
|
5728
5575
|
fileEntry.diskNumberStart = writer.diskNumber;
|
|
5729
5576
|
fileEntry.offset = getSegmentOffset(zipWriter, writer);
|
|
5730
5577
|
if (usdz) {
|
|
5731
|
-
// the padding depends on the entry offset, only known now that the writer is locked
|
|
5732
5578
|
const previousMetadataSize = entryInfo.metadataSize;
|
|
5733
5579
|
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - writer.diskOffset);
|
|
5734
5580
|
fileEntry.size += entryInfo.metadataSize - previousMetadataSize;
|
|
@@ -5771,10 +5617,6 @@
|
|
|
5771
5617
|
if (releaseLockWriter) {
|
|
5772
5618
|
releaseLockWriter();
|
|
5773
5619
|
}
|
|
5774
|
-
// A buffered entry uses a temporary stream (see `createTempStream`). When that stream is
|
|
5775
|
-
// backed by a resource (a file, an OPFS handle, ...) it must be released on every exit path,
|
|
5776
|
-
// including the error path where the stream is otherwise abandoned without being closed or
|
|
5777
|
-
// cancelled. `dispose()` is optional and best-effort so it never masks the original outcome.
|
|
5778
5620
|
if (bufferedWrite && fileWriter && fileWriter.dispose) {
|
|
5779
5621
|
try {
|
|
5780
5622
|
await fileWriter.dispose();
|
|
@@ -5801,7 +5643,7 @@
|
|
|
5801
5643
|
async function skipDiskIfNeeded() {
|
|
5802
5644
|
if (getLength(headerInfo.localHeaderArray) > writer.availableSize) {
|
|
5803
5645
|
writer.availableSize = 0;
|
|
5804
|
-
await writeData(writer,
|
|
5646
|
+
await writeData(writer, EMPTY_UINT8_ARRAY);
|
|
5805
5647
|
}
|
|
5806
5648
|
}
|
|
5807
5649
|
}
|
|
@@ -5912,8 +5754,7 @@
|
|
|
5912
5754
|
}
|
|
5913
5755
|
const { writable } = writer;
|
|
5914
5756
|
if (reader) {
|
|
5915
|
-
reader.chunkSize
|
|
5916
|
-
const readable = reader.readable;
|
|
5757
|
+
const readable = reader.createReadable ? reader.createReadable({ chunkSize: getChunkSize(config) }) : reader.readable;
|
|
5917
5758
|
const size = reader.size;
|
|
5918
5759
|
const workerOptions = {
|
|
5919
5760
|
options: {
|
|
@@ -6013,13 +5854,9 @@
|
|
|
6013
5854
|
: compressionMethod !== COMPRESSION_METHOD_STORE);
|
|
6014
5855
|
let rawLocalExtraFieldZip64;
|
|
6015
5856
|
const uncompressedFile = passThrough || !compressed;
|
|
6016
|
-
// entries without a data descriptor are always buffered (cf. getFileEntry), so the
|
|
6017
|
-
// zip64 extra field values can be patched into the local header before flushing it
|
|
6018
5857
|
const zip64ExtraFieldComplete = zip64 && (options.bufferedWrite || !dataDescriptor || ((!zip64UncompressedSize && !zip64CompressedSize) || uncompressedFile));
|
|
6019
5858
|
const writeLocalExtraFieldZip64 = zip64ExtraFieldComplete || (zip64 && dataDescriptor && (zip64UncompressedSize || zip64CompressedSize));
|
|
6020
5859
|
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
6021
|
-
// APPNOTE 4.5.3: the zip64 extra field of a local header must include both the
|
|
6022
|
-
// uncompressed and compressed size fields
|
|
6023
5860
|
const length = 4 + 16;
|
|
6024
5861
|
const extraFieldZip64 = createRecordWriter(length);
|
|
6025
5862
|
extraFieldZip64.uint16(EXTRAFIELD_TYPE_ZIP64);
|
|
@@ -6033,7 +5870,7 @@
|
|
|
6033
5870
|
}
|
|
6034
5871
|
}
|
|
6035
5872
|
} else {
|
|
6036
|
-
rawLocalExtraFieldZip64 =
|
|
5873
|
+
rawLocalExtraFieldZip64 = EMPTY_UINT8_ARRAY;
|
|
6037
5874
|
}
|
|
6038
5875
|
let rawExtraFieldAES;
|
|
6039
5876
|
if (encrypted && !zipCrypto) {
|
|
@@ -6043,7 +5880,7 @@
|
|
|
6043
5880
|
rawExtraFieldAES = extraFieldAES.array;
|
|
6044
5881
|
rawExtraFieldAES[8] = encryptionStrength;
|
|
6045
5882
|
} else {
|
|
6046
|
-
rawExtraFieldAES =
|
|
5883
|
+
rawExtraFieldAES = EMPTY_UINT8_ARRAY;
|
|
6047
5884
|
}
|
|
6048
5885
|
let rawExtraFieldNTFS;
|
|
6049
5886
|
let rawExtraFieldExtendedTimestamp;
|
|
@@ -6066,8 +5903,7 @@
|
|
|
6066
5903
|
}
|
|
6067
5904
|
rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
|
|
6068
5905
|
} else {
|
|
6069
|
-
|
|
6070
|
-
rawExtraFieldExtendedTimestamp = new Uint8Array();
|
|
5906
|
+
rawExtraFieldExtendedTimestamp = EMPTY_UINT8_ARRAY;
|
|
6071
5907
|
}
|
|
6072
5908
|
try {
|
|
6073
5909
|
const lastModTimeNTFS = getTimeNTFS(lastModDate);
|
|
@@ -6082,10 +5918,10 @@
|
|
|
6082
5918
|
extraFieldNTFS.uint64(getTimeNTFS(creationDate) || lastModTimeNTFS);
|
|
6083
5919
|
rawExtraFieldNTFS = extraFieldNTFS.array;
|
|
6084
5920
|
} catch {
|
|
6085
|
-
rawExtraFieldNTFS =
|
|
5921
|
+
rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
|
|
6086
5922
|
}
|
|
6087
5923
|
} else {
|
|
6088
|
-
rawExtraFieldNTFS = rawExtraFieldExtendedTimestamp =
|
|
5924
|
+
rawExtraFieldNTFS = rawExtraFieldExtendedTimestamp = EMPTY_UINT8_ARRAY;
|
|
6089
5925
|
}
|
|
6090
5926
|
let rawExtraFieldUnix;
|
|
6091
5927
|
try {
|
|
@@ -6111,10 +5947,10 @@
|
|
|
6111
5947
|
extraFieldUnix.uint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
|
|
6112
5948
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
6113
5949
|
} else {
|
|
6114
|
-
rawExtraFieldUnix =
|
|
5950
|
+
rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
|
|
6115
5951
|
}
|
|
6116
5952
|
} catch {
|
|
6117
|
-
rawExtraFieldUnix =
|
|
5953
|
+
rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
|
|
6118
5954
|
}
|
|
6119
5955
|
if (compressionMethod === UNDEFINED_VALUE) {
|
|
6120
5956
|
compressionMethod = compressed ? COMPRESSION_METHOD_DEFLATE : COMPRESSION_METHOD_STORE;
|
|
@@ -6181,7 +6017,7 @@
|
|
|
6181
6017
|
version,
|
|
6182
6018
|
compressionMethod,
|
|
6183
6019
|
extraFieldExtendedTimestampFlag,
|
|
6184
|
-
rawExtraFieldZip64:
|
|
6020
|
+
rawExtraFieldZip64: EMPTY_UINT8_ARRAY,
|
|
6185
6021
|
localExtraFieldZip64Length,
|
|
6186
6022
|
rawExtraFieldExtendedTimestamp,
|
|
6187
6023
|
rawExtraFieldNTFS,
|
|
@@ -6194,7 +6030,6 @@
|
|
|
6194
6030
|
function appendExtraFieldUSDZ(entryInfo, zipWriterOffset) {
|
|
6195
6031
|
const { headerInfo } = entryInfo;
|
|
6196
6032
|
let { localHeaderArray, extraFieldLength } = headerInfo;
|
|
6197
|
-
let localHeaderArrayView;
|
|
6198
6033
|
let extraBytesLength = 64 - ((zipWriterOffset + getLength(localHeaderArray)) % 64);
|
|
6199
6034
|
if (extraBytesLength < 4) {
|
|
6200
6035
|
extraBytesLength += 64;
|
|
@@ -6207,7 +6042,7 @@
|
|
|
6207
6042
|
headerInfo.localHeaderArray = localHeaderArray = new Uint8Array(getLength(previousLocalHeaderArray) + extraBytesLength);
|
|
6208
6043
|
arraySet(localHeaderArray, previousLocalHeaderArray);
|
|
6209
6044
|
arraySet(localHeaderArray, rawExtraFieldUSDZ, getLength(previousLocalHeaderArray));
|
|
6210
|
-
localHeaderArrayView = getDataView(localHeaderArray);
|
|
6045
|
+
const localHeaderArrayView = getDataView(localHeaderArray);
|
|
6211
6046
|
setUint16(localHeaderArrayView, 28, extraFieldLength + extraBytesLength);
|
|
6212
6047
|
headerInfo.localHeaderView = localHeaderArrayView;
|
|
6213
6048
|
entryInfo.metadataSize += extraBytesLength;
|
|
@@ -6215,7 +6050,7 @@
|
|
|
6215
6050
|
|
|
6216
6051
|
function packUnixId(id) {
|
|
6217
6052
|
if (id === UNDEFINED_VALUE) {
|
|
6218
|
-
return
|
|
6053
|
+
return EMPTY_UINT8_ARRAY;
|
|
6219
6054
|
} else {
|
|
6220
6055
|
const dataArray = new Uint8Array(4);
|
|
6221
6056
|
const dataView = getDataView(dataArray);
|
|
@@ -6258,7 +6093,7 @@
|
|
|
6258
6093
|
dataDescriptor,
|
|
6259
6094
|
dataDescriptorSignature
|
|
6260
6095
|
}) {
|
|
6261
|
-
let dataDescriptorArray =
|
|
6096
|
+
let dataDescriptorArray = EMPTY_UINT8_ARRAY;
|
|
6262
6097
|
let dataDescriptorView, dataDescriptorOffset = 0;
|
|
6263
6098
|
let dataDescriptorLength = zip64 ? DATA_DESCRIPTOR_RECORD_ZIP_64_LENGTH : DATA_DESCRIPTOR_RECORD_LENGTH;
|
|
6264
6099
|
if (dataDescriptorSignature) {
|
|
@@ -6342,7 +6177,6 @@
|
|
|
6342
6177
|
}
|
|
6343
6178
|
}
|
|
6344
6179
|
if (zip64 && localExtraFieldZip64Length) {
|
|
6345
|
-
// the local zip64 extra field always contains both size slots
|
|
6346
6180
|
const localHeaderOffset = HEADER_SIZE + getLength(rawFilename) + 4;
|
|
6347
6181
|
setBigUint64(localHeaderView, localHeaderOffset, BigInt(uncompressedSize));
|
|
6348
6182
|
setBigUint64(localHeaderView, localHeaderOffset + 8, BigInt(compressedSize));
|
|
@@ -6396,7 +6230,7 @@
|
|
|
6396
6230
|
}
|
|
6397
6231
|
rawExtraFieldZip64 = extraFieldZip64.array;
|
|
6398
6232
|
} else {
|
|
6399
|
-
rawExtraFieldZip64 =
|
|
6233
|
+
rawExtraFieldZip64 = EMPTY_UINT8_ARRAY;
|
|
6400
6234
|
}
|
|
6401
6235
|
fileEntry.rawExtraFieldZip64 = rawExtraFieldZip64;
|
|
6402
6236
|
fileEntry.zip64Offset = zip64Offset;
|
|
@@ -6411,7 +6245,7 @@
|
|
|
6411
6245
|
extraFieldTimestamp.uint32(lastModTimeUnix);
|
|
6412
6246
|
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
6413
6247
|
} else {
|
|
6414
|
-
rawExtraFieldTimestamp =
|
|
6248
|
+
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
6415
6249
|
}
|
|
6416
6250
|
fileEntry.rawExtraFieldExtendedTimestamp = rawExtraFieldTimestamp;
|
|
6417
6251
|
const extraFieldLength = getLength(
|
|
@@ -6467,7 +6301,7 @@
|
|
|
6467
6301
|
await writeData(writer, directoryArray.slice(directoryDiskOffset, offset));
|
|
6468
6302
|
directoryDiskOffset = offset;
|
|
6469
6303
|
writer.availableSize = 0;
|
|
6470
|
-
await writeData(writer,
|
|
6304
|
+
await writeData(writer, EMPTY_UINT8_ARRAY);
|
|
6471
6305
|
}
|
|
6472
6306
|
if (indexFileEntry == 0) {
|
|
6473
6307
|
cdStartDiskNumber = writer.diskNumber;
|
|
@@ -6540,7 +6374,7 @@
|
|
|
6540
6374
|
const endOfdirectoryRecord = createRecordWriter(zip64 ? ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH : END_OF_CENTRAL_DIR_LENGTH);
|
|
6541
6375
|
if (getLength(endOfdirectoryRecord.array) + commentLength > writer.availableSize) {
|
|
6542
6376
|
writer.availableSize = 0;
|
|
6543
|
-
await writeData(writer,
|
|
6377
|
+
await writeData(writer, EMPTY_UINT8_ARRAY);
|
|
6544
6378
|
}
|
|
6545
6379
|
lastDiskNumber = writer.diskNumber;
|
|
6546
6380
|
if (zip64) {
|
|
@@ -6637,7 +6471,6 @@
|
|
|
6637
6471
|
return Math.floor(date.getTime() / 1000);
|
|
6638
6472
|
}
|
|
6639
6473
|
|
|
6640
|
-
// the extended timestamp extra field stores dates as signed 32-bit time_t values
|
|
6641
6474
|
function inUnixTimeRange(timeUnix) {
|
|
6642
6475
|
return timeUnix >= MIN_UNIX_TIME && timeUnix <= MAX_UNIX_TIME;
|
|
6643
6476
|
}
|
|
@@ -6822,36 +6655,12 @@
|
|
|
6822
6655
|
const DEFAULT_THRESHOLD = 1024 * 1024;
|
|
6823
6656
|
const DEFAULT_DIRECTORY_NAME = ".zip.js-temp";
|
|
6824
6657
|
|
|
6825
|
-
// Builds a `createTempStream` factory (see `ZipWriter`'s option of the same name) that spills the
|
|
6826
|
-
// data of a buffered entry to the Origin Private File System (OPFS) instead of keeping it in memory.
|
|
6827
|
-
//
|
|
6828
|
-
// It is meant for the buffered-write path (keep-order concurrent `add()`, non-seekable output, ...),
|
|
6829
|
-
// where the compressed data of an entry has to be held until the writer is free. In memory that data
|
|
6830
|
-
// grows with the entry size; here it is written to an OPFS file and streamed back, so peak memory
|
|
6831
|
-
// stays bounded.
|
|
6832
|
-
//
|
|
6833
|
-
// It is hybrid on purpose: an entry stays fully in memory until it exceeds `thresholdBytes`, and only
|
|
6834
|
-
// then spills to a file. Small entries never touch the disk, so a workload made of many tiny entries
|
|
6835
|
-
// keeps the speed of the in-memory default; only genuinely large entries pay for (and benefit from)
|
|
6836
|
-
// the file round-trip.
|
|
6837
|
-
//
|
|
6838
|
-
// OPFS is a browser/worker feature; there is no fallback here. Feature-detect
|
|
6839
|
-
// `navigator.storage.getDirectory` (or inject `getDirectory`) before using it, and let the writer use
|
|
6840
|
-
// its in-memory default elsewhere.
|
|
6841
|
-
//
|
|
6842
|
-
// Options:
|
|
6843
|
-
// thresholdBytes spill to a file once a buffered entry exceeds this size (default 1 MiB).
|
|
6844
|
-
// directoryName name of the OPFS sub-directory holding the temp files (default ".zip.js-temp").
|
|
6845
|
-
// getDirectory returns (or resolves to) the root `FileSystemDirectoryHandle`. Defaults to
|
|
6846
|
-
// `navigator.storage.getDirectory()`. Inject it to run inside a worker with a
|
|
6847
|
-
// pre-obtained handle, or to test against a mock.
|
|
6848
6658
|
function createOPFSTempStream(options = {}) {
|
|
6849
6659
|
const {
|
|
6850
6660
|
thresholdBytes = DEFAULT_THRESHOLD,
|
|
6851
6661
|
directoryName = DEFAULT_DIRECTORY_NAME,
|
|
6852
6662
|
getDirectory = () => navigator.storage.getDirectory()
|
|
6853
6663
|
} = options;
|
|
6854
|
-
// The temp directory is resolved once and shared by every entry of this factory.
|
|
6855
6664
|
let directoryHandlePromise;
|
|
6856
6665
|
function getTempDirectory() {
|
|
6857
6666
|
if (!directoryHandlePromise) {
|
|
@@ -6860,15 +6669,12 @@
|
|
|
6860
6669
|
}
|
|
6861
6670
|
return directoryHandlePromise;
|
|
6862
6671
|
}
|
|
6863
|
-
return
|
|
6672
|
+
return function () {
|
|
6864
6673
|
const memoryChunks = [];
|
|
6865
6674
|
let bufferedSize = 0;
|
|
6866
6675
|
let spilled = false;
|
|
6867
6676
|
let fileName, fileHandle, fileWriter, fileReader;
|
|
6868
6677
|
|
|
6869
|
-
// Move whatever is buffered in memory to a fresh OPFS file, then keep writing to that file.
|
|
6870
|
-
// `FileSystemWritableFileStream` is a `WritableStream`, so it is driven through the standard
|
|
6871
|
-
// writer API rather than its non-standard `write()`/`seek()` convenience methods.
|
|
6872
6678
|
async function spillToFile() {
|
|
6873
6679
|
const directoryHandle = await getTempDirectory();
|
|
6874
6680
|
fileName = crypto.randomUUID();
|
|
@@ -6878,7 +6684,6 @@
|
|
|
6878
6684
|
for (const chunk of memoryChunks) {
|
|
6879
6685
|
await fileWriter.write(chunk);
|
|
6880
6686
|
}
|
|
6881
|
-
// Release the in-memory copy; from now on data lives in the file.
|
|
6882
6687
|
memoryChunks.length = 0;
|
|
6883
6688
|
}
|
|
6884
6689
|
|
|
@@ -6902,9 +6707,6 @@
|
|
|
6902
6707
|
}
|
|
6903
6708
|
});
|
|
6904
6709
|
|
|
6905
|
-
// The writer always closes `writable` before reading `readable`, so `spilled` is final by the
|
|
6906
|
-
// time `pull` runs. It is read lazily here (not in `start`, which runs at construction time,
|
|
6907
|
-
// before anything is written and before `spilled` is known).
|
|
6908
6710
|
let memoryIndex = 0;
|
|
6909
6711
|
const readable = new ReadableStream({
|
|
6910
6712
|
async pull(controller) {
|
|
@@ -6931,11 +6733,6 @@
|
|
|
6931
6733
|
}
|
|
6932
6734
|
}
|
|
6933
6735
|
}, { highWaterMark: 0 });
|
|
6934
|
-
// highWaterMark 0: do not pull (and possibly close on an empty buffer) until the consumer
|
|
6935
|
-
// actually reads, which the writer only does once the data has been fully written.
|
|
6936
|
-
|
|
6937
|
-
// Called by the writer on every exit path (success, error, abort). Best-effort: it must never
|
|
6938
|
-
// throw. Closes any still-open file writer, then deletes the temp file.
|
|
6939
6736
|
async function dispose() {
|
|
6940
6737
|
if (fileWriter) {
|
|
6941
6738
|
try {
|
|
@@ -6996,7 +6793,7 @@
|
|
|
6996
6793
|
// ignored
|
|
6997
6794
|
}
|
|
6998
6795
|
|
|
6999
|
-
const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function g(g){let B;g({wasmURI:()=>(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let C=0;B>C;C+=4){const B=A.indexOf(g[C])<<18|A.indexOf(g[C+1])<<12|(63&A.indexOf(g[C+2]))<<6|63&A.indexOf(g[C+3]);E.push(B>>16&255),"="!==g[C+2]&&E.push(B>>8&255),"="!==g[C+3]&&E.push(255&B);}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;A<g.length;){const I=g[A++];if(128&I){const Q=3+(127&I),D=g[A++]<<8|g[A++],Y=E-D;C(E+Q);for(let A=0;Q>A;A++)B[E++]=B[Y+A];}else {const Q=I;C(E+Q);for(let C=0;Q>C&&A<g.length;C++)B[E++]=g[A++];}}return (g=>{let B="";const E=g.length;let C=0;for(;E>C+2;C+=3){const E=g[C]<<16|g[C+1]<<8|g[C+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E];}const I=E-C;if(1===I){const E=g[C]<<16;B+=A[E>>18&63]+A[E>>12&63]+"==";}else if(2===I){const E=g[C]<<16|g[C+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"=";}return B})(new Uint8Array(B.buffer.slice(0,E)));function C(A){if(B.length<A){let g=2*B.length;for(;A>g;)g*=2;const C=new Uint8Array(g);C.set(B.subarray(0,E)),B=C;}}})("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EAIgDoMA4AEegAAEgQAUgQABAaCEABQBE4AABAEHhAAUAQyAATgBjIAABAFMgAAEAcyAAAQBLIAABAGsgAAEAWyAAAQB7IAABAEcgAAEAZyAAAQBXIAABAHcgAAEATyAAAQBvIAABAF8gAAEAfyAAAQBAoAABAGCgAAEAUKAAAQBwoAABAEigAAEAaKAAAQBYoAABAHigAAEARKAAAQBkoAABAFSgAAEAdKAAAQBMoAABAGygAAEAXKAAAQB8oAABAEKgAAEAYqAAAQBSoAABAHKgAAEASqAAAQBqoAABAFqgAAEAeqAAAQBGoAABAGagAAEAVqAAAQB2oAABIB91wIAuoAABAF6gAAEAfqAAAQBBoAABAGGgAAEAUaAAAQBxoAABAEmgAAEAaaAAAQBZoAABAHmgAAEARaAAAQBloAABAFWgAAEAdaAAAQBNoAABAG2gAAEAXaAAAQB9oAABAEOgAAEAY6AAAQBToAABAHOgAAEAS6AAAQBroAABAFugAAEAe6AAAQBHoAABAGegAAEAV6AAAQB3oAABAE+gAAEAb6AAAQBfoAABAH+gAAEAQGAAAQBgYAABAFBgAAEAcGAAAQBIYAABAGhgAAEAWGAAAQB4YAABAERgAAEAZGAAAQBUYAABAHRgAAEATGAAAQBsYAABAFxgAAEAfGAAAQBCYAABAGJgAAEAUmAAAQByYAABAEpgAAEAamAAAQBaYAABAHpgAAEARmAAAQBmYAABAFZgAAEAdmAAAQBOYAABAG5gAAEAXmAAAQB+YAABAEFgAAEAYWAAAQBRYAABAHFgAAEASWAAAQBpYAABAFlgAAEAeWAAAQBFYAABAGVgAAEAVWAAAQB1YAABAE1gAAEAbWAAAQBdYAABAH1gAAEAQ2AAAQBjYAABAFNgAAEAc2AAASADegCAK2AAAQBbYAABAHtgAAEAR2AAAQBnYAABAFdgAAEAd2AAAQBPYAABAG9gAAEAX2AAAQB/YAABAETgADCBRMBCQCTgAAIAZOAAAgBU4AACAFTgAAIAdOAAAgB04AACAEzgAAIATOAAAgBs4AACAGzgAAIAXOAAAgBc4AACAHzgAAIAfOAAAgBC4AACIANi4AEAoAABIAACAFLgAAIAUuAAAgBy4AACAHLgAAIASuAAAgBK4AACAGrgAAIAauAAAgBa4AACAFrgAAIAeuAAAgB64AACAEbgAAIARuAAAgBm4AACAGbgAAIAVuAAAgBW4AACAHbgAAIAduAAAgBO4AACAE7gAAIAbuAAAgBu4AACAF7gAAIAXuAAAgB+4AACAH7gAAIgQO2AQeAAAgBh4AACAGHgAAIAUeAAAgBR4AACAHHgAAIAceAAAgBJ4AACAEngAAIAaeAAAgBp4AACAFngAAIAWeAAAgB54AACAHngAAIAReAAAgBF4AACAGXgAAIAZeAAAgBV4AACAFXgAAIAdeAAAgB14AACAE3gAAIATeAAAgBt4AACAG3gAAIAXeAAAgBd4AACAH3gAAIAfeAAAgBD4AACAEPgAAIAY+AAAgBj4AACAFPgAAIAU+AAAgBz4AACAHPgAAIAS+AAAgBL4AACAGvgAAIAa+AAAgBb4AACAFvgAAIAe+AAAgB74AACAEfgAAIAR+AAAgBn4AACAGfgAAIAV+AAAgBX4AACAHfgAAIAd+AAAgBP4AACAE/gAAIAb+AAAgBv4AACAF/gAAIAX+AAAgB/4AACAH/gAAIgQQKAUCAAAQBIIAABAFggAAEARCAAAQBUIAABAEwgAAEAXCCBVYDBwBIgAAEASiAAAQBaIAABAEYgAAEAViAAAQBOIAABAF4gAAEAQSAAAQBRIAABAEkgAAEAWSAAAQBFIAABAFUgAAEATSAAAQBdIAABAEDgABCAYOAAAQBQ4AABAHDgAAEASOAAAQBo4AABAFjgAAEAeOAAASAwmaAAHSBAsYBBYAAXAEFggVKARSAAAQBDIAABAEcgAAEgEVZgAREAQWCBgQBGoIF6gEFgAPUAQWAA7gBBYADnIBPy4AABAERgAAEAQmAAAQBGYAABIEAAgEVgAAEAQ2AAAQBHYAABAEDgAAEAROCBkABBYACLIEFpgEFgAG0AQWAOz0DGwtNgxx6hwAEAQKMAASBB1GJAAQBBIwABAEFigAEBEGwHAuAwUKLAEuNADuFAC8BBoQABIEFiIEABIEBCoEABIEBkoEABICI3YIABAELhAAEAQyEAASABduBR8EE4B0LI4UAX4UFywIQEYAFbQYHCQYKBQuAN44EDQIOAYAHJQSUHgtphQCQhQCIhQCAhQB4gQBogQBcgQYfARCAAAQBFIAABAEYgAAEARyAAAQBIIAABAEogAAEATCAAAQBOIAABAFAgAAEAVCAAASBBr0BcIAABAGAgAAEAaCAAAQBwIAABAHggABvAx8Lco0Ab4EAa4EAZ4EAY4EAX4EAW4EAV4EAU4EAT4EAS4EAR4EAQ4EBPAGArwBBgFIiAgttgQDHAQSAAAIBCIAABIEBM4ECSwEQgAAOgwAMgaLcgK6bhAAkgQdzgQBPAQiAAAiBABiFAAyBCLeDAAwBIIEAlIAvUoEAawGAgQgvAQSDAAyAPCIKAQAQDABBkSEL/4Ah4AEDgqBGBQgJCQoKgEmBgAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBghoEBAQFBYHGDQEHgAABAQiEAAGAXZuCAAEBCowAAYAkc4oAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgL/0gIFTA1BLAQ==")),B)});}
|
|
6796
|
+
const n=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],c=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],s=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],f=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],z=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],t=new Uint8Array(288);t.fill(8,0,144),t.fill(9,144,256),t.fill(7,256,280),t.fill(8,280,288);const u=new Uint8Array(30).fill(5);function r(n){const c=new Uint16Array(16);for(const s of n)c[s]++;c[0]=0;const s=new Uint16Array(17);for(let n=1;15>=n;n++)s[n+1]=s[n]+c[n];const f=new Uint16Array(n.length);for(let c=0;c<n.length;c++)n[c]&&(f[s[n[c]]++]=c);return {t:c,symbols:f}}const l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function U(U){let e;U({wasmURI:()=>(e||(e="data:application/wasm;base64,"+(n=>{let c="";const s=n.length;let f=0;for(;s>f+2;f+=3){const s=n[f]<<16|n[f+1]<<8|n[f+2];c+=l[s>>18&63]+l[s>>12&63]+l[s>>6&63]+l[63&s];}const z=s-f;if(1===z){const s=n[f]<<16;c+=l[s>>18&63]+l[s>>12&63]+"==";}else if(2===z){const s=n[f]<<16|n[f+1]<<8;c+=l[s>>18&63]+l[s>>12&63]+l[s>>6&63]+"=";}return c})((l=>{let U=0,e=0,o=0,a=new Uint8Array(1024),y=0,i=0;for(;!i;){i=w(1);const n=w(2);if(0==n)V();else if(1==n)j(r(t),r(u));else {if(2!=n)throw Error("invalid deflate block type");j(...m());}}return a.subarray(0,y);function b(){if(U>=l.length)throw Error("unexpected end of deflate data");return l[U++]}function w(n){for(;n>o;)e|=b()<<o,o+=8;const c=e&(1<<n)-1;return e>>>=n,o-=n,c}function V(){e=0,o=0;const n=b()|b()<<8;U+=2,L(y+n);for(let c=0;n>c;c++)a[y++]=b();}function j(z,t){let u=q(z);for(;256!=u;){if(256>u)L(y+1),a[y++]=u;else {const z=u-257,r=n[z]+w(c[z]),l=q(t),U=s[l]+w(f[l]);L(y+r);const e=y-U;for(let n=0;r>n;n++)a[y++]=a[e+n];}u=q(z);}}function m(){const n=w(5)+257,c=w(5)+1,s=w(4)+4,f=new Uint8Array(19);for(let n=0;s>n;n++)f[z[n]]=w(3);const t=r(f),u=new Uint8Array(n+c);let l=0;for(;l<u.length;){const n=q(t);if(16>n)u[l++]=n;else if(16==n){const n=u[l-1];let c=w(2)+3;for(;c--;)u[l++]=n;}else l+=17==n?w(3)+3:w(7)+11;}return [r(u.subarray(0,n)),r(u.subarray(n))]}function q(n){const{t:c,symbols:s}=n;let f=0,z=0,t=0;for(let n=1;15>=n;n++){f|=w(1);const u=c[n];if(u>f-z)return s[t+(f-z)];t+=u,z=z+u<<1,f<<=1;}throw Error("invalid huffman code")}function L(n){if(a.length<n){let c=2*a.length;for(;n>c;)c*=2;const s=new Uint8Array(c);s.set(a.subarray(0,y)),a=s;}}})((n=>{const c=(n=(n+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,s=[];for(let f=0;c>f;f+=4){const c=l.indexOf(n[f])<<18|l.indexOf(n[f+1])<<12|(63&l.indexOf(n[f+2]))<<6|63&l.indexOf(n[f+3]);s.push(c>>16&255),"="!==n[f+2]&&s.push(c>>8&255),"="!==n[f+3]&&s.push(255&c);}return new Uint8Array(s)})("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")))),e)});}
|
|
7000
6797
|
|
|
7001
6798
|
/*
|
|
7002
6799
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -7318,7 +7115,7 @@
|
|
|
7318
7115
|
|
|
7319
7116
|
let modulePromise;
|
|
7320
7117
|
|
|
7321
|
-
|
|
7118
|
+
U(configure);
|
|
7322
7119
|
configureWorker({
|
|
7323
7120
|
initModule: config => {
|
|
7324
7121
|
if (!modulePromise) {
|
|
@@ -7397,8 +7194,6 @@
|
|
|
7397
7194
|
uncompressedSize: params.uncompressedSize || 0,
|
|
7398
7195
|
passThrough: params.passThrough
|
|
7399
7196
|
});
|
|
7400
|
-
// detached entries (e.g. clones) are not registered until they are attached,
|
|
7401
|
-
// otherwise they could never be garbage collected
|
|
7402
7197
|
if (parent || !fs.root) {
|
|
7403
7198
|
fs.entries[zipEntry.id] = zipEntry;
|
|
7404
7199
|
}
|
|
@@ -7467,7 +7262,7 @@
|
|
|
7467
7262
|
if (!writer || (writer.constructor == zipEntry.Writer && zipEntry.data)) {
|
|
7468
7263
|
return zipEntry.data;
|
|
7469
7264
|
} else {
|
|
7470
|
-
const reader = zipEntry.reader =
|
|
7265
|
+
const reader = zipEntry.reader = createReader(zipEntry.Reader, zipEntry.data, options);
|
|
7471
7266
|
const uncompressedSize = zipEntry.data ? zipEntry.data.uncompressedSize : reader.size;
|
|
7472
7267
|
await Promise.all([initStream(reader), initStream(writer, uncompressedSize)]);
|
|
7473
7268
|
const { readable } = reader;
|
|
@@ -7523,11 +7318,7 @@
|
|
|
7523
7318
|
}
|
|
7524
7319
|
|
|
7525
7320
|
async getArrayBuffer(options) {
|
|
7526
|
-
// this.data may be a string, a Uint8Array, a data URI or a Blob depending on how the entry
|
|
7527
|
-
// was created, so retrieve the bytes through getUint8Array rather than assuming a Blob; this
|
|
7528
|
-
// also applies the options (password, signal, onprogress...) like the other getData() getters
|
|
7529
7321
|
const array = await this.getUint8Array(options);
|
|
7530
|
-
// return the backing buffer directly when the array spans it, slicing the exact bytes otherwise
|
|
7531
7322
|
return array.byteOffset || array.byteLength != array.buffer.byteLength
|
|
7532
7323
|
? array.buffer.slice(array.byteOffset, array.byteOffset + array.byteLength)
|
|
7533
7324
|
: array.buffer;
|
|
@@ -7897,7 +7688,6 @@
|
|
|
7897
7688
|
node = node.getChildByName(path[index]);
|
|
7898
7689
|
}
|
|
7899
7690
|
if (!node) {
|
|
7900
|
-
// exclude detached entries, e.g. clones registered in `entries` but not attached
|
|
7901
7691
|
node = this.entries.find(entry => entry && (entry == this.root || entry.isDescendantOf(this.root)) &&
|
|
7902
7692
|
entry.getRelativeName() == fullname);
|
|
7903
7693
|
}
|
|
@@ -8069,10 +7859,13 @@
|
|
|
8069
7859
|
};
|
|
8070
7860
|
}
|
|
8071
7861
|
|
|
7862
|
+
function createReader(Reader, data, options) {
|
|
7863
|
+
return Reader.prototype ? new Reader(data, options) : Reader(data, options);
|
|
7864
|
+
}
|
|
7865
|
+
|
|
8072
7866
|
async function initReaders(entry, options) {
|
|
8073
7867
|
const fileEntries = [];
|
|
8074
7868
|
const pendingEntries = [entry];
|
|
8075
|
-
// per-export map so concurrent exports do not share (and lock) the same readers
|
|
8076
7869
|
const readers = new Map();
|
|
8077
7870
|
while (pendingEntries.length) {
|
|
8078
7871
|
const pendingEntry = pendingEntries.pop();
|
|
@@ -8085,7 +7878,7 @@
|
|
|
8085
7878
|
}
|
|
8086
7879
|
}
|
|
8087
7880
|
await Promise.all(fileEntries.map(async child => {
|
|
8088
|
-
const reader = child.reader =
|
|
7881
|
+
const reader = child.reader = createReader(child.Reader, child.data, options);
|
|
8089
7882
|
readers.set(child, reader);
|
|
8090
7883
|
try {
|
|
8091
7884
|
await initStream(reader);
|
|
@@ -8250,7 +8043,6 @@
|
|
|
8250
8043
|
return directoryHandle;
|
|
8251
8044
|
|
|
8252
8045
|
async function exportChildren(entry, parentHandle) {
|
|
8253
|
-
// Separate files have no ordering constraint, so they can be written concurrently on demand.
|
|
8254
8046
|
if (options.concurrent) {
|
|
8255
8047
|
const results = await Promise.allSettled(entry.children.map(child => exportChild(child, parentHandle)));
|
|
8256
8048
|
const failedResult = results.find(result => result.status == "rejected");
|
|
@@ -8272,8 +8064,6 @@
|
|
|
8272
8064
|
} else {
|
|
8273
8065
|
const fileHandle = await parentHandle.getFileHandle(child.name, { create: true });
|
|
8274
8066
|
const writable = await fileHandle.createWritable();
|
|
8275
|
-
// getData() streams the entry's data into `writable` and closes it (a FileSystemWritableFileStream
|
|
8276
|
-
// only commits the file on close), applying options such as password, signal and onprogress.
|
|
8277
8067
|
await child.getData({ writable }, Object.assign({}, options, {
|
|
8278
8068
|
onprogress: async progress => {
|
|
8279
8069
|
if (options.onprogress) {
|
|
@@ -8592,7 +8382,6 @@
|
|
|
8592
8382
|
"x-doom": "wad",
|
|
8593
8383
|
"x-dvi": "dvi",
|
|
8594
8384
|
"x-httpd-eruby": "rhtml",
|
|
8595
|
-
"x-font": "pcf.Z",
|
|
8596
8385
|
"x-freemind": "mm",
|
|
8597
8386
|
"x-gnumeric": "gnumeric",
|
|
8598
8387
|
"x-go-sgf": "sgf",
|
|
@@ -9279,7 +9068,7 @@
|
|
|
9279
9068
|
"x-msbinder": "obd",
|
|
9280
9069
|
"x-mscardfile": "crd",
|
|
9281
9070
|
"x-msclip": "clp",
|
|
9282
|
-
"
|
|
9071
|
+
"x-ms-installer": "msi",
|
|
9283
9072
|
"x-msmediaview": [
|
|
9284
9073
|
"mvb",
|
|
9285
9074
|
"m13",
|
|
@@ -9642,7 +9431,10 @@
|
|
|
9642
9431
|
],
|
|
9643
9432
|
"x-tga": "tga",
|
|
9644
9433
|
"cis-cod": "cod",
|
|
9645
|
-
"avif":
|
|
9434
|
+
"avif": [
|
|
9435
|
+
"avif",
|
|
9436
|
+
"avifs"
|
|
9437
|
+
],
|
|
9646
9438
|
"heic": [
|
|
9647
9439
|
"heif",
|
|
9648
9440
|
"heic"
|
|
@@ -9861,7 +9653,6 @@
|
|
|
9861
9653
|
"vnd.wap.sl": "sl"
|
|
9862
9654
|
},
|
|
9863
9655
|
"video": {
|
|
9864
|
-
"avif": "avif",
|
|
9865
9656
|
"3gpp": "3gp",
|
|
9866
9657
|
"annodex": "axv",
|
|
9867
9658
|
"dl": "dl",
|
|
@@ -9980,25 +9771,29 @@
|
|
|
9980
9771
|
}
|
|
9981
9772
|
};
|
|
9982
9773
|
|
|
9983
|
-
|
|
9984
|
-
|
|
9985
|
-
|
|
9986
|
-
|
|
9987
|
-
|
|
9988
|
-
|
|
9989
|
-
|
|
9990
|
-
|
|
9991
|
-
|
|
9992
|
-
|
|
9774
|
+
let mimeTypes;
|
|
9775
|
+
|
|
9776
|
+
function getMimeType(filename) {
|
|
9777
|
+
return filename && getMimeTypes()[filename.split(".").pop().toLowerCase()] || getMimeType$1();
|
|
9778
|
+
}
|
|
9779
|
+
|
|
9780
|
+
function getMimeTypes() {
|
|
9781
|
+
if (!mimeTypes) {
|
|
9782
|
+
mimeTypes = {};
|
|
9783
|
+
for (const type of Object.keys(table)) {
|
|
9784
|
+
for (const subtype of Object.keys(table[type])) {
|
|
9785
|
+
const value = table[type][subtype];
|
|
9786
|
+
if (typeof value == "string") {
|
|
9787
|
+
mimeTypes[value] = type + "/" + subtype;
|
|
9788
|
+
} else {
|
|
9789
|
+
for (let indexMimeType = 0; indexMimeType < value.length; indexMimeType++) {
|
|
9790
|
+
mimeTypes[value[indexMimeType]] = type + "/" + subtype;
|
|
9791
|
+
}
|
|
9993
9792
|
}
|
|
9994
9793
|
}
|
|
9995
9794
|
}
|
|
9996
9795
|
}
|
|
9997
9796
|
return mimeTypes;
|
|
9998
|
-
})();
|
|
9999
|
-
|
|
10000
|
-
function getMimeType(filename) {
|
|
10001
|
-
return filename && mimeTypes[filename.split(".").pop().toLowerCase()] || getMimeType$1();
|
|
10002
9797
|
}
|
|
10003
9798
|
|
|
10004
9799
|
/*
|
|
@@ -10030,7 +9825,7 @@
|
|
|
10030
9825
|
*/
|
|
10031
9826
|
|
|
10032
9827
|
|
|
10033
|
-
t(configure);
|
|
9828
|
+
t$1(configure);
|
|
10034
9829
|
|
|
10035
9830
|
exports.BlobReader = BlobReader;
|
|
10036
9831
|
exports.BlobWriter = BlobWriter;
|
|
@@ -10056,6 +9851,7 @@
|
|
|
10056
9851
|
exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
|
|
10057
9852
|
exports.ERR_INVALID_UNCOMPRESSED_SIZE = ERR_INVALID_UNCOMPRESSED_SIZE;
|
|
10058
9853
|
exports.ERR_INVALID_VERSION = ERR_INVALID_VERSION;
|
|
9854
|
+
exports.ERR_ITERATOR_COMPLETED_TOO_SOON = ERR_ITERATOR_COMPLETED_TOO_SOON;
|
|
10059
9855
|
exports.ERR_LOCAL_FILE_HEADER_NOT_FOUND = ERR_LOCAL_FILE_HEADER_NOT_FOUND;
|
|
10060
9856
|
exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
10061
9857
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
@@ -10064,6 +9860,7 @@
|
|
|
10064
9860
|
exports.ERR_UNSUPPORTED_COMPRESSION = ERR_UNSUPPORTED_COMPRESSION$1;
|
|
10065
9861
|
exports.ERR_UNSUPPORTED_ENCRYPTION = ERR_UNSUPPORTED_ENCRYPTION;
|
|
10066
9862
|
exports.ERR_UNSUPPORTED_FORMAT = ERR_UNSUPPORTED_FORMAT;
|
|
9863
|
+
exports.ERR_WRITER_NOT_INITIALIZED = ERR_WRITER_NOT_INITIALIZED;
|
|
10067
9864
|
exports.ERR_ZIP_NOT_EMPTY = ERR_ZIP_NOT_EMPTY;
|
|
10068
9865
|
exports.HttpRangeReader = HttpRangeReader;
|
|
10069
9866
|
exports.HttpReader = HttpReader;
|