@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-fs.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
|
|
|
@@ -3586,7 +3824,7 @@
|
|
|
3586
3824
|
class TextWriter extends BlobWriter {
|
|
3587
3825
|
|
|
3588
3826
|
constructor(encoding) {
|
|
3589
|
-
super(
|
|
3827
|
+
super();
|
|
3590
3828
|
Object.assign(this, {
|
|
3591
3829
|
encoding,
|
|
3592
3830
|
utf8: !encoding || encoding.toLowerCase() == "utf-8"
|
|
@@ -3602,14 +3840,7 @@
|
|
|
3602
3840
|
if (blob.text && utf8) {
|
|
3603
3841
|
return blob.text();
|
|
3604
3842
|
} else {
|
|
3605
|
-
|
|
3606
|
-
return new Promise((resolve, reject) => {
|
|
3607
|
-
Object.assign(reader, {
|
|
3608
|
-
onload: ({ target }) => resolve(target.result),
|
|
3609
|
-
onerror: () => reject(reader.error)
|
|
3610
|
-
});
|
|
3611
|
-
reader.readAsText(blob, encoding);
|
|
3612
|
-
});
|
|
3843
|
+
return decodeTextRemovingBOM(new Uint8Array(await blob.arrayBuffer()), encoding);
|
|
3613
3844
|
}
|
|
3614
3845
|
}
|
|
3615
3846
|
}
|
|
@@ -4277,85 +4508,13 @@
|
|
|
4277
4508
|
return reader.readUint8Array(offset, size);
|
|
4278
4509
|
}
|
|
4279
4510
|
|
|
4280
|
-
|
|
4281
|
-
|
|
4282
|
-
|
|
4283
|
-
|
|
4284
|
-
|
|
4285
|
-
|
|
4286
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4287
|
-
this list of conditions and the following disclaimer.
|
|
4288
|
-
|
|
4289
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4290
|
-
notice, this list of conditions and the following disclaimer in
|
|
4291
|
-
the documentation and/or other materials provided with the distribution.
|
|
4292
|
-
|
|
4293
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4294
|
-
derived from this software without specific prior written permission.
|
|
4295
|
-
|
|
4296
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4297
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4298
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4299
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4300
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4301
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4302
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4303
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4304
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4305
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4306
|
-
*/
|
|
4307
|
-
|
|
4308
|
-
/* global TextDecoder */
|
|
4309
|
-
|
|
4310
|
-
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
4311
|
-
const VALID_CP437 = CP437.length == 256;
|
|
4312
|
-
|
|
4313
|
-
function decodeCP437(stringValue) {
|
|
4314
|
-
if (VALID_CP437) {
|
|
4315
|
-
let result = "";
|
|
4316
|
-
for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
|
|
4317
|
-
result += CP437[stringValue[indexCharacter]];
|
|
4318
|
-
}
|
|
4319
|
-
return result;
|
|
4320
|
-
} else {
|
|
4321
|
-
return new TextDecoder().decode(stringValue);
|
|
4322
|
-
}
|
|
4323
|
-
}
|
|
4324
|
-
|
|
4325
|
-
/*
|
|
4326
|
-
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
4327
|
-
|
|
4328
|
-
Redistribution and use in source and binary forms, with or without
|
|
4329
|
-
modification, are permitted provided that the following conditions are met:
|
|
4330
|
-
|
|
4331
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4332
|
-
this list of conditions and the following disclaimer.
|
|
4333
|
-
|
|
4334
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4335
|
-
notice, this list of conditions and the following disclaimer in
|
|
4336
|
-
the documentation and/or other materials provided with the distribution.
|
|
4337
|
-
|
|
4338
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4339
|
-
derived from this software without specific prior written permission.
|
|
4340
|
-
|
|
4341
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4342
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4343
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4344
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4345
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4346
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4347
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4348
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4349
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4350
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4351
|
-
*/
|
|
4352
|
-
|
|
4353
|
-
|
|
4354
|
-
function decodeText(value, encoding) {
|
|
4355
|
-
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
4356
|
-
return decodeCP437(value);
|
|
4511
|
+
function createReadable(reader, options) {
|
|
4512
|
+
if (reader.createReadable) {
|
|
4513
|
+
return reader.createReadable(options);
|
|
4514
|
+
} else if (reader.readUint8Array) {
|
|
4515
|
+
return Reader.prototype.createReadable.call(reader, options);
|
|
4357
4516
|
} else {
|
|
4358
|
-
return
|
|
4517
|
+
return reader.readable;
|
|
4359
4518
|
}
|
|
4360
4519
|
}
|
|
4361
4520
|
|
|
@@ -4515,83 +4674,6 @@
|
|
|
4515
4674
|
|
|
4516
4675
|
}
|
|
4517
4676
|
|
|
4518
|
-
/*
|
|
4519
|
-
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
4520
|
-
|
|
4521
|
-
Redistribution and use in source and binary forms, with or without
|
|
4522
|
-
modification, are permitted provided that the following conditions are met:
|
|
4523
|
-
|
|
4524
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4525
|
-
this list of conditions and the following disclaimer.
|
|
4526
|
-
|
|
4527
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4528
|
-
notice, this list of conditions and the following disclaimer in
|
|
4529
|
-
the documentation and/or other materials provided with the distribution.
|
|
4530
|
-
|
|
4531
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4532
|
-
derived from this software without specific prior written permission.
|
|
4533
|
-
|
|
4534
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4535
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4536
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4537
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4538
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4539
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4540
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4541
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4542
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4543
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4544
|
-
*/
|
|
4545
|
-
|
|
4546
|
-
const OPTION_FILENAME_ENCODING = "filenameEncoding";
|
|
4547
|
-
const OPTION_COMMENT_ENCODING = "commentEncoding";
|
|
4548
|
-
const OPTION_DECODE_TEXT = "decodeText";
|
|
4549
|
-
const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
|
|
4550
|
-
const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
|
|
4551
|
-
const OPTION_PASSWORD = "password";
|
|
4552
|
-
const OPTION_RAW_PASSWORD = "rawPassword";
|
|
4553
|
-
const OPTION_PASS_THROUGH = "passThrough";
|
|
4554
|
-
const OPTION_SIGNAL = "signal";
|
|
4555
|
-
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
4556
|
-
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
4557
|
-
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
4558
|
-
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
4559
|
-
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
4560
|
-
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
4561
|
-
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
4562
|
-
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
4563
|
-
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
4564
|
-
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
4565
|
-
const OPTION_TRANSFER_STREAMS = "transferStreams";
|
|
4566
|
-
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
4567
|
-
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
4568
|
-
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
4569
|
-
const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
|
|
4570
|
-
const OPTION_KEEP_ORDER = "keepOrder";
|
|
4571
|
-
const OPTION_LEVEL = "level";
|
|
4572
|
-
const OPTION_BUFFERED_WRITE = "bufferedWrite";
|
|
4573
|
-
const OPTION_CREATE_TEMP_STREAM = "createTempStream";
|
|
4574
|
-
const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
|
|
4575
|
-
const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
|
|
4576
|
-
const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
|
|
4577
|
-
const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
|
|
4578
|
-
const OPTION_ENCODE_TEXT = "encodeText";
|
|
4579
|
-
const OPTION_OFFSET = "offset";
|
|
4580
|
-
const OPTION_USDZ = "usdz";
|
|
4581
|
-
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
4582
|
-
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
4583
|
-
const OPTION_STRICTNESS = "strictness";
|
|
4584
|
-
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
4585
|
-
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
4586
|
-
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
4587
|
-
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
4588
|
-
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
4589
|
-
const TEXT_TYPE_FILENAME = "filename";
|
|
4590
|
-
const TEXT_TYPE_COMMENT = "comment";
|
|
4591
|
-
const STRICTNESS_STRICT = "strict";
|
|
4592
|
-
const STRICTNESS_BALANCED = "balanced";
|
|
4593
|
-
const STRICTNESS_TOLERANT = "tolerant";
|
|
4594
|
-
|
|
4595
4677
|
/*
|
|
4596
4678
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4597
4679
|
|
|
@@ -4632,6 +4714,7 @@
|
|
|
4632
4714
|
const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
|
|
4633
4715
|
const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
4634
4716
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
4717
|
+
const ERR_ENTRY_DATA_OUT_OF_BOUNDS = "Entry data out of bounds";
|
|
4635
4718
|
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
4636
4719
|
const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
|
|
4637
4720
|
const ERR_UNSAFE_FILENAME = "Unsafe filename";
|
|
@@ -4652,7 +4735,7 @@
|
|
|
4652
4735
|
];
|
|
4653
4736
|
const ZIP64_EXTRACTION = {
|
|
4654
4737
|
[MAX_16_BITS]: {
|
|
4655
|
-
getValue: getUint32,
|
|
4738
|
+
getValue: getUint32$1,
|
|
4656
4739
|
bytes: 4
|
|
4657
4740
|
},
|
|
4658
4741
|
[MAX_32_BITS]: {
|
|
@@ -4661,6 +4744,7 @@
|
|
|
4661
4744
|
}
|
|
4662
4745
|
};
|
|
4663
4746
|
const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
|
|
4747
|
+
const MAX_DEFLATE_EXPANSION_RATIO = 1032;
|
|
4664
4748
|
const CENTRAL_DIRECTORY_UNREACHABLE = 0;
|
|
4665
4749
|
const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
|
|
4666
4750
|
const CENTRAL_DIRECTORY_REACHABLE = 2;
|
|
@@ -4671,7 +4755,6 @@
|
|
|
4671
4755
|
Object.assign(this, {
|
|
4672
4756
|
reader: new GenericReader(reader),
|
|
4673
4757
|
options,
|
|
4674
|
-
config: getConfiguration(),
|
|
4675
4758
|
readRanges: new Map()
|
|
4676
4759
|
});
|
|
4677
4760
|
}
|
|
@@ -4679,7 +4762,6 @@
|
|
|
4679
4762
|
async* getEntriesGenerator(options = {}) {
|
|
4680
4763
|
const zipReader = this;
|
|
4681
4764
|
let { reader } = zipReader;
|
|
4682
|
-
const { config } = zipReader;
|
|
4683
4765
|
await initStream(reader);
|
|
4684
4766
|
if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
|
|
4685
4767
|
reader = new BlobReader(await streamToBlob(reader.readable));
|
|
@@ -4696,9 +4778,7 @@
|
|
|
4696
4778
|
const normalizeFilename = getOptionValue$1(zipReader, options, OPTION_NORMALIZE_FILENAME);
|
|
4697
4779
|
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
4698
4780
|
if (!endOfDirectoryInfo) {
|
|
4699
|
-
|
|
4700
|
-
const signatureView = getDataView(signatureArray);
|
|
4701
|
-
if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
|
|
4781
|
+
if (await startsWithSplitZipSignature$1(reader)) {
|
|
4702
4782
|
throw new Error(ERR_SPLIT_ZIP_FILE);
|
|
4703
4783
|
} else {
|
|
4704
4784
|
throw new Error(ERR_EOCDR_NOT_FOUND);
|
|
@@ -4708,22 +4788,23 @@
|
|
|
4708
4788
|
throwAmbiguousArchive("multiple end of central directory records");
|
|
4709
4789
|
}
|
|
4710
4790
|
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
4711
|
-
let directoryDataLength = getUint32(endOfDirectoryView, 12);
|
|
4712
|
-
let directoryDataOffset = getUint32(endOfDirectoryView, 16);
|
|
4791
|
+
let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
|
|
4792
|
+
let directoryDataOffset = getUint32$1(endOfDirectoryView, 16);
|
|
4713
4793
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
4714
|
-
const commentLength = getUint16(endOfDirectoryView, 20);
|
|
4794
|
+
const commentLength = getUint16$1(endOfDirectoryView, 20);
|
|
4715
4795
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
4716
4796
|
if (reader.size - appendedDataOffset > maxAppendedDataSize) {
|
|
4717
4797
|
throwAmbiguousArchive("appended data");
|
|
4718
4798
|
}
|
|
4719
|
-
let lastDiskNumber = getUint16(endOfDirectoryView, 4);
|
|
4799
|
+
let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
|
|
4720
4800
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
4721
|
-
let diskNumber = getUint16(endOfDirectoryView, 6);
|
|
4722
|
-
let filesLength = getUint16(endOfDirectoryView, 10);
|
|
4801
|
+
let diskNumber = getUint16$1(endOfDirectoryView, 6);
|
|
4802
|
+
let filesLength = getUint16$1(endOfDirectoryView, 10);
|
|
4723
4803
|
let prependedDataLength = 0;
|
|
4724
4804
|
let startOffset;
|
|
4725
4805
|
let zip64EndOfDirectory;
|
|
4726
4806
|
let zip64EndOfDirectoryVersion2;
|
|
4807
|
+
let zip64EndOfDirectoryLength = ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
4727
4808
|
let directoryEncryptionInfo;
|
|
4728
4809
|
const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
|
|
4729
4810
|
if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
|
|
@@ -4735,12 +4816,12 @@
|
|
|
4735
4816
|
EMPTY_UINT8_ARRAY;
|
|
4736
4817
|
const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
|
|
4737
4818
|
if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
|
|
4738
|
-
getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
4739
|
-
directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4819
|
+
getUint32$1(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
4820
|
+
directoryDataOffset = getDiskOffset$1(reader, getUint32$1(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4740
4821
|
let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4741
4822
|
let endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4742
4823
|
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
4743
|
-
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
4824
|
+
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
4744
4825
|
directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
|
|
4745
4826
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
4746
4827
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
@@ -4750,7 +4831,7 @@
|
|
|
4750
4831
|
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4751
4832
|
endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4752
4833
|
}
|
|
4753
|
-
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4834
|
+
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4754
4835
|
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4755
4836
|
}
|
|
4756
4837
|
zip64EndOfDirectory = true;
|
|
@@ -4760,18 +4841,19 @@
|
|
|
4760
4841
|
Number(getBigUint64(endOfDirectoryView, 4)) - (ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12),
|
|
4761
4842
|
reader.size - directoryDataOffset - ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4762
4843
|
if (extensibleDataLength > 0) {
|
|
4844
|
+
zip64EndOfDirectoryLength += extensibleDataLength;
|
|
4763
4845
|
const rawExtensibleData = await readUint8Array(reader, directoryDataOffset + ZIP64_END_OF_CENTRAL_DIR_LENGTH, extensibleDataLength);
|
|
4764
4846
|
directoryEncryptionInfo = getDirectoryEncryptionInfo(rawExtensibleData);
|
|
4765
4847
|
}
|
|
4766
4848
|
}
|
|
4767
4849
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
4768
|
-
lastDiskNumber = getUint32(endOfDirectoryView, 16);
|
|
4769
|
-
} else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
|
|
4850
|
+
lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
|
|
4851
|
+
} else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
|
|
4770
4852
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
4771
4853
|
}
|
|
4772
4854
|
if (diskNumber == MAX_16_BITS) {
|
|
4773
|
-
diskNumber = getUint32(endOfDirectoryView, 20);
|
|
4774
|
-
} else if (checkAmbiguity && diskNumber != getUint32(endOfDirectoryView, 20)) {
|
|
4855
|
+
diskNumber = getUint32$1(endOfDirectoryView, 20);
|
|
4856
|
+
} else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
|
|
4775
4857
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
4776
4858
|
}
|
|
4777
4859
|
if (filesLength == MAX_16_BITS) {
|
|
@@ -4789,7 +4871,7 @@
|
|
|
4789
4871
|
}
|
|
4790
4872
|
let declaredDirectoryDataLength = directoryDataLength;
|
|
4791
4873
|
const centralDirectoryEndOffset = endOfDirectoryInfo.offset -
|
|
4792
|
-
(zip64EndOfDirectory ?
|
|
4874
|
+
(zip64EndOfDirectory ? zip64EndOfDirectoryLength + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
|
|
4793
4875
|
if (directoryDataOffset >= reader.size) {
|
|
4794
4876
|
prependedDataLength = reader.size - directoryDataOffset - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
4795
4877
|
directoryDataOffset = reader.size - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
@@ -4809,11 +4891,13 @@
|
|
|
4809
4891
|
}
|
|
4810
4892
|
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
4811
4893
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4812
|
-
const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE
|
|
4894
|
+
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
|
|
4895
|
+
Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
|
|
4896
|
+
detectEncryptedCentralDirectory(directoryView);
|
|
4813
4897
|
let reconcile = !storedPointsAtDirectory;
|
|
4814
4898
|
if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
4815
4899
|
const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
|
|
4816
|
-
reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4900
|
+
reconcile = getUint32$1(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4817
4901
|
}
|
|
4818
4902
|
if (reconcile) {
|
|
4819
4903
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
@@ -4837,12 +4921,14 @@
|
|
|
4837
4921
|
}
|
|
4838
4922
|
zipReader.directoryOffset = directoryDataOffset;
|
|
4839
4923
|
zipReader.directoryLength = declaredDirectoryDataLength;
|
|
4840
|
-
const decryptCentralDirectory =
|
|
4841
|
-
let decryptedDirectory;
|
|
4924
|
+
const decryptCentralDirectory = getFunctionOptionValue$1(zipReader, options, OPTION_DECRYPT_CENTRAL_DIRECTORY);
|
|
4925
|
+
let decryptedDirectory, dataAfterEncryptedDirectory;
|
|
4842
4926
|
if (decryptCentralDirectory && filesLength && directoryArray.length >= 4 &&
|
|
4843
|
-
getUint32(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
|
|
4927
|
+
getUint32$1(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
|
|
4844
4928
|
(zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4845
|
-
|
|
4929
|
+
const encryptedDirectoryDataLength = getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryArray.length);
|
|
4930
|
+
dataAfterEncryptedDirectory = directoryArray.subarray(encryptedDirectoryDataLength);
|
|
4931
|
+
directoryArray = await decryptCentralDirectory(directoryArray.subarray(0, encryptedDirectoryDataLength), directoryEncryptionInfo);
|
|
4846
4932
|
directoryView = getDataView(directoryArray);
|
|
4847
4933
|
declaredDirectoryDataLength = directoryArray.length;
|
|
4848
4934
|
decryptedDirectory = true;
|
|
@@ -4853,8 +4939,8 @@
|
|
|
4853
4939
|
const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
|
|
4854
4940
|
let duplicateFilename;
|
|
4855
4941
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
4856
|
-
const fileEntry = new ZipEntry$1(reader,
|
|
4857
|
-
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4942
|
+
const fileEntry = new ZipEntry$1(reader, zipReader.options);
|
|
4943
|
+
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32$1(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4858
4944
|
if (indexFile == 0 && !decryptedDirectory && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4859
4945
|
throw new Error(ERR_ENCRYPTED_CENTRAL_DIRECTORY);
|
|
4860
4946
|
}
|
|
@@ -4865,16 +4951,16 @@
|
|
|
4865
4951
|
const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
|
|
4866
4952
|
const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
|
|
4867
4953
|
const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
|
|
4868
|
-
const versionMadeBy = getUint16(directoryView, offset + 4);
|
|
4954
|
+
const versionMadeBy = getUint16$1(directoryView, offset + 4);
|
|
4869
4955
|
const msDosCompatible = versionMadeBy >> 8 == 0;
|
|
4870
4956
|
const unixCompatible = versionMadeBy >> 8 == 3;
|
|
4871
4957
|
const rawFilename = directoryArray.subarray(filenameOffset, extraFieldOffset);
|
|
4872
|
-
const commentLength = getUint16(directoryView, offset + 32);
|
|
4958
|
+
const commentLength = getUint16$1(directoryView, offset + 32);
|
|
4873
4959
|
const endOffset = commentOffset + commentLength;
|
|
4874
4960
|
const rawComment = directoryArray.subarray(commentOffset, endOffset);
|
|
4875
4961
|
const filenameUTF8 = languageEncodingFlag;
|
|
4876
4962
|
const commentUTF8 = languageEncodingFlag;
|
|
4877
|
-
const externalFileAttributes = getUint32(directoryView, offset + 38);
|
|
4963
|
+
const externalFileAttributes = getUint32$1(directoryView, offset + 38);
|
|
4878
4964
|
const msdosAttributesRaw = externalFileAttributes & MAX_8_BITS;
|
|
4879
4965
|
const msdosAttributes = {
|
|
4880
4966
|
readOnly: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_READONLY_MASK),
|
|
@@ -4883,8 +4969,8 @@
|
|
|
4883
4969
|
directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
|
|
4884
4970
|
archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
|
|
4885
4971
|
};
|
|
4886
|
-
const offsetFileEntry = getUint32(directoryView, offset + 42);
|
|
4887
|
-
const decode =
|
|
4972
|
+
const offsetFileEntry = getUint32$1(directoryView, offset + 42);
|
|
4973
|
+
const decode = getFunctionOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
4888
4974
|
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
4889
4975
|
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
4890
4976
|
let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
|
|
@@ -4908,6 +4994,7 @@
|
|
|
4908
4994
|
}
|
|
4909
4995
|
Object.assign(fileEntry, {
|
|
4910
4996
|
index: indexFile,
|
|
4997
|
+
decryptedDirectory,
|
|
4911
4998
|
versionMadeBy,
|
|
4912
4999
|
msDosCompatible,
|
|
4913
5000
|
zip64: false,
|
|
@@ -4915,8 +5002,8 @@
|
|
|
4915
5002
|
uncompressedSize: 0,
|
|
4916
5003
|
commentLength,
|
|
4917
5004
|
offset: offsetFileEntry,
|
|
4918
|
-
diskNumberStart: getUint16(directoryView, offset + 34),
|
|
4919
|
-
internalFileAttributes: getUint16(directoryView, offset + 36),
|
|
5005
|
+
diskNumberStart: getUint16$1(directoryView, offset + 34),
|
|
5006
|
+
internalFileAttributes: getUint16$1(directoryView, offset + 36),
|
|
4920
5007
|
externalFileAttributes,
|
|
4921
5008
|
msdosAttributesRaw,
|
|
4922
5009
|
msdosAttributes,
|
|
@@ -4984,12 +5071,11 @@
|
|
|
4984
5071
|
yield entry;
|
|
4985
5072
|
}
|
|
4986
5073
|
let offsetAfterSignature = offset;
|
|
4987
|
-
|
|
4988
|
-
|
|
4989
|
-
|
|
4990
|
-
|
|
4991
|
-
|
|
4992
|
-
}
|
|
5074
|
+
const digitalSignature = readDigitalSignature(directoryArray.subarray(offset)) ||
|
|
5075
|
+
(decryptedDirectory ? readDigitalSignature(dataAfterEncryptedDirectory) : UNDEFINED_VALUE);
|
|
5076
|
+
if (digitalSignature) {
|
|
5077
|
+
zipReader.digitalSignature = digitalSignature;
|
|
5078
|
+
offsetAfterSignature = offset + 6 + digitalSignature.length;
|
|
4993
5079
|
}
|
|
4994
5080
|
if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
|
|
4995
5081
|
throwAmbiguousArchive("trailing central directory data");
|
|
@@ -4997,13 +5083,17 @@
|
|
|
4997
5083
|
if (duplicateFilename) {
|
|
4998
5084
|
throwAmbiguousArchive("duplicate filename");
|
|
4999
5085
|
}
|
|
5000
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > 0))) {
|
|
5001
|
-
throwAmbiguousArchive("prepended data");
|
|
5002
|
-
}
|
|
5003
5086
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
5004
5087
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5088
|
+
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5089
|
+
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5090
|
+
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5091
|
+
throwAmbiguousArchive("prepended data");
|
|
5092
|
+
}
|
|
5005
5093
|
if (extractPrependedData) {
|
|
5006
|
-
zipReader.prependedData = startOffset >
|
|
5094
|
+
zipReader.prependedData = startOffset > splitZipSignatureLength ?
|
|
5095
|
+
await readUint8Array(reader, splitZipSignatureLength, startOffset - splitZipSignatureLength) :
|
|
5096
|
+
EMPTY_UINT8_ARRAY;
|
|
5007
5097
|
}
|
|
5008
5098
|
zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : EMPTY_UINT8_ARRAY;
|
|
5009
5099
|
if (extractAppendedData) {
|
|
@@ -5070,16 +5160,16 @@
|
|
|
5070
5160
|
|
|
5071
5161
|
let ZipEntry$1 = class ZipEntry {
|
|
5072
5162
|
|
|
5073
|
-
constructor(reader,
|
|
5163
|
+
constructor(reader, options) {
|
|
5074
5164
|
Object.assign(this, {
|
|
5075
5165
|
reader,
|
|
5076
|
-
config,
|
|
5077
5166
|
options
|
|
5078
5167
|
});
|
|
5079
5168
|
}
|
|
5080
5169
|
|
|
5081
5170
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5082
5171
|
const zipEntry = this;
|
|
5172
|
+
const config = getConfiguration();
|
|
5083
5173
|
const {
|
|
5084
5174
|
reader,
|
|
5085
5175
|
index,
|
|
@@ -5088,7 +5178,6 @@
|
|
|
5088
5178
|
extraFieldAES,
|
|
5089
5179
|
extraFieldZip64,
|
|
5090
5180
|
compressionMethod,
|
|
5091
|
-
config,
|
|
5092
5181
|
bitFlag,
|
|
5093
5182
|
rawBitFlag,
|
|
5094
5183
|
crc32,
|
|
@@ -5106,6 +5195,7 @@
|
|
|
5106
5195
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
5107
5196
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
5108
5197
|
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
5198
|
+
checkPasswordOption(password, rawPassword);
|
|
5109
5199
|
password = password && password.length && password;
|
|
5110
5200
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
5111
5201
|
if (extraFieldAES) {
|
|
@@ -5113,7 +5203,7 @@
|
|
|
5113
5203
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
5114
5204
|
}
|
|
5115
5205
|
}
|
|
5116
|
-
if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
5206
|
+
if (dataArray.length < HEADER_SIZE || getUint32$1(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
5117
5207
|
throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
|
|
5118
5208
|
}
|
|
5119
5209
|
readCommonHeader(localDirectory, dataView, 4);
|
|
@@ -5175,9 +5265,12 @@
|
|
|
5175
5265
|
}
|
|
5176
5266
|
}
|
|
5177
5267
|
const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
|
|
5268
|
+
if (dataOffset + compressedSize > reader.size) {
|
|
5269
|
+
throw new Error(ERR_ENTRY_DATA_OUT_OF_BOUNDS);
|
|
5270
|
+
}
|
|
5178
5271
|
const size = compressedSize;
|
|
5179
5272
|
const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
|
|
5180
|
-
const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
|
|
5273
|
+
const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
|
|
5181
5274
|
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5182
5275
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
5183
5276
|
const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
|
|
@@ -5185,6 +5278,8 @@
|
|
|
5185
5278
|
checkOverlappingEntry = true;
|
|
5186
5279
|
}
|
|
5187
5280
|
const { onstart, onprogress, onend } = options;
|
|
5281
|
+
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThrough;
|
|
5282
|
+
const outputSize = passThrough ? compressedSize : uncompressedSize;
|
|
5188
5283
|
const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
|
|
5189
5284
|
let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
|
|
5190
5285
|
if (deflate64) {
|
|
@@ -5205,9 +5300,9 @@
|
|
|
5205
5300
|
checkCrc32,
|
|
5206
5301
|
checkAuthenticationCode: getOptionValue$1(zipEntry, options, OPTION_CHECK_AUTHENTICATION_CODE),
|
|
5207
5302
|
passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & MAX_8_BITS) : ((crc32 >>> 24) & MAX_8_BITS)),
|
|
5208
|
-
outputSize
|
|
5303
|
+
outputSize,
|
|
5209
5304
|
crc32,
|
|
5210
|
-
compressed
|
|
5305
|
+
compressed,
|
|
5211
5306
|
encrypted,
|
|
5212
5307
|
useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
|
|
5213
5308
|
useCompressionStream,
|
|
@@ -5244,11 +5339,11 @@
|
|
|
5244
5339
|
writer = new WritableStream();
|
|
5245
5340
|
}
|
|
5246
5341
|
writer = new GenericWriter(writer);
|
|
5247
|
-
await initStream(writer,
|
|
5342
|
+
await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
|
|
5248
5343
|
({ writable } = writer);
|
|
5249
|
-
const { outputSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5250
|
-
writer.size +=
|
|
5251
|
-
if (
|
|
5344
|
+
const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5345
|
+
writer.size += writtenSize;
|
|
5346
|
+
if (writtenSize != outputSize) {
|
|
5252
5347
|
throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
5253
5348
|
}
|
|
5254
5349
|
}
|
|
@@ -5282,26 +5377,47 @@
|
|
|
5282
5377
|
function detectEncryptedCentralDirectory(directoryView) {
|
|
5283
5378
|
const maxOffset = Math.min(directoryView.byteLength, 1024) - 3;
|
|
5284
5379
|
for (let offset = 0; offset < maxOffset; offset++) {
|
|
5285
|
-
if (getUint32(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
5380
|
+
if (getUint32$1(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
5286
5381
|
return true;
|
|
5287
5382
|
}
|
|
5288
5383
|
}
|
|
5289
5384
|
return false;
|
|
5290
5385
|
}
|
|
5291
5386
|
|
|
5387
|
+
function readDigitalSignature(signatureRecordArray) {
|
|
5388
|
+
if (signatureRecordArray.length >= 6) {
|
|
5389
|
+
const signatureRecordView = getDataView(signatureRecordArray);
|
|
5390
|
+
if (getUint32$1(signatureRecordView, 0) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
|
|
5391
|
+
const signatureDataLength = getUint16$1(signatureRecordView, 4);
|
|
5392
|
+
if (6 + signatureDataLength <= signatureRecordArray.length) {
|
|
5393
|
+
return signatureRecordArray.subarray(6, 6 + signatureDataLength);
|
|
5394
|
+
}
|
|
5395
|
+
}
|
|
5396
|
+
}
|
|
5397
|
+
}
|
|
5398
|
+
|
|
5399
|
+
function getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryDataLength) {
|
|
5400
|
+
const encryptedDirectoryDataLength = directoryEncryptionInfo && directoryEncryptionInfo.compressedSize ?
|
|
5401
|
+
directoryEncryptionInfo.compressedSize :
|
|
5402
|
+
declaredDirectoryDataLength;
|
|
5403
|
+
return encryptedDirectoryDataLength > 0 && encryptedDirectoryDataLength <= directoryDataLength ?
|
|
5404
|
+
encryptedDirectoryDataLength :
|
|
5405
|
+
directoryDataLength;
|
|
5406
|
+
}
|
|
5407
|
+
|
|
5292
5408
|
function getDirectoryEncryptionInfo(rawExtensibleData) {
|
|
5293
5409
|
const directoryEncryptionInfo = { rawExtensibleData };
|
|
5294
5410
|
if (rawExtensibleData.length >= 28) {
|
|
5295
5411
|
const extensibleDataView = getDataView(rawExtensibleData);
|
|
5296
|
-
const hashDataLength = getUint16(extensibleDataView, 26);
|
|
5412
|
+
const hashDataLength = getUint16$1(extensibleDataView, 26);
|
|
5297
5413
|
Object.assign(directoryEncryptionInfo, {
|
|
5298
|
-
compressionMethod: getUint16(extensibleDataView, 0),
|
|
5414
|
+
compressionMethod: getUint16$1(extensibleDataView, 0),
|
|
5299
5415
|
compressedSize: Number(getBigUint64(extensibleDataView, 2)),
|
|
5300
5416
|
uncompressedSize: Number(getBigUint64(extensibleDataView, 10)),
|
|
5301
|
-
encryptionAlgorithm: getUint16(extensibleDataView, 18),
|
|
5302
|
-
bitLength: getUint16(extensibleDataView, 20),
|
|
5303
|
-
flags: getUint16(extensibleDataView, 22),
|
|
5304
|
-
hashAlgorithm: getUint16(extensibleDataView, 24),
|
|
5417
|
+
encryptionAlgorithm: getUint16$1(extensibleDataView, 18),
|
|
5418
|
+
bitLength: getUint16$1(extensibleDataView, 20),
|
|
5419
|
+
flags: getUint16$1(extensibleDataView, 22),
|
|
5420
|
+
hashAlgorithm: getUint16$1(extensibleDataView, 24),
|
|
5305
5421
|
hashData: rawExtensibleData.subarray(28, 28 + hashDataLength)
|
|
5306
5422
|
});
|
|
5307
5423
|
}
|
|
@@ -5309,12 +5425,12 @@
|
|
|
5309
5425
|
}
|
|
5310
5426
|
|
|
5311
5427
|
function readCommonHeader(directory, dataView, offset) {
|
|
5312
|
-
const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2);
|
|
5428
|
+
const rawBitFlag = directory.rawBitFlag = getUint16$1(dataView, offset + 2);
|
|
5313
5429
|
const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED;
|
|
5314
|
-
const rawLastModDate = getUint32(dataView, offset + 6);
|
|
5430
|
+
const rawLastModDate = getUint32$1(dataView, offset + 6);
|
|
5315
5431
|
Object.assign(directory, {
|
|
5316
5432
|
encrypted,
|
|
5317
|
-
version: getUint16(dataView, offset),
|
|
5433
|
+
version: getUint16$1(dataView, offset),
|
|
5318
5434
|
bitFlag: {
|
|
5319
5435
|
level: (rawBitFlag & BITFLAG_LEVEL) >> 1,
|
|
5320
5436
|
dataDescriptor: (rawBitFlag & BITFLAG_DATA_DESCRIPTOR) == BITFLAG_DATA_DESCRIPTOR,
|
|
@@ -5322,8 +5438,8 @@
|
|
|
5322
5438
|
},
|
|
5323
5439
|
rawLastModDate,
|
|
5324
5440
|
lastModDate: getDate(rawLastModDate),
|
|
5325
|
-
filenameLength: getUint16(dataView, offset + 22),
|
|
5326
|
-
extraFieldLength: getUint16(dataView, offset + 24)
|
|
5441
|
+
filenameLength: getUint16$1(dataView, offset + 22),
|
|
5442
|
+
extraFieldLength: getUint16$1(dataView, offset + 24)
|
|
5327
5443
|
});
|
|
5328
5444
|
}
|
|
5329
5445
|
|
|
@@ -5334,8 +5450,8 @@
|
|
|
5334
5450
|
let offsetExtraField = 0;
|
|
5335
5451
|
try {
|
|
5336
5452
|
while (offsetExtraField < rawExtraField.length) {
|
|
5337
|
-
const type = getUint16(rawExtraFieldView, offsetExtraField);
|
|
5338
|
-
const size = getUint16(rawExtraFieldView, offsetExtraField + 2);
|
|
5453
|
+
const type = getUint16$1(rawExtraFieldView, offsetExtraField);
|
|
5454
|
+
const size = getUint16$1(rawExtraFieldView, offsetExtraField + 2);
|
|
5339
5455
|
extraField.set(type, {
|
|
5340
5456
|
type,
|
|
5341
5457
|
data: rawExtraField.slice(offsetExtraField + 4, offsetExtraField + 4 + size)
|
|
@@ -5345,12 +5461,12 @@
|
|
|
5345
5461
|
} catch {
|
|
5346
5462
|
// ignored
|
|
5347
5463
|
}
|
|
5348
|
-
const compressionMethod = getUint16(dataView, offset + 4);
|
|
5464
|
+
const compressionMethod = getUint16$1(dataView, offset + 4);
|
|
5349
5465
|
Object.assign(directory, {
|
|
5350
|
-
signature: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5351
|
-
crc32: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5352
|
-
compressedSize: getUint32(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
|
|
5353
|
-
uncompressedSize: getUint32(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
|
|
5466
|
+
signature: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5467
|
+
crc32: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5468
|
+
compressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
|
|
5469
|
+
uncompressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
|
|
5354
5470
|
});
|
|
5355
5471
|
const extraFieldZip64 = extraField.get(EXTRAFIELD_TYPE_ZIP64);
|
|
5356
5472
|
if (extraFieldZip64) {
|
|
@@ -5439,11 +5555,11 @@
|
|
|
5439
5555
|
computedCrc32.append(fileEntry[rawPropertyName]);
|
|
5440
5556
|
const computedCrc32View = getDataView(new Uint8Array(4));
|
|
5441
5557
|
computedCrc32View.setUint32(0, computedCrc32.get(), true);
|
|
5442
|
-
const nameCrc32 = getUint32(extraFieldView, 1);
|
|
5558
|
+
const nameCrc32 = getUint32$1(extraFieldView, 1);
|
|
5443
5559
|
Object.assign(extraFieldUnicode, {
|
|
5444
5560
|
version: getUint8(extraFieldView, 0),
|
|
5445
5561
|
[propertyName]: decodeText(extraFieldUnicode.data.subarray(5)),
|
|
5446
|
-
valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32(computedCrc32View, 0)
|
|
5562
|
+
valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32$1(computedCrc32View, 0)
|
|
5447
5563
|
});
|
|
5448
5564
|
if (extraFieldUnicode.valid) {
|
|
5449
5565
|
directory[propertyName] = extraFieldUnicode[propertyName];
|
|
@@ -5459,7 +5575,7 @@
|
|
|
5459
5575
|
vendorId: getUint8(extraFieldView, 2),
|
|
5460
5576
|
strength,
|
|
5461
5577
|
originalCompressionMethod: compressionMethod,
|
|
5462
|
-
compressionMethod: getUint16(extraFieldView, 5)
|
|
5578
|
+
compressionMethod: getUint16$1(extraFieldView, 5)
|
|
5463
5579
|
});
|
|
5464
5580
|
directory.compressionMethod = extraFieldAES.compressionMethod;
|
|
5465
5581
|
if (extraFieldAES.vendorVersion != VENDOR_VERSION_AE_1$1) {
|
|
@@ -5473,8 +5589,8 @@
|
|
|
5473
5589
|
let tag1Data;
|
|
5474
5590
|
try {
|
|
5475
5591
|
while (offsetExtraField < extraFieldNTFS.data.length && !tag1Data) {
|
|
5476
|
-
const tagValue = getUint16(extraFieldView, offsetExtraField);
|
|
5477
|
-
const attributeSize = getUint16(extraFieldView, offsetExtraField + 2);
|
|
5592
|
+
const tagValue = getUint16$1(extraFieldView, offsetExtraField);
|
|
5593
|
+
const attributeSize = getUint16$1(extraFieldView, offsetExtraField + 2);
|
|
5478
5594
|
if (tagValue == EXTRAFIELD_TYPE_NTFS_TAG1) {
|
|
5479
5595
|
tag1Data = extraFieldNTFS.data.slice(offsetExtraField + 4, offsetExtraField + 4 + attributeSize);
|
|
5480
5596
|
}
|
|
@@ -5507,12 +5623,12 @@
|
|
|
5507
5623
|
return;
|
|
5508
5624
|
}
|
|
5509
5625
|
const extraFieldView = getDataView(extraField.data);
|
|
5510
|
-
const lastAccessDate = new Date((getUint32(extraFieldView, 0) | 0) * 1000);
|
|
5511
|
-
const lastModDate = new Date((getUint32(extraFieldView, 4) | 0) * 1000);
|
|
5626
|
+
const lastAccessDate = new Date((getUint32$1(extraFieldView, 0) | 0) * 1000);
|
|
5627
|
+
const lastModDate = new Date((getUint32$1(extraFieldView, 4) | 0) * 1000);
|
|
5512
5628
|
const extraFieldData = { lastAccessDate, lastModDate };
|
|
5513
5629
|
if (extraField.data.length >= 12) {
|
|
5514
|
-
extraFieldData.uid = getUint16(extraFieldView, 8);
|
|
5515
|
-
extraFieldData.gid = getUint16(extraFieldView, 10);
|
|
5630
|
+
extraFieldData.uid = getUint16$1(extraFieldView, 8);
|
|
5631
|
+
extraFieldData.gid = getUint16$1(extraFieldView, 10);
|
|
5516
5632
|
}
|
|
5517
5633
|
Object.assign(extraField, extraFieldData);
|
|
5518
5634
|
Object.assign(directory, extraFieldData);
|
|
@@ -5532,8 +5648,8 @@
|
|
|
5532
5648
|
gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
|
|
5533
5649
|
Object.assign(extraField, { version, uid, gid });
|
|
5534
5650
|
} else if (extraField.data.length >= 4) {
|
|
5535
|
-
uid = getUint16(view, 0);
|
|
5536
|
-
gid = getUint16(view, 2);
|
|
5651
|
+
uid = getUint16$1(view, 0);
|
|
5652
|
+
gid = getUint16$1(view, 2);
|
|
5537
5653
|
Object.assign(extraField, { uid, gid });
|
|
5538
5654
|
}
|
|
5539
5655
|
if (uid !== UNDEFINED_VALUE) {
|
|
@@ -5583,7 +5699,7 @@
|
|
|
5583
5699
|
let offset = 1;
|
|
5584
5700
|
timeProperties.forEach((propertyName, indexProperty) => {
|
|
5585
5701
|
if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
|
|
5586
|
-
const time = getUint32(extraFieldView, offset);
|
|
5702
|
+
const time = getUint32$1(extraFieldView, offset);
|
|
5587
5703
|
directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
|
|
5588
5704
|
const rawPropertyName = timeRawProperties[indexProperty];
|
|
5589
5705
|
extraFieldExtendedTimestamp[rawPropertyName] = time;
|
|
@@ -5617,7 +5733,7 @@
|
|
|
5617
5733
|
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
|
|
5618
5734
|
const dataDescriptorView = getDataView(dataDescriptorArray);
|
|
5619
5735
|
let signature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
|
|
5620
|
-
getUint32(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
5736
|
+
getUint32$1(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
5621
5737
|
if (signature) {
|
|
5622
5738
|
const signedDataDescriptor = readDataDescriptor(dataDescriptorView, DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, extraFieldZip64);
|
|
5623
5739
|
const matchCrc32 = (fileEntry.encrypted && !fileEntry.zipCrypto) || signedDataDescriptor.crc32 == crc32;
|
|
@@ -5651,15 +5767,15 @@
|
|
|
5651
5767
|
}
|
|
5652
5768
|
|
|
5653
5769
|
function readDataDescriptor(dataDescriptorView, offset, extraFieldZip64) {
|
|
5654
|
-
const crc32 = getUint32(dataDescriptorView, offset);
|
|
5770
|
+
const crc32 = getUint32$1(dataDescriptorView, offset);
|
|
5655
5771
|
let compressedSize;
|
|
5656
5772
|
let uncompressedSize;
|
|
5657
5773
|
if (extraFieldZip64) {
|
|
5658
5774
|
compressedSize = getBigUint64(dataDescriptorView, offset + 4);
|
|
5659
5775
|
uncompressedSize = getBigUint64(dataDescriptorView, offset + 12);
|
|
5660
5776
|
} else {
|
|
5661
|
-
compressedSize = getUint32(dataDescriptorView, offset + 4);
|
|
5662
|
-
uncompressedSize = getUint32(dataDescriptorView, offset + 8);
|
|
5777
|
+
compressedSize = getUint32$1(dataDescriptorView, offset + 4);
|
|
5778
|
+
uncompressedSize = getUint32$1(dataDescriptorView, offset + 8);
|
|
5663
5779
|
}
|
|
5664
5780
|
return { crc32, compressedSize, uncompressedSize };
|
|
5665
5781
|
}
|
|
@@ -5668,10 +5784,28 @@
|
|
|
5668
5784
|
return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
|
|
5669
5785
|
}
|
|
5670
5786
|
|
|
5787
|
+
async function startsWithSplitZipSignature$1(reader) {
|
|
5788
|
+
return await getFirstSignature(reader) == SPLIT_ZIP_FILE_SIGNATURE;
|
|
5789
|
+
}
|
|
5790
|
+
|
|
5791
|
+
async function startsWithSplitZipMarker(reader) {
|
|
5792
|
+
const signature = await getFirstSignature(reader);
|
|
5793
|
+
return signature == SPLIT_ZIP_FILE_SIGNATURE || signature == TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE;
|
|
5794
|
+
}
|
|
5795
|
+
|
|
5796
|
+
async function getFirstSignature(reader) {
|
|
5797
|
+
const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
5798
|
+
return getUint32$1(getDataView(signatureArray));
|
|
5799
|
+
}
|
|
5800
|
+
|
|
5671
5801
|
function isStrictnessValue(value) {
|
|
5672
5802
|
return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
|
|
5673
5803
|
}
|
|
5674
5804
|
|
|
5805
|
+
function getDecodableOutputSize(outputSize, compressedSize, compressed) {
|
|
5806
|
+
return Math.min(outputSize, compressed ? compressedSize * MAX_DEFLATE_EXPANSION_RATIO : compressedSize);
|
|
5807
|
+
}
|
|
5808
|
+
|
|
5675
5809
|
function getStrictness(options, inheritedOptions) {
|
|
5676
5810
|
return resolveStrictness(options, resolveStrictness(inheritedOptions, STRICTNESS_BALANCED));
|
|
5677
5811
|
}
|
|
@@ -5734,7 +5868,7 @@
|
|
|
5734
5868
|
|
|
5735
5869
|
function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
|
|
5736
5870
|
if (maxAppendedDataSize !== UNDEFINED_VALUE) {
|
|
5737
|
-
const size = toNumber
|
|
5871
|
+
const size = toNumber(maxAppendedDataSize);
|
|
5738
5872
|
if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
|
|
5739
5873
|
throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE);
|
|
5740
5874
|
}
|
|
@@ -5757,7 +5891,7 @@
|
|
|
5757
5891
|
let plausibleEndOfDirectoryInfo;
|
|
5758
5892
|
let endOfDirectoryReachingEndCount = 0;
|
|
5759
5893
|
for await (const [anchoredView, anchoredOffset, anchoredArray, indexByte, offset] of scanEndOfCentralDirectory(reader, anchoredLength)) {
|
|
5760
|
-
const commentLength = getUint16(anchoredView, indexByte + 20);
|
|
5894
|
+
const commentLength = getUint16$1(anchoredView, indexByte + 20);
|
|
5761
5895
|
if (offset + END_OF_CENTRAL_DIR_LENGTH + commentLength == size) {
|
|
5762
5896
|
const reachability = await getCentralDirectoryReachability(reader, anchoredView, anchoredOffset, indexByte, offset, size, remoteProbeBudget);
|
|
5763
5897
|
if (reachability == CENTRAL_DIRECTORY_REACHABLE) {
|
|
@@ -5808,7 +5942,7 @@
|
|
|
5808
5942
|
const scanArray = await readUint8Array(reader, scanOffset, scanLength);
|
|
5809
5943
|
const scanView = getDataView(scanArray);
|
|
5810
5944
|
for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
|
|
5811
|
-
if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
5945
|
+
if (getUint32$1(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
5812
5946
|
yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
|
|
5813
5947
|
}
|
|
5814
5948
|
}
|
|
@@ -5819,9 +5953,9 @@
|
|
|
5819
5953
|
}
|
|
5820
5954
|
|
|
5821
5955
|
async function getCentralDirectoryReachability(reader, view, anchoredOffset, indexByte, offset, size, remoteProbeBudget) {
|
|
5822
|
-
const filesLength = getUint16(view, indexByte + 10);
|
|
5823
|
-
const directoryDataLength = getUint32(view, indexByte + 12);
|
|
5824
|
-
const directoryDataOffset = getUint32(view, indexByte + 16);
|
|
5956
|
+
const filesLength = getUint16$1(view, indexByte + 10);
|
|
5957
|
+
const directoryDataLength = getUint32$1(view, indexByte + 12);
|
|
5958
|
+
const directoryDataOffset = getUint32$1(view, indexByte + 16);
|
|
5825
5959
|
if (filesLength == MAX_16_BITS || directoryDataLength == MAX_32_BITS || directoryDataOffset == MAX_32_BITS) {
|
|
5826
5960
|
const locatorSignature = await readSignature(reader, view, anchoredOffset, offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, size, remoteProbeBudget);
|
|
5827
5961
|
return locatorSignature == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE ? CENTRAL_DIRECTORY_REACHABLE : CENTRAL_DIRECTORY_UNREACHABLE;
|
|
@@ -5829,7 +5963,7 @@
|
|
|
5829
5963
|
if (!filesLength && !directoryDataLength) {
|
|
5830
5964
|
return CENTRAL_DIRECTORY_PLAUSIBLE;
|
|
5831
5965
|
}
|
|
5832
|
-
const directoryDiskNumber = getUint16(view, indexByte + 6);
|
|
5966
|
+
const directoryDiskNumber = getUint16$1(view, indexByte + 6);
|
|
5833
5967
|
for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
|
|
5834
5968
|
if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
5835
5969
|
return CENTRAL_DIRECTORY_REACHABLE;
|
|
@@ -5843,19 +5977,21 @@
|
|
|
5843
5977
|
return UNDEFINED_VALUE;
|
|
5844
5978
|
}
|
|
5845
5979
|
if (signatureOffset >= anchoredOffset) {
|
|
5846
|
-
return getUint32(view, signatureOffset - anchoredOffset);
|
|
5980
|
+
return getUint32$1(view, signatureOffset - anchoredOffset);
|
|
5847
5981
|
}
|
|
5848
5982
|
if (remoteProbeBudget.count > 0) {
|
|
5849
5983
|
remoteProbeBudget.count--;
|
|
5850
5984
|
const signatureArray = await readUint8Array(reader, signatureOffset, 4);
|
|
5851
|
-
return getUint32(getDataView(signatureArray), 0);
|
|
5985
|
+
return getUint32$1(getDataView(signatureArray), 0);
|
|
5852
5986
|
}
|
|
5853
5987
|
return UNDEFINED_VALUE;
|
|
5854
5988
|
}
|
|
5855
5989
|
|
|
5856
5990
|
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
|
|
5857
5991
|
const { rawFilename } = zipEntry;
|
|
5858
|
-
|
|
5992
|
+
const maskedLocalDirectory = zipEntry.decryptedDirectory &&
|
|
5993
|
+
(localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
|
|
5994
|
+
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
5859
5995
|
(rawLocalFilename.length != rawFilename.length ||
|
|
5860
5996
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
5861
5997
|
throwAmbiguousArchive("mismatched local file header (filename)");
|
|
@@ -5866,7 +6002,7 @@
|
|
|
5866
6002
|
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
5867
6003
|
throwAmbiguousArchive("mismatched local file header (compression method)");
|
|
5868
6004
|
}
|
|
5869
|
-
if (!localDirectory.bitFlag.dataDescriptor &&
|
|
6005
|
+
if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
|
|
5870
6006
|
(localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
5871
6007
|
(localDirectory.crc32 != zipEntry.crc32 ||
|
|
5872
6008
|
localDirectory.compressedSize != zipEntry.compressedSize ||
|
|
@@ -5885,10 +6021,11 @@
|
|
|
5885
6021
|
return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
|
|
5886
6022
|
}
|
|
5887
6023
|
|
|
5888
|
-
function
|
|
5889
|
-
return
|
|
6024
|
+
function getFunctionOptionValue$1(zipReader, options, name) {
|
|
6025
|
+
return checkFunctionOption(getOptionValue$1(zipReader, options, name));
|
|
5890
6026
|
}
|
|
5891
6027
|
|
|
6028
|
+
|
|
5892
6029
|
function getDate(timeRaw) {
|
|
5893
6030
|
const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
|
|
5894
6031
|
return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
|
|
@@ -5902,11 +6039,11 @@
|
|
|
5902
6039
|
return view.getUint8(offset);
|
|
5903
6040
|
}
|
|
5904
6041
|
|
|
5905
|
-
function getUint16(view, offset) {
|
|
6042
|
+
function getUint16$1(view, offset) {
|
|
5906
6043
|
return view.getUint16(offset, true);
|
|
5907
6044
|
}
|
|
5908
6045
|
|
|
5909
|
-
function getUint32(view, offset) {
|
|
6046
|
+
function getUint32$1(view, offset) {
|
|
5910
6047
|
return view.getUint32(offset, true);
|
|
5911
6048
|
}
|
|
5912
6049
|
|
|
@@ -5921,6 +6058,7 @@
|
|
|
5921
6058
|
ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
|
|
5922
6059
|
ERR_ENCRYPTED: ERR_ENCRYPTED,
|
|
5923
6060
|
ERR_ENCRYPTED_CENTRAL_DIRECTORY: ERR_ENCRYPTED_CENTRAL_DIRECTORY,
|
|
6061
|
+
ERR_ENTRY_DATA_OUT_OF_BOUNDS: ERR_ENTRY_DATA_OUT_OF_BOUNDS,
|
|
5924
6062
|
ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
|
|
5925
6063
|
ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
|
|
5926
6064
|
ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
|
|
@@ -5977,12 +6115,16 @@
|
|
|
5977
6115
|
const ERR_INVALID_COMMENT = "Zip file comment exceeds 64KB";
|
|
5978
6116
|
const ERR_INVALID_COMMENT_TYPE = "Invalid zip file comment (must be a Uint8Array)";
|
|
5979
6117
|
const ERR_INVALID_ENTRY_COMMENT = "File entry comment exceeds 64KB";
|
|
6118
|
+
const ERR_INVALID_ENTRY_COMMENT_TYPE = "Invalid file entry comment (must be a string)";
|
|
6119
|
+
const ERR_INVALID_DATE = "Invalid date (must be a valid Date instance)";
|
|
5980
6120
|
const ERR_INVALID_ENTRY_NAME = "File entry name exceeds 64KB";
|
|
5981
6121
|
const ERR_INVALID_VERSION = "Version exceeds 65535";
|
|
5982
6122
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
5983
6123
|
const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
|
|
5984
6124
|
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
|
|
5985
|
-
const
|
|
6125
|
+
const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
|
|
6126
|
+
const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
|
|
6127
|
+
const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
|
|
5986
6128
|
const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
|
|
5987
6129
|
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
5988
6130
|
const MIN_UNIX_TIME = -2147483648;
|
|
@@ -5991,6 +6133,7 @@
|
|
|
5991
6133
|
const MAX_NTFS_TIME = BigInt("0x7fffffffffffffff");
|
|
5992
6134
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
5993
6135
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
6136
|
+
const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
|
|
5994
6137
|
const ERR_UNDETERMINED_SIZE = "Undetermined size";
|
|
5995
6138
|
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
5996
6139
|
const ERR_ZIP_NOT_EMPTY = "Zip file not empty";
|
|
@@ -6002,7 +6145,6 @@
|
|
|
6002
6145
|
const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
|
|
6003
6146
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
6004
6147
|
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
6005
|
-
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
6006
6148
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
6007
6149
|
|
|
6008
6150
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
@@ -6027,8 +6169,7 @@
|
|
|
6027
6169
|
writer,
|
|
6028
6170
|
addSplitZipSignature,
|
|
6029
6171
|
options,
|
|
6030
|
-
|
|
6031
|
-
files: new Map(),
|
|
6172
|
+
fileEntries: new Map(),
|
|
6032
6173
|
filenames: new Set(),
|
|
6033
6174
|
offset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options[OPTION_OFFSET],
|
|
6034
6175
|
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
@@ -6049,14 +6190,23 @@
|
|
|
6049
6190
|
await initStream(reader);
|
|
6050
6191
|
}
|
|
6051
6192
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6052
|
-
const zipReader$1 = new ZipReader(reader
|
|
6193
|
+
const zipReader$1 = new ZipReader(reader);
|
|
6053
6194
|
const entries = await zipReader$1.getEntries();
|
|
6054
6195
|
await zipReader$1.close();
|
|
6055
6196
|
await initStream(this.writer);
|
|
6056
|
-
|
|
6057
|
-
|
|
6197
|
+
const { directoryOffset } = zipReader$1;
|
|
6198
|
+
let splitZipSignatureLength = 0;
|
|
6199
|
+
if (this.addSplitZipSignature) {
|
|
6200
|
+
delete this.addSplitZipSignature;
|
|
6201
|
+
if (!await startsWithSplitZipSignature(reader)) {
|
|
6202
|
+
await writeData(this.writer, getSplitZipSignatureArray());
|
|
6203
|
+
splitZipSignatureLength = SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6204
|
+
this.offset += splitZipSignatureLength;
|
|
6205
|
+
}
|
|
6206
|
+
}
|
|
6207
|
+
const entryPositions = await copyZipData(this, reader, entries, directoryOffset, splitZipSignatureLength);
|
|
6058
6208
|
this.filenames = new Set(entries.map(entry => entry.filename));
|
|
6059
|
-
this.
|
|
6209
|
+
this.fileEntries = new Map(entries.map(entry => {
|
|
6060
6210
|
const {
|
|
6061
6211
|
version,
|
|
6062
6212
|
rawLastModDate,
|
|
@@ -6111,11 +6261,12 @@
|
|
|
6111
6261
|
if (crc32 !== UNDEFINED_VALUE) {
|
|
6112
6262
|
setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
|
|
6113
6263
|
}
|
|
6264
|
+
const { offset, diskNumberStart } = entryPositions.get(entry);
|
|
6114
6265
|
Object.assign(entry, {
|
|
6115
6266
|
zip64UncompressedSize,
|
|
6116
6267
|
zip64CompressedSize,
|
|
6117
|
-
|
|
6118
|
-
diskNumberStart
|
|
6268
|
+
offset,
|
|
6269
|
+
diskNumberStart,
|
|
6119
6270
|
zip64DiskNumberStart: false,
|
|
6120
6271
|
rawExtraFieldZip64,
|
|
6121
6272
|
rawExtraFieldAES,
|
|
@@ -6135,11 +6286,8 @@
|
|
|
6135
6286
|
async add(name = "", reader, options = {}) {
|
|
6136
6287
|
const zipWriter = this;
|
|
6137
6288
|
options = Object.assign({}, options);
|
|
6138
|
-
const {
|
|
6139
|
-
|
|
6140
|
-
config
|
|
6141
|
-
} = zipWriter;
|
|
6142
|
-
if (workers < config.maxWorkers) {
|
|
6289
|
+
const { pendingAddFileCalls } = zipWriter;
|
|
6290
|
+
if (workers < getConfiguration().maxWorkers) {
|
|
6143
6291
|
workers++;
|
|
6144
6292
|
} else {
|
|
6145
6293
|
await new Promise(resolve => pendingEntries.push(resolve));
|
|
@@ -6176,16 +6324,16 @@
|
|
|
6176
6324
|
}
|
|
6177
6325
|
|
|
6178
6326
|
remove(entry) {
|
|
6179
|
-
const { filenames,
|
|
6327
|
+
const { filenames, fileEntries } = this;
|
|
6180
6328
|
// deno-lint-ignore valid-typeof
|
|
6181
6329
|
if (typeof entry == STRING_TYPE) {
|
|
6182
|
-
entry =
|
|
6330
|
+
entry = fileEntries.get(entry);
|
|
6183
6331
|
}
|
|
6184
6332
|
if (entry && entry.filename !== UNDEFINED_VALUE) {
|
|
6185
6333
|
const { filename } = entry;
|
|
6186
|
-
if (filenames.has(filename) &&
|
|
6334
|
+
if (filenames.has(filename) && fileEntries.has(filename)) {
|
|
6187
6335
|
filenames.delete(filename);
|
|
6188
|
-
|
|
6336
|
+
fileEntries.delete(filename);
|
|
6189
6337
|
return true;
|
|
6190
6338
|
}
|
|
6191
6339
|
}
|
|
@@ -6282,12 +6430,12 @@
|
|
|
6282
6430
|
const metadataInfo = resolveMetadata(zipWriter, name, options);
|
|
6283
6431
|
const { comment } = metadataInfo;
|
|
6284
6432
|
const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
|
|
6285
|
-
zipWriter.
|
|
6433
|
+
zipWriter.fileEntries.set(name, UNDEFINED_VALUE);
|
|
6286
6434
|
let fileEntry;
|
|
6287
6435
|
try {
|
|
6288
6436
|
const { resolvedOptions } = metadataInfo;
|
|
6289
6437
|
if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
|
|
6290
|
-
!resolvedOptions.passThrough && !(await supportsDeflate(
|
|
6438
|
+
!resolvedOptions.passThrough && !(await supportsDeflate(getConfiguration()))) {
|
|
6291
6439
|
resolvedOptions.level = 0;
|
|
6292
6440
|
}
|
|
6293
6441
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
@@ -6305,7 +6453,7 @@
|
|
|
6305
6453
|
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
6306
6454
|
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
6307
6455
|
} catch (error) {
|
|
6308
|
-
zipWriter.
|
|
6456
|
+
zipWriter.fileEntries.delete(name);
|
|
6309
6457
|
throw error;
|
|
6310
6458
|
}
|
|
6311
6459
|
Object.assign(fileEntry, {
|
|
@@ -6349,9 +6497,9 @@
|
|
|
6349
6497
|
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
6350
6498
|
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE$1;
|
|
6351
6499
|
}
|
|
6352
|
-
let msdosAttributesRaw =
|
|
6500
|
+
let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
6353
6501
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
6354
|
-
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType;
|
|
6502
|
+
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType || executable;
|
|
6355
6503
|
const hasMsDosProvided = msdosAttributesRaw !== UNDEFINED_VALUE || msdosAttributes !== UNDEFINED_VALUE;
|
|
6356
6504
|
if (hasUnixMetadata) {
|
|
6357
6505
|
msDosCompatible = false;
|
|
@@ -6360,10 +6508,10 @@
|
|
|
6360
6508
|
msDosCompatible = true;
|
|
6361
6509
|
versionMadeBy = (versionMadeBy & MAX_8_BITS);
|
|
6362
6510
|
}
|
|
6363
|
-
if (msdosAttributesRaw !== UNDEFINED_VALUE && (msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
|
|
6511
|
+
if (msdosAttributesRaw !== UNDEFINED_VALUE && (!Number.isInteger(msdosAttributesRaw) || msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
|
|
6364
6512
|
throw new Error(ERR_INVALID_MSDOS_ATTRIBUTES);
|
|
6365
6513
|
}
|
|
6366
|
-
if (msdosAttributes && typeof msdosAttributes !== OBJECT_TYPE) {
|
|
6514
|
+
if (msdosAttributes && (typeof msdosAttributes !== OBJECT_TYPE || Array.isArray(msdosAttributes))) {
|
|
6367
6515
|
throw new Error(ERR_INVALID_MSDOS_DATA);
|
|
6368
6516
|
}
|
|
6369
6517
|
if (versionMadeBy > MAX_16_BITS) {
|
|
@@ -6451,7 +6599,7 @@
|
|
|
6451
6599
|
}
|
|
6452
6600
|
|
|
6453
6601
|
function resolveMetadata(zipWriter, name, options) {
|
|
6454
|
-
const encode =
|
|
6602
|
+
const encode = getFunctionOptionValue(zipWriter, options, OPTION_ENCODE_TEXT) || encodeText;
|
|
6455
6603
|
let rawFilename = encode(name, TEXT_TYPE_FILENAME);
|
|
6456
6604
|
if (rawFilename === UNDEFINED_VALUE) {
|
|
6457
6605
|
rawFilename = encodeText(name);
|
|
@@ -6460,6 +6608,10 @@
|
|
|
6460
6608
|
throw new Error(ERR_INVALID_ENTRY_NAME);
|
|
6461
6609
|
}
|
|
6462
6610
|
const comment = options[PROPERTY_NAME_COMMENT] || "";
|
|
6611
|
+
// deno-lint-ignore valid-typeof
|
|
6612
|
+
if (typeof comment != STRING_TYPE) {
|
|
6613
|
+
throw new Error(ERR_INVALID_ENTRY_COMMENT_TYPE);
|
|
6614
|
+
}
|
|
6463
6615
|
let rawComment = encode(comment, TEXT_TYPE_COMMENT);
|
|
6464
6616
|
if (rawComment === UNDEFINED_VALUE) {
|
|
6465
6617
|
rawComment = encodeText(comment);
|
|
@@ -6471,16 +6623,14 @@
|
|
|
6471
6623
|
if (version > MAX_16_BITS) {
|
|
6472
6624
|
throw new Error(ERR_INVALID_VERSION);
|
|
6473
6625
|
}
|
|
6474
|
-
const lastModDate =
|
|
6475
|
-
const lastAccessDate =
|
|
6476
|
-
const creationDate =
|
|
6626
|
+
const lastModDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE, new Date());
|
|
6627
|
+
const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
|
|
6628
|
+
const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
|
|
6477
6629
|
const internalFileAttributes = getAliasedOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, PROPERTY_NAME_DEPRECATED_INTERNAL_FILE_ATTRIBUTES, 0);
|
|
6478
6630
|
const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
|
|
6479
6631
|
const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6480
6632
|
const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6481
|
-
|
|
6482
|
-
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
6483
|
-
}
|
|
6633
|
+
checkPasswordOption(password, rawPassword);
|
|
6484
6634
|
const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
|
|
6485
6635
|
const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
|
|
6486
6636
|
const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
|
|
@@ -6489,9 +6639,9 @@
|
|
|
6489
6639
|
const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
|
|
6490
6640
|
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
|
|
6491
6641
|
const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
|
|
6492
|
-
const createTempStream =
|
|
6642
|
+
const createTempStream = getFunctionOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
6493
6643
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
6494
|
-
const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
|
|
6644
|
+
const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
|
|
6495
6645
|
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
|
|
6496
6646
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
6497
6647
|
const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
@@ -6511,6 +6661,9 @@
|
|
|
6511
6661
|
level = 0;
|
|
6512
6662
|
}
|
|
6513
6663
|
}
|
|
6664
|
+
if (passThrough) {
|
|
6665
|
+
level = UNDEFINED_VALUE;
|
|
6666
|
+
}
|
|
6514
6667
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
6515
6668
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
6516
6669
|
if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
|
|
@@ -6571,18 +6724,26 @@
|
|
|
6571
6724
|
if (!extraField) {
|
|
6572
6725
|
return EMPTY_UINT8_ARRAY;
|
|
6573
6726
|
}
|
|
6727
|
+
if (!(extraField instanceof Map)) {
|
|
6728
|
+
throw new Error(ERR_INVALID_EXTRAFIELD);
|
|
6729
|
+
}
|
|
6574
6730
|
let extraFieldSize = 0;
|
|
6575
6731
|
let offset = 0;
|
|
6576
|
-
extraField.forEach(data => extraFieldSize += 4 + getLength(data));
|
|
6577
|
-
const rawExtraField = new Uint8Array(extraFieldSize);
|
|
6578
|
-
const rawExtraFieldView = getDataView(rawExtraField);
|
|
6579
6732
|
extraField.forEach((data, type) => {
|
|
6580
|
-
if (type > MAX_16_BITS) {
|
|
6733
|
+
if (!Number.isInteger(type) || type < 0 || type > MAX_16_BITS) {
|
|
6581
6734
|
throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
|
|
6582
6735
|
}
|
|
6736
|
+
if (!(data instanceof Uint8Array)) {
|
|
6737
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA_TYPE);
|
|
6738
|
+
}
|
|
6583
6739
|
if (getLength(data) > MAX_16_BITS) {
|
|
6584
6740
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
6585
6741
|
}
|
|
6742
|
+
extraFieldSize += 4 + getLength(data);
|
|
6743
|
+
});
|
|
6744
|
+
const rawExtraField = new Uint8Array(extraFieldSize);
|
|
6745
|
+
const rawExtraFieldView = getDataView(rawExtraField);
|
|
6746
|
+
extraField.forEach((data, type) => {
|
|
6586
6747
|
setUint16(rawExtraFieldView, offset, type);
|
|
6587
6748
|
setUint16(rawExtraFieldView, offset + 2, getLength(data));
|
|
6588
6749
|
arraySet(rawExtraField, data, offset + 4);
|
|
@@ -6614,6 +6775,9 @@
|
|
|
6614
6775
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
6615
6776
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
6616
6777
|
}
|
|
6778
|
+
if (compressionMethod === UNDEFINED_VALUE) {
|
|
6779
|
+
throw new Error(ERR_UNDEFINED_COMPRESSION_METHOD);
|
|
6780
|
+
}
|
|
6617
6781
|
}
|
|
6618
6782
|
const zip64Enabled = zip64 === true;
|
|
6619
6783
|
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
@@ -6669,8 +6833,8 @@
|
|
|
6669
6833
|
}
|
|
6670
6834
|
|
|
6671
6835
|
async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comment) {
|
|
6672
|
-
const zipWriter = { options: writerOptions
|
|
6673
|
-
if (writerOptions[OPTION_SIGN_CENTRAL_DIRECTORY]) {
|
|
6836
|
+
const zipWriter = { options: writerOptions };
|
|
6837
|
+
if (checkFunctionOption(writerOptions[OPTION_SIGN_CENTRAL_DIRECTORY])) {
|
|
6674
6838
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
6675
6839
|
}
|
|
6676
6840
|
if (comment !== UNDEFINED_VALUE && !(comment instanceof Uint8Array)) {
|
|
@@ -6696,7 +6860,7 @@
|
|
|
6696
6860
|
({ name } = attributesInfo);
|
|
6697
6861
|
const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
|
|
6698
6862
|
if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
|
|
6699
|
-
!metadata.passThrough && !(await supportsDeflate(
|
|
6863
|
+
!metadata.passThrough && !(await supportsDeflate(getConfiguration()))) {
|
|
6700
6864
|
metadata.level = 0;
|
|
6701
6865
|
}
|
|
6702
6866
|
const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
|
|
@@ -6745,7 +6909,7 @@
|
|
|
6745
6909
|
|
|
6746
6910
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
6747
6911
|
const {
|
|
6748
|
-
|
|
6912
|
+
fileEntries,
|
|
6749
6913
|
writer
|
|
6750
6914
|
} = zipWriter;
|
|
6751
6915
|
const {
|
|
@@ -6767,12 +6931,12 @@
|
|
|
6767
6931
|
let writerSizeBeforeEntry;
|
|
6768
6932
|
let flushedBufferedSize = 0;
|
|
6769
6933
|
let fileWriter;
|
|
6770
|
-
|
|
6934
|
+
fileEntries.set(name, fileEntry);
|
|
6771
6935
|
zipWriter.lastFileEntry = fileEntry;
|
|
6772
6936
|
try {
|
|
6773
6937
|
let lockPreviousFileEntry;
|
|
6774
6938
|
if (keepOrder) {
|
|
6775
|
-
lockPreviousFileEntry = previousFileEntry && previousFileEntry.
|
|
6939
|
+
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
|
|
6776
6940
|
requestLockCurrentFileEntry();
|
|
6777
6941
|
}
|
|
6778
6942
|
if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
|
|
@@ -6793,11 +6957,8 @@
|
|
|
6793
6957
|
const diskOffset = getDiskOffset(writer);
|
|
6794
6958
|
if (zipWriter.addSplitZipSignature) {
|
|
6795
6959
|
delete zipWriter.addSplitZipSignature;
|
|
6796
|
-
|
|
6797
|
-
|
|
6798
|
-
setUint32(signatureArrayView, 0, SPLIT_ZIP_FILE_SIGNATURE);
|
|
6799
|
-
await writeData(writer, signatureArray);
|
|
6800
|
-
zipWriter.offset += 4;
|
|
6960
|
+
await writeData(writer, getSplitZipSignatureArray());
|
|
6961
|
+
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6801
6962
|
}
|
|
6802
6963
|
if (usdz && !bufferedWrite) {
|
|
6803
6964
|
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
|
|
@@ -6815,11 +6976,11 @@
|
|
|
6815
6976
|
writerSizeBeforeEntry = writer.size;
|
|
6816
6977
|
await writeData(fileWriter, localHeaderArray);
|
|
6817
6978
|
}
|
|
6818
|
-
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo,
|
|
6979
|
+
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, getConfiguration(), options);
|
|
6819
6980
|
if (!bufferedWrite) {
|
|
6820
6981
|
writingEntryData = false;
|
|
6821
6982
|
}
|
|
6822
|
-
|
|
6983
|
+
fileEntries.set(name, fileEntry);
|
|
6823
6984
|
fileEntry.filename = name;
|
|
6824
6985
|
if (bufferedWrite) {
|
|
6825
6986
|
await Promise.all([fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
|
|
@@ -6860,7 +7021,7 @@
|
|
|
6860
7021
|
zipWriter.offset += flushedBufferedSize;
|
|
6861
7022
|
}
|
|
6862
7023
|
}
|
|
6863
|
-
|
|
7024
|
+
fileEntries.delete(name);
|
|
6864
7025
|
throw error;
|
|
6865
7026
|
} finally {
|
|
6866
7027
|
if (bufferedWrite) {
|
|
@@ -6882,7 +7043,7 @@
|
|
|
6882
7043
|
}
|
|
6883
7044
|
|
|
6884
7045
|
function requestLockCurrentFileEntry() {
|
|
6885
|
-
fileEntry.
|
|
7046
|
+
fileEntry.lockFileEntry = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
|
|
6886
7047
|
}
|
|
6887
7048
|
|
|
6888
7049
|
async function requestLockWriter() {
|
|
@@ -6902,7 +7063,7 @@
|
|
|
6902
7063
|
}
|
|
6903
7064
|
}
|
|
6904
7065
|
|
|
6905
|
-
async function createFileEntry(reader, writer, { diskNumberStart,
|
|
7066
|
+
async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry }, entryInfo, config, options) {
|
|
6906
7067
|
const {
|
|
6907
7068
|
headerInfo,
|
|
6908
7069
|
dataDescriptorInfo,
|
|
@@ -6970,7 +7131,7 @@
|
|
|
6970
7131
|
codecURI
|
|
6971
7132
|
} = options;
|
|
6972
7133
|
const fileEntry = {
|
|
6973
|
-
|
|
7134
|
+
lockFileEntry,
|
|
6974
7135
|
versionMadeBy,
|
|
6975
7136
|
zip64,
|
|
6976
7137
|
directory: Boolean(directory),
|
|
@@ -7012,7 +7173,7 @@
|
|
|
7012
7173
|
}
|
|
7013
7174
|
const { writable } = writer;
|
|
7014
7175
|
if (reader) {
|
|
7015
|
-
const readable = toCompatibleReadable(
|
|
7176
|
+
const readable = toCompatibleReadable(createReadable(reader));
|
|
7016
7177
|
const size = reader.size;
|
|
7017
7178
|
const workerOptions = {
|
|
7018
7179
|
options: {
|
|
@@ -7124,14 +7285,14 @@
|
|
|
7124
7285
|
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
7125
7286
|
const length = 4 + 16;
|
|
7126
7287
|
const extraFieldZip64 = createRecordWriter(length);
|
|
7127
|
-
extraFieldZip64.
|
|
7128
|
-
extraFieldZip64.
|
|
7288
|
+
extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
|
|
7289
|
+
extraFieldZip64.writeUint16(length - 4);
|
|
7129
7290
|
rawLocalExtraFieldZip64 = extraFieldZip64.array;
|
|
7130
7291
|
if (zip64ExtraFieldComplete) {
|
|
7131
|
-
extraFieldZip64.
|
|
7292
|
+
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7132
7293
|
if (uncompressedFile) {
|
|
7133
7294
|
const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
7134
|
-
extraFieldZip64.
|
|
7295
|
+
extraFieldZip64.writeUint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
|
|
7135
7296
|
}
|
|
7136
7297
|
}
|
|
7137
7298
|
} else {
|
|
@@ -7140,8 +7301,8 @@
|
|
|
7140
7301
|
let rawExtraFieldAES;
|
|
7141
7302
|
if (encrypted && !zipCrypto) {
|
|
7142
7303
|
const extraFieldAES = createRecordWriter(getLength(EXTRAFIELD_DATA_AES) + 2);
|
|
7143
|
-
extraFieldAES.
|
|
7144
|
-
extraFieldAES.
|
|
7304
|
+
extraFieldAES.writeUint16(EXTRAFIELD_TYPE_AES);
|
|
7305
|
+
extraFieldAES.writeBytes(EXTRAFIELD_DATA_AES);
|
|
7145
7306
|
rawExtraFieldAES = extraFieldAES.array;
|
|
7146
7307
|
rawExtraFieldAES[8] = encryptionStrength;
|
|
7147
7308
|
} else {
|
|
@@ -7157,15 +7318,15 @@
|
|
|
7157
7318
|
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
7158
7319
|
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
7159
7320
|
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
7160
|
-
extraFieldTimestamp.
|
|
7161
|
-
extraFieldTimestamp.
|
|
7162
|
-
extraFieldTimestamp.
|
|
7163
|
-
extraFieldTimestamp.
|
|
7321
|
+
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7322
|
+
extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
|
|
7323
|
+
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7324
|
+
extraFieldTimestamp.writeUint32(lastModTimeUnix);
|
|
7164
7325
|
if (lastAccessDate) {
|
|
7165
|
-
extraFieldTimestamp.
|
|
7326
|
+
extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(lastAccessDate)));
|
|
7166
7327
|
}
|
|
7167
7328
|
if (creationDate) {
|
|
7168
|
-
extraFieldTimestamp.
|
|
7329
|
+
extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(creationDate)));
|
|
7169
7330
|
}
|
|
7170
7331
|
rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
|
|
7171
7332
|
} else {
|
|
@@ -7178,14 +7339,14 @@
|
|
|
7178
7339
|
try {
|
|
7179
7340
|
const lastModTimeNTFS = getTimeNTFS(lastModDate);
|
|
7180
7341
|
const extraFieldNTFS = createRecordWriter(36);
|
|
7181
|
-
extraFieldNTFS.
|
|
7182
|
-
extraFieldNTFS.
|
|
7342
|
+
extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS);
|
|
7343
|
+
extraFieldNTFS.writeUint16(32);
|
|
7183
7344
|
extraFieldNTFS.skip(4);
|
|
7184
|
-
extraFieldNTFS.
|
|
7185
|
-
extraFieldNTFS.
|
|
7186
|
-
extraFieldNTFS.
|
|
7187
|
-
extraFieldNTFS.
|
|
7188
|
-
extraFieldNTFS.
|
|
7345
|
+
extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS_TAG1);
|
|
7346
|
+
extraFieldNTFS.writeUint16(24);
|
|
7347
|
+
extraFieldNTFS.writeUint64(lastModTimeNTFS);
|
|
7348
|
+
extraFieldNTFS.writeUint64(lastAccessDate ? getTimeNTFS(lastAccessDate) : lastModTimeNTFS);
|
|
7349
|
+
extraFieldNTFS.writeUint64(creationDate ? getTimeNTFS(creationDate) : lastModTimeNTFS);
|
|
7189
7350
|
rawExtraFieldNTFS = extraFieldNTFS.array;
|
|
7190
7351
|
} catch {
|
|
7191
7352
|
rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
|
|
@@ -7204,20 +7365,20 @@
|
|
|
7204
7365
|
const gidBytes = packUnixId(gid);
|
|
7205
7366
|
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
7206
7367
|
const extraFieldUnix = createRecordWriter(4 + payloadLength);
|
|
7207
|
-
extraFieldUnix.
|
|
7208
|
-
extraFieldUnix.
|
|
7209
|
-
extraFieldUnix.
|
|
7210
|
-
extraFieldUnix.
|
|
7211
|
-
extraFieldUnix.
|
|
7212
|
-
extraFieldUnix.
|
|
7213
|
-
extraFieldUnix.
|
|
7368
|
+
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_INFOZIP);
|
|
7369
|
+
extraFieldUnix.writeUint16(payloadLength);
|
|
7370
|
+
extraFieldUnix.writeUint8(1);
|
|
7371
|
+
extraFieldUnix.writeUint8(uidBytes.length);
|
|
7372
|
+
extraFieldUnix.writeBytes(uidBytes);
|
|
7373
|
+
extraFieldUnix.writeUint8(gidBytes.length);
|
|
7374
|
+
extraFieldUnix.writeBytes(gidBytes);
|
|
7214
7375
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
7215
7376
|
} else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
7216
7377
|
const extraFieldUnix = createRecordWriter(8);
|
|
7217
|
-
extraFieldUnix.
|
|
7218
|
-
extraFieldUnix.
|
|
7219
|
-
extraFieldUnix.
|
|
7220
|
-
extraFieldUnix.
|
|
7378
|
+
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
|
|
7379
|
+
extraFieldUnix.writeUint16(4);
|
|
7380
|
+
extraFieldUnix.writeUint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
|
|
7381
|
+
extraFieldUnix.writeUint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
|
|
7221
7382
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
7222
7383
|
} else {
|
|
7223
7384
|
rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
|
|
@@ -7267,18 +7428,18 @@
|
|
|
7267
7428
|
const localHeader = createRecordWriter(HEADER_SIZE + getLength(rawFilename) + extraFieldLength);
|
|
7268
7429
|
const localHeaderArray = localHeader.array;
|
|
7269
7430
|
const localHeaderView = getDataView(localHeaderArray);
|
|
7270
|
-
localHeader.
|
|
7271
|
-
localHeader.
|
|
7272
|
-
localHeader.
|
|
7431
|
+
localHeader.writeUint32(LOCAL_FILE_HEADER_SIGNATURE);
|
|
7432
|
+
localHeader.writeBytes(headerArray);
|
|
7433
|
+
localHeader.writeBytes(rawFilename);
|
|
7273
7434
|
if (writeLocalExtraFieldZip64) {
|
|
7274
|
-
localHeader.
|
|
7275
|
-
}
|
|
7276
|
-
localHeader.
|
|
7277
|
-
localHeader.
|
|
7278
|
-
localHeader.
|
|
7279
|
-
localHeader.
|
|
7280
|
-
localHeader.
|
|
7281
|
-
localHeader.
|
|
7435
|
+
localHeader.writeBytes(rawLocalExtraFieldZip64);
|
|
7436
|
+
}
|
|
7437
|
+
localHeader.writeBytes(rawExtraFieldAES);
|
|
7438
|
+
localHeader.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
7439
|
+
localHeader.writeBytes(rawExtraFieldNTFS);
|
|
7440
|
+
localHeader.writeBytes(rawExtraFieldUnix);
|
|
7441
|
+
localHeader.writeBytes(rawExtraField);
|
|
7442
|
+
localHeader.writeBytes(rawLocalExtraField);
|
|
7282
7443
|
if (dataDescriptor) {
|
|
7283
7444
|
if (!zip64CompressedSize) {
|
|
7284
7445
|
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
@@ -7468,7 +7629,7 @@
|
|
|
7468
7629
|
|
|
7469
7630
|
|
|
7470
7631
|
async function closeFile(zipWriter, comment, options) {
|
|
7471
|
-
const directoryDataLength = createDirectoryRecords(zipWriter.
|
|
7632
|
+
const directoryDataLength = createDirectoryRecords(zipWriter.fileEntries);
|
|
7472
7633
|
const { directoryStart, directoryArray } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
|
|
7473
7634
|
const signatureLength = await writeDigitalSignatureRecord(zipWriter, directoryArray, options);
|
|
7474
7635
|
await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength, signatureLength });
|
|
@@ -7498,19 +7659,19 @@
|
|
|
7498
7659
|
if (zip64Offset || zip64DiskNumberStart || zip64UncompressedSize || zip64CompressedSize) {
|
|
7499
7660
|
const length = 4 + (zip64UncompressedSize ? 8 : 0) + (zip64CompressedSize ? 8 : 0) + (zip64Offset ? 8 : 0) + (zip64DiskNumberStart ? 4 : 0);
|
|
7500
7661
|
const extraFieldZip64 = createRecordWriter(length);
|
|
7501
|
-
extraFieldZip64.
|
|
7502
|
-
extraFieldZip64.
|
|
7662
|
+
extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
|
|
7663
|
+
extraFieldZip64.writeUint16(length - 4);
|
|
7503
7664
|
if (zip64UncompressedSize) {
|
|
7504
|
-
extraFieldZip64.
|
|
7665
|
+
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7505
7666
|
}
|
|
7506
7667
|
if (zip64CompressedSize) {
|
|
7507
|
-
extraFieldZip64.
|
|
7668
|
+
extraFieldZip64.writeUint64(compressedSize);
|
|
7508
7669
|
}
|
|
7509
7670
|
if (zip64Offset) {
|
|
7510
|
-
extraFieldZip64.
|
|
7671
|
+
extraFieldZip64.writeUint64(fileEntry.offset);
|
|
7511
7672
|
}
|
|
7512
7673
|
if (zip64DiskNumberStart) {
|
|
7513
|
-
extraFieldZip64.
|
|
7674
|
+
extraFieldZip64.writeUint32(fileEntry.diskNumberStart);
|
|
7514
7675
|
}
|
|
7515
7676
|
rawExtraFieldZip64 = extraFieldZip64.array;
|
|
7516
7677
|
} else {
|
|
@@ -7523,10 +7684,10 @@
|
|
|
7523
7684
|
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
7524
7685
|
if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
|
|
7525
7686
|
const extraFieldTimestamp = createRecordWriter(9);
|
|
7526
|
-
extraFieldTimestamp.
|
|
7527
|
-
extraFieldTimestamp.
|
|
7528
|
-
extraFieldTimestamp.
|
|
7529
|
-
extraFieldTimestamp.
|
|
7687
|
+
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7688
|
+
extraFieldTimestamp.writeUint16(5);
|
|
7689
|
+
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7690
|
+
extraFieldTimestamp.writeUint32(lastModTimeUnix);
|
|
7530
7691
|
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
7531
7692
|
} else {
|
|
7532
7693
|
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
@@ -7548,14 +7709,14 @@
|
|
|
7548
7709
|
}
|
|
7549
7710
|
|
|
7550
7711
|
async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
7551
|
-
const {
|
|
7712
|
+
const { fileEntries, writer } = zipWriter;
|
|
7552
7713
|
const directoryArray = new Uint8Array(directoryDataLength);
|
|
7553
7714
|
await initStream(writer);
|
|
7554
7715
|
let offset = 0;
|
|
7555
7716
|
let directoryDiskOffset = 0;
|
|
7556
7717
|
let directoryStartDiskNumber = getDiskNumber(writer);
|
|
7557
7718
|
let directoryStartDiskOffset = getDiskOffset(writer);
|
|
7558
|
-
for (const [indexFileEntry, fileEntry] of Array.from(
|
|
7719
|
+
for (const [indexFileEntry, fileEntry] of Array.from(fileEntries.values()).entries()) {
|
|
7559
7720
|
const {
|
|
7560
7721
|
offset: fileEntryOffset,
|
|
7561
7722
|
rawFilename,
|
|
@@ -7600,28 +7761,28 @@
|
|
|
7600
7761
|
setUint16(headerView, HEADER_OFFSET_VERSION, VERSION_ZIP64);
|
|
7601
7762
|
}
|
|
7602
7763
|
const directoryRecord = createRecordWriter(directoryRecordLength);
|
|
7603
|
-
directoryRecord.
|
|
7604
|
-
directoryRecord.
|
|
7605
|
-
directoryRecord.
|
|
7606
|
-
directoryRecord.
|
|
7607
|
-
directoryRecord.
|
|
7608
|
-
directoryRecord.
|
|
7609
|
-
directoryRecord.
|
|
7610
|
-
directoryRecord.
|
|
7611
|
-
directoryRecord.
|
|
7612
|
-
directoryRecord.
|
|
7613
|
-
directoryRecord.
|
|
7614
|
-
directoryRecord.
|
|
7615
|
-
directoryRecord.
|
|
7616
|
-
directoryRecord.
|
|
7617
|
-
directoryRecord.
|
|
7618
|
-
directoryRecord.
|
|
7619
|
-
directoryRecord.
|
|
7764
|
+
directoryRecord.writeUint32(CENTRAL_FILE_HEADER_SIGNATURE);
|
|
7765
|
+
directoryRecord.writeUint16(versionMadeBy);
|
|
7766
|
+
directoryRecord.writeBytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
|
|
7767
|
+
directoryRecord.writeUint16(extraFieldLength);
|
|
7768
|
+
directoryRecord.writeUint16(getLength(rawComment));
|
|
7769
|
+
directoryRecord.writeUint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
|
|
7770
|
+
directoryRecord.writeUint16(internalFileAttributes);
|
|
7771
|
+
directoryRecord.writeUint32(externalFileAttributes);
|
|
7772
|
+
directoryRecord.writeUint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
|
|
7773
|
+
directoryRecord.writeBytes(rawFilename);
|
|
7774
|
+
directoryRecord.writeBytes(rawExtraFieldZip64);
|
|
7775
|
+
directoryRecord.writeBytes(rawExtraFieldAES);
|
|
7776
|
+
directoryRecord.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
7777
|
+
directoryRecord.writeBytes(rawExtraFieldNTFS);
|
|
7778
|
+
directoryRecord.writeBytes(rawExtraFieldUnix);
|
|
7779
|
+
directoryRecord.writeBytes(rawExtraField);
|
|
7780
|
+
directoryRecord.writeBytes(rawComment);
|
|
7620
7781
|
arraySet(directoryArray, directoryRecord.array, offset);
|
|
7621
7782
|
offset += directoryRecordLength;
|
|
7622
7783
|
if (options.onprogress) {
|
|
7623
7784
|
try {
|
|
7624
|
-
await options.onprogress(indexFileEntry + 1,
|
|
7785
|
+
await options.onprogress(indexFileEntry + 1, fileEntries.size, new Entry(fileEntry));
|
|
7625
7786
|
} catch {
|
|
7626
7787
|
// ignored
|
|
7627
7788
|
}
|
|
@@ -7635,7 +7796,7 @@
|
|
|
7635
7796
|
}
|
|
7636
7797
|
|
|
7637
7798
|
async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
|
|
7638
|
-
const signCentralDirectory =
|
|
7799
|
+
const signCentralDirectory = getFunctionOptionValue(zipWriter, options, OPTION_SIGN_CENTRAL_DIRECTORY);
|
|
7639
7800
|
if (signCentralDirectory) {
|
|
7640
7801
|
const signatureData = await signCentralDirectory(directoryArray);
|
|
7641
7802
|
const signatureDataLength = getLength(signatureData);
|
|
@@ -7643,9 +7804,9 @@
|
|
|
7643
7804
|
throw new Error(ERR_INVALID_SIGNATURE_DATA);
|
|
7644
7805
|
}
|
|
7645
7806
|
const signatureRecord = createRecordWriter(6 + signatureDataLength);
|
|
7646
|
-
signatureRecord.
|
|
7647
|
-
signatureRecord.
|
|
7648
|
-
signatureRecord.
|
|
7807
|
+
signatureRecord.writeUint32(DIGITAL_SIGNATURE_RECORD_SIGNATURE);
|
|
7808
|
+
signatureRecord.writeUint16(signatureDataLength);
|
|
7809
|
+
signatureRecord.writeBytes(signatureData);
|
|
7649
7810
|
await writeData(zipWriter.writer, signatureRecord.array);
|
|
7650
7811
|
return 6 + signatureDataLength;
|
|
7651
7812
|
}
|
|
@@ -7656,7 +7817,7 @@
|
|
|
7656
7817
|
const { writer } = zipWriter;
|
|
7657
7818
|
const { directoryStart, signatureLength } = cdInfo;
|
|
7658
7819
|
let { directoryDataLength } = cdInfo;
|
|
7659
|
-
let
|
|
7820
|
+
let fileEntriesLength = zipWriter.fileEntries.size;
|
|
7660
7821
|
let diskNumber = directoryStart.diskNumber;
|
|
7661
7822
|
let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
|
|
7662
7823
|
let lastDiskNumber = getDiskNumber(writer);
|
|
@@ -7664,7 +7825,7 @@
|
|
|
7664
7825
|
lastDiskNumber++;
|
|
7665
7826
|
}
|
|
7666
7827
|
let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
7667
|
-
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS ||
|
|
7828
|
+
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || fileEntriesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
|
|
7668
7829
|
if (zip64 === false) {
|
|
7669
7830
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
7670
7831
|
} else {
|
|
@@ -7681,37 +7842,37 @@
|
|
|
7681
7842
|
}
|
|
7682
7843
|
lastDiskNumber = getDiskNumber(writer);
|
|
7683
7844
|
if (zip64) {
|
|
7684
|
-
endOfdirectoryRecord.
|
|
7685
|
-
endOfdirectoryRecord.
|
|
7686
|
-
endOfdirectoryRecord.
|
|
7687
|
-
endOfdirectoryRecord.
|
|
7688
|
-
endOfdirectoryRecord.
|
|
7689
|
-
endOfdirectoryRecord.
|
|
7690
|
-
endOfdirectoryRecord.
|
|
7691
|
-
endOfdirectoryRecord.
|
|
7692
|
-
endOfdirectoryRecord.
|
|
7693
|
-
endOfdirectoryRecord.
|
|
7694
|
-
endOfdirectoryRecord.
|
|
7695
|
-
endOfdirectoryRecord.
|
|
7696
|
-
endOfdirectoryRecord.
|
|
7697
|
-
endOfdirectoryRecord.
|
|
7845
|
+
endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
|
|
7846
|
+
endOfdirectoryRecord.writeUint64(44);
|
|
7847
|
+
endOfdirectoryRecord.writeUint16(45);
|
|
7848
|
+
endOfdirectoryRecord.writeUint16(45);
|
|
7849
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber);
|
|
7850
|
+
endOfdirectoryRecord.writeUint32(diskNumber);
|
|
7851
|
+
endOfdirectoryRecord.writeUint64(fileEntriesLength);
|
|
7852
|
+
endOfdirectoryRecord.writeUint64(fileEntriesLength);
|
|
7853
|
+
endOfdirectoryRecord.writeUint64(directoryDataLength);
|
|
7854
|
+
endOfdirectoryRecord.writeUint64(directoryOffset);
|
|
7855
|
+
endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
|
|
7856
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber);
|
|
7857
|
+
endOfdirectoryRecord.writeUint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength) + BigInt(signatureLength));
|
|
7858
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber + 1);
|
|
7698
7859
|
const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
|
|
7699
7860
|
if (supportZip64SplitFile) {
|
|
7700
7861
|
lastDiskNumber = MAX_16_BITS;
|
|
7701
7862
|
diskNumber = MAX_16_BITS;
|
|
7702
7863
|
}
|
|
7703
|
-
|
|
7864
|
+
fileEntriesLength = MAX_16_BITS;
|
|
7704
7865
|
directoryOffset = MAX_32_BITS;
|
|
7705
7866
|
directoryDataLength = MAX_32_BITS;
|
|
7706
7867
|
}
|
|
7707
|
-
endOfdirectoryRecord.
|
|
7708
|
-
endOfdirectoryRecord.
|
|
7709
|
-
endOfdirectoryRecord.
|
|
7710
|
-
endOfdirectoryRecord.
|
|
7711
|
-
endOfdirectoryRecord.
|
|
7712
|
-
endOfdirectoryRecord.
|
|
7713
|
-
endOfdirectoryRecord.
|
|
7714
|
-
endOfdirectoryRecord.
|
|
7868
|
+
endOfdirectoryRecord.writeUint32(END_OF_CENTRAL_DIR_SIGNATURE);
|
|
7869
|
+
endOfdirectoryRecord.writeUint16(lastDiskNumber);
|
|
7870
|
+
endOfdirectoryRecord.writeUint16(diskNumber);
|
|
7871
|
+
endOfdirectoryRecord.writeUint16(fileEntriesLength);
|
|
7872
|
+
endOfdirectoryRecord.writeUint16(fileEntriesLength);
|
|
7873
|
+
endOfdirectoryRecord.writeUint32(directoryDataLength);
|
|
7874
|
+
endOfdirectoryRecord.writeUint32(directoryOffset);
|
|
7875
|
+
endOfdirectoryRecord.writeUint16(commentLength);
|
|
7715
7876
|
await writeData(writer, endOfdirectoryRecord.array);
|
|
7716
7877
|
if (commentLength) {
|
|
7717
7878
|
await writeData(writer, comment);
|
|
@@ -7724,11 +7885,11 @@
|
|
|
7724
7885
|
let offset = 0;
|
|
7725
7886
|
return {
|
|
7726
7887
|
array,
|
|
7727
|
-
|
|
7728
|
-
|
|
7729
|
-
|
|
7730
|
-
|
|
7731
|
-
|
|
7888
|
+
writeUint8: value => { setUint8(view, offset, value); offset += 1; },
|
|
7889
|
+
writeUint16: value => { setUint16(view, offset, value); offset += 2; },
|
|
7890
|
+
writeUint32: value => { setUint32(view, offset, value); offset += 4; },
|
|
7891
|
+
writeUint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
|
|
7892
|
+
writeBytes: value => { arraySet(array, value, offset); offset += getLength(value); },
|
|
7732
7893
|
skip: count => offset += count
|
|
7733
7894
|
};
|
|
7734
7895
|
}
|
|
@@ -7752,6 +7913,71 @@
|
|
|
7752
7913
|
return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
|
|
7753
7914
|
}
|
|
7754
7915
|
|
|
7916
|
+
async function startsWithSplitZipSignature(reader) {
|
|
7917
|
+
const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
7918
|
+
return getUint32(getDataView(signatureArray), 0) == SPLIT_ZIP_FILE_SIGNATURE;
|
|
7919
|
+
}
|
|
7920
|
+
|
|
7921
|
+
async function copyZipData(zipWriter, reader, entries, directoryOffset, splitZipSignatureLength) {
|
|
7922
|
+
const { writer } = zipWriter;
|
|
7923
|
+
const entryPositions = new Map();
|
|
7924
|
+
if (writer.closeDisk) {
|
|
7925
|
+
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
7926
|
+
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
7927
|
+
let copiedLength = 0;
|
|
7928
|
+
for (const entry of sortedEntries) {
|
|
7929
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
7930
|
+
await copyData(zipWriter, reader, copiedLength, sourceOffset - copiedLength);
|
|
7931
|
+
if (exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
7932
|
+
await writer.closeDisk();
|
|
7933
|
+
}
|
|
7934
|
+
entryPositions.set(entry, {
|
|
7935
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
7936
|
+
diskNumberStart: getDiskNumber(writer)
|
|
7937
|
+
});
|
|
7938
|
+
copiedLength = sourceOffset;
|
|
7939
|
+
}
|
|
7940
|
+
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
7941
|
+
} else {
|
|
7942
|
+
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
7943
|
+
entries.forEach(entry => entryPositions.set(entry, {
|
|
7944
|
+
offset: splitZipSignatureLength + getSourceOffset(reader, entry),
|
|
7945
|
+
diskNumberStart: 0
|
|
7946
|
+
}));
|
|
7947
|
+
}
|
|
7948
|
+
return entryPositions;
|
|
7949
|
+
}
|
|
7950
|
+
|
|
7951
|
+
async function copyData(zipWriter, reader, offset, size) {
|
|
7952
|
+
if (size > 0) {
|
|
7953
|
+
const { writer } = zipWriter;
|
|
7954
|
+
await createReadable(reader, { offset, size }).pipeTo(writer.writable, { preventClose: true, preventAbort: true });
|
|
7955
|
+
writer.size += size;
|
|
7956
|
+
zipWriter.offset += size;
|
|
7957
|
+
}
|
|
7958
|
+
}
|
|
7959
|
+
|
|
7960
|
+
async function getLocalHeaderLength(reader, offset) {
|
|
7961
|
+
const headerArray = await readUint8Array(reader, offset, HEADER_SIZE);
|
|
7962
|
+
if (getLength(headerArray) < HEADER_SIZE) {
|
|
7963
|
+
return HEADER_SIZE;
|
|
7964
|
+
}
|
|
7965
|
+
const headerView = getDataView(headerArray);
|
|
7966
|
+
return HEADER_SIZE +
|
|
7967
|
+
getUint16(headerView, HEADER_OFFSET_FILENAME_LENGTH + LOCAL_HEADER_COMMON_OFFSET) +
|
|
7968
|
+
getUint16(headerView, HEADER_OFFSET_EXTRAFIELD_LENGTH + LOCAL_HEADER_COMMON_OFFSET);
|
|
7969
|
+
}
|
|
7970
|
+
|
|
7971
|
+
function getSourceOffset(reader, { offset, diskNumberStart }) {
|
|
7972
|
+
return offset + (reader.getDiskOffset ? reader.getDiskOffset(diskNumberStart) : 0);
|
|
7973
|
+
}
|
|
7974
|
+
|
|
7975
|
+
function getSplitZipSignatureArray() {
|
|
7976
|
+
const signatureArray = new Uint8Array(SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
7977
|
+
setUint32(getDataView(signatureArray), 0, SPLIT_ZIP_FILE_SIGNATURE);
|
|
7978
|
+
return signatureArray;
|
|
7979
|
+
}
|
|
7980
|
+
|
|
7755
7981
|
async function writeData(writer, array) {
|
|
7756
7982
|
const { writable } = writer;
|
|
7757
7983
|
const streamWriter = writable.getWriter();
|
|
@@ -7803,6 +8029,21 @@
|
|
|
7803
8029
|
return result === UNDEFINED_VALUE ? defaultValue : result;
|
|
7804
8030
|
}
|
|
7805
8031
|
|
|
8032
|
+
function getDateOptionValue(zipWriter, options, name, defaultValue) {
|
|
8033
|
+
const date = getOptionValue(zipWriter, options, name, defaultValue);
|
|
8034
|
+
if (date === null) {
|
|
8035
|
+
return defaultValue;
|
|
8036
|
+
}
|
|
8037
|
+
if (date !== UNDEFINED_VALUE && (typeof date.getTime != FUNCTION_TYPE || Number.isNaN(date.getTime()))) {
|
|
8038
|
+
throw new Error(ERR_INVALID_DATE);
|
|
8039
|
+
}
|
|
8040
|
+
return date;
|
|
8041
|
+
}
|
|
8042
|
+
|
|
8043
|
+
function getFunctionOptionValue(zipWriter, options, name) {
|
|
8044
|
+
return checkFunctionOption(getOptionValue(zipWriter, options, name));
|
|
8045
|
+
}
|
|
8046
|
+
|
|
7806
8047
|
function getAliasedOptionValue(zipWriter, options, name, deprecatedName, defaultValue) {
|
|
7807
8048
|
const value = getAliasedValue(options, name, deprecatedName);
|
|
7808
8049
|
const result = value === UNDEFINED_VALUE ? getAliasedValue(zipWriter.options, name, deprecatedName) : value;
|
|
@@ -7817,9 +8058,6 @@
|
|
|
7817
8058
|
return toNumber(getOptionValue(zipWriter, options, name, defaultValue));
|
|
7818
8059
|
}
|
|
7819
8060
|
|
|
7820
|
-
function toNumber(value) {
|
|
7821
|
-
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
7822
|
-
}
|
|
7823
8061
|
|
|
7824
8062
|
function getMaximumCompressedSize(uncompressedSize) {
|
|
7825
8063
|
return uncompressedSize + (5 * (Math.floor(uncompressedSize / 16383) + 1));
|
|
@@ -7831,6 +8069,14 @@
|
|
|
7831
8069
|
: compressionMethod !== COMPRESSION_METHOD_STORE;
|
|
7832
8070
|
}
|
|
7833
8071
|
|
|
8072
|
+
function getUint16(view, offset) {
|
|
8073
|
+
return view.getUint16(offset, true);
|
|
8074
|
+
}
|
|
8075
|
+
|
|
8076
|
+
function getUint32(view, offset) {
|
|
8077
|
+
return view.getUint32(offset, true);
|
|
8078
|
+
}
|
|
8079
|
+
|
|
7834
8080
|
function setUint8(view, offset, value) {
|
|
7835
8081
|
view.setUint8(offset, value);
|
|
7836
8082
|
}
|
|
@@ -7874,9 +8120,9 @@
|
|
|
7874
8120
|
const headerRecord = createRecordWriter(HEADER_SIZE - 4);
|
|
7875
8121
|
const headerArray = headerRecord.array;
|
|
7876
8122
|
const headerView = getDataView(headerArray);
|
|
7877
|
-
headerRecord.
|
|
7878
|
-
headerRecord.
|
|
7879
|
-
headerRecord.
|
|
8123
|
+
headerRecord.writeUint16(version);
|
|
8124
|
+
headerRecord.writeUint16(bitFlag);
|
|
8125
|
+
headerRecord.writeUint16(compressionMethod);
|
|
7880
8126
|
if (rawLastModDate === UNDEFINED_VALUE) {
|
|
7881
8127
|
const dateArray = new Uint32Array(1);
|
|
7882
8128
|
const dateView = getDataView(dateArray);
|
|
@@ -7884,20 +8130,20 @@
|
|
|
7884
8130
|
setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
|
|
7885
8131
|
rawLastModDate = dateArray[0];
|
|
7886
8132
|
}
|
|
7887
|
-
headerRecord.
|
|
8133
|
+
headerRecord.writeUint32(rawLastModDate);
|
|
7888
8134
|
headerRecord.skip(4);
|
|
7889
8135
|
if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
|
|
7890
|
-
headerRecord.
|
|
8136
|
+
headerRecord.writeUint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
|
|
7891
8137
|
} else {
|
|
7892
8138
|
headerRecord.skip(4);
|
|
7893
8139
|
}
|
|
7894
8140
|
if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
|
|
7895
|
-
headerRecord.
|
|
8141
|
+
headerRecord.writeUint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
|
|
7896
8142
|
} else {
|
|
7897
8143
|
headerRecord.skip(4);
|
|
7898
8144
|
}
|
|
7899
|
-
headerRecord.
|
|
7900
|
-
headerRecord.
|
|
8145
|
+
headerRecord.writeUint16(getLength(rawFilename));
|
|
8146
|
+
headerRecord.writeUint16(extraFieldLength);
|
|
7901
8147
|
return {
|
|
7902
8148
|
headerArray,
|
|
7903
8149
|
headerView,
|
|
@@ -8410,7 +8656,7 @@
|
|
|
8410
8656
|
// ignored
|
|
8411
8657
|
}
|
|
8412
8658
|
|
|
8413
|
-
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)});}
|
|
8659
|
+
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)});}
|
|
8414
8660
|
|
|
8415
8661
|
/*
|
|
8416
8662
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -8845,6 +9091,7 @@
|
|
|
8845
9091
|
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
8846
9092
|
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
8847
9093
|
const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
|
|
9094
|
+
const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
|
|
8848
9095
|
const ERR_ABORT_EXPORT = "zipjs-abort-export";
|
|
8849
9096
|
const ERR_ABORTED = "The operation was aborted";
|
|
8850
9097
|
const ABORT_ERROR_NAME = "AbortError";
|
|
@@ -8877,13 +9124,14 @@
|
|
|
8877
9124
|
fs,
|
|
8878
9125
|
name,
|
|
8879
9126
|
data: params.data,
|
|
8880
|
-
options: params.options,
|
|
9127
|
+
options: params.options && Object.assign({}, params.options),
|
|
8881
9128
|
id: fs.entryIdCounter++,
|
|
8882
9129
|
parent,
|
|
8883
9130
|
children: [],
|
|
8884
9131
|
uncompressedSize: params.uncompressedSize || 0,
|
|
8885
9132
|
undeterminedSize: params.undeterminedSize || params.uncompressedSize === UNDEFINED_VALUE,
|
|
8886
|
-
passThrough: params.passThrough
|
|
9133
|
+
passThrough: params.passThrough,
|
|
9134
|
+
defaultLastModDate: params.defaultLastModDate || new Date()
|
|
8887
9135
|
});
|
|
8888
9136
|
if (parent || !fs.root) {
|
|
8889
9137
|
fs.entries[zipEntry.id] = zipEntry;
|
|
@@ -8893,12 +9141,6 @@
|
|
|
8893
9141
|
}
|
|
8894
9142
|
}
|
|
8895
9143
|
|
|
8896
|
-
moveTo(target) {
|
|
8897
|
-
// deprecated
|
|
8898
|
-
const zipEntry = this;
|
|
8899
|
-
zipEntry.fs.move(zipEntry, target);
|
|
8900
|
-
}
|
|
8901
|
-
|
|
8902
9144
|
getFullname() {
|
|
8903
9145
|
return this.getRelativeName();
|
|
8904
9146
|
}
|
|
@@ -8930,6 +9172,11 @@
|
|
|
8930
9172
|
this.name = name;
|
|
8931
9173
|
}
|
|
8932
9174
|
}
|
|
9175
|
+
|
|
9176
|
+
setOptions(options) {
|
|
9177
|
+
const entryOptions = Object.assign({}, this.options, options);
|
|
9178
|
+
this.options = Object.fromEntries(Object.entries(entryOptions).filter(([, value]) => value !== UNDEFINED_VALUE));
|
|
9179
|
+
}
|
|
8933
9180
|
}
|
|
8934
9181
|
|
|
8935
9182
|
class ZipFileEntry extends ZipEntry {
|
|
@@ -8956,7 +9203,7 @@
|
|
|
8956
9203
|
const reader = zipEntry.reader = createReader(zipEntry.Reader, zipEntry.data, options);
|
|
8957
9204
|
const dataSize = zipEntry.uncompressedSize || reader.size;
|
|
8958
9205
|
await Promise.all([initStream(reader), initStream(writer, dataSize)]);
|
|
8959
|
-
const
|
|
9206
|
+
const signal = checkSignalOption(options.signal);
|
|
8960
9207
|
const readable = createProgressReadable(zipEntry, reader, options, signal);
|
|
8961
9208
|
const preventClose = !ownsWritable(writer) && Boolean(options.preventClose);
|
|
8962
9209
|
zipEntry.uncompressedSize = reader.size;
|
|
@@ -9174,10 +9421,6 @@
|
|
|
9174
9421
|
});
|
|
9175
9422
|
}
|
|
9176
9423
|
|
|
9177
|
-
addData(name, params) {
|
|
9178
|
-
return addChild(this, name, params);
|
|
9179
|
-
}
|
|
9180
|
-
|
|
9181
9424
|
importBlob(blob, options) {
|
|
9182
9425
|
return this.importZip(new BlobReader(blob), options);
|
|
9183
9426
|
}
|
|
@@ -9291,7 +9534,7 @@
|
|
|
9291
9534
|
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
9292
9535
|
options.bufferedWrite = true;
|
|
9293
9536
|
}
|
|
9294
|
-
const [readers] = await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
|
|
9537
|
+
const [readers] = await Promise.all([initReaders(zipEntry, checkReaderOptions(options.readerOptions)), initStream(writer)]);
|
|
9295
9538
|
const zipWriter = new ZipWriter(writer, options);
|
|
9296
9539
|
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
|
|
9297
9540
|
await zipWriter.close(options.globalComment);
|
|
@@ -9301,12 +9544,13 @@
|
|
|
9301
9544
|
getExportedSize(options = {}) {
|
|
9302
9545
|
const zipEntry = this;
|
|
9303
9546
|
options = Object.assign({}, options);
|
|
9547
|
+
checkReaderOptions(options.readerOptions);
|
|
9304
9548
|
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
9305
9549
|
options.bufferedWrite = true;
|
|
9306
9550
|
}
|
|
9307
9551
|
const writeOrderGuaranteed = !options.bufferedWrite ||
|
|
9308
9552
|
(options.keepOrder !== false && zipEntry.children.every(child => !child.children.length));
|
|
9309
|
-
return getEntriesSize(options,
|
|
9553
|
+
return getEntriesSize(options, zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
|
|
9310
9554
|
const { name, entryOptions } = getChildEntryOptions(child, zipEntry, options);
|
|
9311
9555
|
return { name, size: child.directory ? 0 : getDeterminedSize(child, isPassThrough(child, options)), options: entryOptions };
|
|
9312
9556
|
}), writeOrderGuaranteed, options.globalComment);
|
|
@@ -9345,7 +9589,7 @@
|
|
|
9345
9589
|
}
|
|
9346
9590
|
|
|
9347
9591
|
|
|
9348
|
-
class
|
|
9592
|
+
class ZipFS {
|
|
9349
9593
|
|
|
9350
9594
|
constructor() {
|
|
9351
9595
|
resetFS(this);
|
|
@@ -9461,10 +9705,6 @@
|
|
|
9461
9705
|
return this.root.addFile(file, options);
|
|
9462
9706
|
}
|
|
9463
9707
|
|
|
9464
|
-
addData(name, params) {
|
|
9465
|
-
return this.root.addData(name, params);
|
|
9466
|
-
}
|
|
9467
|
-
|
|
9468
9708
|
importBlob(blob, options) {
|
|
9469
9709
|
resetFS(this);
|
|
9470
9710
|
return this.root.importBlob(blob, options);
|
|
@@ -9532,7 +9772,7 @@
|
|
|
9532
9772
|
}
|
|
9533
9773
|
}
|
|
9534
9774
|
|
|
9535
|
-
const fs = { FS, ZipDirectoryEntry, ZipFileEntry };
|
|
9775
|
+
const fs = { FS: ZipFS, ZipDirectoryEntry, ZipFileEntry };
|
|
9536
9776
|
|
|
9537
9777
|
function getTotalSize(entries, getEntrySize) {
|
|
9538
9778
|
let size = 0;
|
|
@@ -9676,7 +9916,7 @@
|
|
|
9676
9916
|
}
|
|
9677
9917
|
|
|
9678
9918
|
function forwardAbort(signal, abortController) {
|
|
9679
|
-
if (!signal) {
|
|
9919
|
+
if (!checkSignalOption(signal)) {
|
|
9680
9920
|
return () => { };
|
|
9681
9921
|
}
|
|
9682
9922
|
if (signal.aborted) {
|
|
@@ -9753,10 +9993,7 @@
|
|
|
9753
9993
|
});
|
|
9754
9994
|
}
|
|
9755
9995
|
if (isPassThrough(child, options)) {
|
|
9756
|
-
let
|
|
9757
|
-
if (compressionMethod === 0) {
|
|
9758
|
-
level = 0;
|
|
9759
|
-
}
|
|
9996
|
+
let encryptionStrength;
|
|
9760
9997
|
if (extraFieldAES) {
|
|
9761
9998
|
encryptionStrength = extraFieldAES.strength;
|
|
9762
9999
|
}
|
|
@@ -9766,13 +10003,12 @@
|
|
|
9766
10003
|
zipCrypto,
|
|
9767
10004
|
crc32,
|
|
9768
10005
|
uncompressedSize,
|
|
9769
|
-
level,
|
|
9770
10006
|
encryptionStrength,
|
|
9771
10007
|
compressionMethod
|
|
9772
10008
|
};
|
|
9773
10009
|
}
|
|
9774
10010
|
}
|
|
9775
|
-
const entryOptions = Object.assign({}, zipEntryMetadata, options,
|
|
10011
|
+
const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
|
|
9776
10012
|
if (!child.directory && entryOptions.passThrough && entryOptions.uncompressedSize === UNDEFINED_VALUE) {
|
|
9777
10013
|
throw new Error(ERR_INVALID_PASS_THROUGH);
|
|
9778
10014
|
}
|
|
@@ -9787,11 +10023,22 @@
|
|
|
9787
10023
|
return child.undeterminedSize ? UNDEFINED_VALUE : getExtractedSize(child, passThrough);
|
|
9788
10024
|
}
|
|
9789
10025
|
|
|
10026
|
+
function checkReaderOptions(readerOptions) {
|
|
10027
|
+
if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
|
|
10028
|
+
throw new Error(ERR_INVALID_READER_OPTIONS);
|
|
10029
|
+
}
|
|
10030
|
+
return readerOptions;
|
|
10031
|
+
}
|
|
10032
|
+
|
|
9790
10033
|
function isPassThrough(child, options) {
|
|
9791
10034
|
const { readerOptions } = options;
|
|
9792
10035
|
return Boolean(!child.directory && (child.passThrough || (readerOptions && readerOptions.passThrough)));
|
|
9793
10036
|
}
|
|
9794
10037
|
|
|
10038
|
+
function isImplicitDirectory(child) {
|
|
10039
|
+
return child.directory && child.data === null;
|
|
10040
|
+
}
|
|
10041
|
+
|
|
9795
10042
|
function getUserExtraField(extraField) {
|
|
9796
10043
|
if (extraField) {
|
|
9797
10044
|
const userExtraField = new Map();
|
|
@@ -9809,7 +10056,7 @@
|
|
|
9809
10056
|
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
9810
10057
|
const { onstart, onprogress, onend, onentryprogress } = options;
|
|
9811
10058
|
const selectedEntry = entry;
|
|
9812
|
-
const totalEntries = getTotalSize(entry.children, ()
|
|
10059
|
+
const totalEntries = getTotalSize(entry.children, child => isImplicitDirectory(child) ? 0 : 1);
|
|
9813
10060
|
let writtenSize = 0;
|
|
9814
10061
|
let writtenEntries = 0;
|
|
9815
10062
|
if (onstart) {
|
|
@@ -9838,6 +10085,9 @@
|
|
|
9838
10085
|
}
|
|
9839
10086
|
|
|
9840
10087
|
async function addChild(child) {
|
|
10088
|
+
if (isImplicitDirectory(child)) {
|
|
10089
|
+
return;
|
|
10090
|
+
}
|
|
9841
10091
|
const { name, entryOptions } = getChildEntryOptions(child, selectedEntry, options);
|
|
9842
10092
|
let entryWrittenSize = 0;
|
|
9843
10093
|
const entryMetadata = await zipWriter.add(name, readers.get(child), Object.assign(entryOptions, {
|
|
@@ -9871,7 +10121,7 @@
|
|
|
9871
10121
|
if (handle.kind == "file") {
|
|
9872
10122
|
const file = await handle.getFile();
|
|
9873
10123
|
addedEntries.push(
|
|
9874
|
-
parentEntry
|
|
10124
|
+
addChild(parentEntry, file.name, {
|
|
9875
10125
|
Reader: function () {
|
|
9876
10126
|
const readable = file.stream();
|
|
9877
10127
|
const size = file.size;
|
|
@@ -9905,10 +10155,11 @@
|
|
|
9905
10155
|
|
|
9906
10156
|
async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
9907
10157
|
const { onstart, onprogress, onend } = options;
|
|
10158
|
+
const readerOptions = checkReaderOptions(options.readerOptions);
|
|
9908
10159
|
const abortController = new AbortController();
|
|
9909
10160
|
const { signal } = abortController;
|
|
9910
10161
|
const releaseSignal = forwardAbort(options.signal, abortController);
|
|
9911
|
-
const getDataOptions = Object.assign({}, options,
|
|
10162
|
+
const getDataOptions = Object.assign({}, options, readerOptions, {
|
|
9912
10163
|
signal,
|
|
9913
10164
|
onstart: UNDEFINED_VALUE,
|
|
9914
10165
|
onprogress: UNDEFINED_VALUE,
|
|
@@ -10208,6 +10459,7 @@
|
|
|
10208
10459
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
10209
10460
|
exports.ERR_ENCRYPTED = ERR_ENCRYPTED;
|
|
10210
10461
|
exports.ERR_ENCRYPTED_CENTRAL_DIRECTORY = ERR_ENCRYPTED_CENTRAL_DIRECTORY;
|
|
10462
|
+
exports.ERR_ENTRY_DATA_OUT_OF_BOUNDS = ERR_ENTRY_DATA_OUT_OF_BOUNDS;
|
|
10211
10463
|
exports.ERR_ENTRY_EXISTS = ERR_ENTRY_EXISTS;
|
|
10212
10464
|
exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
|
|
10213
10465
|
exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
|
|
@@ -10221,20 +10473,28 @@
|
|
|
10221
10473
|
exports.ERR_INVALID_COMMENT_TYPE = ERR_INVALID_COMMENT_TYPE;
|
|
10222
10474
|
exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
|
|
10223
10475
|
exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
|
|
10476
|
+
exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
|
|
10224
10477
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
10225
10478
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
10479
|
+
exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
|
|
10226
10480
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
10481
|
+
exports.ERR_INVALID_EXTRAFIELD = ERR_INVALID_EXTRAFIELD;
|
|
10227
10482
|
exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
|
|
10483
|
+
exports.ERR_INVALID_EXTRAFIELD_DATA_TYPE = ERR_INVALID_EXTRAFIELD_DATA_TYPE;
|
|
10228
10484
|
exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
|
|
10229
10485
|
exports.ERR_INVALID_FILENAME_VALIDATION = ERR_INVALID_FILENAME_VALIDATION;
|
|
10486
|
+
exports.ERR_INVALID_FUNCTION_OPTION = ERR_INVALID_FUNCTION_OPTION;
|
|
10230
10487
|
exports.ERR_INVALID_GID = ERR_INVALID_GID;
|
|
10231
10488
|
exports.ERR_INVALID_LEVEL = ERR_INVALID_LEVEL;
|
|
10232
10489
|
exports.ERR_INVALID_MAX_APPENDED_DATA_SIZE = ERR_INVALID_MAX_APPENDED_DATA_SIZE;
|
|
10490
|
+
exports.ERR_INVALID_MAX_WORKERS = ERR_INVALID_MAX_WORKERS;
|
|
10233
10491
|
exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
|
|
10234
10492
|
exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
|
|
10235
10493
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
10236
10494
|
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
10237
10495
|
exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
|
|
10496
|
+
exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
|
|
10497
|
+
exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
|
|
10238
10498
|
exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
|
|
10239
10499
|
exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
|
|
10240
10500
|
exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
|
|
@@ -10250,6 +10510,7 @@
|
|
|
10250
10510
|
exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
|
|
10251
10511
|
exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
10252
10512
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
10513
|
+
exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
|
|
10253
10514
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
10254
10515
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
10255
10516
|
exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
|
|
@@ -10274,6 +10535,10 @@
|
|
|
10274
10535
|
exports.Uint8ArrayReader = Uint8ArrayReader;
|
|
10275
10536
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
10276
10537
|
exports.Writer = Writer;
|
|
10538
|
+
exports.ZipDirectoryEntry = ZipDirectoryEntry;
|
|
10539
|
+
exports.ZipEntry = ZipEntry;
|
|
10540
|
+
exports.ZipFS = ZipFS;
|
|
10541
|
+
exports.ZipFileEntry = ZipFileEntry;
|
|
10277
10542
|
exports.ZipReader = ZipReader;
|
|
10278
10543
|
exports.ZipReaderStream = ZipReaderStream;
|
|
10279
10544
|
exports.ZipWriter = ZipWriter;
|