@zip.js/zip.js 2.8.53 → 2.8.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/deno.json +2 -1
- package/dist/zip-core-external.js +737 -491
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +745 -490
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +776 -525
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +738 -510
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +776 -525
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +790 -525
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +791 -526
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +746 -491
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +746 -491
- package/dist/zip-native.min.js +1 -1
- package/dist/zip-web-worker-native.js +1 -1
- package/dist/zip-web-worker.js +1 -1
- package/dist/zip.js +747 -492
- package/dist/zip.min.js +1 -1
- package/eslint.config.mjs +1 -0
- package/index-native.cjs +790 -525
- package/index-native.min.js +1 -1
- package/index.cjs +791 -526
- package/index.d.cts +422 -49
- package/index.d.ts +422 -49
- package/index.min.js +1 -1
- package/lib/core/configuration.js +62 -21
- package/lib/core/constants.js +13 -1
- package/lib/core/io.js +33 -27
- package/lib/core/options.js +44 -2
- package/lib/core/streams/aes-crypto-stream.js +12 -12
- package/lib/core/util/decode-text.js +11 -2
- package/lib/core/web-worker-base.js +3 -2
- package/lib/core/web-worker-inline-native.js +1 -1
- package/lib/core/web-worker-inline-wasm.js +1 -1
- package/lib/core/zip-fs.js +39 -32
- package/lib/core/zip-reader.js +100 -38
- package/lib/core/zip-writer.js +301 -177
- package/lib/core/zlib-streams-inline.js +1 -1
- package/lib/zip-core-base.js +6 -1
- package/lib/zip-core-reader.js +1 -0
- package/lib/zip-core-writer.js +5 -0
- package/package.json +8 -2
package/index-native.cjs
CHANGED
|
@@ -39,6 +39,7 @@ const COMPRESSION_METHOD_AES = 0x63;
|
|
|
39
39
|
|
|
40
40
|
const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
|
|
41
41
|
const SPLIT_ZIP_FILE_SIGNATURE = 0x08074b50;
|
|
42
|
+
const TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE = 0x30304b50;
|
|
42
43
|
const DATA_DESCRIPTOR_RECORD_SIGNATURE = SPLIT_ZIP_FILE_SIGNATURE;
|
|
43
44
|
const ARCHIVE_EXTRA_DATA_SIGNATURE = 0x08064b50;
|
|
44
45
|
const DIGITAL_SIGNATURE_RECORD_SIGNATURE = 0x05054b50;
|
|
@@ -55,6 +56,7 @@ const ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH = END_OF_CENTRAL_DIR_LENGTH + ZIP64_
|
|
|
55
56
|
const DATA_DESCRIPTOR_RECORD_LENGTH = 12;
|
|
56
57
|
const DATA_DESCRIPTOR_RECORD_ZIP_64_LENGTH = 20;
|
|
57
58
|
const DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH = 4;
|
|
59
|
+
const SPLIT_ZIP_FILE_SIGNATURE_LENGTH = 4;
|
|
58
60
|
|
|
59
61
|
const EXTRAFIELD_TYPE_ZIP64 = 0x0001;
|
|
60
62
|
const EXTRAFIELD_TYPE_AES = 0x9901;
|
|
@@ -77,6 +79,7 @@ const BITFLAG_LEVEL_SUPER_FAST_MASK = 0b110;
|
|
|
77
79
|
const BITFLAG_DATA_DESCRIPTOR = 0b1000;
|
|
78
80
|
const BITFLAG_STRONG_ENCRYPTION = 0b1000000;
|
|
79
81
|
const BITFLAG_LANG_ENCODING_FLAG = 0b100000000000;
|
|
82
|
+
const BITFLAG_MASKED_LOCAL_HEADERS = 0b10000000000000;
|
|
80
83
|
const FILE_ATTR_MSDOS_DIR_MASK = 0b10000;
|
|
81
84
|
const FILE_ATTR_MSDOS_READONLY_MASK = 0x01;
|
|
82
85
|
const FILE_ATTR_MSDOS_HIDDEN_MASK = 0x02;
|
|
@@ -106,6 +109,8 @@ const HEADER_OFFSET_VERSION = 0;
|
|
|
106
109
|
const HEADER_OFFSET_SIGNATURE = 10;
|
|
107
110
|
const HEADER_OFFSET_COMPRESSED_SIZE = 14;
|
|
108
111
|
const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
|
|
112
|
+
const HEADER_OFFSET_FILENAME_LENGTH = 22;
|
|
113
|
+
const HEADER_OFFSET_EXTRAFIELD_LENGTH = 24;
|
|
109
114
|
const LOCAL_HEADER_COMMON_OFFSET = 4;
|
|
110
115
|
|
|
111
116
|
const MAX_DATE = new Date(2107, 11, 31, 23, 59, 58);
|
|
@@ -118,9 +123,116 @@ const FUNCTION_TYPE = "function";
|
|
|
118
123
|
const OBJECT_TYPE = "object";
|
|
119
124
|
const STRING_TYPE = "string";
|
|
120
125
|
const NUMBER_TYPE = "number";
|
|
126
|
+
const BOOLEAN_TYPE = "boolean";
|
|
121
127
|
|
|
122
128
|
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
123
129
|
|
|
130
|
+
/*
|
|
131
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
132
|
+
|
|
133
|
+
Redistribution and use in source and binary forms, with or without
|
|
134
|
+
modification, are permitted provided that the following conditions are met:
|
|
135
|
+
|
|
136
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
137
|
+
this list of conditions and the following disclaimer.
|
|
138
|
+
|
|
139
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
140
|
+
notice, this list of conditions and the following disclaimer in
|
|
141
|
+
the documentation and/or other materials provided with the distribution.
|
|
142
|
+
|
|
143
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
144
|
+
derived from this software without specific prior written permission.
|
|
145
|
+
|
|
146
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
147
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
148
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
149
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
150
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
151
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
152
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
153
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
154
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
155
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
156
|
+
*/
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
const OPTION_FILENAME_ENCODING = "filenameEncoding";
|
|
160
|
+
const OPTION_COMMENT_ENCODING = "commentEncoding";
|
|
161
|
+
const OPTION_DECODE_TEXT = "decodeText";
|
|
162
|
+
const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
|
|
163
|
+
const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
|
|
164
|
+
const OPTION_PASSWORD = "password";
|
|
165
|
+
const OPTION_RAW_PASSWORD = "rawPassword";
|
|
166
|
+
const OPTION_PASS_THROUGH = "passThrough";
|
|
167
|
+
const OPTION_SIGNAL = "signal";
|
|
168
|
+
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
169
|
+
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
170
|
+
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
171
|
+
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
172
|
+
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
173
|
+
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
174
|
+
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
175
|
+
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
176
|
+
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
177
|
+
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
178
|
+
const OPTION_TRANSFER_STREAMS = "transferStreams";
|
|
179
|
+
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
180
|
+
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
181
|
+
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
182
|
+
const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
|
|
183
|
+
const OPTION_KEEP_ORDER = "keepOrder";
|
|
184
|
+
const OPTION_LEVEL = "level";
|
|
185
|
+
const OPTION_BUFFERED_WRITE = "bufferedWrite";
|
|
186
|
+
const OPTION_CREATE_TEMP_STREAM = "createTempStream";
|
|
187
|
+
const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
|
|
188
|
+
const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
|
|
189
|
+
const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
|
|
190
|
+
const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
|
|
191
|
+
const OPTION_ENCODE_TEXT = "encodeText";
|
|
192
|
+
const OPTION_OFFSET = "offset";
|
|
193
|
+
const OPTION_USDZ = "usdz";
|
|
194
|
+
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
195
|
+
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
196
|
+
const OPTION_STRICTNESS = "strictness";
|
|
197
|
+
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
198
|
+
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
199
|
+
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
200
|
+
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
201
|
+
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
202
|
+
const TEXT_TYPE_FILENAME = "filename";
|
|
203
|
+
const TEXT_TYPE_COMMENT = "comment";
|
|
204
|
+
const STRICTNESS_STRICT = "strict";
|
|
205
|
+
const STRICTNESS_BALANCED = "balanced";
|
|
206
|
+
const STRICTNESS_TOLERANT = "tolerant";
|
|
207
|
+
|
|
208
|
+
const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
|
|
209
|
+
const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
|
|
210
|
+
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
211
|
+
|
|
212
|
+
function checkFunctionOption(value) {
|
|
213
|
+
if (value && typeof value != FUNCTION_TYPE) {
|
|
214
|
+
throw new Error(ERR_INVALID_FUNCTION_OPTION);
|
|
215
|
+
}
|
|
216
|
+
return value;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function checkSignalOption(signal) {
|
|
220
|
+
if (signal && (typeof signal.addEventListener != FUNCTION_TYPE || typeof signal.aborted != BOOLEAN_TYPE)) {
|
|
221
|
+
throw new Error(ERR_INVALID_SIGNAL);
|
|
222
|
+
}
|
|
223
|
+
return signal || UNDEFINED_VALUE;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function checkPasswordOption(password, rawPassword) {
|
|
227
|
+
if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
|
|
228
|
+
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function toNumber(value) {
|
|
233
|
+
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
234
|
+
}
|
|
235
|
+
|
|
124
236
|
/*
|
|
125
237
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
126
238
|
|
|
@@ -150,7 +262,10 @@ const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
|
150
262
|
*/
|
|
151
263
|
|
|
152
264
|
|
|
265
|
+
const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
|
|
153
266
|
const MINIMUM_CHUNK_SIZE = 64;
|
|
267
|
+
const MINIMUM_PROPERTY_VALUE = 1;
|
|
268
|
+
const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
|
|
154
269
|
let maxWorkers = 2;
|
|
155
270
|
try {
|
|
156
271
|
if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
|
|
@@ -162,7 +277,7 @@ try {
|
|
|
162
277
|
const DEFAULT_CONFIGURATION = {
|
|
163
278
|
workerURI: "./core/web-worker-wasm.js",
|
|
164
279
|
wasmURI: "./core/streams/zlib-wasm/zlib-streams.wasm",
|
|
165
|
-
chunkSize:
|
|
280
|
+
chunkSize: DEFAULT_CHUNK_SIZE$1,
|
|
166
281
|
maxWorkers,
|
|
167
282
|
terminateWorkerTimeout: 5000,
|
|
168
283
|
workerStarvationTimeout: 5000,
|
|
@@ -174,24 +289,38 @@ const DEFAULT_CONFIGURATION = {
|
|
|
174
289
|
DecompressionStream: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream
|
|
175
290
|
};
|
|
176
291
|
|
|
177
|
-
const
|
|
292
|
+
const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
|
|
293
|
+
|
|
294
|
+
const STRING_PROPERTY_NAMES = [
|
|
178
295
|
"baseURI",
|
|
179
296
|
"wasmURI",
|
|
180
|
-
"workerURI"
|
|
181
|
-
|
|
297
|
+
"workerURI"
|
|
298
|
+
];
|
|
299
|
+
const BOOLEAN_PROPERTY_NAMES = [
|
|
300
|
+
"useCompressionStream",
|
|
301
|
+
"useWebWorkers",
|
|
302
|
+
"transferStreams"
|
|
303
|
+
];
|
|
304
|
+
const NUMBER_PROPERTY_NAMES = [
|
|
182
305
|
"chunkSize",
|
|
183
|
-
|
|
306
|
+
PROPERTY_NAME_MAX_WORKERS,
|
|
184
307
|
"terminateWorkerTimeout",
|
|
185
308
|
"workerStarvationTimeout",
|
|
186
|
-
"workerStartupTimeout"
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
"
|
|
309
|
+
"workerStartupTimeout"
|
|
310
|
+
];
|
|
311
|
+
const FUNCTION_PROPERTY_NAMES = [
|
|
312
|
+
"createWorker",
|
|
190
313
|
"CompressionStream",
|
|
191
314
|
"DecompressionStream",
|
|
192
315
|
"CompressionStreamFallback",
|
|
193
316
|
"DecompressionStreamFallback"
|
|
194
317
|
];
|
|
318
|
+
const CONFIGURABLE_PROPERTY_NAMES = [
|
|
319
|
+
...STRING_PROPERTY_NAMES,
|
|
320
|
+
...BOOLEAN_PROPERTY_NAMES,
|
|
321
|
+
...NUMBER_PROPERTY_NAMES,
|
|
322
|
+
...FUNCTION_PROPERTY_NAMES
|
|
323
|
+
];
|
|
195
324
|
|
|
196
325
|
const config = { ...DEFAULT_CONFIGURATION };
|
|
197
326
|
|
|
@@ -200,20 +329,43 @@ function getConfiguration() {
|
|
|
200
329
|
}
|
|
201
330
|
|
|
202
331
|
function getChunkSize(config) {
|
|
203
|
-
return
|
|
332
|
+
return normalizeChunkSize(config.chunkSize);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function normalizeChunkSize(chunkSize) {
|
|
336
|
+
chunkSize = toNumber(chunkSize);
|
|
337
|
+
return Number.isInteger(chunkSize) && chunkSize >= MINIMUM_PROPERTY_VALUE ? Math.max(chunkSize, MINIMUM_CHUNK_SIZE) : DEFAULT_CHUNK_SIZE$1;
|
|
204
338
|
}
|
|
205
339
|
|
|
206
340
|
function configure(configuration) {
|
|
207
|
-
|
|
341
|
+
Object.assign(config, checkConfiguration(normalizeConfiguration(configuration)));
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
function checkConfiguration(configuration) {
|
|
345
|
+
const checkedConfiguration = {};
|
|
208
346
|
for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
|
|
209
347
|
const propertyValue = configuration[propertyName];
|
|
210
348
|
if (propertyValue !== UNDEFINED_VALUE) {
|
|
211
|
-
|
|
349
|
+
checkedConfiguration[propertyName] = checkPropertyValue(propertyName, propertyValue);
|
|
212
350
|
}
|
|
213
351
|
}
|
|
352
|
+
return checkedConfiguration;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
function checkPropertyValue(propertyName, propertyValue) {
|
|
356
|
+
if (NUMBER_PROPERTY_NAMES.includes(propertyName)) {
|
|
357
|
+
propertyValue = toNumber(propertyValue);
|
|
358
|
+
if (propertyName == PROPERTY_NAME_MAX_WORKERS && (!Number.isInteger(propertyValue) || propertyValue < MINIMUM_PROPERTY_VALUE)) {
|
|
359
|
+
throw new Error(ERR_INVALID_MAX_WORKERS);
|
|
360
|
+
}
|
|
361
|
+
} else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
|
|
362
|
+
checkFunctionOption(propertyValue);
|
|
363
|
+
}
|
|
364
|
+
return propertyValue;
|
|
214
365
|
}
|
|
215
366
|
|
|
216
367
|
function normalizeConfiguration(configuration) {
|
|
368
|
+
configuration = configuration || {};
|
|
217
369
|
const { CompressionStreamZlib, DecompressionStreamZlib } = configuration;
|
|
218
370
|
if (CompressionStreamZlib === UNDEFINED_VALUE && DecompressionStreamZlib === UNDEFINED_VALUE) {
|
|
219
371
|
return configuration;
|
|
@@ -229,14 +381,9 @@ function normalizeConfiguration(configuration) {
|
|
|
229
381
|
}
|
|
230
382
|
|
|
231
383
|
function setDefaultConfiguration(configuration) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
if (propertyValue !== UNDEFINED_VALUE) {
|
|
236
|
-
DEFAULT_CONFIGURATION[propertyName] = propertyValue;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
configure(configuration);
|
|
384
|
+
const checkedConfiguration = checkConfiguration(normalizeConfiguration(configuration));
|
|
385
|
+
Object.assign(DEFAULT_CONFIGURATION, checkedConfiguration);
|
|
386
|
+
Object.assign(config, checkedConfiguration);
|
|
240
387
|
}
|
|
241
388
|
|
|
242
389
|
function resetConfiguration() {
|
|
@@ -246,7 +393,7 @@ function resetConfiguration() {
|
|
|
246
393
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
247
394
|
}
|
|
248
395
|
|
|
249
|
-
const 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;
|
|
396
|
+
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;
|
|
250
397
|
|
|
251
398
|
/*
|
|
252
399
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -1394,13 +1541,13 @@ class AESDecryptionStream extends TransformStream {
|
|
|
1394
1541
|
const {
|
|
1395
1542
|
ctr,
|
|
1396
1543
|
hmac,
|
|
1397
|
-
|
|
1544
|
+
pendingInput,
|
|
1398
1545
|
ready
|
|
1399
1546
|
} = this;
|
|
1400
1547
|
if (hmac && ctr) {
|
|
1401
1548
|
await ready;
|
|
1402
|
-
const chunkToDecrypt = subarray(
|
|
1403
|
-
const originalAuthenticationCode = subarray(
|
|
1549
|
+
const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1550
|
+
const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1404
1551
|
let decryptedChunkArray = EMPTY_UINT8_ARRAY;
|
|
1405
1552
|
if (chunkToDecrypt.length) {
|
|
1406
1553
|
const encryptedChunk = toBits(codecBytes, chunkToDecrypt);
|
|
@@ -1409,7 +1556,7 @@ class AESDecryptionStream extends TransformStream {
|
|
|
1409
1556
|
decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
|
|
1410
1557
|
}
|
|
1411
1558
|
const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
|
|
1412
|
-
let invalidAuthenticationCode =
|
|
1559
|
+
let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
|
|
1413
1560
|
for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
|
|
1414
1561
|
invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
|
|
1415
1562
|
}
|
|
@@ -1453,14 +1600,14 @@ class AESEncryptionStream extends TransformStream {
|
|
|
1453
1600
|
const {
|
|
1454
1601
|
ctr,
|
|
1455
1602
|
hmac,
|
|
1456
|
-
|
|
1603
|
+
pendingInput,
|
|
1457
1604
|
ready
|
|
1458
1605
|
} = this;
|
|
1459
1606
|
if (hmac && ctr) {
|
|
1460
1607
|
await ready;
|
|
1461
1608
|
let encryptedChunkArray = EMPTY_UINT8_ARRAY;
|
|
1462
|
-
if (
|
|
1463
|
-
const encryptedChunk = ctr.update(toBits(codecBytes,
|
|
1609
|
+
if (pendingInput.length) {
|
|
1610
|
+
const encryptedChunk = ctr.update(toBits(codecBytes, pendingInput));
|
|
1464
1611
|
hmac.update(encryptedChunk);
|
|
1465
1612
|
encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
|
|
1466
1613
|
}
|
|
@@ -1477,7 +1624,7 @@ function initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength) {
|
|
|
1477
1624
|
ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
|
|
1478
1625
|
password: encodePassword(password, rawPassword),
|
|
1479
1626
|
strength: encryptionStrength - 1,
|
|
1480
|
-
|
|
1627
|
+
pendingInput: EMPTY_UINT8_ARRAY
|
|
1481
1628
|
});
|
|
1482
1629
|
}
|
|
1483
1630
|
|
|
@@ -1485,10 +1632,10 @@ function append(aesCrypto, input, output, paddingStart, paddingEnd, verifyAuthen
|
|
|
1485
1632
|
const {
|
|
1486
1633
|
ctr,
|
|
1487
1634
|
hmac,
|
|
1488
|
-
|
|
1635
|
+
pendingInput
|
|
1489
1636
|
} = aesCrypto;
|
|
1490
|
-
if (
|
|
1491
|
-
input = concat(
|
|
1637
|
+
if (pendingInput.length) {
|
|
1638
|
+
input = concat(pendingInput, input);
|
|
1492
1639
|
}
|
|
1493
1640
|
const inputLength = input.length - paddingEnd;
|
|
1494
1641
|
output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
|
|
@@ -1504,7 +1651,7 @@ function append(aesCrypto, input, output, paddingStart, paddingEnd, verifyAuthen
|
|
|
1504
1651
|
}
|
|
1505
1652
|
output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
|
|
1506
1653
|
}
|
|
1507
|
-
aesCrypto.
|
|
1654
|
+
aesCrypto.pendingInput = subarray(input, offset);
|
|
1508
1655
|
return output;
|
|
1509
1656
|
}
|
|
1510
1657
|
|
|
@@ -3277,6 +3424,96 @@ async function terminateWorkers() {
|
|
|
3277
3424
|
resetWebWorkerSupport();
|
|
3278
3425
|
}
|
|
3279
3426
|
|
|
3427
|
+
/*
|
|
3428
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
3429
|
+
|
|
3430
|
+
Redistribution and use in source and binary forms, with or without
|
|
3431
|
+
modification, are permitted provided that the following conditions are met:
|
|
3432
|
+
|
|
3433
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
3434
|
+
this list of conditions and the following disclaimer.
|
|
3435
|
+
|
|
3436
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
3437
|
+
notice, this list of conditions and the following disclaimer in
|
|
3438
|
+
the documentation and/or other materials provided with the distribution.
|
|
3439
|
+
|
|
3440
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
3441
|
+
derived from this software without specific prior written permission.
|
|
3442
|
+
|
|
3443
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
3444
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
3445
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
3446
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
3447
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
3448
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
3449
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
3450
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
3451
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
3452
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
3453
|
+
*/
|
|
3454
|
+
|
|
3455
|
+
/* global TextDecoder */
|
|
3456
|
+
|
|
3457
|
+
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
3458
|
+
const VALID_CP437 = CP437.length == 256;
|
|
3459
|
+
|
|
3460
|
+
function decodeCP437(stringValue) {
|
|
3461
|
+
if (VALID_CP437) {
|
|
3462
|
+
let result = "";
|
|
3463
|
+
for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
|
|
3464
|
+
result += CP437[stringValue[indexCharacter]];
|
|
3465
|
+
}
|
|
3466
|
+
return result;
|
|
3467
|
+
} else {
|
|
3468
|
+
return new TextDecoder().decode(stringValue);
|
|
3469
|
+
}
|
|
3470
|
+
}
|
|
3471
|
+
|
|
3472
|
+
/*
|
|
3473
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
3474
|
+
|
|
3475
|
+
Redistribution and use in source and binary forms, with or without
|
|
3476
|
+
modification, are permitted provided that the following conditions are met:
|
|
3477
|
+
|
|
3478
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
3479
|
+
this list of conditions and the following disclaimer.
|
|
3480
|
+
|
|
3481
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
3482
|
+
notice, this list of conditions and the following disclaimer in
|
|
3483
|
+
the documentation and/or other materials provided with the distribution.
|
|
3484
|
+
|
|
3485
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
3486
|
+
derived from this software without specific prior written permission.
|
|
3487
|
+
|
|
3488
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
3489
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
3490
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
3491
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
3492
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
3493
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
3494
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
3495
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
3496
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
3497
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
3498
|
+
*/
|
|
3499
|
+
|
|
3500
|
+
|
|
3501
|
+
function decodeText(value, encoding) {
|
|
3502
|
+
return decode(value, encoding, true);
|
|
3503
|
+
}
|
|
3504
|
+
|
|
3505
|
+
function decodeTextRemovingBOM(value, encoding) {
|
|
3506
|
+
return decode(value, encoding, false);
|
|
3507
|
+
}
|
|
3508
|
+
|
|
3509
|
+
function decode(value, encoding, ignoreBOM) {
|
|
3510
|
+
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
3511
|
+
return decodeCP437(value);
|
|
3512
|
+
} else {
|
|
3513
|
+
return new TextDecoder(encoding, { ignoreBOM }).decode(value);
|
|
3514
|
+
}
|
|
3515
|
+
}
|
|
3516
|
+
|
|
3280
3517
|
/*
|
|
3281
3518
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
3282
3519
|
|
|
@@ -3349,6 +3586,7 @@ class Reader extends Stream {
|
|
|
3349
3586
|
createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
|
|
3350
3587
|
const reader = this;
|
|
3351
3588
|
let chunkOffset = 0;
|
|
3589
|
+
chunkSize = normalizeChunkSize(chunkSize);
|
|
3352
3590
|
return new ReadableStream({
|
|
3353
3591
|
async pull(controller) {
|
|
3354
3592
|
const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
|
|
@@ -3356,7 +3594,7 @@ class Reader extends Stream {
|
|
|
3356
3594
|
if (data.length) {
|
|
3357
3595
|
controller.enqueue(data);
|
|
3358
3596
|
}
|
|
3359
|
-
if ((chunkOffset + chunkSize >= size) || (
|
|
3597
|
+
if ((chunkOffset + chunkSize >= size) || (!data.length && dataSize)) {
|
|
3360
3598
|
controller.close();
|
|
3361
3599
|
} else {
|
|
3362
3600
|
chunkOffset += chunkSize;
|
|
@@ -3436,31 +3674,31 @@ class Data64URIWriter extends Writer {
|
|
|
3436
3674
|
Object.assign(this, {
|
|
3437
3675
|
contentType,
|
|
3438
3676
|
data: "data:" + (contentType || "") + ";base64,",
|
|
3439
|
-
|
|
3677
|
+
pendingCharacters: ""
|
|
3440
3678
|
});
|
|
3441
3679
|
}
|
|
3442
3680
|
|
|
3443
3681
|
writeUint8Array(array) {
|
|
3444
3682
|
const writer = this;
|
|
3445
3683
|
let indexArray;
|
|
3446
|
-
let dataString = writer.
|
|
3447
|
-
const delta = writer.
|
|
3448
|
-
writer.
|
|
3684
|
+
let dataString = writer.pendingCharacters;
|
|
3685
|
+
const delta = writer.pendingCharacters.length;
|
|
3686
|
+
writer.pendingCharacters = "";
|
|
3449
3687
|
for (indexArray = 0; indexArray < (Math.floor((delta + array.length) / 3) * 3) - delta; indexArray++) {
|
|
3450
3688
|
dataString += String.fromCharCode(array[indexArray]);
|
|
3451
3689
|
}
|
|
3452
3690
|
for (; indexArray < array.length; indexArray++) {
|
|
3453
|
-
writer.
|
|
3691
|
+
writer.pendingCharacters += String.fromCharCode(array[indexArray]);
|
|
3454
3692
|
}
|
|
3455
3693
|
if (dataString.length > 2) {
|
|
3456
3694
|
writer.data += btoa(dataString);
|
|
3457
3695
|
} else {
|
|
3458
|
-
writer.
|
|
3696
|
+
writer.pendingCharacters = dataString + writer.pendingCharacters;
|
|
3459
3697
|
}
|
|
3460
3698
|
}
|
|
3461
3699
|
|
|
3462
3700
|
getData() {
|
|
3463
|
-
return this.data + btoa(this.
|
|
3701
|
+
return this.data + btoa(this.pendingCharacters);
|
|
3464
3702
|
}
|
|
3465
3703
|
}
|
|
3466
3704
|
|
|
@@ -3490,7 +3728,7 @@ class BlobReader extends Reader {
|
|
|
3490
3728
|
constructor(blob) {
|
|
3491
3729
|
super();
|
|
3492
3730
|
Object.assign(this, {
|
|
3493
|
-
blob,
|
|
3731
|
+
sourceBlob: blob,
|
|
3494
3732
|
size: blob.size
|
|
3495
3733
|
});
|
|
3496
3734
|
if (!blobSliceProbe) {
|
|
@@ -3500,13 +3738,13 @@ class BlobReader extends Reader {
|
|
|
3500
3738
|
|
|
3501
3739
|
createReadable(options) {
|
|
3502
3740
|
const reader = this;
|
|
3503
|
-
const {
|
|
3741
|
+
const { sourceBlob, size } = reader;
|
|
3504
3742
|
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
3505
3743
|
if (!offset && readSize >= size) {
|
|
3506
|
-
return toCompatibleReadable(
|
|
3744
|
+
return toCompatibleReadable(sourceBlob.stream());
|
|
3507
3745
|
}
|
|
3508
3746
|
if (blobSliceReliable) {
|
|
3509
|
-
return toCompatibleReadable(
|
|
3747
|
+
return toCompatibleReadable(sourceBlob.slice(offset, offset + readSize).stream());
|
|
3510
3748
|
}
|
|
3511
3749
|
return super.createReadable(options);
|
|
3512
3750
|
}
|
|
@@ -3515,7 +3753,7 @@ class BlobReader extends Reader {
|
|
|
3515
3753
|
const reader = this;
|
|
3516
3754
|
const offsetEnd = offset + length;
|
|
3517
3755
|
const readsWholeBlob = !offset && offsetEnd >= reader.size;
|
|
3518
|
-
const blob = readsWholeBlob ? reader.
|
|
3756
|
+
const blob = readsWholeBlob ? reader.sourceBlob : reader.sourceBlob.slice(offset, offsetEnd);
|
|
3519
3757
|
let arrayBuffer = await blob.arrayBuffer();
|
|
3520
3758
|
const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
|
|
3521
3759
|
if (sliceIgnoredByBuggyImplementation) {
|
|
@@ -3537,12 +3775,12 @@ class BlobWriter extends Stream {
|
|
|
3537
3775
|
}
|
|
3538
3776
|
});
|
|
3539
3777
|
writer.contentType = contentType;
|
|
3540
|
-
writer.
|
|
3541
|
-
writer.
|
|
3778
|
+
writer.blobPromise = streamToBlob(transformStream.readable, contentType);
|
|
3779
|
+
writer.blobPromise.catch(() => { });
|
|
3542
3780
|
}
|
|
3543
3781
|
|
|
3544
3782
|
getData() {
|
|
3545
|
-
return this.
|
|
3783
|
+
return this.blobPromise;
|
|
3546
3784
|
}
|
|
3547
3785
|
}
|
|
3548
3786
|
|
|
@@ -3576,7 +3814,7 @@ function getTextSize(text) {
|
|
|
3576
3814
|
class TextWriter extends BlobWriter {
|
|
3577
3815
|
|
|
3578
3816
|
constructor(encoding) {
|
|
3579
|
-
super(
|
|
3817
|
+
super();
|
|
3580
3818
|
Object.assign(this, {
|
|
3581
3819
|
encoding,
|
|
3582
3820
|
utf8: !encoding || encoding.toLowerCase() == "utf-8"
|
|
@@ -3592,14 +3830,7 @@ class TextWriter extends BlobWriter {
|
|
|
3592
3830
|
if (blob.text && utf8) {
|
|
3593
3831
|
return blob.text();
|
|
3594
3832
|
} else {
|
|
3595
|
-
|
|
3596
|
-
return new Promise((resolve, reject) => {
|
|
3597
|
-
Object.assign(reader, {
|
|
3598
|
-
onload: ({ target }) => resolve(target.result),
|
|
3599
|
-
onerror: () => reject(reader.error)
|
|
3600
|
-
});
|
|
3601
|
-
reader.readAsText(blob, encoding);
|
|
3602
|
-
});
|
|
3833
|
+
return decodeTextRemovingBOM(new Uint8Array(await blob.arrayBuffer()), encoding);
|
|
3603
3834
|
}
|
|
3604
3835
|
}
|
|
3605
3836
|
}
|
|
@@ -4267,85 +4498,13 @@ function readUint8Array(reader, offset, size) {
|
|
|
4267
4498
|
return reader.readUint8Array(offset, size);
|
|
4268
4499
|
}
|
|
4269
4500
|
|
|
4270
|
-
|
|
4271
|
-
|
|
4272
|
-
|
|
4273
|
-
|
|
4274
|
-
|
|
4275
|
-
|
|
4276
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4277
|
-
this list of conditions and the following disclaimer.
|
|
4278
|
-
|
|
4279
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4280
|
-
notice, this list of conditions and the following disclaimer in
|
|
4281
|
-
the documentation and/or other materials provided with the distribution.
|
|
4282
|
-
|
|
4283
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4284
|
-
derived from this software without specific prior written permission.
|
|
4285
|
-
|
|
4286
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4287
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4288
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4289
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4290
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4291
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4292
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4293
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4294
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4295
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4296
|
-
*/
|
|
4297
|
-
|
|
4298
|
-
/* global TextDecoder */
|
|
4299
|
-
|
|
4300
|
-
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
4301
|
-
const VALID_CP437 = CP437.length == 256;
|
|
4302
|
-
|
|
4303
|
-
function decodeCP437(stringValue) {
|
|
4304
|
-
if (VALID_CP437) {
|
|
4305
|
-
let result = "";
|
|
4306
|
-
for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
|
|
4307
|
-
result += CP437[stringValue[indexCharacter]];
|
|
4308
|
-
}
|
|
4309
|
-
return result;
|
|
4310
|
-
} else {
|
|
4311
|
-
return new TextDecoder().decode(stringValue);
|
|
4312
|
-
}
|
|
4313
|
-
}
|
|
4314
|
-
|
|
4315
|
-
/*
|
|
4316
|
-
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
4317
|
-
|
|
4318
|
-
Redistribution and use in source and binary forms, with or without
|
|
4319
|
-
modification, are permitted provided that the following conditions are met:
|
|
4320
|
-
|
|
4321
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4322
|
-
this list of conditions and the following disclaimer.
|
|
4323
|
-
|
|
4324
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4325
|
-
notice, this list of conditions and the following disclaimer in
|
|
4326
|
-
the documentation and/or other materials provided with the distribution.
|
|
4327
|
-
|
|
4328
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4329
|
-
derived from this software without specific prior written permission.
|
|
4330
|
-
|
|
4331
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4332
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4333
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4334
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4335
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4336
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4337
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4338
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4339
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4340
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4341
|
-
*/
|
|
4342
|
-
|
|
4343
|
-
|
|
4344
|
-
function decodeText(value, encoding) {
|
|
4345
|
-
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
4346
|
-
return decodeCP437(value);
|
|
4501
|
+
function createReadable(reader, options) {
|
|
4502
|
+
if (reader.createReadable) {
|
|
4503
|
+
return reader.createReadable(options);
|
|
4504
|
+
} else if (reader.readUint8Array) {
|
|
4505
|
+
return Reader.prototype.createReadable.call(reader, options);
|
|
4347
4506
|
} else {
|
|
4348
|
-
return
|
|
4507
|
+
return reader.readable;
|
|
4349
4508
|
}
|
|
4350
4509
|
}
|
|
4351
4510
|
|
|
@@ -4505,83 +4664,6 @@ class Entry {
|
|
|
4505
4664
|
|
|
4506
4665
|
}
|
|
4507
4666
|
|
|
4508
|
-
/*
|
|
4509
|
-
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
4510
|
-
|
|
4511
|
-
Redistribution and use in source and binary forms, with or without
|
|
4512
|
-
modification, are permitted provided that the following conditions are met:
|
|
4513
|
-
|
|
4514
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4515
|
-
this list of conditions and the following disclaimer.
|
|
4516
|
-
|
|
4517
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4518
|
-
notice, this list of conditions and the following disclaimer in
|
|
4519
|
-
the documentation and/or other materials provided with the distribution.
|
|
4520
|
-
|
|
4521
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4522
|
-
derived from this software without specific prior written permission.
|
|
4523
|
-
|
|
4524
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4525
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4526
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4527
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4528
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4529
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4530
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4531
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4532
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4533
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4534
|
-
*/
|
|
4535
|
-
|
|
4536
|
-
const OPTION_FILENAME_ENCODING = "filenameEncoding";
|
|
4537
|
-
const OPTION_COMMENT_ENCODING = "commentEncoding";
|
|
4538
|
-
const OPTION_DECODE_TEXT = "decodeText";
|
|
4539
|
-
const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
|
|
4540
|
-
const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
|
|
4541
|
-
const OPTION_PASSWORD = "password";
|
|
4542
|
-
const OPTION_RAW_PASSWORD = "rawPassword";
|
|
4543
|
-
const OPTION_PASS_THROUGH = "passThrough";
|
|
4544
|
-
const OPTION_SIGNAL = "signal";
|
|
4545
|
-
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
4546
|
-
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
4547
|
-
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
4548
|
-
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
4549
|
-
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
4550
|
-
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
4551
|
-
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
4552
|
-
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
4553
|
-
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
4554
|
-
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
4555
|
-
const OPTION_TRANSFER_STREAMS = "transferStreams";
|
|
4556
|
-
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
4557
|
-
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
4558
|
-
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
4559
|
-
const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
|
|
4560
|
-
const OPTION_KEEP_ORDER = "keepOrder";
|
|
4561
|
-
const OPTION_LEVEL = "level";
|
|
4562
|
-
const OPTION_BUFFERED_WRITE = "bufferedWrite";
|
|
4563
|
-
const OPTION_CREATE_TEMP_STREAM = "createTempStream";
|
|
4564
|
-
const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
|
|
4565
|
-
const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
|
|
4566
|
-
const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
|
|
4567
|
-
const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
|
|
4568
|
-
const OPTION_ENCODE_TEXT = "encodeText";
|
|
4569
|
-
const OPTION_OFFSET = "offset";
|
|
4570
|
-
const OPTION_USDZ = "usdz";
|
|
4571
|
-
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
4572
|
-
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
4573
|
-
const OPTION_STRICTNESS = "strictness";
|
|
4574
|
-
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
4575
|
-
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
4576
|
-
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
4577
|
-
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
4578
|
-
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
4579
|
-
const TEXT_TYPE_FILENAME = "filename";
|
|
4580
|
-
const TEXT_TYPE_COMMENT = "comment";
|
|
4581
|
-
const STRICTNESS_STRICT = "strict";
|
|
4582
|
-
const STRICTNESS_BALANCED = "balanced";
|
|
4583
|
-
const STRICTNESS_TOLERANT = "tolerant";
|
|
4584
|
-
|
|
4585
4667
|
/*
|
|
4586
4668
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4587
4669
|
|
|
@@ -4622,6 +4704,7 @@ const ERR_UNSUPPORTED_ENCRYPTION = "Encryption method not supported";
|
|
|
4622
4704
|
const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
|
|
4623
4705
|
const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
4624
4706
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
4707
|
+
const ERR_ENTRY_DATA_OUT_OF_BOUNDS = "Entry data out of bounds";
|
|
4625
4708
|
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
4626
4709
|
const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
|
|
4627
4710
|
const ERR_UNSAFE_FILENAME = "Unsafe filename";
|
|
@@ -4642,7 +4725,7 @@ const ZIP64_PROPERTIES = [
|
|
|
4642
4725
|
];
|
|
4643
4726
|
const ZIP64_EXTRACTION = {
|
|
4644
4727
|
[MAX_16_BITS]: {
|
|
4645
|
-
getValue: getUint32,
|
|
4728
|
+
getValue: getUint32$1,
|
|
4646
4729
|
bytes: 4
|
|
4647
4730
|
},
|
|
4648
4731
|
[MAX_32_BITS]: {
|
|
@@ -4651,6 +4734,7 @@ const ZIP64_EXTRACTION = {
|
|
|
4651
4734
|
}
|
|
4652
4735
|
};
|
|
4653
4736
|
const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
|
|
4737
|
+
const MAX_DEFLATE_EXPANSION_RATIO = 1032;
|
|
4654
4738
|
const CENTRAL_DIRECTORY_UNREACHABLE = 0;
|
|
4655
4739
|
const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
|
|
4656
4740
|
const CENTRAL_DIRECTORY_REACHABLE = 2;
|
|
@@ -4661,7 +4745,6 @@ class ZipReader {
|
|
|
4661
4745
|
Object.assign(this, {
|
|
4662
4746
|
reader: new GenericReader(reader),
|
|
4663
4747
|
options,
|
|
4664
|
-
config: getConfiguration(),
|
|
4665
4748
|
readRanges: new Map()
|
|
4666
4749
|
});
|
|
4667
4750
|
}
|
|
@@ -4669,7 +4752,6 @@ class ZipReader {
|
|
|
4669
4752
|
async* getEntriesGenerator(options = {}) {
|
|
4670
4753
|
const zipReader = this;
|
|
4671
4754
|
let { reader } = zipReader;
|
|
4672
|
-
const { config } = zipReader;
|
|
4673
4755
|
await initStream(reader);
|
|
4674
4756
|
if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
|
|
4675
4757
|
reader = new BlobReader(await streamToBlob(reader.readable));
|
|
@@ -4686,9 +4768,7 @@ class ZipReader {
|
|
|
4686
4768
|
const normalizeFilename = getOptionValue$1(zipReader, options, OPTION_NORMALIZE_FILENAME);
|
|
4687
4769
|
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
4688
4770
|
if (!endOfDirectoryInfo) {
|
|
4689
|
-
|
|
4690
|
-
const signatureView = getDataView(signatureArray);
|
|
4691
|
-
if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
|
|
4771
|
+
if (await startsWithSplitZipSignature$1(reader)) {
|
|
4692
4772
|
throw new Error(ERR_SPLIT_ZIP_FILE);
|
|
4693
4773
|
} else {
|
|
4694
4774
|
throw new Error(ERR_EOCDR_NOT_FOUND);
|
|
@@ -4698,22 +4778,23 @@ class ZipReader {
|
|
|
4698
4778
|
throwAmbiguousArchive("multiple end of central directory records");
|
|
4699
4779
|
}
|
|
4700
4780
|
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
4701
|
-
let directoryDataLength = getUint32(endOfDirectoryView, 12);
|
|
4702
|
-
let directoryDataOffset = getUint32(endOfDirectoryView, 16);
|
|
4781
|
+
let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
|
|
4782
|
+
let directoryDataOffset = getUint32$1(endOfDirectoryView, 16);
|
|
4703
4783
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
4704
|
-
const commentLength = getUint16(endOfDirectoryView, 20);
|
|
4784
|
+
const commentLength = getUint16$1(endOfDirectoryView, 20);
|
|
4705
4785
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
4706
4786
|
if (reader.size - appendedDataOffset > maxAppendedDataSize) {
|
|
4707
4787
|
throwAmbiguousArchive("appended data");
|
|
4708
4788
|
}
|
|
4709
|
-
let lastDiskNumber = getUint16(endOfDirectoryView, 4);
|
|
4789
|
+
let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
|
|
4710
4790
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
4711
|
-
let diskNumber = getUint16(endOfDirectoryView, 6);
|
|
4712
|
-
let filesLength = getUint16(endOfDirectoryView, 10);
|
|
4791
|
+
let diskNumber = getUint16$1(endOfDirectoryView, 6);
|
|
4792
|
+
let filesLength = getUint16$1(endOfDirectoryView, 10);
|
|
4713
4793
|
let prependedDataLength = 0;
|
|
4714
4794
|
let startOffset;
|
|
4715
4795
|
let zip64EndOfDirectory;
|
|
4716
4796
|
let zip64EndOfDirectoryVersion2;
|
|
4797
|
+
let zip64EndOfDirectoryLength = ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
4717
4798
|
let directoryEncryptionInfo;
|
|
4718
4799
|
const requiresZip64 = directoryDataOffset == MAX_32_BITS || directoryDataLength == MAX_32_BITS || filesLength == MAX_16_BITS || diskNumber == MAX_16_BITS;
|
|
4719
4800
|
if (directoryDataOffset != MAX_32_BITS && diskNumber != MAX_16_BITS) {
|
|
@@ -4725,12 +4806,12 @@ class ZipReader {
|
|
|
4725
4806
|
EMPTY_UINT8_ARRAY;
|
|
4726
4807
|
const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
|
|
4727
4808
|
if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
|
|
4728
|
-
getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
4729
|
-
directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4809
|
+
getUint32$1(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
4810
|
+
directoryDataOffset = getDiskOffset$1(reader, getUint32$1(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4730
4811
|
let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4731
4812
|
let endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4732
4813
|
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
4733
|
-
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
4814
|
+
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
4734
4815
|
directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
|
|
4735
4816
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
4736
4817
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
@@ -4740,7 +4821,7 @@ class ZipReader {
|
|
|
4740
4821
|
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4741
4822
|
endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4742
4823
|
}
|
|
4743
|
-
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4824
|
+
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4744
4825
|
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4745
4826
|
}
|
|
4746
4827
|
zip64EndOfDirectory = true;
|
|
@@ -4750,18 +4831,19 @@ class ZipReader {
|
|
|
4750
4831
|
Number(getBigUint64(endOfDirectoryView, 4)) - (ZIP64_END_OF_CENTRAL_DIR_LENGTH - 12),
|
|
4751
4832
|
reader.size - directoryDataOffset - ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4752
4833
|
if (extensibleDataLength > 0) {
|
|
4834
|
+
zip64EndOfDirectoryLength += extensibleDataLength;
|
|
4753
4835
|
const rawExtensibleData = await readUint8Array(reader, directoryDataOffset + ZIP64_END_OF_CENTRAL_DIR_LENGTH, extensibleDataLength);
|
|
4754
4836
|
directoryEncryptionInfo = getDirectoryEncryptionInfo(rawExtensibleData);
|
|
4755
4837
|
}
|
|
4756
4838
|
}
|
|
4757
4839
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
4758
|
-
lastDiskNumber = getUint32(endOfDirectoryView, 16);
|
|
4759
|
-
} else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
|
|
4840
|
+
lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
|
|
4841
|
+
} else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
|
|
4760
4842
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
4761
4843
|
}
|
|
4762
4844
|
if (diskNumber == MAX_16_BITS) {
|
|
4763
|
-
diskNumber = getUint32(endOfDirectoryView, 20);
|
|
4764
|
-
} else if (checkAmbiguity && diskNumber != getUint32(endOfDirectoryView, 20)) {
|
|
4845
|
+
diskNumber = getUint32$1(endOfDirectoryView, 20);
|
|
4846
|
+
} else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
|
|
4765
4847
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
4766
4848
|
}
|
|
4767
4849
|
if (filesLength == MAX_16_BITS) {
|
|
@@ -4779,7 +4861,7 @@ class ZipReader {
|
|
|
4779
4861
|
}
|
|
4780
4862
|
let declaredDirectoryDataLength = directoryDataLength;
|
|
4781
4863
|
const centralDirectoryEndOffset = endOfDirectoryInfo.offset -
|
|
4782
|
-
(zip64EndOfDirectory ?
|
|
4864
|
+
(zip64EndOfDirectory ? zip64EndOfDirectoryLength + ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH : 0);
|
|
4783
4865
|
if (directoryDataOffset >= reader.size) {
|
|
4784
4866
|
prependedDataLength = reader.size - directoryDataOffset - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
4785
4867
|
directoryDataOffset = reader.size - directoryDataLength - END_OF_CENTRAL_DIR_LENGTH;
|
|
@@ -4799,11 +4881,13 @@ class ZipReader {
|
|
|
4799
4881
|
}
|
|
4800
4882
|
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
4801
4883
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4802
|
-
const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE
|
|
4884
|
+
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE ||
|
|
4885
|
+
Boolean(directoryEncryptionInfo && directoryEncryptionInfo.compressedSize) ||
|
|
4886
|
+
detectEncryptedCentralDirectory(directoryView);
|
|
4803
4887
|
let reconcile = !storedPointsAtDirectory;
|
|
4804
4888
|
if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
4805
4889
|
const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
|
|
4806
|
-
reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4890
|
+
reconcile = getUint32$1(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4807
4891
|
}
|
|
4808
4892
|
if (reconcile) {
|
|
4809
4893
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
@@ -4827,12 +4911,14 @@ class ZipReader {
|
|
|
4827
4911
|
}
|
|
4828
4912
|
zipReader.directoryOffset = directoryDataOffset;
|
|
4829
4913
|
zipReader.directoryLength = declaredDirectoryDataLength;
|
|
4830
|
-
const decryptCentralDirectory =
|
|
4831
|
-
let decryptedDirectory;
|
|
4914
|
+
const decryptCentralDirectory = getFunctionOptionValue$1(zipReader, options, OPTION_DECRYPT_CENTRAL_DIRECTORY);
|
|
4915
|
+
let decryptedDirectory, dataAfterEncryptedDirectory;
|
|
4832
4916
|
if (decryptCentralDirectory && filesLength && directoryArray.length >= 4 &&
|
|
4833
|
-
getUint32(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
|
|
4917
|
+
getUint32$1(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
|
|
4834
4918
|
(zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4835
|
-
|
|
4919
|
+
const encryptedDirectoryDataLength = getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryArray.length);
|
|
4920
|
+
dataAfterEncryptedDirectory = directoryArray.subarray(encryptedDirectoryDataLength);
|
|
4921
|
+
directoryArray = await decryptCentralDirectory(directoryArray.subarray(0, encryptedDirectoryDataLength), directoryEncryptionInfo);
|
|
4836
4922
|
directoryView = getDataView(directoryArray);
|
|
4837
4923
|
declaredDirectoryDataLength = directoryArray.length;
|
|
4838
4924
|
decryptedDirectory = true;
|
|
@@ -4843,8 +4929,8 @@ class ZipReader {
|
|
|
4843
4929
|
const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
|
|
4844
4930
|
let duplicateFilename;
|
|
4845
4931
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
4846
|
-
const fileEntry = new ZipEntry$1(reader,
|
|
4847
|
-
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4932
|
+
const fileEntry = new ZipEntry$1(reader, zipReader.options);
|
|
4933
|
+
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32$1(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4848
4934
|
if (indexFile == 0 && !decryptedDirectory && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4849
4935
|
throw new Error(ERR_ENCRYPTED_CENTRAL_DIRECTORY);
|
|
4850
4936
|
}
|
|
@@ -4855,16 +4941,16 @@ class ZipReader {
|
|
|
4855
4941
|
const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
|
|
4856
4942
|
const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
|
|
4857
4943
|
const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
|
|
4858
|
-
const versionMadeBy = getUint16(directoryView, offset + 4);
|
|
4944
|
+
const versionMadeBy = getUint16$1(directoryView, offset + 4);
|
|
4859
4945
|
const msDosCompatible = versionMadeBy >> 8 == 0;
|
|
4860
4946
|
const unixCompatible = versionMadeBy >> 8 == 3;
|
|
4861
4947
|
const rawFilename = directoryArray.subarray(filenameOffset, extraFieldOffset);
|
|
4862
|
-
const commentLength = getUint16(directoryView, offset + 32);
|
|
4948
|
+
const commentLength = getUint16$1(directoryView, offset + 32);
|
|
4863
4949
|
const endOffset = commentOffset + commentLength;
|
|
4864
4950
|
const rawComment = directoryArray.subarray(commentOffset, endOffset);
|
|
4865
4951
|
const filenameUTF8 = languageEncodingFlag;
|
|
4866
4952
|
const commentUTF8 = languageEncodingFlag;
|
|
4867
|
-
const externalFileAttributes = getUint32(directoryView, offset + 38);
|
|
4953
|
+
const externalFileAttributes = getUint32$1(directoryView, offset + 38);
|
|
4868
4954
|
const msdosAttributesRaw = externalFileAttributes & MAX_8_BITS;
|
|
4869
4955
|
const msdosAttributes = {
|
|
4870
4956
|
readOnly: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_READONLY_MASK),
|
|
@@ -4873,8 +4959,8 @@ class ZipReader {
|
|
|
4873
4959
|
directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
|
|
4874
4960
|
archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
|
|
4875
4961
|
};
|
|
4876
|
-
const offsetFileEntry = getUint32(directoryView, offset + 42);
|
|
4877
|
-
const decode =
|
|
4962
|
+
const offsetFileEntry = getUint32$1(directoryView, offset + 42);
|
|
4963
|
+
const decode = getFunctionOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
4878
4964
|
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
4879
4965
|
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
4880
4966
|
let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
|
|
@@ -4898,6 +4984,7 @@ class ZipReader {
|
|
|
4898
4984
|
}
|
|
4899
4985
|
Object.assign(fileEntry, {
|
|
4900
4986
|
index: indexFile,
|
|
4987
|
+
decryptedDirectory,
|
|
4901
4988
|
versionMadeBy,
|
|
4902
4989
|
msDosCompatible,
|
|
4903
4990
|
zip64: false,
|
|
@@ -4905,8 +4992,8 @@ class ZipReader {
|
|
|
4905
4992
|
uncompressedSize: 0,
|
|
4906
4993
|
commentLength,
|
|
4907
4994
|
offset: offsetFileEntry,
|
|
4908
|
-
diskNumberStart: getUint16(directoryView, offset + 34),
|
|
4909
|
-
internalFileAttributes: getUint16(directoryView, offset + 36),
|
|
4995
|
+
diskNumberStart: getUint16$1(directoryView, offset + 34),
|
|
4996
|
+
internalFileAttributes: getUint16$1(directoryView, offset + 36),
|
|
4910
4997
|
externalFileAttributes,
|
|
4911
4998
|
msdosAttributesRaw,
|
|
4912
4999
|
msdosAttributes,
|
|
@@ -4974,12 +5061,11 @@ class ZipReader {
|
|
|
4974
5061
|
yield entry;
|
|
4975
5062
|
}
|
|
4976
5063
|
let offsetAfterSignature = offset;
|
|
4977
|
-
|
|
4978
|
-
|
|
4979
|
-
|
|
4980
|
-
|
|
4981
|
-
|
|
4982
|
-
}
|
|
5064
|
+
const digitalSignature = readDigitalSignature(directoryArray.subarray(offset)) ||
|
|
5065
|
+
(decryptedDirectory ? readDigitalSignature(dataAfterEncryptedDirectory) : UNDEFINED_VALUE);
|
|
5066
|
+
if (digitalSignature) {
|
|
5067
|
+
zipReader.digitalSignature = digitalSignature;
|
|
5068
|
+
offsetAfterSignature = offset + 6 + digitalSignature.length;
|
|
4983
5069
|
}
|
|
4984
5070
|
if (checkAmbiguity && offset != declaredDirectoryDataLength && offsetAfterSignature != declaredDirectoryDataLength) {
|
|
4985
5071
|
throwAmbiguousArchive("trailing central directory data");
|
|
@@ -4987,13 +5073,17 @@ class ZipReader {
|
|
|
4987
5073
|
if (duplicateFilename) {
|
|
4988
5074
|
throwAmbiguousArchive("duplicate filename");
|
|
4989
5075
|
}
|
|
4990
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > 0))) {
|
|
4991
|
-
throwAmbiguousArchive("prepended data");
|
|
4992
|
-
}
|
|
4993
5076
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
4994
5077
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5078
|
+
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5079
|
+
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5080
|
+
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5081
|
+
throwAmbiguousArchive("prepended data");
|
|
5082
|
+
}
|
|
4995
5083
|
if (extractPrependedData) {
|
|
4996
|
-
zipReader.prependedData = startOffset >
|
|
5084
|
+
zipReader.prependedData = startOffset > splitZipSignatureLength ?
|
|
5085
|
+
await readUint8Array(reader, splitZipSignatureLength, startOffset - splitZipSignatureLength) :
|
|
5086
|
+
EMPTY_UINT8_ARRAY;
|
|
4997
5087
|
}
|
|
4998
5088
|
zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : EMPTY_UINT8_ARRAY;
|
|
4999
5089
|
if (extractAppendedData) {
|
|
@@ -5060,16 +5150,16 @@ class ZipReaderStream {
|
|
|
5060
5150
|
|
|
5061
5151
|
let ZipEntry$1 = class ZipEntry {
|
|
5062
5152
|
|
|
5063
|
-
constructor(reader,
|
|
5153
|
+
constructor(reader, options) {
|
|
5064
5154
|
Object.assign(this, {
|
|
5065
5155
|
reader,
|
|
5066
|
-
config,
|
|
5067
5156
|
options
|
|
5068
5157
|
});
|
|
5069
5158
|
}
|
|
5070
5159
|
|
|
5071
5160
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5072
5161
|
const zipEntry = this;
|
|
5162
|
+
const config = getConfiguration();
|
|
5073
5163
|
const {
|
|
5074
5164
|
reader,
|
|
5075
5165
|
index,
|
|
@@ -5078,7 +5168,6 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5078
5168
|
extraFieldAES,
|
|
5079
5169
|
extraFieldZip64,
|
|
5080
5170
|
compressionMethod,
|
|
5081
|
-
config,
|
|
5082
5171
|
bitFlag,
|
|
5083
5172
|
rawBitFlag,
|
|
5084
5173
|
crc32,
|
|
@@ -5096,6 +5185,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5096
5185
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
5097
5186
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
5098
5187
|
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
5188
|
+
checkPasswordOption(password, rawPassword);
|
|
5099
5189
|
password = password && password.length && password;
|
|
5100
5190
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
5101
5191
|
if (extraFieldAES) {
|
|
@@ -5103,7 +5193,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5103
5193
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
5104
5194
|
}
|
|
5105
5195
|
}
|
|
5106
|
-
if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
5196
|
+
if (dataArray.length < HEADER_SIZE || getUint32$1(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
5107
5197
|
throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
|
|
5108
5198
|
}
|
|
5109
5199
|
readCommonHeader(localDirectory, dataView, 4);
|
|
@@ -5165,9 +5255,12 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5165
5255
|
}
|
|
5166
5256
|
}
|
|
5167
5257
|
const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
|
|
5258
|
+
if (dataOffset + compressedSize > reader.size) {
|
|
5259
|
+
throw new Error(ERR_ENTRY_DATA_OUT_OF_BOUNDS);
|
|
5260
|
+
}
|
|
5168
5261
|
const size = compressedSize;
|
|
5169
5262
|
const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
|
|
5170
|
-
const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
|
|
5263
|
+
const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
|
|
5171
5264
|
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5172
5265
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
5173
5266
|
const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
|
|
@@ -5175,6 +5268,8 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5175
5268
|
checkOverlappingEntry = true;
|
|
5176
5269
|
}
|
|
5177
5270
|
const { onstart, onprogress, onend } = options;
|
|
5271
|
+
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThrough;
|
|
5272
|
+
const outputSize = passThrough ? compressedSize : uncompressedSize;
|
|
5178
5273
|
const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
|
|
5179
5274
|
let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
|
|
5180
5275
|
if (deflate64) {
|
|
@@ -5195,9 +5290,9 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5195
5290
|
checkCrc32,
|
|
5196
5291
|
checkAuthenticationCode: getOptionValue$1(zipEntry, options, OPTION_CHECK_AUTHENTICATION_CODE),
|
|
5197
5292
|
passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & MAX_8_BITS) : ((crc32 >>> 24) & MAX_8_BITS)),
|
|
5198
|
-
outputSize
|
|
5293
|
+
outputSize,
|
|
5199
5294
|
crc32,
|
|
5200
|
-
compressed
|
|
5295
|
+
compressed,
|
|
5201
5296
|
encrypted,
|
|
5202
5297
|
useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
|
|
5203
5298
|
useCompressionStream,
|
|
@@ -5234,11 +5329,11 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5234
5329
|
writer = new WritableStream();
|
|
5235
5330
|
}
|
|
5236
5331
|
writer = new GenericWriter(writer);
|
|
5237
|
-
await initStream(writer,
|
|
5332
|
+
await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
|
|
5238
5333
|
({ writable } = writer);
|
|
5239
|
-
const { outputSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5240
|
-
writer.size +=
|
|
5241
|
-
if (
|
|
5334
|
+
const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5335
|
+
writer.size += writtenSize;
|
|
5336
|
+
if (writtenSize != outputSize) {
|
|
5242
5337
|
throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
5243
5338
|
}
|
|
5244
5339
|
}
|
|
@@ -5272,26 +5367,47 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5272
5367
|
function detectEncryptedCentralDirectory(directoryView) {
|
|
5273
5368
|
const maxOffset = Math.min(directoryView.byteLength, 1024) - 3;
|
|
5274
5369
|
for (let offset = 0; offset < maxOffset; offset++) {
|
|
5275
|
-
if (getUint32(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
5370
|
+
if (getUint32$1(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
5276
5371
|
return true;
|
|
5277
5372
|
}
|
|
5278
5373
|
}
|
|
5279
5374
|
return false;
|
|
5280
5375
|
}
|
|
5281
5376
|
|
|
5377
|
+
function readDigitalSignature(signatureRecordArray) {
|
|
5378
|
+
if (signatureRecordArray.length >= 6) {
|
|
5379
|
+
const signatureRecordView = getDataView(signatureRecordArray);
|
|
5380
|
+
if (getUint32$1(signatureRecordView, 0) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
|
|
5381
|
+
const signatureDataLength = getUint16$1(signatureRecordView, 4);
|
|
5382
|
+
if (6 + signatureDataLength <= signatureRecordArray.length) {
|
|
5383
|
+
return signatureRecordArray.subarray(6, 6 + signatureDataLength);
|
|
5384
|
+
}
|
|
5385
|
+
}
|
|
5386
|
+
}
|
|
5387
|
+
}
|
|
5388
|
+
|
|
5389
|
+
function getEncryptedDirectoryDataLength(directoryEncryptionInfo, declaredDirectoryDataLength, directoryDataLength) {
|
|
5390
|
+
const encryptedDirectoryDataLength = directoryEncryptionInfo && directoryEncryptionInfo.compressedSize ?
|
|
5391
|
+
directoryEncryptionInfo.compressedSize :
|
|
5392
|
+
declaredDirectoryDataLength;
|
|
5393
|
+
return encryptedDirectoryDataLength > 0 && encryptedDirectoryDataLength <= directoryDataLength ?
|
|
5394
|
+
encryptedDirectoryDataLength :
|
|
5395
|
+
directoryDataLength;
|
|
5396
|
+
}
|
|
5397
|
+
|
|
5282
5398
|
function getDirectoryEncryptionInfo(rawExtensibleData) {
|
|
5283
5399
|
const directoryEncryptionInfo = { rawExtensibleData };
|
|
5284
5400
|
if (rawExtensibleData.length >= 28) {
|
|
5285
5401
|
const extensibleDataView = getDataView(rawExtensibleData);
|
|
5286
|
-
const hashDataLength = getUint16(extensibleDataView, 26);
|
|
5402
|
+
const hashDataLength = getUint16$1(extensibleDataView, 26);
|
|
5287
5403
|
Object.assign(directoryEncryptionInfo, {
|
|
5288
|
-
compressionMethod: getUint16(extensibleDataView, 0),
|
|
5404
|
+
compressionMethod: getUint16$1(extensibleDataView, 0),
|
|
5289
5405
|
compressedSize: Number(getBigUint64(extensibleDataView, 2)),
|
|
5290
5406
|
uncompressedSize: Number(getBigUint64(extensibleDataView, 10)),
|
|
5291
|
-
encryptionAlgorithm: getUint16(extensibleDataView, 18),
|
|
5292
|
-
bitLength: getUint16(extensibleDataView, 20),
|
|
5293
|
-
flags: getUint16(extensibleDataView, 22),
|
|
5294
|
-
hashAlgorithm: getUint16(extensibleDataView, 24),
|
|
5407
|
+
encryptionAlgorithm: getUint16$1(extensibleDataView, 18),
|
|
5408
|
+
bitLength: getUint16$1(extensibleDataView, 20),
|
|
5409
|
+
flags: getUint16$1(extensibleDataView, 22),
|
|
5410
|
+
hashAlgorithm: getUint16$1(extensibleDataView, 24),
|
|
5295
5411
|
hashData: rawExtensibleData.subarray(28, 28 + hashDataLength)
|
|
5296
5412
|
});
|
|
5297
5413
|
}
|
|
@@ -5299,12 +5415,12 @@ function getDirectoryEncryptionInfo(rawExtensibleData) {
|
|
|
5299
5415
|
}
|
|
5300
5416
|
|
|
5301
5417
|
function readCommonHeader(directory, dataView, offset) {
|
|
5302
|
-
const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2);
|
|
5418
|
+
const rawBitFlag = directory.rawBitFlag = getUint16$1(dataView, offset + 2);
|
|
5303
5419
|
const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED;
|
|
5304
|
-
const rawLastModDate = getUint32(dataView, offset + 6);
|
|
5420
|
+
const rawLastModDate = getUint32$1(dataView, offset + 6);
|
|
5305
5421
|
Object.assign(directory, {
|
|
5306
5422
|
encrypted,
|
|
5307
|
-
version: getUint16(dataView, offset),
|
|
5423
|
+
version: getUint16$1(dataView, offset),
|
|
5308
5424
|
bitFlag: {
|
|
5309
5425
|
level: (rawBitFlag & BITFLAG_LEVEL) >> 1,
|
|
5310
5426
|
dataDescriptor: (rawBitFlag & BITFLAG_DATA_DESCRIPTOR) == BITFLAG_DATA_DESCRIPTOR,
|
|
@@ -5312,8 +5428,8 @@ function readCommonHeader(directory, dataView, offset) {
|
|
|
5312
5428
|
},
|
|
5313
5429
|
rawLastModDate,
|
|
5314
5430
|
lastModDate: getDate(rawLastModDate),
|
|
5315
|
-
filenameLength: getUint16(dataView, offset + 22),
|
|
5316
|
-
extraFieldLength: getUint16(dataView, offset + 24)
|
|
5431
|
+
filenameLength: getUint16$1(dataView, offset + 22),
|
|
5432
|
+
extraFieldLength: getUint16$1(dataView, offset + 24)
|
|
5317
5433
|
});
|
|
5318
5434
|
}
|
|
5319
5435
|
|
|
@@ -5324,8 +5440,8 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
5324
5440
|
let offsetExtraField = 0;
|
|
5325
5441
|
try {
|
|
5326
5442
|
while (offsetExtraField < rawExtraField.length) {
|
|
5327
|
-
const type = getUint16(rawExtraFieldView, offsetExtraField);
|
|
5328
|
-
const size = getUint16(rawExtraFieldView, offsetExtraField + 2);
|
|
5443
|
+
const type = getUint16$1(rawExtraFieldView, offsetExtraField);
|
|
5444
|
+
const size = getUint16$1(rawExtraFieldView, offsetExtraField + 2);
|
|
5329
5445
|
extraField.set(type, {
|
|
5330
5446
|
type,
|
|
5331
5447
|
data: rawExtraField.slice(offsetExtraField + 4, offsetExtraField + 4 + size)
|
|
@@ -5335,12 +5451,12 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
5335
5451
|
} catch {
|
|
5336
5452
|
// ignored
|
|
5337
5453
|
}
|
|
5338
|
-
const compressionMethod = getUint16(dataView, offset + 4);
|
|
5454
|
+
const compressionMethod = getUint16$1(dataView, offset + 4);
|
|
5339
5455
|
Object.assign(directory, {
|
|
5340
|
-
signature: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5341
|
-
crc32: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5342
|
-
compressedSize: getUint32(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
|
|
5343
|
-
uncompressedSize: getUint32(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
|
|
5456
|
+
signature: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5457
|
+
crc32: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5458
|
+
compressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
|
|
5459
|
+
uncompressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
|
|
5344
5460
|
});
|
|
5345
5461
|
const extraFieldZip64 = extraField.get(EXTRAFIELD_TYPE_ZIP64);
|
|
5346
5462
|
if (extraFieldZip64) {
|
|
@@ -5429,11 +5545,11 @@ function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName,
|
|
|
5429
5545
|
computedCrc32.append(fileEntry[rawPropertyName]);
|
|
5430
5546
|
const computedCrc32View = getDataView(new Uint8Array(4));
|
|
5431
5547
|
computedCrc32View.setUint32(0, computedCrc32.get(), true);
|
|
5432
|
-
const nameCrc32 = getUint32(extraFieldView, 1);
|
|
5548
|
+
const nameCrc32 = getUint32$1(extraFieldView, 1);
|
|
5433
5549
|
Object.assign(extraFieldUnicode, {
|
|
5434
5550
|
version: getUint8(extraFieldView, 0),
|
|
5435
5551
|
[propertyName]: decodeText(extraFieldUnicode.data.subarray(5)),
|
|
5436
|
-
valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32(computedCrc32View, 0)
|
|
5552
|
+
valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32$1(computedCrc32View, 0)
|
|
5437
5553
|
});
|
|
5438
5554
|
if (extraFieldUnicode.valid) {
|
|
5439
5555
|
directory[propertyName] = extraFieldUnicode[propertyName];
|
|
@@ -5449,7 +5565,7 @@ function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
|
|
|
5449
5565
|
vendorId: getUint8(extraFieldView, 2),
|
|
5450
5566
|
strength,
|
|
5451
5567
|
originalCompressionMethod: compressionMethod,
|
|
5452
|
-
compressionMethod: getUint16(extraFieldView, 5)
|
|
5568
|
+
compressionMethod: getUint16$1(extraFieldView, 5)
|
|
5453
5569
|
});
|
|
5454
5570
|
directory.compressionMethod = extraFieldAES.compressionMethod;
|
|
5455
5571
|
if (extraFieldAES.vendorVersion != VENDOR_VERSION_AE_1$1) {
|
|
@@ -5463,8 +5579,8 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
|
|
|
5463
5579
|
let tag1Data;
|
|
5464
5580
|
try {
|
|
5465
5581
|
while (offsetExtraField < extraFieldNTFS.data.length && !tag1Data) {
|
|
5466
|
-
const tagValue = getUint16(extraFieldView, offsetExtraField);
|
|
5467
|
-
const attributeSize = getUint16(extraFieldView, offsetExtraField + 2);
|
|
5582
|
+
const tagValue = getUint16$1(extraFieldView, offsetExtraField);
|
|
5583
|
+
const attributeSize = getUint16$1(extraFieldView, offsetExtraField + 2);
|
|
5468
5584
|
if (tagValue == EXTRAFIELD_TYPE_NTFS_TAG1) {
|
|
5469
5585
|
tag1Data = extraFieldNTFS.data.slice(offsetExtraField + 4, offsetExtraField + 4 + attributeSize);
|
|
5470
5586
|
}
|
|
@@ -5497,12 +5613,12 @@ function readExtraFieldUnixDates(extraField, directory) {
|
|
|
5497
5613
|
return;
|
|
5498
5614
|
}
|
|
5499
5615
|
const extraFieldView = getDataView(extraField.data);
|
|
5500
|
-
const lastAccessDate = new Date((getUint32(extraFieldView, 0) | 0) * 1000);
|
|
5501
|
-
const lastModDate = new Date((getUint32(extraFieldView, 4) | 0) * 1000);
|
|
5616
|
+
const lastAccessDate = new Date((getUint32$1(extraFieldView, 0) | 0) * 1000);
|
|
5617
|
+
const lastModDate = new Date((getUint32$1(extraFieldView, 4) | 0) * 1000);
|
|
5502
5618
|
const extraFieldData = { lastAccessDate, lastModDate };
|
|
5503
5619
|
if (extraField.data.length >= 12) {
|
|
5504
|
-
extraFieldData.uid = getUint16(extraFieldView, 8);
|
|
5505
|
-
extraFieldData.gid = getUint16(extraFieldView, 10);
|
|
5620
|
+
extraFieldData.uid = getUint16$1(extraFieldView, 8);
|
|
5621
|
+
extraFieldData.gid = getUint16$1(extraFieldView, 10);
|
|
5506
5622
|
}
|
|
5507
5623
|
Object.assign(extraField, extraFieldData);
|
|
5508
5624
|
Object.assign(directory, extraFieldData);
|
|
@@ -5522,8 +5638,8 @@ function readExtraFieldUnix(extraField, directory, isInfoZip) {
|
|
|
5522
5638
|
gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
|
|
5523
5639
|
Object.assign(extraField, { version, uid, gid });
|
|
5524
5640
|
} else if (extraField.data.length >= 4) {
|
|
5525
|
-
uid = getUint16(view, 0);
|
|
5526
|
-
gid = getUint16(view, 2);
|
|
5641
|
+
uid = getUint16$1(view, 0);
|
|
5642
|
+
gid = getUint16$1(view, 2);
|
|
5527
5643
|
Object.assign(extraField, { uid, gid });
|
|
5528
5644
|
}
|
|
5529
5645
|
if (uid !== UNDEFINED_VALUE) {
|
|
@@ -5573,7 +5689,7 @@ function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory,
|
|
|
5573
5689
|
let offset = 1;
|
|
5574
5690
|
timeProperties.forEach((propertyName, indexProperty) => {
|
|
5575
5691
|
if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
|
|
5576
|
-
const time = getUint32(extraFieldView, offset);
|
|
5692
|
+
const time = getUint32$1(extraFieldView, offset);
|
|
5577
5693
|
directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
|
|
5578
5694
|
const rawPropertyName = timeRawProperties[indexProperty];
|
|
5579
5695
|
extraFieldExtendedTimestamp[rawPropertyName] = time;
|
|
@@ -5607,7 +5723,7 @@ async function detectOverlappingEntry({
|
|
|
5607
5723
|
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
|
|
5608
5724
|
const dataDescriptorView = getDataView(dataDescriptorArray);
|
|
5609
5725
|
let signature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
|
|
5610
|
-
getUint32(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
5726
|
+
getUint32$1(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
5611
5727
|
if (signature) {
|
|
5612
5728
|
const signedDataDescriptor = readDataDescriptor(dataDescriptorView, DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, extraFieldZip64);
|
|
5613
5729
|
const matchCrc32 = (fileEntry.encrypted && !fileEntry.zipCrypto) || signedDataDescriptor.crc32 == crc32;
|
|
@@ -5641,15 +5757,15 @@ async function detectOverlappingEntry({
|
|
|
5641
5757
|
}
|
|
5642
5758
|
|
|
5643
5759
|
function readDataDescriptor(dataDescriptorView, offset, extraFieldZip64) {
|
|
5644
|
-
const crc32 = getUint32(dataDescriptorView, offset);
|
|
5760
|
+
const crc32 = getUint32$1(dataDescriptorView, offset);
|
|
5645
5761
|
let compressedSize;
|
|
5646
5762
|
let uncompressedSize;
|
|
5647
5763
|
if (extraFieldZip64) {
|
|
5648
5764
|
compressedSize = getBigUint64(dataDescriptorView, offset + 4);
|
|
5649
5765
|
uncompressedSize = getBigUint64(dataDescriptorView, offset + 12);
|
|
5650
5766
|
} else {
|
|
5651
|
-
compressedSize = getUint32(dataDescriptorView, offset + 4);
|
|
5652
|
-
uncompressedSize = getUint32(dataDescriptorView, offset + 8);
|
|
5767
|
+
compressedSize = getUint32$1(dataDescriptorView, offset + 4);
|
|
5768
|
+
uncompressedSize = getUint32$1(dataDescriptorView, offset + 8);
|
|
5653
5769
|
}
|
|
5654
5770
|
return { crc32, compressedSize, uncompressedSize };
|
|
5655
5771
|
}
|
|
@@ -5658,10 +5774,28 @@ function getDiskOffset$1(reader, diskNumber) {
|
|
|
5658
5774
|
return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
|
|
5659
5775
|
}
|
|
5660
5776
|
|
|
5777
|
+
async function startsWithSplitZipSignature$1(reader) {
|
|
5778
|
+
return await getFirstSignature(reader) == SPLIT_ZIP_FILE_SIGNATURE;
|
|
5779
|
+
}
|
|
5780
|
+
|
|
5781
|
+
async function startsWithSplitZipMarker(reader) {
|
|
5782
|
+
const signature = await getFirstSignature(reader);
|
|
5783
|
+
return signature == SPLIT_ZIP_FILE_SIGNATURE || signature == TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE;
|
|
5784
|
+
}
|
|
5785
|
+
|
|
5786
|
+
async function getFirstSignature(reader) {
|
|
5787
|
+
const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
5788
|
+
return getUint32$1(getDataView(signatureArray));
|
|
5789
|
+
}
|
|
5790
|
+
|
|
5661
5791
|
function isStrictnessValue(value) {
|
|
5662
5792
|
return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
|
|
5663
5793
|
}
|
|
5664
5794
|
|
|
5795
|
+
function getDecodableOutputSize(outputSize, compressedSize, compressed) {
|
|
5796
|
+
return Math.min(outputSize, compressed ? compressedSize * MAX_DEFLATE_EXPANSION_RATIO : compressedSize);
|
|
5797
|
+
}
|
|
5798
|
+
|
|
5665
5799
|
function getStrictness(options, inheritedOptions) {
|
|
5666
5800
|
return resolveStrictness(options, resolveStrictness(inheritedOptions, STRICTNESS_BALANCED));
|
|
5667
5801
|
}
|
|
@@ -5724,7 +5858,7 @@ function isUnsafeFilename(filename, filenameValidation) {
|
|
|
5724
5858
|
|
|
5725
5859
|
function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
|
|
5726
5860
|
if (maxAppendedDataSize !== UNDEFINED_VALUE) {
|
|
5727
|
-
const size = toNumber
|
|
5861
|
+
const size = toNumber(maxAppendedDataSize);
|
|
5728
5862
|
if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
|
|
5729
5863
|
throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE);
|
|
5730
5864
|
}
|
|
@@ -5747,7 +5881,7 @@ async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDat
|
|
|
5747
5881
|
let plausibleEndOfDirectoryInfo;
|
|
5748
5882
|
let endOfDirectoryReachingEndCount = 0;
|
|
5749
5883
|
for await (const [anchoredView, anchoredOffset, anchoredArray, indexByte, offset] of scanEndOfCentralDirectory(reader, anchoredLength)) {
|
|
5750
|
-
const commentLength = getUint16(anchoredView, indexByte + 20);
|
|
5884
|
+
const commentLength = getUint16$1(anchoredView, indexByte + 20);
|
|
5751
5885
|
if (offset + END_OF_CENTRAL_DIR_LENGTH + commentLength == size) {
|
|
5752
5886
|
const reachability = await getCentralDirectoryReachability(reader, anchoredView, anchoredOffset, indexByte, offset, size, remoteProbeBudget);
|
|
5753
5887
|
if (reachability == CENTRAL_DIRECTORY_REACHABLE) {
|
|
@@ -5798,7 +5932,7 @@ async function* scanEndOfCentralDirectory(reader, scanLength) {
|
|
|
5798
5932
|
const scanArray = await readUint8Array(reader, scanOffset, scanLength);
|
|
5799
5933
|
const scanView = getDataView(scanArray);
|
|
5800
5934
|
for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
|
|
5801
|
-
if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
5935
|
+
if (getUint32$1(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
5802
5936
|
yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
|
|
5803
5937
|
}
|
|
5804
5938
|
}
|
|
@@ -5809,9 +5943,9 @@ function getEndOfCentralDirectoryInfo(scanArray, indexByte, offset) {
|
|
|
5809
5943
|
}
|
|
5810
5944
|
|
|
5811
5945
|
async function getCentralDirectoryReachability(reader, view, anchoredOffset, indexByte, offset, size, remoteProbeBudget) {
|
|
5812
|
-
const filesLength = getUint16(view, indexByte + 10);
|
|
5813
|
-
const directoryDataLength = getUint32(view, indexByte + 12);
|
|
5814
|
-
const directoryDataOffset = getUint32(view, indexByte + 16);
|
|
5946
|
+
const filesLength = getUint16$1(view, indexByte + 10);
|
|
5947
|
+
const directoryDataLength = getUint32$1(view, indexByte + 12);
|
|
5948
|
+
const directoryDataOffset = getUint32$1(view, indexByte + 16);
|
|
5815
5949
|
if (filesLength == MAX_16_BITS || directoryDataLength == MAX_32_BITS || directoryDataOffset == MAX_32_BITS) {
|
|
5816
5950
|
const locatorSignature = await readSignature(reader, view, anchoredOffset, offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, size, remoteProbeBudget);
|
|
5817
5951
|
return locatorSignature == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE ? CENTRAL_DIRECTORY_REACHABLE : CENTRAL_DIRECTORY_UNREACHABLE;
|
|
@@ -5819,7 +5953,7 @@ async function getCentralDirectoryReachability(reader, view, anchoredOffset, ind
|
|
|
5819
5953
|
if (!filesLength && !directoryDataLength) {
|
|
5820
5954
|
return CENTRAL_DIRECTORY_PLAUSIBLE;
|
|
5821
5955
|
}
|
|
5822
|
-
const directoryDiskNumber = getUint16(view, indexByte + 6);
|
|
5956
|
+
const directoryDiskNumber = getUint16$1(view, indexByte + 6);
|
|
5823
5957
|
for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
|
|
5824
5958
|
if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
5825
5959
|
return CENTRAL_DIRECTORY_REACHABLE;
|
|
@@ -5833,19 +5967,21 @@ async function readSignature(reader, view, anchoredOffset, signatureOffset, size
|
|
|
5833
5967
|
return UNDEFINED_VALUE;
|
|
5834
5968
|
}
|
|
5835
5969
|
if (signatureOffset >= anchoredOffset) {
|
|
5836
|
-
return getUint32(view, signatureOffset - anchoredOffset);
|
|
5970
|
+
return getUint32$1(view, signatureOffset - anchoredOffset);
|
|
5837
5971
|
}
|
|
5838
5972
|
if (remoteProbeBudget.count > 0) {
|
|
5839
5973
|
remoteProbeBudget.count--;
|
|
5840
5974
|
const signatureArray = await readUint8Array(reader, signatureOffset, 4);
|
|
5841
|
-
return getUint32(getDataView(signatureArray), 0);
|
|
5975
|
+
return getUint32$1(getDataView(signatureArray), 0);
|
|
5842
5976
|
}
|
|
5843
5977
|
return UNDEFINED_VALUE;
|
|
5844
5978
|
}
|
|
5845
5979
|
|
|
5846
5980
|
function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, checkLocalFilename) {
|
|
5847
5981
|
const { rawFilename } = zipEntry;
|
|
5848
|
-
|
|
5982
|
+
const maskedLocalDirectory = zipEntry.decryptedDirectory &&
|
|
5983
|
+
(localDirectory.rawBitFlag & BITFLAG_MASKED_LOCAL_HEADERS) == BITFLAG_MASKED_LOCAL_HEADERS;
|
|
5984
|
+
if (checkLocalFilename && !maskedLocalDirectory &&
|
|
5849
5985
|
(rawLocalFilename.length != rawFilename.length ||
|
|
5850
5986
|
rawLocalFilename.some((byteValue, indexByte) => byteValue != rawFilename[indexByte]))) {
|
|
5851
5987
|
throwAmbiguousArchive("mismatched local file header (filename)");
|
|
@@ -5856,7 +5992,7 @@ function validateLocalDirectory(zipEntry, localDirectory, rawLocalFilename, chec
|
|
|
5856
5992
|
if (localDirectory.compressionMethod != zipEntry.compressionMethod) {
|
|
5857
5993
|
throwAmbiguousArchive("mismatched local file header (compression method)");
|
|
5858
5994
|
}
|
|
5859
|
-
if (!localDirectory.bitFlag.dataDescriptor &&
|
|
5995
|
+
if (!localDirectory.bitFlag.dataDescriptor && !maskedLocalDirectory &&
|
|
5860
5996
|
(localDirectory.crc32 || localDirectory.compressedSize || localDirectory.uncompressedSize) &&
|
|
5861
5997
|
(localDirectory.crc32 != zipEntry.crc32 ||
|
|
5862
5998
|
localDirectory.compressedSize != zipEntry.compressedSize ||
|
|
@@ -5875,10 +6011,11 @@ function getOptionValue$1(zipReader, options, name) {
|
|
|
5875
6011
|
return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
|
|
5876
6012
|
}
|
|
5877
6013
|
|
|
5878
|
-
function
|
|
5879
|
-
return
|
|
6014
|
+
function getFunctionOptionValue$1(zipReader, options, name) {
|
|
6015
|
+
return checkFunctionOption(getOptionValue$1(zipReader, options, name));
|
|
5880
6016
|
}
|
|
5881
6017
|
|
|
6018
|
+
|
|
5882
6019
|
function getDate(timeRaw) {
|
|
5883
6020
|
const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
|
|
5884
6021
|
return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
|
|
@@ -5892,11 +6029,11 @@ function getUint8(view, offset) {
|
|
|
5892
6029
|
return view.getUint8(offset);
|
|
5893
6030
|
}
|
|
5894
6031
|
|
|
5895
|
-
function getUint16(view, offset) {
|
|
6032
|
+
function getUint16$1(view, offset) {
|
|
5896
6033
|
return view.getUint16(offset, true);
|
|
5897
6034
|
}
|
|
5898
6035
|
|
|
5899
|
-
function getUint32(view, offset) {
|
|
6036
|
+
function getUint32$1(view, offset) {
|
|
5900
6037
|
return view.getUint32(offset, true);
|
|
5901
6038
|
}
|
|
5902
6039
|
|
|
@@ -5911,6 +6048,7 @@ var zipReader = /*#__PURE__*/Object.freeze({
|
|
|
5911
6048
|
ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
|
|
5912
6049
|
ERR_ENCRYPTED: ERR_ENCRYPTED,
|
|
5913
6050
|
ERR_ENCRYPTED_CENTRAL_DIRECTORY: ERR_ENCRYPTED_CENTRAL_DIRECTORY,
|
|
6051
|
+
ERR_ENTRY_DATA_OUT_OF_BOUNDS: ERR_ENTRY_DATA_OUT_OF_BOUNDS,
|
|
5914
6052
|
ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
|
|
5915
6053
|
ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
|
|
5916
6054
|
ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
|
|
@@ -5967,12 +6105,16 @@ const ERR_DUPLICATED_NAME = "File already exists";
|
|
|
5967
6105
|
const ERR_INVALID_COMMENT = "Zip file comment exceeds 64KB";
|
|
5968
6106
|
const ERR_INVALID_COMMENT_TYPE = "Invalid zip file comment (must be a Uint8Array)";
|
|
5969
6107
|
const ERR_INVALID_ENTRY_COMMENT = "File entry comment exceeds 64KB";
|
|
6108
|
+
const ERR_INVALID_ENTRY_COMMENT_TYPE = "Invalid file entry comment (must be a string)";
|
|
6109
|
+
const ERR_INVALID_DATE = "Invalid date (must be a valid Date instance)";
|
|
5970
6110
|
const ERR_INVALID_ENTRY_NAME = "File entry name exceeds 64KB";
|
|
5971
6111
|
const ERR_INVALID_VERSION = "Version exceeds 65535";
|
|
5972
6112
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
5973
6113
|
const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
|
|
5974
6114
|
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
|
|
5975
|
-
const
|
|
6115
|
+
const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
|
|
6116
|
+
const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
|
|
6117
|
+
const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
|
|
5976
6118
|
const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
|
|
5977
6119
|
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
5978
6120
|
const MIN_UNIX_TIME = -2147483648;
|
|
@@ -5981,6 +6123,7 @@ const MIN_NTFS_TIME = BigInt(0);
|
|
|
5981
6123
|
const MAX_NTFS_TIME = BigInt("0x7fffffffffffffff");
|
|
5982
6124
|
const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
|
|
5983
6125
|
const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
|
|
6126
|
+
const ERR_UNDEFINED_COMPRESSION_METHOD = "Undefined compression method";
|
|
5984
6127
|
const ERR_UNDETERMINED_SIZE = "Undetermined size";
|
|
5985
6128
|
const ERR_UNDEFINED_READER = "Undefined reader";
|
|
5986
6129
|
const ERR_ZIP_NOT_EMPTY = "Zip file not empty";
|
|
@@ -5992,7 +6135,6 @@ const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldTyp
|
|
|
5992
6135
|
const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
|
|
5993
6136
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
5994
6137
|
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
5995
|
-
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
5996
6138
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
5997
6139
|
|
|
5998
6140
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
@@ -6017,8 +6159,7 @@ class ZipWriter {
|
|
|
6017
6159
|
writer,
|
|
6018
6160
|
addSplitZipSignature,
|
|
6019
6161
|
options,
|
|
6020
|
-
|
|
6021
|
-
files: new Map(),
|
|
6162
|
+
fileEntries: new Map(),
|
|
6022
6163
|
filenames: new Set(),
|
|
6023
6164
|
offset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options[OPTION_OFFSET],
|
|
6024
6165
|
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
@@ -6039,14 +6180,23 @@ class ZipWriter {
|
|
|
6039
6180
|
await initStream(reader);
|
|
6040
6181
|
}
|
|
6041
6182
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6042
|
-
const zipReader$1 = new ZipReader(reader
|
|
6183
|
+
const zipReader$1 = new ZipReader(reader);
|
|
6043
6184
|
const entries = await zipReader$1.getEntries();
|
|
6044
6185
|
await zipReader$1.close();
|
|
6045
6186
|
await initStream(this.writer);
|
|
6046
|
-
|
|
6047
|
-
|
|
6187
|
+
const { directoryOffset } = zipReader$1;
|
|
6188
|
+
let splitZipSignatureLength = 0;
|
|
6189
|
+
if (this.addSplitZipSignature) {
|
|
6190
|
+
delete this.addSplitZipSignature;
|
|
6191
|
+
if (!await startsWithSplitZipSignature(reader)) {
|
|
6192
|
+
await writeData(this.writer, getSplitZipSignatureArray());
|
|
6193
|
+
splitZipSignatureLength = SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6194
|
+
this.offset += splitZipSignatureLength;
|
|
6195
|
+
}
|
|
6196
|
+
}
|
|
6197
|
+
const entryPositions = await copyZipData(this, reader, entries, directoryOffset, splitZipSignatureLength);
|
|
6048
6198
|
this.filenames = new Set(entries.map(entry => entry.filename));
|
|
6049
|
-
this.
|
|
6199
|
+
this.fileEntries = new Map(entries.map(entry => {
|
|
6050
6200
|
const {
|
|
6051
6201
|
version,
|
|
6052
6202
|
rawLastModDate,
|
|
@@ -6101,11 +6251,12 @@ class ZipWriter {
|
|
|
6101
6251
|
if (crc32 !== UNDEFINED_VALUE) {
|
|
6102
6252
|
setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
|
|
6103
6253
|
}
|
|
6254
|
+
const { offset, diskNumberStart } = entryPositions.get(entry);
|
|
6104
6255
|
Object.assign(entry, {
|
|
6105
6256
|
zip64UncompressedSize,
|
|
6106
6257
|
zip64CompressedSize,
|
|
6107
|
-
|
|
6108
|
-
diskNumberStart
|
|
6258
|
+
offset,
|
|
6259
|
+
diskNumberStart,
|
|
6109
6260
|
zip64DiskNumberStart: false,
|
|
6110
6261
|
rawExtraFieldZip64,
|
|
6111
6262
|
rawExtraFieldAES,
|
|
@@ -6125,11 +6276,8 @@ class ZipWriter {
|
|
|
6125
6276
|
async add(name = "", reader, options = {}) {
|
|
6126
6277
|
const zipWriter = this;
|
|
6127
6278
|
options = Object.assign({}, options);
|
|
6128
|
-
const {
|
|
6129
|
-
|
|
6130
|
-
config
|
|
6131
|
-
} = zipWriter;
|
|
6132
|
-
if (workers < config.maxWorkers) {
|
|
6279
|
+
const { pendingAddFileCalls } = zipWriter;
|
|
6280
|
+
if (workers < getConfiguration().maxWorkers) {
|
|
6133
6281
|
workers++;
|
|
6134
6282
|
} else {
|
|
6135
6283
|
await new Promise(resolve => pendingEntries.push(resolve));
|
|
@@ -6166,16 +6314,16 @@ class ZipWriter {
|
|
|
6166
6314
|
}
|
|
6167
6315
|
|
|
6168
6316
|
remove(entry) {
|
|
6169
|
-
const { filenames,
|
|
6317
|
+
const { filenames, fileEntries } = this;
|
|
6170
6318
|
// deno-lint-ignore valid-typeof
|
|
6171
6319
|
if (typeof entry == STRING_TYPE) {
|
|
6172
|
-
entry =
|
|
6320
|
+
entry = fileEntries.get(entry);
|
|
6173
6321
|
}
|
|
6174
6322
|
if (entry && entry.filename !== UNDEFINED_VALUE) {
|
|
6175
6323
|
const { filename } = entry;
|
|
6176
|
-
if (filenames.has(filename) &&
|
|
6324
|
+
if (filenames.has(filename) && fileEntries.has(filename)) {
|
|
6177
6325
|
filenames.delete(filename);
|
|
6178
|
-
|
|
6326
|
+
fileEntries.delete(filename);
|
|
6179
6327
|
return true;
|
|
6180
6328
|
}
|
|
6181
6329
|
}
|
|
@@ -6272,12 +6420,12 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
6272
6420
|
const metadataInfo = resolveMetadata(zipWriter, name, options);
|
|
6273
6421
|
const { comment } = metadataInfo;
|
|
6274
6422
|
const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
|
|
6275
|
-
zipWriter.
|
|
6423
|
+
zipWriter.fileEntries.set(name, UNDEFINED_VALUE);
|
|
6276
6424
|
let fileEntry;
|
|
6277
6425
|
try {
|
|
6278
6426
|
const { resolvedOptions } = metadataInfo;
|
|
6279
6427
|
if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
|
|
6280
|
-
!resolvedOptions.passThrough && !(await supportsDeflate(
|
|
6428
|
+
!resolvedOptions.passThrough && !(await supportsDeflate(getConfiguration()))) {
|
|
6281
6429
|
resolvedOptions.level = 0;
|
|
6282
6430
|
}
|
|
6283
6431
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
@@ -6295,7 +6443,7 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
6295
6443
|
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
6296
6444
|
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
6297
6445
|
} catch (error) {
|
|
6298
|
-
zipWriter.
|
|
6446
|
+
zipWriter.fileEntries.delete(name);
|
|
6299
6447
|
throw error;
|
|
6300
6448
|
}
|
|
6301
6449
|
Object.assign(fileEntry, {
|
|
@@ -6339,9 +6487,9 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6339
6487
|
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
6340
6488
|
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE$1;
|
|
6341
6489
|
}
|
|
6342
|
-
let msdosAttributesRaw =
|
|
6490
|
+
let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
6343
6491
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
6344
|
-
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType;
|
|
6492
|
+
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType || executable;
|
|
6345
6493
|
const hasMsDosProvided = msdosAttributesRaw !== UNDEFINED_VALUE || msdosAttributes !== UNDEFINED_VALUE;
|
|
6346
6494
|
if (hasUnixMetadata) {
|
|
6347
6495
|
msDosCompatible = false;
|
|
@@ -6350,10 +6498,10 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6350
6498
|
msDosCompatible = true;
|
|
6351
6499
|
versionMadeBy = (versionMadeBy & MAX_8_BITS);
|
|
6352
6500
|
}
|
|
6353
|
-
if (msdosAttributesRaw !== UNDEFINED_VALUE && (msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
|
|
6501
|
+
if (msdosAttributesRaw !== UNDEFINED_VALUE && (!Number.isInteger(msdosAttributesRaw) || msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
|
|
6354
6502
|
throw new Error(ERR_INVALID_MSDOS_ATTRIBUTES);
|
|
6355
6503
|
}
|
|
6356
|
-
if (msdosAttributes && typeof msdosAttributes !== OBJECT_TYPE) {
|
|
6504
|
+
if (msdosAttributes && (typeof msdosAttributes !== OBJECT_TYPE || Array.isArray(msdosAttributes))) {
|
|
6357
6505
|
throw new Error(ERR_INVALID_MSDOS_DATA);
|
|
6358
6506
|
}
|
|
6359
6507
|
if (versionMadeBy > MAX_16_BITS) {
|
|
@@ -6441,7 +6589,7 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6441
6589
|
}
|
|
6442
6590
|
|
|
6443
6591
|
function resolveMetadata(zipWriter, name, options) {
|
|
6444
|
-
const encode =
|
|
6592
|
+
const encode = getFunctionOptionValue(zipWriter, options, OPTION_ENCODE_TEXT) || encodeText;
|
|
6445
6593
|
let rawFilename = encode(name, TEXT_TYPE_FILENAME);
|
|
6446
6594
|
if (rawFilename === UNDEFINED_VALUE) {
|
|
6447
6595
|
rawFilename = encodeText(name);
|
|
@@ -6450,6 +6598,10 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6450
6598
|
throw new Error(ERR_INVALID_ENTRY_NAME);
|
|
6451
6599
|
}
|
|
6452
6600
|
const comment = options[PROPERTY_NAME_COMMENT] || "";
|
|
6601
|
+
// deno-lint-ignore valid-typeof
|
|
6602
|
+
if (typeof comment != STRING_TYPE) {
|
|
6603
|
+
throw new Error(ERR_INVALID_ENTRY_COMMENT_TYPE);
|
|
6604
|
+
}
|
|
6453
6605
|
let rawComment = encode(comment, TEXT_TYPE_COMMENT);
|
|
6454
6606
|
if (rawComment === UNDEFINED_VALUE) {
|
|
6455
6607
|
rawComment = encodeText(comment);
|
|
@@ -6461,16 +6613,14 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6461
6613
|
if (version > MAX_16_BITS) {
|
|
6462
6614
|
throw new Error(ERR_INVALID_VERSION);
|
|
6463
6615
|
}
|
|
6464
|
-
const lastModDate =
|
|
6465
|
-
const lastAccessDate =
|
|
6466
|
-
const creationDate =
|
|
6616
|
+
const lastModDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE, new Date());
|
|
6617
|
+
const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
|
|
6618
|
+
const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
|
|
6467
6619
|
const internalFileAttributes = getAliasedOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, PROPERTY_NAME_DEPRECATED_INTERNAL_FILE_ATTRIBUTES, 0);
|
|
6468
6620
|
const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
|
|
6469
6621
|
const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6470
6622
|
const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6471
|
-
|
|
6472
|
-
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
6473
|
-
}
|
|
6623
|
+
checkPasswordOption(password, rawPassword);
|
|
6474
6624
|
const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
|
|
6475
6625
|
const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
|
|
6476
6626
|
const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
|
|
@@ -6479,9 +6629,9 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6479
6629
|
const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
|
|
6480
6630
|
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
|
|
6481
6631
|
const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
|
|
6482
|
-
const createTempStream =
|
|
6632
|
+
const createTempStream = getFunctionOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
6483
6633
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
6484
|
-
const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
|
|
6634
|
+
const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
|
|
6485
6635
|
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
|
|
6486
6636
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
6487
6637
|
const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
@@ -6501,6 +6651,9 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6501
6651
|
level = 0;
|
|
6502
6652
|
}
|
|
6503
6653
|
}
|
|
6654
|
+
if (passThrough) {
|
|
6655
|
+
level = UNDEFINED_VALUE;
|
|
6656
|
+
}
|
|
6504
6657
|
let useCompressionStream = getOptionValue(zipWriter, options, OPTION_USE_COMPRESSION_STREAM);
|
|
6505
6658
|
let dataDescriptor = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR);
|
|
6506
6659
|
if (bufferedWrite && dataDescriptor === UNDEFINED_VALUE) {
|
|
@@ -6561,18 +6714,26 @@ function serializeExtraField(extraField) {
|
|
|
6561
6714
|
if (!extraField) {
|
|
6562
6715
|
return EMPTY_UINT8_ARRAY;
|
|
6563
6716
|
}
|
|
6717
|
+
if (!(extraField instanceof Map)) {
|
|
6718
|
+
throw new Error(ERR_INVALID_EXTRAFIELD);
|
|
6719
|
+
}
|
|
6564
6720
|
let extraFieldSize = 0;
|
|
6565
6721
|
let offset = 0;
|
|
6566
|
-
extraField.forEach(data => extraFieldSize += 4 + getLength(data));
|
|
6567
|
-
const rawExtraField = new Uint8Array(extraFieldSize);
|
|
6568
|
-
const rawExtraFieldView = getDataView(rawExtraField);
|
|
6569
6722
|
extraField.forEach((data, type) => {
|
|
6570
|
-
if (type > MAX_16_BITS) {
|
|
6723
|
+
if (!Number.isInteger(type) || type < 0 || type > MAX_16_BITS) {
|
|
6571
6724
|
throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
|
|
6572
6725
|
}
|
|
6726
|
+
if (!(data instanceof Uint8Array)) {
|
|
6727
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA_TYPE);
|
|
6728
|
+
}
|
|
6573
6729
|
if (getLength(data) > MAX_16_BITS) {
|
|
6574
6730
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
6575
6731
|
}
|
|
6732
|
+
extraFieldSize += 4 + getLength(data);
|
|
6733
|
+
});
|
|
6734
|
+
const rawExtraField = new Uint8Array(extraFieldSize);
|
|
6735
|
+
const rawExtraFieldView = getDataView(rawExtraField);
|
|
6736
|
+
extraField.forEach((data, type) => {
|
|
6576
6737
|
setUint16(rawExtraFieldView, offset, type);
|
|
6577
6738
|
setUint16(rawExtraFieldView, offset + 2, getLength(data));
|
|
6578
6739
|
arraySet(rawExtraField, data, offset + 4);
|
|
@@ -6604,6 +6765,9 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
|
|
|
6604
6765
|
if (uncompressedSize === UNDEFINED_VALUE) {
|
|
6605
6766
|
throw new Error(ERR_UNDEFINED_UNCOMPRESSED_SIZE);
|
|
6606
6767
|
}
|
|
6768
|
+
if (compressionMethod === UNDEFINED_VALUE) {
|
|
6769
|
+
throw new Error(ERR_UNDEFINED_COMPRESSION_METHOD);
|
|
6770
|
+
}
|
|
6607
6771
|
}
|
|
6608
6772
|
const zip64Enabled = zip64 === true;
|
|
6609
6773
|
const encrypted = getOptionValue(zipWriter, options, PROPERTY_NAME_ENCRYPTED);
|
|
@@ -6659,8 +6823,8 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
|
|
|
6659
6823
|
}
|
|
6660
6824
|
|
|
6661
6825
|
async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comment) {
|
|
6662
|
-
const zipWriter = { options: writerOptions
|
|
6663
|
-
if (writerOptions[OPTION_SIGN_CENTRAL_DIRECTORY]) {
|
|
6826
|
+
const zipWriter = { options: writerOptions };
|
|
6827
|
+
if (checkFunctionOption(writerOptions[OPTION_SIGN_CENTRAL_DIRECTORY])) {
|
|
6664
6828
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
6665
6829
|
}
|
|
6666
6830
|
if (comment !== UNDEFINED_VALUE && !(comment instanceof Uint8Array)) {
|
|
@@ -6686,7 +6850,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
6686
6850
|
({ name } = attributesInfo);
|
|
6687
6851
|
const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
|
|
6688
6852
|
if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
|
|
6689
|
-
!metadata.passThrough && !(await supportsDeflate(
|
|
6853
|
+
!metadata.passThrough && !(await supportsDeflate(getConfiguration()))) {
|
|
6690
6854
|
metadata.level = 0;
|
|
6691
6855
|
}
|
|
6692
6856
|
const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
|
|
@@ -6735,7 +6899,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
6735
6899
|
|
|
6736
6900
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
6737
6901
|
const {
|
|
6738
|
-
|
|
6902
|
+
fileEntries,
|
|
6739
6903
|
writer
|
|
6740
6904
|
} = zipWriter;
|
|
6741
6905
|
const {
|
|
@@ -6757,12 +6921,12 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6757
6921
|
let writerSizeBeforeEntry;
|
|
6758
6922
|
let flushedBufferedSize = 0;
|
|
6759
6923
|
let fileWriter;
|
|
6760
|
-
|
|
6924
|
+
fileEntries.set(name, fileEntry);
|
|
6761
6925
|
zipWriter.lastFileEntry = fileEntry;
|
|
6762
6926
|
try {
|
|
6763
6927
|
let lockPreviousFileEntry;
|
|
6764
6928
|
if (keepOrder) {
|
|
6765
|
-
lockPreviousFileEntry = previousFileEntry && previousFileEntry.
|
|
6929
|
+
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
|
|
6766
6930
|
requestLockCurrentFileEntry();
|
|
6767
6931
|
}
|
|
6768
6932
|
if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
|
|
@@ -6783,11 +6947,8 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6783
6947
|
const diskOffset = getDiskOffset(writer);
|
|
6784
6948
|
if (zipWriter.addSplitZipSignature) {
|
|
6785
6949
|
delete zipWriter.addSplitZipSignature;
|
|
6786
|
-
|
|
6787
|
-
|
|
6788
|
-
setUint32(signatureArrayView, 0, SPLIT_ZIP_FILE_SIGNATURE);
|
|
6789
|
-
await writeData(writer, signatureArray);
|
|
6790
|
-
zipWriter.offset += 4;
|
|
6950
|
+
await writeData(writer, getSplitZipSignatureArray());
|
|
6951
|
+
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6791
6952
|
}
|
|
6792
6953
|
if (usdz && !bufferedWrite) {
|
|
6793
6954
|
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
|
|
@@ -6805,11 +6966,11 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6805
6966
|
writerSizeBeforeEntry = writer.size;
|
|
6806
6967
|
await writeData(fileWriter, localHeaderArray);
|
|
6807
6968
|
}
|
|
6808
|
-
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo,
|
|
6969
|
+
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, getConfiguration(), options);
|
|
6809
6970
|
if (!bufferedWrite) {
|
|
6810
6971
|
writingEntryData = false;
|
|
6811
6972
|
}
|
|
6812
|
-
|
|
6973
|
+
fileEntries.set(name, fileEntry);
|
|
6813
6974
|
fileEntry.filename = name;
|
|
6814
6975
|
if (bufferedWrite) {
|
|
6815
6976
|
await Promise.all([fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
|
|
@@ -6850,7 +7011,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6850
7011
|
zipWriter.offset += flushedBufferedSize;
|
|
6851
7012
|
}
|
|
6852
7013
|
}
|
|
6853
|
-
|
|
7014
|
+
fileEntries.delete(name);
|
|
6854
7015
|
throw error;
|
|
6855
7016
|
} finally {
|
|
6856
7017
|
if (bufferedWrite) {
|
|
@@ -6872,7 +7033,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6872
7033
|
}
|
|
6873
7034
|
|
|
6874
7035
|
function requestLockCurrentFileEntry() {
|
|
6875
|
-
fileEntry.
|
|
7036
|
+
fileEntry.lockFileEntry = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
|
|
6876
7037
|
}
|
|
6877
7038
|
|
|
6878
7039
|
async function requestLockWriter() {
|
|
@@ -6892,7 +7053,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6892
7053
|
}
|
|
6893
7054
|
}
|
|
6894
7055
|
|
|
6895
|
-
async function createFileEntry(reader, writer, { diskNumberStart,
|
|
7056
|
+
async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry }, entryInfo, config, options) {
|
|
6896
7057
|
const {
|
|
6897
7058
|
headerInfo,
|
|
6898
7059
|
dataDescriptorInfo,
|
|
@@ -6960,7 +7121,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
|
|
|
6960
7121
|
codecURI
|
|
6961
7122
|
} = options;
|
|
6962
7123
|
const fileEntry = {
|
|
6963
|
-
|
|
7124
|
+
lockFileEntry,
|
|
6964
7125
|
versionMadeBy,
|
|
6965
7126
|
zip64,
|
|
6966
7127
|
directory: Boolean(directory),
|
|
@@ -7002,7 +7163,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
|
|
|
7002
7163
|
}
|
|
7003
7164
|
const { writable } = writer;
|
|
7004
7165
|
if (reader) {
|
|
7005
|
-
const readable = toCompatibleReadable(
|
|
7166
|
+
const readable = toCompatibleReadable(createReadable(reader));
|
|
7006
7167
|
const size = reader.size;
|
|
7007
7168
|
const workerOptions = {
|
|
7008
7169
|
options: {
|
|
@@ -7114,14 +7275,14 @@ function getHeaderInfo(options) {
|
|
|
7114
7275
|
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
7115
7276
|
const length = 4 + 16;
|
|
7116
7277
|
const extraFieldZip64 = createRecordWriter(length);
|
|
7117
|
-
extraFieldZip64.
|
|
7118
|
-
extraFieldZip64.
|
|
7278
|
+
extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
|
|
7279
|
+
extraFieldZip64.writeUint16(length - 4);
|
|
7119
7280
|
rawLocalExtraFieldZip64 = extraFieldZip64.array;
|
|
7120
7281
|
if (zip64ExtraFieldComplete) {
|
|
7121
|
-
extraFieldZip64.
|
|
7282
|
+
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7122
7283
|
if (uncompressedFile) {
|
|
7123
7284
|
const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
7124
|
-
extraFieldZip64.
|
|
7285
|
+
extraFieldZip64.writeUint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
|
|
7125
7286
|
}
|
|
7126
7287
|
}
|
|
7127
7288
|
} else {
|
|
@@ -7130,8 +7291,8 @@ function getHeaderInfo(options) {
|
|
|
7130
7291
|
let rawExtraFieldAES;
|
|
7131
7292
|
if (encrypted && !zipCrypto) {
|
|
7132
7293
|
const extraFieldAES = createRecordWriter(getLength(EXTRAFIELD_DATA_AES) + 2);
|
|
7133
|
-
extraFieldAES.
|
|
7134
|
-
extraFieldAES.
|
|
7294
|
+
extraFieldAES.writeUint16(EXTRAFIELD_TYPE_AES);
|
|
7295
|
+
extraFieldAES.writeBytes(EXTRAFIELD_DATA_AES);
|
|
7135
7296
|
rawExtraFieldAES = extraFieldAES.array;
|
|
7136
7297
|
rawExtraFieldAES[8] = encryptionStrength;
|
|
7137
7298
|
} else {
|
|
@@ -7147,15 +7308,15 @@ function getHeaderInfo(options) {
|
|
|
7147
7308
|
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
7148
7309
|
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
7149
7310
|
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
7150
|
-
extraFieldTimestamp.
|
|
7151
|
-
extraFieldTimestamp.
|
|
7152
|
-
extraFieldTimestamp.
|
|
7153
|
-
extraFieldTimestamp.
|
|
7311
|
+
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7312
|
+
extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
|
|
7313
|
+
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7314
|
+
extraFieldTimestamp.writeUint32(lastModTimeUnix);
|
|
7154
7315
|
if (lastAccessDate) {
|
|
7155
|
-
extraFieldTimestamp.
|
|
7316
|
+
extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(lastAccessDate)));
|
|
7156
7317
|
}
|
|
7157
7318
|
if (creationDate) {
|
|
7158
|
-
extraFieldTimestamp.
|
|
7319
|
+
extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(creationDate)));
|
|
7159
7320
|
}
|
|
7160
7321
|
rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
|
|
7161
7322
|
} else {
|
|
@@ -7168,14 +7329,14 @@ function getHeaderInfo(options) {
|
|
|
7168
7329
|
try {
|
|
7169
7330
|
const lastModTimeNTFS = getTimeNTFS(lastModDate);
|
|
7170
7331
|
const extraFieldNTFS = createRecordWriter(36);
|
|
7171
|
-
extraFieldNTFS.
|
|
7172
|
-
extraFieldNTFS.
|
|
7332
|
+
extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS);
|
|
7333
|
+
extraFieldNTFS.writeUint16(32);
|
|
7173
7334
|
extraFieldNTFS.skip(4);
|
|
7174
|
-
extraFieldNTFS.
|
|
7175
|
-
extraFieldNTFS.
|
|
7176
|
-
extraFieldNTFS.
|
|
7177
|
-
extraFieldNTFS.
|
|
7178
|
-
extraFieldNTFS.
|
|
7335
|
+
extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS_TAG1);
|
|
7336
|
+
extraFieldNTFS.writeUint16(24);
|
|
7337
|
+
extraFieldNTFS.writeUint64(lastModTimeNTFS);
|
|
7338
|
+
extraFieldNTFS.writeUint64(lastAccessDate ? getTimeNTFS(lastAccessDate) : lastModTimeNTFS);
|
|
7339
|
+
extraFieldNTFS.writeUint64(creationDate ? getTimeNTFS(creationDate) : lastModTimeNTFS);
|
|
7179
7340
|
rawExtraFieldNTFS = extraFieldNTFS.array;
|
|
7180
7341
|
} catch {
|
|
7181
7342
|
rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
|
|
@@ -7194,20 +7355,20 @@ function getHeaderInfo(options) {
|
|
|
7194
7355
|
const gidBytes = packUnixId(gid);
|
|
7195
7356
|
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
7196
7357
|
const extraFieldUnix = createRecordWriter(4 + payloadLength);
|
|
7197
|
-
extraFieldUnix.
|
|
7198
|
-
extraFieldUnix.
|
|
7199
|
-
extraFieldUnix.
|
|
7200
|
-
extraFieldUnix.
|
|
7201
|
-
extraFieldUnix.
|
|
7202
|
-
extraFieldUnix.
|
|
7203
|
-
extraFieldUnix.
|
|
7358
|
+
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_INFOZIP);
|
|
7359
|
+
extraFieldUnix.writeUint16(payloadLength);
|
|
7360
|
+
extraFieldUnix.writeUint8(1);
|
|
7361
|
+
extraFieldUnix.writeUint8(uidBytes.length);
|
|
7362
|
+
extraFieldUnix.writeBytes(uidBytes);
|
|
7363
|
+
extraFieldUnix.writeUint8(gidBytes.length);
|
|
7364
|
+
extraFieldUnix.writeBytes(gidBytes);
|
|
7204
7365
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
7205
7366
|
} else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
7206
7367
|
const extraFieldUnix = createRecordWriter(8);
|
|
7207
|
-
extraFieldUnix.
|
|
7208
|
-
extraFieldUnix.
|
|
7209
|
-
extraFieldUnix.
|
|
7210
|
-
extraFieldUnix.
|
|
7368
|
+
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
|
|
7369
|
+
extraFieldUnix.writeUint16(4);
|
|
7370
|
+
extraFieldUnix.writeUint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
|
|
7371
|
+
extraFieldUnix.writeUint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
|
|
7211
7372
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
7212
7373
|
} else {
|
|
7213
7374
|
rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
|
|
@@ -7257,18 +7418,18 @@ function getHeaderInfo(options) {
|
|
|
7257
7418
|
const localHeader = createRecordWriter(HEADER_SIZE + getLength(rawFilename) + extraFieldLength);
|
|
7258
7419
|
const localHeaderArray = localHeader.array;
|
|
7259
7420
|
const localHeaderView = getDataView(localHeaderArray);
|
|
7260
|
-
localHeader.
|
|
7261
|
-
localHeader.
|
|
7262
|
-
localHeader.
|
|
7421
|
+
localHeader.writeUint32(LOCAL_FILE_HEADER_SIGNATURE);
|
|
7422
|
+
localHeader.writeBytes(headerArray);
|
|
7423
|
+
localHeader.writeBytes(rawFilename);
|
|
7263
7424
|
if (writeLocalExtraFieldZip64) {
|
|
7264
|
-
localHeader.
|
|
7265
|
-
}
|
|
7266
|
-
localHeader.
|
|
7267
|
-
localHeader.
|
|
7268
|
-
localHeader.
|
|
7269
|
-
localHeader.
|
|
7270
|
-
localHeader.
|
|
7271
|
-
localHeader.
|
|
7425
|
+
localHeader.writeBytes(rawLocalExtraFieldZip64);
|
|
7426
|
+
}
|
|
7427
|
+
localHeader.writeBytes(rawExtraFieldAES);
|
|
7428
|
+
localHeader.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
7429
|
+
localHeader.writeBytes(rawExtraFieldNTFS);
|
|
7430
|
+
localHeader.writeBytes(rawExtraFieldUnix);
|
|
7431
|
+
localHeader.writeBytes(rawExtraField);
|
|
7432
|
+
localHeader.writeBytes(rawLocalExtraField);
|
|
7272
7433
|
if (dataDescriptor) {
|
|
7273
7434
|
if (!zip64CompressedSize) {
|
|
7274
7435
|
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
@@ -7458,7 +7619,7 @@ function updateLocalHeader({
|
|
|
7458
7619
|
|
|
7459
7620
|
|
|
7460
7621
|
async function closeFile(zipWriter, comment, options) {
|
|
7461
|
-
const directoryDataLength = createDirectoryRecords(zipWriter.
|
|
7622
|
+
const directoryDataLength = createDirectoryRecords(zipWriter.fileEntries);
|
|
7462
7623
|
const { directoryStart, directoryArray } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
|
|
7463
7624
|
const signatureLength = await writeDigitalSignatureRecord(zipWriter, directoryArray, options);
|
|
7464
7625
|
await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength, signatureLength });
|
|
@@ -7488,19 +7649,19 @@ function createDirectoryRecords(files) {
|
|
|
7488
7649
|
if (zip64Offset || zip64DiskNumberStart || zip64UncompressedSize || zip64CompressedSize) {
|
|
7489
7650
|
const length = 4 + (zip64UncompressedSize ? 8 : 0) + (zip64CompressedSize ? 8 : 0) + (zip64Offset ? 8 : 0) + (zip64DiskNumberStart ? 4 : 0);
|
|
7490
7651
|
const extraFieldZip64 = createRecordWriter(length);
|
|
7491
|
-
extraFieldZip64.
|
|
7492
|
-
extraFieldZip64.
|
|
7652
|
+
extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
|
|
7653
|
+
extraFieldZip64.writeUint16(length - 4);
|
|
7493
7654
|
if (zip64UncompressedSize) {
|
|
7494
|
-
extraFieldZip64.
|
|
7655
|
+
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7495
7656
|
}
|
|
7496
7657
|
if (zip64CompressedSize) {
|
|
7497
|
-
extraFieldZip64.
|
|
7658
|
+
extraFieldZip64.writeUint64(compressedSize);
|
|
7498
7659
|
}
|
|
7499
7660
|
if (zip64Offset) {
|
|
7500
|
-
extraFieldZip64.
|
|
7661
|
+
extraFieldZip64.writeUint64(fileEntry.offset);
|
|
7501
7662
|
}
|
|
7502
7663
|
if (zip64DiskNumberStart) {
|
|
7503
|
-
extraFieldZip64.
|
|
7664
|
+
extraFieldZip64.writeUint32(fileEntry.diskNumberStart);
|
|
7504
7665
|
}
|
|
7505
7666
|
rawExtraFieldZip64 = extraFieldZip64.array;
|
|
7506
7667
|
} else {
|
|
@@ -7513,10 +7674,10 @@ function createDirectoryRecords(files) {
|
|
|
7513
7674
|
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
7514
7675
|
if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
|
|
7515
7676
|
const extraFieldTimestamp = createRecordWriter(9);
|
|
7516
|
-
extraFieldTimestamp.
|
|
7517
|
-
extraFieldTimestamp.
|
|
7518
|
-
extraFieldTimestamp.
|
|
7519
|
-
extraFieldTimestamp.
|
|
7677
|
+
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7678
|
+
extraFieldTimestamp.writeUint16(5);
|
|
7679
|
+
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7680
|
+
extraFieldTimestamp.writeUint32(lastModTimeUnix);
|
|
7520
7681
|
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
7521
7682
|
} else {
|
|
7522
7683
|
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
@@ -7538,14 +7699,14 @@ function createDirectoryRecords(files) {
|
|
|
7538
7699
|
}
|
|
7539
7700
|
|
|
7540
7701
|
async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
7541
|
-
const {
|
|
7702
|
+
const { fileEntries, writer } = zipWriter;
|
|
7542
7703
|
const directoryArray = new Uint8Array(directoryDataLength);
|
|
7543
7704
|
await initStream(writer);
|
|
7544
7705
|
let offset = 0;
|
|
7545
7706
|
let directoryDiskOffset = 0;
|
|
7546
7707
|
let directoryStartDiskNumber = getDiskNumber(writer);
|
|
7547
7708
|
let directoryStartDiskOffset = getDiskOffset(writer);
|
|
7548
|
-
for (const [indexFileEntry, fileEntry] of Array.from(
|
|
7709
|
+
for (const [indexFileEntry, fileEntry] of Array.from(fileEntries.values()).entries()) {
|
|
7549
7710
|
const {
|
|
7550
7711
|
offset: fileEntryOffset,
|
|
7551
7712
|
rawFilename,
|
|
@@ -7590,28 +7751,28 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
|
7590
7751
|
setUint16(headerView, HEADER_OFFSET_VERSION, VERSION_ZIP64);
|
|
7591
7752
|
}
|
|
7592
7753
|
const directoryRecord = createRecordWriter(directoryRecordLength);
|
|
7593
|
-
directoryRecord.
|
|
7594
|
-
directoryRecord.
|
|
7595
|
-
directoryRecord.
|
|
7596
|
-
directoryRecord.
|
|
7597
|
-
directoryRecord.
|
|
7598
|
-
directoryRecord.
|
|
7599
|
-
directoryRecord.
|
|
7600
|
-
directoryRecord.
|
|
7601
|
-
directoryRecord.
|
|
7602
|
-
directoryRecord.
|
|
7603
|
-
directoryRecord.
|
|
7604
|
-
directoryRecord.
|
|
7605
|
-
directoryRecord.
|
|
7606
|
-
directoryRecord.
|
|
7607
|
-
directoryRecord.
|
|
7608
|
-
directoryRecord.
|
|
7609
|
-
directoryRecord.
|
|
7754
|
+
directoryRecord.writeUint32(CENTRAL_FILE_HEADER_SIGNATURE);
|
|
7755
|
+
directoryRecord.writeUint16(versionMadeBy);
|
|
7756
|
+
directoryRecord.writeBytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
|
|
7757
|
+
directoryRecord.writeUint16(extraFieldLength);
|
|
7758
|
+
directoryRecord.writeUint16(getLength(rawComment));
|
|
7759
|
+
directoryRecord.writeUint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
|
|
7760
|
+
directoryRecord.writeUint16(internalFileAttributes);
|
|
7761
|
+
directoryRecord.writeUint32(externalFileAttributes);
|
|
7762
|
+
directoryRecord.writeUint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
|
|
7763
|
+
directoryRecord.writeBytes(rawFilename);
|
|
7764
|
+
directoryRecord.writeBytes(rawExtraFieldZip64);
|
|
7765
|
+
directoryRecord.writeBytes(rawExtraFieldAES);
|
|
7766
|
+
directoryRecord.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
7767
|
+
directoryRecord.writeBytes(rawExtraFieldNTFS);
|
|
7768
|
+
directoryRecord.writeBytes(rawExtraFieldUnix);
|
|
7769
|
+
directoryRecord.writeBytes(rawExtraField);
|
|
7770
|
+
directoryRecord.writeBytes(rawComment);
|
|
7610
7771
|
arraySet(directoryArray, directoryRecord.array, offset);
|
|
7611
7772
|
offset += directoryRecordLength;
|
|
7612
7773
|
if (options.onprogress) {
|
|
7613
7774
|
try {
|
|
7614
|
-
await options.onprogress(indexFileEntry + 1,
|
|
7775
|
+
await options.onprogress(indexFileEntry + 1, fileEntries.size, new Entry(fileEntry));
|
|
7615
7776
|
} catch {
|
|
7616
7777
|
// ignored
|
|
7617
7778
|
}
|
|
@@ -7625,7 +7786,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
|
7625
7786
|
}
|
|
7626
7787
|
|
|
7627
7788
|
async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
|
|
7628
|
-
const signCentralDirectory =
|
|
7789
|
+
const signCentralDirectory = getFunctionOptionValue(zipWriter, options, OPTION_SIGN_CENTRAL_DIRECTORY);
|
|
7629
7790
|
if (signCentralDirectory) {
|
|
7630
7791
|
const signatureData = await signCentralDirectory(directoryArray);
|
|
7631
7792
|
const signatureDataLength = getLength(signatureData);
|
|
@@ -7633,9 +7794,9 @@ async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
|
|
|
7633
7794
|
throw new Error(ERR_INVALID_SIGNATURE_DATA);
|
|
7634
7795
|
}
|
|
7635
7796
|
const signatureRecord = createRecordWriter(6 + signatureDataLength);
|
|
7636
|
-
signatureRecord.
|
|
7637
|
-
signatureRecord.
|
|
7638
|
-
signatureRecord.
|
|
7797
|
+
signatureRecord.writeUint32(DIGITAL_SIGNATURE_RECORD_SIGNATURE);
|
|
7798
|
+
signatureRecord.writeUint16(signatureDataLength);
|
|
7799
|
+
signatureRecord.writeBytes(signatureData);
|
|
7639
7800
|
await writeData(zipWriter.writer, signatureRecord.array);
|
|
7640
7801
|
return 6 + signatureDataLength;
|
|
7641
7802
|
}
|
|
@@ -7646,7 +7807,7 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
|
7646
7807
|
const { writer } = zipWriter;
|
|
7647
7808
|
const { directoryStart, signatureLength } = cdInfo;
|
|
7648
7809
|
let { directoryDataLength } = cdInfo;
|
|
7649
|
-
let
|
|
7810
|
+
let fileEntriesLength = zipWriter.fileEntries.size;
|
|
7650
7811
|
let diskNumber = directoryStart.diskNumber;
|
|
7651
7812
|
let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
|
|
7652
7813
|
let lastDiskNumber = getDiskNumber(writer);
|
|
@@ -7654,7 +7815,7 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
|
7654
7815
|
lastDiskNumber++;
|
|
7655
7816
|
}
|
|
7656
7817
|
let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
7657
|
-
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS ||
|
|
7818
|
+
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || fileEntriesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
|
|
7658
7819
|
if (zip64 === false) {
|
|
7659
7820
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
7660
7821
|
} else {
|
|
@@ -7671,37 +7832,37 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
|
7671
7832
|
}
|
|
7672
7833
|
lastDiskNumber = getDiskNumber(writer);
|
|
7673
7834
|
if (zip64) {
|
|
7674
|
-
endOfdirectoryRecord.
|
|
7675
|
-
endOfdirectoryRecord.
|
|
7676
|
-
endOfdirectoryRecord.
|
|
7677
|
-
endOfdirectoryRecord.
|
|
7678
|
-
endOfdirectoryRecord.
|
|
7679
|
-
endOfdirectoryRecord.
|
|
7680
|
-
endOfdirectoryRecord.
|
|
7681
|
-
endOfdirectoryRecord.
|
|
7682
|
-
endOfdirectoryRecord.
|
|
7683
|
-
endOfdirectoryRecord.
|
|
7684
|
-
endOfdirectoryRecord.
|
|
7685
|
-
endOfdirectoryRecord.
|
|
7686
|
-
endOfdirectoryRecord.
|
|
7687
|
-
endOfdirectoryRecord.
|
|
7835
|
+
endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
|
|
7836
|
+
endOfdirectoryRecord.writeUint64(44);
|
|
7837
|
+
endOfdirectoryRecord.writeUint16(45);
|
|
7838
|
+
endOfdirectoryRecord.writeUint16(45);
|
|
7839
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber);
|
|
7840
|
+
endOfdirectoryRecord.writeUint32(diskNumber);
|
|
7841
|
+
endOfdirectoryRecord.writeUint64(fileEntriesLength);
|
|
7842
|
+
endOfdirectoryRecord.writeUint64(fileEntriesLength);
|
|
7843
|
+
endOfdirectoryRecord.writeUint64(directoryDataLength);
|
|
7844
|
+
endOfdirectoryRecord.writeUint64(directoryOffset);
|
|
7845
|
+
endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
|
|
7846
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber);
|
|
7847
|
+
endOfdirectoryRecord.writeUint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength) + BigInt(signatureLength));
|
|
7848
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber + 1);
|
|
7688
7849
|
const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
|
|
7689
7850
|
if (supportZip64SplitFile) {
|
|
7690
7851
|
lastDiskNumber = MAX_16_BITS;
|
|
7691
7852
|
diskNumber = MAX_16_BITS;
|
|
7692
7853
|
}
|
|
7693
|
-
|
|
7854
|
+
fileEntriesLength = MAX_16_BITS;
|
|
7694
7855
|
directoryOffset = MAX_32_BITS;
|
|
7695
7856
|
directoryDataLength = MAX_32_BITS;
|
|
7696
7857
|
}
|
|
7697
|
-
endOfdirectoryRecord.
|
|
7698
|
-
endOfdirectoryRecord.
|
|
7699
|
-
endOfdirectoryRecord.
|
|
7700
|
-
endOfdirectoryRecord.
|
|
7701
|
-
endOfdirectoryRecord.
|
|
7702
|
-
endOfdirectoryRecord.
|
|
7703
|
-
endOfdirectoryRecord.
|
|
7704
|
-
endOfdirectoryRecord.
|
|
7858
|
+
endOfdirectoryRecord.writeUint32(END_OF_CENTRAL_DIR_SIGNATURE);
|
|
7859
|
+
endOfdirectoryRecord.writeUint16(lastDiskNumber);
|
|
7860
|
+
endOfdirectoryRecord.writeUint16(diskNumber);
|
|
7861
|
+
endOfdirectoryRecord.writeUint16(fileEntriesLength);
|
|
7862
|
+
endOfdirectoryRecord.writeUint16(fileEntriesLength);
|
|
7863
|
+
endOfdirectoryRecord.writeUint32(directoryDataLength);
|
|
7864
|
+
endOfdirectoryRecord.writeUint32(directoryOffset);
|
|
7865
|
+
endOfdirectoryRecord.writeUint16(commentLength);
|
|
7705
7866
|
await writeData(writer, endOfdirectoryRecord.array);
|
|
7706
7867
|
if (commentLength) {
|
|
7707
7868
|
await writeData(writer, comment);
|
|
@@ -7714,11 +7875,11 @@ function createRecordWriter(length) {
|
|
|
7714
7875
|
let offset = 0;
|
|
7715
7876
|
return {
|
|
7716
7877
|
array,
|
|
7717
|
-
|
|
7718
|
-
|
|
7719
|
-
|
|
7720
|
-
|
|
7721
|
-
|
|
7878
|
+
writeUint8: value => { setUint8(view, offset, value); offset += 1; },
|
|
7879
|
+
writeUint16: value => { setUint16(view, offset, value); offset += 2; },
|
|
7880
|
+
writeUint32: value => { setUint32(view, offset, value); offset += 4; },
|
|
7881
|
+
writeUint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
|
|
7882
|
+
writeBytes: value => { arraySet(array, value, offset); offset += getLength(value); },
|
|
7722
7883
|
skip: count => offset += count
|
|
7723
7884
|
};
|
|
7724
7885
|
}
|
|
@@ -7742,6 +7903,71 @@ function getSegmentOffset(zipWriter, { diskNumber = 0, diskOffset = 0 }) {
|
|
|
7742
7903
|
return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
|
|
7743
7904
|
}
|
|
7744
7905
|
|
|
7906
|
+
async function startsWithSplitZipSignature(reader) {
|
|
7907
|
+
const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
7908
|
+
return getUint32(getDataView(signatureArray), 0) == SPLIT_ZIP_FILE_SIGNATURE;
|
|
7909
|
+
}
|
|
7910
|
+
|
|
7911
|
+
async function copyZipData(zipWriter, reader, entries, directoryOffset, splitZipSignatureLength) {
|
|
7912
|
+
const { writer } = zipWriter;
|
|
7913
|
+
const entryPositions = new Map();
|
|
7914
|
+
if (writer.closeDisk) {
|
|
7915
|
+
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
7916
|
+
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
7917
|
+
let copiedLength = 0;
|
|
7918
|
+
for (const entry of sortedEntries) {
|
|
7919
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
7920
|
+
await copyData(zipWriter, reader, copiedLength, sourceOffset - copiedLength);
|
|
7921
|
+
if (exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
7922
|
+
await writer.closeDisk();
|
|
7923
|
+
}
|
|
7924
|
+
entryPositions.set(entry, {
|
|
7925
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
7926
|
+
diskNumberStart: getDiskNumber(writer)
|
|
7927
|
+
});
|
|
7928
|
+
copiedLength = sourceOffset;
|
|
7929
|
+
}
|
|
7930
|
+
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
7931
|
+
} else {
|
|
7932
|
+
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
7933
|
+
entries.forEach(entry => entryPositions.set(entry, {
|
|
7934
|
+
offset: splitZipSignatureLength + getSourceOffset(reader, entry),
|
|
7935
|
+
diskNumberStart: 0
|
|
7936
|
+
}));
|
|
7937
|
+
}
|
|
7938
|
+
return entryPositions;
|
|
7939
|
+
}
|
|
7940
|
+
|
|
7941
|
+
async function copyData(zipWriter, reader, offset, size) {
|
|
7942
|
+
if (size > 0) {
|
|
7943
|
+
const { writer } = zipWriter;
|
|
7944
|
+
await createReadable(reader, { offset, size }).pipeTo(writer.writable, { preventClose: true, preventAbort: true });
|
|
7945
|
+
writer.size += size;
|
|
7946
|
+
zipWriter.offset += size;
|
|
7947
|
+
}
|
|
7948
|
+
}
|
|
7949
|
+
|
|
7950
|
+
async function getLocalHeaderLength(reader, offset) {
|
|
7951
|
+
const headerArray = await readUint8Array(reader, offset, HEADER_SIZE);
|
|
7952
|
+
if (getLength(headerArray) < HEADER_SIZE) {
|
|
7953
|
+
return HEADER_SIZE;
|
|
7954
|
+
}
|
|
7955
|
+
const headerView = getDataView(headerArray);
|
|
7956
|
+
return HEADER_SIZE +
|
|
7957
|
+
getUint16(headerView, HEADER_OFFSET_FILENAME_LENGTH + LOCAL_HEADER_COMMON_OFFSET) +
|
|
7958
|
+
getUint16(headerView, HEADER_OFFSET_EXTRAFIELD_LENGTH + LOCAL_HEADER_COMMON_OFFSET);
|
|
7959
|
+
}
|
|
7960
|
+
|
|
7961
|
+
function getSourceOffset(reader, { offset, diskNumberStart }) {
|
|
7962
|
+
return offset + (reader.getDiskOffset ? reader.getDiskOffset(diskNumberStart) : 0);
|
|
7963
|
+
}
|
|
7964
|
+
|
|
7965
|
+
function getSplitZipSignatureArray() {
|
|
7966
|
+
const signatureArray = new Uint8Array(SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
7967
|
+
setUint32(getDataView(signatureArray), 0, SPLIT_ZIP_FILE_SIGNATURE);
|
|
7968
|
+
return signatureArray;
|
|
7969
|
+
}
|
|
7970
|
+
|
|
7745
7971
|
async function writeData(writer, array) {
|
|
7746
7972
|
const { writable } = writer;
|
|
7747
7973
|
const streamWriter = writable.getWriter();
|
|
@@ -7793,6 +8019,21 @@ function getOptionValue(zipWriter, options, name, defaultValue) {
|
|
|
7793
8019
|
return result === UNDEFINED_VALUE ? defaultValue : result;
|
|
7794
8020
|
}
|
|
7795
8021
|
|
|
8022
|
+
function getDateOptionValue(zipWriter, options, name, defaultValue) {
|
|
8023
|
+
const date = getOptionValue(zipWriter, options, name, defaultValue);
|
|
8024
|
+
if (date === null) {
|
|
8025
|
+
return defaultValue;
|
|
8026
|
+
}
|
|
8027
|
+
if (date !== UNDEFINED_VALUE && (typeof date.getTime != FUNCTION_TYPE || Number.isNaN(date.getTime()))) {
|
|
8028
|
+
throw new Error(ERR_INVALID_DATE);
|
|
8029
|
+
}
|
|
8030
|
+
return date;
|
|
8031
|
+
}
|
|
8032
|
+
|
|
8033
|
+
function getFunctionOptionValue(zipWriter, options, name) {
|
|
8034
|
+
return checkFunctionOption(getOptionValue(zipWriter, options, name));
|
|
8035
|
+
}
|
|
8036
|
+
|
|
7796
8037
|
function getAliasedOptionValue(zipWriter, options, name, deprecatedName, defaultValue) {
|
|
7797
8038
|
const value = getAliasedValue(options, name, deprecatedName);
|
|
7798
8039
|
const result = value === UNDEFINED_VALUE ? getAliasedValue(zipWriter.options, name, deprecatedName) : value;
|
|
@@ -7807,9 +8048,6 @@ function getNumberOptionValue(zipWriter, options, name, defaultValue) {
|
|
|
7807
8048
|
return toNumber(getOptionValue(zipWriter, options, name, defaultValue));
|
|
7808
8049
|
}
|
|
7809
8050
|
|
|
7810
|
-
function toNumber(value) {
|
|
7811
|
-
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
7812
|
-
}
|
|
7813
8051
|
|
|
7814
8052
|
function getMaximumCompressedSize(uncompressedSize) {
|
|
7815
8053
|
return uncompressedSize + (5 * (Math.floor(uncompressedSize / 16383) + 1));
|
|
@@ -7821,6 +8059,14 @@ function isCompressed(compressionMethod, level) {
|
|
|
7821
8059
|
: compressionMethod !== COMPRESSION_METHOD_STORE;
|
|
7822
8060
|
}
|
|
7823
8061
|
|
|
8062
|
+
function getUint16(view, offset) {
|
|
8063
|
+
return view.getUint16(offset, true);
|
|
8064
|
+
}
|
|
8065
|
+
|
|
8066
|
+
function getUint32(view, offset) {
|
|
8067
|
+
return view.getUint32(offset, true);
|
|
8068
|
+
}
|
|
8069
|
+
|
|
7824
8070
|
function setUint8(view, offset, value) {
|
|
7825
8071
|
view.setUint8(offset, value);
|
|
7826
8072
|
}
|
|
@@ -7864,9 +8110,9 @@ function getHeaderArrayData({
|
|
|
7864
8110
|
const headerRecord = createRecordWriter(HEADER_SIZE - 4);
|
|
7865
8111
|
const headerArray = headerRecord.array;
|
|
7866
8112
|
const headerView = getDataView(headerArray);
|
|
7867
|
-
headerRecord.
|
|
7868
|
-
headerRecord.
|
|
7869
|
-
headerRecord.
|
|
8113
|
+
headerRecord.writeUint16(version);
|
|
8114
|
+
headerRecord.writeUint16(bitFlag);
|
|
8115
|
+
headerRecord.writeUint16(compressionMethod);
|
|
7870
8116
|
if (rawLastModDate === UNDEFINED_VALUE) {
|
|
7871
8117
|
const dateArray = new Uint32Array(1);
|
|
7872
8118
|
const dateView = getDataView(dateArray);
|
|
@@ -7874,20 +8120,20 @@ function getHeaderArrayData({
|
|
|
7874
8120
|
setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
|
|
7875
8121
|
rawLastModDate = dateArray[0];
|
|
7876
8122
|
}
|
|
7877
|
-
headerRecord.
|
|
8123
|
+
headerRecord.writeUint32(rawLastModDate);
|
|
7878
8124
|
headerRecord.skip(4);
|
|
7879
8125
|
if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
|
|
7880
|
-
headerRecord.
|
|
8126
|
+
headerRecord.writeUint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
|
|
7881
8127
|
} else {
|
|
7882
8128
|
headerRecord.skip(4);
|
|
7883
8129
|
}
|
|
7884
8130
|
if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
|
|
7885
|
-
headerRecord.
|
|
8131
|
+
headerRecord.writeUint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
|
|
7886
8132
|
} else {
|
|
7887
8133
|
headerRecord.skip(4);
|
|
7888
8134
|
}
|
|
7889
|
-
headerRecord.
|
|
7890
|
-
headerRecord.
|
|
8135
|
+
headerRecord.writeUint16(getLength(rawFilename));
|
|
8136
|
+
headerRecord.writeUint16(extraFieldLength);
|
|
7891
8137
|
return {
|
|
7892
8138
|
headerArray,
|
|
7893
8139
|
headerView,
|
|
@@ -8470,6 +8716,7 @@ setDefaultConfiguration({
|
|
|
8470
8716
|
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
8471
8717
|
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
8472
8718
|
const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
|
|
8719
|
+
const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
|
|
8473
8720
|
const ERR_ABORT_EXPORT = "zipjs-abort-export";
|
|
8474
8721
|
const ERR_ABORTED = "The operation was aborted";
|
|
8475
8722
|
const ABORT_ERROR_NAME = "AbortError";
|
|
@@ -8502,13 +8749,14 @@ class ZipEntry {
|
|
|
8502
8749
|
fs,
|
|
8503
8750
|
name,
|
|
8504
8751
|
data: params.data,
|
|
8505
|
-
options: params.options,
|
|
8752
|
+
options: params.options && Object.assign({}, params.options),
|
|
8506
8753
|
id: fs.entryIdCounter++,
|
|
8507
8754
|
parent,
|
|
8508
8755
|
children: [],
|
|
8509
8756
|
uncompressedSize: params.uncompressedSize || 0,
|
|
8510
8757
|
undeterminedSize: params.undeterminedSize || params.uncompressedSize === UNDEFINED_VALUE,
|
|
8511
|
-
passThrough: params.passThrough
|
|
8758
|
+
passThrough: params.passThrough,
|
|
8759
|
+
defaultLastModDate: params.defaultLastModDate || new Date()
|
|
8512
8760
|
});
|
|
8513
8761
|
if (parent || !fs.root) {
|
|
8514
8762
|
fs.entries[zipEntry.id] = zipEntry;
|
|
@@ -8518,12 +8766,6 @@ class ZipEntry {
|
|
|
8518
8766
|
}
|
|
8519
8767
|
}
|
|
8520
8768
|
|
|
8521
|
-
moveTo(target) {
|
|
8522
|
-
// deprecated
|
|
8523
|
-
const zipEntry = this;
|
|
8524
|
-
zipEntry.fs.move(zipEntry, target);
|
|
8525
|
-
}
|
|
8526
|
-
|
|
8527
8769
|
getFullname() {
|
|
8528
8770
|
return this.getRelativeName();
|
|
8529
8771
|
}
|
|
@@ -8555,6 +8797,11 @@ class ZipEntry {
|
|
|
8555
8797
|
this.name = name;
|
|
8556
8798
|
}
|
|
8557
8799
|
}
|
|
8800
|
+
|
|
8801
|
+
setOptions(options) {
|
|
8802
|
+
const entryOptions = Object.assign({}, this.options, options);
|
|
8803
|
+
this.options = Object.fromEntries(Object.entries(entryOptions).filter(([, value]) => value !== UNDEFINED_VALUE));
|
|
8804
|
+
}
|
|
8558
8805
|
}
|
|
8559
8806
|
|
|
8560
8807
|
class ZipFileEntry extends ZipEntry {
|
|
@@ -8581,7 +8828,7 @@ class ZipFileEntry extends ZipEntry {
|
|
|
8581
8828
|
const reader = zipEntry.reader = createReader(zipEntry.Reader, zipEntry.data, options);
|
|
8582
8829
|
const dataSize = zipEntry.uncompressedSize || reader.size;
|
|
8583
8830
|
await Promise.all([initStream(reader), initStream(writer, dataSize)]);
|
|
8584
|
-
const
|
|
8831
|
+
const signal = checkSignalOption(options.signal);
|
|
8585
8832
|
const readable = createProgressReadable(zipEntry, reader, options, signal);
|
|
8586
8833
|
const preventClose = !ownsWritable(writer) && Boolean(options.preventClose);
|
|
8587
8834
|
zipEntry.uncompressedSize = reader.size;
|
|
@@ -8799,10 +9046,6 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
8799
9046
|
});
|
|
8800
9047
|
}
|
|
8801
9048
|
|
|
8802
|
-
addData(name, params) {
|
|
8803
|
-
return addChild(this, name, params);
|
|
8804
|
-
}
|
|
8805
|
-
|
|
8806
9049
|
importBlob(blob, options) {
|
|
8807
9050
|
return this.importZip(new BlobReader(blob), options);
|
|
8808
9051
|
}
|
|
@@ -8916,7 +9159,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
8916
9159
|
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
8917
9160
|
options.bufferedWrite = true;
|
|
8918
9161
|
}
|
|
8919
|
-
const [readers] = await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
|
|
9162
|
+
const [readers] = await Promise.all([initReaders(zipEntry, checkReaderOptions(options.readerOptions)), initStream(writer)]);
|
|
8920
9163
|
const zipWriter = new ZipWriter(writer, options);
|
|
8921
9164
|
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
|
|
8922
9165
|
await zipWriter.close(options.globalComment);
|
|
@@ -8926,12 +9169,13 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
8926
9169
|
getExportedSize(options = {}) {
|
|
8927
9170
|
const zipEntry = this;
|
|
8928
9171
|
options = Object.assign({}, options);
|
|
9172
|
+
checkReaderOptions(options.readerOptions);
|
|
8929
9173
|
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
8930
9174
|
options.bufferedWrite = true;
|
|
8931
9175
|
}
|
|
8932
9176
|
const writeOrderGuaranteed = !options.bufferedWrite ||
|
|
8933
9177
|
(options.keepOrder !== false && zipEntry.children.every(child => !child.children.length));
|
|
8934
|
-
return getEntriesSize(options,
|
|
9178
|
+
return getEntriesSize(options, zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
|
|
8935
9179
|
const { name, entryOptions } = getChildEntryOptions(child, zipEntry, options);
|
|
8936
9180
|
return { name, size: child.directory ? 0 : getDeterminedSize(child, isPassThrough(child, options)), options: entryOptions };
|
|
8937
9181
|
}), writeOrderGuaranteed, options.globalComment);
|
|
@@ -8970,7 +9214,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
8970
9214
|
}
|
|
8971
9215
|
|
|
8972
9216
|
|
|
8973
|
-
class
|
|
9217
|
+
class ZipFS {
|
|
8974
9218
|
|
|
8975
9219
|
constructor() {
|
|
8976
9220
|
resetFS(this);
|
|
@@ -9086,10 +9330,6 @@ class FS {
|
|
|
9086
9330
|
return this.root.addFile(file, options);
|
|
9087
9331
|
}
|
|
9088
9332
|
|
|
9089
|
-
addData(name, params) {
|
|
9090
|
-
return this.root.addData(name, params);
|
|
9091
|
-
}
|
|
9092
|
-
|
|
9093
9333
|
importBlob(blob, options) {
|
|
9094
9334
|
resetFS(this);
|
|
9095
9335
|
return this.root.importBlob(blob, options);
|
|
@@ -9157,7 +9397,7 @@ class FS {
|
|
|
9157
9397
|
}
|
|
9158
9398
|
}
|
|
9159
9399
|
|
|
9160
|
-
const fs = { FS, ZipDirectoryEntry, ZipFileEntry };
|
|
9400
|
+
const fs = { FS: ZipFS, ZipDirectoryEntry, ZipFileEntry };
|
|
9161
9401
|
|
|
9162
9402
|
function getTotalSize(entries, getEntrySize) {
|
|
9163
9403
|
let size = 0;
|
|
@@ -9301,7 +9541,7 @@ function detach(entry) {
|
|
|
9301
9541
|
}
|
|
9302
9542
|
|
|
9303
9543
|
function forwardAbort(signal, abortController) {
|
|
9304
|
-
if (!signal) {
|
|
9544
|
+
if (!checkSignalOption(signal)) {
|
|
9305
9545
|
return () => { };
|
|
9306
9546
|
}
|
|
9307
9547
|
if (signal.aborted) {
|
|
@@ -9378,10 +9618,7 @@ function getChildEntryOptions(child, selectedEntry, options) {
|
|
|
9378
9618
|
});
|
|
9379
9619
|
}
|
|
9380
9620
|
if (isPassThrough(child, options)) {
|
|
9381
|
-
let
|
|
9382
|
-
if (compressionMethod === 0) {
|
|
9383
|
-
level = 0;
|
|
9384
|
-
}
|
|
9621
|
+
let encryptionStrength;
|
|
9385
9622
|
if (extraFieldAES) {
|
|
9386
9623
|
encryptionStrength = extraFieldAES.strength;
|
|
9387
9624
|
}
|
|
@@ -9391,13 +9628,12 @@ function getChildEntryOptions(child, selectedEntry, options) {
|
|
|
9391
9628
|
zipCrypto,
|
|
9392
9629
|
crc32,
|
|
9393
9630
|
uncompressedSize,
|
|
9394
|
-
level,
|
|
9395
9631
|
encryptionStrength,
|
|
9396
9632
|
compressionMethod
|
|
9397
9633
|
};
|
|
9398
9634
|
}
|
|
9399
9635
|
}
|
|
9400
|
-
const entryOptions = Object.assign({}, zipEntryMetadata, options,
|
|
9636
|
+
const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
|
|
9401
9637
|
if (!child.directory && entryOptions.passThrough && entryOptions.uncompressedSize === UNDEFINED_VALUE) {
|
|
9402
9638
|
throw new Error(ERR_INVALID_PASS_THROUGH);
|
|
9403
9639
|
}
|
|
@@ -9412,11 +9648,22 @@ function getDeterminedSize(child, passThrough) {
|
|
|
9412
9648
|
return child.undeterminedSize ? UNDEFINED_VALUE : getExtractedSize(child, passThrough);
|
|
9413
9649
|
}
|
|
9414
9650
|
|
|
9651
|
+
function checkReaderOptions(readerOptions) {
|
|
9652
|
+
if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
|
|
9653
|
+
throw new Error(ERR_INVALID_READER_OPTIONS);
|
|
9654
|
+
}
|
|
9655
|
+
return readerOptions;
|
|
9656
|
+
}
|
|
9657
|
+
|
|
9415
9658
|
function isPassThrough(child, options) {
|
|
9416
9659
|
const { readerOptions } = options;
|
|
9417
9660
|
return Boolean(!child.directory && (child.passThrough || (readerOptions && readerOptions.passThrough)));
|
|
9418
9661
|
}
|
|
9419
9662
|
|
|
9663
|
+
function isImplicitDirectory(child) {
|
|
9664
|
+
return child.directory && child.data === null;
|
|
9665
|
+
}
|
|
9666
|
+
|
|
9420
9667
|
function getUserExtraField(extraField) {
|
|
9421
9668
|
if (extraField) {
|
|
9422
9669
|
const userExtraField = new Map();
|
|
@@ -9434,7 +9681,7 @@ function getUserExtraField(extraField) {
|
|
|
9434
9681
|
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
9435
9682
|
const { onstart, onprogress, onend, onentryprogress } = options;
|
|
9436
9683
|
const selectedEntry = entry;
|
|
9437
|
-
const totalEntries = getTotalSize(entry.children, ()
|
|
9684
|
+
const totalEntries = getTotalSize(entry.children, child => isImplicitDirectory(child) ? 0 : 1);
|
|
9438
9685
|
let writtenSize = 0;
|
|
9439
9686
|
let writtenEntries = 0;
|
|
9440
9687
|
if (onstart) {
|
|
@@ -9463,6 +9710,9 @@ async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
|
9463
9710
|
}
|
|
9464
9711
|
|
|
9465
9712
|
async function addChild(child) {
|
|
9713
|
+
if (isImplicitDirectory(child)) {
|
|
9714
|
+
return;
|
|
9715
|
+
}
|
|
9466
9716
|
const { name, entryOptions } = getChildEntryOptions(child, selectedEntry, options);
|
|
9467
9717
|
let entryWrittenSize = 0;
|
|
9468
9718
|
const entryMetadata = await zipWriter.add(name, readers.get(child), Object.assign(entryOptions, {
|
|
@@ -9496,7 +9746,7 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
9496
9746
|
if (handle.kind == "file") {
|
|
9497
9747
|
const file = await handle.getFile();
|
|
9498
9748
|
addedEntries.push(
|
|
9499
|
-
parentEntry
|
|
9749
|
+
addChild(parentEntry, file.name, {
|
|
9500
9750
|
Reader: function () {
|
|
9501
9751
|
const readable = file.stream();
|
|
9502
9752
|
const size = file.size;
|
|
@@ -9530,10 +9780,11 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
9530
9780
|
|
|
9531
9781
|
async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
9532
9782
|
const { onstart, onprogress, onend } = options;
|
|
9783
|
+
const readerOptions = checkReaderOptions(options.readerOptions);
|
|
9533
9784
|
const abortController = new AbortController();
|
|
9534
9785
|
const { signal } = abortController;
|
|
9535
9786
|
const releaseSignal = forwardAbort(options.signal, abortController);
|
|
9536
|
-
const getDataOptions = Object.assign({}, options,
|
|
9787
|
+
const getDataOptions = Object.assign({}, options, readerOptions, {
|
|
9537
9788
|
signal,
|
|
9538
9789
|
onstart: UNDEFINED_VALUE,
|
|
9539
9790
|
onprogress: UNDEFINED_VALUE,
|
|
@@ -9833,6 +10084,7 @@ exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
|
9833
10084
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
9834
10085
|
exports.ERR_ENCRYPTED = ERR_ENCRYPTED;
|
|
9835
10086
|
exports.ERR_ENCRYPTED_CENTRAL_DIRECTORY = ERR_ENCRYPTED_CENTRAL_DIRECTORY;
|
|
10087
|
+
exports.ERR_ENTRY_DATA_OUT_OF_BOUNDS = ERR_ENTRY_DATA_OUT_OF_BOUNDS;
|
|
9836
10088
|
exports.ERR_ENTRY_EXISTS = ERR_ENTRY_EXISTS;
|
|
9837
10089
|
exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
|
|
9838
10090
|
exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
|
|
@@ -9846,20 +10098,28 @@ exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
|
9846
10098
|
exports.ERR_INVALID_COMMENT_TYPE = ERR_INVALID_COMMENT_TYPE;
|
|
9847
10099
|
exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
|
|
9848
10100
|
exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
|
|
10101
|
+
exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
|
|
9849
10102
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
9850
10103
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
10104
|
+
exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
|
|
9851
10105
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
10106
|
+
exports.ERR_INVALID_EXTRAFIELD = ERR_INVALID_EXTRAFIELD;
|
|
9852
10107
|
exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
|
|
10108
|
+
exports.ERR_INVALID_EXTRAFIELD_DATA_TYPE = ERR_INVALID_EXTRAFIELD_DATA_TYPE;
|
|
9853
10109
|
exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
|
|
9854
10110
|
exports.ERR_INVALID_FILENAME_VALIDATION = ERR_INVALID_FILENAME_VALIDATION;
|
|
10111
|
+
exports.ERR_INVALID_FUNCTION_OPTION = ERR_INVALID_FUNCTION_OPTION;
|
|
9855
10112
|
exports.ERR_INVALID_GID = ERR_INVALID_GID;
|
|
9856
10113
|
exports.ERR_INVALID_LEVEL = ERR_INVALID_LEVEL;
|
|
9857
10114
|
exports.ERR_INVALID_MAX_APPENDED_DATA_SIZE = ERR_INVALID_MAX_APPENDED_DATA_SIZE;
|
|
10115
|
+
exports.ERR_INVALID_MAX_WORKERS = ERR_INVALID_MAX_WORKERS;
|
|
9858
10116
|
exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
|
|
9859
10117
|
exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
|
|
9860
10118
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
9861
10119
|
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
9862
10120
|
exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
|
|
10121
|
+
exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
|
|
10122
|
+
exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
|
|
9863
10123
|
exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
|
|
9864
10124
|
exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
|
|
9865
10125
|
exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
|
|
@@ -9875,6 +10135,7 @@ exports.ERR_OVERLAPPING_ENTRY = ERR_OVERLAPPING_ENTRY;
|
|
|
9875
10135
|
exports.ERR_READABLE_CONSUMED = ERR_READABLE_CONSUMED;
|
|
9876
10136
|
exports.ERR_RESERVED_COMPRESSION_METHOD = ERR_RESERVED_COMPRESSION_METHOD;
|
|
9877
10137
|
exports.ERR_SPLIT_ZIP_FILE = ERR_SPLIT_ZIP_FILE;
|
|
10138
|
+
exports.ERR_UNDEFINED_COMPRESSION_METHOD = ERR_UNDEFINED_COMPRESSION_METHOD;
|
|
9878
10139
|
exports.ERR_UNDEFINED_READER = ERR_UNDEFINED_READER;
|
|
9879
10140
|
exports.ERR_UNDEFINED_UNCOMPRESSED_SIZE = ERR_UNDEFINED_UNCOMPRESSED_SIZE;
|
|
9880
10141
|
exports.ERR_UNDETERMINED_SIZE = ERR_UNDETERMINED_SIZE;
|
|
@@ -9899,6 +10160,10 @@ exports.TextWriter = TextWriter;
|
|
|
9899
10160
|
exports.Uint8ArrayReader = Uint8ArrayReader;
|
|
9900
10161
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
9901
10162
|
exports.Writer = Writer;
|
|
10163
|
+
exports.ZipDirectoryEntry = ZipDirectoryEntry;
|
|
10164
|
+
exports.ZipEntry = ZipEntry;
|
|
10165
|
+
exports.ZipFS = ZipFS;
|
|
10166
|
+
exports.ZipFileEntry = ZipFileEntry;
|
|
9902
10167
|
exports.ZipReader = ZipReader;
|
|
9903
10168
|
exports.ZipReaderStream = ZipReaderStream;
|
|
9904
10169
|
exports.ZipWriter = ZipWriter;
|