@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/index.cjs
CHANGED
|
@@ -39,6 +39,7 @@ const COMPRESSION_METHOD_AES = 0x63;
|
|
|
39
39
|
|
|
40
40
|
const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
|
|
41
41
|
const SPLIT_ZIP_FILE_SIGNATURE = 0x08074b50;
|
|
42
|
+
const TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE = 0x30304b50;
|
|
42
43
|
const DATA_DESCRIPTOR_RECORD_SIGNATURE = SPLIT_ZIP_FILE_SIGNATURE;
|
|
43
44
|
const ARCHIVE_EXTRA_DATA_SIGNATURE = 0x08064b50;
|
|
44
45
|
const DIGITAL_SIGNATURE_RECORD_SIGNATURE = 0x05054b50;
|
|
@@ -55,6 +56,7 @@ const ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH = END_OF_CENTRAL_DIR_LENGTH + ZIP64_
|
|
|
55
56
|
const DATA_DESCRIPTOR_RECORD_LENGTH = 12;
|
|
56
57
|
const DATA_DESCRIPTOR_RECORD_ZIP_64_LENGTH = 20;
|
|
57
58
|
const DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH = 4;
|
|
59
|
+
const SPLIT_ZIP_FILE_SIGNATURE_LENGTH = 4;
|
|
58
60
|
|
|
59
61
|
const EXTRAFIELD_TYPE_ZIP64 = 0x0001;
|
|
60
62
|
const EXTRAFIELD_TYPE_AES = 0x9901;
|
|
@@ -77,6 +79,7 @@ const BITFLAG_LEVEL_SUPER_FAST_MASK = 0b110;
|
|
|
77
79
|
const BITFLAG_DATA_DESCRIPTOR = 0b1000;
|
|
78
80
|
const BITFLAG_STRONG_ENCRYPTION = 0b1000000;
|
|
79
81
|
const BITFLAG_LANG_ENCODING_FLAG = 0b100000000000;
|
|
82
|
+
const BITFLAG_MASKED_LOCAL_HEADERS = 0b10000000000000;
|
|
80
83
|
const FILE_ATTR_MSDOS_DIR_MASK = 0b10000;
|
|
81
84
|
const FILE_ATTR_MSDOS_READONLY_MASK = 0x01;
|
|
82
85
|
const FILE_ATTR_MSDOS_HIDDEN_MASK = 0x02;
|
|
@@ -106,6 +109,8 @@ const HEADER_OFFSET_VERSION = 0;
|
|
|
106
109
|
const HEADER_OFFSET_SIGNATURE = 10;
|
|
107
110
|
const HEADER_OFFSET_COMPRESSED_SIZE = 14;
|
|
108
111
|
const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
|
|
112
|
+
const HEADER_OFFSET_FILENAME_LENGTH = 22;
|
|
113
|
+
const HEADER_OFFSET_EXTRAFIELD_LENGTH = 24;
|
|
109
114
|
const LOCAL_HEADER_COMMON_OFFSET = 4;
|
|
110
115
|
|
|
111
116
|
const MAX_DATE = new Date(2107, 11, 31, 23, 59, 58);
|
|
@@ -118,9 +123,116 @@ const FUNCTION_TYPE = "function";
|
|
|
118
123
|
const OBJECT_TYPE = "object";
|
|
119
124
|
const STRING_TYPE = "string";
|
|
120
125
|
const NUMBER_TYPE = "number";
|
|
126
|
+
const BOOLEAN_TYPE = "boolean";
|
|
121
127
|
|
|
122
128
|
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
123
129
|
|
|
130
|
+
/*
|
|
131
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
132
|
+
|
|
133
|
+
Redistribution and use in source and binary forms, with or without
|
|
134
|
+
modification, are permitted provided that the following conditions are met:
|
|
135
|
+
|
|
136
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
137
|
+
this list of conditions and the following disclaimer.
|
|
138
|
+
|
|
139
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
140
|
+
notice, this list of conditions and the following disclaimer in
|
|
141
|
+
the documentation and/or other materials provided with the distribution.
|
|
142
|
+
|
|
143
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
144
|
+
derived from this software without specific prior written permission.
|
|
145
|
+
|
|
146
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
147
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
148
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
149
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
150
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
151
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
152
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
153
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
154
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
155
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
156
|
+
*/
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
const OPTION_FILENAME_ENCODING = "filenameEncoding";
|
|
160
|
+
const OPTION_COMMENT_ENCODING = "commentEncoding";
|
|
161
|
+
const OPTION_DECODE_TEXT = "decodeText";
|
|
162
|
+
const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
|
|
163
|
+
const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
|
|
164
|
+
const OPTION_PASSWORD = "password";
|
|
165
|
+
const OPTION_RAW_PASSWORD = "rawPassword";
|
|
166
|
+
const OPTION_PASS_THROUGH = "passThrough";
|
|
167
|
+
const OPTION_SIGNAL = "signal";
|
|
168
|
+
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
169
|
+
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
170
|
+
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
171
|
+
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
172
|
+
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
173
|
+
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
174
|
+
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
175
|
+
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
176
|
+
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
177
|
+
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
178
|
+
const OPTION_TRANSFER_STREAMS = "transferStreams";
|
|
179
|
+
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
180
|
+
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
181
|
+
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
182
|
+
const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
|
|
183
|
+
const OPTION_KEEP_ORDER = "keepOrder";
|
|
184
|
+
const OPTION_LEVEL = "level";
|
|
185
|
+
const OPTION_BUFFERED_WRITE = "bufferedWrite";
|
|
186
|
+
const OPTION_CREATE_TEMP_STREAM = "createTempStream";
|
|
187
|
+
const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
|
|
188
|
+
const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
|
|
189
|
+
const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
|
|
190
|
+
const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
|
|
191
|
+
const OPTION_ENCODE_TEXT = "encodeText";
|
|
192
|
+
const OPTION_OFFSET = "offset";
|
|
193
|
+
const OPTION_USDZ = "usdz";
|
|
194
|
+
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
195
|
+
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
196
|
+
const OPTION_STRICTNESS = "strictness";
|
|
197
|
+
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
198
|
+
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
199
|
+
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
200
|
+
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
201
|
+
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
202
|
+
const TEXT_TYPE_FILENAME = "filename";
|
|
203
|
+
const TEXT_TYPE_COMMENT = "comment";
|
|
204
|
+
const STRICTNESS_STRICT = "strict";
|
|
205
|
+
const STRICTNESS_BALANCED = "balanced";
|
|
206
|
+
const STRICTNESS_TOLERANT = "tolerant";
|
|
207
|
+
|
|
208
|
+
const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
|
|
209
|
+
const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
|
|
210
|
+
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
211
|
+
|
|
212
|
+
function checkFunctionOption(value) {
|
|
213
|
+
if (value && typeof value != FUNCTION_TYPE) {
|
|
214
|
+
throw new Error(ERR_INVALID_FUNCTION_OPTION);
|
|
215
|
+
}
|
|
216
|
+
return value;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function checkSignalOption(signal) {
|
|
220
|
+
if (signal && (typeof signal.addEventListener != FUNCTION_TYPE || typeof signal.aborted != BOOLEAN_TYPE)) {
|
|
221
|
+
throw new Error(ERR_INVALID_SIGNAL);
|
|
222
|
+
}
|
|
223
|
+
return signal || UNDEFINED_VALUE;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function checkPasswordOption(password, rawPassword) {
|
|
227
|
+
if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
|
|
228
|
+
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function toNumber(value) {
|
|
233
|
+
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
234
|
+
}
|
|
235
|
+
|
|
124
236
|
/*
|
|
125
237
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
126
238
|
|
|
@@ -150,7 +262,10 @@ const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
|
150
262
|
*/
|
|
151
263
|
|
|
152
264
|
|
|
265
|
+
const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
|
|
153
266
|
const MINIMUM_CHUNK_SIZE = 64;
|
|
267
|
+
const MINIMUM_PROPERTY_VALUE = 1;
|
|
268
|
+
const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
|
|
154
269
|
let maxWorkers = 2;
|
|
155
270
|
try {
|
|
156
271
|
if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
|
|
@@ -162,7 +277,7 @@ try {
|
|
|
162
277
|
const DEFAULT_CONFIGURATION = {
|
|
163
278
|
workerURI: "./core/web-worker-wasm.js",
|
|
164
279
|
wasmURI: "./core/streams/zlib-wasm/zlib-streams.wasm",
|
|
165
|
-
chunkSize:
|
|
280
|
+
chunkSize: DEFAULT_CHUNK_SIZE$1,
|
|
166
281
|
maxWorkers,
|
|
167
282
|
terminateWorkerTimeout: 5000,
|
|
168
283
|
workerStarvationTimeout: 5000,
|
|
@@ -174,24 +289,38 @@ const DEFAULT_CONFIGURATION = {
|
|
|
174
289
|
DecompressionStream: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream
|
|
175
290
|
};
|
|
176
291
|
|
|
177
|
-
const
|
|
292
|
+
const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
|
|
293
|
+
|
|
294
|
+
const STRING_PROPERTY_NAMES = [
|
|
178
295
|
"baseURI",
|
|
179
296
|
"wasmURI",
|
|
180
|
-
"workerURI"
|
|
181
|
-
|
|
297
|
+
"workerURI"
|
|
298
|
+
];
|
|
299
|
+
const BOOLEAN_PROPERTY_NAMES = [
|
|
300
|
+
"useCompressionStream",
|
|
301
|
+
"useWebWorkers",
|
|
302
|
+
"transferStreams"
|
|
303
|
+
];
|
|
304
|
+
const NUMBER_PROPERTY_NAMES = [
|
|
182
305
|
"chunkSize",
|
|
183
|
-
|
|
306
|
+
PROPERTY_NAME_MAX_WORKERS,
|
|
184
307
|
"terminateWorkerTimeout",
|
|
185
308
|
"workerStarvationTimeout",
|
|
186
|
-
"workerStartupTimeout"
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
"
|
|
309
|
+
"workerStartupTimeout"
|
|
310
|
+
];
|
|
311
|
+
const FUNCTION_PROPERTY_NAMES = [
|
|
312
|
+
"createWorker",
|
|
190
313
|
"CompressionStream",
|
|
191
314
|
"DecompressionStream",
|
|
192
315
|
"CompressionStreamFallback",
|
|
193
316
|
"DecompressionStreamFallback"
|
|
194
317
|
];
|
|
318
|
+
const CONFIGURABLE_PROPERTY_NAMES = [
|
|
319
|
+
...STRING_PROPERTY_NAMES,
|
|
320
|
+
...BOOLEAN_PROPERTY_NAMES,
|
|
321
|
+
...NUMBER_PROPERTY_NAMES,
|
|
322
|
+
...FUNCTION_PROPERTY_NAMES
|
|
323
|
+
];
|
|
195
324
|
|
|
196
325
|
const config = { ...DEFAULT_CONFIGURATION };
|
|
197
326
|
|
|
@@ -200,20 +329,43 @@ function getConfiguration() {
|
|
|
200
329
|
}
|
|
201
330
|
|
|
202
331
|
function getChunkSize(config) {
|
|
203
|
-
return
|
|
332
|
+
return normalizeChunkSize(config.chunkSize);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function normalizeChunkSize(chunkSize) {
|
|
336
|
+
chunkSize = toNumber(chunkSize);
|
|
337
|
+
return Number.isInteger(chunkSize) && chunkSize >= MINIMUM_PROPERTY_VALUE ? Math.max(chunkSize, MINIMUM_CHUNK_SIZE) : DEFAULT_CHUNK_SIZE$1;
|
|
204
338
|
}
|
|
205
339
|
|
|
206
340
|
function configure(configuration) {
|
|
207
|
-
|
|
341
|
+
Object.assign(config, checkConfiguration(normalizeConfiguration(configuration)));
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
function checkConfiguration(configuration) {
|
|
345
|
+
const checkedConfiguration = {};
|
|
208
346
|
for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
|
|
209
347
|
const propertyValue = configuration[propertyName];
|
|
210
348
|
if (propertyValue !== UNDEFINED_VALUE) {
|
|
211
|
-
|
|
349
|
+
checkedConfiguration[propertyName] = checkPropertyValue(propertyName, propertyValue);
|
|
212
350
|
}
|
|
213
351
|
}
|
|
352
|
+
return checkedConfiguration;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function checkPropertyValue(propertyName, propertyValue) {
|
|
356
|
+
if (NUMBER_PROPERTY_NAMES.includes(propertyName)) {
|
|
357
|
+
propertyValue = toNumber(propertyValue);
|
|
358
|
+
if (propertyName == PROPERTY_NAME_MAX_WORKERS && (!Number.isInteger(propertyValue) || propertyValue < MINIMUM_PROPERTY_VALUE)) {
|
|
359
|
+
throw new Error(ERR_INVALID_MAX_WORKERS);
|
|
360
|
+
}
|
|
361
|
+
} else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
|
|
362
|
+
checkFunctionOption(propertyValue);
|
|
363
|
+
}
|
|
364
|
+
return propertyValue;
|
|
214
365
|
}
|
|
215
366
|
|
|
216
367
|
function normalizeConfiguration(configuration) {
|
|
368
|
+
configuration = configuration || {};
|
|
217
369
|
const { CompressionStreamZlib, DecompressionStreamZlib } = configuration;
|
|
218
370
|
if (CompressionStreamZlib === UNDEFINED_VALUE && DecompressionStreamZlib === UNDEFINED_VALUE) {
|
|
219
371
|
return configuration;
|
|
@@ -229,14 +381,9 @@ function normalizeConfiguration(configuration) {
|
|
|
229
381
|
}
|
|
230
382
|
|
|
231
383
|
function setDefaultConfiguration(configuration) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
if (propertyValue !== UNDEFINED_VALUE) {
|
|
236
|
-
DEFAULT_CONFIGURATION[propertyName] = propertyValue;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
configure(configuration);
|
|
384
|
+
const checkedConfiguration = checkConfiguration(normalizeConfiguration(configuration));
|
|
385
|
+
Object.assign(DEFAULT_CONFIGURATION, checkedConfiguration);
|
|
386
|
+
Object.assign(config, checkedConfiguration);
|
|
240
387
|
}
|
|
241
388
|
|
|
242
389
|
function resetConfiguration() {
|
|
@@ -246,7 +393,7 @@ function resetConfiguration() {
|
|
|
246
393
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
247
394
|
}
|
|
248
395
|
|
|
249
|
-
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)}});
|
|
396
|
+
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)}});
|
|
250
397
|
|
|
251
398
|
/*
|
|
252
399
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -1394,13 +1541,13 @@ class AESDecryptionStream extends TransformStream {
|
|
|
1394
1541
|
const {
|
|
1395
1542
|
ctr,
|
|
1396
1543
|
hmac,
|
|
1397
|
-
|
|
1544
|
+
pendingInput,
|
|
1398
1545
|
ready
|
|
1399
1546
|
} = this;
|
|
1400
1547
|
if (hmac && ctr) {
|
|
1401
1548
|
await ready;
|
|
1402
|
-
const chunkToDecrypt = subarray(
|
|
1403
|
-
const originalAuthenticationCode = subarray(
|
|
1549
|
+
const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1550
|
+
const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1404
1551
|
let decryptedChunkArray = EMPTY_UINT8_ARRAY;
|
|
1405
1552
|
if (chunkToDecrypt.length) {
|
|
1406
1553
|
const encryptedChunk = toBits(codecBytes, chunkToDecrypt);
|
|
@@ -1409,7 +1556,7 @@ class AESDecryptionStream extends TransformStream {
|
|
|
1409
1556
|
decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
|
|
1410
1557
|
}
|
|
1411
1558
|
const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
|
|
1412
|
-
let invalidAuthenticationCode =
|
|
1559
|
+
let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
|
|
1413
1560
|
for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
|
|
1414
1561
|
invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
|
|
1415
1562
|
}
|
|
@@ -1453,14 +1600,14 @@ class AESEncryptionStream extends TransformStream {
|
|
|
1453
1600
|
const {
|
|
1454
1601
|
ctr,
|
|
1455
1602
|
hmac,
|
|
1456
|
-
|
|
1603
|
+
pendingInput,
|
|
1457
1604
|
ready
|
|
1458
1605
|
} = this;
|
|
1459
1606
|
if (hmac && ctr) {
|
|
1460
1607
|
await ready;
|
|
1461
1608
|
let encryptedChunkArray = EMPTY_UINT8_ARRAY;
|
|
1462
|
-
if (
|
|
1463
|
-
const encryptedChunk = ctr.update(toBits(codecBytes,
|
|
1609
|
+
if (pendingInput.length) {
|
|
1610
|
+
const encryptedChunk = ctr.update(toBits(codecBytes, pendingInput));
|
|
1464
1611
|
hmac.update(encryptedChunk);
|
|
1465
1612
|
encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
|
|
1466
1613
|
}
|
|
@@ -1477,7 +1624,7 @@ function initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength) {
|
|
|
1477
1624
|
ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
|
|
1478
1625
|
password: encodePassword(password, rawPassword),
|
|
1479
1626
|
strength: encryptionStrength - 1,
|
|
1480
|
-
|
|
1627
|
+
pendingInput: EMPTY_UINT8_ARRAY
|
|
1481
1628
|
});
|
|
1482
1629
|
}
|
|
1483
1630
|
|
|
@@ -1485,10 +1632,10 @@ function append(aesCrypto, input, output, paddingStart, paddingEnd, verifyAuthen
|
|
|
1485
1632
|
const {
|
|
1486
1633
|
ctr,
|
|
1487
1634
|
hmac,
|
|
1488
|
-
|
|
1635
|
+
pendingInput
|
|
1489
1636
|
} = aesCrypto;
|
|
1490
|
-
if (
|
|
1491
|
-
input = concat(
|
|
1637
|
+
if (pendingInput.length) {
|
|
1638
|
+
input = concat(pendingInput, input);
|
|
1492
1639
|
}
|
|
1493
1640
|
const inputLength = input.length - paddingEnd;
|
|
1494
1641
|
output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
|
|
@@ -1504,7 +1651,7 @@ function append(aesCrypto, input, output, paddingStart, paddingEnd, verifyAuthen
|
|
|
1504
1651
|
}
|
|
1505
1652
|
output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
|
|
1506
1653
|
}
|
|
1507
|
-
aesCrypto.
|
|
1654
|
+
aesCrypto.pendingInput = subarray(input, offset);
|
|
1508
1655
|
return output;
|
|
1509
1656
|
}
|
|
1510
1657
|
|
|
@@ -3281,6 +3428,96 @@ async function terminateWorkers() {
|
|
|
3281
3428
|
resetWebWorkerSupport();
|
|
3282
3429
|
}
|
|
3283
3430
|
|
|
3431
|
+
/*
|
|
3432
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
3433
|
+
|
|
3434
|
+
Redistribution and use in source and binary forms, with or without
|
|
3435
|
+
modification, are permitted provided that the following conditions are met:
|
|
3436
|
+
|
|
3437
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
3438
|
+
this list of conditions and the following disclaimer.
|
|
3439
|
+
|
|
3440
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
3441
|
+
notice, this list of conditions and the following disclaimer in
|
|
3442
|
+
the documentation and/or other materials provided with the distribution.
|
|
3443
|
+
|
|
3444
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
3445
|
+
derived from this software without specific prior written permission.
|
|
3446
|
+
|
|
3447
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
3448
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
3449
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
3450
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
3451
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
3452
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
3453
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
3454
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
3455
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
3456
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
3457
|
+
*/
|
|
3458
|
+
|
|
3459
|
+
/* global TextDecoder */
|
|
3460
|
+
|
|
3461
|
+
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
3462
|
+
const VALID_CP437 = CP437.length == 256;
|
|
3463
|
+
|
|
3464
|
+
function decodeCP437(stringValue) {
|
|
3465
|
+
if (VALID_CP437) {
|
|
3466
|
+
let result = "";
|
|
3467
|
+
for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
|
|
3468
|
+
result += CP437[stringValue[indexCharacter]];
|
|
3469
|
+
}
|
|
3470
|
+
return result;
|
|
3471
|
+
} else {
|
|
3472
|
+
return new TextDecoder().decode(stringValue);
|
|
3473
|
+
}
|
|
3474
|
+
}
|
|
3475
|
+
|
|
3476
|
+
/*
|
|
3477
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
3478
|
+
|
|
3479
|
+
Redistribution and use in source and binary forms, with or without
|
|
3480
|
+
modification, are permitted provided that the following conditions are met:
|
|
3481
|
+
|
|
3482
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
3483
|
+
this list of conditions and the following disclaimer.
|
|
3484
|
+
|
|
3485
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
3486
|
+
notice, this list of conditions and the following disclaimer in
|
|
3487
|
+
the documentation and/or other materials provided with the distribution.
|
|
3488
|
+
|
|
3489
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
3490
|
+
derived from this software without specific prior written permission.
|
|
3491
|
+
|
|
3492
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
3493
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
3494
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
3495
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
3496
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
3497
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
3498
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
3499
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
3500
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
3501
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
3502
|
+
*/
|
|
3503
|
+
|
|
3504
|
+
|
|
3505
|
+
function decodeText(value, encoding) {
|
|
3506
|
+
return decode(value, encoding, true);
|
|
3507
|
+
}
|
|
3508
|
+
|
|
3509
|
+
function decodeTextRemovingBOM(value, encoding) {
|
|
3510
|
+
return decode(value, encoding, false);
|
|
3511
|
+
}
|
|
3512
|
+
|
|
3513
|
+
function decode(value, encoding, ignoreBOM) {
|
|
3514
|
+
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
3515
|
+
return decodeCP437(value);
|
|
3516
|
+
} else {
|
|
3517
|
+
return new TextDecoder(encoding, { ignoreBOM }).decode(value);
|
|
3518
|
+
}
|
|
3519
|
+
}
|
|
3520
|
+
|
|
3284
3521
|
/*
|
|
3285
3522
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
3286
3523
|
|
|
@@ -3353,6 +3590,7 @@ class Reader extends Stream {
|
|
|
3353
3590
|
createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
|
|
3354
3591
|
const reader = this;
|
|
3355
3592
|
let chunkOffset = 0;
|
|
3593
|
+
chunkSize = normalizeChunkSize(chunkSize);
|
|
3356
3594
|
return new ReadableStream({
|
|
3357
3595
|
async pull(controller) {
|
|
3358
3596
|
const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
|
|
@@ -3360,7 +3598,7 @@ class Reader extends Stream {
|
|
|
3360
3598
|
if (data.length) {
|
|
3361
3599
|
controller.enqueue(data);
|
|
3362
3600
|
}
|
|
3363
|
-
if ((chunkOffset + chunkSize >= size) || (
|
|
3601
|
+
if ((chunkOffset + chunkSize >= size) || (!data.length && dataSize)) {
|
|
3364
3602
|
controller.close();
|
|
3365
3603
|
} else {
|
|
3366
3604
|
chunkOffset += chunkSize;
|
|
@@ -3440,31 +3678,31 @@ class Data64URIWriter extends Writer {
|
|
|
3440
3678
|
Object.assign(this, {
|
|
3441
3679
|
contentType,
|
|
3442
3680
|
data: "data:" + (contentType || "") + ";base64,",
|
|
3443
|
-
|
|
3681
|
+
pendingCharacters: ""
|
|
3444
3682
|
});
|
|
3445
3683
|
}
|
|
3446
3684
|
|
|
3447
3685
|
writeUint8Array(array) {
|
|
3448
3686
|
const writer = this;
|
|
3449
3687
|
let indexArray;
|
|
3450
|
-
let dataString = writer.
|
|
3451
|
-
const delta = writer.
|
|
3452
|
-
writer.
|
|
3688
|
+
let dataString = writer.pendingCharacters;
|
|
3689
|
+
const delta = writer.pendingCharacters.length;
|
|
3690
|
+
writer.pendingCharacters = "";
|
|
3453
3691
|
for (indexArray = 0; indexArray < (Math.floor((delta + array.length) / 3) * 3) - delta; indexArray++) {
|
|
3454
3692
|
dataString += String.fromCharCode(array[indexArray]);
|
|
3455
3693
|
}
|
|
3456
3694
|
for (; indexArray < array.length; indexArray++) {
|
|
3457
|
-
writer.
|
|
3695
|
+
writer.pendingCharacters += String.fromCharCode(array[indexArray]);
|
|
3458
3696
|
}
|
|
3459
3697
|
if (dataString.length > 2) {
|
|
3460
3698
|
writer.data += btoa(dataString);
|
|
3461
3699
|
} else {
|
|
3462
|
-
writer.
|
|
3700
|
+
writer.pendingCharacters = dataString + writer.pendingCharacters;
|
|
3463
3701
|
}
|
|
3464
3702
|
}
|
|
3465
3703
|
|
|
3466
3704
|
getData() {
|
|
3467
|
-
return this.data + btoa(this.
|
|
3705
|
+
return this.data + btoa(this.pendingCharacters);
|
|
3468
3706
|
}
|
|
3469
3707
|
}
|
|
3470
3708
|
|
|
@@ -3494,7 +3732,7 @@ class BlobReader extends Reader {
|
|
|
3494
3732
|
constructor(blob) {
|
|
3495
3733
|
super();
|
|
3496
3734
|
Object.assign(this, {
|
|
3497
|
-
blob,
|
|
3735
|
+
sourceBlob: blob,
|
|
3498
3736
|
size: blob.size
|
|
3499
3737
|
});
|
|
3500
3738
|
if (!blobSliceProbe) {
|
|
@@ -3504,13 +3742,13 @@ class BlobReader extends Reader {
|
|
|
3504
3742
|
|
|
3505
3743
|
createReadable(options) {
|
|
3506
3744
|
const reader = this;
|
|
3507
|
-
const {
|
|
3745
|
+
const { sourceBlob, size } = reader;
|
|
3508
3746
|
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
3509
3747
|
if (!offset && readSize >= size) {
|
|
3510
|
-
return toCompatibleReadable(
|
|
3748
|
+
return toCompatibleReadable(sourceBlob.stream());
|
|
3511
3749
|
}
|
|
3512
3750
|
if (blobSliceReliable) {
|
|
3513
|
-
return toCompatibleReadable(
|
|
3751
|
+
return toCompatibleReadable(sourceBlob.slice(offset, offset + readSize).stream());
|
|
3514
3752
|
}
|
|
3515
3753
|
return super.createReadable(options);
|
|
3516
3754
|
}
|
|
@@ -3519,7 +3757,7 @@ class BlobReader extends Reader {
|
|
|
3519
3757
|
const reader = this;
|
|
3520
3758
|
const offsetEnd = offset + length;
|
|
3521
3759
|
const readsWholeBlob = !offset && offsetEnd >= reader.size;
|
|
3522
|
-
const blob = readsWholeBlob ? reader.
|
|
3760
|
+
const blob = readsWholeBlob ? reader.sourceBlob : reader.sourceBlob.slice(offset, offsetEnd);
|
|
3523
3761
|
let arrayBuffer = await blob.arrayBuffer();
|
|
3524
3762
|
const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
|
|
3525
3763
|
if (sliceIgnoredByBuggyImplementation) {
|
|
@@ -3541,12 +3779,12 @@ class BlobWriter extends Stream {
|
|
|
3541
3779
|
}
|
|
3542
3780
|
});
|
|
3543
3781
|
writer.contentType = contentType;
|
|
3544
|
-
writer.
|
|
3545
|
-
writer.
|
|
3782
|
+
writer.blobPromise = streamToBlob(transformStream.readable, contentType);
|
|
3783
|
+
writer.blobPromise.catch(() => { });
|
|
3546
3784
|
}
|
|
3547
3785
|
|
|
3548
3786
|
getData() {
|
|
3549
|
-
return this.
|
|
3787
|
+
return this.blobPromise;
|
|
3550
3788
|
}
|
|
3551
3789
|
}
|
|
3552
3790
|
|
|
@@ -3580,7 +3818,7 @@ function getTextSize(text) {
|
|
|
3580
3818
|
class TextWriter extends BlobWriter {
|
|
3581
3819
|
|
|
3582
3820
|
constructor(encoding) {
|
|
3583
|
-
super(
|
|
3821
|
+
super();
|
|
3584
3822
|
Object.assign(this, {
|
|
3585
3823
|
encoding,
|
|
3586
3824
|
utf8: !encoding || encoding.toLowerCase() == "utf-8"
|
|
@@ -3596,14 +3834,7 @@ class TextWriter extends BlobWriter {
|
|
|
3596
3834
|
if (blob.text && utf8) {
|
|
3597
3835
|
return blob.text();
|
|
3598
3836
|
} else {
|
|
3599
|
-
|
|
3600
|
-
return new Promise((resolve, reject) => {
|
|
3601
|
-
Object.assign(reader, {
|
|
3602
|
-
onload: ({ target }) => resolve(target.result),
|
|
3603
|
-
onerror: () => reject(reader.error)
|
|
3604
|
-
});
|
|
3605
|
-
reader.readAsText(blob, encoding);
|
|
3606
|
-
});
|
|
3837
|
+
return decodeTextRemovingBOM(new Uint8Array(await blob.arrayBuffer()), encoding);
|
|
3607
3838
|
}
|
|
3608
3839
|
}
|
|
3609
3840
|
}
|
|
@@ -4271,85 +4502,13 @@ function readUint8Array(reader, offset, size) {
|
|
|
4271
4502
|
return reader.readUint8Array(offset, size);
|
|
4272
4503
|
}
|
|
4273
4504
|
|
|
4274
|
-
|
|
4275
|
-
|
|
4276
|
-
|
|
4277
|
-
|
|
4278
|
-
|
|
4279
|
-
|
|
4280
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4281
|
-
this list of conditions and the following disclaimer.
|
|
4282
|
-
|
|
4283
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4284
|
-
notice, this list of conditions and the following disclaimer in
|
|
4285
|
-
the documentation and/or other materials provided with the distribution.
|
|
4286
|
-
|
|
4287
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4288
|
-
derived from this software without specific prior written permission.
|
|
4289
|
-
|
|
4290
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4291
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4292
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4293
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4294
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4295
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4296
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4297
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4298
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4299
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4300
|
-
*/
|
|
4301
|
-
|
|
4302
|
-
/* global TextDecoder */
|
|
4303
|
-
|
|
4304
|
-
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
4305
|
-
const VALID_CP437 = CP437.length == 256;
|
|
4306
|
-
|
|
4307
|
-
function decodeCP437(stringValue) {
|
|
4308
|
-
if (VALID_CP437) {
|
|
4309
|
-
let result = "";
|
|
4310
|
-
for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
|
|
4311
|
-
result += CP437[stringValue[indexCharacter]];
|
|
4312
|
-
}
|
|
4313
|
-
return result;
|
|
4314
|
-
} else {
|
|
4315
|
-
return new TextDecoder().decode(stringValue);
|
|
4316
|
-
}
|
|
4317
|
-
}
|
|
4318
|
-
|
|
4319
|
-
/*
|
|
4320
|
-
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
4321
|
-
|
|
4322
|
-
Redistribution and use in source and binary forms, with or without
|
|
4323
|
-
modification, are permitted provided that the following conditions are met:
|
|
4324
|
-
|
|
4325
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4326
|
-
this list of conditions and the following disclaimer.
|
|
4327
|
-
|
|
4328
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4329
|
-
notice, this list of conditions and the following disclaimer in
|
|
4330
|
-
the documentation and/or other materials provided with the distribution.
|
|
4331
|
-
|
|
4332
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4333
|
-
derived from this software without specific prior written permission.
|
|
4334
|
-
|
|
4335
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4336
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4337
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4338
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4339
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4340
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4341
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4342
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4343
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4344
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4345
|
-
*/
|
|
4346
|
-
|
|
4347
|
-
|
|
4348
|
-
function decodeText(value, encoding) {
|
|
4349
|
-
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
4350
|
-
return decodeCP437(value);
|
|
4505
|
+
function createReadable(reader, options) {
|
|
4506
|
+
if (reader.createReadable) {
|
|
4507
|
+
return reader.createReadable(options);
|
|
4508
|
+
} else if (reader.readUint8Array) {
|
|
4509
|
+
return Reader.prototype.createReadable.call(reader, options);
|
|
4351
4510
|
} else {
|
|
4352
|
-
return
|
|
4511
|
+
return reader.readable;
|
|
4353
4512
|
}
|
|
4354
4513
|
}
|
|
4355
4514
|
|
|
@@ -4509,83 +4668,6 @@ class Entry {
|
|
|
4509
4668
|
|
|
4510
4669
|
}
|
|
4511
4670
|
|
|
4512
|
-
/*
|
|
4513
|
-
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
4514
|
-
|
|
4515
|
-
Redistribution and use in source and binary forms, with or without
|
|
4516
|
-
modification, are permitted provided that the following conditions are met:
|
|
4517
|
-
|
|
4518
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4519
|
-
this list of conditions and the following disclaimer.
|
|
4520
|
-
|
|
4521
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4522
|
-
notice, this list of conditions and the following disclaimer in
|
|
4523
|
-
the documentation and/or other materials provided with the distribution.
|
|
4524
|
-
|
|
4525
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4526
|
-
derived from this software without specific prior written permission.
|
|
4527
|
-
|
|
4528
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4529
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4530
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4531
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4532
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4533
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4534
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4535
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4536
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4537
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4538
|
-
*/
|
|
4539
|
-
|
|
4540
|
-
const OPTION_FILENAME_ENCODING = "filenameEncoding";
|
|
4541
|
-
const OPTION_COMMENT_ENCODING = "commentEncoding";
|
|
4542
|
-
const OPTION_DECODE_TEXT = "decodeText";
|
|
4543
|
-
const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
|
|
4544
|
-
const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
|
|
4545
|
-
const OPTION_PASSWORD = "password";
|
|
4546
|
-
const OPTION_RAW_PASSWORD = "rawPassword";
|
|
4547
|
-
const OPTION_PASS_THROUGH = "passThrough";
|
|
4548
|
-
const OPTION_SIGNAL = "signal";
|
|
4549
|
-
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
4550
|
-
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
4551
|
-
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
4552
|
-
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
4553
|
-
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
4554
|
-
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
4555
|
-
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
4556
|
-
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
4557
|
-
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
4558
|
-
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
4559
|
-
const OPTION_TRANSFER_STREAMS = "transferStreams";
|
|
4560
|
-
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
4561
|
-
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
4562
|
-
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
4563
|
-
const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
|
|
4564
|
-
const OPTION_KEEP_ORDER = "keepOrder";
|
|
4565
|
-
const OPTION_LEVEL = "level";
|
|
4566
|
-
const OPTION_BUFFERED_WRITE = "bufferedWrite";
|
|
4567
|
-
const OPTION_CREATE_TEMP_STREAM = "createTempStream";
|
|
4568
|
-
const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
|
|
4569
|
-
const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
|
|
4570
|
-
const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
|
|
4571
|
-
const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
|
|
4572
|
-
const OPTION_ENCODE_TEXT = "encodeText";
|
|
4573
|
-
const OPTION_OFFSET = "offset";
|
|
4574
|
-
const OPTION_USDZ = "usdz";
|
|
4575
|
-
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
4576
|
-
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
4577
|
-
const OPTION_STRICTNESS = "strictness";
|
|
4578
|
-
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
4579
|
-
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
4580
|
-
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
4581
|
-
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
4582
|
-
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
4583
|
-
const TEXT_TYPE_FILENAME = "filename";
|
|
4584
|
-
const TEXT_TYPE_COMMENT = "comment";
|
|
4585
|
-
const STRICTNESS_STRICT = "strict";
|
|
4586
|
-
const STRICTNESS_BALANCED = "balanced";
|
|
4587
|
-
const STRICTNESS_TOLERANT = "tolerant";
|
|
4588
|
-
|
|
4589
4671
|
/*
|
|
4590
4672
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4591
4673
|
|
|
@@ -4626,6 +4708,7 @@ const ERR_UNSUPPORTED_ENCRYPTION = "Encryption method not supported";
|
|
|
4626
4708
|
const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
|
|
4627
4709
|
const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
4628
4710
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
4711
|
+
const ERR_ENTRY_DATA_OUT_OF_BOUNDS = "Entry data out of bounds";
|
|
4629
4712
|
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
4630
4713
|
const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
|
|
4631
4714
|
const ERR_UNSAFE_FILENAME = "Unsafe filename";
|
|
@@ -4646,7 +4729,7 @@ const ZIP64_PROPERTIES = [
|
|
|
4646
4729
|
];
|
|
4647
4730
|
const ZIP64_EXTRACTION = {
|
|
4648
4731
|
[MAX_16_BITS]: {
|
|
4649
|
-
getValue: getUint32,
|
|
4732
|
+
getValue: getUint32$1,
|
|
4650
4733
|
bytes: 4
|
|
4651
4734
|
},
|
|
4652
4735
|
[MAX_32_BITS]: {
|
|
@@ -4655,6 +4738,7 @@ const ZIP64_EXTRACTION = {
|
|
|
4655
4738
|
}
|
|
4656
4739
|
};
|
|
4657
4740
|
const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
|
|
4741
|
+
const MAX_DEFLATE_EXPANSION_RATIO = 1032;
|
|
4658
4742
|
const CENTRAL_DIRECTORY_UNREACHABLE = 0;
|
|
4659
4743
|
const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
|
|
4660
4744
|
const CENTRAL_DIRECTORY_REACHABLE = 2;
|
|
@@ -4665,7 +4749,6 @@ class ZipReader {
|
|
|
4665
4749
|
Object.assign(this, {
|
|
4666
4750
|
reader: new GenericReader(reader),
|
|
4667
4751
|
options,
|
|
4668
|
-
config: getConfiguration(),
|
|
4669
4752
|
readRanges: new Map()
|
|
4670
4753
|
});
|
|
4671
4754
|
}
|
|
@@ -4673,7 +4756,6 @@ class ZipReader {
|
|
|
4673
4756
|
async* getEntriesGenerator(options = {}) {
|
|
4674
4757
|
const zipReader = this;
|
|
4675
4758
|
let { reader } = zipReader;
|
|
4676
|
-
const { config } = zipReader;
|
|
4677
4759
|
await initStream(reader);
|
|
4678
4760
|
if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
|
|
4679
4761
|
reader = new BlobReader(await streamToBlob(reader.readable));
|
|
@@ -4690,9 +4772,7 @@ class ZipReader {
|
|
|
4690
4772
|
const normalizeFilename = getOptionValue$1(zipReader, options, OPTION_NORMALIZE_FILENAME);
|
|
4691
4773
|
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
4692
4774
|
if (!endOfDirectoryInfo) {
|
|
4693
|
-
|
|
4694
|
-
const signatureView = getDataView(signatureArray);
|
|
4695
|
-
if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
|
|
4775
|
+
if (await startsWithSplitZipSignature$1(reader)) {
|
|
4696
4776
|
throw new Error(ERR_SPLIT_ZIP_FILE);
|
|
4697
4777
|
} else {
|
|
4698
4778
|
throw new Error(ERR_EOCDR_NOT_FOUND);
|
|
@@ -4702,22 +4782,23 @@ class ZipReader {
|
|
|
4702
4782
|
throwAmbiguousArchive("multiple end of central directory records");
|
|
4703
4783
|
}
|
|
4704
4784
|
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
4705
|
-
let directoryDataLength = getUint32(endOfDirectoryView, 12);
|
|
4706
|
-
let directoryDataOffset = getUint32(endOfDirectoryView, 16);
|
|
4785
|
+
let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
|
|
4786
|
+
let directoryDataOffset = getUint32$1(endOfDirectoryView, 16);
|
|
4707
4787
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
4708
|
-
const commentLength = getUint16(endOfDirectoryView, 20);
|
|
4788
|
+
const commentLength = getUint16$1(endOfDirectoryView, 20);
|
|
4709
4789
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
4710
4790
|
if (reader.size - appendedDataOffset > maxAppendedDataSize) {
|
|
4711
4791
|
throwAmbiguousArchive("appended data");
|
|
4712
4792
|
}
|
|
4713
|
-
let lastDiskNumber = getUint16(endOfDirectoryView, 4);
|
|
4793
|
+
let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
|
|
4714
4794
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
4715
|
-
let diskNumber = getUint16(endOfDirectoryView, 6);
|
|
4716
|
-
let filesLength = getUint16(endOfDirectoryView, 10);
|
|
4795
|
+
let diskNumber = getUint16$1(endOfDirectoryView, 6);
|
|
4796
|
+
let filesLength = getUint16$1(endOfDirectoryView, 10);
|
|
4717
4797
|
let prependedDataLength = 0;
|
|
4718
4798
|
let startOffset;
|
|
4719
4799
|
let zip64EndOfDirectory;
|
|
4720
4800
|
let zip64EndOfDirectoryVersion2;
|
|
4801
|
+
let zip64EndOfDirectoryLength = ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
4721
4802
|
let directoryEncryptionInfo;
|
|
4722
4803
|
const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
|
|
4723
4804
|
if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
|
|
@@ -4729,12 +4810,12 @@ class ZipReader {
|
|
|
4729
4810
|
EMPTY_UINT8_ARRAY;
|
|
4730
4811
|
const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
|
|
4731
4812
|
if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
|
|
4732
|
-
getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
4733
|
-
directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4813
|
+
getUint32$1(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
4814
|
+
directoryDataOffset = getDiskOffset$1(reader, getUint32$1(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4734
4815
|
let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4735
4816
|
let endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4736
4817
|
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
4737
|
-
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
4818
|
+
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
4738
4819
|
directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
|
|
4739
4820
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
4740
4821
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
@@ -4744,7 +4825,7 @@ class ZipReader {
|
|
|
4744
4825
|
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4745
4826
|
endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4746
4827
|
}
|
|
4747
|
-
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4828
|
+
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4748
4829
|
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4749
4830
|
}
|
|
4750
4831
|
zip64EndOfDirectory = true;
|
|
@@ -4754,18 +4835,19 @@ class ZipReader {
|
|
|
4754
4835
|
Number(getBigUint64(endOfDirectoryView, 4)) - (ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12),
|
|
4755
4836
|
reader.size - directoryDataOffset - ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4756
4837
|
if (extensibleDataLength > 0) {
|
|
4838
|
+
zip64EndOfDirectoryLength += extensibleDataLength;
|
|
4757
4839
|
const rawExtensibleData = await readUint8Array(reader, directoryDataOffset + ZIP64_END_OF_CENTRAL_DIR_LENGTH, extensibleDataLength);
|
|
4758
4840
|
directoryEncryptionInfo = getDirectoryEncryptionInfo(rawExtensibleData);
|
|
4759
4841
|
}
|
|
4760
4842
|
}
|
|
4761
4843
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
4762
|
-
lastDiskNumber = getUint32(endOfDirectoryView, 16);
|
|
4763
|
-
} else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
|
|
4844
|
+
lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
|
|
4845
|
+
} else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
|
|
4764
4846
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
4765
4847
|
}
|
|
4766
4848
|
if (diskNumber == MAX_16_BITS) {
|
|
4767
|
-
diskNumber = getUint32(endOfDirectoryView, 20);
|
|
4768
|
-
} else if (checkAmbiguity && diskNumber != getUint32(endOfDirectoryView, 20)) {
|
|
4849
|
+
diskNumber = getUint32$1(endOfDirectoryView, 20);
|
|
4850
|
+
} else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
|
|
4769
4851
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
4770
4852
|
}
|
|
4771
4853
|
if (filesLength == MAX_16_BITS) {
|
|
@@ -4783,7 +4865,7 @@ class ZipReader {
|
|
|
4783
4865
|
}
|
|
4784
4866
|
let declaredDirectoryDataLength = directoryDataLength;
|
|
4785
4867
|
const centralDirectoryEndOffset = endOfDirectoryInfo.offset -
|
|
4786
|
-
(zip64EndOfDirectory ?
|
|
4868
|
+
(zip64EndOfDirectory ? zip64EndOfDirectoryLength + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
|
|
4787
4869
|
if (directoryDataOffset >= reader.size) {
|
|
4788
4870
|
prependedDataLength = reader.size - directoryDataOffset - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
4789
4871
|
directoryDataOffset = reader.size - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
@@ -4803,11 +4885,13 @@ class ZipReader {
|
|
|
4803
4885
|
}
|
|
4804
4886
|
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
4805
4887
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4806
|
-
const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE
|
|
4888
|
+
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
|
|
4889
|
+
Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
|
|
4890
|
+
detectEncryptedCentralDirectory(directoryView);
|
|
4807
4891
|
let reconcile = !storedPointsAtDirectory;
|
|
4808
4892
|
if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
4809
4893
|
const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
|
|
4810
|
-
reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4894
|
+
reconcile = getUint32$1(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4811
4895
|
}
|
|
4812
4896
|
if (reconcile) {
|
|
4813
4897
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
@@ -4831,12 +4915,14 @@ class ZipReader {
|
|
|
4831
4915
|
}
|
|
4832
4916
|
zipReader.directoryOffset = directoryDataOffset;
|
|
4833
4917
|
zipReader.directoryLength = declaredDirectoryDataLength;
|
|
4834
|
-
const decryptCentralDirectory =
|
|
4835
|
-
let decryptedDirectory;
|
|
4918
|
+
const decryptCentralDirectory = getFunctionOptionValue$1(zipReader, options, OPTION_DECRYPT_CENTRAL_DIRECTORY);
|
|
4919
|
+
let decryptedDirectory, dataAfterEncryptedDirectory;
|
|
4836
4920
|
if (decryptCentralDirectory && filesLength && directoryArray.length >= 4 &&
|
|
4837
|
-
getUint32(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
|
|
4921
|
+
getUint32$1(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
|
|
4838
4922
|
(zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4839
|
-
|
|
4923
|
+
const encryptedDirectoryDataLength = getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryArray.length);
|
|
4924
|
+
dataAfterEncryptedDirectory = directoryArray.subarray(encryptedDirectoryDataLength);
|
|
4925
|
+
directoryArray = await decryptCentralDirectory(directoryArray.subarray(0, encryptedDirectoryDataLength), directoryEncryptionInfo);
|
|
4840
4926
|
directoryView = getDataView(directoryArray);
|
|
4841
4927
|
declaredDirectoryDataLength = directoryArray.length;
|
|
4842
4928
|
decryptedDirectory = true;
|
|
@@ -4847,8 +4933,8 @@ class ZipReader {
|
|
|
4847
4933
|
const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
|
|
4848
4934
|
let duplicateFilename;
|
|
4849
4935
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
4850
|
-
const fileEntry = new ZipEntry$1(reader,
|
|
4851
|
-
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4936
|
+
const fileEntry = new ZipEntry$1(reader, zipReader.options);
|
|
4937
|
+
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32$1(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4852
4938
|
if (indexFile == 0 && !decryptedDirectory && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4853
4939
|
throw new Error(ERR_ENCRYPTED_CENTRAL_DIRECTORY);
|
|
4854
4940
|
}
|
|
@@ -4859,16 +4945,16 @@ class ZipReader {
|
|
|
4859
4945
|
const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
|
|
4860
4946
|
const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
|
|
4861
4947
|
const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
|
|
4862
|
-
const versionMadeBy = getUint16(directoryView, offset + 4);
|
|
4948
|
+
const versionMadeBy = getUint16$1(directoryView, offset + 4);
|
|
4863
4949
|
const msDosCompatible = versionMadeBy >> 8 == 0;
|
|
4864
4950
|
const unixCompatible = versionMadeBy >> 8 == 3;
|
|
4865
4951
|
const rawFilename = directoryArray.subarray(filenameOffset, extraFieldOffset);
|
|
4866
|
-
const commentLength = getUint16(directoryView, offset + 32);
|
|
4952
|
+
const commentLength = getUint16$1(directoryView, offset + 32);
|
|
4867
4953
|
const endOffset = commentOffset + commentLength;
|
|
4868
4954
|
const rawComment = directoryArray.subarray(commentOffset, endOffset);
|
|
4869
4955
|
const filenameUTF8 = languageEncodingFlag;
|
|
4870
4956
|
const commentUTF8 = languageEncodingFlag;
|
|
4871
|
-
const externalFileAttributes = getUint32(directoryView, offset + 38);
|
|
4957
|
+
const externalFileAttributes = getUint32$1(directoryView, offset + 38);
|
|
4872
4958
|
const msdosAttributesRaw = externalFileAttributes & MAX_8_BITS;
|
|
4873
4959
|
const msdosAttributes = {
|
|
4874
4960
|
readOnly: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_READONLY_MASK),
|
|
@@ -4877,8 +4963,8 @@ class ZipReader {
|
|
|
4877
4963
|
directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
|
|
4878
4964
|
archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
|
|
4879
4965
|
};
|
|
4880
|
-
const offsetFileEntry = getUint32(directoryView, offset + 42);
|
|
4881
|
-
const decode =
|
|
4966
|
+
const offsetFileEntry = getUint32$1(directoryView, offset + 42);
|
|
4967
|
+
const decode = getFunctionOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
4882
4968
|
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
4883
4969
|
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
4884
4970
|
let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
|
|
@@ -4902,6 +4988,7 @@ class ZipReader {
|
|
|
4902
4988
|
}
|
|
4903
4989
|
Object.assign(fileEntry, {
|
|
4904
4990
|
index: indexFile,
|
|
4991
|
+
decryptedDirectory,
|
|
4905
4992
|
versionMadeBy,
|
|
4906
4993
|
msDosCompatible,
|
|
4907
4994
|
zip64: false,
|
|
@@ -4909,8 +4996,8 @@ class ZipReader {
|
|
|
4909
4996
|
uncompressedSize: 0,
|
|
4910
4997
|
commentLength,
|
|
4911
4998
|
offset: offsetFileEntry,
|
|
4912
|
-
diskNumberStart: getUint16(directoryView, offset + 34),
|
|
4913
|
-
internalFileAttributes: getUint16(directoryView, offset + 36),
|
|
4999
|
+
diskNumberStart: getUint16$1(directoryView, offset + 34),
|
|
5000
|
+
internalFileAttributes: getUint16$1(directoryView, offset + 36),
|
|
4914
5001
|
externalFileAttributes,
|
|
4915
5002
|
msdosAttributesRaw,
|
|
4916
5003
|
msdosAttributes,
|
|
@@ -4978,12 +5065,11 @@ class ZipReader {
|
|
|
4978
5065
|
yield entry;
|
|
4979
5066
|
}
|
|
4980
5067
|
let offsetAfterSignature = offset;
|
|
4981
|
-
|
|
4982
|
-
|
|
4983
|
-
|
|
4984
|
-
|
|
4985
|
-
|
|
4986
|
-
}
|
|
5068
|
+
const digitalSignature = readDigitalSignature(directoryArray.subarray(offset)) ||
|
|
5069
|
+
(decryptedDirectory ? readDigitalSignature(dataAfterEncryptedDirectory) : UNDEFINED_VALUE);
|
|
5070
|
+
if (digitalSignature) {
|
|
5071
|
+
zipReader.digitalSignature = digitalSignature;
|
|
5072
|
+
offsetAfterSignature = offset + 6 + digitalSignature.length;
|
|
4987
5073
|
}
|
|
4988
5074
|
if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
|
|
4989
5075
|
throwAmbiguousArchive("trailing central directory data");
|
|
@@ -4991,13 +5077,17 @@ class ZipReader {
|
|
|
4991
5077
|
if (duplicateFilename) {
|
|
4992
5078
|
throwAmbiguousArchive("duplicate filename");
|
|
4993
5079
|
}
|
|
4994
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > 0))) {
|
|
4995
|
-
throwAmbiguousArchive("prepended data");
|
|
4996
|
-
}
|
|
4997
5080
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
4998
5081
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5082
|
+
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5083
|
+
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5084
|
+
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5085
|
+
throwAmbiguousArchive("prepended data");
|
|
5086
|
+
}
|
|
4999
5087
|
if (extractPrependedData) {
|
|
5000
|
-
zipReader.prependedData = startOffset >
|
|
5088
|
+
zipReader.prependedData = startOffset > splitZipSignatureLength ?
|
|
5089
|
+
await readUint8Array(reader, splitZipSignatureLength, startOffset - splitZipSignatureLength) :
|
|
5090
|
+
EMPTY_UINT8_ARRAY;
|
|
5001
5091
|
}
|
|
5002
5092
|
zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : EMPTY_UINT8_ARRAY;
|
|
5003
5093
|
if (extractAppendedData) {
|
|
@@ -5064,16 +5154,16 @@ class ZipReaderStream {
|
|
|
5064
5154
|
|
|
5065
5155
|
let ZipEntry$1 = class ZipEntry {
|
|
5066
5156
|
|
|
5067
|
-
constructor(reader,
|
|
5157
|
+
constructor(reader, options) {
|
|
5068
5158
|
Object.assign(this, {
|
|
5069
5159
|
reader,
|
|
5070
|
-
config,
|
|
5071
5160
|
options
|
|
5072
5161
|
});
|
|
5073
5162
|
}
|
|
5074
5163
|
|
|
5075
5164
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5076
5165
|
const zipEntry = this;
|
|
5166
|
+
const config = getConfiguration();
|
|
5077
5167
|
const {
|
|
5078
5168
|
reader,
|
|
5079
5169
|
index,
|
|
@@ -5082,7 +5172,6 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5082
5172
|
extraFieldAES,
|
|
5083
5173
|
extraFieldZip64,
|
|
5084
5174
|
compressionMethod,
|
|
5085
|
-
config,
|
|
5086
5175
|
bitFlag,
|
|
5087
5176
|
rawBitFlag,
|
|
5088
5177
|
crc32,
|
|
@@ -5100,6 +5189,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5100
5189
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
5101
5190
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
5102
5191
|
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
5192
|
+
checkPasswordOption(password, rawPassword);
|
|
5103
5193
|
password = password && password.length && password;
|
|
5104
5194
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
5105
5195
|
if (extraFieldAES) {
|
|
@@ -5107,7 +5197,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5107
5197
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
5108
5198
|
}
|
|
5109
5199
|
}
|
|
5110
|
-
if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
5200
|
+
if (dataArray.length < HEADER_SIZE || getUint32$1(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
5111
5201
|
throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
|
|
5112
5202
|
}
|
|
5113
5203
|
readCommonHeader(localDirectory, dataView, 4);
|
|
@@ -5169,9 +5259,12 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5169
5259
|
}
|
|
5170
5260
|
}
|
|
5171
5261
|
const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
|
|
5262
|
+
if (dataOffset + compressedSize > reader.size) {
|
|
5263
|
+
throw new Error(ERR_ENTRY_DATA_OUT_OF_BOUNDS);
|
|
5264
|
+
}
|
|
5172
5265
|
const size = compressedSize;
|
|
5173
5266
|
const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
|
|
5174
|
-
const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
|
|
5267
|
+
const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
|
|
5175
5268
|
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5176
5269
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
5177
5270
|
const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
|
|
@@ -5179,6 +5272,8 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5179
5272
|
checkOverlappingEntry = true;
|
|
5180
5273
|
}
|
|
5181
5274
|
const { onstart, onprogress, onend } = options;
|
|
5275
|
+
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThrough;
|
|
5276
|
+
const outputSize = passThrough ? compressedSize : uncompressedSize;
|
|
5182
5277
|
const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
|
|
5183
5278
|
let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
|
|
5184
5279
|
if (deflate64) {
|
|
@@ -5199,9 +5294,9 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5199
5294
|
checkCrc32,
|
|
5200
5295
|
checkAuthenticationCode: getOptionValue$1(zipEntry, options, OPTION_CHECK_AUTHENTICATION_CODE),
|
|
5201
5296
|
passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & MAX_8_BITS) : ((crc32 >>> 24) & MAX_8_BITS)),
|
|
5202
|
-
outputSize
|
|
5297
|
+
outputSize,
|
|
5203
5298
|
crc32,
|
|
5204
|
-
compressed
|
|
5299
|
+
compressed,
|
|
5205
5300
|
encrypted,
|
|
5206
5301
|
useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
|
|
5207
5302
|
useCompressionStream,
|
|
@@ -5238,11 +5333,11 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5238
5333
|
writer = new WritableStream();
|
|
5239
5334
|
}
|
|
5240
5335
|
writer = new GenericWriter(writer);
|
|
5241
|
-
await initStream(writer,
|
|
5336
|
+
await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
|
|
5242
5337
|
({ writable } = writer);
|
|
5243
|
-
const { outputSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5244
|
-
writer.size +=
|
|
5245
|
-
if (
|
|
5338
|
+
const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5339
|
+
writer.size += writtenSize;
|
|
5340
|
+
if (writtenSize != outputSize) {
|
|
5246
5341
|
throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
5247
5342
|
}
|
|
5248
5343
|
}
|
|
@@ -5276,26 +5371,47 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5276
5371
|
function detectEncryptedCentralDirectory(directoryView) {
|
|
5277
5372
|
const maxOffset = Math.min(directoryView.byteLength, 1024) - 3;
|
|
5278
5373
|
for (let offset = 0; offset < maxOffset; offset++) {
|
|
5279
|
-
if (getUint32(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
5374
|
+
if (getUint32$1(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
5280
5375
|
return true;
|
|
5281
5376
|
}
|
|
5282
5377
|
}
|
|
5283
5378
|
return false;
|
|
5284
5379
|
}
|
|
5285
5380
|
|
|
5381
|
+
function readDigitalSignature(signatureRecordArray) {
|
|
5382
|
+
if (signatureRecordArray.length >= 6) {
|
|
5383
|
+
const signatureRecordView = getDataView(signatureRecordArray);
|
|
5384
|
+
if (getUint32$1(signatureRecordView, 0) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
|
|
5385
|
+
const signatureDataLength = getUint16$1(signatureRecordView, 4);
|
|
5386
|
+
if (6 + signatureDataLength <= signatureRecordArray.length) {
|
|
5387
|
+
return signatureRecordArray.subarray(6, 6 + signatureDataLength);
|
|
5388
|
+
}
|
|
5389
|
+
}
|
|
5390
|
+
}
|
|
5391
|
+
}
|
|
5392
|
+
|
|
5393
|
+
function getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryDataLength) {
|
|
5394
|
+
const encryptedDirectoryDataLength = directoryEncryptionInfo && directoryEncryptionInfo.compressedSize ?
|
|
5395
|
+
directoryEncryptionInfo.compressedSize :
|
|
5396
|
+
declaredDirectoryDataLength;
|
|
5397
|
+
return encryptedDirectoryDataLength > 0 && encryptedDirectoryDataLength <= directoryDataLength ?
|
|
5398
|
+
encryptedDirectoryDataLength :
|
|
5399
|
+
directoryDataLength;
|
|
5400
|
+
}
|
|
5401
|
+
|
|
5286
5402
|
function getDirectoryEncryptionInfo(rawExtensibleData) {
|
|
5287
5403
|
const directoryEncryptionInfo = { rawExtensibleData };
|
|
5288
5404
|
if (rawExtensibleData.length >= 28) {
|
|
5289
5405
|
const extensibleDataView = getDataView(rawExtensibleData);
|
|
5290
|
-
const hashDataLength = getUint16(extensibleDataView, 26);
|
|
5406
|
+
const hashDataLength = getUint16$1(extensibleDataView, 26);
|
|
5291
5407
|
Object.assign(directoryEncryptionInfo, {
|
|
5292
|
-
compressionMethod: getUint16(extensibleDataView, 0),
|
|
5408
|
+
compressionMethod: getUint16$1(extensibleDataView, 0),
|
|
5293
5409
|
compressedSize: Number(getBigUint64(extensibleDataView, 2)),
|
|
5294
5410
|
uncompressedSize: Number(getBigUint64(extensibleDataView, 10)),
|
|
5295
|
-
encryptionAlgorithm: getUint16(extensibleDataView, 18),
|
|
5296
|
-
bitLength: getUint16(extensibleDataView, 20),
|
|
5297
|
-
flags: getUint16(extensibleDataView, 22),
|
|
5298
|
-
hashAlgorithm: getUint16(extensibleDataView, 24),
|
|
5411
|
+
encryptionAlgorithm: getUint16$1(extensibleDataView, 18),
|
|
5412
|
+
bitLength: getUint16$1(extensibleDataView, 20),
|
|
5413
|
+
flags: getUint16$1(extensibleDataView, 22),
|
|
5414
|
+
hashAlgorithm: getUint16$1(extensibleDataView, 24),
|
|
5299
5415
|
hashData: rawExtensibleData.subarray(28, 28 + hashDataLength)
|
|
5300
5416
|
});
|
|
5301
5417
|
}
|
|
@@ -5303,12 +5419,12 @@ function getDirectoryEncryptionInfo(rawExtensibleData) {
|
|
|
5303
5419
|
}
|
|
5304
5420
|
|
|
5305
5421
|
function readCommonHeader(directory, dataView, offset) {
|
|
5306
|
-
const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2);
|
|
5422
|
+
const rawBitFlag = directory.rawBitFlag = getUint16$1(dataView, offset + 2);
|
|
5307
5423
|
const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED;
|
|
5308
|
-
const rawLastModDate = getUint32(dataView, offset + 6);
|
|
5424
|
+
const rawLastModDate = getUint32$1(dataView, offset + 6);
|
|
5309
5425
|
Object.assign(directory, {
|
|
5310
5426
|
encrypted,
|
|
5311
|
-
version: getUint16(dataView, offset),
|
|
5427
|
+
version: getUint16$1(dataView, offset),
|
|
5312
5428
|
bitFlag: {
|
|
5313
5429
|
level: (rawBitFlag & BITFLAG_LEVEL) >> 1,
|
|
5314
5430
|
dataDescriptor: (rawBitFlag & BITFLAG_DATA_DESCRIPTOR) == BITFLAG_DATA_DESCRIPTOR,
|
|
@@ -5316,8 +5432,8 @@ function readCommonHeader(directory, dataView, offset) {
|
|
|
5316
5432
|
},
|
|
5317
5433
|
rawLastModDate,
|
|
5318
5434
|
lastModDate: getDate(rawLastModDate),
|
|
5319
|
-
filenameLength: getUint16(dataView, offset + 22),
|
|
5320
|
-
extraFieldLength: getUint16(dataView, offset + 24)
|
|
5435
|
+
filenameLength: getUint16$1(dataView, offset + 22),
|
|
5436
|
+
extraFieldLength: getUint16$1(dataView, offset + 24)
|
|
5321
5437
|
});
|
|
5322
5438
|
}
|
|
5323
5439
|
|
|
@@ -5328,8 +5444,8 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
5328
5444
|
let offsetExtraField = 0;
|
|
5329
5445
|
try {
|
|
5330
5446
|
while (offsetExtraField < rawExtraField.length) {
|
|
5331
|
-
const type = getUint16(rawExtraFieldView, offsetExtraField);
|
|
5332
|
-
const size = getUint16(rawExtraFieldView, offsetExtraField + 2);
|
|
5447
|
+
const type = getUint16$1(rawExtraFieldView, offsetExtraField);
|
|
5448
|
+
const size = getUint16$1(rawExtraFieldView, offsetExtraField + 2);
|
|
5333
5449
|
extraField.set(type, {
|
|
5334
5450
|
type,
|
|
5335
5451
|
data: rawExtraField.slice(offsetExtraField + 4, offsetExtraField + 4 + size)
|
|
@@ -5339,12 +5455,12 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
5339
5455
|
} catch {
|
|
5340
5456
|
// ignored
|
|
5341
5457
|
}
|
|
5342
|
-
const compressionMethod = getUint16(dataView, offset + 4);
|
|
5458
|
+
const compressionMethod = getUint16$1(dataView, offset + 4);
|
|
5343
5459
|
Object.assign(directory, {
|
|
5344
|
-
signature: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5345
|
-
crc32: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5346
|
-
compressedSize: getUint32(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
|
|
5347
|
-
uncompressedSize: getUint32(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
|
|
5460
|
+
signature: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5461
|
+
crc32: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5462
|
+
compressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
|
|
5463
|
+
uncompressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
|
|
5348
5464
|
});
|
|
5349
5465
|
const extraFieldZip64 = extraField.get(EXTRAFIELD_TYPE_ZIP64);
|
|
5350
5466
|
if (extraFieldZip64) {
|
|
@@ -5433,11 +5549,11 @@ function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName,
|
|
|
5433
5549
|
computedCrc32.append(fileEntry[rawPropertyName]);
|
|
5434
5550
|
const computedCrc32View = getDataView(new Uint8Array(4));
|
|
5435
5551
|
computedCrc32View.setUint32(0, computedCrc32.get(), true);
|
|
5436
|
-
const nameCrc32 = getUint32(extraFieldView, 1);
|
|
5552
|
+
const nameCrc32 = getUint32$1(extraFieldView, 1);
|
|
5437
5553
|
Object.assign(extraFieldUnicode, {
|
|
5438
5554
|
version: getUint8(extraFieldView, 0),
|
|
5439
5555
|
[propertyName]: decodeText(extraFieldUnicode.data.subarray(5)),
|
|
5440
|
-
valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32(computedCrc32View, 0)
|
|
5556
|
+
valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32$1(computedCrc32View, 0)
|
|
5441
5557
|
});
|
|
5442
5558
|
if (extraFieldUnicode.valid) {
|
|
5443
5559
|
directory[propertyName] = extraFieldUnicode[propertyName];
|
|
@@ -5453,7 +5569,7 @@ function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
|
|
|
5453
5569
|
vendorId: getUint8(extraFieldView, 2),
|
|
5454
5570
|
strength,
|
|
5455
5571
|
originalCompressionMethod: compressionMethod,
|
|
5456
|
-
compressionMethod: getUint16(extraFieldView, 5)
|
|
5572
|
+
compressionMethod: getUint16$1(extraFieldView, 5)
|
|
5457
5573
|
});
|
|
5458
5574
|
directory.compressionMethod = extraFieldAES.compressionMethod;
|
|
5459
5575
|
if (extraFieldAES.vendorVersion != VENDOR_VERSION_AE_1$1) {
|
|
@@ -5467,8 +5583,8 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
|
|
|
5467
5583
|
let tag1Data;
|
|
5468
5584
|
try {
|
|
5469
5585
|
while (offsetExtraField < extraFieldNTFS.data.length && !tag1Data) {
|
|
5470
|
-
const tagValue = getUint16(extraFieldView, offsetExtraField);
|
|
5471
|
-
const attributeSize = getUint16(extraFieldView, offsetExtraField + 2);
|
|
5586
|
+
const tagValue = getUint16$1(extraFieldView, offsetExtraField);
|
|
5587
|
+
const attributeSize = getUint16$1(extraFieldView, offsetExtraField + 2);
|
|
5472
5588
|
if (tagValue == EXTRAFIELD_TYPE_NTFS_TAG1) {
|
|
5473
5589
|
tag1Data = extraFieldNTFS.data.slice(offsetExtraField + 4, offsetExtraField + 4 + attributeSize);
|
|
5474
5590
|
}
|
|
@@ -5501,12 +5617,12 @@ function readExtraFieldUnixDates(extraField, directory) {
|
|
|
5501
5617
|
return;
|
|
5502
5618
|
}
|
|
5503
5619
|
const extraFieldView = getDataView(extraField.data);
|
|
5504
|
-
const lastAccessDate = new Date((getUint32(extraFieldView, 0) | 0) * 1000);
|
|
5505
|
-
const lastModDate = new Date((getUint32(extraFieldView, 4) | 0) * 1000);
|
|
5620
|
+
const lastAccessDate = new Date((getUint32$1(extraFieldView, 0) | 0) * 1000);
|
|
5621
|
+
const lastModDate = new Date((getUint32$1(extraFieldView, 4) | 0) * 1000);
|
|
5506
5622
|
const extraFieldData = { lastAccessDate, lastModDate };
|
|
5507
5623
|
if (extraField.data.length >= 12) {
|
|
5508
|
-
extraFieldData.uid = getUint16(extraFieldView, 8);
|
|
5509
|
-
extraFieldData.gid = getUint16(extraFieldView, 10);
|
|
5624
|
+
extraFieldData.uid = getUint16$1(extraFieldView, 8);
|
|
5625
|
+
extraFieldData.gid = getUint16$1(extraFieldView, 10);
|
|
5510
5626
|
}
|
|
5511
5627
|
Object.assign(extraField, extraFieldData);
|
|
5512
5628
|
Object.assign(directory, extraFieldData);
|
|
@@ -5526,8 +5642,8 @@ function readExtraFieldUnix(extraField, directory, isInfoZip) {
|
|
|
5526
5642
|
gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
|
|
5527
5643
|
Object.assign(extraField, { version, uid, gid });
|
|
5528
5644
|
} else if (extraField.data.length >= 4) {
|
|
5529
|
-
uid = getUint16(view, 0);
|
|
5530
|
-
gid = getUint16(view, 2);
|
|
5645
|
+
uid = getUint16$1(view, 0);
|
|
5646
|
+
gid = getUint16$1(view, 2);
|
|
5531
5647
|
Object.assign(extraField, { uid, gid });
|
|
5532
5648
|
}
|
|
5533
5649
|
if (uid !== UNDEFINED_VALUE) {
|
|
@@ -5577,7 +5693,7 @@ function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory,
|
|
|
5577
5693
|
let offset = 1;
|
|
5578
5694
|
timeProperties.forEach((propertyName, indexProperty) => {
|
|
5579
5695
|
if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
|
|
5580
|
-
const time = getUint32(extraFieldView, offset);
|
|
5696
|
+
const time = getUint32$1(extraFieldView, offset);
|
|
5581
5697
|
directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
|
|
5582
5698
|
const rawPropertyName = timeRawProperties[indexProperty];
|
|
5583
5699
|
extraFieldExtendedTimestamp[rawPropertyName] = time;
|
|
@@ -5611,7 +5727,7 @@ async function detectOverlappingEntry({
|
|
|
5611
5727
|
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
|
|
5612
5728
|
const dataDescriptorView = getDataView(dataDescriptorArray);
|
|
5613
5729
|
let signature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
|
|
5614
|
-
getUint32(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
5730
|
+
getUint32$1(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
5615
5731
|
if (signature) {
|
|
5616
5732
|
const signedDataDescriptor = readDataDescriptor(dataDescriptorView, DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, extraFieldZip64);
|
|
5617
5733
|
const matchCrc32 = (fileEntry.encrypted && !fileEntry.zipCrypto) || signedDataDescriptor.crc32 == crc32;
|
|
@@ -5645,15 +5761,15 @@ async function detectOverlappingEntry({
|
|
|
5645
5761
|
}
|
|
5646
5762
|
|
|
5647
5763
|
function readDataDescriptor(dataDescriptorView, offset, extraFieldZip64) {
|
|
5648
|
-
const crc32 = getUint32(dataDescriptorView, offset);
|
|
5764
|
+
const crc32 = getUint32$1(dataDescriptorView, offset);
|
|
5649
5765
|
let compressedSize;
|
|
5650
5766
|
let uncompressedSize;
|
|
5651
5767
|
if (extraFieldZip64) {
|
|
5652
5768
|
compressedSize = getBigUint64(dataDescriptorView, offset + 4);
|
|
5653
5769
|
uncompressedSize = getBigUint64(dataDescriptorView, offset + 12);
|
|
5654
5770
|
} else {
|
|
5655
|
-
compressedSize = getUint32(dataDescriptorView, offset + 4);
|
|
5656
|
-
uncompressedSize = getUint32(dataDescriptorView, offset + 8);
|
|
5771
|
+
compressedSize = getUint32$1(dataDescriptorView, offset + 4);
|
|
5772
|
+
uncompressedSize = getUint32$1(dataDescriptorView, offset + 8);
|
|
5657
5773
|
}
|
|
5658
5774
|
return { crc32, compressedSize, uncompressedSize };
|
|
5659
5775
|
}
|
|
@@ -5662,10 +5778,28 @@ function getDiskOffset$1(reader, diskNumber) {
|
|
|
5662
5778
|
return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
|
|
5663
5779
|
}
|
|
5664
5780
|
|
|
5781
|
+
async function startsWithSplitZipSignature$1(reader) {
|
|
5782
|
+
return await getFirstSignature(reader) == SPLIT_ZIP_FILE_SIGNATURE;
|
|
5783
|
+
}
|
|
5784
|
+
|
|
5785
|
+
async function startsWithSplitZipMarker(reader) {
|
|
5786
|
+
const signature = await getFirstSignature(reader);
|
|
5787
|
+
return signature == SPLIT_ZIP_FILE_SIGNATURE || signature == TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE;
|
|
5788
|
+
}
|
|
5789
|
+
|
|
5790
|
+
async function getFirstSignature(reader) {
|
|
5791
|
+
const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
5792
|
+
return getUint32$1(getDataView(signatureArray));
|
|
5793
|
+
}
|
|
5794
|
+
|
|
5665
5795
|
function isStrictnessValue(value) {
|
|
5666
5796
|
return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
|
|
5667
5797
|
}
|
|
5668
5798
|
|
|
5799
|
+
function getDecodableOutputSize(outputSize, compressedSize, compressed) {
|
|
5800
|
+
return Math.min(outputSize, compressed ? compressedSize * MAX_DEFLATE_EXPANSION_RATIO : compressedSize);
|
|
5801
|
+
}
|
|
5802
|
+
|
|
5669
5803
|
function getStrictness(options, inheritedOptions) {
|
|
5670
5804
|
return resolveStrictness(options, resolveStrictness(inheritedOptions, STRICTNESS_BALANCED));
|
|
5671
5805
|
}
|
|
@@ -5728,7 +5862,7 @@ function isUnsafeFilename(filename, filenameValidation) {
|
|
|
5728
5862
|
|
|
5729
5863
|
function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
|
|
5730
5864
|
if (maxAppendedDataSize !== UNDEFINED_VALUE) {
|
|
5731
|
-
const size = toNumber
|
|
5865
|
+
const size = toNumber(maxAppendedDataSize);
|
|
5732
5866
|
if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
|
|
5733
5867
|
throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE);
|
|
5734
5868
|
}
|
|
@@ -5751,7 +5885,7 @@ async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDat
|
|
|
5751
5885
|
let plausibleEndOfDirectoryInfo;
|
|
5752
5886
|
let endOfDirectoryReachingEndCount = 0;
|
|
5753
5887
|
for await (const [anchoredView, anchoredOffset, anchoredArray, indexByte, offset] of scanEndOfCentralDirectory(reader, anchoredLength)) {
|
|
5754
|
-
const commentLength = getUint16(anchoredView, indexByte + 20);
|
|
5888
|
+
const commentLength = getUint16$1(anchoredView, indexByte + 20);
|
|
5755
5889
|
if (offset + END_OF_CENTRAL_DIR_LENGTH + commentLength == size) {
|
|
5756
5890
|
const reachability = await getCentralDirectoryReachability(reader, anchoredView, anchoredOffset, indexByte, offset, size, remoteProbeBudget);
|
|
5757
5891
|
if (reachability == CENTRAL_DIRECTORY_REACHABLE) {
|
|
@@ -5802,7 +5936,7 @@ async function* scanEndOfCentralDirectory(reader, scanLength) {
|
|
|
5802
5936
|
const scanArray = await readUint8Array(reader, scanOffset, scanLength);
|
|
5803
5937
|
const scanView = getDataView(scanArray);
|
|
5804
5938
|
for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
|
|
5805
|
-
if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
5939
|
+
if (getUint32$1(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
5806
5940
|
yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
|
|
5807
5941
|
}
|
|
5808
5942
|
}
|
|
@@ -5813,9 +5947,9 @@ function getEndOfCentralDirectoryInfo(scanArray, indexByte, offset) {
|
|
|
5813
5947
|
}
|
|
5814
5948
|
|
|
5815
5949
|
async function getCentralDirectoryReachability(reader, view, anchoredOffset, indexByte, offset, size, remoteProbeBudget) {
|
|
5816
|
-
const filesLength = getUint16(view, indexByte + 10);
|
|
5817
|
-
const directoryDataLength = getUint32(view, indexByte + 12);
|
|
5818
|
-
const directoryDataOffset = getUint32(view, indexByte + 16);
|
|
5950
|
+
const filesLength = getUint16$1(view, indexByte + 10);
|
|
5951
|
+
const directoryDataLength = getUint32$1(view, indexByte + 12);
|
|
5952
|
+
const directoryDataOffset = getUint32$1(view, indexByte + 16);
|
|
5819
5953
|
if (filesLength == MAX_16_BITS || directoryDataLength == MAX_32_BITS || directoryDataOffset == MAX_32_BITS) {
|
|
5820
5954
|
const locatorSignature = await readSignature(reader, view, anchoredOffset, offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, size, remoteProbeBudget);
|
|
5821
5955
|
return locatorSignature == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE ? CENTRAL_DIRECTORY_REACHABLE : CENTRAL_DIRECTORY_UNREACHABLE;
|
|
@@ -5823,7 +5957,7 @@ async function getCentralDirectoryReachability(reader, view, anchoredOffset, ind
|
|
|
5823
5957
|
if (!filesLength && !directoryDataLength) {
|
|
5824
5958
|
return CENTRAL_DIRECTORY_PLAUSIBLE;
|
|
5825
5959
|
}
|
|
5826
|
-
const directoryDiskNumber = getUint16(view, indexByte + 6);
|
|
5960
|
+
const directoryDiskNumber = getUint16$1(view, indexByte + 6);
|
|
5827
5961
|
for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
|
|
5828
5962
|
if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
5829
5963
|
return CENTRAL_DIRECTORY_REACHABLE;
|
|
@@ -5837,19 +5971,21 @@ async function readSignature(reader, view, anchoredOffset, signatureOffset, size
|
|
|
5837
5971
|
return UNDEFINED_VALUE;
|
|
5838
5972
|
}
|
|
5839
5973
|
if (signatureOffset >= anchoredOffset) {
|
|
5840
|
-
return getUint32(view, signatureOffset - anchoredOffset);
|
|
5974
|
+
return getUint32$1(view, signatureOffset - anchoredOffset);
|
|
5841
5975
|
}
|
|
5842
5976
|
if (remoteProbeBudget.count > 0) {
|
|
5843
5977
|
remoteProbeBudget.count--;
|
|
5844
5978
|
const signatureArray = await readUint8Array(reader, signatureOffset, 4);
|
|
5845
|
-
return getUint32(getDataView(signatureArray), 0);
|
|
5979
|
+
return getUint32$1(getDataView(signatureArray), 0);
|
|
5846
5980
|
}
|
|
5847
5981
|
return UNDEFINED_VALUE;
|
|
5848
5982
|
}
|
|
5849
5983
|
|
|
5850
5984
|
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
|
|
5851
5985
|
const { rawFilename } = zipEntry;
|
|
5852
|
-
|
|
5986
|
+
const maskedLocalDirectory = zipEntry.decryptedDirectory &&
|
|
5987
|
+
(localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
|
|
5988
|
+
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
5853
5989
|
(rawLocalFilename.length != rawFilename.length ||
|
|
5854
5990
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
5855
5991
|
throwAmbiguousArchive("mismatched local file header (filename)");
|
|
@@ -5860,7 +5996,7 @@ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, chec
|
|
|
5860
5996
|
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
5861
5997
|
throwAmbiguousArchive("mismatched local file header (compression method)");
|
|
5862
5998
|
}
|
|
5863
|
-
if (!localDirectory.bitFlag.dataDescriptor &&
|
|
5999
|
+
if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
|
|
5864
6000
|
(localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
5865
6001
|
(localDirectory.crc32 != zipEntry.crc32 ||
|
|
5866
6002
|
localDirectory.compressedSize != zipEntry.compressedSize ||
|
|
@@ -5879,10 +6015,11 @@ function getOptionValue$1(zipReader, options, name) {
|
|
|
5879
6015
|
return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
|
|
5880
6016
|
}
|
|
5881
6017
|
|
|
5882
|
-
function
|
|
5883
|
-
return
|
|
6018
|
+
function getFunctionOptionValue$1(zipReader, options, name) {
|
|
6019
|
+
return checkFunctionOption(getOptionValue$1(zipReader, options, name));
|
|
5884
6020
|
}
|
|
5885
6021
|
|
|
6022
|
+
|
|
5886
6023
|
function getDate(timeRaw) {
|
|
5887
6024
|
const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
|
|
5888
6025
|
return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
|
|
@@ -5896,11 +6033,11 @@ function getUint8(view, offset) {
|
|
|
5896
6033
|
return view.getUint8(offset);
|
|
5897
6034
|
}
|
|
5898
6035
|
|
|
5899
|
-
function getUint16(view, offset) {
|
|
6036
|
+
function getUint16$1(view, offset) {
|
|
5900
6037
|
return view.getUint16(offset, true);
|
|
5901
6038
|
}
|
|
5902
6039
|
|
|
5903
|
-
function getUint32(view, offset) {
|
|
6040
|
+
function getUint32$1(view, offset) {
|
|
5904
6041
|
return view.getUint32(offset, true);
|
|
5905
6042
|
}
|
|
5906
6043
|
|
|
@@ -5915,6 +6052,7 @@ var zipReader = /*#__PURE__*/Object.freeze({
|
|
|
5915
6052
|
ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
|
|
5916
6053
|
ERR_ENCRYPTED: ERR_ENCRYPTED,
|
|
5917
6054
|
ERR_ENCRYPTED_CENTRAL_DIRECTORY: ERR_ENCRYPTED_CENTRAL_DIRECTORY,
|
|
6055
|
+
ERR_ENTRY_DATA_OUT_OF_BOUNDS: ERR_ENTRY_DATA_OUT_OF_BOUNDS,
|
|
5918
6056
|
ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
|
|
5919
6057
|
ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
|
|
5920
6058
|
ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
|
|
@@ -5971,12 +6109,16 @@ const ERR_DUPLICATED_NAME = "File already exists";
|
|
|
5971
6109
|
const ERR_INVALID_COMMENT = "Zip file comment exceeds 64KB";
|
|
5972
6110
|
const ERR_INVALID_COMMENT_TYPE = "Invalid zip file comment (must be a Uint8Array)";
|
|
5973
6111
|
const ERR_INVALID_ENTRY_COMMENT = "File entry comment exceeds 64KB";
|
|
6112
|
+
const ERR_INVALID_ENTRY_COMMENT_TYPE = "Invalid file entry comment (must be a string)";
|
|
6113
|
+
const ERR_INVALID_DATE = "Invalid date (must be a valid Date instance)";
|
|
5974
6114
|
const ERR_INVALID_ENTRY_NAME = "File entry name exceeds 64KB";
|
|
5975
6115
|
const ERR_INVALID_VERSION = "Version exceeds 65535";
|
|
5976
6116
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
5977
6117
|
const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
|
|
5978
6118
|
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
|
|
5979
|
-
const
|
|
6119
|
+
const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
|
|
6120
|
+
const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
|
|
6121
|
+
const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
|
|
5980
6122
|
const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
|
|
5981
6123
|
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
5982
6124
|
const MIN_UNIX_TIME = -2147483648;
|
|
@@ -5985,6 +6127,7 @@ const MIN_NTFS_TIME = BigInt(0);
|
|
|
5985
6127
|
const MAX_NTFS_TIME = BigInt("0x7fffffffffffffff");
|
|
5986
6128
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
5987
6129
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
6130
|
+
const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
|
|
5988
6131
|
const ERR_UNDETERMINED_SIZE = "Undetermined size";
|
|
5989
6132
|
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
5990
6133
|
const ERR_ZIP_NOT_EMPTY = "Zip file not empty";
|
|
@@ -5996,7 +6139,6 @@ const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldTyp
|
|
|
5996
6139
|
const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
|
|
5997
6140
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
5998
6141
|
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
5999
|
-
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
6000
6142
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
6001
6143
|
|
|
6002
6144
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
@@ -6021,8 +6163,7 @@ class ZipWriter {
|
|
|
6021
6163
|
writer,
|
|
6022
6164
|
addSplitZipSignature,
|
|
6023
6165
|
options,
|
|
6024
|
-
|
|
6025
|
-
files: new Map(),
|
|
6166
|
+
fileEntries: new Map(),
|
|
6026
6167
|
filenames: new Set(),
|
|
6027
6168
|
offset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options[OPTION_OFFSET],
|
|
6028
6169
|
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
@@ -6043,14 +6184,23 @@ class ZipWriter {
|
|
|
6043
6184
|
await initStream(reader);
|
|
6044
6185
|
}
|
|
6045
6186
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6046
|
-
const zipReader$1 = new ZipReader(reader
|
|
6187
|
+
const zipReader$1 = new ZipReader(reader);
|
|
6047
6188
|
const entries = await zipReader$1.getEntries();
|
|
6048
6189
|
await zipReader$1.close();
|
|
6049
6190
|
await initStream(this.writer);
|
|
6050
|
-
|
|
6051
|
-
|
|
6191
|
+
const { directoryOffset } = zipReader$1;
|
|
6192
|
+
let splitZipSignatureLength = 0;
|
|
6193
|
+
if (this.addSplitZipSignature) {
|
|
6194
|
+
delete this.addSplitZipSignature;
|
|
6195
|
+
if (!await startsWithSplitZipSignature(reader)) {
|
|
6196
|
+
await writeData(this.writer, getSplitZipSignatureArray());
|
|
6197
|
+
splitZipSignatureLength = SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6198
|
+
this.offset += splitZipSignatureLength;
|
|
6199
|
+
}
|
|
6200
|
+
}
|
|
6201
|
+
const entryPositions = await copyZipData(this, reader, entries, directoryOffset, splitZipSignatureLength);
|
|
6052
6202
|
this.filenames = new Set(entries.map(entry => entry.filename));
|
|
6053
|
-
this.
|
|
6203
|
+
this.fileEntries = new Map(entries.map(entry => {
|
|
6054
6204
|
const {
|
|
6055
6205
|
version,
|
|
6056
6206
|
rawLastModDate,
|
|
@@ -6105,11 +6255,12 @@ class ZipWriter {
|
|
|
6105
6255
|
if (crc32 !== UNDEFINED_VALUE) {
|
|
6106
6256
|
setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
|
|
6107
6257
|
}
|
|
6258
|
+
const { offset, diskNumberStart } = entryPositions.get(entry);
|
|
6108
6259
|
Object.assign(entry, {
|
|
6109
6260
|
zip64UncompressedSize,
|
|
6110
6261
|
zip64CompressedSize,
|
|
6111
|
-
|
|
6112
|
-
diskNumberStart
|
|
6262
|
+
offset,
|
|
6263
|
+
diskNumberStart,
|
|
6113
6264
|
zip64DiskNumberStart: false,
|
|
6114
6265
|
rawExtraFieldZip64,
|
|
6115
6266
|
rawExtraFieldAES,
|
|
@@ -6129,11 +6280,8 @@ class ZipWriter {
|
|
|
6129
6280
|
async add(name = "", reader, options = {}) {
|
|
6130
6281
|
const zipWriter = this;
|
|
6131
6282
|
options = Object.assign({}, options);
|
|
6132
|
-
const {
|
|
6133
|
-
|
|
6134
|
-
config
|
|
6135
|
-
} = zipWriter;
|
|
6136
|
-
if (workers < config.maxWorkers) {
|
|
6283
|
+
const { pendingAddFileCalls } = zipWriter;
|
|
6284
|
+
if (workers < getConfiguration().maxWorkers) {
|
|
6137
6285
|
workers++;
|
|
6138
6286
|
} else {
|
|
6139
6287
|
await new Promise(resolve => pendingEntries.push(resolve));
|
|
@@ -6170,16 +6318,16 @@ class ZipWriter {
|
|
|
6170
6318
|
}
|
|
6171
6319
|
|
|
6172
6320
|
remove(entry) {
|
|
6173
|
-
const { filenames,
|
|
6321
|
+
const { filenames, fileEntries } = this;
|
|
6174
6322
|
// deno-lint-ignore valid-typeof
|
|
6175
6323
|
if (typeof entry == STRING_TYPE) {
|
|
6176
|
-
entry =
|
|
6324
|
+
entry = fileEntries.get(entry);
|
|
6177
6325
|
}
|
|
6178
6326
|
if (entry && entry.filename !== UNDEFINED_VALUE) {
|
|
6179
6327
|
const { filename } = entry;
|
|
6180
|
-
if (filenames.has(filename) &&
|
|
6328
|
+
if (filenames.has(filename) && fileEntries.has(filename)) {
|
|
6181
6329
|
filenames.delete(filename);
|
|
6182
|
-
|
|
6330
|
+
fileEntries.delete(filename);
|
|
6183
6331
|
return true;
|
|
6184
6332
|
}
|
|
6185
6333
|
}
|
|
@@ -6276,12 +6424,12 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
6276
6424
|
const metadataInfo = resolveMetadata(zipWriter, name, options);
|
|
6277
6425
|
const { comment } = metadataInfo;
|
|
6278
6426
|
const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
|
|
6279
|
-
zipWriter.
|
|
6427
|
+
zipWriter.fileEntries.set(name, UNDEFINED_VALUE);
|
|
6280
6428
|
let fileEntry;
|
|
6281
6429
|
try {
|
|
6282
6430
|
const { resolvedOptions } = metadataInfo;
|
|
6283
6431
|
if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
|
|
6284
|
-
!resolvedOptions.passThrough && !(await supportsDeflate(
|
|
6432
|
+
!resolvedOptions.passThrough && !(await supportsDeflate(getConfiguration()))) {
|
|
6285
6433
|
resolvedOptions.level = 0;
|
|
6286
6434
|
}
|
|
6287
6435
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
@@ -6299,7 +6447,7 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
6299
6447
|
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
6300
6448
|
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
6301
6449
|
} catch (error) {
|
|
6302
|
-
zipWriter.
|
|
6450
|
+
zipWriter.fileEntries.delete(name);
|
|
6303
6451
|
throw error;
|
|
6304
6452
|
}
|
|
6305
6453
|
Object.assign(fileEntry, {
|
|
@@ -6343,9 +6491,9 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6343
6491
|
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
6344
6492
|
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE$1;
|
|
6345
6493
|
}
|
|
6346
|
-
let msdosAttributesRaw =
|
|
6494
|
+
let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
6347
6495
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
6348
|
-
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType;
|
|
6496
|
+
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType || executable;
|
|
6349
6497
|
const hasMsDosProvided = msdosAttributesRaw !== UNDEFINED_VALUE || msdosAttributes !== UNDEFINED_VALUE;
|
|
6350
6498
|
if (hasUnixMetadata) {
|
|
6351
6499
|
msDosCompatible = false;
|
|
@@ -6354,10 +6502,10 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6354
6502
|
msDosCompatible = true;
|
|
6355
6503
|
versionMadeBy = (versionMadeBy & MAX_8_BITS);
|
|
6356
6504
|
}
|
|
6357
|
-
if (msdosAttributesRaw !== UNDEFINED_VALUE && (msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
|
|
6505
|
+
if (msdosAttributesRaw !== UNDEFINED_VALUE && (!Number.isInteger(msdosAttributesRaw) || msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
|
|
6358
6506
|
throw new Error(ERR_INVALID_MSDOS_ATTRIBUTES);
|
|
6359
6507
|
}
|
|
6360
|
-
if (msdosAttributes && typeof msdosAttributes !== OBJECT_TYPE) {
|
|
6508
|
+
if (msdosAttributes && (typeof msdosAttributes !== OBJECT_TYPE || Array.isArray(msdosAttributes))) {
|
|
6361
6509
|
throw new Error(ERR_INVALID_MSDOS_DATA);
|
|
6362
6510
|
}
|
|
6363
6511
|
if (versionMadeBy > MAX_16_BITS) {
|
|
@@ -6445,7 +6593,7 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6445
6593
|
}
|
|
6446
6594
|
|
|
6447
6595
|
function resolveMetadata(zipWriter, name, options) {
|
|
6448
|
-
const encode =
|
|
6596
|
+
const encode = getFunctionOptionValue(zipWriter, options, OPTION_ENCODE_TEXT) || encodeText;
|
|
6449
6597
|
let rawFilename = encode(name, TEXT_TYPE_FILENAME);
|
|
6450
6598
|
if (rawFilename === UNDEFINED_VALUE) {
|
|
6451
6599
|
rawFilename = encodeText(name);
|
|
@@ -6454,6 +6602,10 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6454
6602
|
throw new Error(ERR_INVALID_ENTRY_NAME);
|
|
6455
6603
|
}
|
|
6456
6604
|
const comment = options[PROPERTY_NAME_COMMENT] || "";
|
|
6605
|
+
// deno-lint-ignore valid-typeof
|
|
6606
|
+
if (typeof comment != STRING_TYPE) {
|
|
6607
|
+
throw new Error(ERR_INVALID_ENTRY_COMMENT_TYPE);
|
|
6608
|
+
}
|
|
6457
6609
|
let rawComment = encode(comment, TEXT_TYPE_COMMENT);
|
|
6458
6610
|
if (rawComment === UNDEFINED_VALUE) {
|
|
6459
6611
|
rawComment = encodeText(comment);
|
|
@@ -6465,16 +6617,14 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6465
6617
|
if (version > MAX_16_BITS) {
|
|
6466
6618
|
throw new Error(ERR_INVALID_VERSION);
|
|
6467
6619
|
}
|
|
6468
|
-
const lastModDate =
|
|
6469
|
-
const lastAccessDate =
|
|
6470
|
-
const creationDate =
|
|
6620
|
+
const lastModDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE, new Date());
|
|
6621
|
+
const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
|
|
6622
|
+
const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
|
|
6471
6623
|
const internalFileAttributes = getAliasedOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, PROPERTY_NAME_DEPRECATED_INTERNAL_FILE_ATTRIBUTES, 0);
|
|
6472
6624
|
const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
|
|
6473
6625
|
const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6474
6626
|
const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6475
|
-
|
|
6476
|
-
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
6477
|
-
}
|
|
6627
|
+
checkPasswordOption(password, rawPassword);
|
|
6478
6628
|
const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
|
|
6479
6629
|
const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
|
|
6480
6630
|
const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
|
|
@@ -6483,9 +6633,9 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6483
6633
|
const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
|
|
6484
6634
|
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
|
|
6485
6635
|
const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
|
|
6486
|
-
const createTempStream =
|
|
6636
|
+
const createTempStream = getFunctionOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
6487
6637
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
6488
|
-
const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
|
|
6638
|
+
const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
|
|
6489
6639
|
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
|
|
6490
6640
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
6491
6641
|
const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
@@ -6505,6 +6655,9 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6505
6655
|
level = 0;
|
|
6506
6656
|
}
|
|
6507
6657
|
}
|
|
6658
|
+
if (passThrough) {
|
|
6659
|
+
level = UNDEFINED_VALUE;
|
|
6660
|
+
}
|
|
6508
6661
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
6509
6662
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
6510
6663
|
if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
|
|
@@ -6565,18 +6718,26 @@ function serializeExtraField(extraField) {
|
|
|
6565
6718
|
if (!extraField) {
|
|
6566
6719
|
return EMPTY_UINT8_ARRAY;
|
|
6567
6720
|
}
|
|
6721
|
+
if (!(extraField instanceof Map)) {
|
|
6722
|
+
throw new Error(ERR_INVALID_EXTRAFIELD);
|
|
6723
|
+
}
|
|
6568
6724
|
let extraFieldSize = 0;
|
|
6569
6725
|
let offset = 0;
|
|
6570
|
-
extraField.forEach(data => extraFieldSize += 4 + getLength(data));
|
|
6571
|
-
const rawExtraField = new Uint8Array(extraFieldSize);
|
|
6572
|
-
const rawExtraFieldView = getDataView(rawExtraField);
|
|
6573
6726
|
extraField.forEach((data, type) => {
|
|
6574
|
-
if (type > MAX_16_BITS) {
|
|
6727
|
+
if (!Number.isInteger(type) || type < 0 || type > MAX_16_BITS) {
|
|
6575
6728
|
throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
|
|
6576
6729
|
}
|
|
6730
|
+
if (!(data instanceof Uint8Array)) {
|
|
6731
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA_TYPE);
|
|
6732
|
+
}
|
|
6577
6733
|
if (getLength(data) > MAX_16_BITS) {
|
|
6578
6734
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
6579
6735
|
}
|
|
6736
|
+
extraFieldSize += 4 + getLength(data);
|
|
6737
|
+
});
|
|
6738
|
+
const rawExtraField = new Uint8Array(extraFieldSize);
|
|
6739
|
+
const rawExtraFieldView = getDataView(rawExtraField);
|
|
6740
|
+
extraField.forEach((data, type) => {
|
|
6580
6741
|
setUint16(rawExtraFieldView, offset, type);
|
|
6581
6742
|
setUint16(rawExtraFieldView, offset + 2, getLength(data));
|
|
6582
6743
|
arraySet(rawExtraField, data, offset + 4);
|
|
@@ -6608,6 +6769,9 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
|
|
|
6608
6769
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
6609
6770
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
6610
6771
|
}
|
|
6772
|
+
if (compressionMethod === UNDEFINED_VALUE) {
|
|
6773
|
+
throw new Error(ERR_UNDEFINED_COMPRESSION_METHOD);
|
|
6774
|
+
}
|
|
6611
6775
|
}
|
|
6612
6776
|
const zip64Enabled = zip64 === true;
|
|
6613
6777
|
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
@@ -6663,8 +6827,8 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
|
|
|
6663
6827
|
}
|
|
6664
6828
|
|
|
6665
6829
|
async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comment) {
|
|
6666
|
-
const zipWriter = { options: writerOptions
|
|
6667
|
-
if (writerOptions[OPTION_SIGN_CENTRAL_DIRECTORY]) {
|
|
6830
|
+
const zipWriter = { options: writerOptions };
|
|
6831
|
+
if (checkFunctionOption(writerOptions[OPTION_SIGN_CENTRAL_DIRECTORY])) {
|
|
6668
6832
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
6669
6833
|
}
|
|
6670
6834
|
if (comment !== UNDEFINED_VALUE && !(comment instanceof Uint8Array)) {
|
|
@@ -6690,7 +6854,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
6690
6854
|
({ name } = attributesInfo);
|
|
6691
6855
|
const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
|
|
6692
6856
|
if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
|
|
6693
|
-
!metadata.passThrough && !(await supportsDeflate(
|
|
6857
|
+
!metadata.passThrough && !(await supportsDeflate(getConfiguration()))) {
|
|
6694
6858
|
metadata.level = 0;
|
|
6695
6859
|
}
|
|
6696
6860
|
const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
|
|
@@ -6739,7 +6903,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
6739
6903
|
|
|
6740
6904
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
6741
6905
|
const {
|
|
6742
|
-
|
|
6906
|
+
fileEntries,
|
|
6743
6907
|
writer
|
|
6744
6908
|
} = zipWriter;
|
|
6745
6909
|
const {
|
|
@@ -6761,12 +6925,12 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6761
6925
|
let writerSizeBeforeEntry;
|
|
6762
6926
|
let flushedBufferedSize = 0;
|
|
6763
6927
|
let fileWriter;
|
|
6764
|
-
|
|
6928
|
+
fileEntries.set(name, fileEntry);
|
|
6765
6929
|
zipWriter.lastFileEntry = fileEntry;
|
|
6766
6930
|
try {
|
|
6767
6931
|
let lockPreviousFileEntry;
|
|
6768
6932
|
if (keepOrder) {
|
|
6769
|
-
lockPreviousFileEntry = previousFileEntry && previousFileEntry.
|
|
6933
|
+
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
|
|
6770
6934
|
requestLockCurrentFileEntry();
|
|
6771
6935
|
}
|
|
6772
6936
|
if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
|
|
@@ -6787,11 +6951,8 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6787
6951
|
const diskOffset = getDiskOffset(writer);
|
|
6788
6952
|
if (zipWriter.addSplitZipSignature) {
|
|
6789
6953
|
delete zipWriter.addSplitZipSignature;
|
|
6790
|
-
|
|
6791
|
-
|
|
6792
|
-
setUint32(signatureArrayView, 0, SPLIT_ZIP_FILE_SIGNATURE);
|
|
6793
|
-
await writeData(writer, signatureArray);
|
|
6794
|
-
zipWriter.offset += 4;
|
|
6954
|
+
await writeData(writer, getSplitZipSignatureArray());
|
|
6955
|
+
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6795
6956
|
}
|
|
6796
6957
|
if (usdz && !bufferedWrite) {
|
|
6797
6958
|
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
|
|
@@ -6809,11 +6970,11 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6809
6970
|
writerSizeBeforeEntry = writer.size;
|
|
6810
6971
|
await writeData(fileWriter, localHeaderArray);
|
|
6811
6972
|
}
|
|
6812
|
-
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo,
|
|
6973
|
+
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, getConfiguration(), options);
|
|
6813
6974
|
if (!bufferedWrite) {
|
|
6814
6975
|
writingEntryData = false;
|
|
6815
6976
|
}
|
|
6816
|
-
|
|
6977
|
+
fileEntries.set(name, fileEntry);
|
|
6817
6978
|
fileEntry.filename = name;
|
|
6818
6979
|
if (bufferedWrite) {
|
|
6819
6980
|
await Promise.all([fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
|
|
@@ -6854,7 +7015,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6854
7015
|
zipWriter.offset += flushedBufferedSize;
|
|
6855
7016
|
}
|
|
6856
7017
|
}
|
|
6857
|
-
|
|
7018
|
+
fileEntries.delete(name);
|
|
6858
7019
|
throw error;
|
|
6859
7020
|
} finally {
|
|
6860
7021
|
if (bufferedWrite) {
|
|
@@ -6876,7 +7037,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6876
7037
|
}
|
|
6877
7038
|
|
|
6878
7039
|
function requestLockCurrentFileEntry() {
|
|
6879
|
-
fileEntry.
|
|
7040
|
+
fileEntry.lockFileEntry = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
|
|
6880
7041
|
}
|
|
6881
7042
|
|
|
6882
7043
|
async function requestLockWriter() {
|
|
@@ -6896,7 +7057,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6896
7057
|
}
|
|
6897
7058
|
}
|
|
6898
7059
|
|
|
6899
|
-
async function createFileEntry(reader, writer, { diskNumberStart,
|
|
7060
|
+
async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry }, entryInfo, config, options) {
|
|
6900
7061
|
const {
|
|
6901
7062
|
headerInfo,
|
|
6902
7063
|
dataDescriptorInfo,
|
|
@@ -6964,7 +7125,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
|
|
|
6964
7125
|
codecURI
|
|
6965
7126
|
} = options;
|
|
6966
7127
|
const fileEntry = {
|
|
6967
|
-
|
|
7128
|
+
lockFileEntry,
|
|
6968
7129
|
versionMadeBy,
|
|
6969
7130
|
zip64,
|
|
6970
7131
|
directory: Boolean(directory),
|
|
@@ -7006,7 +7167,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
|
|
|
7006
7167
|
}
|
|
7007
7168
|
const { writable } = writer;
|
|
7008
7169
|
if (reader) {
|
|
7009
|
-
const readable = toCompatibleReadable(
|
|
7170
|
+
const readable = toCompatibleReadable(createReadable(reader));
|
|
7010
7171
|
const size = reader.size;
|
|
7011
7172
|
const workerOptions = {
|
|
7012
7173
|
options: {
|
|
@@ -7118,14 +7279,14 @@ function getHeaderInfo(options) {
|
|
|
7118
7279
|
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
7119
7280
|
const length = 4 + 16;
|
|
7120
7281
|
const extraFieldZip64 = createRecordWriter(length);
|
|
7121
|
-
extraFieldZip64.
|
|
7122
|
-
extraFieldZip64.
|
|
7282
|
+
extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
|
|
7283
|
+
extraFieldZip64.writeUint16(length - 4);
|
|
7123
7284
|
rawLocalExtraFieldZip64 = extraFieldZip64.array;
|
|
7124
7285
|
if (zip64ExtraFieldComplete) {
|
|
7125
|
-
extraFieldZip64.
|
|
7286
|
+
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7126
7287
|
if (uncompressedFile) {
|
|
7127
7288
|
const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
7128
|
-
extraFieldZip64.
|
|
7289
|
+
extraFieldZip64.writeUint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
|
|
7129
7290
|
}
|
|
7130
7291
|
}
|
|
7131
7292
|
} else {
|
|
@@ -7134,8 +7295,8 @@ function getHeaderInfo(options) {
|
|
|
7134
7295
|
let rawExtraFieldAES;
|
|
7135
7296
|
if (encrypted && !zipCrypto) {
|
|
7136
7297
|
const extraFieldAES = createRecordWriter(getLength(EXTRAFIELD_DATA_AES) + 2);
|
|
7137
|
-
extraFieldAES.
|
|
7138
|
-
extraFieldAES.
|
|
7298
|
+
extraFieldAES.writeUint16(EXTRAFIELD_TYPE_AES);
|
|
7299
|
+
extraFieldAES.writeBytes(EXTRAFIELD_DATA_AES);
|
|
7139
7300
|
rawExtraFieldAES = extraFieldAES.array;
|
|
7140
7301
|
rawExtraFieldAES[8] = encryptionStrength;
|
|
7141
7302
|
} else {
|
|
@@ -7151,15 +7312,15 @@ function getHeaderInfo(options) {
|
|
|
7151
7312
|
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
7152
7313
|
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
7153
7314
|
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
7154
|
-
extraFieldTimestamp.
|
|
7155
|
-
extraFieldTimestamp.
|
|
7156
|
-
extraFieldTimestamp.
|
|
7157
|
-
extraFieldTimestamp.
|
|
7315
|
+
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7316
|
+
extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
|
|
7317
|
+
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7318
|
+
extraFieldTimestamp.writeUint32(lastModTimeUnix);
|
|
7158
7319
|
if (lastAccessDate) {
|
|
7159
|
-
extraFieldTimestamp.
|
|
7320
|
+
extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(lastAccessDate)));
|
|
7160
7321
|
}
|
|
7161
7322
|
if (creationDate) {
|
|
7162
|
-
extraFieldTimestamp.
|
|
7323
|
+
extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(creationDate)));
|
|
7163
7324
|
}
|
|
7164
7325
|
rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
|
|
7165
7326
|
} else {
|
|
@@ -7172,14 +7333,14 @@ function getHeaderInfo(options) {
|
|
|
7172
7333
|
try {
|
|
7173
7334
|
const lastModTimeNTFS = getTimeNTFS(lastModDate);
|
|
7174
7335
|
const extraFieldNTFS = createRecordWriter(36);
|
|
7175
|
-
extraFieldNTFS.
|
|
7176
|
-
extraFieldNTFS.
|
|
7336
|
+
extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS);
|
|
7337
|
+
extraFieldNTFS.writeUint16(32);
|
|
7177
7338
|
extraFieldNTFS.skip(4);
|
|
7178
|
-
extraFieldNTFS.
|
|
7179
|
-
extraFieldNTFS.
|
|
7180
|
-
extraFieldNTFS.
|
|
7181
|
-
extraFieldNTFS.
|
|
7182
|
-
extraFieldNTFS.
|
|
7339
|
+
extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS_TAG1);
|
|
7340
|
+
extraFieldNTFS.writeUint16(24);
|
|
7341
|
+
extraFieldNTFS.writeUint64(lastModTimeNTFS);
|
|
7342
|
+
extraFieldNTFS.writeUint64(lastAccessDate ? getTimeNTFS(lastAccessDate) : lastModTimeNTFS);
|
|
7343
|
+
extraFieldNTFS.writeUint64(creationDate ? getTimeNTFS(creationDate) : lastModTimeNTFS);
|
|
7183
7344
|
rawExtraFieldNTFS = extraFieldNTFS.array;
|
|
7184
7345
|
} catch {
|
|
7185
7346
|
rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
|
|
@@ -7198,20 +7359,20 @@ function getHeaderInfo(options) {
|
|
|
7198
7359
|
const gidBytes = packUnixId(gid);
|
|
7199
7360
|
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
7200
7361
|
const extraFieldUnix = createRecordWriter(4 + payloadLength);
|
|
7201
|
-
extraFieldUnix.
|
|
7202
|
-
extraFieldUnix.
|
|
7203
|
-
extraFieldUnix.
|
|
7204
|
-
extraFieldUnix.
|
|
7205
|
-
extraFieldUnix.
|
|
7206
|
-
extraFieldUnix.
|
|
7207
|
-
extraFieldUnix.
|
|
7362
|
+
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_INFOZIP);
|
|
7363
|
+
extraFieldUnix.writeUint16(payloadLength);
|
|
7364
|
+
extraFieldUnix.writeUint8(1);
|
|
7365
|
+
extraFieldUnix.writeUint8(uidBytes.length);
|
|
7366
|
+
extraFieldUnix.writeBytes(uidBytes);
|
|
7367
|
+
extraFieldUnix.writeUint8(gidBytes.length);
|
|
7368
|
+
extraFieldUnix.writeBytes(gidBytes);
|
|
7208
7369
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
7209
7370
|
} else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
7210
7371
|
const extraFieldUnix = createRecordWriter(8);
|
|
7211
|
-
extraFieldUnix.
|
|
7212
|
-
extraFieldUnix.
|
|
7213
|
-
extraFieldUnix.
|
|
7214
|
-
extraFieldUnix.
|
|
7372
|
+
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
|
|
7373
|
+
extraFieldUnix.writeUint16(4);
|
|
7374
|
+
extraFieldUnix.writeUint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
|
|
7375
|
+
extraFieldUnix.writeUint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
|
|
7215
7376
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
7216
7377
|
} else {
|
|
7217
7378
|
rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
|
|
@@ -7261,18 +7422,18 @@ function getHeaderInfo(options) {
|
|
|
7261
7422
|
const localHeader = createRecordWriter(HEADER_SIZE + getLength(rawFilename) + extraFieldLength);
|
|
7262
7423
|
const localHeaderArray = localHeader.array;
|
|
7263
7424
|
const localHeaderView = getDataView(localHeaderArray);
|
|
7264
|
-
localHeader.
|
|
7265
|
-
localHeader.
|
|
7266
|
-
localHeader.
|
|
7425
|
+
localHeader.writeUint32(LOCAL_FILE_HEADER_SIGNATURE);
|
|
7426
|
+
localHeader.writeBytes(headerArray);
|
|
7427
|
+
localHeader.writeBytes(rawFilename);
|
|
7267
7428
|
if (writeLocalExtraFieldZip64) {
|
|
7268
|
-
localHeader.
|
|
7269
|
-
}
|
|
7270
|
-
localHeader.
|
|
7271
|
-
localHeader.
|
|
7272
|
-
localHeader.
|
|
7273
|
-
localHeader.
|
|
7274
|
-
localHeader.
|
|
7275
|
-
localHeader.
|
|
7429
|
+
localHeader.writeBytes(rawLocalExtraFieldZip64);
|
|
7430
|
+
}
|
|
7431
|
+
localHeader.writeBytes(rawExtraFieldAES);
|
|
7432
|
+
localHeader.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
7433
|
+
localHeader.writeBytes(rawExtraFieldNTFS);
|
|
7434
|
+
localHeader.writeBytes(rawExtraFieldUnix);
|
|
7435
|
+
localHeader.writeBytes(rawExtraField);
|
|
7436
|
+
localHeader.writeBytes(rawLocalExtraField);
|
|
7276
7437
|
if (dataDescriptor) {
|
|
7277
7438
|
if (!zip64CompressedSize) {
|
|
7278
7439
|
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
@@ -7462,7 +7623,7 @@ function updateLocalHeader({
|
|
|
7462
7623
|
|
|
7463
7624
|
|
|
7464
7625
|
async function closeFile(zipWriter, comment, options) {
|
|
7465
|
-
const directoryDataLength = createDirectoryRecords(zipWriter.
|
|
7626
|
+
const directoryDataLength = createDirectoryRecords(zipWriter.fileEntries);
|
|
7466
7627
|
const { directoryStart, directoryArray } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
|
|
7467
7628
|
const signatureLength = await writeDigitalSignatureRecord(zipWriter, directoryArray, options);
|
|
7468
7629
|
await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength, signatureLength });
|
|
@@ -7492,19 +7653,19 @@ function createDirectoryRecords(files) {
|
|
|
7492
7653
|
if (zip64Offset || zip64DiskNumberStart || zip64UncompressedSize || zip64CompressedSize) {
|
|
7493
7654
|
const length = 4 + (zip64UncompressedSize ? 8 : 0) + (zip64CompressedSize ? 8 : 0) + (zip64Offset ? 8 : 0) + (zip64DiskNumberStart ? 4 : 0);
|
|
7494
7655
|
const extraFieldZip64 = createRecordWriter(length);
|
|
7495
|
-
extraFieldZip64.
|
|
7496
|
-
extraFieldZip64.
|
|
7656
|
+
extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
|
|
7657
|
+
extraFieldZip64.writeUint16(length - 4);
|
|
7497
7658
|
if (zip64UncompressedSize) {
|
|
7498
|
-
extraFieldZip64.
|
|
7659
|
+
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7499
7660
|
}
|
|
7500
7661
|
if (zip64CompressedSize) {
|
|
7501
|
-
extraFieldZip64.
|
|
7662
|
+
extraFieldZip64.writeUint64(compressedSize);
|
|
7502
7663
|
}
|
|
7503
7664
|
if (zip64Offset) {
|
|
7504
|
-
extraFieldZip64.
|
|
7665
|
+
extraFieldZip64.writeUint64(fileEntry.offset);
|
|
7505
7666
|
}
|
|
7506
7667
|
if (zip64DiskNumberStart) {
|
|
7507
|
-
extraFieldZip64.
|
|
7668
|
+
extraFieldZip64.writeUint32(fileEntry.diskNumberStart);
|
|
7508
7669
|
}
|
|
7509
7670
|
rawExtraFieldZip64 = extraFieldZip64.array;
|
|
7510
7671
|
} else {
|
|
@@ -7517,10 +7678,10 @@ function createDirectoryRecords(files) {
|
|
|
7517
7678
|
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
7518
7679
|
if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
|
|
7519
7680
|
const extraFieldTimestamp = createRecordWriter(9);
|
|
7520
|
-
extraFieldTimestamp.
|
|
7521
|
-
extraFieldTimestamp.
|
|
7522
|
-
extraFieldTimestamp.
|
|
7523
|
-
extraFieldTimestamp.
|
|
7681
|
+
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7682
|
+
extraFieldTimestamp.writeUint16(5);
|
|
7683
|
+
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7684
|
+
extraFieldTimestamp.writeUint32(lastModTimeUnix);
|
|
7524
7685
|
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
7525
7686
|
} else {
|
|
7526
7687
|
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
@@ -7542,14 +7703,14 @@ function createDirectoryRecords(files) {
|
|
|
7542
7703
|
}
|
|
7543
7704
|
|
|
7544
7705
|
async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
7545
|
-
const {
|
|
7706
|
+
const { fileEntries, writer } = zipWriter;
|
|
7546
7707
|
const directoryArray = new Uint8Array(directoryDataLength);
|
|
7547
7708
|
await initStream(writer);
|
|
7548
7709
|
let offset = 0;
|
|
7549
7710
|
let directoryDiskOffset = 0;
|
|
7550
7711
|
let directoryStartDiskNumber = getDiskNumber(writer);
|
|
7551
7712
|
let directoryStartDiskOffset = getDiskOffset(writer);
|
|
7552
|
-
for (const [indexFileEntry, fileEntry] of Array.from(
|
|
7713
|
+
for (const [indexFileEntry, fileEntry] of Array.from(fileEntries.values()).entries()) {
|
|
7553
7714
|
const {
|
|
7554
7715
|
offset: fileEntryOffset,
|
|
7555
7716
|
rawFilename,
|
|
@@ -7594,28 +7755,28 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
|
7594
7755
|
setUint16(headerView, HEADER_OFFSET_VERSION, VERSION_ZIP64);
|
|
7595
7756
|
}
|
|
7596
7757
|
const directoryRecord = createRecordWriter(directoryRecordLength);
|
|
7597
|
-
directoryRecord.
|
|
7598
|
-
directoryRecord.
|
|
7599
|
-
directoryRecord.
|
|
7600
|
-
directoryRecord.
|
|
7601
|
-
directoryRecord.
|
|
7602
|
-
directoryRecord.
|
|
7603
|
-
directoryRecord.
|
|
7604
|
-
directoryRecord.
|
|
7605
|
-
directoryRecord.
|
|
7606
|
-
directoryRecord.
|
|
7607
|
-
directoryRecord.
|
|
7608
|
-
directoryRecord.
|
|
7609
|
-
directoryRecord.
|
|
7610
|
-
directoryRecord.
|
|
7611
|
-
directoryRecord.
|
|
7612
|
-
directoryRecord.
|
|
7613
|
-
directoryRecord.
|
|
7758
|
+
directoryRecord.writeUint32(CENTRAL_FILE_HEADER_SIGNATURE);
|
|
7759
|
+
directoryRecord.writeUint16(versionMadeBy);
|
|
7760
|
+
directoryRecord.writeBytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
|
|
7761
|
+
directoryRecord.writeUint16(extraFieldLength);
|
|
7762
|
+
directoryRecord.writeUint16(getLength(rawComment));
|
|
7763
|
+
directoryRecord.writeUint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
|
|
7764
|
+
directoryRecord.writeUint16(internalFileAttributes);
|
|
7765
|
+
directoryRecord.writeUint32(externalFileAttributes);
|
|
7766
|
+
directoryRecord.writeUint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
|
|
7767
|
+
directoryRecord.writeBytes(rawFilename);
|
|
7768
|
+
directoryRecord.writeBytes(rawExtraFieldZip64);
|
|
7769
|
+
directoryRecord.writeBytes(rawExtraFieldAES);
|
|
7770
|
+
directoryRecord.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
7771
|
+
directoryRecord.writeBytes(rawExtraFieldNTFS);
|
|
7772
|
+
directoryRecord.writeBytes(rawExtraFieldUnix);
|
|
7773
|
+
directoryRecord.writeBytes(rawExtraField);
|
|
7774
|
+
directoryRecord.writeBytes(rawComment);
|
|
7614
7775
|
arraySet(directoryArray, directoryRecord.array, offset);
|
|
7615
7776
|
offset += directoryRecordLength;
|
|
7616
7777
|
if (options.onprogress) {
|
|
7617
7778
|
try {
|
|
7618
|
-
await options.onprogress(indexFileEntry + 1,
|
|
7779
|
+
await options.onprogress(indexFileEntry + 1, fileEntries.size, new Entry(fileEntry));
|
|
7619
7780
|
} catch {
|
|
7620
7781
|
// ignored
|
|
7621
7782
|
}
|
|
@@ -7629,7 +7790,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
|
7629
7790
|
}
|
|
7630
7791
|
|
|
7631
7792
|
async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
|
|
7632
|
-
const signCentralDirectory =
|
|
7793
|
+
const signCentralDirectory = getFunctionOptionValue(zipWriter, options, OPTION_SIGN_CENTRAL_DIRECTORY);
|
|
7633
7794
|
if (signCentralDirectory) {
|
|
7634
7795
|
const signatureData = await signCentralDirectory(directoryArray);
|
|
7635
7796
|
const signatureDataLength = getLength(signatureData);
|
|
@@ -7637,9 +7798,9 @@ async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
|
|
|
7637
7798
|
throw new Error(ERR_INVALID_SIGNATURE_DATA);
|
|
7638
7799
|
}
|
|
7639
7800
|
const signatureRecord = createRecordWriter(6 + signatureDataLength);
|
|
7640
|
-
signatureRecord.
|
|
7641
|
-
signatureRecord.
|
|
7642
|
-
signatureRecord.
|
|
7801
|
+
signatureRecord.writeUint32(DIGITAL_SIGNATURE_RECORD_SIGNATURE);
|
|
7802
|
+
signatureRecord.writeUint16(signatureDataLength);
|
|
7803
|
+
signatureRecord.writeBytes(signatureData);
|
|
7643
7804
|
await writeData(zipWriter.writer, signatureRecord.array);
|
|
7644
7805
|
return 6 + signatureDataLength;
|
|
7645
7806
|
}
|
|
@@ -7650,7 +7811,7 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
|
7650
7811
|
const { writer } = zipWriter;
|
|
7651
7812
|
const { directoryStart, signatureLength } = cdInfo;
|
|
7652
7813
|
let { directoryDataLength } = cdInfo;
|
|
7653
|
-
let
|
|
7814
|
+
let fileEntriesLength = zipWriter.fileEntries.size;
|
|
7654
7815
|
let diskNumber = directoryStart.diskNumber;
|
|
7655
7816
|
let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
|
|
7656
7817
|
let lastDiskNumber = getDiskNumber(writer);
|
|
@@ -7658,7 +7819,7 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
|
7658
7819
|
lastDiskNumber++;
|
|
7659
7820
|
}
|
|
7660
7821
|
let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
7661
|
-
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS ||
|
|
7822
|
+
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || fileEntriesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
|
|
7662
7823
|
if (zip64 === false) {
|
|
7663
7824
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
7664
7825
|
} else {
|
|
@@ -7675,37 +7836,37 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
|
7675
7836
|
}
|
|
7676
7837
|
lastDiskNumber = getDiskNumber(writer);
|
|
7677
7838
|
if (zip64) {
|
|
7678
|
-
endOfdirectoryRecord.
|
|
7679
|
-
endOfdirectoryRecord.
|
|
7680
|
-
endOfdirectoryRecord.
|
|
7681
|
-
endOfdirectoryRecord.
|
|
7682
|
-
endOfdirectoryRecord.
|
|
7683
|
-
endOfdirectoryRecord.
|
|
7684
|
-
endOfdirectoryRecord.
|
|
7685
|
-
endOfdirectoryRecord.
|
|
7686
|
-
endOfdirectoryRecord.
|
|
7687
|
-
endOfdirectoryRecord.
|
|
7688
|
-
endOfdirectoryRecord.
|
|
7689
|
-
endOfdirectoryRecord.
|
|
7690
|
-
endOfdirectoryRecord.
|
|
7691
|
-
endOfdirectoryRecord.
|
|
7839
|
+
endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
|
|
7840
|
+
endOfdirectoryRecord.writeUint64(44);
|
|
7841
|
+
endOfdirectoryRecord.writeUint16(45);
|
|
7842
|
+
endOfdirectoryRecord.writeUint16(45);
|
|
7843
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber);
|
|
7844
|
+
endOfdirectoryRecord.writeUint32(diskNumber);
|
|
7845
|
+
endOfdirectoryRecord.writeUint64(fileEntriesLength);
|
|
7846
|
+
endOfdirectoryRecord.writeUint64(fileEntriesLength);
|
|
7847
|
+
endOfdirectoryRecord.writeUint64(directoryDataLength);
|
|
7848
|
+
endOfdirectoryRecord.writeUint64(directoryOffset);
|
|
7849
|
+
endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
|
|
7850
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber);
|
|
7851
|
+
endOfdirectoryRecord.writeUint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength) + BigInt(signatureLength));
|
|
7852
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber + 1);
|
|
7692
7853
|
const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
|
|
7693
7854
|
if (supportZip64SplitFile) {
|
|
7694
7855
|
lastDiskNumber = MAX_16_BITS;
|
|
7695
7856
|
diskNumber = MAX_16_BITS;
|
|
7696
7857
|
}
|
|
7697
|
-
|
|
7858
|
+
fileEntriesLength = MAX_16_BITS;
|
|
7698
7859
|
directoryOffset = MAX_32_BITS;
|
|
7699
7860
|
directoryDataLength = MAX_32_BITS;
|
|
7700
7861
|
}
|
|
7701
|
-
endOfdirectoryRecord.
|
|
7702
|
-
endOfdirectoryRecord.
|
|
7703
|
-
endOfdirectoryRecord.
|
|
7704
|
-
endOfdirectoryRecord.
|
|
7705
|
-
endOfdirectoryRecord.
|
|
7706
|
-
endOfdirectoryRecord.
|
|
7707
|
-
endOfdirectoryRecord.
|
|
7708
|
-
endOfdirectoryRecord.
|
|
7862
|
+
endOfdirectoryRecord.writeUint32(END_OF_CENTRAL_DIR_SIGNATURE);
|
|
7863
|
+
endOfdirectoryRecord.writeUint16(lastDiskNumber);
|
|
7864
|
+
endOfdirectoryRecord.writeUint16(diskNumber);
|
|
7865
|
+
endOfdirectoryRecord.writeUint16(fileEntriesLength);
|
|
7866
|
+
endOfdirectoryRecord.writeUint16(fileEntriesLength);
|
|
7867
|
+
endOfdirectoryRecord.writeUint32(directoryDataLength);
|
|
7868
|
+
endOfdirectoryRecord.writeUint32(directoryOffset);
|
|
7869
|
+
endOfdirectoryRecord.writeUint16(commentLength);
|
|
7709
7870
|
await writeData(writer, endOfdirectoryRecord.array);
|
|
7710
7871
|
if (commentLength) {
|
|
7711
7872
|
await writeData(writer, comment);
|
|
@@ -7718,11 +7879,11 @@ function createRecordWriter(length) {
|
|
|
7718
7879
|
let offset = 0;
|
|
7719
7880
|
return {
|
|
7720
7881
|
array,
|
|
7721
|
-
|
|
7722
|
-
|
|
7723
|
-
|
|
7724
|
-
|
|
7725
|
-
|
|
7882
|
+
writeUint8: value => { setUint8(view, offset, value); offset += 1; },
|
|
7883
|
+
writeUint16: value => { setUint16(view, offset, value); offset += 2; },
|
|
7884
|
+
writeUint32: value => { setUint32(view, offset, value); offset += 4; },
|
|
7885
|
+
writeUint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
|
|
7886
|
+
writeBytes: value => { arraySet(array, value, offset); offset += getLength(value); },
|
|
7726
7887
|
skip: count => offset += count
|
|
7727
7888
|
};
|
|
7728
7889
|
}
|
|
@@ -7746,6 +7907,71 @@ function getSegmentOffset(zipWriter, { diskNumber = 0, diskOffset = 0 }) {
|
|
|
7746
7907
|
return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
|
|
7747
7908
|
}
|
|
7748
7909
|
|
|
7910
|
+
async function startsWithSplitZipSignature(reader) {
|
|
7911
|
+
const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
7912
|
+
return getUint32(getDataView(signatureArray), 0) == SPLIT_ZIP_FILE_SIGNATURE;
|
|
7913
|
+
}
|
|
7914
|
+
|
|
7915
|
+
async function copyZipData(zipWriter, reader, entries, directoryOffset, splitZipSignatureLength) {
|
|
7916
|
+
const { writer } = zipWriter;
|
|
7917
|
+
const entryPositions = new Map();
|
|
7918
|
+
if (writer.closeDisk) {
|
|
7919
|
+
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
7920
|
+
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
7921
|
+
let copiedLength = 0;
|
|
7922
|
+
for (const entry of sortedEntries) {
|
|
7923
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
7924
|
+
await copyData(zipWriter, reader, copiedLength, sourceOffset - copiedLength);
|
|
7925
|
+
if (exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
7926
|
+
await writer.closeDisk();
|
|
7927
|
+
}
|
|
7928
|
+
entryPositions.set(entry, {
|
|
7929
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
7930
|
+
diskNumberStart: getDiskNumber(writer)
|
|
7931
|
+
});
|
|
7932
|
+
copiedLength = sourceOffset;
|
|
7933
|
+
}
|
|
7934
|
+
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
7935
|
+
} else {
|
|
7936
|
+
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
7937
|
+
entries.forEach(entry => entryPositions.set(entry, {
|
|
7938
|
+
offset: splitZipSignatureLength + getSourceOffset(reader, entry),
|
|
7939
|
+
diskNumberStart: 0
|
|
7940
|
+
}));
|
|
7941
|
+
}
|
|
7942
|
+
return entryPositions;
|
|
7943
|
+
}
|
|
7944
|
+
|
|
7945
|
+
async function copyData(zipWriter, reader, offset, size) {
|
|
7946
|
+
if (size > 0) {
|
|
7947
|
+
const { writer } = zipWriter;
|
|
7948
|
+
await createReadable(reader, { offset, size }).pipeTo(writer.writable, { preventClose: true, preventAbort: true });
|
|
7949
|
+
writer.size += size;
|
|
7950
|
+
zipWriter.offset += size;
|
|
7951
|
+
}
|
|
7952
|
+
}
|
|
7953
|
+
|
|
7954
|
+
async function getLocalHeaderLength(reader, offset) {
|
|
7955
|
+
const headerArray = await readUint8Array(reader, offset, HEADER_SIZE);
|
|
7956
|
+
if (getLength(headerArray) < HEADER_SIZE) {
|
|
7957
|
+
return HEADER_SIZE;
|
|
7958
|
+
}
|
|
7959
|
+
const headerView = getDataView(headerArray);
|
|
7960
|
+
return HEADER_SIZE +
|
|
7961
|
+
getUint16(headerView, HEADER_OFFSET_FILENAME_LENGTH + LOCAL_HEADER_COMMON_OFFSET) +
|
|
7962
|
+
getUint16(headerView, HEADER_OFFSET_EXTRAFIELD_LENGTH + LOCAL_HEADER_COMMON_OFFSET);
|
|
7963
|
+
}
|
|
7964
|
+
|
|
7965
|
+
function getSourceOffset(reader, { offset, diskNumberStart }) {
|
|
7966
|
+
return offset + (reader.getDiskOffset ? reader.getDiskOffset(diskNumberStart) : 0);
|
|
7967
|
+
}
|
|
7968
|
+
|
|
7969
|
+
function getSplitZipSignatureArray() {
|
|
7970
|
+
const signatureArray = new Uint8Array(SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
7971
|
+
setUint32(getDataView(signatureArray), 0, SPLIT_ZIP_FILE_SIGNATURE);
|
|
7972
|
+
return signatureArray;
|
|
7973
|
+
}
|
|
7974
|
+
|
|
7749
7975
|
async function writeData(writer, array) {
|
|
7750
7976
|
const { writable } = writer;
|
|
7751
7977
|
const streamWriter = writable.getWriter();
|
|
@@ -7797,6 +8023,21 @@ function getOptionValue(zipWriter, options, name, defaultValue) {
|
|
|
7797
8023
|
return result === UNDEFINED_VALUE ? defaultValue : result;
|
|
7798
8024
|
}
|
|
7799
8025
|
|
|
8026
|
+
function getDateOptionValue(zipWriter, options, name, defaultValue) {
|
|
8027
|
+
const date = getOptionValue(zipWriter, options, name, defaultValue);
|
|
8028
|
+
if (date === null) {
|
|
8029
|
+
return defaultValue;
|
|
8030
|
+
}
|
|
8031
|
+
if (date !== UNDEFINED_VALUE && (typeof date.getTime != FUNCTION_TYPE || Number.isNaN(date.getTime()))) {
|
|
8032
|
+
throw new Error(ERR_INVALID_DATE);
|
|
8033
|
+
}
|
|
8034
|
+
return date;
|
|
8035
|
+
}
|
|
8036
|
+
|
|
8037
|
+
function getFunctionOptionValue(zipWriter, options, name) {
|
|
8038
|
+
return checkFunctionOption(getOptionValue(zipWriter, options, name));
|
|
8039
|
+
}
|
|
8040
|
+
|
|
7800
8041
|
function getAliasedOptionValue(zipWriter, options, name, deprecatedName, defaultValue) {
|
|
7801
8042
|
const value = getAliasedValue(options, name, deprecatedName);
|
|
7802
8043
|
const result = value === UNDEFINED_VALUE ? getAliasedValue(zipWriter.options, name, deprecatedName) : value;
|
|
@@ -7811,9 +8052,6 @@ function getNumberOptionValue(zipWriter, options, name, defaultValue) {
|
|
|
7811
8052
|
return toNumber(getOptionValue(zipWriter, options, name, defaultValue));
|
|
7812
8053
|
}
|
|
7813
8054
|
|
|
7814
|
-
function toNumber(value) {
|
|
7815
|
-
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
7816
|
-
}
|
|
7817
8055
|
|
|
7818
8056
|
function getMaximumCompressedSize(uncompressedSize) {
|
|
7819
8057
|
return uncompressedSize + (5 * (Math.floor(uncompressedSize / 16383) + 1));
|
|
@@ -7825,6 +8063,14 @@ function isCompressed(compressionMethod, level) {
|
|
|
7825
8063
|
: compressionMethod !== COMPRESSION_METHOD_STORE;
|
|
7826
8064
|
}
|
|
7827
8065
|
|
|
8066
|
+
function getUint16(view, offset) {
|
|
8067
|
+
return view.getUint16(offset, true);
|
|
8068
|
+
}
|
|
8069
|
+
|
|
8070
|
+
function getUint32(view, offset) {
|
|
8071
|
+
return view.getUint32(offset, true);
|
|
8072
|
+
}
|
|
8073
|
+
|
|
7828
8074
|
function setUint8(view, offset, value) {
|
|
7829
8075
|
view.setUint8(offset, value);
|
|
7830
8076
|
}
|
|
@@ -7868,9 +8114,9 @@ function getHeaderArrayData({
|
|
|
7868
8114
|
const headerRecord = createRecordWriter(HEADER_SIZE - 4);
|
|
7869
8115
|
const headerArray = headerRecord.array;
|
|
7870
8116
|
const headerView = getDataView(headerArray);
|
|
7871
|
-
headerRecord.
|
|
7872
|
-
headerRecord.
|
|
7873
|
-
headerRecord.
|
|
8117
|
+
headerRecord.writeUint16(version);
|
|
8118
|
+
headerRecord.writeUint16(bitFlag);
|
|
8119
|
+
headerRecord.writeUint16(compressionMethod);
|
|
7874
8120
|
if (rawLastModDate === UNDEFINED_VALUE) {
|
|
7875
8121
|
const dateArray = new Uint32Array(1);
|
|
7876
8122
|
const dateView = getDataView(dateArray);
|
|
@@ -7878,20 +8124,20 @@ function getHeaderArrayData({
|
|
|
7878
8124
|
setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
|
|
7879
8125
|
rawLastModDate = dateArray[0];
|
|
7880
8126
|
}
|
|
7881
|
-
headerRecord.
|
|
8127
|
+
headerRecord.writeUint32(rawLastModDate);
|
|
7882
8128
|
headerRecord.skip(4);
|
|
7883
8129
|
if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
|
|
7884
|
-
headerRecord.
|
|
8130
|
+
headerRecord.writeUint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
|
|
7885
8131
|
} else {
|
|
7886
8132
|
headerRecord.skip(4);
|
|
7887
8133
|
}
|
|
7888
8134
|
if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
|
|
7889
|
-
headerRecord.
|
|
8135
|
+
headerRecord.writeUint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
|
|
7890
8136
|
} else {
|
|
7891
8137
|
headerRecord.skip(4);
|
|
7892
8138
|
}
|
|
7893
|
-
headerRecord.
|
|
7894
|
-
headerRecord.
|
|
8139
|
+
headerRecord.writeUint16(getLength(rawFilename));
|
|
8140
|
+
headerRecord.writeUint16(extraFieldLength);
|
|
7895
8141
|
return {
|
|
7896
8142
|
headerArray,
|
|
7897
8143
|
headerView,
|
|
@@ -8404,7 +8650,7 @@ try {
|
|
|
8404
8650
|
// ignored
|
|
8405
8651
|
}
|
|
8406
8652
|
|
|
8407
|
-
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)});}
|
|
8653
|
+
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)});}
|
|
8408
8654
|
|
|
8409
8655
|
/*
|
|
8410
8656
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
@@ -8839,6 +9085,7 @@ U(setDefaultConfiguration);
|
|
|
8839
9085
|
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
8840
9086
|
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
8841
9087
|
const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
|
|
9088
|
+
const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
|
|
8842
9089
|
const ERR_ABORT_EXPORT = "zipjs-abort-export";
|
|
8843
9090
|
const ERR_ABORTED = "The operation was aborted";
|
|
8844
9091
|
const ABORT_ERROR_NAME = "AbortError";
|
|
@@ -8871,13 +9118,14 @@ class ZipEntry {
|
|
|
8871
9118
|
fs,
|
|
8872
9119
|
name,
|
|
8873
9120
|
data: params.data,
|
|
8874
|
-
options: params.options,
|
|
9121
|
+
options: params.options && Object.assign({}, params.options),
|
|
8875
9122
|
id: fs.entryIdCounter++,
|
|
8876
9123
|
parent,
|
|
8877
9124
|
children: [],
|
|
8878
9125
|
uncompressedSize: params.uncompressedSize || 0,
|
|
8879
9126
|
undeterminedSize: params.undeterminedSize || params.uncompressedSize === UNDEFINED_VALUE,
|
|
8880
|
-
passThrough: params.passThrough
|
|
9127
|
+
passThrough: params.passThrough,
|
|
9128
|
+
defaultLastModDate: params.defaultLastModDate || new Date()
|
|
8881
9129
|
});
|
|
8882
9130
|
if (parent || !fs.root) {
|
|
8883
9131
|
fs.entries[zipEntry.id] = zipEntry;
|
|
@@ -8887,12 +9135,6 @@ class ZipEntry {
|
|
|
8887
9135
|
}
|
|
8888
9136
|
}
|
|
8889
9137
|
|
|
8890
|
-
moveTo(target) {
|
|
8891
|
-
// deprecated
|
|
8892
|
-
const zipEntry = this;
|
|
8893
|
-
zipEntry.fs.move(zipEntry, target);
|
|
8894
|
-
}
|
|
8895
|
-
|
|
8896
9138
|
getFullname() {
|
|
8897
9139
|
return this.getRelativeName();
|
|
8898
9140
|
}
|
|
@@ -8924,6 +9166,11 @@ class ZipEntry {
|
|
|
8924
9166
|
this.name = name;
|
|
8925
9167
|
}
|
|
8926
9168
|
}
|
|
9169
|
+
|
|
9170
|
+
setOptions(options) {
|
|
9171
|
+
const entryOptions = Object.assign({}, this.options, options);
|
|
9172
|
+
this.options = Object.fromEntries(Object.entries(entryOptions).filter(([, value]) => value !== UNDEFINED_VALUE));
|
|
9173
|
+
}
|
|
8927
9174
|
}
|
|
8928
9175
|
|
|
8929
9176
|
class ZipFileEntry extends ZipEntry {
|
|
@@ -8950,7 +9197,7 @@ class ZipFileEntry extends ZipEntry {
|
|
|
8950
9197
|
const reader = zipEntry.reader = createReader(zipEntry.Reader, zipEntry.data, options);
|
|
8951
9198
|
const dataSize = zipEntry.uncompressedSize || reader.size;
|
|
8952
9199
|
await Promise.all([initStream(reader), initStream(writer, dataSize)]);
|
|
8953
|
-
const
|
|
9200
|
+
const signal = checkSignalOption(options.signal);
|
|
8954
9201
|
const readable = createProgressReadable(zipEntry, reader, options, signal);
|
|
8955
9202
|
const preventClose = !ownsWritable(writer) && Boolean(options.preventClose);
|
|
8956
9203
|
zipEntry.uncompressedSize = reader.size;
|
|
@@ -9168,10 +9415,6 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
9168
9415
|
});
|
|
9169
9416
|
}
|
|
9170
9417
|
|
|
9171
|
-
addData(name, params) {
|
|
9172
|
-
return addChild(this, name, params);
|
|
9173
|
-
}
|
|
9174
|
-
|
|
9175
9418
|
importBlob(blob, options) {
|
|
9176
9419
|
return this.importZip(new BlobReader(blob), options);
|
|
9177
9420
|
}
|
|
@@ -9285,7 +9528,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
9285
9528
|
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
9286
9529
|
options.bufferedWrite = true;
|
|
9287
9530
|
}
|
|
9288
|
-
const [readers] = await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
|
|
9531
|
+
const [readers] = await Promise.all([initReaders(zipEntry, checkReaderOptions(options.readerOptions)), initStream(writer)]);
|
|
9289
9532
|
const zipWriter = new ZipWriter(writer, options);
|
|
9290
9533
|
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
|
|
9291
9534
|
await zipWriter.close(options.globalComment);
|
|
@@ -9295,12 +9538,13 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
9295
9538
|
getExportedSize(options = {}) {
|
|
9296
9539
|
const zipEntry = this;
|
|
9297
9540
|
options = Object.assign({}, options);
|
|
9541
|
+
checkReaderOptions(options.readerOptions);
|
|
9298
9542
|
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
9299
9543
|
options.bufferedWrite = true;
|
|
9300
9544
|
}
|
|
9301
9545
|
const writeOrderGuaranteed = !options.bufferedWrite ||
|
|
9302
9546
|
(options.keepOrder !== false && zipEntry.children.every(child => !child.children.length));
|
|
9303
|
-
return getEntriesSize(options,
|
|
9547
|
+
return getEntriesSize(options, zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
|
|
9304
9548
|
const { name, entryOptions } = getChildEntryOptions(child, zipEntry, options);
|
|
9305
9549
|
return { name, size: child.directory ? 0 : getDeterminedSize(child, isPassThrough(child, options)), options: entryOptions };
|
|
9306
9550
|
}), writeOrderGuaranteed, options.globalComment);
|
|
@@ -9339,7 +9583,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
9339
9583
|
}
|
|
9340
9584
|
|
|
9341
9585
|
|
|
9342
|
-
class
|
|
9586
|
+
class ZipFS {
|
|
9343
9587
|
|
|
9344
9588
|
constructor() {
|
|
9345
9589
|
resetFS(this);
|
|
@@ -9455,10 +9699,6 @@ class FS {
|
|
|
9455
9699
|
return this.root.addFile(file, options);
|
|
9456
9700
|
}
|
|
9457
9701
|
|
|
9458
|
-
addData(name, params) {
|
|
9459
|
-
return this.root.addData(name, params);
|
|
9460
|
-
}
|
|
9461
|
-
|
|
9462
9702
|
importBlob(blob, options) {
|
|
9463
9703
|
resetFS(this);
|
|
9464
9704
|
return this.root.importBlob(blob, options);
|
|
@@ -9526,7 +9766,7 @@ class FS {
|
|
|
9526
9766
|
}
|
|
9527
9767
|
}
|
|
9528
9768
|
|
|
9529
|
-
const fs = { FS, ZipDirectoryEntry, ZipFileEntry };
|
|
9769
|
+
const fs = { FS: ZipFS, ZipDirectoryEntry, ZipFileEntry };
|
|
9530
9770
|
|
|
9531
9771
|
function getTotalSize(entries, getEntrySize) {
|
|
9532
9772
|
let size = 0;
|
|
@@ -9670,7 +9910,7 @@ function detach(entry) {
|
|
|
9670
9910
|
}
|
|
9671
9911
|
|
|
9672
9912
|
function forwardAbort(signal, abortController) {
|
|
9673
|
-
if (!signal) {
|
|
9913
|
+
if (!checkSignalOption(signal)) {
|
|
9674
9914
|
return () => { };
|
|
9675
9915
|
}
|
|
9676
9916
|
if (signal.aborted) {
|
|
@@ -9747,10 +9987,7 @@ function getChildEntryOptions(child, selectedEntry, options) {
|
|
|
9747
9987
|
});
|
|
9748
9988
|
}
|
|
9749
9989
|
if (isPassThrough(child, options)) {
|
|
9750
|
-
let
|
|
9751
|
-
if (compressionMethod === 0) {
|
|
9752
|
-
level = 0;
|
|
9753
|
-
}
|
|
9990
|
+
let encryptionStrength;
|
|
9754
9991
|
if (extraFieldAES) {
|
|
9755
9992
|
encryptionStrength = extraFieldAES.strength;
|
|
9756
9993
|
}
|
|
@@ -9760,13 +9997,12 @@ function getChildEntryOptions(child, selectedEntry, options) {
|
|
|
9760
9997
|
zipCrypto,
|
|
9761
9998
|
crc32,
|
|
9762
9999
|
uncompressedSize,
|
|
9763
|
-
level,
|
|
9764
10000
|
encryptionStrength,
|
|
9765
10001
|
compressionMethod
|
|
9766
10002
|
};
|
|
9767
10003
|
}
|
|
9768
10004
|
}
|
|
9769
|
-
const entryOptions = Object.assign({}, zipEntryMetadata, options,
|
|
10005
|
+
const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
|
|
9770
10006
|
if (!child.directory && entryOptions.passThrough && entryOptions.uncompressedSize === UNDEFINED_VALUE) {
|
|
9771
10007
|
throw new Error(ERR_INVALID_PASS_THROUGH);
|
|
9772
10008
|
}
|
|
@@ -9781,11 +10017,22 @@ function getDeterminedSize(child, passThrough) {
|
|
|
9781
10017
|
return child.undeterminedSize ? UNDEFINED_VALUE : getExtractedSize(child, passThrough);
|
|
9782
10018
|
}
|
|
9783
10019
|
|
|
10020
|
+
function checkReaderOptions(readerOptions) {
|
|
10021
|
+
if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
|
|
10022
|
+
throw new Error(ERR_INVALID_READER_OPTIONS);
|
|
10023
|
+
}
|
|
10024
|
+
return readerOptions;
|
|
10025
|
+
}
|
|
10026
|
+
|
|
9784
10027
|
function isPassThrough(child, options) {
|
|
9785
10028
|
const { readerOptions } = options;
|
|
9786
10029
|
return Boolean(!child.directory && (child.passThrough || (readerOptions && readerOptions.passThrough)));
|
|
9787
10030
|
}
|
|
9788
10031
|
|
|
10032
|
+
function isImplicitDirectory(child) {
|
|
10033
|
+
return child.directory && child.data === null;
|
|
10034
|
+
}
|
|
10035
|
+
|
|
9789
10036
|
function getUserExtraField(extraField) {
|
|
9790
10037
|
if (extraField) {
|
|
9791
10038
|
const userExtraField = new Map();
|
|
@@ -9803,7 +10050,7 @@ function getUserExtraField(extraField) {
|
|
|
9803
10050
|
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
9804
10051
|
const { onstart, onprogress, onend, onentryprogress } = options;
|
|
9805
10052
|
const selectedEntry = entry;
|
|
9806
|
-
const totalEntries = getTotalSize(entry.children, ()
|
|
10053
|
+
const totalEntries = getTotalSize(entry.children, child => isImplicitDirectory(child) ? 0 : 1);
|
|
9807
10054
|
let writtenSize = 0;
|
|
9808
10055
|
let writtenEntries = 0;
|
|
9809
10056
|
if (onstart) {
|
|
@@ -9832,6 +10079,9 @@ async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
|
9832
10079
|
}
|
|
9833
10080
|
|
|
9834
10081
|
async function addChild(child) {
|
|
10082
|
+
if (isImplicitDirectory(child)) {
|
|
10083
|
+
return;
|
|
10084
|
+
}
|
|
9835
10085
|
const { name, entryOptions } = getChildEntryOptions(child, selectedEntry, options);
|
|
9836
10086
|
let entryWrittenSize = 0;
|
|
9837
10087
|
const entryMetadata = await zipWriter.add(name, readers.get(child), Object.assign(entryOptions, {
|
|
@@ -9865,7 +10115,7 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
9865
10115
|
if (handle.kind == "file") {
|
|
9866
10116
|
const file = await handle.getFile();
|
|
9867
10117
|
addedEntries.push(
|
|
9868
|
-
parentEntry
|
|
10118
|
+
addChild(parentEntry, file.name, {
|
|
9869
10119
|
Reader: function () {
|
|
9870
10120
|
const readable = file.stream();
|
|
9871
10121
|
const size = file.size;
|
|
@@ -9899,10 +10149,11 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
9899
10149
|
|
|
9900
10150
|
async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
9901
10151
|
const { onstart, onprogress, onend } = options;
|
|
10152
|
+
const readerOptions = checkReaderOptions(options.readerOptions);
|
|
9902
10153
|
const abortController = new AbortController();
|
|
9903
10154
|
const { signal } = abortController;
|
|
9904
10155
|
const releaseSignal = forwardAbort(options.signal, abortController);
|
|
9905
|
-
const getDataOptions = Object.assign({}, options,
|
|
10156
|
+
const getDataOptions = Object.assign({}, options, readerOptions, {
|
|
9906
10157
|
signal,
|
|
9907
10158
|
onstart: UNDEFINED_VALUE,
|
|
9908
10159
|
onprogress: UNDEFINED_VALUE,
|
|
@@ -10202,6 +10453,7 @@ exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
|
10202
10453
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
10203
10454
|
exports.ERR_ENCRYPTED = ERR_ENCRYPTED;
|
|
10204
10455
|
exports.ERR_ENCRYPTED_CENTRAL_DIRECTORY = ERR_ENCRYPTED_CENTRAL_DIRECTORY;
|
|
10456
|
+
exports.ERR_ENTRY_DATA_OUT_OF_BOUNDS = ERR_ENTRY_DATA_OUT_OF_BOUNDS;
|
|
10205
10457
|
exports.ERR_ENTRY_EXISTS = ERR_ENTRY_EXISTS;
|
|
10206
10458
|
exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
|
|
10207
10459
|
exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
|
|
@@ -10215,20 +10467,28 @@ exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
|
10215
10467
|
exports.ERR_INVALID_COMMENT_TYPE = ERR_INVALID_COMMENT_TYPE;
|
|
10216
10468
|
exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
|
|
10217
10469
|
exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
|
|
10470
|
+
exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
|
|
10218
10471
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
10219
10472
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
10473
|
+
exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
|
|
10220
10474
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
10475
|
+
exports.ERR_INVALID_EXTRAFIELD = ERR_INVALID_EXTRAFIELD;
|
|
10221
10476
|
exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
|
|
10477
|
+
exports.ERR_INVALID_EXTRAFIELD_DATA_TYPE = ERR_INVALID_EXTRAFIELD_DATA_TYPE;
|
|
10222
10478
|
exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
|
|
10223
10479
|
exports.ERR_INVALID_FILENAME_VALIDATION = ERR_INVALID_FILENAME_VALIDATION;
|
|
10480
|
+
exports.ERR_INVALID_FUNCTION_OPTION = ERR_INVALID_FUNCTION_OPTION;
|
|
10224
10481
|
exports.ERR_INVALID_GID = ERR_INVALID_GID;
|
|
10225
10482
|
exports.ERR_INVALID_LEVEL = ERR_INVALID_LEVEL;
|
|
10226
10483
|
exports.ERR_INVALID_MAX_APPENDED_DATA_SIZE = ERR_INVALID_MAX_APPENDED_DATA_SIZE;
|
|
10484
|
+
exports.ERR_INVALID_MAX_WORKERS = ERR_INVALID_MAX_WORKERS;
|
|
10227
10485
|
exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
|
|
10228
10486
|
exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
|
|
10229
10487
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
10230
10488
|
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
10231
10489
|
exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
|
|
10490
|
+
exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
|
|
10491
|
+
exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
|
|
10232
10492
|
exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
|
|
10233
10493
|
exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
|
|
10234
10494
|
exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
|
|
@@ -10244,6 +10504,7 @@ exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
|
10244
10504
|
exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
|
|
10245
10505
|
exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
10246
10506
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
10507
|
+
exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
|
|
10247
10508
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
10248
10509
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
10249
10510
|
exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
|
|
@@ -10268,6 +10529,10 @@ exports.TextWriter = TextWriter;
|
|
|
10268
10529
|
exports.Uint8ArrayReader = Uint8ArrayReader;
|
|
10269
10530
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
10270
10531
|
exports.Writer = Writer;
|
|
10532
|
+
exports.ZipDirectoryEntry = ZipDirectoryEntry;
|
|
10533
|
+
exports.ZipEntry = ZipEntry;
|
|
10534
|
+
exports.ZipFS = ZipFS;
|
|
10535
|
+
exports.ZipFileEntry = ZipFileEntry;
|
|
10271
10536
|
exports.ZipReader = ZipReader;
|
|
10272
10537
|
exports.ZipReaderStream = ZipReaderStream;
|
|
10273
10538
|
exports.ZipWriter = ZipWriter;
|