@zip.js/zip.js 2.8.53 → 2.8.55
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/README.md +1 -1
- package/deno.json +2 -1
- package/dist/zip-core-external.js +737 -491
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +745 -490
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +776 -525
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +738 -510
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +776 -525
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +790 -525
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +791 -526
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +746 -491
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +746 -491
- 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 +747 -492
- package/dist/zip.min.js +1 -1
- package/eslint.config.mjs +1 -0
- package/index-native.cjs +790 -525
- package/index-native.min.js +1 -1
- package/index.cjs +791 -526
- package/index.d.cts +422 -49
- package/index.d.ts +422 -49
- package/index.min.js +1 -1
- package/lib/core/configuration.js +62 -21
- package/lib/core/constants.js +13 -1
- package/lib/core/io.js +33 -27
- package/lib/core/options.js +44 -2
- package/lib/core/streams/aes-crypto-stream.js +12 -12
- package/lib/core/util/decode-text.js +11 -2
- package/lib/core/web-worker-base.js +3 -2
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-fs.js +39 -32
- package/lib/core/zip-reader.js +100 -38
- package/lib/core/zip-writer.js +301 -177
- package/lib/core/zlib-streams-inline.js +1 -1
- package/lib/zip-core-base.js +6 -1
- package/lib/zip-core-reader.js +1 -0
- package/lib/zip-core-writer.js +5 -0
- package/package.json +8 -2
package/dist/zip.js
CHANGED
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
|
|
46
46
|
const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
|
|
47
47
|
const SPLIT_ZIP_FILE_SIGNATURE = 0x08074b50;
|
|
48
|
+
const TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE = 0x30304b50;
|
|
48
49
|
const DATA_DESCRIPTOR_RECORD_SIGNATURE = SPLIT_ZIP_FILE_SIGNATURE;
|
|
49
50
|
const ARCHIVE_EXTRA_DATA_SIGNATURE = 0x08064b50;
|
|
50
51
|
const DIGITAL_SIGNATURE_RECORD_SIGNATURE = 0x05054b50;
|
|
@@ -61,6 +62,7 @@
|
|
|
61
62
|
const DATA_DESCRIPTOR_RECORD_LENGTH = 12;
|
|
62
63
|
const DATA_DESCRIPTOR_RECORD_ZIP_64_LENGTH = 20;
|
|
63
64
|
const DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH = 4;
|
|
65
|
+
const SPLIT_ZIP_FILE_SIGNATURE_LENGTH = 4;
|
|
64
66
|
|
|
65
67
|
const EXTRAFIELD_TYPE_ZIP64 = 0x0001;
|
|
66
68
|
const EXTRAFIELD_TYPE_AES = 0x9901;
|
|
@@ -83,6 +85,7 @@
|
|
|
83
85
|
const BITFLAG_DATA_DESCRIPTOR = 0b1000;
|
|
84
86
|
const BITFLAG_STRONG_ENCRYPTION = 0b1000000;
|
|
85
87
|
const BITFLAG_LANG_ENCODING_FLAG = 0b100000000000;
|
|
88
|
+
const BITFLAG_MASKED_LOCAL_HEADERS = 0b10000000000000;
|
|
86
89
|
const FILE_ATTR_MSDOS_DIR_MASK = 0b10000;
|
|
87
90
|
const FILE_ATTR_MSDOS_READONLY_MASK = 0x01;
|
|
88
91
|
const FILE_ATTR_MSDOS_HIDDEN_MASK = 0x02;
|
|
@@ -112,6 +115,8 @@
|
|
|
112
115
|
const HEADER_OFFSET_SIGNATURE = 10;
|
|
113
116
|
const HEADER_OFFSET_COMPRESSED_SIZE = 14;
|
|
114
117
|
const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
|
|
118
|
+
const HEADER_OFFSET_FILENAME_LENGTH = 22;
|
|
119
|
+
const HEADER_OFFSET_EXTRAFIELD_LENGTH = 24;
|
|
115
120
|
const LOCAL_HEADER_COMMON_OFFSET = 4;
|
|
116
121
|
|
|
117
122
|
const MAX_DATE = new Date(2107, 11, 31, 23, 59, 58);
|
|
@@ -124,9 +129,116 @@
|
|
|
124
129
|
const OBJECT_TYPE = "object";
|
|
125
130
|
const STRING_TYPE = "string";
|
|
126
131
|
const NUMBER_TYPE = "number";
|
|
132
|
+
const BOOLEAN_TYPE = "boolean";
|
|
127
133
|
|
|
128
134
|
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
129
135
|
|
|
136
|
+
/*
|
|
137
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
138
|
+
|
|
139
|
+
Redistribution and use in source and binary forms, with or without
|
|
140
|
+
modification, are permitted provided that the following conditions are met:
|
|
141
|
+
|
|
142
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
143
|
+
this list of conditions and the following disclaimer.
|
|
144
|
+
|
|
145
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
146
|
+
notice, this list of conditions and the following disclaimer in
|
|
147
|
+
the documentation and/or other materials provided with the distribution.
|
|
148
|
+
|
|
149
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
150
|
+
derived from this software without specific prior written permission.
|
|
151
|
+
|
|
152
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
153
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
154
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
155
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
156
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
157
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
158
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
159
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
160
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
161
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
162
|
+
*/
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
const OPTION_FILENAME_ENCODING = "filenameEncoding";
|
|
166
|
+
const OPTION_COMMENT_ENCODING = "commentEncoding";
|
|
167
|
+
const OPTION_DECODE_TEXT = "decodeText";
|
|
168
|
+
const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
|
|
169
|
+
const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
|
|
170
|
+
const OPTION_PASSWORD = "password";
|
|
171
|
+
const OPTION_RAW_PASSWORD = "rawPassword";
|
|
172
|
+
const OPTION_PASS_THROUGH = "passThrough";
|
|
173
|
+
const OPTION_SIGNAL = "signal";
|
|
174
|
+
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
175
|
+
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
176
|
+
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
177
|
+
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
178
|
+
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
179
|
+
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
180
|
+
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
181
|
+
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
182
|
+
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
183
|
+
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
184
|
+
const OPTION_TRANSFER_STREAMS = "transferStreams";
|
|
185
|
+
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
186
|
+
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
187
|
+
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
188
|
+
const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
|
|
189
|
+
const OPTION_KEEP_ORDER = "keepOrder";
|
|
190
|
+
const OPTION_LEVEL = "level";
|
|
191
|
+
const OPTION_BUFFERED_WRITE = "bufferedWrite";
|
|
192
|
+
const OPTION_CREATE_TEMP_STREAM = "createTempStream";
|
|
193
|
+
const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
|
|
194
|
+
const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
|
|
195
|
+
const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
|
|
196
|
+
const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
|
|
197
|
+
const OPTION_ENCODE_TEXT = "encodeText";
|
|
198
|
+
const OPTION_OFFSET = "offset";
|
|
199
|
+
const OPTION_USDZ = "usdz";
|
|
200
|
+
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
201
|
+
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
202
|
+
const OPTION_STRICTNESS = "strictness";
|
|
203
|
+
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
204
|
+
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
205
|
+
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
206
|
+
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
207
|
+
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
208
|
+
const TEXT_TYPE_FILENAME = "filename";
|
|
209
|
+
const TEXT_TYPE_COMMENT = "comment";
|
|
210
|
+
const STRICTNESS_STRICT = "strict";
|
|
211
|
+
const STRICTNESS_BALANCED = "balanced";
|
|
212
|
+
const STRICTNESS_TOLERANT = "tolerant";
|
|
213
|
+
|
|
214
|
+
const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
|
|
215
|
+
const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
|
|
216
|
+
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
217
|
+
|
|
218
|
+
function checkFunctionOption(value) {
|
|
219
|
+
if (value && typeof value != FUNCTION_TYPE) {
|
|
220
|
+
throw new Error(ERR_INVALID_FUNCTION_OPTION);
|
|
221
|
+
}
|
|
222
|
+
return value;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function checkSignalOption(signal) {
|
|
226
|
+
if (signal && (typeof signal.addEventListener != FUNCTION_TYPE || typeof signal.aborted != BOOLEAN_TYPE)) {
|
|
227
|
+
throw new Error(ERR_INVALID_SIGNAL);
|
|
228
|
+
}
|
|
229
|
+
return signal || UNDEFINED_VALUE;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function checkPasswordOption(password, rawPassword) {
|
|
233
|
+
if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
|
|
234
|
+
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function toNumber(value) {
|
|
239
|
+
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
240
|
+
}
|
|
241
|
+
|
|
130
242
|
/*
|
|
131
243
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
132
244
|
|
|
@@ -156,7 +268,10 @@
|
|
|
156
268
|
*/
|
|
157
269
|
|
|
158
270
|
|
|
271
|
+
const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
|
|
159
272
|
const MINIMUM_CHUNK_SIZE = 64;
|
|
273
|
+
const MINIMUM_PROPERTY_VALUE = 1;
|
|
274
|
+
const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
|
|
160
275
|
let maxWorkers = 2;
|
|
161
276
|
try {
|
|
162
277
|
if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
|
|
@@ -168,7 +283,7 @@
|
|
|
168
283
|
const DEFAULT_CONFIGURATION = {
|
|
169
284
|
workerURI: "./core/web-worker-wasm.js",
|
|
170
285
|
wasmURI: "./core/streams/zlib-wasm/zlib-streams.wasm",
|
|
171
|
-
chunkSize:
|
|
286
|
+
chunkSize: DEFAULT_CHUNK_SIZE$1,
|
|
172
287
|
maxWorkers,
|
|
173
288
|
terminateWorkerTimeout: 5000,
|
|
174
289
|
workerStarvationTimeout: 5000,
|
|
@@ -180,24 +295,38 @@
|
|
|
180
295
|
DecompressionStream: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream
|
|
181
296
|
};
|
|
182
297
|
|
|
183
|
-
const
|
|
298
|
+
const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
|
|
299
|
+
|
|
300
|
+
const STRING_PROPERTY_NAMES = [
|
|
184
301
|
"baseURI",
|
|
185
302
|
"wasmURI",
|
|
186
|
-
"workerURI"
|
|
187
|
-
|
|
303
|
+
"workerURI"
|
|
304
|
+
];
|
|
305
|
+
const BOOLEAN_PROPERTY_NAMES = [
|
|
306
|
+
"useCompressionStream",
|
|
307
|
+
"useWebWorkers",
|
|
308
|
+
"transferStreams"
|
|
309
|
+
];
|
|
310
|
+
const NUMBER_PROPERTY_NAMES = [
|
|
188
311
|
"chunkSize",
|
|
189
|
-
|
|
312
|
+
PROPERTY_NAME_MAX_WORKERS,
|
|
190
313
|
"terminateWorkerTimeout",
|
|
191
314
|
"workerStarvationTimeout",
|
|
192
|
-
"workerStartupTimeout"
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
"
|
|
315
|
+
"workerStartupTimeout"
|
|
316
|
+
];
|
|
317
|
+
const FUNCTION_PROPERTY_NAMES = [
|
|
318
|
+
"createWorker",
|
|
196
319
|
"CompressionStream",
|
|
197
320
|
"DecompressionStream",
|
|
198
321
|
"CompressionStreamFallback",
|
|
199
322
|
"DecompressionStreamFallback"
|
|
200
323
|
];
|
|
324
|
+
const CONFIGURABLE_PROPERTY_NAMES = [
|
|
325
|
+
...STRING_PROPERTY_NAMES,
|
|
326
|
+
...BOOLEAN_PROPERTY_NAMES,
|
|
327
|
+
...NUMBER_PROPERTY_NAMES,
|
|
328
|
+
...FUNCTION_PROPERTY_NAMES
|
|
329
|
+
];
|
|
201
330
|
|
|
202
331
|
const config = { ...DEFAULT_CONFIGURATION };
|
|
203
332
|
|
|
@@ -206,20 +335,43 @@
|
|
|
206
335
|
}
|
|
207
336
|
|
|
208
337
|
function getChunkSize(config) {
|
|
209
|
-
return
|
|
338
|
+
return normalizeChunkSize(config.chunkSize);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
function normalizeChunkSize(chunkSize) {
|
|
342
|
+
chunkSize = toNumber(chunkSize);
|
|
343
|
+
return Number.isInteger(chunkSize) && chunkSize >= MINIMUM_PROPERTY_VALUE ? Math.max(chunkSize, MINIMUM_CHUNK_SIZE) : DEFAULT_CHUNK_SIZE$1;
|
|
210
344
|
}
|
|
211
345
|
|
|
212
346
|
function configure(configuration) {
|
|
213
|
-
|
|
347
|
+
Object.assign(config, checkConfiguration(normalizeConfiguration(configuration)));
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function checkConfiguration(configuration) {
|
|
351
|
+
const checkedConfiguration = {};
|
|
214
352
|
for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
|
|
215
353
|
const propertyValue = configuration[propertyName];
|
|
216
354
|
if (propertyValue !== UNDEFINED_VALUE) {
|
|
217
|
-
|
|
355
|
+
checkedConfiguration[propertyName] = checkPropertyValue(propertyName, propertyValue);
|
|
218
356
|
}
|
|
219
357
|
}
|
|
358
|
+
return checkedConfiguration;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function checkPropertyValue(propertyName, propertyValue) {
|
|
362
|
+
if (NUMBER_PROPERTY_NAMES.includes(propertyName)) {
|
|
363
|
+
propertyValue = toNumber(propertyValue);
|
|
364
|
+
if (propertyName == PROPERTY_NAME_MAX_WORKERS && (!Number.isInteger(propertyValue) || propertyValue < MINIMUM_PROPERTY_VALUE)) {
|
|
365
|
+
throw new Error(ERR_INVALID_MAX_WORKERS);
|
|
366
|
+
}
|
|
367
|
+
} else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
|
|
368
|
+
checkFunctionOption(propertyValue);
|
|
369
|
+
}
|
|
370
|
+
return propertyValue;
|
|
220
371
|
}
|
|
221
372
|
|
|
222
373
|
function normalizeConfiguration(configuration) {
|
|
374
|
+
configuration = configuration || {};
|
|
223
375
|
const { CompressionStreamZlib, DecompressionStreamZlib } = configuration;
|
|
224
376
|
if (CompressionStreamZlib === UNDEFINED_VALUE && DecompressionStreamZlib === UNDEFINED_VALUE) {
|
|
225
377
|
return configuration;
|
|
@@ -235,14 +387,9 @@
|
|
|
235
387
|
}
|
|
236
388
|
|
|
237
389
|
function setDefaultConfiguration(configuration) {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
if (propertyValue !== UNDEFINED_VALUE) {
|
|
242
|
-
DEFAULT_CONFIGURATION[propertyName] = propertyValue;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
configure(configuration);
|
|
390
|
+
const checkedConfiguration = checkConfiguration(normalizeConfiguration(configuration));
|
|
391
|
+
Object.assign(DEFAULT_CONFIGURATION, checkedConfiguration);
|
|
392
|
+
Object.assign(config, checkedConfiguration);
|
|
246
393
|
}
|
|
247
394
|
|
|
248
395
|
function resetConfiguration() {
|
|
@@ -252,7 +399,7 @@
|
|
|
252
399
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
253
400
|
}
|
|
254
401
|
|
|
255
|
-
const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='(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:c,Uint32Array:i,Int32Array:a,Map:f,DataView:l,Promise:w,TextEncoder:u,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;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[A,I,x,M,P,D,F,B]=C;class R{constructor(t){this.o=t||-1}append(t){let e=0|this.o;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=B[255&t]^F[t>>>8&255]^D[t>>>16&255]^P[t>>>24&255]^M[255&n]^x[n>>>8&255]^I[n>>>16&255]^A[n>>>24&255]}}for(;n>s;s++)e=e>>>8^A[255&(e^t[s])];this.o=e}get(){return~this.o}}class U extends d{constructor(){let t;const e=new R;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}}function W(t,e){const n=new o(t.length+e.length);return n.set(t),n.set(e,t.length),n}function _(t){return new l(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,e){if(0===t.length||0===e.length)return t.concat(e);const n=t[t.length-1],s=T.l(n);return 32===s?t.concat(e):T.h(e,s,0|n,t.slice(0,t.length-1))},bitLength(t){const e=t.length;if(0===e)return 0;const n=t[e-1];return 32*(e-1)+T.l(n)},m(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]=T.S(e,t[n-1]&2147483648>>e-1,1)),t},S:(t,e,n)=>32===t?e:(n?0|e:e<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(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=T.l(r);return s.push(T.S(e+o&31,e+o>32?n:s.pop(),1)),s}},V={bytes:{v(t){const e=T.bitLength(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},C(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(T.S(8*(3&n),s)),e}}},K=class{constructor(t){const e=this;e.blockSize=512,e.A=[1732584193,4023233417,2562383102,271733878,3285377520],e.I=[1518500249,1859775393,2400959708,3395469782],t?(e.M=t.M.slice(0),e.P=t.P.slice(0),e.D=t.D):e.reset()}reset(){const t=this;return t.M=t.A.slice(0),t.P=[],t.D=0,t}update(t){const e=this;"string"==typeof t&&(t=V.F.C(t));const n=e.P=T.concat(e.P,t),s=e.D,o=e.D=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(n);let a=0;for(let t=e.blockSize+s-(e.blockSize+s&e.blockSize-1);o>=t;t+=e.blockSize)e.B(c.subarray(16*a,16*(a+1))),a+=1;return n.splice(0,16*a),e}R(){const t=this;let e=t.P;const n=t.M;e=T.concat(e,[T.S(1,1)]);for(let t=e.length+2;15&t;t++)e.push(0);for(e.push(s.floor(t.D/4294967296)),e.push(0|t.D);e.length;)t.B(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}B(e){const n=this,r=n.M,o=t(80);for(let t=0;16>t;t++)o[t]=e[t];let c=r[0],i=r[1],a=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,c)+n.U(t,i,a,f)+l+o[t]+n.I[s.floor(t/20)]|0;l=f,f=a,a=n.W(30,i),i=c,c=e}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+l|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(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 c,i,a,f,w;const u=new ArrayBuffer(o),h=new l(u);let p=0;const d=T;for(e=V.bytes.C(e),w=1;(o||1)>p;w++){for(c=i=t.encrypt(d.concat(e,[w])),a=1;n>a;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;(o||1)>p&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return u.slice(0,s/8)},_:class{constructor(t){const e=this,n=e.V=K,s=[[],[]];e.K=[new n,new n];const r=e.K[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.K[0].update(s[0]),e.K[1].update(s[1]),e.L=new n(e.K[0])}reset(){const t=this;t.L=new t.V(t.K[0]),t.O=!1}update(t){this.O=!0,this.L.update(t)}digest(){const t=this,e=t.L.R(),n=new t.V(t.K[1]).update(e).R();return t.reset(),n}encrypt(t){if(this.O)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==k,O="Invalid password",j="Invalid signature",H=j,N="zipjs-abort-check-password";function q(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const G=16,J={name:"PBKDF2"},Q=e.assign({hash:{name:"HMAC"}},J),X=e.assign({iterations:1e3,hash:{name:"SHA-1"}},J),Y=["deriveBits"],Z=[8,12,16],$=[16,24,32],tt=10,et=[0,0,0,0],nt=typeof h!=b,st=nt&&h.subtle,rt=nt&&typeof st!=b,ot=V.bytes,ct=class{constructor(t){const e=this;e.j=[[[],[],[],[],[]],[[],[],[],[],[]]],e.j[0][0][0]||e.H();const n=e.j[0][4],s=e.j[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(e.I=[i=t.slice(0),a=[]],c=o;4*o+28>c;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=n[t>>>24]<<24^n[t>>16&255]<<16^n[t>>8&255]<<8^n[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const e=i[3&t?c:c-4];a[t]=4>=c||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.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],e=this.j[1],n=t[4],s=e[4],r=[],o=[];let c,i,a,f;for(let t=0;256>t;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let l=c=0;!n[l];l^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,n[l]=o,s[o]=l,f=r[a=r[i=r[l]]];let w=16843009*f^65537*a^257*i^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)}N(t,e){if(4!==t.length)throw new r("invalid aes block size");const n=this.I[e],s=n.length/4-2,o=[0,0,0,0],c=this.j[e],i=c[0],a=c[1],f=c[2],l=c[3],w=c[4];let u,h,p,d=t[0]^n[0],y=t[e?3:1]^n[1],m=t[2]^n[2],S=t[e?1:3]^n[3],g=4;for(let t=0;s>t;t++)u=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^l[255&S]^n[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^l[255&d]^n[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^l[255&y]^n[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^l[255&m]^n[g+3],g+=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&S]^n[g++],u=d,d=y,y=m,m=S,S=u;return o}},it=class{constructor(t,e){this.G=t,this.J=e,this.X=e}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let 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}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,e,n){let s;if(!(s=e.length))return[];const r=T.bitLength(e);for(let r=0;s>r;r+=4){this.$(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 T.m(e,r)}},at=E._;let ft=nt&&rt&&typeof st.importKey==k,lt=nt&&rt&&typeof st.deriveBits==k;class wt extends d{constructor({password:t,rawPassword:e,encryptionStrength:n,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:c,strength:i,et:a,ready:f}=n;c?(await(async(t,e,n,s)=>{const o=await dt(t,e,n,mt(s,0,Z[e])),c=mt(s,Z[e]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)})(n,i,c,mt(t,0,Z[i]+2)),t=mt(t,Z[i]+2),s?e.error(new r(N)):a()):await f;const l=new o(t.length-tt-(t.length-tt)%G);e.enqueue(pt(n,t,l,0,tt,!0))},async flush(t){const{nt:e,st:n,pending:s,ready:o}=this;if(n&&e){await o;const i=mt(s,0,s.length-tt),a=mt(s,s.length-tt);let f=z;if(i.length){const t=gt(ot,i);n.update(t);const s=e.update(t);f=St(ot,s)}const l=mt(St(ot,n.digest()),0,tt);let w=s.length<tt?1:0;for(let t=0;tt>t;t++)w|=l[t]^a[t];if(w&&c)throw new r(H);t.enqueue(f)}}})}}class ut extends d{constructor({password:t,rawPassword:e,encryptionStrength:n}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:s,strength:r,et:c,ready:i}=n;let a=z;s?(a=await(async(t,e,n)=>{const s=q(new o(Z[e]));return W(s,await dt(t,e,n,s))})(n,r,s),c()):await i;const f=new o(a.length+t.length-t.length%G);f.set(a,0),e.enqueue(pt(n,t,f,a.length,0))},async flush(t){const{nt:e,st:n,pending:s,ready:r}=this;if(n&&e){await r;let o=z;if(s.length){const t=e.update(gt(ot,s));n.update(t),o=St(ot,t)}const c=St(ot,n.digest()).slice(0,tt);t.enqueue(W(o,c))}}})}}function ht(t,n,s,r){e.assign(t,{ready:new w(e=>t.et=e),password:yt(n,s),strength:r-1,pending:z})}function pt(t,e,n,s,r,c){const{nt:i,st:a,pending:f}=t;f.length&&(e=W(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%G)),w=0;l-G>=w;w+=G){const t=gt(ot,mt(e,w,w+G));c&&a.update(t);const r=i.update(t);c||a.update(r),n.set(St(ot,r),w+s)}return t.pending=mt(e,w),n}async function dt(n,s,r,c){n.password=null;const i=await(async(t,e,n,s,r)=>{if(!ft)return E.importKey(e);try{return await st.importKey("raw",e,n,!1,r)}catch{return ft=!1,E.importKey(e)}})(0,r,Q,0,Y),a=await(async(t,e,n)=>{if(!lt)return E.T(e,t.salt,X.iterations,n);try{return await st.deriveBits(t,e,n)}catch{return lt=!1,E.T(e,t.salt,X.iterations,n)}})(e.assign({salt:c},X),i,8*(2*$[s]+2)),f=new o(a),l=gt(ot,mt(f,0,$[s])),w=gt(ot,mt(f,$[s],2*$[s])),u=mt(f,2*$[s]);return e.assign(n,{keys:{key:l,ot:w,passwordVerification:u},nt:new it(new ct(l),t.from(et)),st:new at(w)}),u}function yt(t,e){return e===v?(t=>{if(typeof u==b){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 mt(t,e,n){return t.subarray(e,n)}function St(t,e){return t.v(e)}function gt(t,e){return t.C(e)}class vt extends d{constructor({password:t,rawPassword:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){kt(this,t,e,n)},transform(t,e){const n=this;if(n.password||n.rawPassword){const e=zt(n,t.subarray(0,12));if(n.password=n.rawPassword=null,0!=(e[11]^n.passwordVerification))throw new r(O);t=t.subarray(12)}s?e.error(new r(N)):e.enqueue(zt(n,t))}})}}class bt extends d{constructor({password:t,rawPassword:e,passwordVerification:n}){super({start(){kt(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=q(new o(12));e[11]=n.passwordVerification,s=new o(t.length+e.length),s.set(Ct(n,e),0),r=12}else s=new o(t.length),r=0;s.set(Ct(n,t),r),e.enqueue(s)}})}}function kt(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,ct:new R(r[0]),it:new R(r[2])}),s)for(let e=0;e<s.length;e++)At(t,s[e]);else for(let e=0;e<n.length;e++)At(t,n.charCodeAt(e))})(t,n,s)}function zt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=It(t)^e[s],At(t,n[s]);return n}function Ct(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=It(t)^e[s],At(t,e[s]);return n}function At(t,e){let[,n]=t.keys;t.ct.append([e]);const r=~t.ct.get();n=Mt(s.imul(Mt(n+xt(r)),134775813)+1),t.it.append([n>>>24]);const o=~t.it.get();t.keys=[r,n,o]}function It(t){const e=2|t.keys[2];return xt(s.imul(e,1^e)>>>8)}function xt(t){return 255&t}function Mt(t){return 4294967295&t}const Pt=new f;function Dt(t){return Pt.get(t)}const Ft="Invalid uncompressed size",Bt=j,Rt="deflate-raw",Ut="gzip",Wt=[31,139,8];class _t extends d{constructor(t,{chunkSize:e,CompressionStreamFallback:n,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:w,format:u,compressionMethod:h}=t,p=this;let d,y,m,S=super.readable;const g=u&&Dt(u),v=a&&r&&!w&&!g&&(!o||i)&&!(!c||!s);if(o&&!i||!a||v||(d=new U,S=jt(S,d)),r)if(g)S=Ht(S,Lt(g.CompressionStream,u,{level:f,chunkSize:e,compressionMethod:h}));else if(v)m=new Tt,S=Ht(S,new s(Ut)),S=jt(S,m);else try{S=Ot(S,c,{level:f,chunkSize:e},s,n)}catch(t){let e;try{e=new s(Ut)}catch{throw t}S=Ht(S,e),S=jt(S,new Tt)}o&&(i?S=jt(S,new bt(t)):(y=new ut(t),S=jt(S,y))),Et(p,S,()=>{o&&!i||!a||(p.crc32=v?m.crc32:new l(d.value.buffer).getUint32(0))})}}class Tt 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 o=n.length+t.length;if(8>=o)return void(n=W(n,t));const c=o-8,i=s.min(c,n.length);r.enqueue(W(n.subarray(0,i),t.subarray(0,c-i))),n=W(n.subarray(i),t.subarray(c-i))},flush(){const e=_(n);t.crc32=e.getUint32(0,!0),t.uncompressedSize=e.getUint32(4,!0)}}),t=this}}class Vt extends d{constructor(t,{chunkSize:e,DecompressionStreamFallback:n,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:u,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=jt(C,new vt(t)):(z=new wt(t),C=jt(C,z))),u){const t=m&&Dt(m);if(t)C=Ht(C,Lt(t.DecompressionStream,m,{chunkSize:e,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=Ot(C,h,{chunkSize:e,deflate64:p},s,n)}catch(t){if(p||b===v)throw t;let e;try{e=new s(Ut)}catch{throw t}C=((t,e,n)=>{const s=new R;let c,i,a,f=0,l=!1;const u=new w((t,e)=>{i=t,a=e});u.catch(()=>{}),n||i();const h=new d({start(t){const e=new o(10);e.set(Wt),t.enqueue(e)},transform(t,e){e.enqueue(t)},async flush(t){l=!0,y();try{await u}finally{m()}const e=new o(8),r=_(e);r.setUint32(0,s.get(),!0),r.setUint32(4,n,!0),t.enqueue(e)},cancel(t){a(t)}}),p=new d({transform(t,e){s.append(t),f+=t.length,n>f?l&&y():i(),e.enqueue(t)},cancel(t){a(t)}});return t=jt(t,h),jt(t=Ht(t,e),p);function y(){m(),c=setTimeout(()=>a(new r(Ft)),5e3)}function m(){clearTimeout(c)}})(C,e,b)}C=(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)})})(C)}a&&(k=new U,C=jt(C,k)),Et(this,C,()=>{if(a){const t=new l(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r(Bt)}})}}const Kt=new f;function Et(t,n,s){n=jt(n,new d({flush:s})),e.defineProperty(t,"readable",{get:()=>n})}function Lt(t,e,n){if(!t)throw new r("Compression method not supported");return new t(e,n)}function Ot(t,e,n,s,r){const o=e&&s?s:r||s,c=n.deflate64?"deflate64-raw":Rt;let i;try{i=new o(c,n)}catch(t){if(!e||!r||o==r)throw t;i=new r(c,n)}return Ht(t,i)}function jt(t,e){return(t=>{if(t instanceof y)return t;const e=t.getReader();return new y({async pull(t){const{value:n,done:s}=await e.read();s?t.close():t.enqueue(n)},cancel:t=>e.cancel(t)})})(t).pipeThrough(e)}function Ht(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 Nt="data",qt="close",Gt="deflate";class Jt extends d{constructor(t,n){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Gt)?c=_t:o.startsWith("inflate")&&(c=Vt),s.outputSize=0;let i=0;const a=new c(t,n),f=super.readable,l=new d({transform(t,e){t&&t.length&&(i+=t.length,e.enqueue(t))},flush(){e.assign(s,{inputSize:i})}}),w=new d({transform(e,n){if(e&&e.length&&(n.enqueue(e),s.outputSize+=e.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Ft)},flush(){const{crc32:t}=a;e.assign(s,{crc32:t,inputSize:i})}});e.defineProperty(s,"readable",{get:()=>f.pipeThrough(l).pipeThrough(a).pipeThrough(w)})}}class Qt extends d{constructor(t){const e=[];let s=0;function r(){const n=new o(t);let r=0;for(;t>r;){const s=e[0],o=t-r;s.length>o?(n.set(s.subarray(0,o),r),e[0]=s.subarray(o),r+=o):(n.set(s,r),r+=s.length,e.shift())}return s-=t,n}n.isFinite(t)&&t>=1||(t=65536),super({transform(n,o){for(e.push(n),s+=n.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(((t,e)=>{const n=new o(e);let s=0;for(const e of t)n.set(e,s),s+=e.length;return n})(e,s))}})}}let Xt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Xt=navigator.hardwareConcurrency)}catch{}const Yt=new f,Zt=new f;let $t,te,ee,ne,se,re,oe=0;async function ce(t){let e,o;try{const{options:c,config:i}=t;if(c.format)try{await(async(t,e)=>{!Pt.has(t)&&e&&((t,e)=>{const{CompressionStream:n,DecompressionStream:s}=e;if(typeof n!=k&&typeof s!=k)throw new r("Invalid codec module");Pt.set(t,{CompressionStream:n,DecompressionStream:s})})(t,await(import(e)))})(c.format,c.codecURI)}catch(t){throw t.codecImportFailed=!0,t}if(i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream,c.compressed&&!c.format)if(c.useCompressionStream){if(!((t,e)=>{if(!t)return!1;let n=Kt.get(t);n||(n=new f,Kt.set(t,n));let s=n.get(e);if(s===v){try{new t(e),s=!0}catch{s=!1}n.set(e,s)}return s})(c.codecType.startsWith(Gt)?i.CompressionStream:i.DecompressionStream,Rt))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{c.useCompressionStream=!0}!i.CompressionStreamFallback&&i.CompressionStreamZlib&&(i.CompressionStreamFallback=i.CompressionStreamZlib),!i.DecompressionStreamFallback&&i.DecompressionStreamZlib&&(i.DecompressionStreamFallback=i.DecompressionStreamZlib);const a={highWaterMark:1},l=t.readable||new y({async pull(t){const e=new w(t=>Yt.set(oe,t));ie({type:"pull",messageId:oe}),oe=(oe+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await e;t.enqueue(s),r&&t.close()}},a);o=t.writable||new m({async write(t){let e;const s=new w(t=>e=t);Zt.set(oe,e),ie({type:Nt,value:t,messageId:oe}),oe=(oe+1)%n.MAX_SAFE_INTEGER,await s}},a),e=new Jt(c,i),$t=new AbortController;const{signal:u}=$t;await l.pipeThrough(e).pipeThrough(new Qt((t=>s.max(t.chunkSize,64))(i))).pipeTo(o,{signal:u,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{crc32:h,inputSize:p,outputSize:d}=e;ie({type:qt,result:{crc32:h,inputSize:p,outputSize:d}})}catch(t){if(t.outputSize=e?e.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}ae(t)}}function ie(t){const{value:e}=t;if(e)if(e.length)try{t.value=(n=e,n.byteOffset||n.byteLength!=n.buffer.byteLength?new o(n):n).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var n}function ae(t=new r("Unknown error")){const{message:e,stack:n,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:e,stack:n,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}function fe(t,e,n={}){if(!te){const t=new r("WASM module not loaded");throw t.cause=re,t}const c="number"==typeof n.level?n.level:-1,i="number"==typeof n.outBuffer?n.outBuffer:65536,a="number"==typeof n.inBufferSize?n.inBufferSize:65536;return new d({start(){try{let n;if(this.ft=ee(i),this.in=ee(a),this.inBufferSize=a,!this.ft||!this.in)throw new r("allocation failed");if(this.lt=new o(i),t?(this.wt=te.deflate_process,this.ut=te.deflate_last_consumed,this.ht=te.deflate_end,this.yt=te.deflate_new(),n="gzip"===e?te.deflate_init_gzip(this.yt,c):"deflate-raw"===e?te.deflate_init_raw(this.yt,c):te.deflate_init(this.yt,c)):"deflate64-raw"===e?(this.wt=te.inflate9_process,this.ut=te.inflate9_last_consumed,this.ht=te.inflate9_end,this.yt=te.inflate9_new(),n=te.inflate9_init_raw(this.yt)):(this.wt=te.inflate_process,this.ut=te.inflate_last_consumed,this.ht=te.inflate_end,this.yt=te.inflate_new(),n="deflate-raw"===e?te.inflate_init_raw(this.yt):"gzip"===e?te.inflate_init_gzip(this.yt):te.inflate_init(this.yt)),0!==n)throw new r("init failed:"+n)}catch(t){throw f(this),t}},transform(e,n){try{const c=e,a=new o(se.buffer),f=this.wt,l=this.ut,w=this.ft,u=this.lt;let h=0;for(;h<c.length;){const e=s.min(c.length-h,32768);if((!this.in||this.inBufferSize<e)&&(this.in&&ne&&(ne(this.in),this.in=0),this.in=ee(e),this.inBufferSize=e,!this.in))throw new r("allocation failed");a.set(c.subarray(h,h+e),this.in);const o=f(this.yt,this.in,e,w,i,0),p=16777215&o;if(p&&(u.set(a.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.yt);if(0===d)break;h+=d}}catch(t){f(this),n.error(t)}},flush(e){try{const n=new o(se.buffer),s=this.wt,c=this.ft,a=this.lt;for(;;){const o=s(this.yt,0,0,c,i,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&&(a.set(n.subarray(c,c+f),0),e.enqueue(a.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.yt&&t.ht&&(e=t.ht(t.yt)),t.yt=0,t.in&&ne&&ne(t.in),t.in=0,t.ft&&ne&&ne(t.ft),t.ft=0,e}}addEventListener("message",({data:t})=>{const{type:e,messageId:n,value:s,done:r}=t;try{if("start"==e&&ce(t),e==Nt){const t=Yt.get(n);Yt.delete(n),t({value:s||new o,done:r})}if("ack"==e){const t=Zt.get(n);Zt.delete(n),t()}e==qt&&$t.abort()}catch(t){ae(t)}}),p({type:"ready"});class le{constructor(t="deflate",e){return fe(!0,t,e)}}class we{constructor(t="deflate",e){return fe(!1,t,e)}}le.St=!0,we.St=!0;let ue=!1;((t={})=>{const{init:e}=t,n=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{e&&await e(t),n&&(t.CompressionStreamFallback=n),s&&(t.DecompressionStreamFallback=s)}})({CompressionStreamFallback:le,DecompressionStreamFallback:we,init:t=>(async(t,{baseURI:e})=>{if(!ue)try{await(async(t,e)=>{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(te=t,({malloc:ee,free:ne,memory:se}=te),"function"!=typeof ee||"function"!=typeof ne||!se)throw te=ee=ne=se=null,new r("Invalid WASM module")})((await WebAssembly.instantiate(n)).instance.exports)})(t,e),ue=!0}catch(t){throw(t=>{re=t})(t),t}})(t.wasmURI,t)})});\n';if("string"==typeof s&&(s=(new TextEncoder).encode(s)),t){const t=new Blob([s],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+(t=>{let n="";const s=t.length;let r=0;for(;s>r+2;r+=3){const s=t[r]<<16|t[r+1]<<8|t[r+2];n+=e[s>>18&63]+e[s>>12&63]+e[s>>6&63]+e[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e[s>>18&63]+e[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e[s>>18&63]+e[s>>12&63]+e[s>>6&63]+"=";}return n})(s)}});
|
|
402
|
+
const t$1=new Uint8Array(288);t$1.fill(8,0,144),t$1.fill(9,144,256),t$1.fill(7,256,280),t$1.fill(8,280,288),new Uint8Array(30).fill(5);const e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n$1=t=>t({workerURI:t=>{const n="text/javascript";let s='(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:c,Uint32Array:i,Int32Array:a,Map:f,DataView:l,Promise:u,TextEncoder:w,crypto:h,postMessage:p,TransformStream:d,ReadableStream:y,WritableStream:m,CompressionStream:S,DecompressionStream:g}=self,v=void 0,b="undefined",k="function",z=new o,C=[[],[],[],[],[],[],[],[]];for(let t=0;t<256;t++){let e=t;for(let t=0;t<8;t++)e=1&e?e>>>1^3988292384:e>>>1;C[0][t]=e}for(let t=0;t<256;t++)for(let e=1;e<8;e++){const n=C[e-1][t];C[e][t]=n>>>8^C[0][255&n]}const[I,A,x,M,P,D,F,B]=C;class R{constructor(t){this.o=t||-1}append(t){let e=0|this.o;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(;s<=o;s+=8){const t=e^r.getInt32(s,!0),n=r.getInt32(s+4,!0);e=B[255&t]^F[t>>>8&255]^D[t>>>16&255]^P[t>>>24&255]^M[255&n]^x[n>>>8&255]^A[n>>>16&255]^I[n>>>24&255]}}for(;s<n;s++)e=e>>>8^I[255&(e^t[s])];this.o=e}get(){return~this.o}}class U extends d{constructor(){let t;const e=new R;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}}function W(t,e){const n=new o(t.length+e.length);return n.set(t),n.set(e,t.length),n}function _(t){return new l(t.buffer,t.byteOffset,t.byteLength)}const T={concat(t,e){if(0===t.length||0===e.length)return t.concat(e);const n=t[t.length-1],s=T.l(n);return 32===s?t.concat(e):T.h(e,s,0|n,t.slice(0,t.length-1))},bitLength(t){const e=t.length;if(0===e)return 0;const n=t[e-1];return 32*(e-1)+T.l(n)},m(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]=T.S(e,t[n-1]&2147483648>>e-1,1)),t},S:(t,e,n)=>32===t?e:(n?0|e:e<<32-t)+1099511627776*t,l:t=>s.round(t/1099511627776)||32,h(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=T.l(r);return s.push(T.S(e+o&31,e+o>32?n:s.pop(),1)),s}},V={bytes:{v(t){const e=T.bitLength(t)/8,n=new o(e);let s;for(let r=0;r<e;r++)3&r||(s=t[r/4]),n[r]=s>>>24,s<<=8;return n},C(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(T.S(8*(3&n),s)),e}}},K=class{constructor(t){const e=this;e.blockSize=512,e.I=[1732584193,4023233417,2562383102,271733878,3285377520],e.A=[1518500249,1859775393,2400959708,3395469782],t?(e.M=t.M.slice(0),e.P=t.P.slice(0),e.D=t.D):e.reset()}reset(){const t=this;return t.M=t.I.slice(0),t.P=[],t.D=0,t}update(t){const e=this;"string"==typeof t&&(t=V.F.C(t));const n=e.P=T.concat(e.P,t),s=e.D,o=e.D=s+T.bitLength(t);if(o>9007199254740991)throw new r("Cannot hash more than 2^53 - 1 bits");const c=new i(n);let a=0;for(let t=e.blockSize+s-(e.blockSize+s&e.blockSize-1);t<=o;t+=e.blockSize)e.B(c.subarray(16*a,16*(a+1))),a+=1;return n.splice(0,16*a),e}R(){const t=this;let e=t.P;const n=t.M;e=T.concat(e,[T.S(1,1)]);for(let t=e.length+2;15&t;t++)e.push(0);for(e.push(s.floor(t.D/4294967296)),e.push(0|t.D);e.length;)t.B(e.splice(0,16));return t.reset(),n}U(t,e,n,s){return t<=19?e&n|~e&s:t<=39?e^n^s:t<=59?e&n|e&s|n&s:t<=79?e^n^s:void 0}W(t,e){return e<<t|e>>>32-t}B(e){const n=this,r=n.M,o=t(80);for(let t=0;t<16;t++)o[t]=e[t];let c=r[0],i=r[1],a=r[2],f=r[3],l=r[4];for(let t=0;t<=79;t++){t>=16&&(o[t]=n.W(1,o[t-3]^o[t-8]^o[t-14]^o[t-16]));const e=n.W(5,c)+n.U(t,i,a,f)+l+o[t]+n.A[s.floor(t/20)]|0;l=f,f=a,a=n.W(30,i),i=c,c=e}r[0]=r[0]+c|0,r[1]=r[1]+i|0,r[2]=r[2]+a|0,r[3]=r[3]+f|0,r[4]=r[4]+l|0}},E={importKey:t=>new E._(V.bytes.C(t)),T(t,e,n,s){if(n=n||1e4,s<0||n<0)throw new r("invalid params to pbkdf2");const o=1+(s>>5)<<2;let c,i,a,f,u;const w=new ArrayBuffer(o),h=new l(w);let p=0;const d=T;for(e=V.bytes.C(e),u=1;p<(o||1);u++){for(c=i=t.encrypt(d.concat(e,[u])),a=1;a<n;a++)for(i=t.encrypt(i),f=0;f<i.length;f++)c[f]^=i[f];for(a=0;p<(o||1)&&a<c.length;a++)h.setInt32(p,c[a]),p+=4}return w.slice(0,s/8)},_:class{constructor(t){const e=this,n=e.V=K,s=[[],[]];e.K=[new n,new n];const r=e.K[0].blockSize/32;t.length>r&&(t=(new n).update(t).R());for(let e=0;e<r;e++)s[0][e]=909522486^t[e],s[1][e]=1549556828^t[e];e.K[0].update(s[0]),e.K[1].update(s[1]),e.L=new n(e.K[0])}reset(){const t=this;t.L=new t.V(t.K[0]),t.O=!1}update(t){this.O=!0,this.L.update(t)}digest(){const t=this,e=t.L.R(),n=new t.V(t.K[1]).update(e).R();return t.reset(),n}encrypt(t){if(this.O)throw new r("encrypt on already updated hmac called!");return this.update(t),this.digest(t)}}},L=typeof h!=b&&typeof h.getRandomValues==k,O="Invalid password",j="Invalid signature",H=j,N="zipjs-abort-check-password";function q(t){if(L)return h.getRandomValues(t);throw new r("Crypto API not supported")}const G=16,J={name:"PBKDF2"},Q=e.assign({hash:{name:"HMAC"}},J),X=e.assign({iterations:1e3,hash:{name:"SHA-1"}},J),Y=["deriveBits"],Z=[8,12,16],$=[16,24,32],tt=10,et=[0,0,0,0],nt=typeof h!=b,st=nt&&h.subtle,rt=nt&&typeof st!=b,ot=V.bytes,ct=class{constructor(t){const e=this;e.j=[[[],[],[],[],[]],[[],[],[],[],[]]],e.j[0][0][0]||e.H();const n=e.j[0][4],s=e.j[1],o=t.length;let c,i,a,f=1;if(4!==o&&6!==o&&8!==o)throw new r("invalid aes key size");for(e.A=[i=t.slice(0),a=[]],c=o;c<4*o+28;c++){let t=i[c-1];(c%o===0||8===o&&c%o===4)&&(t=n[t>>>24]<<24^n[t>>16&255]<<16^n[t>>8&255]<<8^n[255&t],c%o===0&&(t=t<<8^t>>>24^f<<24,f=f<<1^283*(f>>7))),i[c]=i[c-o]^t}for(let t=0;c;t++,c--){const e=i[3&t?c:c-4];a[t]=c<=4||t<4?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.N(t,0)}decrypt(t){return this.N(t,1)}H(){const t=this.j[0],e=this.j[1],n=t[4],s=e[4],r=[],o=[];let c,i,a,f;for(let t=0;t<256;t++)o[(r[t]=t<<1^283*(t>>7))^t]=t;for(let l=c=0;!n[l];l^=i||1,c=o[c]||1){let o=c^c<<1^c<<2^c<<3^c<<4;o=o>>8^255&o^99,n[l]=o,s[o]=l,f=r[a=r[i=r[l]]];let u=16843009*f^65537*a^257*i^16843008*l,w=257*r[o]^16843008*o;for(let n=0;n<4;n++)t[n][l]=w=w<<24^w>>>8,e[n][o]=u=u<<24^u>>>8}for(let n=0;n<5;n++)t[n]=t[n].slice(0),e[n]=e[n].slice(0)}N(t,e){if(4!==t.length)throw new r("invalid aes block size");const n=this.A[e],s=n.length/4-2,o=[0,0,0,0],c=this.j[e],i=c[0],a=c[1],f=c[2],l=c[3],u=c[4];let w,h,p,d=t[0]^n[0],y=t[e?3:1]^n[1],m=t[2]^n[2],S=t[e?1:3]^n[3],g=4;for(let t=0;t<s;t++)w=i[d>>>24]^a[y>>16&255]^f[m>>8&255]^l[255&S]^n[g],h=i[y>>>24]^a[m>>16&255]^f[S>>8&255]^l[255&d]^n[g+1],p=i[m>>>24]^a[S>>16&255]^f[d>>8&255]^l[255&y]^n[g+2],S=i[S>>>24]^a[d>>16&255]^f[y>>8&255]^l[255&m]^n[g+3],g+=4,d=w,y=h,m=p;for(let t=0;t<4;t++)o[e?3&-t:t]=u[d>>>24]<<24^u[y>>16&255]<<16^u[m>>8&255]<<8^u[255&S]^n[g++],w=d,d=y,y=m,m=S,S=w;return o}},it=class{constructor(t,e){this.G=t,this.J=e,this.X=e}reset(){this.X=this.J}update(t){return this.Y(this.G,t,this.X)}Z(t){if(255&~(t>>24))t+=1<<24;else{let 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}$(t){0===(t[0]=this.Z(t[0]))&&(t[1]=this.Z(t[1]))}Y(t,e,n){let s;if(!(s=e.length))return[];const r=T.bitLength(e);for(let r=0;r<s;r+=4){this.$(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 T.m(e,r)}},at=E._;let ft=nt&&rt&&typeof st.importKey==k,lt=nt&&rt&&typeof st.deriveBits==k;class ut extends d{constructor({password:t,rawPassword:e,encryptionStrength:n,checkPasswordOnly:s,checkAuthenticationCode:c=!0}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:c,strength:i,et:a,ready:f}=n;c?(await(async(t,e,n,s)=>{const o=await dt(t,e,n,mt(s,0,Z[e])),c=mt(s,Z[e]);if(o[0]!=c[0]||o[1]!=c[1])throw new r(O)})(n,i,c,mt(t,0,Z[i]+2)),t=mt(t,Z[i]+2),s?e.error(new r(N)):a()):await f;const l=new o(t.length-tt-(t.length-tt)%G);e.enqueue(pt(n,t,l,0,tt,!0))},async flush(t){const{nt:e,st:n,ot:s,ready:o}=this;if(n&&e){await o;const i=mt(s,0,s.length-tt),a=mt(s,s.length-tt);let f=z;if(i.length){const t=gt(ot,i);n.update(t);const s=e.update(t);f=St(ot,s)}const l=mt(St(ot,n.digest()),0,tt);let u=s.length<tt?1:0;for(let t=0;t<tt;t++)u|=l[t]^a[t];if(u&&c)throw new r(H);t.enqueue(f)}}})}}class wt extends d{constructor({password:t,rawPassword:e,encryptionStrength:n}){super({start(){ht(this,t,e,n)},async transform(t,e){const n=this,{password:s,strength:r,et:c,ready:i}=n;let a=z;s?(a=await(async(t,e,n)=>{const s=q(new o(Z[e]));return W(s,await dt(t,e,n,s))})(n,r,s),c()):await i;const f=new o(a.length+t.length-t.length%G);f.set(a,0),e.enqueue(pt(n,t,f,a.length,0))},async flush(t){const{nt:e,st:n,ot:s,ready:r}=this;if(n&&e){await r;let o=z;if(s.length){const t=e.update(gt(ot,s));n.update(t),o=St(ot,t)}const c=St(ot,n.digest()).slice(0,tt);t.enqueue(W(o,c))}}})}}function ht(t,n,s,r){e.assign(t,{ready:new u(e=>t.et=e),password:yt(n,s),strength:r-1,ot:z})}function pt(t,e,n,s,r,c){const{nt:i,st:a,ot:f}=t;f.length&&(e=W(f,e));const l=e.length-r;let u;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%G)),u=0;u<=l-G;u+=G){const t=gt(ot,mt(e,u,u+G));c&&a.update(t);const r=i.update(t);c||a.update(r),n.set(St(ot,r),u+s)}return t.ot=mt(e,u),n}async function dt(n,s,r,c){n.password=null;const i=await(async(t,e,n,s,r)=>{if(!ft)return E.importKey(e);try{return await st.importKey("raw",e,n,!1,r)}catch{return ft=!1,E.importKey(e)}})(0,r,Q,0,Y),a=await(async(t,e,n)=>{if(!lt)return E.T(e,t.salt,X.iterations,n);try{return await st.deriveBits(t,e,n)}catch{return lt=!1,E.T(e,t.salt,X.iterations,n)}})(e.assign({salt:c},X),i,8*(2*$[s]+2)),f=new o(a),l=gt(ot,mt(f,0,$[s])),u=gt(ot,mt(f,$[s],2*$[s])),w=mt(f,2*$[s]);return e.assign(n,{keys:{key:l,ct:u,passwordVerification:w},nt:new it(new ct(l),t.from(et)),st:new at(u)}),w}function yt(t,e){return e===v?(t=>{if(typeof w==b){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 w).encode(t)})(t):e}function mt(t,e,n){return t.subarray(e,n)}function St(t,e){return t.v(e)}function gt(t,e){return t.C(e)}class vt extends d{constructor({password:t,rawPassword:e,passwordVerification:n,checkPasswordOnly:s}){super({start(){kt(this,t,e,n)},transform(t,e){const n=this;if(n.password||n.rawPassword){const e=zt(n,t.subarray(0,12));if(n.password=n.rawPassword=null,0!=(e[11]^n.passwordVerification))throw new r(O);t=t.subarray(12)}s?e.error(new r(N)):e.enqueue(zt(n,t))}})}}class bt extends d{constructor({password:t,rawPassword:e,passwordVerification:n}){super({start(){kt(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=q(new o(12));e[11]=n.passwordVerification,s=new o(t.length+e.length),s.set(Ct(n,e),0),r=12}else s=new o(t.length),r=0;s.set(Ct(n,t),r),e.enqueue(s)}})}}function kt(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,it:new R(r[0]),ft:new R(r[2])}),s)for(let e=0;e<s.length;e++)It(t,s[e]);else for(let e=0;e<n.length;e++)It(t,n.charCodeAt(e))})(t,n,s)}function zt(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=At(t)^e[s],It(t,n[s]);return n}function Ct(t,e){const n=new o(e.length);for(let s=0;s<e.length;s++)n[s]=At(t)^e[s],It(t,e[s]);return n}function It(t,e){let[,n]=t.keys;t.it.append([e]);const r=~t.it.get();n=Mt(s.imul(Mt(n+xt(r)),134775813)+1),t.ft.append([n>>>24]);const o=~t.ft.get();t.keys=[r,n,o]}function At(t){const e=2|t.keys[2];return xt(s.imul(e,1^e)>>>8)}function xt(t){return 255&t}function Mt(t){return 4294967295&t}function Pt(t){if(t instanceof y)return t;const e=t.getReader();return new y({async pull(t){const{value:n,done:s}=await e.read();s?t.close():t.enqueue(n)},cancel:t=>e.cancel(t)})}const Dt=new f;function Ft(t){return Dt.get(t)}const Bt="Invalid uncompressed size",Rt=j,Ut="deflate-raw",Wt="gzip",_t=[31,139,8];class Tt extends d{constructor(t,{chunkSize:e,CompressionStreamFallback:n,CompressionStream:s}){super({});const{compressed:r,encrypted:o,useCompressionStream:c,zipCrypto:i,computeCrc32:a,level:f,deflate64:u,format:w,compressionMethod:h}=t,p=this;let d,y,m,S=super.readable;const g=w&&Ft(w),v=a&&r&&!u&&!g&&(!o||i)&&!(!c||!s);if(o&&!i||!a||v||(d=new U,S=Ht(S,d)),r)if(g)S=Nt(S,Ot(g.CompressionStream,w,{level:f,chunkSize:e,compressionMethod:h}));else if(v)m=new Vt,S=Nt(S,new s(Wt)),S=Ht(S,m);else try{S=jt(S,c,{level:f,chunkSize:e},s,n)}catch(t){let e;try{e=new s(Wt)}catch{throw t}S=Nt(S,e),S=Ht(S,new Vt)}o&&(i?S=Ht(S,new bt(t)):(y=new wt(t),S=Ht(S,y))),Lt(p,S,()=>{o&&!i||!a||(p.crc32=v?m.crc32:new l(d.value.buffer).getUint32(0))})}}class Vt 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 o=n.length+t.length;if(o<=8)return void(n=W(n,t));const c=o-8,i=s.min(c,n.length);r.enqueue(W(n.subarray(0,i),t.subarray(0,c-i))),n=W(n.subarray(i),t.subarray(c-i))},flush(){const e=_(n);t.crc32=e.getUint32(0,!0),t.uncompressedSize=e.getUint32(4,!0)}}),t=this}}class Kt extends d{constructor(t,{chunkSize:e,DecompressionStreamFallback:n,DecompressionStream:s}){super({});const{zipCrypto:c,encrypted:i,checkCrc32:a,crc32:f,compressed:w,useCompressionStream:h,deflate64:p,format:m,compressionMethod:S,rawBitFlag:g,outputSize:b}=t;let k,z,C=super.readable;if(i&&(c?C=Ht(C,new vt(t)):(z=new ut(t),C=Ht(C,z))),w){const t=m&&Ft(m);if(t)C=Nt(C,Ot(t.DecompressionStream,m,{chunkSize:e,compressionMethod:S,rawBitFlag:g,uncompressedSize:b}));else try{C=jt(C,h,{chunkSize:e,deflate64:p},s,n)}catch(t){if(p||b===v)throw t;let e;try{e=new s(Wt)}catch{throw t}C=((t,e,n)=>{const s=new R;let c,i,a,f=0,l=!1;const w=new u((t,e)=>{i=t,a=e});w.catch(()=>{}),n||i();const h=new d({start(t){const e=new o(10);e.set(_t),t.enqueue(e)},transform(t,e){e.enqueue(t)},async flush(t){l=!0,y();try{await w}finally{m()}const e=new o(8),r=_(e);r.setUint32(0,s.get(),!0),r.setUint32(4,n,!0),t.enqueue(e)},cancel(t){a(t)}}),p=new d({transform(t,e){s.append(t),f+=t.length,f>=n?i():l&&y(),e.enqueue(t)},cancel(t){a(t)}});return t=Ht(t,h),Ht(t=Nt(t,e),p);function y(){m(),c=setTimeout(()=>a(new r(Bt)),5e3)}function m(){clearTimeout(c)}})(C,e,b)}C=(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)})})(C)}a&&(k=new U,C=Ht(C,k)),Lt(this,C,()=>{if(a){const t=new l(k.value.buffer);if(f!=t.getUint32(0,!1))throw new r(Rt)}})}}const Et=new f;function Lt(t,n,s){n=Ht(n,new d({flush:s})),e.defineProperty(t,"readable",{get:()=>n})}function Ot(t,e,n){if(!t)throw new r("Compression method not supported");return new t(e,n)}function jt(t,e,n,s,r){const o=e&&s?s:r||s,c=n.deflate64?"deflate64-raw":Ut;let i;try{i=new o(c,n)}catch(t){if(!e||!r||o==r)throw t;i=new r(c,n)}return Nt(t,i)}function Ht(t,e){return Pt(t).pipeThrough(e)}function Nt(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 qt="data",Gt="close",Jt="deflate";class Qt extends d{constructor(t,n){super({});const s=this,{codecType:o}=t;let c;o.startsWith(Jt)?c=Tt:o.startsWith("inflate")&&(c=Kt),s.outputSize=0;let i=0;const a=new c(t,n),f=super.readable,l=new d({transform(t,e){t&&t.length&&(i+=t.length,e.enqueue(t))},flush(){e.assign(s,{inputSize:i})}}),u=new d({transform(e,n){if(e&&e.length&&(n.enqueue(e),s.outputSize+=e.length,t.outputSize!==v&&s.outputSize>t.outputSize))throw new r(Bt)},flush(){const{crc32:t}=a;e.assign(s,{crc32:t,inputSize:i})}});e.defineProperty(s,"readable",{get:()=>f.pipeThrough(l).pipeThrough(a).pipeThrough(u)})}}class Xt extends d{constructor(t){const e=[];let s=0;function r(){const n=new o(t);let r=0;for(;r<t;){const s=e[0],o=t-r;s.length<=o?(n.set(s,r),r+=s.length,e.shift()):(n.set(s.subarray(0,o),r),e[0]=s.subarray(o),r+=o)}return s-=t,n}(!n.isFinite(t)||t<1)&&(t=65536),super({transform(n,o){for(e.push(n),s+=n.length;s>t;)o.enqueue(r())},flush(t){s&&t.enqueue(((t,e)=>{const n=new o(e);let s=0;for(const e of t)n.set(e,s),s+=e.length;return n})(e,s))}})}}let Yt=2;try{typeof navigator!=b&&navigator.hardwareConcurrency&&(Yt=navigator.hardwareConcurrency)}catch{}const Zt=new f,$t=new f;let te,ee,ne,se,re,oe,ce=0;async function ie(t){let e,o;try{const{options:c,config:i}=t;if(c.format)try{await(async(t,e)=>{!Dt.has(t)&&e&&((t,e)=>{const{CompressionStream:n,DecompressionStream:s}=e;if(typeof n!=k&&typeof s!=k)throw new r("Invalid codec module");Dt.set(t,{CompressionStream:n,DecompressionStream:s})})(t,await(import(e)))})(c.format,c.codecURI)}catch(t){throw t.codecImportFailed=!0,t}if(i.CompressionStream=self.CompressionStream,i.DecompressionStream=self.DecompressionStream,c.compressed&&!c.format)if(c.useCompressionStream){if(!((t,e)=>{if(!t)return!1;let n=Et.get(t);n||(n=new f,Et.set(t,n));let s=n.get(e);if(s===v){try{new t(e),s=!0}catch{s=!1}n.set(e,s)}return s})(c.codecType.startsWith(Jt)?i.CompressionStream:i.DecompressionStream,Ut))try{await self.initModule(t.config)}catch{}}else try{await self.initModule(t.config)}catch{c.useCompressionStream=!0}!i.CompressionStreamFallback&&i.CompressionStreamZlib&&(i.CompressionStreamFallback=i.CompressionStreamZlib),!i.DecompressionStreamFallback&&i.DecompressionStreamZlib&&(i.DecompressionStreamFallback=i.DecompressionStreamZlib);const a={highWaterMark:1},l=t.readable?Pt(t.readable):new y({async pull(t){const e=new u(t=>Zt.set(ce,t));ae({type:"pull",messageId:ce}),ce=(ce+1)%n.MAX_SAFE_INTEGER;const{value:s,done:r}=await e;t.enqueue(s),r&&t.close()}},a);o=t.writable?(t=>{if(t instanceof m)return t;const e=t.getWriter();return new m({write:t=>e.write(t),close:()=>e.close(),abort:t=>e.abort(t)})})(t.writable):new m({async write(t){let e;const s=new u(t=>e=t);$t.set(ce,e),ae({type:qt,value:t,messageId:ce}),ce=(ce+1)%n.MAX_SAFE_INTEGER,await s}},a),e=new Qt(c,i),te=new AbortController;const{signal:w}=te;await l.pipeThrough(e).pipeThrough(new Xt((t=>{return r="string"==typeof(e=r=t.chunkSize)&&e.trim()?n(e):e,n.isInteger(r)&&r>=1?s.max(r,64):65536;var e,r})(i))).pipeTo(o,{signal:w,preventClose:!0,preventAbort:!0}),await o.getWriter().close();const{crc32:h,inputSize:p,outputSize:d}=e;ae({type:Gt,result:{crc32:h,inputSize:p,outputSize:d}})}catch(t){if(t.outputSize=e?e.outputSize:0,o&&!o.locked)try{await o.getWriter().close()}catch{}fe(t)}}function ae(t){const{value:e}=t;if(e)if(e.length)try{t.value=(n=e,n.byteOffset||n.byteLength!=n.buffer.byteLength?new o(n):n).buffer,p(t,[t.value])}catch{p(t)}else p(t);else p(t);var n}function fe(t=new r("Unknown error")){const{message:e,stack:n,code:s,name:o,outputSize:c,cause:i,codecImportFailed:a}=t,f={message:e,stack:n,code:s,name:o,outputSize:c};i&&(f.cause={name:i.name,message:i.message}),a&&(f.codecImportFailed=!0),p({error:f})}function le(t,e,n={}){if(!ee){const t=new r("WASM module not loaded");throw t.cause=oe,t}const c="number"==typeof n.level?n.level:-1,i="number"==typeof n.outBuffer?n.outBuffer:65536,a="number"==typeof n.inBufferSize?n.inBufferSize:65536;return new d({start(){try{let n;if(this.lt=ne(i),this.in=ne(a),this.inBufferSize=a,!this.lt||!this.in)throw new r("allocation failed");if(this.ut=new o(i),t?(this.wt=ee.deflate_process,this.ht=ee.deflate_last_consumed,this.yt=ee.deflate_end,this.St=ee.deflate_new(),n="gzip"===e?ee.deflate_init_gzip(this.St,c):"deflate-raw"===e?ee.deflate_init_raw(this.St,c):ee.deflate_init(this.St,c)):"deflate64-raw"===e?(this.wt=ee.inflate9_process,this.ht=ee.inflate9_last_consumed,this.yt=ee.inflate9_end,this.St=ee.inflate9_new(),n=ee.inflate9_init_raw(this.St)):(this.wt=ee.inflate_process,this.ht=ee.inflate_last_consumed,this.yt=ee.inflate_end,this.St=ee.inflate_new(),n="deflate-raw"===e?ee.inflate_init_raw(this.St):"gzip"===e?ee.inflate_init_gzip(this.St):ee.inflate_init(this.St)),0!==n)throw new r("init failed:"+n)}catch(t){throw f(this),t}},transform(e,n){try{const c=e,a=new o(re.buffer),f=this.wt,l=this.ht,u=this.lt,w=this.ut;let h=0;for(;h<c.length;){const e=s.min(c.length-h,32768);if((!this.in||this.inBufferSize<e)&&(this.in&&se&&(se(this.in),this.in=0),this.in=ne(e),this.inBufferSize=e,!this.in))throw new r("allocation failed");a.set(c.subarray(h,h+e),this.in);const o=f(this.St,this.in,e,u,i,0),p=16777215&o;if(p&&(w.set(a.subarray(u,u+p),0),n.enqueue(w.slice(0,p))),!t){const t=o>>24&255,e=128&t?t-256:t;if(e<0)throw new r("process error:"+e)}const d=l(this.St);if(0===d)break;h+=d}}catch(t){f(this),n.error(t)}},flush(e){try{const n=new o(re.buffer),s=this.wt,c=this.lt,a=this.ut;for(;;){const o=s(this.St,0,0,c,i,4),f=16777215&o,l=o>>24&255;if(!t){const t=128&l?l-256:l;if(t<0)throw new r("process error:"+t)}if(f&&(a.set(n.subarray(c,c+f),0),e.enqueue(a.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.St&&t.yt&&(e=t.yt(t.St)),t.St=0,t.in&&se&&se(t.in),t.in=0,t.lt&&se&&se(t.lt),t.lt=0,e}}addEventListener("message",({data:t})=>{const{type:e,messageId:n,value:s,done:r}=t;try{if("start"==e&&ie(t),e==qt){const t=Zt.get(n);Zt.delete(n),t({value:s||new o,done:r})}if("ack"==e){const t=$t.get(n);$t.delete(n),t()}e==Gt&&te.abort()}catch(t){fe(t)}}),p({type:"ready"});class ue{constructor(t="deflate",e){return le(!0,t,e)}}class we{constructor(t="deflate",e){return le(!1,t,e)}}ue.gt=!0,we.gt=!0;let he=!1;((t={})=>{const{init:e}=t,n=t.CompressionStreamFallback||t.CompressionStreamZlib,s=t.DecompressionStreamFallback||t.DecompressionStreamZlib;self.initModule=async t=>{e&&await e(t),n&&(t.CompressionStreamFallback=n),s&&(t.DecompressionStreamFallback=s)}})({CompressionStreamFallback:ue,DecompressionStreamFallback:we,init:t=>(async(t,{baseURI:e})=>{if(!he)try{await(async(t,e)=>{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;t<s;++t)r[t]=n.charCodeAt(t);return r.buffer})(t)}(t=>{if(ee=t,({malloc:ne,free:se,memory:re}=ee),"function"!=typeof ne||"function"!=typeof se||!re)throw ee=ne=se=re=null,new r("Invalid WASM module")})((await WebAssembly.instantiate(n)).instance.exports)})(t,e),he=!0}catch(t){throw(t=>{oe=t})(t),t}})(t.wasmURI,t)})});\n';if("string"==typeof s&&(s=(new TextEncoder).encode(s)),t){const t=new Blob([s],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+(t=>{let n="";const s=t.length;let r=0;for(;r+2<s;r+=3){const s=t[r]<<16|t[r+1]<<8|t[r+2];n+=e[s>>18&63]+e[s>>12&63]+e[s>>6&63]+e[63&s];}const o=s-r;if(1===o){const s=t[r]<<16;n+=e[s>>18&63]+e[s>>12&63]+"==";}else if(2===o){const s=t[r]<<16|t[r+1]<<8;n+=e[s>>18&63]+e[s>>12&63]+e[s>>6&63]+"=";}return n})(s)}});
|
|
256
403
|
|
|
257
404
|
/*
|
|
258
405
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -1400,13 +1547,13 @@
|
|
|
1400
1547
|
const {
|
|
1401
1548
|
ctr,
|
|
1402
1549
|
hmac,
|
|
1403
|
-
|
|
1550
|
+
pendingInput,
|
|
1404
1551
|
ready
|
|
1405
1552
|
} = this;
|
|
1406
1553
|
if (hmac && ctr) {
|
|
1407
1554
|
await ready;
|
|
1408
|
-
const chunkToDecrypt = subarray(
|
|
1409
|
-
const originalAuthenticationCode = subarray(
|
|
1555
|
+
const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1556
|
+
const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1410
1557
|
let decryptedChunkArray = EMPTY_UINT8_ARRAY;
|
|
1411
1558
|
if (chunkToDecrypt.length) {
|
|
1412
1559
|
const encryptedChunk = toBits(codecBytes, chunkToDecrypt);
|
|
@@ -1415,7 +1562,7 @@
|
|
|
1415
1562
|
decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
|
|
1416
1563
|
}
|
|
1417
1564
|
const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
|
|
1418
|
-
let invalidAuthenticationCode =
|
|
1565
|
+
let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
|
|
1419
1566
|
for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
|
|
1420
1567
|
invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
|
|
1421
1568
|
}
|
|
@@ -1459,14 +1606,14 @@
|
|
|
1459
1606
|
const {
|
|
1460
1607
|
ctr,
|
|
1461
1608
|
hmac,
|
|
1462
|
-
|
|
1609
|
+
pendingInput,
|
|
1463
1610
|
ready
|
|
1464
1611
|
} = this;
|
|
1465
1612
|
if (hmac && ctr) {
|
|
1466
1613
|
await ready;
|
|
1467
1614
|
let encryptedChunkArray = EMPTY_UINT8_ARRAY;
|
|
1468
|
-
if (
|
|
1469
|
-
const encryptedChunk = ctr.update(toBits(codecBytes,
|
|
1615
|
+
if (pendingInput.length) {
|
|
1616
|
+
const encryptedChunk = ctr.update(toBits(codecBytes, pendingInput));
|
|
1470
1617
|
hmac.update(encryptedChunk);
|
|
1471
1618
|
encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
|
|
1472
1619
|
}
|
|
@@ -1483,7 +1630,7 @@
|
|
|
1483
1630
|
ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
|
|
1484
1631
|
password: encodePassword(password, rawPassword),
|
|
1485
1632
|
strength: encryptionStrength - 1,
|
|
1486
|
-
|
|
1633
|
+
pendingInput: EMPTY_UINT8_ARRAY
|
|
1487
1634
|
});
|
|
1488
1635
|
}
|
|
1489
1636
|
|
|
@@ -1491,10 +1638,10 @@
|
|
|
1491
1638
|
const {
|
|
1492
1639
|
ctr,
|
|
1493
1640
|
hmac,
|
|
1494
|
-
|
|
1641
|
+
pendingInput
|
|
1495
1642
|
} = aesCrypto;
|
|
1496
|
-
if (
|
|
1497
|
-
input = concat(
|
|
1643
|
+
if (pendingInput.length) {
|
|
1644
|
+
input = concat(pendingInput, input);
|
|
1498
1645
|
}
|
|
1499
1646
|
const inputLength = input.length - paddingEnd;
|
|
1500
1647
|
output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
|
|
@@ -1510,7 +1657,7 @@
|
|
|
1510
1657
|
}
|
|
1511
1658
|
output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
|
|
1512
1659
|
}
|
|
1513
|
-
aesCrypto.
|
|
1660
|
+
aesCrypto.pendingInput = subarray(input, offset);
|
|
1514
1661
|
return output;
|
|
1515
1662
|
}
|
|
1516
1663
|
|
|
@@ -3287,6 +3434,96 @@
|
|
|
3287
3434
|
resetWebWorkerSupport();
|
|
3288
3435
|
}
|
|
3289
3436
|
|
|
3437
|
+
/*
|
|
3438
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
3439
|
+
|
|
3440
|
+
Redistribution and use in source and binary forms, with or without
|
|
3441
|
+
modification, are permitted provided that the following conditions are met:
|
|
3442
|
+
|
|
3443
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
3444
|
+
this list of conditions and the following disclaimer.
|
|
3445
|
+
|
|
3446
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
3447
|
+
notice, this list of conditions and the following disclaimer in
|
|
3448
|
+
the documentation and/or other materials provided with the distribution.
|
|
3449
|
+
|
|
3450
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
3451
|
+
derived from this software without specific prior written permission.
|
|
3452
|
+
|
|
3453
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
3454
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
3455
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
3456
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
3457
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
3458
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
3459
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
3460
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
3461
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
3462
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
3463
|
+
*/
|
|
3464
|
+
|
|
3465
|
+
/* global TextDecoder */
|
|
3466
|
+
|
|
3467
|
+
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
3468
|
+
const VALID_CP437 = CP437.length == 256;
|
|
3469
|
+
|
|
3470
|
+
function decodeCP437(stringValue) {
|
|
3471
|
+
if (VALID_CP437) {
|
|
3472
|
+
let result = "";
|
|
3473
|
+
for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
|
|
3474
|
+
result += CP437[stringValue[indexCharacter]];
|
|
3475
|
+
}
|
|
3476
|
+
return result;
|
|
3477
|
+
} else {
|
|
3478
|
+
return new TextDecoder().decode(stringValue);
|
|
3479
|
+
}
|
|
3480
|
+
}
|
|
3481
|
+
|
|
3482
|
+
/*
|
|
3483
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
3484
|
+
|
|
3485
|
+
Redistribution and use in source and binary forms, with or without
|
|
3486
|
+
modification, are permitted provided that the following conditions are met:
|
|
3487
|
+
|
|
3488
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
3489
|
+
this list of conditions and the following disclaimer.
|
|
3490
|
+
|
|
3491
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
3492
|
+
notice, this list of conditions and the following disclaimer in
|
|
3493
|
+
the documentation and/or other materials provided with the distribution.
|
|
3494
|
+
|
|
3495
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
3496
|
+
derived from this software without specific prior written permission.
|
|
3497
|
+
|
|
3498
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
3499
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
3500
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
3501
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
3502
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
3503
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
3504
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
3505
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
3506
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
3507
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
3508
|
+
*/
|
|
3509
|
+
|
|
3510
|
+
|
|
3511
|
+
function decodeText(value, encoding) {
|
|
3512
|
+
return decode(value, encoding, true);
|
|
3513
|
+
}
|
|
3514
|
+
|
|
3515
|
+
function decodeTextRemovingBOM(value, encoding) {
|
|
3516
|
+
return decode(value, encoding, false);
|
|
3517
|
+
}
|
|
3518
|
+
|
|
3519
|
+
function decode(value, encoding, ignoreBOM) {
|
|
3520
|
+
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
3521
|
+
return decodeCP437(value);
|
|
3522
|
+
} else {
|
|
3523
|
+
return new TextDecoder(encoding, { ignoreBOM }).decode(value);
|
|
3524
|
+
}
|
|
3525
|
+
}
|
|
3526
|
+
|
|
3290
3527
|
/*
|
|
3291
3528
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
3292
3529
|
|
|
@@ -3359,6 +3596,7 @@
|
|
|
3359
3596
|
createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
|
|
3360
3597
|
const reader = this;
|
|
3361
3598
|
let chunkOffset = 0;
|
|
3599
|
+
chunkSize = normalizeChunkSize(chunkSize);
|
|
3362
3600
|
return new ReadableStream({
|
|
3363
3601
|
async pull(controller) {
|
|
3364
3602
|
const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
|
|
@@ -3366,7 +3604,7 @@
|
|
|
3366
3604
|
if (data.length) {
|
|
3367
3605
|
controller.enqueue(data);
|
|
3368
3606
|
}
|
|
3369
|
-
if ((chunkOffset + chunkSize >= size) || (
|
|
3607
|
+
if ((chunkOffset + chunkSize >= size) || (!data.length && dataSize)) {
|
|
3370
3608
|
controller.close();
|
|
3371
3609
|
} else {
|
|
3372
3610
|
chunkOffset += chunkSize;
|
|
@@ -3446,31 +3684,31 @@
|
|
|
3446
3684
|
Object.assign(this, {
|
|
3447
3685
|
contentType,
|
|
3448
3686
|
data: "data:" + (contentType || "") + ";base64,",
|
|
3449
|
-
|
|
3687
|
+
pendingCharacters: ""
|
|
3450
3688
|
});
|
|
3451
3689
|
}
|
|
3452
3690
|
|
|
3453
3691
|
writeUint8Array(array) {
|
|
3454
3692
|
const writer = this;
|
|
3455
3693
|
let indexArray;
|
|
3456
|
-
let dataString = writer.
|
|
3457
|
-
const delta = writer.
|
|
3458
|
-
writer.
|
|
3694
|
+
let dataString = writer.pendingCharacters;
|
|
3695
|
+
const delta = writer.pendingCharacters.length;
|
|
3696
|
+
writer.pendingCharacters = "";
|
|
3459
3697
|
for (indexArray = 0; indexArray < (Math.floor((delta + array.length) / 3) * 3) - delta; indexArray++) {
|
|
3460
3698
|
dataString += String.fromCharCode(array[indexArray]);
|
|
3461
3699
|
}
|
|
3462
3700
|
for (; indexArray < array.length; indexArray++) {
|
|
3463
|
-
writer.
|
|
3701
|
+
writer.pendingCharacters += String.fromCharCode(array[indexArray]);
|
|
3464
3702
|
}
|
|
3465
3703
|
if (dataString.length > 2) {
|
|
3466
3704
|
writer.data += btoa(dataString);
|
|
3467
3705
|
} else {
|
|
3468
|
-
writer.
|
|
3706
|
+
writer.pendingCharacters = dataString + writer.pendingCharacters;
|
|
3469
3707
|
}
|
|
3470
3708
|
}
|
|
3471
3709
|
|
|
3472
3710
|
getData() {
|
|
3473
|
-
return this.data + btoa(this.
|
|
3711
|
+
return this.data + btoa(this.pendingCharacters);
|
|
3474
3712
|
}
|
|
3475
3713
|
}
|
|
3476
3714
|
|
|
@@ -3500,7 +3738,7 @@
|
|
|
3500
3738
|
constructor(blob) {
|
|
3501
3739
|
super();
|
|
3502
3740
|
Object.assign(this, {
|
|
3503
|
-
blob,
|
|
3741
|
+
sourceBlob: blob,
|
|
3504
3742
|
size: blob.size
|
|
3505
3743
|
});
|
|
3506
3744
|
if (!blobSliceProbe) {
|
|
@@ -3510,13 +3748,13 @@
|
|
|
3510
3748
|
|
|
3511
3749
|
createReadable(options) {
|
|
3512
3750
|
const reader = this;
|
|
3513
|
-
const {
|
|
3751
|
+
const { sourceBlob, size } = reader;
|
|
3514
3752
|
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
3515
3753
|
if (!offset && readSize >= size) {
|
|
3516
|
-
return toCompatibleReadable(
|
|
3754
|
+
return toCompatibleReadable(sourceBlob.stream());
|
|
3517
3755
|
}
|
|
3518
3756
|
if (blobSliceReliable) {
|
|
3519
|
-
return toCompatibleReadable(
|
|
3757
|
+
return toCompatibleReadable(sourceBlob.slice(offset, offset + readSize).stream());
|
|
3520
3758
|
}
|
|
3521
3759
|
return super.createReadable(options);
|
|
3522
3760
|
}
|
|
@@ -3525,7 +3763,7 @@
|
|
|
3525
3763
|
const reader = this;
|
|
3526
3764
|
const offsetEnd = offset + length;
|
|
3527
3765
|
const readsWholeBlob = !offset && offsetEnd >= reader.size;
|
|
3528
|
-
const blob = readsWholeBlob ? reader.
|
|
3766
|
+
const blob = readsWholeBlob ? reader.sourceBlob : reader.sourceBlob.slice(offset, offsetEnd);
|
|
3529
3767
|
let arrayBuffer = await blob.arrayBuffer();
|
|
3530
3768
|
const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
|
|
3531
3769
|
if (sliceIgnoredByBuggyImplementation) {
|
|
@@ -3547,12 +3785,12 @@
|
|
|
3547
3785
|
}
|
|
3548
3786
|
});
|
|
3549
3787
|
writer.contentType = contentType;
|
|
3550
|
-
writer.
|
|
3551
|
-
writer.
|
|
3788
|
+
writer.blobPromise = streamToBlob(transformStream.readable, contentType);
|
|
3789
|
+
writer.blobPromise.catch(() => { });
|
|
3552
3790
|
}
|
|
3553
3791
|
|
|
3554
3792
|
getData() {
|
|
3555
|
-
return this.
|
|
3793
|
+
return this.blobPromise;
|
|
3556
3794
|
}
|
|
3557
3795
|
}
|
|
3558
3796
|
|
|
@@ -3566,7 +3804,7 @@
|
|
|
3566
3804
|
class TextWriter extends BlobWriter {
|
|
3567
3805
|
|
|
3568
3806
|
constructor(encoding) {
|
|
3569
|
-
super(
|
|
3807
|
+
super();
|
|
3570
3808
|
Object.assign(this, {
|
|
3571
3809
|
encoding,
|
|
3572
3810
|
utf8: !encoding || encoding.toLowerCase() == "utf-8"
|
|
@@ -3582,14 +3820,7 @@
|
|
|
3582
3820
|
if (blob.text && utf8) {
|
|
3583
3821
|
return blob.text();
|
|
3584
3822
|
} else {
|
|
3585
|
-
|
|
3586
|
-
return new Promise((resolve, reject) => {
|
|
3587
|
-
Object.assign(reader, {
|
|
3588
|
-
onload: ({ target }) => resolve(target.result),
|
|
3589
|
-
onerror: () => reject(reader.error)
|
|
3590
|
-
});
|
|
3591
|
-
reader.readAsText(blob, encoding);
|
|
3592
|
-
});
|
|
3823
|
+
return decodeTextRemovingBOM(new Uint8Array(await blob.arrayBuffer()), encoding);
|
|
3593
3824
|
}
|
|
3594
3825
|
}
|
|
3595
3826
|
}
|
|
@@ -4257,85 +4488,13 @@
|
|
|
4257
4488
|
return reader.readUint8Array(offset, size);
|
|
4258
4489
|
}
|
|
4259
4490
|
|
|
4260
|
-
|
|
4261
|
-
|
|
4262
|
-
|
|
4263
|
-
|
|
4264
|
-
|
|
4265
|
-
|
|
4266
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4267
|
-
this list of conditions and the following disclaimer.
|
|
4268
|
-
|
|
4269
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4270
|
-
notice, this list of conditions and the following disclaimer in
|
|
4271
|
-
the documentation and/or other materials provided with the distribution.
|
|
4272
|
-
|
|
4273
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4274
|
-
derived from this software without specific prior written permission.
|
|
4275
|
-
|
|
4276
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4277
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4278
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4279
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4280
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4281
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4282
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4283
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4284
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4285
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4286
|
-
*/
|
|
4287
|
-
|
|
4288
|
-
/* global TextDecoder */
|
|
4289
|
-
|
|
4290
|
-
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
4291
|
-
const VALID_CP437 = CP437.length == 256;
|
|
4292
|
-
|
|
4293
|
-
function decodeCP437(stringValue) {
|
|
4294
|
-
if (VALID_CP437) {
|
|
4295
|
-
let result = "";
|
|
4296
|
-
for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
|
|
4297
|
-
result += CP437[stringValue[indexCharacter]];
|
|
4298
|
-
}
|
|
4299
|
-
return result;
|
|
4300
|
-
} else {
|
|
4301
|
-
return new TextDecoder().decode(stringValue);
|
|
4302
|
-
}
|
|
4303
|
-
}
|
|
4304
|
-
|
|
4305
|
-
/*
|
|
4306
|
-
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
4307
|
-
|
|
4308
|
-
Redistribution and use in source and binary forms, with or without
|
|
4309
|
-
modification, are permitted provided that the following conditions are met:
|
|
4310
|
-
|
|
4311
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4312
|
-
this list of conditions and the following disclaimer.
|
|
4313
|
-
|
|
4314
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4315
|
-
notice, this list of conditions and the following disclaimer in
|
|
4316
|
-
the documentation and/or other materials provided with the distribution.
|
|
4317
|
-
|
|
4318
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4319
|
-
derived from this software without specific prior written permission.
|
|
4320
|
-
|
|
4321
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4322
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4323
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4324
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4325
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4326
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4327
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4328
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4329
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4330
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4331
|
-
*/
|
|
4332
|
-
|
|
4333
|
-
|
|
4334
|
-
function decodeText(value, encoding) {
|
|
4335
|
-
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
4336
|
-
return decodeCP437(value);
|
|
4491
|
+
function createReadable(reader, options) {
|
|
4492
|
+
if (reader.createReadable) {
|
|
4493
|
+
return reader.createReadable(options);
|
|
4494
|
+
} else if (reader.readUint8Array) {
|
|
4495
|
+
return Reader.prototype.createReadable.call(reader, options);
|
|
4337
4496
|
} else {
|
|
4338
|
-
return
|
|
4497
|
+
return reader.readable;
|
|
4339
4498
|
}
|
|
4340
4499
|
}
|
|
4341
4500
|
|
|
@@ -4495,83 +4654,6 @@
|
|
|
4495
4654
|
|
|
4496
4655
|
}
|
|
4497
4656
|
|
|
4498
|
-
/*
|
|
4499
|
-
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
4500
|
-
|
|
4501
|
-
Redistribution and use in source and binary forms, with or without
|
|
4502
|
-
modification, are permitted provided that the following conditions are met:
|
|
4503
|
-
|
|
4504
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4505
|
-
this list of conditions and the following disclaimer.
|
|
4506
|
-
|
|
4507
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4508
|
-
notice, this list of conditions and the following disclaimer in
|
|
4509
|
-
the documentation and/or other materials provided with the distribution.
|
|
4510
|
-
|
|
4511
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4512
|
-
derived from this software without specific prior written permission.
|
|
4513
|
-
|
|
4514
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4515
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4516
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4517
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4518
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4519
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4520
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4521
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4522
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4523
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4524
|
-
*/
|
|
4525
|
-
|
|
4526
|
-
const OPTION_FILENAME_ENCODING = "filenameEncoding";
|
|
4527
|
-
const OPTION_COMMENT_ENCODING = "commentEncoding";
|
|
4528
|
-
const OPTION_DECODE_TEXT = "decodeText";
|
|
4529
|
-
const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
|
|
4530
|
-
const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
|
|
4531
|
-
const OPTION_PASSWORD = "password";
|
|
4532
|
-
const OPTION_RAW_PASSWORD = "rawPassword";
|
|
4533
|
-
const OPTION_PASS_THROUGH = "passThrough";
|
|
4534
|
-
const OPTION_SIGNAL = "signal";
|
|
4535
|
-
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
4536
|
-
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
4537
|
-
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
4538
|
-
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
4539
|
-
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
4540
|
-
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
4541
|
-
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
4542
|
-
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
4543
|
-
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
4544
|
-
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
4545
|
-
const OPTION_TRANSFER_STREAMS = "transferStreams";
|
|
4546
|
-
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
4547
|
-
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
4548
|
-
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
4549
|
-
const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
|
|
4550
|
-
const OPTION_KEEP_ORDER = "keepOrder";
|
|
4551
|
-
const OPTION_LEVEL = "level";
|
|
4552
|
-
const OPTION_BUFFERED_WRITE = "bufferedWrite";
|
|
4553
|
-
const OPTION_CREATE_TEMP_STREAM = "createTempStream";
|
|
4554
|
-
const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
|
|
4555
|
-
const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
|
|
4556
|
-
const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
|
|
4557
|
-
const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
|
|
4558
|
-
const OPTION_ENCODE_TEXT = "encodeText";
|
|
4559
|
-
const OPTION_OFFSET = "offset";
|
|
4560
|
-
const OPTION_USDZ = "usdz";
|
|
4561
|
-
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
4562
|
-
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
4563
|
-
const OPTION_STRICTNESS = "strictness";
|
|
4564
|
-
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
4565
|
-
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
4566
|
-
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
4567
|
-
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
4568
|
-
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
4569
|
-
const TEXT_TYPE_FILENAME = "filename";
|
|
4570
|
-
const TEXT_TYPE_COMMENT = "comment";
|
|
4571
|
-
const STRICTNESS_STRICT = "strict";
|
|
4572
|
-
const STRICTNESS_BALANCED = "balanced";
|
|
4573
|
-
const STRICTNESS_TOLERANT = "tolerant";
|
|
4574
|
-
|
|
4575
4657
|
/*
|
|
4576
4658
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4577
4659
|
|
|
@@ -4612,6 +4694,7 @@
|
|
|
4612
4694
|
const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
|
|
4613
4695
|
const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
4614
4696
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
4697
|
+
const ERR_ENTRY_DATA_OUT_OF_BOUNDS = "Entry data out of bounds";
|
|
4615
4698
|
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
4616
4699
|
const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
|
|
4617
4700
|
const ERR_UNSAFE_FILENAME = "Unsafe filename";
|
|
@@ -4632,7 +4715,7 @@
|
|
|
4632
4715
|
];
|
|
4633
4716
|
const ZIP64_EXTRACTION = {
|
|
4634
4717
|
[MAX_16_BITS]: {
|
|
4635
|
-
getValue: getUint32,
|
|
4718
|
+
getValue: getUint32$1,
|
|
4636
4719
|
bytes: 4
|
|
4637
4720
|
},
|
|
4638
4721
|
[MAX_32_BITS]: {
|
|
@@ -4641,6 +4724,7 @@
|
|
|
4641
4724
|
}
|
|
4642
4725
|
};
|
|
4643
4726
|
const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
|
|
4727
|
+
const MAX_DEFLATE_EXPANSION_RATIO = 1032;
|
|
4644
4728
|
const CENTRAL_DIRECTORY_UNREACHABLE = 0;
|
|
4645
4729
|
const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
|
|
4646
4730
|
const CENTRAL_DIRECTORY_REACHABLE = 2;
|
|
@@ -4651,7 +4735,6 @@
|
|
|
4651
4735
|
Object.assign(this, {
|
|
4652
4736
|
reader: new GenericReader(reader),
|
|
4653
4737
|
options,
|
|
4654
|
-
config: getConfiguration(),
|
|
4655
4738
|
readRanges: new Map()
|
|
4656
4739
|
});
|
|
4657
4740
|
}
|
|
@@ -4659,7 +4742,6 @@
|
|
|
4659
4742
|
async* getEntriesGenerator(options = {}) {
|
|
4660
4743
|
const zipReader = this;
|
|
4661
4744
|
let { reader } = zipReader;
|
|
4662
|
-
const { config } = zipReader;
|
|
4663
4745
|
await initStream(reader);
|
|
4664
4746
|
if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
|
|
4665
4747
|
reader = new BlobReader(await streamToBlob(reader.readable));
|
|
@@ -4676,9 +4758,7 @@
|
|
|
4676
4758
|
const normalizeFilename = getOptionValue$1(zipReader, options, OPTION_NORMALIZE_FILENAME);
|
|
4677
4759
|
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
4678
4760
|
if (!endOfDirectoryInfo) {
|
|
4679
|
-
|
|
4680
|
-
const signatureView = getDataView(signatureArray);
|
|
4681
|
-
if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
|
|
4761
|
+
if (await startsWithSplitZipSignature$1(reader)) {
|
|
4682
4762
|
throw new Error(ERR_SPLIT_ZIP_FILE);
|
|
4683
4763
|
} else {
|
|
4684
4764
|
throw new Error(ERR_EOCDR_NOT_FOUND);
|
|
@@ -4688,22 +4768,23 @@
|
|
|
4688
4768
|
throwAmbiguousArchive("multiple end of central directory records");
|
|
4689
4769
|
}
|
|
4690
4770
|
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
4691
|
-
let directoryDataLength = getUint32(endOfDirectoryView, 12);
|
|
4692
|
-
let directoryDataOffset = getUint32(endOfDirectoryView, 16);
|
|
4771
|
+
let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
|
|
4772
|
+
let directoryDataOffset = getUint32$1(endOfDirectoryView, 16);
|
|
4693
4773
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
4694
|
-
const commentLength = getUint16(endOfDirectoryView, 20);
|
|
4774
|
+
const commentLength = getUint16$1(endOfDirectoryView, 20);
|
|
4695
4775
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
4696
4776
|
if (reader.size - appendedDataOffset > maxAppendedDataSize) {
|
|
4697
4777
|
throwAmbiguousArchive("appended data");
|
|
4698
4778
|
}
|
|
4699
|
-
let lastDiskNumber = getUint16(endOfDirectoryView, 4);
|
|
4779
|
+
let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
|
|
4700
4780
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
4701
|
-
let diskNumber = getUint16(endOfDirectoryView, 6);
|
|
4702
|
-
let filesLength = getUint16(endOfDirectoryView, 10);
|
|
4781
|
+
let diskNumber = getUint16$1(endOfDirectoryView, 6);
|
|
4782
|
+
let filesLength = getUint16$1(endOfDirectoryView, 10);
|
|
4703
4783
|
let prependedDataLength = 0;
|
|
4704
4784
|
let startOffset;
|
|
4705
4785
|
let zip64EndOfDirectory;
|
|
4706
4786
|
let zip64EndOfDirectoryVersion2;
|
|
4787
|
+
let zip64EndOfDirectoryLength = ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
4707
4788
|
let directoryEncryptionInfo;
|
|
4708
4789
|
const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
|
|
4709
4790
|
if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
|
|
@@ -4715,12 +4796,12 @@
|
|
|
4715
4796
|
EMPTY_UINT8_ARRAY;
|
|
4716
4797
|
const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
|
|
4717
4798
|
if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
|
|
4718
|
-
getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
4719
|
-
directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4799
|
+
getUint32$1(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
4800
|
+
directoryDataOffset = getDiskOffset$1(reader, getUint32$1(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4720
4801
|
let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4721
4802
|
let endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4722
4803
|
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
4723
|
-
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
4804
|
+
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
4724
4805
|
directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
|
|
4725
4806
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
4726
4807
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
@@ -4730,7 +4811,7 @@
|
|
|
4730
4811
|
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4731
4812
|
endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4732
4813
|
}
|
|
4733
|
-
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4814
|
+
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4734
4815
|
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4735
4816
|
}
|
|
4736
4817
|
zip64EndOfDirectory = true;
|
|
@@ -4740,18 +4821,19 @@
|
|
|
4740
4821
|
Number(getBigUint64(endOfDirectoryView, 4)) - (ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12),
|
|
4741
4822
|
reader.size - directoryDataOffset - ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4742
4823
|
if (extensibleDataLength > 0) {
|
|
4824
|
+
zip64EndOfDirectoryLength += extensibleDataLength;
|
|
4743
4825
|
const rawExtensibleData = await readUint8Array(reader, directoryDataOffset + ZIP64_END_OF_CENTRAL_DIR_LENGTH, extensibleDataLength);
|
|
4744
4826
|
directoryEncryptionInfo = getDirectoryEncryptionInfo(rawExtensibleData);
|
|
4745
4827
|
}
|
|
4746
4828
|
}
|
|
4747
4829
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
4748
|
-
lastDiskNumber = getUint32(endOfDirectoryView, 16);
|
|
4749
|
-
} else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
|
|
4830
|
+
lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
|
|
4831
|
+
} else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
|
|
4750
4832
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
4751
4833
|
}
|
|
4752
4834
|
if (diskNumber == MAX_16_BITS) {
|
|
4753
|
-
diskNumber = getUint32(endOfDirectoryView, 20);
|
|
4754
|
-
} else if (checkAmbiguity && diskNumber != getUint32(endOfDirectoryView, 20)) {
|
|
4835
|
+
diskNumber = getUint32$1(endOfDirectoryView, 20);
|
|
4836
|
+
} else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
|
|
4755
4837
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
4756
4838
|
}
|
|
4757
4839
|
if (filesLength == MAX_16_BITS) {
|
|
@@ -4769,7 +4851,7 @@
|
|
|
4769
4851
|
}
|
|
4770
4852
|
let declaredDirectoryDataLength = directoryDataLength;
|
|
4771
4853
|
const centralDirectoryEndOffset = endOfDirectoryInfo.offset -
|
|
4772
|
-
(zip64EndOfDirectory ?
|
|
4854
|
+
(zip64EndOfDirectory ? zip64EndOfDirectoryLength + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
|
|
4773
4855
|
if (directoryDataOffset >= reader.size) {
|
|
4774
4856
|
prependedDataLength = reader.size - directoryDataOffset - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
4775
4857
|
directoryDataOffset = reader.size - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
@@ -4789,11 +4871,13 @@
|
|
|
4789
4871
|
}
|
|
4790
4872
|
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
4791
4873
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4792
|
-
const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE
|
|
4874
|
+
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
|
|
4875
|
+
Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
|
|
4876
|
+
detectEncryptedCentralDirectory(directoryView);
|
|
4793
4877
|
let reconcile = !storedPointsAtDirectory;
|
|
4794
4878
|
if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
4795
4879
|
const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
|
|
4796
|
-
reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4880
|
+
reconcile = getUint32$1(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4797
4881
|
}
|
|
4798
4882
|
if (reconcile) {
|
|
4799
4883
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
@@ -4817,12 +4901,14 @@
|
|
|
4817
4901
|
}
|
|
4818
4902
|
zipReader.directoryOffset = directoryDataOffset;
|
|
4819
4903
|
zipReader.directoryLength = declaredDirectoryDataLength;
|
|
4820
|
-
const decryptCentralDirectory =
|
|
4821
|
-
let decryptedDirectory;
|
|
4904
|
+
const decryptCentralDirectory = getFunctionOptionValue$1(zipReader, options, OPTION_DECRYPT_CENTRAL_DIRECTORY);
|
|
4905
|
+
let decryptedDirectory, dataAfterEncryptedDirectory;
|
|
4822
4906
|
if (decryptCentralDirectory && filesLength && directoryArray.length >= 4 &&
|
|
4823
|
-
getUint32(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
|
|
4907
|
+
getUint32$1(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
|
|
4824
4908
|
(zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4825
|
-
|
|
4909
|
+
const encryptedDirectoryDataLength = getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryArray.length);
|
|
4910
|
+
dataAfterEncryptedDirectory = directoryArray.subarray(encryptedDirectoryDataLength);
|
|
4911
|
+
directoryArray = await decryptCentralDirectory(directoryArray.subarray(0, encryptedDirectoryDataLength), directoryEncryptionInfo);
|
|
4826
4912
|
directoryView = getDataView(directoryArray);
|
|
4827
4913
|
declaredDirectoryDataLength = directoryArray.length;
|
|
4828
4914
|
decryptedDirectory = true;
|
|
@@ -4833,8 +4919,8 @@
|
|
|
4833
4919
|
const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
|
|
4834
4920
|
let duplicateFilename;
|
|
4835
4921
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
4836
|
-
const fileEntry = new ZipEntry(reader,
|
|
4837
|
-
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4922
|
+
const fileEntry = new ZipEntry(reader, zipReader.options);
|
|
4923
|
+
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32$1(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4838
4924
|
if (indexFile == 0 && !decryptedDirectory && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4839
4925
|
throw new Error(ERR_ENCRYPTED_CENTRAL_DIRECTORY);
|
|
4840
4926
|
}
|
|
@@ -4845,16 +4931,16 @@
|
|
|
4845
4931
|
const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
|
|
4846
4932
|
const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
|
|
4847
4933
|
const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
|
|
4848
|
-
const versionMadeBy = getUint16(directoryView, offset + 4);
|
|
4934
|
+
const versionMadeBy = getUint16$1(directoryView, offset + 4);
|
|
4849
4935
|
const msDosCompatible = versionMadeBy >> 8 == 0;
|
|
4850
4936
|
const unixCompatible = versionMadeBy >> 8 == 3;
|
|
4851
4937
|
const rawFilename = directoryArray.subarray(filenameOffset, extraFieldOffset);
|
|
4852
|
-
const commentLength = getUint16(directoryView, offset + 32);
|
|
4938
|
+
const commentLength = getUint16$1(directoryView, offset + 32);
|
|
4853
4939
|
const endOffset = commentOffset + commentLength;
|
|
4854
4940
|
const rawComment = directoryArray.subarray(commentOffset, endOffset);
|
|
4855
4941
|
const filenameUTF8 = languageEncodingFlag;
|
|
4856
4942
|
const commentUTF8 = languageEncodingFlag;
|
|
4857
|
-
const externalFileAttributes = getUint32(directoryView, offset + 38);
|
|
4943
|
+
const externalFileAttributes = getUint32$1(directoryView, offset + 38);
|
|
4858
4944
|
const msdosAttributesRaw = externalFileAttributes & MAX_8_BITS;
|
|
4859
4945
|
const msdosAttributes = {
|
|
4860
4946
|
readOnly: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_READONLY_MASK),
|
|
@@ -4863,8 +4949,8 @@
|
|
|
4863
4949
|
directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
|
|
4864
4950
|
archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
|
|
4865
4951
|
};
|
|
4866
|
-
const offsetFileEntry = getUint32(directoryView, offset + 42);
|
|
4867
|
-
const decode =
|
|
4952
|
+
const offsetFileEntry = getUint32$1(directoryView, offset + 42);
|
|
4953
|
+
const decode = getFunctionOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
4868
4954
|
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
4869
4955
|
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
4870
4956
|
let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
|
|
@@ -4888,6 +4974,7 @@
|
|
|
4888
4974
|
}
|
|
4889
4975
|
Object.assign(fileEntry, {
|
|
4890
4976
|
index: indexFile,
|
|
4977
|
+
decryptedDirectory,
|
|
4891
4978
|
versionMadeBy,
|
|
4892
4979
|
msDosCompatible,
|
|
4893
4980
|
zip64: false,
|
|
@@ -4895,8 +4982,8 @@
|
|
|
4895
4982
|
uncompressedSize: 0,
|
|
4896
4983
|
commentLength,
|
|
4897
4984
|
offset: offsetFileEntry,
|
|
4898
|
-
diskNumberStart: getUint16(directoryView, offset + 34),
|
|
4899
|
-
internalFileAttributes: getUint16(directoryView, offset + 36),
|
|
4985
|
+
diskNumberStart: getUint16$1(directoryView, offset + 34),
|
|
4986
|
+
internalFileAttributes: getUint16$1(directoryView, offset + 36),
|
|
4900
4987
|
externalFileAttributes,
|
|
4901
4988
|
msdosAttributesRaw,
|
|
4902
4989
|
msdosAttributes,
|
|
@@ -4964,12 +5051,11 @@
|
|
|
4964
5051
|
yield entry;
|
|
4965
5052
|
}
|
|
4966
5053
|
let offsetAfterSignature = offset;
|
|
4967
|
-
|
|
4968
|
-
|
|
4969
|
-
|
|
4970
|
-
|
|
4971
|
-
|
|
4972
|
-
}
|
|
5054
|
+
const digitalSignature = readDigitalSignature(directoryArray.subarray(offset)) ||
|
|
5055
|
+
(decryptedDirectory ? readDigitalSignature(dataAfterEncryptedDirectory) : UNDEFINED_VALUE);
|
|
5056
|
+
if (digitalSignature) {
|
|
5057
|
+
zipReader.digitalSignature = digitalSignature;
|
|
5058
|
+
offsetAfterSignature = offset + 6 + digitalSignature.length;
|
|
4973
5059
|
}
|
|
4974
5060
|
if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
|
|
4975
5061
|
throwAmbiguousArchive("trailing central directory data");
|
|
@@ -4977,13 +5063,17 @@
|
|
|
4977
5063
|
if (duplicateFilename) {
|
|
4978
5064
|
throwAmbiguousArchive("duplicate filename");
|
|
4979
5065
|
}
|
|
4980
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > 0))) {
|
|
4981
|
-
throwAmbiguousArchive("prepended data");
|
|
4982
|
-
}
|
|
4983
5066
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
4984
5067
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5068
|
+
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5069
|
+
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5070
|
+
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5071
|
+
throwAmbiguousArchive("prepended data");
|
|
5072
|
+
}
|
|
4985
5073
|
if (extractPrependedData) {
|
|
4986
|
-
zipReader.prependedData = startOffset >
|
|
5074
|
+
zipReader.prependedData = startOffset > splitZipSignatureLength ?
|
|
5075
|
+
await readUint8Array(reader, splitZipSignatureLength, startOffset - splitZipSignatureLength) :
|
|
5076
|
+
EMPTY_UINT8_ARRAY;
|
|
4987
5077
|
}
|
|
4988
5078
|
zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : EMPTY_UINT8_ARRAY;
|
|
4989
5079
|
if (extractAppendedData) {
|
|
@@ -5050,16 +5140,16 @@
|
|
|
5050
5140
|
|
|
5051
5141
|
class ZipEntry {
|
|
5052
5142
|
|
|
5053
|
-
constructor(reader,
|
|
5143
|
+
constructor(reader, options) {
|
|
5054
5144
|
Object.assign(this, {
|
|
5055
5145
|
reader,
|
|
5056
|
-
config,
|
|
5057
5146
|
options
|
|
5058
5147
|
});
|
|
5059
5148
|
}
|
|
5060
5149
|
|
|
5061
5150
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5062
5151
|
const zipEntry = this;
|
|
5152
|
+
const config = getConfiguration();
|
|
5063
5153
|
const {
|
|
5064
5154
|
reader,
|
|
5065
5155
|
index,
|
|
@@ -5068,7 +5158,6 @@
|
|
|
5068
5158
|
extraFieldAES,
|
|
5069
5159
|
extraFieldZip64,
|
|
5070
5160
|
compressionMethod,
|
|
5071
|
-
config,
|
|
5072
5161
|
bitFlag,
|
|
5073
5162
|
rawBitFlag,
|
|
5074
5163
|
crc32,
|
|
@@ -5086,6 +5175,7 @@
|
|
|
5086
5175
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
5087
5176
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
5088
5177
|
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
5178
|
+
checkPasswordOption(password, rawPassword);
|
|
5089
5179
|
password = password && password.length && password;
|
|
5090
5180
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
5091
5181
|
if (extraFieldAES) {
|
|
@@ -5093,7 +5183,7 @@
|
|
|
5093
5183
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
5094
5184
|
}
|
|
5095
5185
|
}
|
|
5096
|
-
if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
5186
|
+
if (dataArray.length < HEADER_SIZE || getUint32$1(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
5097
5187
|
throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
|
|
5098
5188
|
}
|
|
5099
5189
|
readCommonHeader(localDirectory, dataView, 4);
|
|
@@ -5155,9 +5245,12 @@
|
|
|
5155
5245
|
}
|
|
5156
5246
|
}
|
|
5157
5247
|
const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
|
|
5248
|
+
if (dataOffset + compressedSize > reader.size) {
|
|
5249
|
+
throw new Error(ERR_ENTRY_DATA_OUT_OF_BOUNDS);
|
|
5250
|
+
}
|
|
5158
5251
|
const size = compressedSize;
|
|
5159
5252
|
const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
|
|
5160
|
-
const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
|
|
5253
|
+
const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
|
|
5161
5254
|
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5162
5255
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
5163
5256
|
const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
|
|
@@ -5165,6 +5258,8 @@
|
|
|
5165
5258
|
checkOverlappingEntry = true;
|
|
5166
5259
|
}
|
|
5167
5260
|
const { onstart, onprogress, onend } = options;
|
|
5261
|
+
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThrough;
|
|
5262
|
+
const outputSize = passThrough ? compressedSize : uncompressedSize;
|
|
5168
5263
|
const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
|
|
5169
5264
|
let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
|
|
5170
5265
|
if (deflate64) {
|
|
@@ -5185,9 +5280,9 @@
|
|
|
5185
5280
|
checkCrc32,
|
|
5186
5281
|
checkAuthenticationCode: getOptionValue$1(zipEntry, options, OPTION_CHECK_AUTHENTICATION_CODE),
|
|
5187
5282
|
passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & MAX_8_BITS) : ((crc32 >>> 24) & MAX_8_BITS)),
|
|
5188
|
-
outputSize
|
|
5283
|
+
outputSize,
|
|
5189
5284
|
crc32,
|
|
5190
|
-
compressed
|
|
5285
|
+
compressed,
|
|
5191
5286
|
encrypted,
|
|
5192
5287
|
useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
|
|
5193
5288
|
useCompressionStream,
|
|
@@ -5224,11 +5319,11 @@
|
|
|
5224
5319
|
writer = new WritableStream();
|
|
5225
5320
|
}
|
|
5226
5321
|
writer = new GenericWriter(writer);
|
|
5227
|
-
await initStream(writer,
|
|
5322
|
+
await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
|
|
5228
5323
|
({ writable } = writer);
|
|
5229
|
-
const { outputSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5230
|
-
writer.size +=
|
|
5231
|
-
if (
|
|
5324
|
+
const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5325
|
+
writer.size += writtenSize;
|
|
5326
|
+
if (writtenSize != outputSize) {
|
|
5232
5327
|
throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
5233
5328
|
}
|
|
5234
5329
|
}
|
|
@@ -5262,26 +5357,47 @@
|
|
|
5262
5357
|
function detectEncryptedCentralDirectory(directoryView) {
|
|
5263
5358
|
const maxOffset = Math.min(directoryView.byteLength, 1024) - 3;
|
|
5264
5359
|
for (let offset = 0; offset < maxOffset; offset++) {
|
|
5265
|
-
if (getUint32(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
5360
|
+
if (getUint32$1(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
5266
5361
|
return true;
|
|
5267
5362
|
}
|
|
5268
5363
|
}
|
|
5269
5364
|
return false;
|
|
5270
5365
|
}
|
|
5271
5366
|
|
|
5367
|
+
function readDigitalSignature(signatureRecordArray) {
|
|
5368
|
+
if (signatureRecordArray.length >= 6) {
|
|
5369
|
+
const signatureRecordView = getDataView(signatureRecordArray);
|
|
5370
|
+
if (getUint32$1(signatureRecordView, 0) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
|
|
5371
|
+
const signatureDataLength = getUint16$1(signatureRecordView, 4);
|
|
5372
|
+
if (6 + signatureDataLength <= signatureRecordArray.length) {
|
|
5373
|
+
return signatureRecordArray.subarray(6, 6 + signatureDataLength);
|
|
5374
|
+
}
|
|
5375
|
+
}
|
|
5376
|
+
}
|
|
5377
|
+
}
|
|
5378
|
+
|
|
5379
|
+
function getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryDataLength) {
|
|
5380
|
+
const encryptedDirectoryDataLength = directoryEncryptionInfo && directoryEncryptionInfo.compressedSize ?
|
|
5381
|
+
directoryEncryptionInfo.compressedSize :
|
|
5382
|
+
declaredDirectoryDataLength;
|
|
5383
|
+
return encryptedDirectoryDataLength > 0 && encryptedDirectoryDataLength <= directoryDataLength ?
|
|
5384
|
+
encryptedDirectoryDataLength :
|
|
5385
|
+
directoryDataLength;
|
|
5386
|
+
}
|
|
5387
|
+
|
|
5272
5388
|
function getDirectoryEncryptionInfo(rawExtensibleData) {
|
|
5273
5389
|
const directoryEncryptionInfo = { rawExtensibleData };
|
|
5274
5390
|
if (rawExtensibleData.length >= 28) {
|
|
5275
5391
|
const extensibleDataView = getDataView(rawExtensibleData);
|
|
5276
|
-
const hashDataLength = getUint16(extensibleDataView, 26);
|
|
5392
|
+
const hashDataLength = getUint16$1(extensibleDataView, 26);
|
|
5277
5393
|
Object.assign(directoryEncryptionInfo, {
|
|
5278
|
-
compressionMethod: getUint16(extensibleDataView, 0),
|
|
5394
|
+
compressionMethod: getUint16$1(extensibleDataView, 0),
|
|
5279
5395
|
compressedSize: Number(getBigUint64(extensibleDataView, 2)),
|
|
5280
5396
|
uncompressedSize: Number(getBigUint64(extensibleDataView, 10)),
|
|
5281
|
-
encryptionAlgorithm: getUint16(extensibleDataView, 18),
|
|
5282
|
-
bitLength: getUint16(extensibleDataView, 20),
|
|
5283
|
-
flags: getUint16(extensibleDataView, 22),
|
|
5284
|
-
hashAlgorithm: getUint16(extensibleDataView, 24),
|
|
5397
|
+
encryptionAlgorithm: getUint16$1(extensibleDataView, 18),
|
|
5398
|
+
bitLength: getUint16$1(extensibleDataView, 20),
|
|
5399
|
+
flags: getUint16$1(extensibleDataView, 22),
|
|
5400
|
+
hashAlgorithm: getUint16$1(extensibleDataView, 24),
|
|
5285
5401
|
hashData: rawExtensibleData.subarray(28, 28 + hashDataLength)
|
|
5286
5402
|
});
|
|
5287
5403
|
}
|
|
@@ -5289,12 +5405,12 @@
|
|
|
5289
5405
|
}
|
|
5290
5406
|
|
|
5291
5407
|
function readCommonHeader(directory, dataView, offset) {
|
|
5292
|
-
const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2);
|
|
5408
|
+
const rawBitFlag = directory.rawBitFlag = getUint16$1(dataView, offset + 2);
|
|
5293
5409
|
const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED;
|
|
5294
|
-
const rawLastModDate = getUint32(dataView, offset + 6);
|
|
5410
|
+
const rawLastModDate = getUint32$1(dataView, offset + 6);
|
|
5295
5411
|
Object.assign(directory, {
|
|
5296
5412
|
encrypted,
|
|
5297
|
-
version: getUint16(dataView, offset),
|
|
5413
|
+
version: getUint16$1(dataView, offset),
|
|
5298
5414
|
bitFlag: {
|
|
5299
5415
|
level: (rawBitFlag & BITFLAG_LEVEL) >> 1,
|
|
5300
5416
|
dataDescriptor: (rawBitFlag & BITFLAG_DATA_DESCRIPTOR) == BITFLAG_DATA_DESCRIPTOR,
|
|
@@ -5302,8 +5418,8 @@
|
|
|
5302
5418
|
},
|
|
5303
5419
|
rawLastModDate,
|
|
5304
5420
|
lastModDate: getDate(rawLastModDate),
|
|
5305
|
-
filenameLength: getUint16(dataView, offset + 22),
|
|
5306
|
-
extraFieldLength: getUint16(dataView, offset + 24)
|
|
5421
|
+
filenameLength: getUint16$1(dataView, offset + 22),
|
|
5422
|
+
extraFieldLength: getUint16$1(dataView, offset + 24)
|
|
5307
5423
|
});
|
|
5308
5424
|
}
|
|
5309
5425
|
|
|
@@ -5314,8 +5430,8 @@
|
|
|
5314
5430
|
let offsetExtraField = 0;
|
|
5315
5431
|
try {
|
|
5316
5432
|
while (offsetExtraField < rawExtraField.length) {
|
|
5317
|
-
const type = getUint16(rawExtraFieldView, offsetExtraField);
|
|
5318
|
-
const size = getUint16(rawExtraFieldView, offsetExtraField + 2);
|
|
5433
|
+
const type = getUint16$1(rawExtraFieldView, offsetExtraField);
|
|
5434
|
+
const size = getUint16$1(rawExtraFieldView, offsetExtraField + 2);
|
|
5319
5435
|
extraField.set(type, {
|
|
5320
5436
|
type,
|
|
5321
5437
|
data: rawExtraField.slice(offsetExtraField + 4, offsetExtraField + 4 + size)
|
|
@@ -5325,12 +5441,12 @@
|
|
|
5325
5441
|
} catch {
|
|
5326
5442
|
// ignored
|
|
5327
5443
|
}
|
|
5328
|
-
const compressionMethod = getUint16(dataView, offset + 4);
|
|
5444
|
+
const compressionMethod = getUint16$1(dataView, offset + 4);
|
|
5329
5445
|
Object.assign(directory, {
|
|
5330
|
-
signature: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5331
|
-
crc32: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5332
|
-
compressedSize: getUint32(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
|
|
5333
|
-
uncompressedSize: getUint32(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
|
|
5446
|
+
signature: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5447
|
+
crc32: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5448
|
+
compressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
|
|
5449
|
+
uncompressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
|
|
5334
5450
|
});
|
|
5335
5451
|
const extraFieldZip64 = extraField.get(EXTRAFIELD_TYPE_ZIP64);
|
|
5336
5452
|
if (extraFieldZip64) {
|
|
@@ -5419,11 +5535,11 @@
|
|
|
5419
5535
|
computedCrc32.append(fileEntry[rawPropertyName]);
|
|
5420
5536
|
const computedCrc32View = getDataView(new Uint8Array(4));
|
|
5421
5537
|
computedCrc32View.setUint32(0, computedCrc32.get(), true);
|
|
5422
|
-
const nameCrc32 = getUint32(extraFieldView, 1);
|
|
5538
|
+
const nameCrc32 = getUint32$1(extraFieldView, 1);
|
|
5423
5539
|
Object.assign(extraFieldUnicode, {
|
|
5424
5540
|
version: getUint8(extraFieldView, 0),
|
|
5425
5541
|
[propertyName]: decodeText(extraFieldUnicode.data.subarray(5)),
|
|
5426
|
-
valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32(computedCrc32View, 0)
|
|
5542
|
+
valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32$1(computedCrc32View, 0)
|
|
5427
5543
|
});
|
|
5428
5544
|
if (extraFieldUnicode.valid) {
|
|
5429
5545
|
directory[propertyName] = extraFieldUnicode[propertyName];
|
|
@@ -5439,7 +5555,7 @@
|
|
|
5439
5555
|
vendorId: getUint8(extraFieldView, 2),
|
|
5440
5556
|
strength,
|
|
5441
5557
|
originalCompressionMethod: compressionMethod,
|
|
5442
|
-
compressionMethod: getUint16(extraFieldView, 5)
|
|
5558
|
+
compressionMethod: getUint16$1(extraFieldView, 5)
|
|
5443
5559
|
});
|
|
5444
5560
|
directory.compressionMethod = extraFieldAES.compressionMethod;
|
|
5445
5561
|
if (extraFieldAES.vendorVersion != VENDOR_VERSION_AE_1$1) {
|
|
@@ -5453,8 +5569,8 @@
|
|
|
5453
5569
|
let tag1Data;
|
|
5454
5570
|
try {
|
|
5455
5571
|
while (offsetExtraField < extraFieldNTFS.data.length && !tag1Data) {
|
|
5456
|
-
const tagValue = getUint16(extraFieldView, offsetExtraField);
|
|
5457
|
-
const attributeSize = getUint16(extraFieldView, offsetExtraField + 2);
|
|
5572
|
+
const tagValue = getUint16$1(extraFieldView, offsetExtraField);
|
|
5573
|
+
const attributeSize = getUint16$1(extraFieldView, offsetExtraField + 2);
|
|
5458
5574
|
if (tagValue == EXTRAFIELD_TYPE_NTFS_TAG1) {
|
|
5459
5575
|
tag1Data = extraFieldNTFS.data.slice(offsetExtraField + 4, offsetExtraField + 4 + attributeSize);
|
|
5460
5576
|
}
|
|
@@ -5487,12 +5603,12 @@
|
|
|
5487
5603
|
return;
|
|
5488
5604
|
}
|
|
5489
5605
|
const extraFieldView = getDataView(extraField.data);
|
|
5490
|
-
const lastAccessDate = new Date((getUint32(extraFieldView, 0) | 0) * 1000);
|
|
5491
|
-
const lastModDate = new Date((getUint32(extraFieldView, 4) | 0) * 1000);
|
|
5606
|
+
const lastAccessDate = new Date((getUint32$1(extraFieldView, 0) | 0) * 1000);
|
|
5607
|
+
const lastModDate = new Date((getUint32$1(extraFieldView, 4) | 0) * 1000);
|
|
5492
5608
|
const extraFieldData = { lastAccessDate, lastModDate };
|
|
5493
5609
|
if (extraField.data.length >= 12) {
|
|
5494
|
-
extraFieldData.uid = getUint16(extraFieldView, 8);
|
|
5495
|
-
extraFieldData.gid = getUint16(extraFieldView, 10);
|
|
5610
|
+
extraFieldData.uid = getUint16$1(extraFieldView, 8);
|
|
5611
|
+
extraFieldData.gid = getUint16$1(extraFieldView, 10);
|
|
5496
5612
|
}
|
|
5497
5613
|
Object.assign(extraField, extraFieldData);
|
|
5498
5614
|
Object.assign(directory, extraFieldData);
|
|
@@ -5512,8 +5628,8 @@
|
|
|
5512
5628
|
gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
|
|
5513
5629
|
Object.assign(extraField, { version, uid, gid });
|
|
5514
5630
|
} else if (extraField.data.length >= 4) {
|
|
5515
|
-
uid = getUint16(view, 0);
|
|
5516
|
-
gid = getUint16(view, 2);
|
|
5631
|
+
uid = getUint16$1(view, 0);
|
|
5632
|
+
gid = getUint16$1(view, 2);
|
|
5517
5633
|
Object.assign(extraField, { uid, gid });
|
|
5518
5634
|
}
|
|
5519
5635
|
if (uid !== UNDEFINED_VALUE) {
|
|
@@ -5563,7 +5679,7 @@
|
|
|
5563
5679
|
let offset = 1;
|
|
5564
5680
|
timeProperties.forEach((propertyName, indexProperty) => {
|
|
5565
5681
|
if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
|
|
5566
|
-
const time = getUint32(extraFieldView, offset);
|
|
5682
|
+
const time = getUint32$1(extraFieldView, offset);
|
|
5567
5683
|
directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
|
|
5568
5684
|
const rawPropertyName = timeRawProperties[indexProperty];
|
|
5569
5685
|
extraFieldExtendedTimestamp[rawPropertyName] = time;
|
|
@@ -5597,7 +5713,7 @@
|
|
|
5597
5713
|
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
|
|
5598
5714
|
const dataDescriptorView = getDataView(dataDescriptorArray);
|
|
5599
5715
|
let signature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
|
|
5600
|
-
getUint32(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
5716
|
+
getUint32$1(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
5601
5717
|
if (signature) {
|
|
5602
5718
|
const signedDataDescriptor = readDataDescriptor(dataDescriptorView, DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, extraFieldZip64);
|
|
5603
5719
|
const matchCrc32 = (fileEntry.encrypted && !fileEntry.zipCrypto) || signedDataDescriptor.crc32 == crc32;
|
|
@@ -5631,15 +5747,15 @@
|
|
|
5631
5747
|
}
|
|
5632
5748
|
|
|
5633
5749
|
function readDataDescriptor(dataDescriptorView, offset, extraFieldZip64) {
|
|
5634
|
-
const crc32 = getUint32(dataDescriptorView, offset);
|
|
5750
|
+
const crc32 = getUint32$1(dataDescriptorView, offset);
|
|
5635
5751
|
let compressedSize;
|
|
5636
5752
|
let uncompressedSize;
|
|
5637
5753
|
if (extraFieldZip64) {
|
|
5638
5754
|
compressedSize = getBigUint64(dataDescriptorView, offset + 4);
|
|
5639
5755
|
uncompressedSize = getBigUint64(dataDescriptorView, offset + 12);
|
|
5640
5756
|
} else {
|
|
5641
|
-
compressedSize = getUint32(dataDescriptorView, offset + 4);
|
|
5642
|
-
uncompressedSize = getUint32(dataDescriptorView, offset + 8);
|
|
5757
|
+
compressedSize = getUint32$1(dataDescriptorView, offset + 4);
|
|
5758
|
+
uncompressedSize = getUint32$1(dataDescriptorView, offset + 8);
|
|
5643
5759
|
}
|
|
5644
5760
|
return { crc32, compressedSize, uncompressedSize };
|
|
5645
5761
|
}
|
|
@@ -5648,10 +5764,28 @@
|
|
|
5648
5764
|
return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
|
|
5649
5765
|
}
|
|
5650
5766
|
|
|
5767
|
+
async function startsWithSplitZipSignature$1(reader) {
|
|
5768
|
+
return await getFirstSignature(reader) == SPLIT_ZIP_FILE_SIGNATURE;
|
|
5769
|
+
}
|
|
5770
|
+
|
|
5771
|
+
async function startsWithSplitZipMarker(reader) {
|
|
5772
|
+
const signature = await getFirstSignature(reader);
|
|
5773
|
+
return signature == SPLIT_ZIP_FILE_SIGNATURE || signature == TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE;
|
|
5774
|
+
}
|
|
5775
|
+
|
|
5776
|
+
async function getFirstSignature(reader) {
|
|
5777
|
+
const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
5778
|
+
return getUint32$1(getDataView(signatureArray));
|
|
5779
|
+
}
|
|
5780
|
+
|
|
5651
5781
|
function isStrictnessValue(value) {
|
|
5652
5782
|
return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
|
|
5653
5783
|
}
|
|
5654
5784
|
|
|
5785
|
+
function getDecodableOutputSize(outputSize, compressedSize, compressed) {
|
|
5786
|
+
return Math.min(outputSize, compressed ? compressedSize * MAX_DEFLATE_EXPANSION_RATIO : compressedSize);
|
|
5787
|
+
}
|
|
5788
|
+
|
|
5655
5789
|
function getStrictness(options, inheritedOptions) {
|
|
5656
5790
|
return resolveStrictness(options, resolveStrictness(inheritedOptions, STRICTNESS_BALANCED));
|
|
5657
5791
|
}
|
|
@@ -5714,7 +5848,7 @@
|
|
|
5714
5848
|
|
|
5715
5849
|
function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
|
|
5716
5850
|
if (maxAppendedDataSize !== UNDEFINED_VALUE) {
|
|
5717
|
-
const size = toNumber
|
|
5851
|
+
const size = toNumber(maxAppendedDataSize);
|
|
5718
5852
|
if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
|
|
5719
5853
|
throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE);
|
|
5720
5854
|
}
|
|
@@ -5737,7 +5871,7 @@
|
|
|
5737
5871
|
let plausibleEndOfDirectoryInfo;
|
|
5738
5872
|
let endOfDirectoryReachingEndCount = 0;
|
|
5739
5873
|
for await (const [anchoredView, anchoredOffset, anchoredArray, indexByte, offset] of scanEndOfCentralDirectory(reader, anchoredLength)) {
|
|
5740
|
-
const commentLength = getUint16(anchoredView, indexByte + 20);
|
|
5874
|
+
const commentLength = getUint16$1(anchoredView, indexByte + 20);
|
|
5741
5875
|
if (offset + END_OF_CENTRAL_DIR_LENGTH + commentLength == size) {
|
|
5742
5876
|
const reachability = await getCentralDirectoryReachability(reader, anchoredView, anchoredOffset, indexByte, offset, size, remoteProbeBudget);
|
|
5743
5877
|
if (reachability == CENTRAL_DIRECTORY_REACHABLE) {
|
|
@@ -5788,7 +5922,7 @@
|
|
|
5788
5922
|
const scanArray = await readUint8Array(reader, scanOffset, scanLength);
|
|
5789
5923
|
const scanView = getDataView(scanArray);
|
|
5790
5924
|
for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
|
|
5791
|
-
if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
5925
|
+
if (getUint32$1(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
5792
5926
|
yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
|
|
5793
5927
|
}
|
|
5794
5928
|
}
|
|
@@ -5799,9 +5933,9 @@
|
|
|
5799
5933
|
}
|
|
5800
5934
|
|
|
5801
5935
|
async function getCentralDirectoryReachability(reader, view, anchoredOffset, indexByte, offset, size, remoteProbeBudget) {
|
|
5802
|
-
const filesLength = getUint16(view, indexByte + 10);
|
|
5803
|
-
const directoryDataLength = getUint32(view, indexByte + 12);
|
|
5804
|
-
const directoryDataOffset = getUint32(view, indexByte + 16);
|
|
5936
|
+
const filesLength = getUint16$1(view, indexByte + 10);
|
|
5937
|
+
const directoryDataLength = getUint32$1(view, indexByte + 12);
|
|
5938
|
+
const directoryDataOffset = getUint32$1(view, indexByte + 16);
|
|
5805
5939
|
if (filesLength == MAX_16_BITS || directoryDataLength == MAX_32_BITS || directoryDataOffset == MAX_32_BITS) {
|
|
5806
5940
|
const locatorSignature = await readSignature(reader, view, anchoredOffset, offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, size, remoteProbeBudget);
|
|
5807
5941
|
return locatorSignature == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE ? CENTRAL_DIRECTORY_REACHABLE : CENTRAL_DIRECTORY_UNREACHABLE;
|
|
@@ -5809,7 +5943,7 @@
|
|
|
5809
5943
|
if (!filesLength && !directoryDataLength) {
|
|
5810
5944
|
return CENTRAL_DIRECTORY_PLAUSIBLE;
|
|
5811
5945
|
}
|
|
5812
|
-
const directoryDiskNumber = getUint16(view, indexByte + 6);
|
|
5946
|
+
const directoryDiskNumber = getUint16$1(view, indexByte + 6);
|
|
5813
5947
|
for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
|
|
5814
5948
|
if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
5815
5949
|
return CENTRAL_DIRECTORY_REACHABLE;
|
|
@@ -5823,19 +5957,21 @@
|
|
|
5823
5957
|
return UNDEFINED_VALUE;
|
|
5824
5958
|
}
|
|
5825
5959
|
if (signatureOffset >= anchoredOffset) {
|
|
5826
|
-
return getUint32(view, signatureOffset - anchoredOffset);
|
|
5960
|
+
return getUint32$1(view, signatureOffset - anchoredOffset);
|
|
5827
5961
|
}
|
|
5828
5962
|
if (remoteProbeBudget.count > 0) {
|
|
5829
5963
|
remoteProbeBudget.count--;
|
|
5830
5964
|
const signatureArray = await readUint8Array(reader, signatureOffset, 4);
|
|
5831
|
-
return getUint32(getDataView(signatureArray), 0);
|
|
5965
|
+
return getUint32$1(getDataView(signatureArray), 0);
|
|
5832
5966
|
}
|
|
5833
5967
|
return UNDEFINED_VALUE;
|
|
5834
5968
|
}
|
|
5835
5969
|
|
|
5836
5970
|
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
|
|
5837
5971
|
const { rawFilename } = zipEntry;
|
|
5838
|
-
|
|
5972
|
+
const maskedLocalDirectory = zipEntry.decryptedDirectory &&
|
|
5973
|
+
(localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
|
|
5974
|
+
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
5839
5975
|
(rawLocalFilename.length != rawFilename.length ||
|
|
5840
5976
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
5841
5977
|
throwAmbiguousArchive("mismatched local file header (filename)");
|
|
@@ -5846,7 +5982,7 @@
|
|
|
5846
5982
|
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
5847
5983
|
throwAmbiguousArchive("mismatched local file header (compression method)");
|
|
5848
5984
|
}
|
|
5849
|
-
if (!localDirectory.bitFlag.dataDescriptor &&
|
|
5985
|
+
if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
|
|
5850
5986
|
(localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
5851
5987
|
(localDirectory.crc32 != zipEntry.crc32 ||
|
|
5852
5988
|
localDirectory.compressedSize != zipEntry.compressedSize ||
|
|
@@ -5865,10 +6001,11 @@
|
|
|
5865
6001
|
return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
|
|
5866
6002
|
}
|
|
5867
6003
|
|
|
5868
|
-
function
|
|
5869
|
-
return
|
|
6004
|
+
function getFunctionOptionValue$1(zipReader, options, name) {
|
|
6005
|
+
return checkFunctionOption(getOptionValue$1(zipReader, options, name));
|
|
5870
6006
|
}
|
|
5871
6007
|
|
|
6008
|
+
|
|
5872
6009
|
function getDate(timeRaw) {
|
|
5873
6010
|
const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
|
|
5874
6011
|
return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
|
|
@@ -5882,11 +6019,11 @@
|
|
|
5882
6019
|
return view.getUint8(offset);
|
|
5883
6020
|
}
|
|
5884
6021
|
|
|
5885
|
-
function getUint16(view, offset) {
|
|
6022
|
+
function getUint16$1(view, offset) {
|
|
5886
6023
|
return view.getUint16(offset, true);
|
|
5887
6024
|
}
|
|
5888
6025
|
|
|
5889
|
-
function getUint32(view, offset) {
|
|
6026
|
+
function getUint32$1(view, offset) {
|
|
5890
6027
|
return view.getUint32(offset, true);
|
|
5891
6028
|
}
|
|
5892
6029
|
|
|
@@ -5901,6 +6038,7 @@
|
|
|
5901
6038
|
ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
|
|
5902
6039
|
ERR_ENCRYPTED: ERR_ENCRYPTED,
|
|
5903
6040
|
ERR_ENCRYPTED_CENTRAL_DIRECTORY: ERR_ENCRYPTED_CENTRAL_DIRECTORY,
|
|
6041
|
+
ERR_ENTRY_DATA_OUT_OF_BOUNDS: ERR_ENTRY_DATA_OUT_OF_BOUNDS,
|
|
5904
6042
|
ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
|
|
5905
6043
|
ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
|
|
5906
6044
|
ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
|
|
@@ -5957,12 +6095,16 @@
|
|
|
5957
6095
|
const ERR_INVALID_COMMENT = "Zip file comment exceeds 64KB";
|
|
5958
6096
|
const ERR_INVALID_COMMENT_TYPE = "Invalid zip file comment (must be a Uint8Array)";
|
|
5959
6097
|
const ERR_INVALID_ENTRY_COMMENT = "File entry comment exceeds 64KB";
|
|
6098
|
+
const ERR_INVALID_ENTRY_COMMENT_TYPE = "Invalid file entry comment (must be a string)";
|
|
6099
|
+
const ERR_INVALID_DATE = "Invalid date (must be a valid Date instance)";
|
|
5960
6100
|
const ERR_INVALID_ENTRY_NAME = "File entry name exceeds 64KB";
|
|
5961
6101
|
const ERR_INVALID_VERSION = "Version exceeds 65535";
|
|
5962
6102
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
5963
6103
|
const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
|
|
5964
6104
|
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
|
|
5965
|
-
const
|
|
6105
|
+
const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
|
|
6106
|
+
const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
|
|
6107
|
+
const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
|
|
5966
6108
|
const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
|
|
5967
6109
|
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
5968
6110
|
const MIN_UNIX_TIME = -2147483648;
|
|
@@ -5971,6 +6113,7 @@
|
|
|
5971
6113
|
const MAX_NTFS_TIME = BigInt("0x7fffffffffffffff");
|
|
5972
6114
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
5973
6115
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
6116
|
+
const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
|
|
5974
6117
|
const ERR_UNDETERMINED_SIZE = "Undetermined size";
|
|
5975
6118
|
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
5976
6119
|
const ERR_ZIP_NOT_EMPTY = "Zip file not empty";
|
|
@@ -5982,7 +6125,6 @@
|
|
|
5982
6125
|
const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
|
|
5983
6126
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
5984
6127
|
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
5985
|
-
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
5986
6128
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
5987
6129
|
|
|
5988
6130
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
@@ -6007,8 +6149,7 @@
|
|
|
6007
6149
|
writer,
|
|
6008
6150
|
addSplitZipSignature,
|
|
6009
6151
|
options,
|
|
6010
|
-
|
|
6011
|
-
files: new Map(),
|
|
6152
|
+
fileEntries: new Map(),
|
|
6012
6153
|
filenames: new Set(),
|
|
6013
6154
|
offset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options[OPTION_OFFSET],
|
|
6014
6155
|
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
@@ -6029,14 +6170,23 @@
|
|
|
6029
6170
|
await initStream(reader);
|
|
6030
6171
|
}
|
|
6031
6172
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6032
|
-
const zipReader$1 = new ZipReader(reader
|
|
6173
|
+
const zipReader$1 = new ZipReader(reader);
|
|
6033
6174
|
const entries = await zipReader$1.getEntries();
|
|
6034
6175
|
await zipReader$1.close();
|
|
6035
6176
|
await initStream(this.writer);
|
|
6036
|
-
|
|
6037
|
-
|
|
6177
|
+
const { directoryOffset } = zipReader$1;
|
|
6178
|
+
let splitZipSignatureLength = 0;
|
|
6179
|
+
if (this.addSplitZipSignature) {
|
|
6180
|
+
delete this.addSplitZipSignature;
|
|
6181
|
+
if (!await startsWithSplitZipSignature(reader)) {
|
|
6182
|
+
await writeData(this.writer, getSplitZipSignatureArray());
|
|
6183
|
+
splitZipSignatureLength = SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6184
|
+
this.offset += splitZipSignatureLength;
|
|
6185
|
+
}
|
|
6186
|
+
}
|
|
6187
|
+
const entryPositions = await copyZipData(this, reader, entries, directoryOffset, splitZipSignatureLength);
|
|
6038
6188
|
this.filenames = new Set(entries.map(entry => entry.filename));
|
|
6039
|
-
this.
|
|
6189
|
+
this.fileEntries = new Map(entries.map(entry => {
|
|
6040
6190
|
const {
|
|
6041
6191
|
version,
|
|
6042
6192
|
rawLastModDate,
|
|
@@ -6091,11 +6241,12 @@
|
|
|
6091
6241
|
if (crc32 !== UNDEFINED_VALUE) {
|
|
6092
6242
|
setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
|
|
6093
6243
|
}
|
|
6244
|
+
const { offset, diskNumberStart } = entryPositions.get(entry);
|
|
6094
6245
|
Object.assign(entry, {
|
|
6095
6246
|
zip64UncompressedSize,
|
|
6096
6247
|
zip64CompressedSize,
|
|
6097
|
-
|
|
6098
|
-
diskNumberStart
|
|
6248
|
+
offset,
|
|
6249
|
+
diskNumberStart,
|
|
6099
6250
|
zip64DiskNumberStart: false,
|
|
6100
6251
|
rawExtraFieldZip64,
|
|
6101
6252
|
rawExtraFieldAES,
|
|
@@ -6115,11 +6266,8 @@
|
|
|
6115
6266
|
async add(name = "", reader, options = {}) {
|
|
6116
6267
|
const zipWriter = this;
|
|
6117
6268
|
options = Object.assign({}, options);
|
|
6118
|
-
const {
|
|
6119
|
-
|
|
6120
|
-
config
|
|
6121
|
-
} = zipWriter;
|
|
6122
|
-
if (workers < config.maxWorkers) {
|
|
6269
|
+
const { pendingAddFileCalls } = zipWriter;
|
|
6270
|
+
if (workers < getConfiguration().maxWorkers) {
|
|
6123
6271
|
workers++;
|
|
6124
6272
|
} else {
|
|
6125
6273
|
await new Promise(resolve => pendingEntries.push(resolve));
|
|
@@ -6156,16 +6304,16 @@
|
|
|
6156
6304
|
}
|
|
6157
6305
|
|
|
6158
6306
|
remove(entry) {
|
|
6159
|
-
const { filenames,
|
|
6307
|
+
const { filenames, fileEntries } = this;
|
|
6160
6308
|
// deno-lint-ignore valid-typeof
|
|
6161
6309
|
if (typeof entry == STRING_TYPE) {
|
|
6162
|
-
entry =
|
|
6310
|
+
entry = fileEntries.get(entry);
|
|
6163
6311
|
}
|
|
6164
6312
|
if (entry && entry.filename !== UNDEFINED_VALUE) {
|
|
6165
6313
|
const { filename } = entry;
|
|
6166
|
-
if (filenames.has(filename) &&
|
|
6314
|
+
if (filenames.has(filename) && fileEntries.has(filename)) {
|
|
6167
6315
|
filenames.delete(filename);
|
|
6168
|
-
|
|
6316
|
+
fileEntries.delete(filename);
|
|
6169
6317
|
return true;
|
|
6170
6318
|
}
|
|
6171
6319
|
}
|
|
@@ -6262,12 +6410,12 @@
|
|
|
6262
6410
|
const metadataInfo = resolveMetadata(zipWriter, name, options);
|
|
6263
6411
|
const { comment } = metadataInfo;
|
|
6264
6412
|
const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
|
|
6265
|
-
zipWriter.
|
|
6413
|
+
zipWriter.fileEntries.set(name, UNDEFINED_VALUE);
|
|
6266
6414
|
let fileEntry;
|
|
6267
6415
|
try {
|
|
6268
6416
|
const { resolvedOptions } = metadataInfo;
|
|
6269
6417
|
if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
|
|
6270
|
-
!resolvedOptions.passThrough && !(await supportsDeflate(
|
|
6418
|
+
!resolvedOptions.passThrough && !(await supportsDeflate(getConfiguration()))) {
|
|
6271
6419
|
resolvedOptions.level = 0;
|
|
6272
6420
|
}
|
|
6273
6421
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
@@ -6285,7 +6433,7 @@
|
|
|
6285
6433
|
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
6286
6434
|
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
6287
6435
|
} catch (error) {
|
|
6288
|
-
zipWriter.
|
|
6436
|
+
zipWriter.fileEntries.delete(name);
|
|
6289
6437
|
throw error;
|
|
6290
6438
|
}
|
|
6291
6439
|
Object.assign(fileEntry, {
|
|
@@ -6329,9 +6477,9 @@
|
|
|
6329
6477
|
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
6330
6478
|
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
|
|
6331
6479
|
}
|
|
6332
|
-
let msdosAttributesRaw =
|
|
6480
|
+
let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
6333
6481
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
6334
|
-
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType;
|
|
6482
|
+
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType || executable;
|
|
6335
6483
|
const hasMsDosProvided = msdosAttributesRaw !== UNDEFINED_VALUE || msdosAttributes !== UNDEFINED_VALUE;
|
|
6336
6484
|
if (hasUnixMetadata) {
|
|
6337
6485
|
msDosCompatible = false;
|
|
@@ -6340,10 +6488,10 @@
|
|
|
6340
6488
|
msDosCompatible = true;
|
|
6341
6489
|
versionMadeBy = (versionMadeBy & MAX_8_BITS);
|
|
6342
6490
|
}
|
|
6343
|
-
if (msdosAttributesRaw !== UNDEFINED_VALUE && (msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
|
|
6491
|
+
if (msdosAttributesRaw !== UNDEFINED_VALUE && (!Number.isInteger(msdosAttributesRaw) || msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
|
|
6344
6492
|
throw new Error(ERR_INVALID_MSDOS_ATTRIBUTES);
|
|
6345
6493
|
}
|
|
6346
|
-
if (msdosAttributes && typeof msdosAttributes !== OBJECT_TYPE) {
|
|
6494
|
+
if (msdosAttributes && (typeof msdosAttributes !== OBJECT_TYPE || Array.isArray(msdosAttributes))) {
|
|
6347
6495
|
throw new Error(ERR_INVALID_MSDOS_DATA);
|
|
6348
6496
|
}
|
|
6349
6497
|
if (versionMadeBy > MAX_16_BITS) {
|
|
@@ -6431,7 +6579,7 @@
|
|
|
6431
6579
|
}
|
|
6432
6580
|
|
|
6433
6581
|
function resolveMetadata(zipWriter, name, options) {
|
|
6434
|
-
const encode =
|
|
6582
|
+
const encode = getFunctionOptionValue(zipWriter, options, OPTION_ENCODE_TEXT) || encodeText;
|
|
6435
6583
|
let rawFilename = encode(name, TEXT_TYPE_FILENAME);
|
|
6436
6584
|
if (rawFilename === UNDEFINED_VALUE) {
|
|
6437
6585
|
rawFilename = encodeText(name);
|
|
@@ -6440,6 +6588,10 @@
|
|
|
6440
6588
|
throw new Error(ERR_INVALID_ENTRY_NAME);
|
|
6441
6589
|
}
|
|
6442
6590
|
const comment = options[PROPERTY_NAME_COMMENT] || "";
|
|
6591
|
+
// deno-lint-ignore valid-typeof
|
|
6592
|
+
if (typeof comment != STRING_TYPE) {
|
|
6593
|
+
throw new Error(ERR_INVALID_ENTRY_COMMENT_TYPE);
|
|
6594
|
+
}
|
|
6443
6595
|
let rawComment = encode(comment, TEXT_TYPE_COMMENT);
|
|
6444
6596
|
if (rawComment === UNDEFINED_VALUE) {
|
|
6445
6597
|
rawComment = encodeText(comment);
|
|
@@ -6451,16 +6603,14 @@
|
|
|
6451
6603
|
if (version > MAX_16_BITS) {
|
|
6452
6604
|
throw new Error(ERR_INVALID_VERSION);
|
|
6453
6605
|
}
|
|
6454
|
-
const lastModDate =
|
|
6455
|
-
const lastAccessDate =
|
|
6456
|
-
const creationDate =
|
|
6606
|
+
const lastModDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE, new Date());
|
|
6607
|
+
const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
|
|
6608
|
+
const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
|
|
6457
6609
|
const internalFileAttributes = getAliasedOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, PROPERTY_NAME_DEPRECATED_INTERNAL_FILE_ATTRIBUTES, 0);
|
|
6458
6610
|
const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
|
|
6459
6611
|
const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6460
6612
|
const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6461
|
-
|
|
6462
|
-
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
6463
|
-
}
|
|
6613
|
+
checkPasswordOption(password, rawPassword);
|
|
6464
6614
|
const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
|
|
6465
6615
|
const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
|
|
6466
6616
|
const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
|
|
@@ -6469,9 +6619,9 @@
|
|
|
6469
6619
|
const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
|
|
6470
6620
|
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
|
|
6471
6621
|
const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
|
|
6472
|
-
const createTempStream =
|
|
6622
|
+
const createTempStream = getFunctionOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
6473
6623
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
6474
|
-
const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
|
|
6624
|
+
const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
|
|
6475
6625
|
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
|
|
6476
6626
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
6477
6627
|
const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
@@ -6491,6 +6641,9 @@
|
|
|
6491
6641
|
level = 0;
|
|
6492
6642
|
}
|
|
6493
6643
|
}
|
|
6644
|
+
if (passThrough) {
|
|
6645
|
+
level = UNDEFINED_VALUE;
|
|
6646
|
+
}
|
|
6494
6647
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
6495
6648
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
6496
6649
|
if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
|
|
@@ -6551,18 +6704,26 @@
|
|
|
6551
6704
|
if (!extraField) {
|
|
6552
6705
|
return EMPTY_UINT8_ARRAY;
|
|
6553
6706
|
}
|
|
6707
|
+
if (!(extraField instanceof Map)) {
|
|
6708
|
+
throw new Error(ERR_INVALID_EXTRAFIELD);
|
|
6709
|
+
}
|
|
6554
6710
|
let extraFieldSize = 0;
|
|
6555
6711
|
let offset = 0;
|
|
6556
|
-
extraField.forEach(data => extraFieldSize += 4 + getLength(data));
|
|
6557
|
-
const rawExtraField = new Uint8Array(extraFieldSize);
|
|
6558
|
-
const rawExtraFieldView = getDataView(rawExtraField);
|
|
6559
6712
|
extraField.forEach((data, type) => {
|
|
6560
|
-
if (type > MAX_16_BITS) {
|
|
6713
|
+
if (!Number.isInteger(type) || type < 0 || type > MAX_16_BITS) {
|
|
6561
6714
|
throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
|
|
6562
6715
|
}
|
|
6716
|
+
if (!(data instanceof Uint8Array)) {
|
|
6717
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA_TYPE);
|
|
6718
|
+
}
|
|
6563
6719
|
if (getLength(data) > MAX_16_BITS) {
|
|
6564
6720
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
6565
6721
|
}
|
|
6722
|
+
extraFieldSize += 4 + getLength(data);
|
|
6723
|
+
});
|
|
6724
|
+
const rawExtraField = new Uint8Array(extraFieldSize);
|
|
6725
|
+
const rawExtraFieldView = getDataView(rawExtraField);
|
|
6726
|
+
extraField.forEach((data, type) => {
|
|
6566
6727
|
setUint16(rawExtraFieldView, offset, type);
|
|
6567
6728
|
setUint16(rawExtraFieldView, offset + 2, getLength(data));
|
|
6568
6729
|
arraySet(rawExtraField, data, offset + 4);
|
|
@@ -6594,6 +6755,9 @@
|
|
|
6594
6755
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
6595
6756
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
6596
6757
|
}
|
|
6758
|
+
if (compressionMethod === UNDEFINED_VALUE) {
|
|
6759
|
+
throw new Error(ERR_UNDEFINED_COMPRESSION_METHOD);
|
|
6760
|
+
}
|
|
6597
6761
|
}
|
|
6598
6762
|
const zip64Enabled = zip64 === true;
|
|
6599
6763
|
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
@@ -6650,7 +6814,7 @@
|
|
|
6650
6814
|
|
|
6651
6815
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
6652
6816
|
const {
|
|
6653
|
-
|
|
6817
|
+
fileEntries,
|
|
6654
6818
|
writer
|
|
6655
6819
|
} = zipWriter;
|
|
6656
6820
|
const {
|
|
@@ -6672,12 +6836,12 @@
|
|
|
6672
6836
|
let writerSizeBeforeEntry;
|
|
6673
6837
|
let flushedBufferedSize = 0;
|
|
6674
6838
|
let fileWriter;
|
|
6675
|
-
|
|
6839
|
+
fileEntries.set(name, fileEntry);
|
|
6676
6840
|
zipWriter.lastFileEntry = fileEntry;
|
|
6677
6841
|
try {
|
|
6678
6842
|
let lockPreviousFileEntry;
|
|
6679
6843
|
if (keepOrder) {
|
|
6680
|
-
lockPreviousFileEntry = previousFileEntry && previousFileEntry.
|
|
6844
|
+
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
|
|
6681
6845
|
requestLockCurrentFileEntry();
|
|
6682
6846
|
}
|
|
6683
6847
|
if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
|
|
@@ -6698,11 +6862,8 @@
|
|
|
6698
6862
|
const diskOffset = getDiskOffset(writer);
|
|
6699
6863
|
if (zipWriter.addSplitZipSignature) {
|
|
6700
6864
|
delete zipWriter.addSplitZipSignature;
|
|
6701
|
-
|
|
6702
|
-
|
|
6703
|
-
setUint32(signatureArrayView, 0, SPLIT_ZIP_FILE_SIGNATURE);
|
|
6704
|
-
await writeData(writer, signatureArray);
|
|
6705
|
-
zipWriter.offset += 4;
|
|
6865
|
+
await writeData(writer, getSplitZipSignatureArray());
|
|
6866
|
+
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6706
6867
|
}
|
|
6707
6868
|
if (usdz && !bufferedWrite) {
|
|
6708
6869
|
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
|
|
@@ -6720,11 +6881,11 @@
|
|
|
6720
6881
|
writerSizeBeforeEntry = writer.size;
|
|
6721
6882
|
await writeData(fileWriter, localHeaderArray);
|
|
6722
6883
|
}
|
|
6723
|
-
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo,
|
|
6884
|
+
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, getConfiguration(), options);
|
|
6724
6885
|
if (!bufferedWrite) {
|
|
6725
6886
|
writingEntryData = false;
|
|
6726
6887
|
}
|
|
6727
|
-
|
|
6888
|
+
fileEntries.set(name, fileEntry);
|
|
6728
6889
|
fileEntry.filename = name;
|
|
6729
6890
|
if (bufferedWrite) {
|
|
6730
6891
|
await Promise.all([fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
|
|
@@ -6765,7 +6926,7 @@
|
|
|
6765
6926
|
zipWriter.offset += flushedBufferedSize;
|
|
6766
6927
|
}
|
|
6767
6928
|
}
|
|
6768
|
-
|
|
6929
|
+
fileEntries.delete(name);
|
|
6769
6930
|
throw error;
|
|
6770
6931
|
} finally {
|
|
6771
6932
|
if (bufferedWrite) {
|
|
@@ -6787,7 +6948,7 @@
|
|
|
6787
6948
|
}
|
|
6788
6949
|
|
|
6789
6950
|
function requestLockCurrentFileEntry() {
|
|
6790
|
-
fileEntry.
|
|
6951
|
+
fileEntry.lockFileEntry = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
|
|
6791
6952
|
}
|
|
6792
6953
|
|
|
6793
6954
|
async function requestLockWriter() {
|
|
@@ -6807,7 +6968,7 @@
|
|
|
6807
6968
|
}
|
|
6808
6969
|
}
|
|
6809
6970
|
|
|
6810
|
-
async function createFileEntry(reader, writer, { diskNumberStart,
|
|
6971
|
+
async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry }, entryInfo, config, options) {
|
|
6811
6972
|
const {
|
|
6812
6973
|
headerInfo,
|
|
6813
6974
|
dataDescriptorInfo,
|
|
@@ -6875,7 +7036,7 @@
|
|
|
6875
7036
|
codecURI
|
|
6876
7037
|
} = options;
|
|
6877
7038
|
const fileEntry = {
|
|
6878
|
-
|
|
7039
|
+
lockFileEntry,
|
|
6879
7040
|
versionMadeBy,
|
|
6880
7041
|
zip64,
|
|
6881
7042
|
directory: Boolean(directory),
|
|
@@ -6917,7 +7078,7 @@
|
|
|
6917
7078
|
}
|
|
6918
7079
|
const { writable } = writer;
|
|
6919
7080
|
if (reader) {
|
|
6920
|
-
const readable = toCompatibleReadable(
|
|
7081
|
+
const readable = toCompatibleReadable(createReadable(reader));
|
|
6921
7082
|
const size = reader.size;
|
|
6922
7083
|
const workerOptions = {
|
|
6923
7084
|
options: {
|
|
@@ -7029,14 +7190,14 @@
|
|
|
7029
7190
|
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
7030
7191
|
const length = 4 + 16;
|
|
7031
7192
|
const extraFieldZip64 = createRecordWriter(length);
|
|
7032
|
-
extraFieldZip64.
|
|
7033
|
-
extraFieldZip64.
|
|
7193
|
+
extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
|
|
7194
|
+
extraFieldZip64.writeUint16(length - 4);
|
|
7034
7195
|
rawLocalExtraFieldZip64 = extraFieldZip64.array;
|
|
7035
7196
|
if (zip64ExtraFieldComplete) {
|
|
7036
|
-
extraFieldZip64.
|
|
7197
|
+
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7037
7198
|
if (uncompressedFile) {
|
|
7038
7199
|
const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
7039
|
-
extraFieldZip64.
|
|
7200
|
+
extraFieldZip64.writeUint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
|
|
7040
7201
|
}
|
|
7041
7202
|
}
|
|
7042
7203
|
} else {
|
|
@@ -7045,8 +7206,8 @@
|
|
|
7045
7206
|
let rawExtraFieldAES;
|
|
7046
7207
|
if (encrypted && !zipCrypto) {
|
|
7047
7208
|
const extraFieldAES = createRecordWriter(getLength(EXTRAFIELD_DATA_AES) + 2);
|
|
7048
|
-
extraFieldAES.
|
|
7049
|
-
extraFieldAES.
|
|
7209
|
+
extraFieldAES.writeUint16(EXTRAFIELD_TYPE_AES);
|
|
7210
|
+
extraFieldAES.writeBytes(EXTRAFIELD_DATA_AES);
|
|
7050
7211
|
rawExtraFieldAES = extraFieldAES.array;
|
|
7051
7212
|
rawExtraFieldAES[8] = encryptionStrength;
|
|
7052
7213
|
} else {
|
|
@@ -7062,15 +7223,15 @@
|
|
|
7062
7223
|
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
7063
7224
|
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
7064
7225
|
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
7065
|
-
extraFieldTimestamp.
|
|
7066
|
-
extraFieldTimestamp.
|
|
7067
|
-
extraFieldTimestamp.
|
|
7068
|
-
extraFieldTimestamp.
|
|
7226
|
+
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7227
|
+
extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
|
|
7228
|
+
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7229
|
+
extraFieldTimestamp.writeUint32(lastModTimeUnix);
|
|
7069
7230
|
if (lastAccessDate) {
|
|
7070
|
-
extraFieldTimestamp.
|
|
7231
|
+
extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(lastAccessDate)));
|
|
7071
7232
|
}
|
|
7072
7233
|
if (creationDate) {
|
|
7073
|
-
extraFieldTimestamp.
|
|
7234
|
+
extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(creationDate)));
|
|
7074
7235
|
}
|
|
7075
7236
|
rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
|
|
7076
7237
|
} else {
|
|
@@ -7083,14 +7244,14 @@
|
|
|
7083
7244
|
try {
|
|
7084
7245
|
const lastModTimeNTFS = getTimeNTFS(lastModDate);
|
|
7085
7246
|
const extraFieldNTFS = createRecordWriter(36);
|
|
7086
|
-
extraFieldNTFS.
|
|
7087
|
-
extraFieldNTFS.
|
|
7247
|
+
extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS);
|
|
7248
|
+
extraFieldNTFS.writeUint16(32);
|
|
7088
7249
|
extraFieldNTFS.skip(4);
|
|
7089
|
-
extraFieldNTFS.
|
|
7090
|
-
extraFieldNTFS.
|
|
7091
|
-
extraFieldNTFS.
|
|
7092
|
-
extraFieldNTFS.
|
|
7093
|
-
extraFieldNTFS.
|
|
7250
|
+
extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS_TAG1);
|
|
7251
|
+
extraFieldNTFS.writeUint16(24);
|
|
7252
|
+
extraFieldNTFS.writeUint64(lastModTimeNTFS);
|
|
7253
|
+
extraFieldNTFS.writeUint64(lastAccessDate ? getTimeNTFS(lastAccessDate) : lastModTimeNTFS);
|
|
7254
|
+
extraFieldNTFS.writeUint64(creationDate ? getTimeNTFS(creationDate) : lastModTimeNTFS);
|
|
7094
7255
|
rawExtraFieldNTFS = extraFieldNTFS.array;
|
|
7095
7256
|
} catch {
|
|
7096
7257
|
rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
|
|
@@ -7109,20 +7270,20 @@
|
|
|
7109
7270
|
const gidBytes = packUnixId(gid);
|
|
7110
7271
|
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
7111
7272
|
const extraFieldUnix = createRecordWriter(4 + payloadLength);
|
|
7112
|
-
extraFieldUnix.
|
|
7113
|
-
extraFieldUnix.
|
|
7114
|
-
extraFieldUnix.
|
|
7115
|
-
extraFieldUnix.
|
|
7116
|
-
extraFieldUnix.
|
|
7117
|
-
extraFieldUnix.
|
|
7118
|
-
extraFieldUnix.
|
|
7273
|
+
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_INFOZIP);
|
|
7274
|
+
extraFieldUnix.writeUint16(payloadLength);
|
|
7275
|
+
extraFieldUnix.writeUint8(1);
|
|
7276
|
+
extraFieldUnix.writeUint8(uidBytes.length);
|
|
7277
|
+
extraFieldUnix.writeBytes(uidBytes);
|
|
7278
|
+
extraFieldUnix.writeUint8(gidBytes.length);
|
|
7279
|
+
extraFieldUnix.writeBytes(gidBytes);
|
|
7119
7280
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
7120
7281
|
} else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
7121
7282
|
const extraFieldUnix = createRecordWriter(8);
|
|
7122
|
-
extraFieldUnix.
|
|
7123
|
-
extraFieldUnix.
|
|
7124
|
-
extraFieldUnix.
|
|
7125
|
-
extraFieldUnix.
|
|
7283
|
+
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
|
|
7284
|
+
extraFieldUnix.writeUint16(4);
|
|
7285
|
+
extraFieldUnix.writeUint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
|
|
7286
|
+
extraFieldUnix.writeUint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
|
|
7126
7287
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
7127
7288
|
} else {
|
|
7128
7289
|
rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
|
|
@@ -7172,18 +7333,18 @@
|
|
|
7172
7333
|
const localHeader = createRecordWriter(HEADER_SIZE + getLength(rawFilename) + extraFieldLength);
|
|
7173
7334
|
const localHeaderArray = localHeader.array;
|
|
7174
7335
|
const localHeaderView = getDataView(localHeaderArray);
|
|
7175
|
-
localHeader.
|
|
7176
|
-
localHeader.
|
|
7177
|
-
localHeader.
|
|
7336
|
+
localHeader.writeUint32(LOCAL_FILE_HEADER_SIGNATURE);
|
|
7337
|
+
localHeader.writeBytes(headerArray);
|
|
7338
|
+
localHeader.writeBytes(rawFilename);
|
|
7178
7339
|
if (writeLocalExtraFieldZip64) {
|
|
7179
|
-
localHeader.
|
|
7180
|
-
}
|
|
7181
|
-
localHeader.
|
|
7182
|
-
localHeader.
|
|
7183
|
-
localHeader.
|
|
7184
|
-
localHeader.
|
|
7185
|
-
localHeader.
|
|
7186
|
-
localHeader.
|
|
7340
|
+
localHeader.writeBytes(rawLocalExtraFieldZip64);
|
|
7341
|
+
}
|
|
7342
|
+
localHeader.writeBytes(rawExtraFieldAES);
|
|
7343
|
+
localHeader.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
7344
|
+
localHeader.writeBytes(rawExtraFieldNTFS);
|
|
7345
|
+
localHeader.writeBytes(rawExtraFieldUnix);
|
|
7346
|
+
localHeader.writeBytes(rawExtraField);
|
|
7347
|
+
localHeader.writeBytes(rawLocalExtraField);
|
|
7187
7348
|
if (dataDescriptor) {
|
|
7188
7349
|
if (!zip64CompressedSize) {
|
|
7189
7350
|
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
@@ -7373,7 +7534,7 @@
|
|
|
7373
7534
|
|
|
7374
7535
|
|
|
7375
7536
|
async function closeFile(zipWriter, comment, options) {
|
|
7376
|
-
const directoryDataLength = createDirectoryRecords(zipWriter.
|
|
7537
|
+
const directoryDataLength = createDirectoryRecords(zipWriter.fileEntries);
|
|
7377
7538
|
const { directoryStart, directoryArray } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
|
|
7378
7539
|
const signatureLength = await writeDigitalSignatureRecord(zipWriter, directoryArray, options);
|
|
7379
7540
|
await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength, signatureLength });
|
|
@@ -7403,19 +7564,19 @@
|
|
|
7403
7564
|
if (zip64Offset || zip64DiskNumberStart || zip64UncompressedSize || zip64CompressedSize) {
|
|
7404
7565
|
const length = 4 + (zip64UncompressedSize ? 8 : 0) + (zip64CompressedSize ? 8 : 0) + (zip64Offset ? 8 : 0) + (zip64DiskNumberStart ? 4 : 0);
|
|
7405
7566
|
const extraFieldZip64 = createRecordWriter(length);
|
|
7406
|
-
extraFieldZip64.
|
|
7407
|
-
extraFieldZip64.
|
|
7567
|
+
extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
|
|
7568
|
+
extraFieldZip64.writeUint16(length - 4);
|
|
7408
7569
|
if (zip64UncompressedSize) {
|
|
7409
|
-
extraFieldZip64.
|
|
7570
|
+
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7410
7571
|
}
|
|
7411
7572
|
if (zip64CompressedSize) {
|
|
7412
|
-
extraFieldZip64.
|
|
7573
|
+
extraFieldZip64.writeUint64(compressedSize);
|
|
7413
7574
|
}
|
|
7414
7575
|
if (zip64Offset) {
|
|
7415
|
-
extraFieldZip64.
|
|
7576
|
+
extraFieldZip64.writeUint64(fileEntry.offset);
|
|
7416
7577
|
}
|
|
7417
7578
|
if (zip64DiskNumberStart) {
|
|
7418
|
-
extraFieldZip64.
|
|
7579
|
+
extraFieldZip64.writeUint32(fileEntry.diskNumberStart);
|
|
7419
7580
|
}
|
|
7420
7581
|
rawExtraFieldZip64 = extraFieldZip64.array;
|
|
7421
7582
|
} else {
|
|
@@ -7428,10 +7589,10 @@
|
|
|
7428
7589
|
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
7429
7590
|
if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
|
|
7430
7591
|
const extraFieldTimestamp = createRecordWriter(9);
|
|
7431
|
-
extraFieldTimestamp.
|
|
7432
|
-
extraFieldTimestamp.
|
|
7433
|
-
extraFieldTimestamp.
|
|
7434
|
-
extraFieldTimestamp.
|
|
7592
|
+
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7593
|
+
extraFieldTimestamp.writeUint16(5);
|
|
7594
|
+
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7595
|
+
extraFieldTimestamp.writeUint32(lastModTimeUnix);
|
|
7435
7596
|
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
7436
7597
|
} else {
|
|
7437
7598
|
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
@@ -7453,14 +7614,14 @@
|
|
|
7453
7614
|
}
|
|
7454
7615
|
|
|
7455
7616
|
async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
7456
|
-
const {
|
|
7617
|
+
const { fileEntries, writer } = zipWriter;
|
|
7457
7618
|
const directoryArray = new Uint8Array(directoryDataLength);
|
|
7458
7619
|
await initStream(writer);
|
|
7459
7620
|
let offset = 0;
|
|
7460
7621
|
let directoryDiskOffset = 0;
|
|
7461
7622
|
let directoryStartDiskNumber = getDiskNumber(writer);
|
|
7462
7623
|
let directoryStartDiskOffset = getDiskOffset(writer);
|
|
7463
|
-
for (const [indexFileEntry, fileEntry] of Array.from(
|
|
7624
|
+
for (const [indexFileEntry, fileEntry] of Array.from(fileEntries.values()).entries()) {
|
|
7464
7625
|
const {
|
|
7465
7626
|
offset: fileEntryOffset,
|
|
7466
7627
|
rawFilename,
|
|
@@ -7505,28 +7666,28 @@
|
|
|
7505
7666
|
setUint16(headerView, HEADER_OFFSET_VERSION, VERSION_ZIP64);
|
|
7506
7667
|
}
|
|
7507
7668
|
const directoryRecord = createRecordWriter(directoryRecordLength);
|
|
7508
|
-
directoryRecord.
|
|
7509
|
-
directoryRecord.
|
|
7510
|
-
directoryRecord.
|
|
7511
|
-
directoryRecord.
|
|
7512
|
-
directoryRecord.
|
|
7513
|
-
directoryRecord.
|
|
7514
|
-
directoryRecord.
|
|
7515
|
-
directoryRecord.
|
|
7516
|
-
directoryRecord.
|
|
7517
|
-
directoryRecord.
|
|
7518
|
-
directoryRecord.
|
|
7519
|
-
directoryRecord.
|
|
7520
|
-
directoryRecord.
|
|
7521
|
-
directoryRecord.
|
|
7522
|
-
directoryRecord.
|
|
7523
|
-
directoryRecord.
|
|
7524
|
-
directoryRecord.
|
|
7669
|
+
directoryRecord.writeUint32(CENTRAL_FILE_HEADER_SIGNATURE);
|
|
7670
|
+
directoryRecord.writeUint16(versionMadeBy);
|
|
7671
|
+
directoryRecord.writeBytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
|
|
7672
|
+
directoryRecord.writeUint16(extraFieldLength);
|
|
7673
|
+
directoryRecord.writeUint16(getLength(rawComment));
|
|
7674
|
+
directoryRecord.writeUint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
|
|
7675
|
+
directoryRecord.writeUint16(internalFileAttributes);
|
|
7676
|
+
directoryRecord.writeUint32(externalFileAttributes);
|
|
7677
|
+
directoryRecord.writeUint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
|
|
7678
|
+
directoryRecord.writeBytes(rawFilename);
|
|
7679
|
+
directoryRecord.writeBytes(rawExtraFieldZip64);
|
|
7680
|
+
directoryRecord.writeBytes(rawExtraFieldAES);
|
|
7681
|
+
directoryRecord.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
7682
|
+
directoryRecord.writeBytes(rawExtraFieldNTFS);
|
|
7683
|
+
directoryRecord.writeBytes(rawExtraFieldUnix);
|
|
7684
|
+
directoryRecord.writeBytes(rawExtraField);
|
|
7685
|
+
directoryRecord.writeBytes(rawComment);
|
|
7525
7686
|
arraySet(directoryArray, directoryRecord.array, offset);
|
|
7526
7687
|
offset += directoryRecordLength;
|
|
7527
7688
|
if (options.onprogress) {
|
|
7528
7689
|
try {
|
|
7529
|
-
await options.onprogress(indexFileEntry + 1,
|
|
7690
|
+
await options.onprogress(indexFileEntry + 1, fileEntries.size, new Entry(fileEntry));
|
|
7530
7691
|
} catch {
|
|
7531
7692
|
// ignored
|
|
7532
7693
|
}
|
|
@@ -7540,7 +7701,7 @@
|
|
|
7540
7701
|
}
|
|
7541
7702
|
|
|
7542
7703
|
async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
|
|
7543
|
-
const signCentralDirectory =
|
|
7704
|
+
const signCentralDirectory = getFunctionOptionValue(zipWriter, options, OPTION_SIGN_CENTRAL_DIRECTORY);
|
|
7544
7705
|
if (signCentralDirectory) {
|
|
7545
7706
|
const signatureData = await signCentralDirectory(directoryArray);
|
|
7546
7707
|
const signatureDataLength = getLength(signatureData);
|
|
@@ -7548,9 +7709,9 @@
|
|
|
7548
7709
|
throw new Error(ERR_INVALID_SIGNATURE_DATA);
|
|
7549
7710
|
}
|
|
7550
7711
|
const signatureRecord = createRecordWriter(6 + signatureDataLength);
|
|
7551
|
-
signatureRecord.
|
|
7552
|
-
signatureRecord.
|
|
7553
|
-
signatureRecord.
|
|
7712
|
+
signatureRecord.writeUint32(DIGITAL_SIGNATURE_RECORD_SIGNATURE);
|
|
7713
|
+
signatureRecord.writeUint16(signatureDataLength);
|
|
7714
|
+
signatureRecord.writeBytes(signatureData);
|
|
7554
7715
|
await writeData(zipWriter.writer, signatureRecord.array);
|
|
7555
7716
|
return 6 + signatureDataLength;
|
|
7556
7717
|
}
|
|
@@ -7561,7 +7722,7 @@
|
|
|
7561
7722
|
const { writer } = zipWriter;
|
|
7562
7723
|
const { directoryStart, signatureLength } = cdInfo;
|
|
7563
7724
|
let { directoryDataLength } = cdInfo;
|
|
7564
|
-
let
|
|
7725
|
+
let fileEntriesLength = zipWriter.fileEntries.size;
|
|
7565
7726
|
let diskNumber = directoryStart.diskNumber;
|
|
7566
7727
|
let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
|
|
7567
7728
|
let lastDiskNumber = getDiskNumber(writer);
|
|
@@ -7569,7 +7730,7 @@
|
|
|
7569
7730
|
lastDiskNumber++;
|
|
7570
7731
|
}
|
|
7571
7732
|
let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
7572
|
-
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS ||
|
|
7733
|
+
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || fileEntriesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
|
|
7573
7734
|
if (zip64 === false) {
|
|
7574
7735
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
7575
7736
|
} else {
|
|
@@ -7586,37 +7747,37 @@
|
|
|
7586
7747
|
}
|
|
7587
7748
|
lastDiskNumber = getDiskNumber(writer);
|
|
7588
7749
|
if (zip64) {
|
|
7589
|
-
endOfdirectoryRecord.
|
|
7590
|
-
endOfdirectoryRecord.
|
|
7591
|
-
endOfdirectoryRecord.
|
|
7592
|
-
endOfdirectoryRecord.
|
|
7593
|
-
endOfdirectoryRecord.
|
|
7594
|
-
endOfdirectoryRecord.
|
|
7595
|
-
endOfdirectoryRecord.
|
|
7596
|
-
endOfdirectoryRecord.
|
|
7597
|
-
endOfdirectoryRecord.
|
|
7598
|
-
endOfdirectoryRecord.
|
|
7599
|
-
endOfdirectoryRecord.
|
|
7600
|
-
endOfdirectoryRecord.
|
|
7601
|
-
endOfdirectoryRecord.
|
|
7602
|
-
endOfdirectoryRecord.
|
|
7750
|
+
endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
|
|
7751
|
+
endOfdirectoryRecord.writeUint64(44);
|
|
7752
|
+
endOfdirectoryRecord.writeUint16(45);
|
|
7753
|
+
endOfdirectoryRecord.writeUint16(45);
|
|
7754
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber);
|
|
7755
|
+
endOfdirectoryRecord.writeUint32(diskNumber);
|
|
7756
|
+
endOfdirectoryRecord.writeUint64(fileEntriesLength);
|
|
7757
|
+
endOfdirectoryRecord.writeUint64(fileEntriesLength);
|
|
7758
|
+
endOfdirectoryRecord.writeUint64(directoryDataLength);
|
|
7759
|
+
endOfdirectoryRecord.writeUint64(directoryOffset);
|
|
7760
|
+
endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
|
|
7761
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber);
|
|
7762
|
+
endOfdirectoryRecord.writeUint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength) + BigInt(signatureLength));
|
|
7763
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber + 1);
|
|
7603
7764
|
const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
|
|
7604
7765
|
if (supportZip64SplitFile) {
|
|
7605
7766
|
lastDiskNumber = MAX_16_BITS;
|
|
7606
7767
|
diskNumber = MAX_16_BITS;
|
|
7607
7768
|
}
|
|
7608
|
-
|
|
7769
|
+
fileEntriesLength = MAX_16_BITS;
|
|
7609
7770
|
directoryOffset = MAX_32_BITS;
|
|
7610
7771
|
directoryDataLength = MAX_32_BITS;
|
|
7611
7772
|
}
|
|
7612
|
-
endOfdirectoryRecord.
|
|
7613
|
-
endOfdirectoryRecord.
|
|
7614
|
-
endOfdirectoryRecord.
|
|
7615
|
-
endOfdirectoryRecord.
|
|
7616
|
-
endOfdirectoryRecord.
|
|
7617
|
-
endOfdirectoryRecord.
|
|
7618
|
-
endOfdirectoryRecord.
|
|
7619
|
-
endOfdirectoryRecord.
|
|
7773
|
+
endOfdirectoryRecord.writeUint32(END_OF_CENTRAL_DIR_SIGNATURE);
|
|
7774
|
+
endOfdirectoryRecord.writeUint16(lastDiskNumber);
|
|
7775
|
+
endOfdirectoryRecord.writeUint16(diskNumber);
|
|
7776
|
+
endOfdirectoryRecord.writeUint16(fileEntriesLength);
|
|
7777
|
+
endOfdirectoryRecord.writeUint16(fileEntriesLength);
|
|
7778
|
+
endOfdirectoryRecord.writeUint32(directoryDataLength);
|
|
7779
|
+
endOfdirectoryRecord.writeUint32(directoryOffset);
|
|
7780
|
+
endOfdirectoryRecord.writeUint16(commentLength);
|
|
7620
7781
|
await writeData(writer, endOfdirectoryRecord.array);
|
|
7621
7782
|
if (commentLength) {
|
|
7622
7783
|
await writeData(writer, comment);
|
|
@@ -7629,11 +7790,11 @@
|
|
|
7629
7790
|
let offset = 0;
|
|
7630
7791
|
return {
|
|
7631
7792
|
array,
|
|
7632
|
-
|
|
7633
|
-
|
|
7634
|
-
|
|
7635
|
-
|
|
7636
|
-
|
|
7793
|
+
writeUint8: value => { setUint8(view, offset, value); offset += 1; },
|
|
7794
|
+
writeUint16: value => { setUint16(view, offset, value); offset += 2; },
|
|
7795
|
+
writeUint32: value => { setUint32(view, offset, value); offset += 4; },
|
|
7796
|
+
writeUint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
|
|
7797
|
+
writeBytes: value => { arraySet(array, value, offset); offset += getLength(value); },
|
|
7637
7798
|
skip: count => offset += count
|
|
7638
7799
|
};
|
|
7639
7800
|
}
|
|
@@ -7657,6 +7818,71 @@
|
|
|
7657
7818
|
return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
|
|
7658
7819
|
}
|
|
7659
7820
|
|
|
7821
|
+
async function startsWithSplitZipSignature(reader) {
|
|
7822
|
+
const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
7823
|
+
return getUint32(getDataView(signatureArray), 0) == SPLIT_ZIP_FILE_SIGNATURE;
|
|
7824
|
+
}
|
|
7825
|
+
|
|
7826
|
+
async function copyZipData(zipWriter, reader, entries, directoryOffset, splitZipSignatureLength) {
|
|
7827
|
+
const { writer } = zipWriter;
|
|
7828
|
+
const entryPositions = new Map();
|
|
7829
|
+
if (writer.closeDisk) {
|
|
7830
|
+
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
7831
|
+
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
7832
|
+
let copiedLength = 0;
|
|
7833
|
+
for (const entry of sortedEntries) {
|
|
7834
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
7835
|
+
await copyData(zipWriter, reader, copiedLength, sourceOffset - copiedLength);
|
|
7836
|
+
if (exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
7837
|
+
await writer.closeDisk();
|
|
7838
|
+
}
|
|
7839
|
+
entryPositions.set(entry, {
|
|
7840
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
7841
|
+
diskNumberStart: getDiskNumber(writer)
|
|
7842
|
+
});
|
|
7843
|
+
copiedLength = sourceOffset;
|
|
7844
|
+
}
|
|
7845
|
+
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
7846
|
+
} else {
|
|
7847
|
+
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
7848
|
+
entries.forEach(entry => entryPositions.set(entry, {
|
|
7849
|
+
offset: splitZipSignatureLength + getSourceOffset(reader, entry),
|
|
7850
|
+
diskNumberStart: 0
|
|
7851
|
+
}));
|
|
7852
|
+
}
|
|
7853
|
+
return entryPositions;
|
|
7854
|
+
}
|
|
7855
|
+
|
|
7856
|
+
async function copyData(zipWriter, reader, offset, size) {
|
|
7857
|
+
if (size > 0) {
|
|
7858
|
+
const { writer } = zipWriter;
|
|
7859
|
+
await createReadable(reader, { offset, size }).pipeTo(writer.writable, { preventClose: true, preventAbort: true });
|
|
7860
|
+
writer.size += size;
|
|
7861
|
+
zipWriter.offset += size;
|
|
7862
|
+
}
|
|
7863
|
+
}
|
|
7864
|
+
|
|
7865
|
+
async function getLocalHeaderLength(reader, offset) {
|
|
7866
|
+
const headerArray = await readUint8Array(reader, offset, HEADER_SIZE);
|
|
7867
|
+
if (getLength(headerArray) < HEADER_SIZE) {
|
|
7868
|
+
return HEADER_SIZE;
|
|
7869
|
+
}
|
|
7870
|
+
const headerView = getDataView(headerArray);
|
|
7871
|
+
return HEADER_SIZE +
|
|
7872
|
+
getUint16(headerView, HEADER_OFFSET_FILENAME_LENGTH + LOCAL_HEADER_COMMON_OFFSET) +
|
|
7873
|
+
getUint16(headerView, HEADER_OFFSET_EXTRAFIELD_LENGTH + LOCAL_HEADER_COMMON_OFFSET);
|
|
7874
|
+
}
|
|
7875
|
+
|
|
7876
|
+
function getSourceOffset(reader, { offset, diskNumberStart }) {
|
|
7877
|
+
return offset + (reader.getDiskOffset ? reader.getDiskOffset(diskNumberStart) : 0);
|
|
7878
|
+
}
|
|
7879
|
+
|
|
7880
|
+
function getSplitZipSignatureArray() {
|
|
7881
|
+
const signatureArray = new Uint8Array(SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
7882
|
+
setUint32(getDataView(signatureArray), 0, SPLIT_ZIP_FILE_SIGNATURE);
|
|
7883
|
+
return signatureArray;
|
|
7884
|
+
}
|
|
7885
|
+
|
|
7660
7886
|
async function writeData(writer, array) {
|
|
7661
7887
|
const { writable } = writer;
|
|
7662
7888
|
const streamWriter = writable.getWriter();
|
|
@@ -7708,6 +7934,21 @@
|
|
|
7708
7934
|
return result === UNDEFINED_VALUE ? defaultValue : result;
|
|
7709
7935
|
}
|
|
7710
7936
|
|
|
7937
|
+
function getDateOptionValue(zipWriter, options, name, defaultValue) {
|
|
7938
|
+
const date = getOptionValue(zipWriter, options, name, defaultValue);
|
|
7939
|
+
if (date === null) {
|
|
7940
|
+
return defaultValue;
|
|
7941
|
+
}
|
|
7942
|
+
if (date !== UNDEFINED_VALUE && (typeof date.getTime != FUNCTION_TYPE || Number.isNaN(date.getTime()))) {
|
|
7943
|
+
throw new Error(ERR_INVALID_DATE);
|
|
7944
|
+
}
|
|
7945
|
+
return date;
|
|
7946
|
+
}
|
|
7947
|
+
|
|
7948
|
+
function getFunctionOptionValue(zipWriter, options, name) {
|
|
7949
|
+
return checkFunctionOption(getOptionValue(zipWriter, options, name));
|
|
7950
|
+
}
|
|
7951
|
+
|
|
7711
7952
|
function getAliasedOptionValue(zipWriter, options, name, deprecatedName, defaultValue) {
|
|
7712
7953
|
const value = getAliasedValue(options, name, deprecatedName);
|
|
7713
7954
|
const result = value === UNDEFINED_VALUE ? getAliasedValue(zipWriter.options, name, deprecatedName) : value;
|
|
@@ -7722,9 +7963,6 @@
|
|
|
7722
7963
|
return toNumber(getOptionValue(zipWriter, options, name, defaultValue));
|
|
7723
7964
|
}
|
|
7724
7965
|
|
|
7725
|
-
function toNumber(value) {
|
|
7726
|
-
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
7727
|
-
}
|
|
7728
7966
|
|
|
7729
7967
|
function getMaximumCompressedSize(uncompressedSize) {
|
|
7730
7968
|
return uncompressedSize + (5 * (Math.floor(uncompressedSize / 16383) + 1));
|
|
@@ -7736,6 +7974,14 @@
|
|
|
7736
7974
|
: compressionMethod !== COMPRESSION_METHOD_STORE;
|
|
7737
7975
|
}
|
|
7738
7976
|
|
|
7977
|
+
function getUint16(view, offset) {
|
|
7978
|
+
return view.getUint16(offset, true);
|
|
7979
|
+
}
|
|
7980
|
+
|
|
7981
|
+
function getUint32(view, offset) {
|
|
7982
|
+
return view.getUint32(offset, true);
|
|
7983
|
+
}
|
|
7984
|
+
|
|
7739
7985
|
function setUint8(view, offset, value) {
|
|
7740
7986
|
view.setUint8(offset, value);
|
|
7741
7987
|
}
|
|
@@ -7779,9 +8025,9 @@
|
|
|
7779
8025
|
const headerRecord = createRecordWriter(HEADER_SIZE - 4);
|
|
7780
8026
|
const headerArray = headerRecord.array;
|
|
7781
8027
|
const headerView = getDataView(headerArray);
|
|
7782
|
-
headerRecord.
|
|
7783
|
-
headerRecord.
|
|
7784
|
-
headerRecord.
|
|
8028
|
+
headerRecord.writeUint16(version);
|
|
8029
|
+
headerRecord.writeUint16(bitFlag);
|
|
8030
|
+
headerRecord.writeUint16(compressionMethod);
|
|
7785
8031
|
if (rawLastModDate === UNDEFINED_VALUE) {
|
|
7786
8032
|
const dateArray = new Uint32Array(1);
|
|
7787
8033
|
const dateView = getDataView(dateArray);
|
|
@@ -7789,20 +8035,20 @@
|
|
|
7789
8035
|
setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
|
|
7790
8036
|
rawLastModDate = dateArray[0];
|
|
7791
8037
|
}
|
|
7792
|
-
headerRecord.
|
|
8038
|
+
headerRecord.writeUint32(rawLastModDate);
|
|
7793
8039
|
headerRecord.skip(4);
|
|
7794
8040
|
if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
|
|
7795
|
-
headerRecord.
|
|
8041
|
+
headerRecord.writeUint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
|
|
7796
8042
|
} else {
|
|
7797
8043
|
headerRecord.skip(4);
|
|
7798
8044
|
}
|
|
7799
8045
|
if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
|
|
7800
|
-
headerRecord.
|
|
8046
|
+
headerRecord.writeUint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
|
|
7801
8047
|
} else {
|
|
7802
8048
|
headerRecord.skip(4);
|
|
7803
8049
|
}
|
|
7804
|
-
headerRecord.
|
|
7805
|
-
headerRecord.
|
|
8050
|
+
headerRecord.writeUint16(getLength(rawFilename));
|
|
8051
|
+
headerRecord.writeUint16(extraFieldLength);
|
|
7806
8052
|
return {
|
|
7807
8053
|
headerArray,
|
|
7808
8054
|
headerView,
|
|
@@ -8315,7 +8561,7 @@
|
|
|
8315
8561
|
// ignored
|
|
8316
8562
|
}
|
|
8317
8563
|
|
|
8318
|
-
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 {l: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{l: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)});}
|
|
8564
|
+
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;n<=15;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 {l: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(;f+2<s;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(;o<n;)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;c<n;c++)a[y++]=b();}function j(z,t){let u=q(z);for(;256!=u;){if(u<256)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;n<r;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;n<s;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(n<16)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{l:c,symbols:s}=n;let f=0,z=0,t=0;for(let n=1;n<=15;n++){f|=w(1);const u=c[n];if(f-z<u)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(;c<n;)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;f<c;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)});}
|
|
8319
8565
|
|
|
8320
8566
|
/*
|
|
8321
8567
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -8759,6 +9005,7 @@
|
|
|
8759
9005
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
8760
9006
|
exports.ERR_ENCRYPTED = ERR_ENCRYPTED;
|
|
8761
9007
|
exports.ERR_ENCRYPTED_CENTRAL_DIRECTORY = ERR_ENCRYPTED_CENTRAL_DIRECTORY;
|
|
9008
|
+
exports.ERR_ENTRY_DATA_OUT_OF_BOUNDS = ERR_ENTRY_DATA_OUT_OF_BOUNDS;
|
|
8762
9009
|
exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
|
|
8763
9010
|
exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
|
|
8764
9011
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
@@ -8771,19 +9018,26 @@
|
|
|
8771
9018
|
exports.ERR_INVALID_COMMENT_TYPE = ERR_INVALID_COMMENT_TYPE;
|
|
8772
9019
|
exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
|
|
8773
9020
|
exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
|
|
9021
|
+
exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
|
|
8774
9022
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
8775
9023
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
9024
|
+
exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
|
|
8776
9025
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
9026
|
+
exports.ERR_INVALID_EXTRAFIELD = ERR_INVALID_EXTRAFIELD;
|
|
8777
9027
|
exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
|
|
9028
|
+
exports.ERR_INVALID_EXTRAFIELD_DATA_TYPE = ERR_INVALID_EXTRAFIELD_DATA_TYPE;
|
|
8778
9029
|
exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
|
|
8779
9030
|
exports.ERR_INVALID_FILENAME_VALIDATION = ERR_INVALID_FILENAME_VALIDATION;
|
|
9031
|
+
exports.ERR_INVALID_FUNCTION_OPTION = ERR_INVALID_FUNCTION_OPTION;
|
|
8780
9032
|
exports.ERR_INVALID_GID = ERR_INVALID_GID;
|
|
8781
9033
|
exports.ERR_INVALID_LEVEL = ERR_INVALID_LEVEL;
|
|
8782
9034
|
exports.ERR_INVALID_MAX_APPENDED_DATA_SIZE = ERR_INVALID_MAX_APPENDED_DATA_SIZE;
|
|
9035
|
+
exports.ERR_INVALID_MAX_WORKERS = ERR_INVALID_MAX_WORKERS;
|
|
8783
9036
|
exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
|
|
8784
9037
|
exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
|
|
8785
9038
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
8786
9039
|
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
9040
|
+
exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
|
|
8787
9041
|
exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
|
|
8788
9042
|
exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
|
|
8789
9043
|
exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
|
|
@@ -8798,6 +9052,7 @@
|
|
|
8798
9052
|
exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
8799
9053
|
exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
8800
9054
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
9055
|
+
exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
|
|
8801
9056
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
8802
9057
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
8803
9058
|
exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
|