@zip.js/zip.js 2.8.53 → 2.8.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/deno.json +2 -1
- package/dist/zip-core-external.js +737 -491
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +745 -490
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +776 -525
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +738 -510
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +776 -525
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +790 -525
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +791 -526
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +746 -491
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +746 -491
- package/dist/zip-native.min.js +1 -1
- package/dist/zip-web-worker-native.js +1 -1
- package/dist/zip-web-worker.js +1 -1
- package/dist/zip.js +747 -492
- package/dist/zip.min.js +1 -1
- package/eslint.config.mjs +1 -0
- package/index-native.cjs +790 -525
- package/index-native.min.js +1 -1
- package/index.cjs +791 -526
- package/index.d.cts +422 -49
- package/index.d.ts +422 -49
- package/index.min.js +1 -1
- package/lib/core/configuration.js +62 -21
- package/lib/core/constants.js +13 -1
- package/lib/core/io.js +33 -27
- package/lib/core/options.js +44 -2
- package/lib/core/streams/aes-crypto-stream.js +12 -12
- package/lib/core/util/decode-text.js +11 -2
- package/lib/core/web-worker-base.js +3 -2
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-fs.js +39 -32
- package/lib/core/zip-reader.js +100 -38
- package/lib/core/zip-writer.js +301 -177
- package/lib/core/zlib-streams-inline.js +1 -1
- package/lib/zip-core-base.js +6 -1
- package/lib/zip-core-reader.js +1 -0
- package/lib/zip-core-writer.js +5 -0
- package/package.json +8 -2
package/dist/zip-native.js
CHANGED
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
|
|
46
46
|
const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
|
|
47
47
|
const SPLIT_ZIP_FILE_SIGNATURE = 0x08074b50;
|
|
48
|
+
const TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE = 0x30304b50;
|
|
48
49
|
const DATA_DESCRIPTOR_RECORD_SIGNATURE = SPLIT_ZIP_FILE_SIGNATURE;
|
|
49
50
|
const ARCHIVE_EXTRA_DATA_SIGNATURE = 0x08064b50;
|
|
50
51
|
const DIGITAL_SIGNATURE_RECORD_SIGNATURE = 0x05054b50;
|
|
@@ -61,6 +62,7 @@
|
|
|
61
62
|
const DATA_DESCRIPTOR_RECORD_LENGTH = 12;
|
|
62
63
|
const DATA_DESCRIPTOR_RECORD_ZIP_64_LENGTH = 20;
|
|
63
64
|
const DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH = 4;
|
|
65
|
+
const SPLIT_ZIP_FILE_SIGNATURE_LENGTH = 4;
|
|
64
66
|
|
|
65
67
|
const EXTRAFIELD_TYPE_ZIP64 = 0x0001;
|
|
66
68
|
const EXTRAFIELD_TYPE_AES = 0x9901;
|
|
@@ -83,6 +85,7 @@
|
|
|
83
85
|
const BITFLAG_DATA_DESCRIPTOR = 0b1000;
|
|
84
86
|
const BITFLAG_STRONG_ENCRYPTION = 0b1000000;
|
|
85
87
|
const BITFLAG_LANG_ENCODING_FLAG = 0b100000000000;
|
|
88
|
+
const BITFLAG_MASKED_LOCAL_HEADERS = 0b10000000000000;
|
|
86
89
|
const FILE_ATTR_MSDOS_DIR_MASK = 0b10000;
|
|
87
90
|
const FILE_ATTR_MSDOS_READONLY_MASK = 0x01;
|
|
88
91
|
const FILE_ATTR_MSDOS_HIDDEN_MASK = 0x02;
|
|
@@ -112,6 +115,8 @@
|
|
|
112
115
|
const HEADER_OFFSET_SIGNATURE = 10;
|
|
113
116
|
const HEADER_OFFSET_COMPRESSED_SIZE = 14;
|
|
114
117
|
const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
|
|
118
|
+
const HEADER_OFFSET_FILENAME_LENGTH = 22;
|
|
119
|
+
const HEADER_OFFSET_EXTRAFIELD_LENGTH = 24;
|
|
115
120
|
const LOCAL_HEADER_COMMON_OFFSET = 4;
|
|
116
121
|
|
|
117
122
|
const MAX_DATE = new Date(2107, 11, 31, 23, 59, 58);
|
|
@@ -124,9 +129,116 @@
|
|
|
124
129
|
const OBJECT_TYPE = "object";
|
|
125
130
|
const STRING_TYPE = "string";
|
|
126
131
|
const NUMBER_TYPE = "number";
|
|
132
|
+
const BOOLEAN_TYPE = "boolean";
|
|
127
133
|
|
|
128
134
|
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
129
135
|
|
|
136
|
+
/*
|
|
137
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
138
|
+
|
|
139
|
+
Redistribution and use in source and binary forms, with or without
|
|
140
|
+
modification, are permitted provided that the following conditions are met:
|
|
141
|
+
|
|
142
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
143
|
+
this list of conditions and the following disclaimer.
|
|
144
|
+
|
|
145
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
146
|
+
notice, this list of conditions and the following disclaimer in
|
|
147
|
+
the documentation and/or other materials provided with the distribution.
|
|
148
|
+
|
|
149
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
150
|
+
derived from this software without specific prior written permission.
|
|
151
|
+
|
|
152
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
153
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
154
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
155
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
156
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
157
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
158
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
159
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
160
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
161
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
162
|
+
*/
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
const OPTION_FILENAME_ENCODING = "filenameEncoding";
|
|
166
|
+
const OPTION_COMMENT_ENCODING = "commentEncoding";
|
|
167
|
+
const OPTION_DECODE_TEXT = "decodeText";
|
|
168
|
+
const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
|
|
169
|
+
const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
|
|
170
|
+
const OPTION_PASSWORD = "password";
|
|
171
|
+
const OPTION_RAW_PASSWORD = "rawPassword";
|
|
172
|
+
const OPTION_PASS_THROUGH = "passThrough";
|
|
173
|
+
const OPTION_SIGNAL = "signal";
|
|
174
|
+
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
175
|
+
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
176
|
+
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
177
|
+
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
178
|
+
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
179
|
+
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
180
|
+
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
181
|
+
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
182
|
+
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
183
|
+
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
184
|
+
const OPTION_TRANSFER_STREAMS = "transferStreams";
|
|
185
|
+
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
186
|
+
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
187
|
+
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
188
|
+
const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
|
|
189
|
+
const OPTION_KEEP_ORDER = "keepOrder";
|
|
190
|
+
const OPTION_LEVEL = "level";
|
|
191
|
+
const OPTION_BUFFERED_WRITE = "bufferedWrite";
|
|
192
|
+
const OPTION_CREATE_TEMP_STREAM = "createTempStream";
|
|
193
|
+
const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
|
|
194
|
+
const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
|
|
195
|
+
const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
|
|
196
|
+
const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
|
|
197
|
+
const OPTION_ENCODE_TEXT = "encodeText";
|
|
198
|
+
const OPTION_OFFSET = "offset";
|
|
199
|
+
const OPTION_USDZ = "usdz";
|
|
200
|
+
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
201
|
+
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
202
|
+
const OPTION_STRICTNESS = "strictness";
|
|
203
|
+
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
204
|
+
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
205
|
+
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
206
|
+
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
207
|
+
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
208
|
+
const TEXT_TYPE_FILENAME = "filename";
|
|
209
|
+
const TEXT_TYPE_COMMENT = "comment";
|
|
210
|
+
const STRICTNESS_STRICT = "strict";
|
|
211
|
+
const STRICTNESS_BALANCED = "balanced";
|
|
212
|
+
const STRICTNESS_TOLERANT = "tolerant";
|
|
213
|
+
|
|
214
|
+
const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
|
|
215
|
+
const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
|
|
216
|
+
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
217
|
+
|
|
218
|
+
function checkFunctionOption(value) {
|
|
219
|
+
if (value && typeof value != FUNCTION_TYPE) {
|
|
220
|
+
throw new Error(ERR_INVALID_FUNCTION_OPTION);
|
|
221
|
+
}
|
|
222
|
+
return value;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function checkSignalOption(signal) {
|
|
226
|
+
if (signal && (typeof signal.addEventListener != FUNCTION_TYPE || typeof signal.aborted != BOOLEAN_TYPE)) {
|
|
227
|
+
throw new Error(ERR_INVALID_SIGNAL);
|
|
228
|
+
}
|
|
229
|
+
return signal || UNDEFINED_VALUE;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function checkPasswordOption(password, rawPassword) {
|
|
233
|
+
if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
|
|
234
|
+
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function toNumber(value) {
|
|
239
|
+
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
240
|
+
}
|
|
241
|
+
|
|
130
242
|
/*
|
|
131
243
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
132
244
|
|
|
@@ -156,7 +268,10 @@
|
|
|
156
268
|
*/
|
|
157
269
|
|
|
158
270
|
|
|
271
|
+
const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
|
|
159
272
|
const MINIMUM_CHUNK_SIZE = 64;
|
|
273
|
+
const MINIMUM_PROPERTY_VALUE = 1;
|
|
274
|
+
const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
|
|
160
275
|
let maxWorkers = 2;
|
|
161
276
|
try {
|
|
162
277
|
if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
|
|
@@ -168,7 +283,7 @@
|
|
|
168
283
|
const DEFAULT_CONFIGURATION = {
|
|
169
284
|
workerURI: "./core/web-worker-wasm.js",
|
|
170
285
|
wasmURI: "./core/streams/zlib-wasm/zlib-streams.wasm",
|
|
171
|
-
chunkSize:
|
|
286
|
+
chunkSize: DEFAULT_CHUNK_SIZE$1,
|
|
172
287
|
maxWorkers,
|
|
173
288
|
terminateWorkerTimeout: 5000,
|
|
174
289
|
workerStarvationTimeout: 5000,
|
|
@@ -180,24 +295,38 @@
|
|
|
180
295
|
DecompressionStream: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream
|
|
181
296
|
};
|
|
182
297
|
|
|
183
|
-
const
|
|
298
|
+
const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
|
|
299
|
+
|
|
300
|
+
const STRING_PROPERTY_NAMES = [
|
|
184
301
|
"baseURI",
|
|
185
302
|
"wasmURI",
|
|
186
|
-
"workerURI"
|
|
187
|
-
|
|
303
|
+
"workerURI"
|
|
304
|
+
];
|
|
305
|
+
const BOOLEAN_PROPERTY_NAMES = [
|
|
306
|
+
"useCompressionStream",
|
|
307
|
+
"useWebWorkers",
|
|
308
|
+
"transferStreams"
|
|
309
|
+
];
|
|
310
|
+
const NUMBER_PROPERTY_NAMES = [
|
|
188
311
|
"chunkSize",
|
|
189
|
-
|
|
312
|
+
PROPERTY_NAME_MAX_WORKERS,
|
|
190
313
|
"terminateWorkerTimeout",
|
|
191
314
|
"workerStarvationTimeout",
|
|
192
|
-
"workerStartupTimeout"
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
"
|
|
315
|
+
"workerStartupTimeout"
|
|
316
|
+
];
|
|
317
|
+
const FUNCTION_PROPERTY_NAMES = [
|
|
318
|
+
"createWorker",
|
|
196
319
|
"CompressionStream",
|
|
197
320
|
"DecompressionStream",
|
|
198
321
|
"CompressionStreamFallback",
|
|
199
322
|
"DecompressionStreamFallback"
|
|
200
323
|
];
|
|
324
|
+
const CONFIGURABLE_PROPERTY_NAMES = [
|
|
325
|
+
...STRING_PROPERTY_NAMES,
|
|
326
|
+
...BOOLEAN_PROPERTY_NAMES,
|
|
327
|
+
...NUMBER_PROPERTY_NAMES,
|
|
328
|
+
...FUNCTION_PROPERTY_NAMES
|
|
329
|
+
];
|
|
201
330
|
|
|
202
331
|
const config = { ...DEFAULT_CONFIGURATION };
|
|
203
332
|
|
|
@@ -206,20 +335,43 @@
|
|
|
206
335
|
}
|
|
207
336
|
|
|
208
337
|
function getChunkSize(config) {
|
|
209
|
-
return
|
|
338
|
+
return normalizeChunkSize(config.chunkSize);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
function normalizeChunkSize(chunkSize) {
|
|
342
|
+
chunkSize = toNumber(chunkSize);
|
|
343
|
+
return Number.isInteger(chunkSize) && chunkSize >= MINIMUM_PROPERTY_VALUE ? Math.max(chunkSize, MINIMUM_CHUNK_SIZE) : DEFAULT_CHUNK_SIZE$1;
|
|
210
344
|
}
|
|
211
345
|
|
|
212
346
|
function configure(configuration) {
|
|
213
|
-
|
|
347
|
+
Object.assign(config, checkConfiguration(normalizeConfiguration(configuration)));
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
function checkConfiguration(configuration) {
|
|
351
|
+
const checkedConfiguration = {};
|
|
214
352
|
for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
|
|
215
353
|
const propertyValue = configuration[propertyName];
|
|
216
354
|
if (propertyValue !== UNDEFINED_VALUE) {
|
|
217
|
-
|
|
355
|
+
checkedConfiguration[propertyName] = checkPropertyValue(propertyName, propertyValue);
|
|
218
356
|
}
|
|
219
357
|
}
|
|
358
|
+
return checkedConfiguration;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function checkPropertyValue(propertyName, propertyValue) {
|
|
362
|
+
if (NUMBER_PROPERTY_NAMES.includes(propertyName)) {
|
|
363
|
+
propertyValue = toNumber(propertyValue);
|
|
364
|
+
if (propertyName == PROPERTY_NAME_MAX_WORKERS && (!Number.isInteger(propertyValue) || propertyValue < MINIMUM_PROPERTY_VALUE)) {
|
|
365
|
+
throw new Error(ERR_INVALID_MAX_WORKERS);
|
|
366
|
+
}
|
|
367
|
+
} else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
|
|
368
|
+
checkFunctionOption(propertyValue);
|
|
369
|
+
}
|
|
370
|
+
return propertyValue;
|
|
220
371
|
}
|
|
221
372
|
|
|
222
373
|
function normalizeConfiguration(configuration) {
|
|
374
|
+
configuration = configuration || {};
|
|
223
375
|
const { CompressionStreamZlib, DecompressionStreamZlib } = configuration;
|
|
224
376
|
if (CompressionStreamZlib === UNDEFINED_VALUE && DecompressionStreamZlib === UNDEFINED_VALUE) {
|
|
225
377
|
return configuration;
|
|
@@ -235,14 +387,9 @@
|
|
|
235
387
|
}
|
|
236
388
|
|
|
237
389
|
function setDefaultConfiguration(configuration) {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
if (propertyValue !== UNDEFINED_VALUE) {
|
|
242
|
-
DEFAULT_CONFIGURATION[propertyName] = propertyValue;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
configure(configuration);
|
|
390
|
+
const checkedConfiguration = checkConfiguration(normalizeConfiguration(configuration));
|
|
391
|
+
Object.assign(DEFAULT_CONFIGURATION, checkedConfiguration);
|
|
392
|
+
Object.assign(config, checkedConfiguration);
|
|
246
393
|
}
|
|
247
394
|
|
|
248
395
|
function resetConfiguration() {
|
|
@@ -252,7 +399,7 @@
|
|
|
252
399
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
253
400
|
}
|
|
254
401
|
|
|
255
|
-
const r=[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],t=[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],f=[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],n=[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],c=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],e=new Uint8Array(288);e.fill(8,0,144),e.fill(9,144,256),e.fill(7,256,280),e.fill(8,280,288);const j$1=new Uint8Array(30).fill(5);function z$1(r){const t=new Uint16Array(16);for(const f of r)t[f]++;t[0]=0;const f=new Uint16Array(17);for(let r=1;15>=r;r++)f[r+1]=f[r]+t[r];const n=new Uint16Array(r.length);for(let t=0;t<r.length;t++)r[t]&&(n[f[r[t]]++]=t);return {j:t,symbols:n}}const W$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",p$1=(s=()=>(W=>{let p=0,s=0,o=0,Y=new Uint8Array(1024),l=0,B=0;for(;!B;){B=u(1);const r=u(2);if(0==r)T();else if(1==r)w(z$1(e),z$1(j$1));else {if(2!=r)throw Error("invalid deflate block type");w(...K());}}return Y.subarray(0,l);function S(){if(p>=W.length)throw Error("unexpected end of deflate data");return W[p++]}function u(r){for(;r>o;)s|=S()<<o,o+=8;const t=s&(1<<r)-1;return s>>>=r,o-=r,t}function T(){s=0,o=0;const r=S()|S()<<8;p+=2,D(l+r);for(let t=0;r>t;t++)Y[l++]=S();}function w(c,e){let j=q(c);for(;256!=j;){if(256>j)D(l+1),Y[l++]=j;else {const c=j-257,z=r[c]+u(t[c]),W=q(e),p=f[W]+u(n[W]);D(l+z);const s=l-p;for(let r=0;z>r;r++)Y[l++]=Y[s+r];}j=q(c);}}function K(){const r=u(5)+257,t=u(5)+1,f=u(4)+4,n=new Uint8Array(19);for(let r=0;f>r;r++)n[c[r]]=u(3);const e=z$1(n),j=new Uint8Array(r+t);let W=0;for(;W<j.length;){const r=q(e);if(16>r)j[W++]=r;else if(16==r){const r=j[W-1];let t=u(2)+3;for(;t--;)j[W++]=r;}else W+=17==r?u(3)+3:u(7)+11;}return [z$1(j.subarray(0,r)),z$1(j.subarray(r))]}function q(r){const{j:t,symbols:f}=r;let n=0,c=0,e=0;for(let r=1;15>=r;r++){n|=u(1);const j=t[r];if(j>n-c)return f[e+(n-c)];e+=j,c=c+j<<1,n<<=1;}throw Error("invalid huffman code")}function D(r){if(Y.length<r){let t=2*Y.length;for(;r>t;)t*=2;const f=new Uint8Array(t);f.set(Y.subarray(0,l)),Y=f;}}})((r=>{const t=(r=(r+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,f=[];for(let n=0;t>n;n+=4){const t=W$1.indexOf(r[n])<<18|W$1.indexOf(r[n+1])<<12|(63&W$1.indexOf(r[n+2]))<<6|63&W$1.indexOf(r[n+3]);f.push(t>>16&255),"="!==r[n+2]&&f.push(t>>8&255),"="!==r[n+3]&&f.push(255&t);}return new Uint8Array(f)})("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")),r=>r({workerURI:r=>{const t="text/javascript";let f=s();if("string"==typeof f&&(f=(new TextEncoder).encode(f)),r){const r=new Blob([f],{type:t});return URL.createObjectURL(r)}return "data:"+t+";base64,"+(r=>{let t="";const f=r.length;let n=0;for(;f>n+2;n+=3){const f=r[n]<<16|r[n+1]<<8|r[n+2];t+=W$1[f>>18&63]+W$1[f>>12&63]+W$1[f>>6&63]+W$1[63&f];}const c=f-n;if(1===c){const f=r[n]<<16;t+=W$1[f>>18&63]+W$1[f>>12&63]+"==";}else if(2===c){const f=r[n]<<16|r[n+1]<<8;t+=W$1[f>>18&63]+W$1[f>>12&63]+W$1[f>>6&63]+"=";}return t})(f)}}));var s;
|
|
402
|
+
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],r=[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],e=[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],t=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],o=new Uint8Array(288);o.fill(8,0,144),o.fill(9,144,256),o.fill(7,256,280),o.fill(8,280,288);const u=new Uint8Array(30).fill(5);function a(n){const r=new Uint16Array(16);for(const e of n)r[e]++;r[0]=0;const e=new Uint16Array(17);for(let n=1;n<=15;n++)e[n+1]=e[n]+r[n];const f=new Uint16Array(n.length);for(let r=0;r<n.length;r++)n[r]&&(f[e[n[r]]++]=r);return {o:r,symbols:f}}const s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",p$1=(l=()=>(s=>{let p=0,l=0,U=0,K=new Uint8Array(1024),x=0,w=0;for(;!w;){w=i(1);const n=i(2);if(0==n)c();else if(1==n)j(a(o),a(u));else {if(2!=n)throw Error("invalid deflate block type");j(...y());}}return K.subarray(0,x);function b(){if(p>=s.length)throw Error("unexpected end of deflate data");return s[p++]}function i(n){for(;U<n;)l|=b()<<U,U+=8;const r=l&(1<<n)-1;return l>>>=n,U-=n,r}function c(){l=0,U=0;const n=b()|b()<<8;p+=2,V(x+n);for(let r=0;r<n;r++)K[x++]=b();}function j(t,o){let u=C(t);for(;256!=u;){if(u<256)V(x+1),K[x++]=u;else {const t=u-257,a=n[t]+i(r[t]),s=C(o),p=e[s]+i(f[s]);V(x+a);const l=x-p;for(let n=0;n<a;n++)K[x++]=K[l+n];}u=C(t);}}function y(){const n=i(5)+257,r=i(5)+1,e=i(4)+4,f=new Uint8Array(19);for(let n=0;n<e;n++)f[t[n]]=i(3);const o=a(f),u=new Uint8Array(n+r);let s=0;for(;s<u.length;){const n=C(o);if(n<16)u[s++]=n;else if(16==n){const n=u[s-1];let r=i(2)+3;for(;r--;)u[s++]=n;}else s+=17==n?i(3)+3:i(7)+11;}return [a(u.subarray(0,n)),a(u.subarray(n))]}function C(n){const{o:r,symbols:e}=n;let f=0,t=0,o=0;for(let n=1;n<=15;n++){f|=i(1);const u=r[n];if(f-t<u)return e[o+(f-t)];o+=u,t=t+u<<1,f<<=1;}throw Error("invalid huffman code")}function V(n){if(K.length<n){let r=2*K.length;for(;r<n;)r*=2;const e=new Uint8Array(r);e.set(K.subarray(0,x)),K=e;}}})((n=>{const r=(n=(n+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,e=[];for(let f=0;f<r;f+=4){const r=s.indexOf(n[f])<<18|s.indexOf(n[f+1])<<12|(63&s.indexOf(n[f+2]))<<6|63&s.indexOf(n[f+3]);e.push(r>>16&255),"="!==n[f+2]&&e.push(r>>8&255),"="!==n[f+3]&&e.push(255&r);}return new Uint8Array(e)})("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")),n=>n({workerURI:n=>{const r="text/javascript";let e=l();if("string"==typeof e&&(e=(new TextEncoder).encode(e)),n){const n=new Blob([e],{type:r});return URL.createObjectURL(n)}return "data:"+r+";base64,"+(n=>{let r="";const e=n.length;let f=0;for(;f+2<e;f+=3){const e=n[f]<<16|n[f+1]<<8|n[f+2];r+=s[e>>18&63]+s[e>>12&63]+s[e>>6&63]+s[63&e];}const t=e-f;if(1===t){const e=n[f]<<16;r+=s[e>>18&63]+s[e>>12&63]+"==";}else if(2===t){const e=n[f]<<16|n[f+1]<<8;r+=s[e>>18&63]+s[e>>12&63]+s[e>>6&63]+"=";}return r})(e)}}));var l;
|
|
256
403
|
|
|
257
404
|
/*
|
|
258
405
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -1400,13 +1547,13 @@
|
|
|
1400
1547
|
const {
|
|
1401
1548
|
ctr,
|
|
1402
1549
|
hmac,
|
|
1403
|
-
|
|
1550
|
+
pendingInput,
|
|
1404
1551
|
ready
|
|
1405
1552
|
} = this;
|
|
1406
1553
|
if (hmac && ctr) {
|
|
1407
1554
|
await ready;
|
|
1408
|
-
const chunkToDecrypt = subarray(
|
|
1409
|
-
const originalAuthenticationCode = subarray(
|
|
1555
|
+
const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1556
|
+
const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1410
1557
|
let decryptedChunkArray = EMPTY_UINT8_ARRAY;
|
|
1411
1558
|
if (chunkToDecrypt.length) {
|
|
1412
1559
|
const encryptedChunk = toBits(codecBytes, chunkToDecrypt);
|
|
@@ -1415,7 +1562,7 @@
|
|
|
1415
1562
|
decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
|
|
1416
1563
|
}
|
|
1417
1564
|
const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
|
|
1418
|
-
let invalidAuthenticationCode =
|
|
1565
|
+
let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
|
|
1419
1566
|
for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
|
|
1420
1567
|
invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
|
|
1421
1568
|
}
|
|
@@ -1459,14 +1606,14 @@
|
|
|
1459
1606
|
const {
|
|
1460
1607
|
ctr,
|
|
1461
1608
|
hmac,
|
|
1462
|
-
|
|
1609
|
+
pendingInput,
|
|
1463
1610
|
ready
|
|
1464
1611
|
} = this;
|
|
1465
1612
|
if (hmac && ctr) {
|
|
1466
1613
|
await ready;
|
|
1467
1614
|
let encryptedChunkArray = EMPTY_UINT8_ARRAY;
|
|
1468
|
-
if (
|
|
1469
|
-
const encryptedChunk = ctr.update(toBits(codecBytes,
|
|
1615
|
+
if (pendingInput.length) {
|
|
1616
|
+
const encryptedChunk = ctr.update(toBits(codecBytes, pendingInput));
|
|
1470
1617
|
hmac.update(encryptedChunk);
|
|
1471
1618
|
encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
|
|
1472
1619
|
}
|
|
@@ -1483,7 +1630,7 @@
|
|
|
1483
1630
|
ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
|
|
1484
1631
|
password: encodePassword(password, rawPassword),
|
|
1485
1632
|
strength: encryptionStrength - 1,
|
|
1486
|
-
|
|
1633
|
+
pendingInput: EMPTY_UINT8_ARRAY
|
|
1487
1634
|
});
|
|
1488
1635
|
}
|
|
1489
1636
|
|
|
@@ -1491,10 +1638,10 @@
|
|
|
1491
1638
|
const {
|
|
1492
1639
|
ctr,
|
|
1493
1640
|
hmac,
|
|
1494
|
-
|
|
1641
|
+
pendingInput
|
|
1495
1642
|
} = aesCrypto;
|
|
1496
|
-
if (
|
|
1497
|
-
input = concat(
|
|
1643
|
+
if (pendingInput.length) {
|
|
1644
|
+
input = concat(pendingInput, input);
|
|
1498
1645
|
}
|
|
1499
1646
|
const inputLength = input.length - paddingEnd;
|
|
1500
1647
|
output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
|
|
@@ -1510,7 +1657,7 @@
|
|
|
1510
1657
|
}
|
|
1511
1658
|
output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
|
|
1512
1659
|
}
|
|
1513
|
-
aesCrypto.
|
|
1660
|
+
aesCrypto.pendingInput = subarray(input, offset);
|
|
1514
1661
|
return output;
|
|
1515
1662
|
}
|
|
1516
1663
|
|
|
@@ -3283,6 +3430,96 @@
|
|
|
3283
3430
|
resetWebWorkerSupport();
|
|
3284
3431
|
}
|
|
3285
3432
|
|
|
3433
|
+
/*
|
|
3434
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
3435
|
+
|
|
3436
|
+
Redistribution and use in source and binary forms, with or without
|
|
3437
|
+
modification, are permitted provided that the following conditions are met:
|
|
3438
|
+
|
|
3439
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
3440
|
+
this list of conditions and the following disclaimer.
|
|
3441
|
+
|
|
3442
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
3443
|
+
notice, this list of conditions and the following disclaimer in
|
|
3444
|
+
the documentation and/or other materials provided with the distribution.
|
|
3445
|
+
|
|
3446
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
3447
|
+
derived from this software without specific prior written permission.
|
|
3448
|
+
|
|
3449
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
3450
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
3451
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
3452
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
3453
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
3454
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
3455
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
3456
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
3457
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
3458
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
3459
|
+
*/
|
|
3460
|
+
|
|
3461
|
+
/* global TextDecoder */
|
|
3462
|
+
|
|
3463
|
+
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
3464
|
+
const VALID_CP437 = CP437.length == 256;
|
|
3465
|
+
|
|
3466
|
+
function decodeCP437(stringValue) {
|
|
3467
|
+
if (VALID_CP437) {
|
|
3468
|
+
let result = "";
|
|
3469
|
+
for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
|
|
3470
|
+
result += CP437[stringValue[indexCharacter]];
|
|
3471
|
+
}
|
|
3472
|
+
return result;
|
|
3473
|
+
} else {
|
|
3474
|
+
return new TextDecoder().decode(stringValue);
|
|
3475
|
+
}
|
|
3476
|
+
}
|
|
3477
|
+
|
|
3478
|
+
/*
|
|
3479
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
3480
|
+
|
|
3481
|
+
Redistribution and use in source and binary forms, with or without
|
|
3482
|
+
modification, are permitted provided that the following conditions are met:
|
|
3483
|
+
|
|
3484
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
3485
|
+
this list of conditions and the following disclaimer.
|
|
3486
|
+
|
|
3487
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
3488
|
+
notice, this list of conditions and the following disclaimer in
|
|
3489
|
+
the documentation and/or other materials provided with the distribution.
|
|
3490
|
+
|
|
3491
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
3492
|
+
derived from this software without specific prior written permission.
|
|
3493
|
+
|
|
3494
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
3495
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
3496
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
3497
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
3498
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
3499
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
3500
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
3501
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
3502
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
3503
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
3504
|
+
*/
|
|
3505
|
+
|
|
3506
|
+
|
|
3507
|
+
function decodeText(value, encoding) {
|
|
3508
|
+
return decode(value, encoding, true);
|
|
3509
|
+
}
|
|
3510
|
+
|
|
3511
|
+
function decodeTextRemovingBOM(value, encoding) {
|
|
3512
|
+
return decode(value, encoding, false);
|
|
3513
|
+
}
|
|
3514
|
+
|
|
3515
|
+
function decode(value, encoding, ignoreBOM) {
|
|
3516
|
+
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
3517
|
+
return decodeCP437(value);
|
|
3518
|
+
} else {
|
|
3519
|
+
return new TextDecoder(encoding, { ignoreBOM }).decode(value);
|
|
3520
|
+
}
|
|
3521
|
+
}
|
|
3522
|
+
|
|
3286
3523
|
/*
|
|
3287
3524
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
3288
3525
|
|
|
@@ -3355,6 +3592,7 @@
|
|
|
3355
3592
|
createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
|
|
3356
3593
|
const reader = this;
|
|
3357
3594
|
let chunkOffset = 0;
|
|
3595
|
+
chunkSize = normalizeChunkSize(chunkSize);
|
|
3358
3596
|
return new ReadableStream({
|
|
3359
3597
|
async pull(controller) {
|
|
3360
3598
|
const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
|
|
@@ -3362,7 +3600,7 @@
|
|
|
3362
3600
|
if (data.length) {
|
|
3363
3601
|
controller.enqueue(data);
|
|
3364
3602
|
}
|
|
3365
|
-
if ((chunkOffset + chunkSize >= size) || (
|
|
3603
|
+
if ((chunkOffset + chunkSize >= size) || (!data.length && dataSize)) {
|
|
3366
3604
|
controller.close();
|
|
3367
3605
|
} else {
|
|
3368
3606
|
chunkOffset += chunkSize;
|
|
@@ -3442,31 +3680,31 @@
|
|
|
3442
3680
|
Object.assign(this, {
|
|
3443
3681
|
contentType,
|
|
3444
3682
|
data: "data:" + (contentType || "") + ";base64,",
|
|
3445
|
-
|
|
3683
|
+
pendingCharacters: ""
|
|
3446
3684
|
});
|
|
3447
3685
|
}
|
|
3448
3686
|
|
|
3449
3687
|
writeUint8Array(array) {
|
|
3450
3688
|
const writer = this;
|
|
3451
3689
|
let indexArray;
|
|
3452
|
-
let dataString = writer.
|
|
3453
|
-
const delta = writer.
|
|
3454
|
-
writer.
|
|
3690
|
+
let dataString = writer.pendingCharacters;
|
|
3691
|
+
const delta = writer.pendingCharacters.length;
|
|
3692
|
+
writer.pendingCharacters = "";
|
|
3455
3693
|
for (indexArray = 0; indexArray < (Math.floor((delta + array.length) / 3) * 3) - delta; indexArray++) {
|
|
3456
3694
|
dataString += String.fromCharCode(array[indexArray]);
|
|
3457
3695
|
}
|
|
3458
3696
|
for (; indexArray < array.length; indexArray++) {
|
|
3459
|
-
writer.
|
|
3697
|
+
writer.pendingCharacters += String.fromCharCode(array[indexArray]);
|
|
3460
3698
|
}
|
|
3461
3699
|
if (dataString.length > 2) {
|
|
3462
3700
|
writer.data += btoa(dataString);
|
|
3463
3701
|
} else {
|
|
3464
|
-
writer.
|
|
3702
|
+
writer.pendingCharacters = dataString + writer.pendingCharacters;
|
|
3465
3703
|
}
|
|
3466
3704
|
}
|
|
3467
3705
|
|
|
3468
3706
|
getData() {
|
|
3469
|
-
return this.data + btoa(this.
|
|
3707
|
+
return this.data + btoa(this.pendingCharacters);
|
|
3470
3708
|
}
|
|
3471
3709
|
}
|
|
3472
3710
|
|
|
@@ -3496,7 +3734,7 @@
|
|
|
3496
3734
|
constructor(blob) {
|
|
3497
3735
|
super();
|
|
3498
3736
|
Object.assign(this, {
|
|
3499
|
-
blob,
|
|
3737
|
+
sourceBlob: blob,
|
|
3500
3738
|
size: blob.size
|
|
3501
3739
|
});
|
|
3502
3740
|
if (!blobSliceProbe) {
|
|
@@ -3506,13 +3744,13 @@
|
|
|
3506
3744
|
|
|
3507
3745
|
createReadable(options) {
|
|
3508
3746
|
const reader = this;
|
|
3509
|
-
const {
|
|
3747
|
+
const { sourceBlob, size } = reader;
|
|
3510
3748
|
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
3511
3749
|
if (!offset && readSize >= size) {
|
|
3512
|
-
return toCompatibleReadable(
|
|
3750
|
+
return toCompatibleReadable(sourceBlob.stream());
|
|
3513
3751
|
}
|
|
3514
3752
|
if (blobSliceReliable) {
|
|
3515
|
-
return toCompatibleReadable(
|
|
3753
|
+
return toCompatibleReadable(sourceBlob.slice(offset, offset + readSize).stream());
|
|
3516
3754
|
}
|
|
3517
3755
|
return super.createReadable(options);
|
|
3518
3756
|
}
|
|
@@ -3521,7 +3759,7 @@
|
|
|
3521
3759
|
const reader = this;
|
|
3522
3760
|
const offsetEnd = offset + length;
|
|
3523
3761
|
const readsWholeBlob = !offset && offsetEnd >= reader.size;
|
|
3524
|
-
const blob = readsWholeBlob ? reader.
|
|
3762
|
+
const blob = readsWholeBlob ? reader.sourceBlob : reader.sourceBlob.slice(offset, offsetEnd);
|
|
3525
3763
|
let arrayBuffer = await blob.arrayBuffer();
|
|
3526
3764
|
const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
|
|
3527
3765
|
if (sliceIgnoredByBuggyImplementation) {
|
|
@@ -3543,12 +3781,12 @@
|
|
|
3543
3781
|
}
|
|
3544
3782
|
});
|
|
3545
3783
|
writer.contentType = contentType;
|
|
3546
|
-
writer.
|
|
3547
|
-
writer.
|
|
3784
|
+
writer.blobPromise = streamToBlob(transformStream.readable, contentType);
|
|
3785
|
+
writer.blobPromise.catch(() => { });
|
|
3548
3786
|
}
|
|
3549
3787
|
|
|
3550
3788
|
getData() {
|
|
3551
|
-
return this.
|
|
3789
|
+
return this.blobPromise;
|
|
3552
3790
|
}
|
|
3553
3791
|
}
|
|
3554
3792
|
|
|
@@ -3562,7 +3800,7 @@
|
|
|
3562
3800
|
class TextWriter extends BlobWriter {
|
|
3563
3801
|
|
|
3564
3802
|
constructor(encoding) {
|
|
3565
|
-
super(
|
|
3803
|
+
super();
|
|
3566
3804
|
Object.assign(this, {
|
|
3567
3805
|
encoding,
|
|
3568
3806
|
utf8: !encoding || encoding.toLowerCase() == "utf-8"
|
|
@@ -3578,14 +3816,7 @@
|
|
|
3578
3816
|
if (blob.text && utf8) {
|
|
3579
3817
|
return blob.text();
|
|
3580
3818
|
} else {
|
|
3581
|
-
|
|
3582
|
-
return new Promise((resolve, reject) => {
|
|
3583
|
-
Object.assign(reader, {
|
|
3584
|
-
onload: ({ target }) => resolve(target.result),
|
|
3585
|
-
onerror: () => reject(reader.error)
|
|
3586
|
-
});
|
|
3587
|
-
reader.readAsText(blob, encoding);
|
|
3588
|
-
});
|
|
3819
|
+
return decodeTextRemovingBOM(new Uint8Array(await blob.arrayBuffer()), encoding);
|
|
3589
3820
|
}
|
|
3590
3821
|
}
|
|
3591
3822
|
}
|
|
@@ -4253,85 +4484,13 @@
|
|
|
4253
4484
|
return reader.readUint8Array(offset, size);
|
|
4254
4485
|
}
|
|
4255
4486
|
|
|
4256
|
-
|
|
4257
|
-
|
|
4258
|
-
|
|
4259
|
-
|
|
4260
|
-
|
|
4261
|
-
|
|
4262
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4263
|
-
this list of conditions and the following disclaimer.
|
|
4264
|
-
|
|
4265
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4266
|
-
notice, this list of conditions and the following disclaimer in
|
|
4267
|
-
the documentation and/or other materials provided with the distribution.
|
|
4268
|
-
|
|
4269
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4270
|
-
derived from this software without specific prior written permission.
|
|
4271
|
-
|
|
4272
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4273
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4274
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4275
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4276
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4277
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4278
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4279
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4280
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4281
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4282
|
-
*/
|
|
4283
|
-
|
|
4284
|
-
/* global TextDecoder */
|
|
4285
|
-
|
|
4286
|
-
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
4287
|
-
const VALID_CP437 = CP437.length == 256;
|
|
4288
|
-
|
|
4289
|
-
function decodeCP437(stringValue) {
|
|
4290
|
-
if (VALID_CP437) {
|
|
4291
|
-
let result = "";
|
|
4292
|
-
for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
|
|
4293
|
-
result += CP437[stringValue[indexCharacter]];
|
|
4294
|
-
}
|
|
4295
|
-
return result;
|
|
4296
|
-
} else {
|
|
4297
|
-
return new TextDecoder().decode(stringValue);
|
|
4298
|
-
}
|
|
4299
|
-
}
|
|
4300
|
-
|
|
4301
|
-
/*
|
|
4302
|
-
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
4303
|
-
|
|
4304
|
-
Redistribution and use in source and binary forms, with or without
|
|
4305
|
-
modification, are permitted provided that the following conditions are met:
|
|
4306
|
-
|
|
4307
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4308
|
-
this list of conditions and the following disclaimer.
|
|
4309
|
-
|
|
4310
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4311
|
-
notice, this list of conditions and the following disclaimer in
|
|
4312
|
-
the documentation and/or other materials provided with the distribution.
|
|
4313
|
-
|
|
4314
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4315
|
-
derived from this software without specific prior written permission.
|
|
4316
|
-
|
|
4317
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4318
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4319
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4320
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4321
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4322
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4323
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4324
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4325
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4326
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4327
|
-
*/
|
|
4328
|
-
|
|
4329
|
-
|
|
4330
|
-
function decodeText(value, encoding) {
|
|
4331
|
-
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
4332
|
-
return decodeCP437(value);
|
|
4487
|
+
function createReadable(reader, options) {
|
|
4488
|
+
if (reader.createReadable) {
|
|
4489
|
+
return reader.createReadable(options);
|
|
4490
|
+
} else if (reader.readUint8Array) {
|
|
4491
|
+
return Reader.prototype.createReadable.call(reader, options);
|
|
4333
4492
|
} else {
|
|
4334
|
-
return
|
|
4493
|
+
return reader.readable;
|
|
4335
4494
|
}
|
|
4336
4495
|
}
|
|
4337
4496
|
|
|
@@ -4491,83 +4650,6 @@
|
|
|
4491
4650
|
|
|
4492
4651
|
}
|
|
4493
4652
|
|
|
4494
|
-
/*
|
|
4495
|
-
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
4496
|
-
|
|
4497
|
-
Redistribution and use in source and binary forms, with or without
|
|
4498
|
-
modification, are permitted provided that the following conditions are met:
|
|
4499
|
-
|
|
4500
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4501
|
-
this list of conditions and the following disclaimer.
|
|
4502
|
-
|
|
4503
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4504
|
-
notice, this list of conditions and the following disclaimer in
|
|
4505
|
-
the documentation and/or other materials provided with the distribution.
|
|
4506
|
-
|
|
4507
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4508
|
-
derived from this software without specific prior written permission.
|
|
4509
|
-
|
|
4510
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4511
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4512
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4513
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4514
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4515
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4516
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4517
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4518
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4519
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4520
|
-
*/
|
|
4521
|
-
|
|
4522
|
-
const OPTION_FILENAME_ENCODING = "filenameEncoding";
|
|
4523
|
-
const OPTION_COMMENT_ENCODING = "commentEncoding";
|
|
4524
|
-
const OPTION_DECODE_TEXT = "decodeText";
|
|
4525
|
-
const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
|
|
4526
|
-
const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
|
|
4527
|
-
const OPTION_PASSWORD = "password";
|
|
4528
|
-
const OPTION_RAW_PASSWORD = "rawPassword";
|
|
4529
|
-
const OPTION_PASS_THROUGH = "passThrough";
|
|
4530
|
-
const OPTION_SIGNAL = "signal";
|
|
4531
|
-
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
4532
|
-
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
4533
|
-
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
4534
|
-
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
4535
|
-
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
4536
|
-
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
4537
|
-
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
4538
|
-
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
4539
|
-
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
4540
|
-
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
4541
|
-
const OPTION_TRANSFER_STREAMS = "transferStreams";
|
|
4542
|
-
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
4543
|
-
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
4544
|
-
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
4545
|
-
const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
|
|
4546
|
-
const OPTION_KEEP_ORDER = "keepOrder";
|
|
4547
|
-
const OPTION_LEVEL = "level";
|
|
4548
|
-
const OPTION_BUFFERED_WRITE = "bufferedWrite";
|
|
4549
|
-
const OPTION_CREATE_TEMP_STREAM = "createTempStream";
|
|
4550
|
-
const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
|
|
4551
|
-
const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
|
|
4552
|
-
const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
|
|
4553
|
-
const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
|
|
4554
|
-
const OPTION_ENCODE_TEXT = "encodeText";
|
|
4555
|
-
const OPTION_OFFSET = "offset";
|
|
4556
|
-
const OPTION_USDZ = "usdz";
|
|
4557
|
-
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
4558
|
-
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
4559
|
-
const OPTION_STRICTNESS = "strictness";
|
|
4560
|
-
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
4561
|
-
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
4562
|
-
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
4563
|
-
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
4564
|
-
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
4565
|
-
const TEXT_TYPE_FILENAME = "filename";
|
|
4566
|
-
const TEXT_TYPE_COMMENT = "comment";
|
|
4567
|
-
const STRICTNESS_STRICT = "strict";
|
|
4568
|
-
const STRICTNESS_BALANCED = "balanced";
|
|
4569
|
-
const STRICTNESS_TOLERANT = "tolerant";
|
|
4570
|
-
|
|
4571
4653
|
/*
|
|
4572
4654
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4573
4655
|
|
|
@@ -4608,6 +4690,7 @@
|
|
|
4608
4690
|
const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
|
|
4609
4691
|
const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
4610
4692
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
4693
|
+
const ERR_ENTRY_DATA_OUT_OF_BOUNDS = "Entry data out of bounds";
|
|
4611
4694
|
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
4612
4695
|
const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
|
|
4613
4696
|
const ERR_UNSAFE_FILENAME = "Unsafe filename";
|
|
@@ -4628,7 +4711,7 @@
|
|
|
4628
4711
|
];
|
|
4629
4712
|
const ZIP64_EXTRACTION = {
|
|
4630
4713
|
[MAX_16_BITS]: {
|
|
4631
|
-
getValue: getUint32,
|
|
4714
|
+
getValue: getUint32$1,
|
|
4632
4715
|
bytes: 4
|
|
4633
4716
|
},
|
|
4634
4717
|
[MAX_32_BITS]: {
|
|
@@ -4637,6 +4720,7 @@
|
|
|
4637
4720
|
}
|
|
4638
4721
|
};
|
|
4639
4722
|
const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
|
|
4723
|
+
const MAX_DEFLATE_EXPANSION_RATIO = 1032;
|
|
4640
4724
|
const CENTRAL_DIRECTORY_UNREACHABLE = 0;
|
|
4641
4725
|
const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
|
|
4642
4726
|
const CENTRAL_DIRECTORY_REACHABLE = 2;
|
|
@@ -4647,7 +4731,6 @@
|
|
|
4647
4731
|
Object.assign(this, {
|
|
4648
4732
|
reader: new GenericReader(reader),
|
|
4649
4733
|
options,
|
|
4650
|
-
config: getConfiguration(),
|
|
4651
4734
|
readRanges: new Map()
|
|
4652
4735
|
});
|
|
4653
4736
|
}
|
|
@@ -4655,7 +4738,6 @@
|
|
|
4655
4738
|
async* getEntriesGenerator(options = {}) {
|
|
4656
4739
|
const zipReader = this;
|
|
4657
4740
|
let { reader } = zipReader;
|
|
4658
|
-
const { config } = zipReader;
|
|
4659
4741
|
await initStream(reader);
|
|
4660
4742
|
if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
|
|
4661
4743
|
reader = new BlobReader(await streamToBlob(reader.readable));
|
|
@@ -4672,9 +4754,7 @@
|
|
|
4672
4754
|
const normalizeFilename = getOptionValue$1(zipReader, options, OPTION_NORMALIZE_FILENAME);
|
|
4673
4755
|
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
4674
4756
|
if (!endOfDirectoryInfo) {
|
|
4675
|
-
|
|
4676
|
-
const signatureView = getDataView(signatureArray);
|
|
4677
|
-
if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
|
|
4757
|
+
if (await startsWithSplitZipSignature$1(reader)) {
|
|
4678
4758
|
throw new Error(ERR_SPLIT_ZIP_FILE);
|
|
4679
4759
|
} else {
|
|
4680
4760
|
throw new Error(ERR_EOCDR_NOT_FOUND);
|
|
@@ -4684,22 +4764,23 @@
|
|
|
4684
4764
|
throwAmbiguousArchive("multiple end of central directory records");
|
|
4685
4765
|
}
|
|
4686
4766
|
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
4687
|
-
let directoryDataLength = getUint32(endOfDirectoryView, 12);
|
|
4688
|
-
let directoryDataOffset = getUint32(endOfDirectoryView, 16);
|
|
4767
|
+
let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
|
|
4768
|
+
let directoryDataOffset = getUint32$1(endOfDirectoryView, 16);
|
|
4689
4769
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
4690
|
-
const commentLength = getUint16(endOfDirectoryView, 20);
|
|
4770
|
+
const commentLength = getUint16$1(endOfDirectoryView, 20);
|
|
4691
4771
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
4692
4772
|
if (reader.size - appendedDataOffset > maxAppendedDataSize) {
|
|
4693
4773
|
throwAmbiguousArchive("appended data");
|
|
4694
4774
|
}
|
|
4695
|
-
let lastDiskNumber = getUint16(endOfDirectoryView, 4);
|
|
4775
|
+
let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
|
|
4696
4776
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
4697
|
-
let diskNumber = getUint16(endOfDirectoryView, 6);
|
|
4698
|
-
let filesLength = getUint16(endOfDirectoryView, 10);
|
|
4777
|
+
let diskNumber = getUint16$1(endOfDirectoryView, 6);
|
|
4778
|
+
let filesLength = getUint16$1(endOfDirectoryView, 10);
|
|
4699
4779
|
let prependedDataLength = 0;
|
|
4700
4780
|
let startOffset;
|
|
4701
4781
|
let zip64EndOfDirectory;
|
|
4702
4782
|
let zip64EndOfDirectoryVersion2;
|
|
4783
|
+
let zip64EndOfDirectoryLength = ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
4703
4784
|
let directoryEncryptionInfo;
|
|
4704
4785
|
const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
|
|
4705
4786
|
if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
|
|
@@ -4711,12 +4792,12 @@
|
|
|
4711
4792
|
EMPTY_UINT8_ARRAY;
|
|
4712
4793
|
const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
|
|
4713
4794
|
if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
|
|
4714
|
-
getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
4715
|
-
directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4795
|
+
getUint32$1(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
4796
|
+
directoryDataOffset = getDiskOffset$1(reader, getUint32$1(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4716
4797
|
let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4717
4798
|
let endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4718
4799
|
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
4719
|
-
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
4800
|
+
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
4720
4801
|
directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
|
|
4721
4802
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
4722
4803
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
@@ -4726,7 +4807,7 @@
|
|
|
4726
4807
|
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4727
4808
|
endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4728
4809
|
}
|
|
4729
|
-
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4810
|
+
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4730
4811
|
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4731
4812
|
}
|
|
4732
4813
|
zip64EndOfDirectory = true;
|
|
@@ -4736,18 +4817,19 @@
|
|
|
4736
4817
|
Number(getBigUint64(endOfDirectoryView, 4)) - (ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12),
|
|
4737
4818
|
reader.size - directoryDataOffset - ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4738
4819
|
if (extensibleDataLength > 0) {
|
|
4820
|
+
zip64EndOfDirectoryLength += extensibleDataLength;
|
|
4739
4821
|
const rawExtensibleData = await readUint8Array(reader, directoryDataOffset + ZIP64_END_OF_CENTRAL_DIR_LENGTH, extensibleDataLength);
|
|
4740
4822
|
directoryEncryptionInfo = getDirectoryEncryptionInfo(rawExtensibleData);
|
|
4741
4823
|
}
|
|
4742
4824
|
}
|
|
4743
4825
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
4744
|
-
lastDiskNumber = getUint32(endOfDirectoryView, 16);
|
|
4745
|
-
} else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
|
|
4826
|
+
lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
|
|
4827
|
+
} else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
|
|
4746
4828
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
4747
4829
|
}
|
|
4748
4830
|
if (diskNumber == MAX_16_BITS) {
|
|
4749
|
-
diskNumber = getUint32(endOfDirectoryView, 20);
|
|
4750
|
-
} else if (checkAmbiguity && diskNumber != getUint32(endOfDirectoryView, 20)) {
|
|
4831
|
+
diskNumber = getUint32$1(endOfDirectoryView, 20);
|
|
4832
|
+
} else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
|
|
4751
4833
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
4752
4834
|
}
|
|
4753
4835
|
if (filesLength == MAX_16_BITS) {
|
|
@@ -4765,7 +4847,7 @@
|
|
|
4765
4847
|
}
|
|
4766
4848
|
let declaredDirectoryDataLength = directoryDataLength;
|
|
4767
4849
|
const centralDirectoryEndOffset = endOfDirectoryInfo.offset -
|
|
4768
|
-
(zip64EndOfDirectory ?
|
|
4850
|
+
(zip64EndOfDirectory ? zip64EndOfDirectoryLength + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
|
|
4769
4851
|
if (directoryDataOffset >= reader.size) {
|
|
4770
4852
|
prependedDataLength = reader.size - directoryDataOffset - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
4771
4853
|
directoryDataOffset = reader.size - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
@@ -4785,11 +4867,13 @@
|
|
|
4785
4867
|
}
|
|
4786
4868
|
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
4787
4869
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4788
|
-
const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE
|
|
4870
|
+
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
|
|
4871
|
+
Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
|
|
4872
|
+
detectEncryptedCentralDirectory(directoryView);
|
|
4789
4873
|
let reconcile = !storedPointsAtDirectory;
|
|
4790
4874
|
if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
4791
4875
|
const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
|
|
4792
|
-
reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4876
|
+
reconcile = getUint32$1(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4793
4877
|
}
|
|
4794
4878
|
if (reconcile) {
|
|
4795
4879
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
@@ -4813,12 +4897,14 @@
|
|
|
4813
4897
|
}
|
|
4814
4898
|
zipReader.directoryOffset = directoryDataOffset;
|
|
4815
4899
|
zipReader.directoryLength = declaredDirectoryDataLength;
|
|
4816
|
-
const decryptCentralDirectory =
|
|
4817
|
-
let decryptedDirectory;
|
|
4900
|
+
const decryptCentralDirectory = getFunctionOptionValue$1(zipReader, options, OPTION_DECRYPT_CENTRAL_DIRECTORY);
|
|
4901
|
+
let decryptedDirectory, dataAfterEncryptedDirectory;
|
|
4818
4902
|
if (decryptCentralDirectory && filesLength && directoryArray.length >= 4 &&
|
|
4819
|
-
getUint32(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
|
|
4903
|
+
getUint32$1(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
|
|
4820
4904
|
(zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4821
|
-
|
|
4905
|
+
const encryptedDirectoryDataLength = getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryArray.length);
|
|
4906
|
+
dataAfterEncryptedDirectory = directoryArray.subarray(encryptedDirectoryDataLength);
|
|
4907
|
+
directoryArray = await decryptCentralDirectory(directoryArray.subarray(0, encryptedDirectoryDataLength), directoryEncryptionInfo);
|
|
4822
4908
|
directoryView = getDataView(directoryArray);
|
|
4823
4909
|
declaredDirectoryDataLength = directoryArray.length;
|
|
4824
4910
|
decryptedDirectory = true;
|
|
@@ -4829,8 +4915,8 @@
|
|
|
4829
4915
|
const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
|
|
4830
4916
|
let duplicateFilename;
|
|
4831
4917
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
4832
|
-
const fileEntry = new ZipEntry(reader,
|
|
4833
|
-
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4918
|
+
const fileEntry = new ZipEntry(reader, zipReader.options);
|
|
4919
|
+
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32$1(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4834
4920
|
if (indexFile == 0 && !decryptedDirectory && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4835
4921
|
throw new Error(ERR_ENCRYPTED_CENTRAL_DIRECTORY);
|
|
4836
4922
|
}
|
|
@@ -4841,16 +4927,16 @@
|
|
|
4841
4927
|
const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
|
|
4842
4928
|
const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
|
|
4843
4929
|
const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
|
|
4844
|
-
const versionMadeBy = getUint16(directoryView, offset + 4);
|
|
4930
|
+
const versionMadeBy = getUint16$1(directoryView, offset + 4);
|
|
4845
4931
|
const msDosCompatible = versionMadeBy >> 8 == 0;
|
|
4846
4932
|
const unixCompatible = versionMadeBy >> 8 == 3;
|
|
4847
4933
|
const rawFilename = directoryArray.subarray(filenameOffset, extraFieldOffset);
|
|
4848
|
-
const commentLength = getUint16(directoryView, offset + 32);
|
|
4934
|
+
const commentLength = getUint16$1(directoryView, offset + 32);
|
|
4849
4935
|
const endOffset = commentOffset + commentLength;
|
|
4850
4936
|
const rawComment = directoryArray.subarray(commentOffset, endOffset);
|
|
4851
4937
|
const filenameUTF8 = languageEncodingFlag;
|
|
4852
4938
|
const commentUTF8 = languageEncodingFlag;
|
|
4853
|
-
const externalFileAttributes = getUint32(directoryView, offset + 38);
|
|
4939
|
+
const externalFileAttributes = getUint32$1(directoryView, offset + 38);
|
|
4854
4940
|
const msdosAttributesRaw = externalFileAttributes & MAX_8_BITS;
|
|
4855
4941
|
const msdosAttributes = {
|
|
4856
4942
|
readOnly: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_READONLY_MASK),
|
|
@@ -4859,8 +4945,8 @@
|
|
|
4859
4945
|
directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
|
|
4860
4946
|
archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
|
|
4861
4947
|
};
|
|
4862
|
-
const offsetFileEntry = getUint32(directoryView, offset + 42);
|
|
4863
|
-
const decode =
|
|
4948
|
+
const offsetFileEntry = getUint32$1(directoryView, offset + 42);
|
|
4949
|
+
const decode = getFunctionOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
4864
4950
|
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
4865
4951
|
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
4866
4952
|
let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
|
|
@@ -4884,6 +4970,7 @@
|
|
|
4884
4970
|
}
|
|
4885
4971
|
Object.assign(fileEntry, {
|
|
4886
4972
|
index: indexFile,
|
|
4973
|
+
decryptedDirectory,
|
|
4887
4974
|
versionMadeBy,
|
|
4888
4975
|
msDosCompatible,
|
|
4889
4976
|
zip64: false,
|
|
@@ -4891,8 +4978,8 @@
|
|
|
4891
4978
|
uncompressedSize: 0,
|
|
4892
4979
|
commentLength,
|
|
4893
4980
|
offset: offsetFileEntry,
|
|
4894
|
-
diskNumberStart: getUint16(directoryView, offset + 34),
|
|
4895
|
-
internalFileAttributes: getUint16(directoryView, offset + 36),
|
|
4981
|
+
diskNumberStart: getUint16$1(directoryView, offset + 34),
|
|
4982
|
+
internalFileAttributes: getUint16$1(directoryView, offset + 36),
|
|
4896
4983
|
externalFileAttributes,
|
|
4897
4984
|
msdosAttributesRaw,
|
|
4898
4985
|
msdosAttributes,
|
|
@@ -4960,12 +5047,11 @@
|
|
|
4960
5047
|
yield entry;
|
|
4961
5048
|
}
|
|
4962
5049
|
let offsetAfterSignature = offset;
|
|
4963
|
-
|
|
4964
|
-
|
|
4965
|
-
|
|
4966
|
-
|
|
4967
|
-
|
|
4968
|
-
}
|
|
5050
|
+
const digitalSignature = readDigitalSignature(directoryArray.subarray(offset)) ||
|
|
5051
|
+
(decryptedDirectory ? readDigitalSignature(dataAfterEncryptedDirectory) : UNDEFINED_VALUE);
|
|
5052
|
+
if (digitalSignature) {
|
|
5053
|
+
zipReader.digitalSignature = digitalSignature;
|
|
5054
|
+
offsetAfterSignature = offset + 6 + digitalSignature.length;
|
|
4969
5055
|
}
|
|
4970
5056
|
if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
|
|
4971
5057
|
throwAmbiguousArchive("trailing central directory data");
|
|
@@ -4973,13 +5059,17 @@
|
|
|
4973
5059
|
if (duplicateFilename) {
|
|
4974
5060
|
throwAmbiguousArchive("duplicate filename");
|
|
4975
5061
|
}
|
|
4976
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > 0))) {
|
|
4977
|
-
throwAmbiguousArchive("prepended data");
|
|
4978
|
-
}
|
|
4979
5062
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
4980
5063
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5064
|
+
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5065
|
+
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5066
|
+
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5067
|
+
throwAmbiguousArchive("prepended data");
|
|
5068
|
+
}
|
|
4981
5069
|
if (extractPrependedData) {
|
|
4982
|
-
zipReader.prependedData = startOffset >
|
|
5070
|
+
zipReader.prependedData = startOffset > splitZipSignatureLength ?
|
|
5071
|
+
await readUint8Array(reader, splitZipSignatureLength, startOffset - splitZipSignatureLength) :
|
|
5072
|
+
EMPTY_UINT8_ARRAY;
|
|
4983
5073
|
}
|
|
4984
5074
|
zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : EMPTY_UINT8_ARRAY;
|
|
4985
5075
|
if (extractAppendedData) {
|
|
@@ -5046,16 +5136,16 @@
|
|
|
5046
5136
|
|
|
5047
5137
|
class ZipEntry {
|
|
5048
5138
|
|
|
5049
|
-
constructor(reader,
|
|
5139
|
+
constructor(reader, options) {
|
|
5050
5140
|
Object.assign(this, {
|
|
5051
5141
|
reader,
|
|
5052
|
-
config,
|
|
5053
5142
|
options
|
|
5054
5143
|
});
|
|
5055
5144
|
}
|
|
5056
5145
|
|
|
5057
5146
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5058
5147
|
const zipEntry = this;
|
|
5148
|
+
const config = getConfiguration();
|
|
5059
5149
|
const {
|
|
5060
5150
|
reader,
|
|
5061
5151
|
index,
|
|
@@ -5064,7 +5154,6 @@
|
|
|
5064
5154
|
extraFieldAES,
|
|
5065
5155
|
extraFieldZip64,
|
|
5066
5156
|
compressionMethod,
|
|
5067
|
-
config,
|
|
5068
5157
|
bitFlag,
|
|
5069
5158
|
rawBitFlag,
|
|
5070
5159
|
crc32,
|
|
@@ -5082,6 +5171,7 @@
|
|
|
5082
5171
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
5083
5172
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
5084
5173
|
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
5174
|
+
checkPasswordOption(password, rawPassword);
|
|
5085
5175
|
password = password && password.length && password;
|
|
5086
5176
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
5087
5177
|
if (extraFieldAES) {
|
|
@@ -5089,7 +5179,7 @@
|
|
|
5089
5179
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
5090
5180
|
}
|
|
5091
5181
|
}
|
|
5092
|
-
if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
5182
|
+
if (dataArray.length < HEADER_SIZE || getUint32$1(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
5093
5183
|
throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
|
|
5094
5184
|
}
|
|
5095
5185
|
readCommonHeader(localDirectory, dataView, 4);
|
|
@@ -5151,9 +5241,12 @@
|
|
|
5151
5241
|
}
|
|
5152
5242
|
}
|
|
5153
5243
|
const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
|
|
5244
|
+
if (dataOffset + compressedSize > reader.size) {
|
|
5245
|
+
throw new Error(ERR_ENTRY_DATA_OUT_OF_BOUNDS);
|
|
5246
|
+
}
|
|
5154
5247
|
const size = compressedSize;
|
|
5155
5248
|
const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
|
|
5156
|
-
const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
|
|
5249
|
+
const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
|
|
5157
5250
|
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5158
5251
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
5159
5252
|
const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
|
|
@@ -5161,6 +5254,8 @@
|
|
|
5161
5254
|
checkOverlappingEntry = true;
|
|
5162
5255
|
}
|
|
5163
5256
|
const { onstart, onprogress, onend } = options;
|
|
5257
|
+
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThrough;
|
|
5258
|
+
const outputSize = passThrough ? compressedSize : uncompressedSize;
|
|
5164
5259
|
const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
|
|
5165
5260
|
let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
|
|
5166
5261
|
if (deflate64) {
|
|
@@ -5181,9 +5276,9 @@
|
|
|
5181
5276
|
checkCrc32,
|
|
5182
5277
|
checkAuthenticationCode: getOptionValue$1(zipEntry, options, OPTION_CHECK_AUTHENTICATION_CODE),
|
|
5183
5278
|
passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & MAX_8_BITS) : ((crc32 >>> 24) & MAX_8_BITS)),
|
|
5184
|
-
outputSize
|
|
5279
|
+
outputSize,
|
|
5185
5280
|
crc32,
|
|
5186
|
-
compressed
|
|
5281
|
+
compressed,
|
|
5187
5282
|
encrypted,
|
|
5188
5283
|
useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
|
|
5189
5284
|
useCompressionStream,
|
|
@@ -5220,11 +5315,11 @@
|
|
|
5220
5315
|
writer = new WritableStream();
|
|
5221
5316
|
}
|
|
5222
5317
|
writer = new GenericWriter(writer);
|
|
5223
|
-
await initStream(writer,
|
|
5318
|
+
await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
|
|
5224
5319
|
({ writable } = writer);
|
|
5225
|
-
const { outputSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5226
|
-
writer.size +=
|
|
5227
|
-
if (
|
|
5320
|
+
const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5321
|
+
writer.size += writtenSize;
|
|
5322
|
+
if (writtenSize != outputSize) {
|
|
5228
5323
|
throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
5229
5324
|
}
|
|
5230
5325
|
}
|
|
@@ -5258,26 +5353,47 @@
|
|
|
5258
5353
|
function detectEncryptedCentralDirectory(directoryView) {
|
|
5259
5354
|
const maxOffset = Math.min(directoryView.byteLength, 1024) - 3;
|
|
5260
5355
|
for (let offset = 0; offset < maxOffset; offset++) {
|
|
5261
|
-
if (getUint32(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
5356
|
+
if (getUint32$1(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
5262
5357
|
return true;
|
|
5263
5358
|
}
|
|
5264
5359
|
}
|
|
5265
5360
|
return false;
|
|
5266
5361
|
}
|
|
5267
5362
|
|
|
5363
|
+
function readDigitalSignature(signatureRecordArray) {
|
|
5364
|
+
if (signatureRecordArray.length >= 6) {
|
|
5365
|
+
const signatureRecordView = getDataView(signatureRecordArray);
|
|
5366
|
+
if (getUint32$1(signatureRecordView, 0) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
|
|
5367
|
+
const signatureDataLength = getUint16$1(signatureRecordView, 4);
|
|
5368
|
+
if (6 + signatureDataLength <= signatureRecordArray.length) {
|
|
5369
|
+
return signatureRecordArray.subarray(6, 6 + signatureDataLength);
|
|
5370
|
+
}
|
|
5371
|
+
}
|
|
5372
|
+
}
|
|
5373
|
+
}
|
|
5374
|
+
|
|
5375
|
+
function getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryDataLength) {
|
|
5376
|
+
const encryptedDirectoryDataLength = directoryEncryptionInfo && directoryEncryptionInfo.compressedSize ?
|
|
5377
|
+
directoryEncryptionInfo.compressedSize :
|
|
5378
|
+
declaredDirectoryDataLength;
|
|
5379
|
+
return encryptedDirectoryDataLength > 0 && encryptedDirectoryDataLength <= directoryDataLength ?
|
|
5380
|
+
encryptedDirectoryDataLength :
|
|
5381
|
+
directoryDataLength;
|
|
5382
|
+
}
|
|
5383
|
+
|
|
5268
5384
|
function getDirectoryEncryptionInfo(rawExtensibleData) {
|
|
5269
5385
|
const directoryEncryptionInfo = { rawExtensibleData };
|
|
5270
5386
|
if (rawExtensibleData.length >= 28) {
|
|
5271
5387
|
const extensibleDataView = getDataView(rawExtensibleData);
|
|
5272
|
-
const hashDataLength = getUint16(extensibleDataView, 26);
|
|
5388
|
+
const hashDataLength = getUint16$1(extensibleDataView, 26);
|
|
5273
5389
|
Object.assign(directoryEncryptionInfo, {
|
|
5274
|
-
compressionMethod: getUint16(extensibleDataView, 0),
|
|
5390
|
+
compressionMethod: getUint16$1(extensibleDataView, 0),
|
|
5275
5391
|
compressedSize: Number(getBigUint64(extensibleDataView, 2)),
|
|
5276
5392
|
uncompressedSize: Number(getBigUint64(extensibleDataView, 10)),
|
|
5277
|
-
encryptionAlgorithm: getUint16(extensibleDataView, 18),
|
|
5278
|
-
bitLength: getUint16(extensibleDataView, 20),
|
|
5279
|
-
flags: getUint16(extensibleDataView, 22),
|
|
5280
|
-
hashAlgorithm: getUint16(extensibleDataView, 24),
|
|
5393
|
+
encryptionAlgorithm: getUint16$1(extensibleDataView, 18),
|
|
5394
|
+
bitLength: getUint16$1(extensibleDataView, 20),
|
|
5395
|
+
flags: getUint16$1(extensibleDataView, 22),
|
|
5396
|
+
hashAlgorithm: getUint16$1(extensibleDataView, 24),
|
|
5281
5397
|
hashData: rawExtensibleData.subarray(28, 28 + hashDataLength)
|
|
5282
5398
|
});
|
|
5283
5399
|
}
|
|
@@ -5285,12 +5401,12 @@
|
|
|
5285
5401
|
}
|
|
5286
5402
|
|
|
5287
5403
|
function readCommonHeader(directory, dataView, offset) {
|
|
5288
|
-
const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2);
|
|
5404
|
+
const rawBitFlag = directory.rawBitFlag = getUint16$1(dataView, offset + 2);
|
|
5289
5405
|
const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED;
|
|
5290
|
-
const rawLastModDate = getUint32(dataView, offset + 6);
|
|
5406
|
+
const rawLastModDate = getUint32$1(dataView, offset + 6);
|
|
5291
5407
|
Object.assign(directory, {
|
|
5292
5408
|
encrypted,
|
|
5293
|
-
version: getUint16(dataView, offset),
|
|
5409
|
+
version: getUint16$1(dataView, offset),
|
|
5294
5410
|
bitFlag: {
|
|
5295
5411
|
level: (rawBitFlag & BITFLAG_LEVEL) >> 1,
|
|
5296
5412
|
dataDescriptor: (rawBitFlag & BITFLAG_DATA_DESCRIPTOR) == BITFLAG_DATA_DESCRIPTOR,
|
|
@@ -5298,8 +5414,8 @@
|
|
|
5298
5414
|
},
|
|
5299
5415
|
rawLastModDate,
|
|
5300
5416
|
lastModDate: getDate(rawLastModDate),
|
|
5301
|
-
filenameLength: getUint16(dataView, offset + 22),
|
|
5302
|
-
extraFieldLength: getUint16(dataView, offset + 24)
|
|
5417
|
+
filenameLength: getUint16$1(dataView, offset + 22),
|
|
5418
|
+
extraFieldLength: getUint16$1(dataView, offset + 24)
|
|
5303
5419
|
});
|
|
5304
5420
|
}
|
|
5305
5421
|
|
|
@@ -5310,8 +5426,8 @@
|
|
|
5310
5426
|
let offsetExtraField = 0;
|
|
5311
5427
|
try {
|
|
5312
5428
|
while (offsetExtraField < rawExtraField.length) {
|
|
5313
|
-
const type = getUint16(rawExtraFieldView, offsetExtraField);
|
|
5314
|
-
const size = getUint16(rawExtraFieldView, offsetExtraField + 2);
|
|
5429
|
+
const type = getUint16$1(rawExtraFieldView, offsetExtraField);
|
|
5430
|
+
const size = getUint16$1(rawExtraFieldView, offsetExtraField + 2);
|
|
5315
5431
|
extraField.set(type, {
|
|
5316
5432
|
type,
|
|
5317
5433
|
data: rawExtraField.slice(offsetExtraField + 4, offsetExtraField + 4 + size)
|
|
@@ -5321,12 +5437,12 @@
|
|
|
5321
5437
|
} catch {
|
|
5322
5438
|
// ignored
|
|
5323
5439
|
}
|
|
5324
|
-
const compressionMethod = getUint16(dataView, offset + 4);
|
|
5440
|
+
const compressionMethod = getUint16$1(dataView, offset + 4);
|
|
5325
5441
|
Object.assign(directory, {
|
|
5326
|
-
signature: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5327
|
-
crc32: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5328
|
-
compressedSize: getUint32(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
|
|
5329
|
-
uncompressedSize: getUint32(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
|
|
5442
|
+
signature: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5443
|
+
crc32: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5444
|
+
compressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
|
|
5445
|
+
uncompressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
|
|
5330
5446
|
});
|
|
5331
5447
|
const extraFieldZip64 = extraField.get(EXTRAFIELD_TYPE_ZIP64);
|
|
5332
5448
|
if (extraFieldZip64) {
|
|
@@ -5415,11 +5531,11 @@
|
|
|
5415
5531
|
computedCrc32.append(fileEntry[rawPropertyName]);
|
|
5416
5532
|
const computedCrc32View = getDataView(new Uint8Array(4));
|
|
5417
5533
|
computedCrc32View.setUint32(0, computedCrc32.get(), true);
|
|
5418
|
-
const nameCrc32 = getUint32(extraFieldView, 1);
|
|
5534
|
+
const nameCrc32 = getUint32$1(extraFieldView, 1);
|
|
5419
5535
|
Object.assign(extraFieldUnicode, {
|
|
5420
5536
|
version: getUint8(extraFieldView, 0),
|
|
5421
5537
|
[propertyName]: decodeText(extraFieldUnicode.data.subarray(5)),
|
|
5422
|
-
valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32(computedCrc32View, 0)
|
|
5538
|
+
valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32$1(computedCrc32View, 0)
|
|
5423
5539
|
});
|
|
5424
5540
|
if (extraFieldUnicode.valid) {
|
|
5425
5541
|
directory[propertyName] = extraFieldUnicode[propertyName];
|
|
@@ -5435,7 +5551,7 @@
|
|
|
5435
5551
|
vendorId: getUint8(extraFieldView, 2),
|
|
5436
5552
|
strength,
|
|
5437
5553
|
originalCompressionMethod: compressionMethod,
|
|
5438
|
-
compressionMethod: getUint16(extraFieldView, 5)
|
|
5554
|
+
compressionMethod: getUint16$1(extraFieldView, 5)
|
|
5439
5555
|
});
|
|
5440
5556
|
directory.compressionMethod = extraFieldAES.compressionMethod;
|
|
5441
5557
|
if (extraFieldAES.vendorVersion != VENDOR_VERSION_AE_1$1) {
|
|
@@ -5449,8 +5565,8 @@
|
|
|
5449
5565
|
let tag1Data;
|
|
5450
5566
|
try {
|
|
5451
5567
|
while (offsetExtraField < extraFieldNTFS.data.length && !tag1Data) {
|
|
5452
|
-
const tagValue = getUint16(extraFieldView, offsetExtraField);
|
|
5453
|
-
const attributeSize = getUint16(extraFieldView, offsetExtraField + 2);
|
|
5568
|
+
const tagValue = getUint16$1(extraFieldView, offsetExtraField);
|
|
5569
|
+
const attributeSize = getUint16$1(extraFieldView, offsetExtraField + 2);
|
|
5454
5570
|
if (tagValue == EXTRAFIELD_TYPE_NTFS_TAG1) {
|
|
5455
5571
|
tag1Data = extraFieldNTFS.data.slice(offsetExtraField + 4, offsetExtraField + 4 + attributeSize);
|
|
5456
5572
|
}
|
|
@@ -5483,12 +5599,12 @@
|
|
|
5483
5599
|
return;
|
|
5484
5600
|
}
|
|
5485
5601
|
const extraFieldView = getDataView(extraField.data);
|
|
5486
|
-
const lastAccessDate = new Date((getUint32(extraFieldView, 0) | 0) * 1000);
|
|
5487
|
-
const lastModDate = new Date((getUint32(extraFieldView, 4) | 0) * 1000);
|
|
5602
|
+
const lastAccessDate = new Date((getUint32$1(extraFieldView, 0) | 0) * 1000);
|
|
5603
|
+
const lastModDate = new Date((getUint32$1(extraFieldView, 4) | 0) * 1000);
|
|
5488
5604
|
const extraFieldData = { lastAccessDate, lastModDate };
|
|
5489
5605
|
if (extraField.data.length >= 12) {
|
|
5490
|
-
extraFieldData.uid = getUint16(extraFieldView, 8);
|
|
5491
|
-
extraFieldData.gid = getUint16(extraFieldView, 10);
|
|
5606
|
+
extraFieldData.uid = getUint16$1(extraFieldView, 8);
|
|
5607
|
+
extraFieldData.gid = getUint16$1(extraFieldView, 10);
|
|
5492
5608
|
}
|
|
5493
5609
|
Object.assign(extraField, extraFieldData);
|
|
5494
5610
|
Object.assign(directory, extraFieldData);
|
|
@@ -5508,8 +5624,8 @@
|
|
|
5508
5624
|
gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
|
|
5509
5625
|
Object.assign(extraField, { version, uid, gid });
|
|
5510
5626
|
} else if (extraField.data.length >= 4) {
|
|
5511
|
-
uid = getUint16(view, 0);
|
|
5512
|
-
gid = getUint16(view, 2);
|
|
5627
|
+
uid = getUint16$1(view, 0);
|
|
5628
|
+
gid = getUint16$1(view, 2);
|
|
5513
5629
|
Object.assign(extraField, { uid, gid });
|
|
5514
5630
|
}
|
|
5515
5631
|
if (uid !== UNDEFINED_VALUE) {
|
|
@@ -5559,7 +5675,7 @@
|
|
|
5559
5675
|
let offset = 1;
|
|
5560
5676
|
timeProperties.forEach((propertyName, indexProperty) => {
|
|
5561
5677
|
if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
|
|
5562
|
-
const time = getUint32(extraFieldView, offset);
|
|
5678
|
+
const time = getUint32$1(extraFieldView, offset);
|
|
5563
5679
|
directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
|
|
5564
5680
|
const rawPropertyName = timeRawProperties[indexProperty];
|
|
5565
5681
|
extraFieldExtendedTimestamp[rawPropertyName] = time;
|
|
@@ -5593,7 +5709,7 @@
|
|
|
5593
5709
|
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
|
|
5594
5710
|
const dataDescriptorView = getDataView(dataDescriptorArray);
|
|
5595
5711
|
let signature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
|
|
5596
|
-
getUint32(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
5712
|
+
getUint32$1(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
5597
5713
|
if (signature) {
|
|
5598
5714
|
const signedDataDescriptor = readDataDescriptor(dataDescriptorView, DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, extraFieldZip64);
|
|
5599
5715
|
const matchCrc32 = (fileEntry.encrypted && !fileEntry.zipCrypto) || signedDataDescriptor.crc32 == crc32;
|
|
@@ -5627,15 +5743,15 @@
|
|
|
5627
5743
|
}
|
|
5628
5744
|
|
|
5629
5745
|
function readDataDescriptor(dataDescriptorView, offset, extraFieldZip64) {
|
|
5630
|
-
const crc32 = getUint32(dataDescriptorView, offset);
|
|
5746
|
+
const crc32 = getUint32$1(dataDescriptorView, offset);
|
|
5631
5747
|
let compressedSize;
|
|
5632
5748
|
let uncompressedSize;
|
|
5633
5749
|
if (extraFieldZip64) {
|
|
5634
5750
|
compressedSize = getBigUint64(dataDescriptorView, offset + 4);
|
|
5635
5751
|
uncompressedSize = getBigUint64(dataDescriptorView, offset + 12);
|
|
5636
5752
|
} else {
|
|
5637
|
-
compressedSize = getUint32(dataDescriptorView, offset + 4);
|
|
5638
|
-
uncompressedSize = getUint32(dataDescriptorView, offset + 8);
|
|
5753
|
+
compressedSize = getUint32$1(dataDescriptorView, offset + 4);
|
|
5754
|
+
uncompressedSize = getUint32$1(dataDescriptorView, offset + 8);
|
|
5639
5755
|
}
|
|
5640
5756
|
return { crc32, compressedSize, uncompressedSize };
|
|
5641
5757
|
}
|
|
@@ -5644,10 +5760,28 @@
|
|
|
5644
5760
|
return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
|
|
5645
5761
|
}
|
|
5646
5762
|
|
|
5763
|
+
async function startsWithSplitZipSignature$1(reader) {
|
|
5764
|
+
return await getFirstSignature(reader) == SPLIT_ZIP_FILE_SIGNATURE;
|
|
5765
|
+
}
|
|
5766
|
+
|
|
5767
|
+
async function startsWithSplitZipMarker(reader) {
|
|
5768
|
+
const signature = await getFirstSignature(reader);
|
|
5769
|
+
return signature == SPLIT_ZIP_FILE_SIGNATURE || signature == TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE;
|
|
5770
|
+
}
|
|
5771
|
+
|
|
5772
|
+
async function getFirstSignature(reader) {
|
|
5773
|
+
const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
5774
|
+
return getUint32$1(getDataView(signatureArray));
|
|
5775
|
+
}
|
|
5776
|
+
|
|
5647
5777
|
function isStrictnessValue(value) {
|
|
5648
5778
|
return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
|
|
5649
5779
|
}
|
|
5650
5780
|
|
|
5781
|
+
function getDecodableOutputSize(outputSize, compressedSize, compressed) {
|
|
5782
|
+
return Math.min(outputSize, compressed ? compressedSize * MAX_DEFLATE_EXPANSION_RATIO : compressedSize);
|
|
5783
|
+
}
|
|
5784
|
+
|
|
5651
5785
|
function getStrictness(options, inheritedOptions) {
|
|
5652
5786
|
return resolveStrictness(options, resolveStrictness(inheritedOptions, STRICTNESS_BALANCED));
|
|
5653
5787
|
}
|
|
@@ -5710,7 +5844,7 @@
|
|
|
5710
5844
|
|
|
5711
5845
|
function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
|
|
5712
5846
|
if (maxAppendedDataSize !== UNDEFINED_VALUE) {
|
|
5713
|
-
const size = toNumber
|
|
5847
|
+
const size = toNumber(maxAppendedDataSize);
|
|
5714
5848
|
if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
|
|
5715
5849
|
throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE);
|
|
5716
5850
|
}
|
|
@@ -5733,7 +5867,7 @@
|
|
|
5733
5867
|
let plausibleEndOfDirectoryInfo;
|
|
5734
5868
|
let endOfDirectoryReachingEndCount = 0;
|
|
5735
5869
|
for await (const [anchoredView, anchoredOffset, anchoredArray, indexByte, offset] of scanEndOfCentralDirectory(reader, anchoredLength)) {
|
|
5736
|
-
const commentLength = getUint16(anchoredView, indexByte + 20);
|
|
5870
|
+
const commentLength = getUint16$1(anchoredView, indexByte + 20);
|
|
5737
5871
|
if (offset + END_OF_CENTRAL_DIR_LENGTH + commentLength == size) {
|
|
5738
5872
|
const reachability = await getCentralDirectoryReachability(reader, anchoredView, anchoredOffset, indexByte, offset, size, remoteProbeBudget);
|
|
5739
5873
|
if (reachability == CENTRAL_DIRECTORY_REACHABLE) {
|
|
@@ -5784,7 +5918,7 @@
|
|
|
5784
5918
|
const scanArray = await readUint8Array(reader, scanOffset, scanLength);
|
|
5785
5919
|
const scanView = getDataView(scanArray);
|
|
5786
5920
|
for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
|
|
5787
|
-
if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
5921
|
+
if (getUint32$1(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
5788
5922
|
yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
|
|
5789
5923
|
}
|
|
5790
5924
|
}
|
|
@@ -5795,9 +5929,9 @@
|
|
|
5795
5929
|
}
|
|
5796
5930
|
|
|
5797
5931
|
async function getCentralDirectoryReachability(reader, view, anchoredOffset, indexByte, offset, size, remoteProbeBudget) {
|
|
5798
|
-
const filesLength = getUint16(view, indexByte + 10);
|
|
5799
|
-
const directoryDataLength = getUint32(view, indexByte + 12);
|
|
5800
|
-
const directoryDataOffset = getUint32(view, indexByte + 16);
|
|
5932
|
+
const filesLength = getUint16$1(view, indexByte + 10);
|
|
5933
|
+
const directoryDataLength = getUint32$1(view, indexByte + 12);
|
|
5934
|
+
const directoryDataOffset = getUint32$1(view, indexByte + 16);
|
|
5801
5935
|
if (filesLength == MAX_16_BITS || directoryDataLength == MAX_32_BITS || directoryDataOffset == MAX_32_BITS) {
|
|
5802
5936
|
const locatorSignature = await readSignature(reader, view, anchoredOffset, offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, size, remoteProbeBudget);
|
|
5803
5937
|
return locatorSignature == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE ? CENTRAL_DIRECTORY_REACHABLE : CENTRAL_DIRECTORY_UNREACHABLE;
|
|
@@ -5805,7 +5939,7 @@
|
|
|
5805
5939
|
if (!filesLength && !directoryDataLength) {
|
|
5806
5940
|
return CENTRAL_DIRECTORY_PLAUSIBLE;
|
|
5807
5941
|
}
|
|
5808
|
-
const directoryDiskNumber = getUint16(view, indexByte + 6);
|
|
5942
|
+
const directoryDiskNumber = getUint16$1(view, indexByte + 6);
|
|
5809
5943
|
for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
|
|
5810
5944
|
if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
5811
5945
|
return CENTRAL_DIRECTORY_REACHABLE;
|
|
@@ -5819,19 +5953,21 @@
|
|
|
5819
5953
|
return UNDEFINED_VALUE;
|
|
5820
5954
|
}
|
|
5821
5955
|
if (signatureOffset >= anchoredOffset) {
|
|
5822
|
-
return getUint32(view, signatureOffset - anchoredOffset);
|
|
5956
|
+
return getUint32$1(view, signatureOffset - anchoredOffset);
|
|
5823
5957
|
}
|
|
5824
5958
|
if (remoteProbeBudget.count > 0) {
|
|
5825
5959
|
remoteProbeBudget.count--;
|
|
5826
5960
|
const signatureArray = await readUint8Array(reader, signatureOffset, 4);
|
|
5827
|
-
return getUint32(getDataView(signatureArray), 0);
|
|
5961
|
+
return getUint32$1(getDataView(signatureArray), 0);
|
|
5828
5962
|
}
|
|
5829
5963
|
return UNDEFINED_VALUE;
|
|
5830
5964
|
}
|
|
5831
5965
|
|
|
5832
5966
|
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
|
|
5833
5967
|
const { rawFilename } = zipEntry;
|
|
5834
|
-
|
|
5968
|
+
const maskedLocalDirectory = zipEntry.decryptedDirectory &&
|
|
5969
|
+
(localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
|
|
5970
|
+
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
5835
5971
|
(rawLocalFilename.length != rawFilename.length ||
|
|
5836
5972
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
5837
5973
|
throwAmbiguousArchive("mismatched local file header (filename)");
|
|
@@ -5842,7 +5978,7 @@
|
|
|
5842
5978
|
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
5843
5979
|
throwAmbiguousArchive("mismatched local file header (compression method)");
|
|
5844
5980
|
}
|
|
5845
|
-
if (!localDirectory.bitFlag.dataDescriptor &&
|
|
5981
|
+
if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
|
|
5846
5982
|
(localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
5847
5983
|
(localDirectory.crc32 != zipEntry.crc32 ||
|
|
5848
5984
|
localDirectory.compressedSize != zipEntry.compressedSize ||
|
|
@@ -5861,10 +5997,11 @@
|
|
|
5861
5997
|
return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
|
|
5862
5998
|
}
|
|
5863
5999
|
|
|
5864
|
-
function
|
|
5865
|
-
return
|
|
6000
|
+
function getFunctionOptionValue$1(zipReader, options, name) {
|
|
6001
|
+
return checkFunctionOption(getOptionValue$1(zipReader, options, name));
|
|
5866
6002
|
}
|
|
5867
6003
|
|
|
6004
|
+
|
|
5868
6005
|
function getDate(timeRaw) {
|
|
5869
6006
|
const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
|
|
5870
6007
|
return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
|
|
@@ -5878,11 +6015,11 @@
|
|
|
5878
6015
|
return view.getUint8(offset);
|
|
5879
6016
|
}
|
|
5880
6017
|
|
|
5881
|
-
function getUint16(view, offset) {
|
|
6018
|
+
function getUint16$1(view, offset) {
|
|
5882
6019
|
return view.getUint16(offset, true);
|
|
5883
6020
|
}
|
|
5884
6021
|
|
|
5885
|
-
function getUint32(view, offset) {
|
|
6022
|
+
function getUint32$1(view, offset) {
|
|
5886
6023
|
return view.getUint32(offset, true);
|
|
5887
6024
|
}
|
|
5888
6025
|
|
|
@@ -5897,6 +6034,7 @@
|
|
|
5897
6034
|
ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
|
|
5898
6035
|
ERR_ENCRYPTED: ERR_ENCRYPTED,
|
|
5899
6036
|
ERR_ENCRYPTED_CENTRAL_DIRECTORY: ERR_ENCRYPTED_CENTRAL_DIRECTORY,
|
|
6037
|
+
ERR_ENTRY_DATA_OUT_OF_BOUNDS: ERR_ENTRY_DATA_OUT_OF_BOUNDS,
|
|
5900
6038
|
ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
|
|
5901
6039
|
ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
|
|
5902
6040
|
ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
|
|
@@ -5953,12 +6091,16 @@
|
|
|
5953
6091
|
const ERR_INVALID_COMMENT = "Zip file comment exceeds 64KB";
|
|
5954
6092
|
const ERR_INVALID_COMMENT_TYPE = "Invalid zip file comment (must be a Uint8Array)";
|
|
5955
6093
|
const ERR_INVALID_ENTRY_COMMENT = "File entry comment exceeds 64KB";
|
|
6094
|
+
const ERR_INVALID_ENTRY_COMMENT_TYPE = "Invalid file entry comment (must be a string)";
|
|
6095
|
+
const ERR_INVALID_DATE = "Invalid date (must be a valid Date instance)";
|
|
5956
6096
|
const ERR_INVALID_ENTRY_NAME = "File entry name exceeds 64KB";
|
|
5957
6097
|
const ERR_INVALID_VERSION = "Version exceeds 65535";
|
|
5958
6098
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
5959
6099
|
const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
|
|
5960
6100
|
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
|
|
5961
|
-
const
|
|
6101
|
+
const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
|
|
6102
|
+
const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
|
|
6103
|
+
const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
|
|
5962
6104
|
const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
|
|
5963
6105
|
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
5964
6106
|
const MIN_UNIX_TIME = -2147483648;
|
|
@@ -5967,6 +6109,7 @@
|
|
|
5967
6109
|
const MAX_NTFS_TIME = BigInt("0x7fffffffffffffff");
|
|
5968
6110
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
5969
6111
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
6112
|
+
const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
|
|
5970
6113
|
const ERR_UNDETERMINED_SIZE = "Undetermined size";
|
|
5971
6114
|
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
5972
6115
|
const ERR_ZIP_NOT_EMPTY = "Zip file not empty";
|
|
@@ -5978,7 +6121,6 @@
|
|
|
5978
6121
|
const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
|
|
5979
6122
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
5980
6123
|
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
5981
|
-
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
5982
6124
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
5983
6125
|
|
|
5984
6126
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
@@ -6003,8 +6145,7 @@
|
|
|
6003
6145
|
writer,
|
|
6004
6146
|
addSplitZipSignature,
|
|
6005
6147
|
options,
|
|
6006
|
-
|
|
6007
|
-
files: new Map(),
|
|
6148
|
+
fileEntries: new Map(),
|
|
6008
6149
|
filenames: new Set(),
|
|
6009
6150
|
offset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options[OPTION_OFFSET],
|
|
6010
6151
|
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
@@ -6025,14 +6166,23 @@
|
|
|
6025
6166
|
await initStream(reader);
|
|
6026
6167
|
}
|
|
6027
6168
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6028
|
-
const zipReader$1 = new ZipReader(reader
|
|
6169
|
+
const zipReader$1 = new ZipReader(reader);
|
|
6029
6170
|
const entries = await zipReader$1.getEntries();
|
|
6030
6171
|
await zipReader$1.close();
|
|
6031
6172
|
await initStream(this.writer);
|
|
6032
|
-
|
|
6033
|
-
|
|
6173
|
+
const { directoryOffset } = zipReader$1;
|
|
6174
|
+
let splitZipSignatureLength = 0;
|
|
6175
|
+
if (this.addSplitZipSignature) {
|
|
6176
|
+
delete this.addSplitZipSignature;
|
|
6177
|
+
if (!await startsWithSplitZipSignature(reader)) {
|
|
6178
|
+
await writeData(this.writer, getSplitZipSignatureArray());
|
|
6179
|
+
splitZipSignatureLength = SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6180
|
+
this.offset += splitZipSignatureLength;
|
|
6181
|
+
}
|
|
6182
|
+
}
|
|
6183
|
+
const entryPositions = await copyZipData(this, reader, entries, directoryOffset, splitZipSignatureLength);
|
|
6034
6184
|
this.filenames = new Set(entries.map(entry => entry.filename));
|
|
6035
|
-
this.
|
|
6185
|
+
this.fileEntries = new Map(entries.map(entry => {
|
|
6036
6186
|
const {
|
|
6037
6187
|
version,
|
|
6038
6188
|
rawLastModDate,
|
|
@@ -6087,11 +6237,12 @@
|
|
|
6087
6237
|
if (crc32 !== UNDEFINED_VALUE) {
|
|
6088
6238
|
setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
|
|
6089
6239
|
}
|
|
6240
|
+
const { offset, diskNumberStart } = entryPositions.get(entry);
|
|
6090
6241
|
Object.assign(entry, {
|
|
6091
6242
|
zip64UncompressedSize,
|
|
6092
6243
|
zip64CompressedSize,
|
|
6093
|
-
|
|
6094
|
-
diskNumberStart
|
|
6244
|
+
offset,
|
|
6245
|
+
diskNumberStart,
|
|
6095
6246
|
zip64DiskNumberStart: false,
|
|
6096
6247
|
rawExtraFieldZip64,
|
|
6097
6248
|
rawExtraFieldAES,
|
|
@@ -6111,11 +6262,8 @@
|
|
|
6111
6262
|
async add(name = "", reader, options = {}) {
|
|
6112
6263
|
const zipWriter = this;
|
|
6113
6264
|
options = Object.assign({}, options);
|
|
6114
|
-
const {
|
|
6115
|
-
|
|
6116
|
-
config
|
|
6117
|
-
} = zipWriter;
|
|
6118
|
-
if (workers < config.maxWorkers) {
|
|
6265
|
+
const { pendingAddFileCalls } = zipWriter;
|
|
6266
|
+
if (workers < getConfiguration().maxWorkers) {
|
|
6119
6267
|
workers++;
|
|
6120
6268
|
} else {
|
|
6121
6269
|
await new Promise(resolve => pendingEntries.push(resolve));
|
|
@@ -6152,16 +6300,16 @@
|
|
|
6152
6300
|
}
|
|
6153
6301
|
|
|
6154
6302
|
remove(entry) {
|
|
6155
|
-
const { filenames,
|
|
6303
|
+
const { filenames, fileEntries } = this;
|
|
6156
6304
|
// deno-lint-ignore valid-typeof
|
|
6157
6305
|
if (typeof entry == STRING_TYPE) {
|
|
6158
|
-
entry =
|
|
6306
|
+
entry = fileEntries.get(entry);
|
|
6159
6307
|
}
|
|
6160
6308
|
if (entry && entry.filename !== UNDEFINED_VALUE) {
|
|
6161
6309
|
const { filename } = entry;
|
|
6162
|
-
if (filenames.has(filename) &&
|
|
6310
|
+
if (filenames.has(filename) && fileEntries.has(filename)) {
|
|
6163
6311
|
filenames.delete(filename);
|
|
6164
|
-
|
|
6312
|
+
fileEntries.delete(filename);
|
|
6165
6313
|
return true;
|
|
6166
6314
|
}
|
|
6167
6315
|
}
|
|
@@ -6258,12 +6406,12 @@
|
|
|
6258
6406
|
const metadataInfo = resolveMetadata(zipWriter, name, options);
|
|
6259
6407
|
const { comment } = metadataInfo;
|
|
6260
6408
|
const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
|
|
6261
|
-
zipWriter.
|
|
6409
|
+
zipWriter.fileEntries.set(name, UNDEFINED_VALUE);
|
|
6262
6410
|
let fileEntry;
|
|
6263
6411
|
try {
|
|
6264
6412
|
const { resolvedOptions } = metadataInfo;
|
|
6265
6413
|
if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
|
|
6266
|
-
!resolvedOptions.passThrough && !(await supportsDeflate(
|
|
6414
|
+
!resolvedOptions.passThrough && !(await supportsDeflate(getConfiguration()))) {
|
|
6267
6415
|
resolvedOptions.level = 0;
|
|
6268
6416
|
}
|
|
6269
6417
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
@@ -6281,7 +6429,7 @@
|
|
|
6281
6429
|
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
6282
6430
|
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
6283
6431
|
} catch (error) {
|
|
6284
|
-
zipWriter.
|
|
6432
|
+
zipWriter.fileEntries.delete(name);
|
|
6285
6433
|
throw error;
|
|
6286
6434
|
}
|
|
6287
6435
|
Object.assign(fileEntry, {
|
|
@@ -6325,9 +6473,9 @@
|
|
|
6325
6473
|
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
6326
6474
|
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE;
|
|
6327
6475
|
}
|
|
6328
|
-
let msdosAttributesRaw =
|
|
6476
|
+
let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
6329
6477
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
6330
|
-
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType;
|
|
6478
|
+
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType || executable;
|
|
6331
6479
|
const hasMsDosProvided = msdosAttributesRaw !== UNDEFINED_VALUE || msdosAttributes !== UNDEFINED_VALUE;
|
|
6332
6480
|
if (hasUnixMetadata) {
|
|
6333
6481
|
msDosCompatible = false;
|
|
@@ -6336,10 +6484,10 @@
|
|
|
6336
6484
|
msDosCompatible = true;
|
|
6337
6485
|
versionMadeBy = (versionMadeBy & MAX_8_BITS);
|
|
6338
6486
|
}
|
|
6339
|
-
if (msdosAttributesRaw !== UNDEFINED_VALUE && (msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
|
|
6487
|
+
if (msdosAttributesRaw !== UNDEFINED_VALUE && (!Number.isInteger(msdosAttributesRaw) || msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
|
|
6340
6488
|
throw new Error(ERR_INVALID_MSDOS_ATTRIBUTES);
|
|
6341
6489
|
}
|
|
6342
|
-
if (msdosAttributes && typeof msdosAttributes !== OBJECT_TYPE) {
|
|
6490
|
+
if (msdosAttributes && (typeof msdosAttributes !== OBJECT_TYPE || Array.isArray(msdosAttributes))) {
|
|
6343
6491
|
throw new Error(ERR_INVALID_MSDOS_DATA);
|
|
6344
6492
|
}
|
|
6345
6493
|
if (versionMadeBy > MAX_16_BITS) {
|
|
@@ -6427,7 +6575,7 @@
|
|
|
6427
6575
|
}
|
|
6428
6576
|
|
|
6429
6577
|
function resolveMetadata(zipWriter, name, options) {
|
|
6430
|
-
const encode =
|
|
6578
|
+
const encode = getFunctionOptionValue(zipWriter, options, OPTION_ENCODE_TEXT) || encodeText;
|
|
6431
6579
|
let rawFilename = encode(name, TEXT_TYPE_FILENAME);
|
|
6432
6580
|
if (rawFilename === UNDEFINED_VALUE) {
|
|
6433
6581
|
rawFilename = encodeText(name);
|
|
@@ -6436,6 +6584,10 @@
|
|
|
6436
6584
|
throw new Error(ERR_INVALID_ENTRY_NAME);
|
|
6437
6585
|
}
|
|
6438
6586
|
const comment = options[PROPERTY_NAME_COMMENT] || "";
|
|
6587
|
+
// deno-lint-ignore valid-typeof
|
|
6588
|
+
if (typeof comment != STRING_TYPE) {
|
|
6589
|
+
throw new Error(ERR_INVALID_ENTRY_COMMENT_TYPE);
|
|
6590
|
+
}
|
|
6439
6591
|
let rawComment = encode(comment, TEXT_TYPE_COMMENT);
|
|
6440
6592
|
if (rawComment === UNDEFINED_VALUE) {
|
|
6441
6593
|
rawComment = encodeText(comment);
|
|
@@ -6447,16 +6599,14 @@
|
|
|
6447
6599
|
if (version > MAX_16_BITS) {
|
|
6448
6600
|
throw new Error(ERR_INVALID_VERSION);
|
|
6449
6601
|
}
|
|
6450
|
-
const lastModDate =
|
|
6451
|
-
const lastAccessDate =
|
|
6452
|
-
const creationDate =
|
|
6602
|
+
const lastModDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE, new Date());
|
|
6603
|
+
const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
|
|
6604
|
+
const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
|
|
6453
6605
|
const internalFileAttributes = getAliasedOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, PROPERTY_NAME_DEPRECATED_INTERNAL_FILE_ATTRIBUTES, 0);
|
|
6454
6606
|
const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
|
|
6455
6607
|
const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6456
6608
|
const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6457
|
-
|
|
6458
|
-
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
6459
|
-
}
|
|
6609
|
+
checkPasswordOption(password, rawPassword);
|
|
6460
6610
|
const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
|
|
6461
6611
|
const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
|
|
6462
6612
|
const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
|
|
@@ -6465,9 +6615,9 @@
|
|
|
6465
6615
|
const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
|
|
6466
6616
|
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
|
|
6467
6617
|
const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
|
|
6468
|
-
const createTempStream =
|
|
6618
|
+
const createTempStream = getFunctionOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
6469
6619
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
6470
|
-
const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
|
|
6620
|
+
const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
|
|
6471
6621
|
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
|
|
6472
6622
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
6473
6623
|
const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
@@ -6487,6 +6637,9 @@
|
|
|
6487
6637
|
level = 0;
|
|
6488
6638
|
}
|
|
6489
6639
|
}
|
|
6640
|
+
if (passThrough) {
|
|
6641
|
+
level = UNDEFINED_VALUE;
|
|
6642
|
+
}
|
|
6490
6643
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
6491
6644
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
6492
6645
|
if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
|
|
@@ -6547,18 +6700,26 @@
|
|
|
6547
6700
|
if (!extraField) {
|
|
6548
6701
|
return EMPTY_UINT8_ARRAY;
|
|
6549
6702
|
}
|
|
6703
|
+
if (!(extraField instanceof Map)) {
|
|
6704
|
+
throw new Error(ERR_INVALID_EXTRAFIELD);
|
|
6705
|
+
}
|
|
6550
6706
|
let extraFieldSize = 0;
|
|
6551
6707
|
let offset = 0;
|
|
6552
|
-
extraField.forEach(data => extraFieldSize += 4 + getLength(data));
|
|
6553
|
-
const rawExtraField = new Uint8Array(extraFieldSize);
|
|
6554
|
-
const rawExtraFieldView = getDataView(rawExtraField);
|
|
6555
6708
|
extraField.forEach((data, type) => {
|
|
6556
|
-
if (type > MAX_16_BITS) {
|
|
6709
|
+
if (!Number.isInteger(type) || type < 0 || type > MAX_16_BITS) {
|
|
6557
6710
|
throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
|
|
6558
6711
|
}
|
|
6712
|
+
if (!(data instanceof Uint8Array)) {
|
|
6713
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA_TYPE);
|
|
6714
|
+
}
|
|
6559
6715
|
if (getLength(data) > MAX_16_BITS) {
|
|
6560
6716
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
6561
6717
|
}
|
|
6718
|
+
extraFieldSize += 4 + getLength(data);
|
|
6719
|
+
});
|
|
6720
|
+
const rawExtraField = new Uint8Array(extraFieldSize);
|
|
6721
|
+
const rawExtraFieldView = getDataView(rawExtraField);
|
|
6722
|
+
extraField.forEach((data, type) => {
|
|
6562
6723
|
setUint16(rawExtraFieldView, offset, type);
|
|
6563
6724
|
setUint16(rawExtraFieldView, offset + 2, getLength(data));
|
|
6564
6725
|
arraySet(rawExtraField, data, offset + 4);
|
|
@@ -6590,6 +6751,9 @@
|
|
|
6590
6751
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
6591
6752
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
6592
6753
|
}
|
|
6754
|
+
if (compressionMethod === UNDEFINED_VALUE) {
|
|
6755
|
+
throw new Error(ERR_UNDEFINED_COMPRESSION_METHOD);
|
|
6756
|
+
}
|
|
6593
6757
|
}
|
|
6594
6758
|
const zip64Enabled = zip64 === true;
|
|
6595
6759
|
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
@@ -6646,7 +6810,7 @@
|
|
|
6646
6810
|
|
|
6647
6811
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
6648
6812
|
const {
|
|
6649
|
-
|
|
6813
|
+
fileEntries,
|
|
6650
6814
|
writer
|
|
6651
6815
|
} = zipWriter;
|
|
6652
6816
|
const {
|
|
@@ -6668,12 +6832,12 @@
|
|
|
6668
6832
|
let writerSizeBeforeEntry;
|
|
6669
6833
|
let flushedBufferedSize = 0;
|
|
6670
6834
|
let fileWriter;
|
|
6671
|
-
|
|
6835
|
+
fileEntries.set(name, fileEntry);
|
|
6672
6836
|
zipWriter.lastFileEntry = fileEntry;
|
|
6673
6837
|
try {
|
|
6674
6838
|
let lockPreviousFileEntry;
|
|
6675
6839
|
if (keepOrder) {
|
|
6676
|
-
lockPreviousFileEntry = previousFileEntry && previousFileEntry.
|
|
6840
|
+
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
|
|
6677
6841
|
requestLockCurrentFileEntry();
|
|
6678
6842
|
}
|
|
6679
6843
|
if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
|
|
@@ -6694,11 +6858,8 @@
|
|
|
6694
6858
|
const diskOffset = getDiskOffset(writer);
|
|
6695
6859
|
if (zipWriter.addSplitZipSignature) {
|
|
6696
6860
|
delete zipWriter.addSplitZipSignature;
|
|
6697
|
-
|
|
6698
|
-
|
|
6699
|
-
setUint32(signatureArrayView, 0, SPLIT_ZIP_FILE_SIGNATURE);
|
|
6700
|
-
await writeData(writer, signatureArray);
|
|
6701
|
-
zipWriter.offset += 4;
|
|
6861
|
+
await writeData(writer, getSplitZipSignatureArray());
|
|
6862
|
+
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6702
6863
|
}
|
|
6703
6864
|
if (usdz && !bufferedWrite) {
|
|
6704
6865
|
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
|
|
@@ -6716,11 +6877,11 @@
|
|
|
6716
6877
|
writerSizeBeforeEntry = writer.size;
|
|
6717
6878
|
await writeData(fileWriter, localHeaderArray);
|
|
6718
6879
|
}
|
|
6719
|
-
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo,
|
|
6880
|
+
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, getConfiguration(), options);
|
|
6720
6881
|
if (!bufferedWrite) {
|
|
6721
6882
|
writingEntryData = false;
|
|
6722
6883
|
}
|
|
6723
|
-
|
|
6884
|
+
fileEntries.set(name, fileEntry);
|
|
6724
6885
|
fileEntry.filename = name;
|
|
6725
6886
|
if (bufferedWrite) {
|
|
6726
6887
|
await Promise.all([fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
|
|
@@ -6761,7 +6922,7 @@
|
|
|
6761
6922
|
zipWriter.offset += flushedBufferedSize;
|
|
6762
6923
|
}
|
|
6763
6924
|
}
|
|
6764
|
-
|
|
6925
|
+
fileEntries.delete(name);
|
|
6765
6926
|
throw error;
|
|
6766
6927
|
} finally {
|
|
6767
6928
|
if (bufferedWrite) {
|
|
@@ -6783,7 +6944,7 @@
|
|
|
6783
6944
|
}
|
|
6784
6945
|
|
|
6785
6946
|
function requestLockCurrentFileEntry() {
|
|
6786
|
-
fileEntry.
|
|
6947
|
+
fileEntry.lockFileEntry = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
|
|
6787
6948
|
}
|
|
6788
6949
|
|
|
6789
6950
|
async function requestLockWriter() {
|
|
@@ -6803,7 +6964,7 @@
|
|
|
6803
6964
|
}
|
|
6804
6965
|
}
|
|
6805
6966
|
|
|
6806
|
-
async function createFileEntry(reader, writer, { diskNumberStart,
|
|
6967
|
+
async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry }, entryInfo, config, options) {
|
|
6807
6968
|
const {
|
|
6808
6969
|
headerInfo,
|
|
6809
6970
|
dataDescriptorInfo,
|
|
@@ -6871,7 +7032,7 @@
|
|
|
6871
7032
|
codecURI
|
|
6872
7033
|
} = options;
|
|
6873
7034
|
const fileEntry = {
|
|
6874
|
-
|
|
7035
|
+
lockFileEntry,
|
|
6875
7036
|
versionMadeBy,
|
|
6876
7037
|
zip64,
|
|
6877
7038
|
directory: Boolean(directory),
|
|
@@ -6913,7 +7074,7 @@
|
|
|
6913
7074
|
}
|
|
6914
7075
|
const { writable } = writer;
|
|
6915
7076
|
if (reader) {
|
|
6916
|
-
const readable = toCompatibleReadable(
|
|
7077
|
+
const readable = toCompatibleReadable(createReadable(reader));
|
|
6917
7078
|
const size = reader.size;
|
|
6918
7079
|
const workerOptions = {
|
|
6919
7080
|
options: {
|
|
@@ -7025,14 +7186,14 @@
|
|
|
7025
7186
|
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
7026
7187
|
const length = 4 + 16;
|
|
7027
7188
|
const extraFieldZip64 = createRecordWriter(length);
|
|
7028
|
-
extraFieldZip64.
|
|
7029
|
-
extraFieldZip64.
|
|
7189
|
+
extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
|
|
7190
|
+
extraFieldZip64.writeUint16(length - 4);
|
|
7030
7191
|
rawLocalExtraFieldZip64 = extraFieldZip64.array;
|
|
7031
7192
|
if (zip64ExtraFieldComplete) {
|
|
7032
|
-
extraFieldZip64.
|
|
7193
|
+
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7033
7194
|
if (uncompressedFile) {
|
|
7034
7195
|
const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
7035
|
-
extraFieldZip64.
|
|
7196
|
+
extraFieldZip64.writeUint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
|
|
7036
7197
|
}
|
|
7037
7198
|
}
|
|
7038
7199
|
} else {
|
|
@@ -7041,8 +7202,8 @@
|
|
|
7041
7202
|
let rawExtraFieldAES;
|
|
7042
7203
|
if (encrypted && !zipCrypto) {
|
|
7043
7204
|
const extraFieldAES = createRecordWriter(getLength(EXTRAFIELD_DATA_AES) + 2);
|
|
7044
|
-
extraFieldAES.
|
|
7045
|
-
extraFieldAES.
|
|
7205
|
+
extraFieldAES.writeUint16(EXTRAFIELD_TYPE_AES);
|
|
7206
|
+
extraFieldAES.writeBytes(EXTRAFIELD_DATA_AES);
|
|
7046
7207
|
rawExtraFieldAES = extraFieldAES.array;
|
|
7047
7208
|
rawExtraFieldAES[8] = encryptionStrength;
|
|
7048
7209
|
} else {
|
|
@@ -7058,15 +7219,15 @@
|
|
|
7058
7219
|
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
7059
7220
|
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
7060
7221
|
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
7061
|
-
extraFieldTimestamp.
|
|
7062
|
-
extraFieldTimestamp.
|
|
7063
|
-
extraFieldTimestamp.
|
|
7064
|
-
extraFieldTimestamp.
|
|
7222
|
+
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7223
|
+
extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
|
|
7224
|
+
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7225
|
+
extraFieldTimestamp.writeUint32(lastModTimeUnix);
|
|
7065
7226
|
if (lastAccessDate) {
|
|
7066
|
-
extraFieldTimestamp.
|
|
7227
|
+
extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(lastAccessDate)));
|
|
7067
7228
|
}
|
|
7068
7229
|
if (creationDate) {
|
|
7069
|
-
extraFieldTimestamp.
|
|
7230
|
+
extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(creationDate)));
|
|
7070
7231
|
}
|
|
7071
7232
|
rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
|
|
7072
7233
|
} else {
|
|
@@ -7079,14 +7240,14 @@
|
|
|
7079
7240
|
try {
|
|
7080
7241
|
const lastModTimeNTFS = getTimeNTFS(lastModDate);
|
|
7081
7242
|
const extraFieldNTFS = createRecordWriter(36);
|
|
7082
|
-
extraFieldNTFS.
|
|
7083
|
-
extraFieldNTFS.
|
|
7243
|
+
extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS);
|
|
7244
|
+
extraFieldNTFS.writeUint16(32);
|
|
7084
7245
|
extraFieldNTFS.skip(4);
|
|
7085
|
-
extraFieldNTFS.
|
|
7086
|
-
extraFieldNTFS.
|
|
7087
|
-
extraFieldNTFS.
|
|
7088
|
-
extraFieldNTFS.
|
|
7089
|
-
extraFieldNTFS.
|
|
7246
|
+
extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS_TAG1);
|
|
7247
|
+
extraFieldNTFS.writeUint16(24);
|
|
7248
|
+
extraFieldNTFS.writeUint64(lastModTimeNTFS);
|
|
7249
|
+
extraFieldNTFS.writeUint64(lastAccessDate ? getTimeNTFS(lastAccessDate) : lastModTimeNTFS);
|
|
7250
|
+
extraFieldNTFS.writeUint64(creationDate ? getTimeNTFS(creationDate) : lastModTimeNTFS);
|
|
7090
7251
|
rawExtraFieldNTFS = extraFieldNTFS.array;
|
|
7091
7252
|
} catch {
|
|
7092
7253
|
rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
|
|
@@ -7105,20 +7266,20 @@
|
|
|
7105
7266
|
const gidBytes = packUnixId(gid);
|
|
7106
7267
|
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
7107
7268
|
const extraFieldUnix = createRecordWriter(4 + payloadLength);
|
|
7108
|
-
extraFieldUnix.
|
|
7109
|
-
extraFieldUnix.
|
|
7110
|
-
extraFieldUnix.
|
|
7111
|
-
extraFieldUnix.
|
|
7112
|
-
extraFieldUnix.
|
|
7113
|
-
extraFieldUnix.
|
|
7114
|
-
extraFieldUnix.
|
|
7269
|
+
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_INFOZIP);
|
|
7270
|
+
extraFieldUnix.writeUint16(payloadLength);
|
|
7271
|
+
extraFieldUnix.writeUint8(1);
|
|
7272
|
+
extraFieldUnix.writeUint8(uidBytes.length);
|
|
7273
|
+
extraFieldUnix.writeBytes(uidBytes);
|
|
7274
|
+
extraFieldUnix.writeUint8(gidBytes.length);
|
|
7275
|
+
extraFieldUnix.writeBytes(gidBytes);
|
|
7115
7276
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
7116
7277
|
} else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
7117
7278
|
const extraFieldUnix = createRecordWriter(8);
|
|
7118
|
-
extraFieldUnix.
|
|
7119
|
-
extraFieldUnix.
|
|
7120
|
-
extraFieldUnix.
|
|
7121
|
-
extraFieldUnix.
|
|
7279
|
+
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
|
|
7280
|
+
extraFieldUnix.writeUint16(4);
|
|
7281
|
+
extraFieldUnix.writeUint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
|
|
7282
|
+
extraFieldUnix.writeUint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
|
|
7122
7283
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
7123
7284
|
} else {
|
|
7124
7285
|
rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
|
|
@@ -7168,18 +7329,18 @@
|
|
|
7168
7329
|
const localHeader = createRecordWriter(HEADER_SIZE + getLength(rawFilename) + extraFieldLength);
|
|
7169
7330
|
const localHeaderArray = localHeader.array;
|
|
7170
7331
|
const localHeaderView = getDataView(localHeaderArray);
|
|
7171
|
-
localHeader.
|
|
7172
|
-
localHeader.
|
|
7173
|
-
localHeader.
|
|
7332
|
+
localHeader.writeUint32(LOCAL_FILE_HEADER_SIGNATURE);
|
|
7333
|
+
localHeader.writeBytes(headerArray);
|
|
7334
|
+
localHeader.writeBytes(rawFilename);
|
|
7174
7335
|
if (writeLocalExtraFieldZip64) {
|
|
7175
|
-
localHeader.
|
|
7176
|
-
}
|
|
7177
|
-
localHeader.
|
|
7178
|
-
localHeader.
|
|
7179
|
-
localHeader.
|
|
7180
|
-
localHeader.
|
|
7181
|
-
localHeader.
|
|
7182
|
-
localHeader.
|
|
7336
|
+
localHeader.writeBytes(rawLocalExtraFieldZip64);
|
|
7337
|
+
}
|
|
7338
|
+
localHeader.writeBytes(rawExtraFieldAES);
|
|
7339
|
+
localHeader.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
7340
|
+
localHeader.writeBytes(rawExtraFieldNTFS);
|
|
7341
|
+
localHeader.writeBytes(rawExtraFieldUnix);
|
|
7342
|
+
localHeader.writeBytes(rawExtraField);
|
|
7343
|
+
localHeader.writeBytes(rawLocalExtraField);
|
|
7183
7344
|
if (dataDescriptor) {
|
|
7184
7345
|
if (!zip64CompressedSize) {
|
|
7185
7346
|
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
@@ -7369,7 +7530,7 @@
|
|
|
7369
7530
|
|
|
7370
7531
|
|
|
7371
7532
|
async function closeFile(zipWriter, comment, options) {
|
|
7372
|
-
const directoryDataLength = createDirectoryRecords(zipWriter.
|
|
7533
|
+
const directoryDataLength = createDirectoryRecords(zipWriter.fileEntries);
|
|
7373
7534
|
const { directoryStart, directoryArray } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
|
|
7374
7535
|
const signatureLength = await writeDigitalSignatureRecord(zipWriter, directoryArray, options);
|
|
7375
7536
|
await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength, signatureLength });
|
|
@@ -7399,19 +7560,19 @@
|
|
|
7399
7560
|
if (zip64Offset || zip64DiskNumberStart || zip64UncompressedSize || zip64CompressedSize) {
|
|
7400
7561
|
const length = 4 + (zip64UncompressedSize ? 8 : 0) + (zip64CompressedSize ? 8 : 0) + (zip64Offset ? 8 : 0) + (zip64DiskNumberStart ? 4 : 0);
|
|
7401
7562
|
const extraFieldZip64 = createRecordWriter(length);
|
|
7402
|
-
extraFieldZip64.
|
|
7403
|
-
extraFieldZip64.
|
|
7563
|
+
extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
|
|
7564
|
+
extraFieldZip64.writeUint16(length - 4);
|
|
7404
7565
|
if (zip64UncompressedSize) {
|
|
7405
|
-
extraFieldZip64.
|
|
7566
|
+
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7406
7567
|
}
|
|
7407
7568
|
if (zip64CompressedSize) {
|
|
7408
|
-
extraFieldZip64.
|
|
7569
|
+
extraFieldZip64.writeUint64(compressedSize);
|
|
7409
7570
|
}
|
|
7410
7571
|
if (zip64Offset) {
|
|
7411
|
-
extraFieldZip64.
|
|
7572
|
+
extraFieldZip64.writeUint64(fileEntry.offset);
|
|
7412
7573
|
}
|
|
7413
7574
|
if (zip64DiskNumberStart) {
|
|
7414
|
-
extraFieldZip64.
|
|
7575
|
+
extraFieldZip64.writeUint32(fileEntry.diskNumberStart);
|
|
7415
7576
|
}
|
|
7416
7577
|
rawExtraFieldZip64 = extraFieldZip64.array;
|
|
7417
7578
|
} else {
|
|
@@ -7424,10 +7585,10 @@
|
|
|
7424
7585
|
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
7425
7586
|
if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
|
|
7426
7587
|
const extraFieldTimestamp = createRecordWriter(9);
|
|
7427
|
-
extraFieldTimestamp.
|
|
7428
|
-
extraFieldTimestamp.
|
|
7429
|
-
extraFieldTimestamp.
|
|
7430
|
-
extraFieldTimestamp.
|
|
7588
|
+
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7589
|
+
extraFieldTimestamp.writeUint16(5);
|
|
7590
|
+
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7591
|
+
extraFieldTimestamp.writeUint32(lastModTimeUnix);
|
|
7431
7592
|
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
7432
7593
|
} else {
|
|
7433
7594
|
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
@@ -7449,14 +7610,14 @@
|
|
|
7449
7610
|
}
|
|
7450
7611
|
|
|
7451
7612
|
async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
7452
|
-
const {
|
|
7613
|
+
const { fileEntries, writer } = zipWriter;
|
|
7453
7614
|
const directoryArray = new Uint8Array(directoryDataLength);
|
|
7454
7615
|
await initStream(writer);
|
|
7455
7616
|
let offset = 0;
|
|
7456
7617
|
let directoryDiskOffset = 0;
|
|
7457
7618
|
let directoryStartDiskNumber = getDiskNumber(writer);
|
|
7458
7619
|
let directoryStartDiskOffset = getDiskOffset(writer);
|
|
7459
|
-
for (const [indexFileEntry, fileEntry] of Array.from(
|
|
7620
|
+
for (const [indexFileEntry, fileEntry] of Array.from(fileEntries.values()).entries()) {
|
|
7460
7621
|
const {
|
|
7461
7622
|
offset: fileEntryOffset,
|
|
7462
7623
|
rawFilename,
|
|
@@ -7501,28 +7662,28 @@
|
|
|
7501
7662
|
setUint16(headerView, HEADER_OFFSET_VERSION, VERSION_ZIP64);
|
|
7502
7663
|
}
|
|
7503
7664
|
const directoryRecord = createRecordWriter(directoryRecordLength);
|
|
7504
|
-
directoryRecord.
|
|
7505
|
-
directoryRecord.
|
|
7506
|
-
directoryRecord.
|
|
7507
|
-
directoryRecord.
|
|
7508
|
-
directoryRecord.
|
|
7509
|
-
directoryRecord.
|
|
7510
|
-
directoryRecord.
|
|
7511
|
-
directoryRecord.
|
|
7512
|
-
directoryRecord.
|
|
7513
|
-
directoryRecord.
|
|
7514
|
-
directoryRecord.
|
|
7515
|
-
directoryRecord.
|
|
7516
|
-
directoryRecord.
|
|
7517
|
-
directoryRecord.
|
|
7518
|
-
directoryRecord.
|
|
7519
|
-
directoryRecord.
|
|
7520
|
-
directoryRecord.
|
|
7665
|
+
directoryRecord.writeUint32(CENTRAL_FILE_HEADER_SIGNATURE);
|
|
7666
|
+
directoryRecord.writeUint16(versionMadeBy);
|
|
7667
|
+
directoryRecord.writeBytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
|
|
7668
|
+
directoryRecord.writeUint16(extraFieldLength);
|
|
7669
|
+
directoryRecord.writeUint16(getLength(rawComment));
|
|
7670
|
+
directoryRecord.writeUint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
|
|
7671
|
+
directoryRecord.writeUint16(internalFileAttributes);
|
|
7672
|
+
directoryRecord.writeUint32(externalFileAttributes);
|
|
7673
|
+
directoryRecord.writeUint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
|
|
7674
|
+
directoryRecord.writeBytes(rawFilename);
|
|
7675
|
+
directoryRecord.writeBytes(rawExtraFieldZip64);
|
|
7676
|
+
directoryRecord.writeBytes(rawExtraFieldAES);
|
|
7677
|
+
directoryRecord.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
7678
|
+
directoryRecord.writeBytes(rawExtraFieldNTFS);
|
|
7679
|
+
directoryRecord.writeBytes(rawExtraFieldUnix);
|
|
7680
|
+
directoryRecord.writeBytes(rawExtraField);
|
|
7681
|
+
directoryRecord.writeBytes(rawComment);
|
|
7521
7682
|
arraySet(directoryArray, directoryRecord.array, offset);
|
|
7522
7683
|
offset += directoryRecordLength;
|
|
7523
7684
|
if (options.onprogress) {
|
|
7524
7685
|
try {
|
|
7525
|
-
await options.onprogress(indexFileEntry + 1,
|
|
7686
|
+
await options.onprogress(indexFileEntry + 1, fileEntries.size, new Entry(fileEntry));
|
|
7526
7687
|
} catch {
|
|
7527
7688
|
// ignored
|
|
7528
7689
|
}
|
|
@@ -7536,7 +7697,7 @@
|
|
|
7536
7697
|
}
|
|
7537
7698
|
|
|
7538
7699
|
async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
|
|
7539
|
-
const signCentralDirectory =
|
|
7700
|
+
const signCentralDirectory = getFunctionOptionValue(zipWriter, options, OPTION_SIGN_CENTRAL_DIRECTORY);
|
|
7540
7701
|
if (signCentralDirectory) {
|
|
7541
7702
|
const signatureData = await signCentralDirectory(directoryArray);
|
|
7542
7703
|
const signatureDataLength = getLength(signatureData);
|
|
@@ -7544,9 +7705,9 @@
|
|
|
7544
7705
|
throw new Error(ERR_INVALID_SIGNATURE_DATA);
|
|
7545
7706
|
}
|
|
7546
7707
|
const signatureRecord = createRecordWriter(6 + signatureDataLength);
|
|
7547
|
-
signatureRecord.
|
|
7548
|
-
signatureRecord.
|
|
7549
|
-
signatureRecord.
|
|
7708
|
+
signatureRecord.writeUint32(DIGITAL_SIGNATURE_RECORD_SIGNATURE);
|
|
7709
|
+
signatureRecord.writeUint16(signatureDataLength);
|
|
7710
|
+
signatureRecord.writeBytes(signatureData);
|
|
7550
7711
|
await writeData(zipWriter.writer, signatureRecord.array);
|
|
7551
7712
|
return 6 + signatureDataLength;
|
|
7552
7713
|
}
|
|
@@ -7557,7 +7718,7 @@
|
|
|
7557
7718
|
const { writer } = zipWriter;
|
|
7558
7719
|
const { directoryStart, signatureLength } = cdInfo;
|
|
7559
7720
|
let { directoryDataLength } = cdInfo;
|
|
7560
|
-
let
|
|
7721
|
+
let fileEntriesLength = zipWriter.fileEntries.size;
|
|
7561
7722
|
let diskNumber = directoryStart.diskNumber;
|
|
7562
7723
|
let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
|
|
7563
7724
|
let lastDiskNumber = getDiskNumber(writer);
|
|
@@ -7565,7 +7726,7 @@
|
|
|
7565
7726
|
lastDiskNumber++;
|
|
7566
7727
|
}
|
|
7567
7728
|
let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
7568
|
-
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS ||
|
|
7729
|
+
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || fileEntriesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
|
|
7569
7730
|
if (zip64 === false) {
|
|
7570
7731
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
7571
7732
|
} else {
|
|
@@ -7582,37 +7743,37 @@
|
|
|
7582
7743
|
}
|
|
7583
7744
|
lastDiskNumber = getDiskNumber(writer);
|
|
7584
7745
|
if (zip64) {
|
|
7585
|
-
endOfdirectoryRecord.
|
|
7586
|
-
endOfdirectoryRecord.
|
|
7587
|
-
endOfdirectoryRecord.
|
|
7588
|
-
endOfdirectoryRecord.
|
|
7589
|
-
endOfdirectoryRecord.
|
|
7590
|
-
endOfdirectoryRecord.
|
|
7591
|
-
endOfdirectoryRecord.
|
|
7592
|
-
endOfdirectoryRecord.
|
|
7593
|
-
endOfdirectoryRecord.
|
|
7594
|
-
endOfdirectoryRecord.
|
|
7595
|
-
endOfdirectoryRecord.
|
|
7596
|
-
endOfdirectoryRecord.
|
|
7597
|
-
endOfdirectoryRecord.
|
|
7598
|
-
endOfdirectoryRecord.
|
|
7746
|
+
endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
|
|
7747
|
+
endOfdirectoryRecord.writeUint64(44);
|
|
7748
|
+
endOfdirectoryRecord.writeUint16(45);
|
|
7749
|
+
endOfdirectoryRecord.writeUint16(45);
|
|
7750
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber);
|
|
7751
|
+
endOfdirectoryRecord.writeUint32(diskNumber);
|
|
7752
|
+
endOfdirectoryRecord.writeUint64(fileEntriesLength);
|
|
7753
|
+
endOfdirectoryRecord.writeUint64(fileEntriesLength);
|
|
7754
|
+
endOfdirectoryRecord.writeUint64(directoryDataLength);
|
|
7755
|
+
endOfdirectoryRecord.writeUint64(directoryOffset);
|
|
7756
|
+
endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
|
|
7757
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber);
|
|
7758
|
+
endOfdirectoryRecord.writeUint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength) + BigInt(signatureLength));
|
|
7759
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber + 1);
|
|
7599
7760
|
const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
|
|
7600
7761
|
if (supportZip64SplitFile) {
|
|
7601
7762
|
lastDiskNumber = MAX_16_BITS;
|
|
7602
7763
|
diskNumber = MAX_16_BITS;
|
|
7603
7764
|
}
|
|
7604
|
-
|
|
7765
|
+
fileEntriesLength = MAX_16_BITS;
|
|
7605
7766
|
directoryOffset = MAX_32_BITS;
|
|
7606
7767
|
directoryDataLength = MAX_32_BITS;
|
|
7607
7768
|
}
|
|
7608
|
-
endOfdirectoryRecord.
|
|
7609
|
-
endOfdirectoryRecord.
|
|
7610
|
-
endOfdirectoryRecord.
|
|
7611
|
-
endOfdirectoryRecord.
|
|
7612
|
-
endOfdirectoryRecord.
|
|
7613
|
-
endOfdirectoryRecord.
|
|
7614
|
-
endOfdirectoryRecord.
|
|
7615
|
-
endOfdirectoryRecord.
|
|
7769
|
+
endOfdirectoryRecord.writeUint32(END_OF_CENTRAL_DIR_SIGNATURE);
|
|
7770
|
+
endOfdirectoryRecord.writeUint16(lastDiskNumber);
|
|
7771
|
+
endOfdirectoryRecord.writeUint16(diskNumber);
|
|
7772
|
+
endOfdirectoryRecord.writeUint16(fileEntriesLength);
|
|
7773
|
+
endOfdirectoryRecord.writeUint16(fileEntriesLength);
|
|
7774
|
+
endOfdirectoryRecord.writeUint32(directoryDataLength);
|
|
7775
|
+
endOfdirectoryRecord.writeUint32(directoryOffset);
|
|
7776
|
+
endOfdirectoryRecord.writeUint16(commentLength);
|
|
7616
7777
|
await writeData(writer, endOfdirectoryRecord.array);
|
|
7617
7778
|
if (commentLength) {
|
|
7618
7779
|
await writeData(writer, comment);
|
|
@@ -7625,11 +7786,11 @@
|
|
|
7625
7786
|
let offset = 0;
|
|
7626
7787
|
return {
|
|
7627
7788
|
array,
|
|
7628
|
-
|
|
7629
|
-
|
|
7630
|
-
|
|
7631
|
-
|
|
7632
|
-
|
|
7789
|
+
writeUint8: value => { setUint8(view, offset, value); offset += 1; },
|
|
7790
|
+
writeUint16: value => { setUint16(view, offset, value); offset += 2; },
|
|
7791
|
+
writeUint32: value => { setUint32(view, offset, value); offset += 4; },
|
|
7792
|
+
writeUint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
|
|
7793
|
+
writeBytes: value => { arraySet(array, value, offset); offset += getLength(value); },
|
|
7633
7794
|
skip: count => offset += count
|
|
7634
7795
|
};
|
|
7635
7796
|
}
|
|
@@ -7653,6 +7814,71 @@
|
|
|
7653
7814
|
return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
|
|
7654
7815
|
}
|
|
7655
7816
|
|
|
7817
|
+
async function startsWithSplitZipSignature(reader) {
|
|
7818
|
+
const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
7819
|
+
return getUint32(getDataView(signatureArray), 0) == SPLIT_ZIP_FILE_SIGNATURE;
|
|
7820
|
+
}
|
|
7821
|
+
|
|
7822
|
+
async function copyZipData(zipWriter, reader, entries, directoryOffset, splitZipSignatureLength) {
|
|
7823
|
+
const { writer } = zipWriter;
|
|
7824
|
+
const entryPositions = new Map();
|
|
7825
|
+
if (writer.closeDisk) {
|
|
7826
|
+
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
7827
|
+
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
7828
|
+
let copiedLength = 0;
|
|
7829
|
+
for (const entry of sortedEntries) {
|
|
7830
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
7831
|
+
await copyData(zipWriter, reader, copiedLength, sourceOffset - copiedLength);
|
|
7832
|
+
if (exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
7833
|
+
await writer.closeDisk();
|
|
7834
|
+
}
|
|
7835
|
+
entryPositions.set(entry, {
|
|
7836
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
7837
|
+
diskNumberStart: getDiskNumber(writer)
|
|
7838
|
+
});
|
|
7839
|
+
copiedLength = sourceOffset;
|
|
7840
|
+
}
|
|
7841
|
+
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
7842
|
+
} else {
|
|
7843
|
+
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
7844
|
+
entries.forEach(entry => entryPositions.set(entry, {
|
|
7845
|
+
offset: splitZipSignatureLength + getSourceOffset(reader, entry),
|
|
7846
|
+
diskNumberStart: 0
|
|
7847
|
+
}));
|
|
7848
|
+
}
|
|
7849
|
+
return entryPositions;
|
|
7850
|
+
}
|
|
7851
|
+
|
|
7852
|
+
async function copyData(zipWriter, reader, offset, size) {
|
|
7853
|
+
if (size > 0) {
|
|
7854
|
+
const { writer } = zipWriter;
|
|
7855
|
+
await createReadable(reader, { offset, size }).pipeTo(writer.writable, { preventClose: true, preventAbort: true });
|
|
7856
|
+
writer.size += size;
|
|
7857
|
+
zipWriter.offset += size;
|
|
7858
|
+
}
|
|
7859
|
+
}
|
|
7860
|
+
|
|
7861
|
+
async function getLocalHeaderLength(reader, offset) {
|
|
7862
|
+
const headerArray = await readUint8Array(reader, offset, HEADER_SIZE);
|
|
7863
|
+
if (getLength(headerArray) < HEADER_SIZE) {
|
|
7864
|
+
return HEADER_SIZE;
|
|
7865
|
+
}
|
|
7866
|
+
const headerView = getDataView(headerArray);
|
|
7867
|
+
return HEADER_SIZE +
|
|
7868
|
+
getUint16(headerView, HEADER_OFFSET_FILENAME_LENGTH + LOCAL_HEADER_COMMON_OFFSET) +
|
|
7869
|
+
getUint16(headerView, HEADER_OFFSET_EXTRAFIELD_LENGTH + LOCAL_HEADER_COMMON_OFFSET);
|
|
7870
|
+
}
|
|
7871
|
+
|
|
7872
|
+
function getSourceOffset(reader, { offset, diskNumberStart }) {
|
|
7873
|
+
return offset + (reader.getDiskOffset ? reader.getDiskOffset(diskNumberStart) : 0);
|
|
7874
|
+
}
|
|
7875
|
+
|
|
7876
|
+
function getSplitZipSignatureArray() {
|
|
7877
|
+
const signatureArray = new Uint8Array(SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
7878
|
+
setUint32(getDataView(signatureArray), 0, SPLIT_ZIP_FILE_SIGNATURE);
|
|
7879
|
+
return signatureArray;
|
|
7880
|
+
}
|
|
7881
|
+
|
|
7656
7882
|
async function writeData(writer, array) {
|
|
7657
7883
|
const { writable } = writer;
|
|
7658
7884
|
const streamWriter = writable.getWriter();
|
|
@@ -7704,6 +7930,21 @@
|
|
|
7704
7930
|
return result === UNDEFINED_VALUE ? defaultValue : result;
|
|
7705
7931
|
}
|
|
7706
7932
|
|
|
7933
|
+
function getDateOptionValue(zipWriter, options, name, defaultValue) {
|
|
7934
|
+
const date = getOptionValue(zipWriter, options, name, defaultValue);
|
|
7935
|
+
if (date === null) {
|
|
7936
|
+
return defaultValue;
|
|
7937
|
+
}
|
|
7938
|
+
if (date !== UNDEFINED_VALUE && (typeof date.getTime != FUNCTION_TYPE || Number.isNaN(date.getTime()))) {
|
|
7939
|
+
throw new Error(ERR_INVALID_DATE);
|
|
7940
|
+
}
|
|
7941
|
+
return date;
|
|
7942
|
+
}
|
|
7943
|
+
|
|
7944
|
+
function getFunctionOptionValue(zipWriter, options, name) {
|
|
7945
|
+
return checkFunctionOption(getOptionValue(zipWriter, options, name));
|
|
7946
|
+
}
|
|
7947
|
+
|
|
7707
7948
|
function getAliasedOptionValue(zipWriter, options, name, deprecatedName, defaultValue) {
|
|
7708
7949
|
const value = getAliasedValue(options, name, deprecatedName);
|
|
7709
7950
|
const result = value === UNDEFINED_VALUE ? getAliasedValue(zipWriter.options, name, deprecatedName) : value;
|
|
@@ -7718,9 +7959,6 @@
|
|
|
7718
7959
|
return toNumber(getOptionValue(zipWriter, options, name, defaultValue));
|
|
7719
7960
|
}
|
|
7720
7961
|
|
|
7721
|
-
function toNumber(value) {
|
|
7722
|
-
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
7723
|
-
}
|
|
7724
7962
|
|
|
7725
7963
|
function getMaximumCompressedSize(uncompressedSize) {
|
|
7726
7964
|
return uncompressedSize + (5 * (Math.floor(uncompressedSize / 16383) + 1));
|
|
@@ -7732,6 +7970,14 @@
|
|
|
7732
7970
|
: compressionMethod !== COMPRESSION_METHOD_STORE;
|
|
7733
7971
|
}
|
|
7734
7972
|
|
|
7973
|
+
function getUint16(view, offset) {
|
|
7974
|
+
return view.getUint16(offset, true);
|
|
7975
|
+
}
|
|
7976
|
+
|
|
7977
|
+
function getUint32(view, offset) {
|
|
7978
|
+
return view.getUint32(offset, true);
|
|
7979
|
+
}
|
|
7980
|
+
|
|
7735
7981
|
function setUint8(view, offset, value) {
|
|
7736
7982
|
view.setUint8(offset, value);
|
|
7737
7983
|
}
|
|
@@ -7775,9 +8021,9 @@
|
|
|
7775
8021
|
const headerRecord = createRecordWriter(HEADER_SIZE - 4);
|
|
7776
8022
|
const headerArray = headerRecord.array;
|
|
7777
8023
|
const headerView = getDataView(headerArray);
|
|
7778
|
-
headerRecord.
|
|
7779
|
-
headerRecord.
|
|
7780
|
-
headerRecord.
|
|
8024
|
+
headerRecord.writeUint16(version);
|
|
8025
|
+
headerRecord.writeUint16(bitFlag);
|
|
8026
|
+
headerRecord.writeUint16(compressionMethod);
|
|
7781
8027
|
if (rawLastModDate === UNDEFINED_VALUE) {
|
|
7782
8028
|
const dateArray = new Uint32Array(1);
|
|
7783
8029
|
const dateView = getDataView(dateArray);
|
|
@@ -7785,20 +8031,20 @@
|
|
|
7785
8031
|
setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
|
|
7786
8032
|
rawLastModDate = dateArray[0];
|
|
7787
8033
|
}
|
|
7788
|
-
headerRecord.
|
|
8034
|
+
headerRecord.writeUint32(rawLastModDate);
|
|
7789
8035
|
headerRecord.skip(4);
|
|
7790
8036
|
if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
|
|
7791
|
-
headerRecord.
|
|
8037
|
+
headerRecord.writeUint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
|
|
7792
8038
|
} else {
|
|
7793
8039
|
headerRecord.skip(4);
|
|
7794
8040
|
}
|
|
7795
8041
|
if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
|
|
7796
|
-
headerRecord.
|
|
8042
|
+
headerRecord.writeUint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
|
|
7797
8043
|
} else {
|
|
7798
8044
|
headerRecord.skip(4);
|
|
7799
8045
|
}
|
|
7800
|
-
headerRecord.
|
|
7801
|
-
headerRecord.
|
|
8046
|
+
headerRecord.writeUint16(getLength(rawFilename));
|
|
8047
|
+
headerRecord.writeUint16(extraFieldLength);
|
|
7802
8048
|
return {
|
|
7803
8049
|
headerArray,
|
|
7804
8050
|
headerView,
|
|
@@ -8390,6 +8636,7 @@
|
|
|
8390
8636
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
8391
8637
|
exports.ERR_ENCRYPTED = ERR_ENCRYPTED;
|
|
8392
8638
|
exports.ERR_ENCRYPTED_CENTRAL_DIRECTORY = ERR_ENCRYPTED_CENTRAL_DIRECTORY;
|
|
8639
|
+
exports.ERR_ENTRY_DATA_OUT_OF_BOUNDS = ERR_ENTRY_DATA_OUT_OF_BOUNDS;
|
|
8393
8640
|
exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
|
|
8394
8641
|
exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
|
|
8395
8642
|
exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
|
|
@@ -8402,19 +8649,26 @@
|
|
|
8402
8649
|
exports.ERR_INVALID_COMMENT_TYPE = ERR_INVALID_COMMENT_TYPE;
|
|
8403
8650
|
exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
|
|
8404
8651
|
exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
|
|
8652
|
+
exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
|
|
8405
8653
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
8406
8654
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
8655
|
+
exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
|
|
8407
8656
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
8657
|
+
exports.ERR_INVALID_EXTRAFIELD = ERR_INVALID_EXTRAFIELD;
|
|
8408
8658
|
exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
|
|
8659
|
+
exports.ERR_INVALID_EXTRAFIELD_DATA_TYPE = ERR_INVALID_EXTRAFIELD_DATA_TYPE;
|
|
8409
8660
|
exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
|
|
8410
8661
|
exports.ERR_INVALID_FILENAME_VALIDATION = ERR_INVALID_FILENAME_VALIDATION;
|
|
8662
|
+
exports.ERR_INVALID_FUNCTION_OPTION = ERR_INVALID_FUNCTION_OPTION;
|
|
8411
8663
|
exports.ERR_INVALID_GID = ERR_INVALID_GID;
|
|
8412
8664
|
exports.ERR_INVALID_LEVEL = ERR_INVALID_LEVEL;
|
|
8413
8665
|
exports.ERR_INVALID_MAX_APPENDED_DATA_SIZE = ERR_INVALID_MAX_APPENDED_DATA_SIZE;
|
|
8666
|
+
exports.ERR_INVALID_MAX_WORKERS = ERR_INVALID_MAX_WORKERS;
|
|
8414
8667
|
exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
|
|
8415
8668
|
exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
|
|
8416
8669
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
8417
8670
|
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
8671
|
+
exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
|
|
8418
8672
|
exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
|
|
8419
8673
|
exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
|
|
8420
8674
|
exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
|
|
@@ -8429,6 +8683,7 @@
|
|
|
8429
8683
|
exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
8430
8684
|
exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
8431
8685
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
8686
|
+
exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
|
|
8432
8687
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
8433
8688
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
8434
8689
|
exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
|