@zip.js/zip.js 2.8.53 → 2.8.54
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 +691 -482
- package/dist/zip-core-external.min.js +1 -1
- package/dist/zip-core.js +698 -481
- package/dist/zip-core.min.js +1 -1
- package/dist/zip-fs-core-external.js +729 -511
- package/dist/zip-fs-core-external.min.js +1 -1
- package/dist/zip-fs-core.js +691 -496
- package/dist/zip-fs-core.min.js +1 -1
- package/dist/zip-fs-external.js +729 -511
- package/dist/zip-fs-external.min.js +1 -1
- package/dist/zip-fs-native.js +743 -512
- package/dist/zip-fs-native.min.js +1 -1
- package/dist/zip-fs.js +742 -511
- package/dist/zip-fs.min.js +1 -1
- package/dist/zip-legacy.js +700 -483
- package/dist/zip-legacy.min.js +1 -1
- package/dist/zip-native.js +700 -483
- 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 +699 -482
- package/dist/zip.min.js +1 -1
- package/eslint.config.mjs +1 -0
- package/index-native.cjs +743 -512
- package/index-native.min.js +1 -1
- package/index.cjs +742 -511
- package/index.d.cts +398 -42
- package/index.d.ts +398 -42
- package/index.min.js +1 -1
- package/lib/core/configuration.js +62 -21
- package/lib/core/constants.js +11 -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 +38 -27
- package/lib/core/zip-reader.js +58 -26
- package/lib/core/zip-writer.js +293 -177
- package/lib/zip-core-base.js +6 -1
- package/lib/zip-core-reader.js +1 -0
- package/lib/zip-core-writer.js +4 -0
- package/package.json +8 -2
package/dist/zip-fs-native.js
CHANGED
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
|
|
46
46
|
const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
|
|
47
47
|
const SPLIT_ZIP_FILE_SIGNATURE = 0x08074b50;
|
|
48
|
+
const TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE = 0x30304b50;
|
|
48
49
|
const DATA_DESCRIPTOR_RECORD_SIGNATURE = SPLIT_ZIP_FILE_SIGNATURE;
|
|
49
50
|
const ARCHIVE_EXTRA_DATA_SIGNATURE = 0x08064b50;
|
|
50
51
|
const DIGITAL_SIGNATURE_RECORD_SIGNATURE = 0x05054b50;
|
|
@@ -61,6 +62,7 @@
|
|
|
61
62
|
const DATA_DESCRIPTOR_RECORD_LENGTH = 12;
|
|
62
63
|
const DATA_DESCRIPTOR_RECORD_ZIP_64_LENGTH = 20;
|
|
63
64
|
const DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH = 4;
|
|
65
|
+
const SPLIT_ZIP_FILE_SIGNATURE_LENGTH = 4;
|
|
64
66
|
|
|
65
67
|
const EXTRAFIELD_TYPE_ZIP64 = 0x0001;
|
|
66
68
|
const EXTRAFIELD_TYPE_AES = 0x9901;
|
|
@@ -112,6 +114,8 @@
|
|
|
112
114
|
const HEADER_OFFSET_SIGNATURE = 10;
|
|
113
115
|
const HEADER_OFFSET_COMPRESSED_SIZE = 14;
|
|
114
116
|
const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
|
|
117
|
+
const HEADER_OFFSET_FILENAME_LENGTH = 22;
|
|
118
|
+
const HEADER_OFFSET_EXTRAFIELD_LENGTH = 24;
|
|
115
119
|
const LOCAL_HEADER_COMMON_OFFSET = 4;
|
|
116
120
|
|
|
117
121
|
const MAX_DATE = new Date(2107, 11, 31, 23, 59, 58);
|
|
@@ -124,9 +128,116 @@
|
|
|
124
128
|
const OBJECT_TYPE = "object";
|
|
125
129
|
const STRING_TYPE = "string";
|
|
126
130
|
const NUMBER_TYPE = "number";
|
|
131
|
+
const BOOLEAN_TYPE = "boolean";
|
|
127
132
|
|
|
128
133
|
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
129
134
|
|
|
135
|
+
/*
|
|
136
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
137
|
+
|
|
138
|
+
Redistribution and use in source and binary forms, with or without
|
|
139
|
+
modification, are permitted provided that the following conditions are met:
|
|
140
|
+
|
|
141
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
142
|
+
this list of conditions and the following disclaimer.
|
|
143
|
+
|
|
144
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
145
|
+
notice, this list of conditions and the following disclaimer in
|
|
146
|
+
the documentation and/or other materials provided with the distribution.
|
|
147
|
+
|
|
148
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
149
|
+
derived from this software without specific prior written permission.
|
|
150
|
+
|
|
151
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
152
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
153
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
154
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
155
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
156
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
157
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
158
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
159
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
160
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
161
|
+
*/
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
const OPTION_FILENAME_ENCODING = "filenameEncoding";
|
|
165
|
+
const OPTION_COMMENT_ENCODING = "commentEncoding";
|
|
166
|
+
const OPTION_DECODE_TEXT = "decodeText";
|
|
167
|
+
const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
|
|
168
|
+
const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
|
|
169
|
+
const OPTION_PASSWORD = "password";
|
|
170
|
+
const OPTION_RAW_PASSWORD = "rawPassword";
|
|
171
|
+
const OPTION_PASS_THROUGH = "passThrough";
|
|
172
|
+
const OPTION_SIGNAL = "signal";
|
|
173
|
+
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
174
|
+
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
175
|
+
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
176
|
+
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
177
|
+
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
178
|
+
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
179
|
+
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
180
|
+
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
181
|
+
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
182
|
+
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
183
|
+
const OPTION_TRANSFER_STREAMS = "transferStreams";
|
|
184
|
+
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
185
|
+
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
186
|
+
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
187
|
+
const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
|
|
188
|
+
const OPTION_KEEP_ORDER = "keepOrder";
|
|
189
|
+
const OPTION_LEVEL = "level";
|
|
190
|
+
const OPTION_BUFFERED_WRITE = "bufferedWrite";
|
|
191
|
+
const OPTION_CREATE_TEMP_STREAM = "createTempStream";
|
|
192
|
+
const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
|
|
193
|
+
const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
|
|
194
|
+
const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
|
|
195
|
+
const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
|
|
196
|
+
const OPTION_ENCODE_TEXT = "encodeText";
|
|
197
|
+
const OPTION_OFFSET = "offset";
|
|
198
|
+
const OPTION_USDZ = "usdz";
|
|
199
|
+
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
200
|
+
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
201
|
+
const OPTION_STRICTNESS = "strictness";
|
|
202
|
+
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
203
|
+
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
204
|
+
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
205
|
+
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
206
|
+
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
207
|
+
const TEXT_TYPE_FILENAME = "filename";
|
|
208
|
+
const TEXT_TYPE_COMMENT = "comment";
|
|
209
|
+
const STRICTNESS_STRICT = "strict";
|
|
210
|
+
const STRICTNESS_BALANCED = "balanced";
|
|
211
|
+
const STRICTNESS_TOLERANT = "tolerant";
|
|
212
|
+
|
|
213
|
+
const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
|
|
214
|
+
const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
|
|
215
|
+
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
216
|
+
|
|
217
|
+
function checkFunctionOption(value) {
|
|
218
|
+
if (value && typeof value != FUNCTION_TYPE) {
|
|
219
|
+
throw new Error(ERR_INVALID_FUNCTION_OPTION);
|
|
220
|
+
}
|
|
221
|
+
return value;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function checkSignalOption(signal) {
|
|
225
|
+
if (signal && (typeof signal.addEventListener != FUNCTION_TYPE || typeof signal.aborted != BOOLEAN_TYPE)) {
|
|
226
|
+
throw new Error(ERR_INVALID_SIGNAL);
|
|
227
|
+
}
|
|
228
|
+
return signal || UNDEFINED_VALUE;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function checkPasswordOption(password, rawPassword) {
|
|
232
|
+
if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
|
|
233
|
+
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function toNumber(value) {
|
|
238
|
+
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
239
|
+
}
|
|
240
|
+
|
|
130
241
|
/*
|
|
131
242
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
132
243
|
|
|
@@ -156,7 +267,10 @@
|
|
|
156
267
|
*/
|
|
157
268
|
|
|
158
269
|
|
|
270
|
+
const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
|
|
159
271
|
const MINIMUM_CHUNK_SIZE = 64;
|
|
272
|
+
const MINIMUM_PROPERTY_VALUE = 1;
|
|
273
|
+
const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
|
|
160
274
|
let maxWorkers = 2;
|
|
161
275
|
try {
|
|
162
276
|
if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
|
|
@@ -168,7 +282,7 @@
|
|
|
168
282
|
const DEFAULT_CONFIGURATION = {
|
|
169
283
|
workerURI: "./core/web-worker-wasm.js",
|
|
170
284
|
wasmURI: "./core/streams/zlib-wasm/zlib-streams.wasm",
|
|
171
|
-
chunkSize:
|
|
285
|
+
chunkSize: DEFAULT_CHUNK_SIZE$1,
|
|
172
286
|
maxWorkers,
|
|
173
287
|
terminateWorkerTimeout: 5000,
|
|
174
288
|
workerStarvationTimeout: 5000,
|
|
@@ -180,24 +294,38 @@
|
|
|
180
294
|
DecompressionStream: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream
|
|
181
295
|
};
|
|
182
296
|
|
|
183
|
-
const
|
|
297
|
+
const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
|
|
298
|
+
|
|
299
|
+
const STRING_PROPERTY_NAMES = [
|
|
184
300
|
"baseURI",
|
|
185
301
|
"wasmURI",
|
|
186
|
-
"workerURI"
|
|
187
|
-
|
|
302
|
+
"workerURI"
|
|
303
|
+
];
|
|
304
|
+
const BOOLEAN_PROPERTY_NAMES = [
|
|
305
|
+
"useCompressionStream",
|
|
306
|
+
"useWebWorkers",
|
|
307
|
+
"transferStreams"
|
|
308
|
+
];
|
|
309
|
+
const NUMBER_PROPERTY_NAMES = [
|
|
188
310
|
"chunkSize",
|
|
189
|
-
|
|
311
|
+
PROPERTY_NAME_MAX_WORKERS,
|
|
190
312
|
"terminateWorkerTimeout",
|
|
191
313
|
"workerStarvationTimeout",
|
|
192
|
-
"workerStartupTimeout"
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
"
|
|
314
|
+
"workerStartupTimeout"
|
|
315
|
+
];
|
|
316
|
+
const FUNCTION_PROPERTY_NAMES = [
|
|
317
|
+
"createWorker",
|
|
196
318
|
"CompressionStream",
|
|
197
319
|
"DecompressionStream",
|
|
198
320
|
"CompressionStreamFallback",
|
|
199
321
|
"DecompressionStreamFallback"
|
|
200
322
|
];
|
|
323
|
+
const CONFIGURABLE_PROPERTY_NAMES = [
|
|
324
|
+
...STRING_PROPERTY_NAMES,
|
|
325
|
+
...BOOLEAN_PROPERTY_NAMES,
|
|
326
|
+
...NUMBER_PROPERTY_NAMES,
|
|
327
|
+
...FUNCTION_PROPERTY_NAMES
|
|
328
|
+
];
|
|
201
329
|
|
|
202
330
|
const config = { ...DEFAULT_CONFIGURATION };
|
|
203
331
|
|
|
@@ -206,20 +334,43 @@
|
|
|
206
334
|
}
|
|
207
335
|
|
|
208
336
|
function getChunkSize(config) {
|
|
209
|
-
return
|
|
337
|
+
return normalizeChunkSize(config.chunkSize);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function normalizeChunkSize(chunkSize) {
|
|
341
|
+
chunkSize = toNumber(chunkSize);
|
|
342
|
+
return Number.isInteger(chunkSize) && chunkSize >= MINIMUM_PROPERTY_VALUE ? Math.max(chunkSize, MINIMUM_CHUNK_SIZE) : DEFAULT_CHUNK_SIZE$1;
|
|
210
343
|
}
|
|
211
344
|
|
|
212
345
|
function configure(configuration) {
|
|
213
|
-
|
|
346
|
+
Object.assign(config, checkConfiguration(normalizeConfiguration(configuration)));
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
function checkConfiguration(configuration) {
|
|
350
|
+
const checkedConfiguration = {};
|
|
214
351
|
for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
|
|
215
352
|
const propertyValue = configuration[propertyName];
|
|
216
353
|
if (propertyValue !== UNDEFINED_VALUE) {
|
|
217
|
-
|
|
354
|
+
checkedConfiguration[propertyName] = checkPropertyValue(propertyName, propertyValue);
|
|
218
355
|
}
|
|
219
356
|
}
|
|
357
|
+
return checkedConfiguration;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
function checkPropertyValue(propertyName, propertyValue) {
|
|
361
|
+
if (NUMBER_PROPERTY_NAMES.includes(propertyName)) {
|
|
362
|
+
propertyValue = toNumber(propertyValue);
|
|
363
|
+
if (propertyName == PROPERTY_NAME_MAX_WORKERS && (!Number.isInteger(propertyValue) || propertyValue < MINIMUM_PROPERTY_VALUE)) {
|
|
364
|
+
throw new Error(ERR_INVALID_MAX_WORKERS);
|
|
365
|
+
}
|
|
366
|
+
} else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
|
|
367
|
+
checkFunctionOption(propertyValue);
|
|
368
|
+
}
|
|
369
|
+
return propertyValue;
|
|
220
370
|
}
|
|
221
371
|
|
|
222
372
|
function normalizeConfiguration(configuration) {
|
|
373
|
+
configuration = configuration || {};
|
|
223
374
|
const { CompressionStreamZlib, DecompressionStreamZlib } = configuration;
|
|
224
375
|
if (CompressionStreamZlib === UNDEFINED_VALUE && DecompressionStreamZlib === UNDEFINED_VALUE) {
|
|
225
376
|
return configuration;
|
|
@@ -235,14 +386,9 @@
|
|
|
235
386
|
}
|
|
236
387
|
|
|
237
388
|
function setDefaultConfiguration(configuration) {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
if (propertyValue !== UNDEFINED_VALUE) {
|
|
242
|
-
DEFAULT_CONFIGURATION[propertyName] = propertyValue;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
configure(configuration);
|
|
389
|
+
const checkedConfiguration = checkConfiguration(normalizeConfiguration(configuration));
|
|
390
|
+
Object.assign(DEFAULT_CONFIGURATION, checkedConfiguration);
|
|
391
|
+
Object.assign(config, checkedConfiguration);
|
|
246
392
|
}
|
|
247
393
|
|
|
248
394
|
function resetConfiguration() {
|
|
@@ -252,7 +398,7 @@
|
|
|
252
398
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
253
399
|
}
|
|
254
400
|
|
|
255
|
-
const r=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],t=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],f=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],n=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],c=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],e=new Uint8Array(288);e.fill(8,0,144),e.fill(9,144,256),e.fill(7,256,280),e.fill(8,280,288);const j$1=new Uint8Array(30).fill(5);function z$1(r){const t=new Uint16Array(16);for(const f of r)t[f]++;t[0]=0;const f=new Uint16Array(17);for(let r=1;15>=r;r++)f[r+1]=f[r]+t[r];const n=new Uint16Array(r.length);for(let t=0;t<r.length;t++)r[t]&&(n[f[r[t]]++]=t);return {j:t,symbols:n}}const W$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",p$1=(s=()=>(W=>{let p=0,s=0,o=0,Y=new Uint8Array(1024),l=0,B=0;for(;!B;){B=u(1);const r=u(2);if(0==r)T();else if(1==r)w(z$1(e),z$1(j$1));else {if(2!=r)throw Error("invalid deflate block type");w(...K());}}return Y.subarray(0,l);function S(){if(p>=W.length)throw Error("unexpected end of deflate data");return W[p++]}function u(r){for(;r>o;)s|=S()<<o,o+=8;const t=s&(1<<r)-1;return s>>>=r,o-=r,t}function T(){s=0,o=0;const r=S()|S()<<8;p+=2,D(l+r);for(let t=0;r>t;t++)Y[l++]=S();}function w(c,e){let j=q(c);for(;256!=j;){if(256>j)D(l+1),Y[l++]=j;else {const c=j-257,z=r[c]+u(t[c]),W=q(e),p=f[W]+u(n[W]);D(l+z);const s=l-p;for(let r=0;z>r;r++)Y[l++]=Y[s+r];}j=q(c);}}function K(){const r=u(5)+257,t=u(5)+1,f=u(4)+4,n=new Uint8Array(19);for(let r=0;f>r;r++)n[c[r]]=u(3);const e=z$1(n),j=new Uint8Array(r+t);let W=0;for(;W<j.length;){const r=q(e);if(16>r)j[W++]=r;else if(16==r){const r=j[W-1];let t=u(2)+3;for(;t--;)j[W++]=r;}else W+=17==r?u(3)+3:u(7)+11;}return [z$1(j.subarray(0,r)),z$1(j.subarray(r))]}function q(r){const{j:t,symbols:f}=r;let n=0,c=0,e=0;for(let r=1;15>=r;r++){n|=u(1);const j=t[r];if(j>n-c)return f[e+(n-c)];e+=j,c=c+j<<1,n<<=1;}throw Error("invalid huffman code")}function D(r){if(Y.length<r){let t=2*Y.length;for(;r>t;)t*=2;const f=new Uint8Array(t);f.set(Y.subarray(0,l)),Y=f;}}})((r=>{const t=(r=(r+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,f=[];for(let n=0;t>n;n+=4){const t=W$1.indexOf(r[n])<<18|W$1.indexOf(r[n+1])<<12|(63&W$1.indexOf(r[n+2]))<<6|63&W$1.indexOf(r[n+3]);f.push(t>>16&255),"="!==r[n+2]&&f.push(t>>8&255),"="!==r[n+3]&&f.push(255&t);}return new Uint8Array(f)})("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")),r=>r({workerURI:r=>{const t="text/javascript";let f=s();if("string"==typeof f&&(f=(new TextEncoder).encode(f)),r){const r=new Blob([f],{type:t});return URL.createObjectURL(r)}return "data:"+t+";base64,"+(r=>{let t="";const f=r.length;let n=0;for(;f>n+2;n+=3){const f=r[n]<<16|r[n+1]<<8|r[n+2];t+=W$1[f>>18&63]+W$1[f>>12&63]+W$1[f>>6&63]+W$1[63&f];}const c=f-n;if(1===c){const f=r[n]<<16;t+=W$1[f>>18&63]+W$1[f>>12&63]+"==";}else if(2===c){const f=r[n]<<16|r[n+1]<<8;t+=W$1[f>>18&63]+W$1[f>>12&63]+W$1[f>>6&63]+"=";}return t})(f)}}));var s;
|
|
401
|
+
const t=[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],n=[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],r=[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],e=[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],o=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],s=new Uint8Array(288);s.fill(8,0,144),s.fill(9,144,256),s.fill(7,256,280),s.fill(8,280,288);const Z$1=new Uint8Array(30).fill(5);function f(t){const n=new Uint16Array(16);for(const r of t)n[r]++;n[0]=0;const r=new Uint16Array(17);for(let t=1;15>=t;t++)r[t+1]=r[t]+n[t];const e=new Uint16Array(t.length);for(let n=0;n<t.length;n++)t[n]&&(e[r[t[n]]++]=n);return {o:n,symbols:e}}const P="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",a=(w=()=>(P=>{let a=0,w=0,b=0,l=new Uint8Array(1024),z=0,i=0;for(;!i;){i=c(1);const t=c(2);if(0==t)x();else if(1==t)h(f(s),f(Z$1));else {if(2!=t)throw Error("invalid deflate block type");h(...K());}}return l.subarray(0,z);function U(){if(a>=P.length)throw Error("unexpected end of deflate data");return P[a++]}function c(t){for(;t>b;)w|=U()<<b,b+=8;const n=w&(1<<t)-1;return w>>>=t,b-=t,n}function x(){w=0,b=0;const t=U()|U()<<8;a+=2,u(z+t);for(let n=0;t>n;n++)l[z++]=U();}function h(o,s){let Z=j(o);for(;256!=Z;){if(256>Z)u(z+1),l[z++]=Z;else {const o=Z-257,f=t[o]+c(n[o]),P=j(s),a=r[P]+c(e[P]);u(z+f);const w=z-a;for(let t=0;f>t;t++)l[z++]=l[w+t];}Z=j(o);}}function K(){const t=c(5)+257,n=c(5)+1,r=c(4)+4,e=new Uint8Array(19);for(let t=0;r>t;t++)e[o[t]]=c(3);const s=f(e),Z=new Uint8Array(t+n);let P=0;for(;P<Z.length;){const t=j(s);if(16>t)Z[P++]=t;else if(16==t){const t=Z[P-1];let n=c(2)+3;for(;n--;)Z[P++]=t;}else P+=17==t?c(3)+3:c(7)+11;}return [f(Z.subarray(0,t)),f(Z.subarray(t))]}function j(t){const{o:n,symbols:r}=t;let e=0,o=0,s=0;for(let t=1;15>=t;t++){e|=c(1);const Z=n[t];if(Z>e-o)return r[s+(e-o)];s+=Z,o=o+Z<<1,e<<=1;}throw Error("invalid huffman code")}function u(t){if(l.length<t){let n=2*l.length;for(;t>n;)n*=2;const r=new Uint8Array(n);r.set(l.subarray(0,z)),l=r;}}})((t=>{const n=(t=(t+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,r=[];for(let e=0;n>e;e+=4){const n=P.indexOf(t[e])<<18|P.indexOf(t[e+1])<<12|(63&P.indexOf(t[e+2]))<<6|63&P.indexOf(t[e+3]);r.push(n>>16&255),"="!==t[e+2]&&r.push(n>>8&255),"="!==t[e+3]&&r.push(255&n);}return new Uint8Array(r)})("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")),t=>t({workerURI:t=>{const n="text/javascript";let r=w();if("string"==typeof r&&(r=(new TextEncoder).encode(r)),t){const t=new Blob([r],{type:n});return URL.createObjectURL(t)}return "data:"+n+";base64,"+(t=>{let n="";const r=t.length;let e=0;for(;r>e+2;e+=3){const r=t[e]<<16|t[e+1]<<8|t[e+2];n+=P[r>>18&63]+P[r>>12&63]+P[r>>6&63]+P[63&r];}const o=r-e;if(1===o){const r=t[e]<<16;n+=P[r>>18&63]+P[r>>12&63]+"==";}else if(2===o){const r=t[e]<<16|t[e+1]<<8;n+=P[r>>18&63]+P[r>>12&63]+P[r>>6&63]+"=";}return n})(r)}}));var w;
|
|
256
402
|
|
|
257
403
|
/*
|
|
258
404
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -1400,13 +1546,13 @@
|
|
|
1400
1546
|
const {
|
|
1401
1547
|
ctr,
|
|
1402
1548
|
hmac,
|
|
1403
|
-
|
|
1549
|
+
pendingInput,
|
|
1404
1550
|
ready
|
|
1405
1551
|
} = this;
|
|
1406
1552
|
if (hmac && ctr) {
|
|
1407
1553
|
await ready;
|
|
1408
|
-
const chunkToDecrypt = subarray(
|
|
1409
|
-
const originalAuthenticationCode = subarray(
|
|
1554
|
+
const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1555
|
+
const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1410
1556
|
let decryptedChunkArray = EMPTY_UINT8_ARRAY;
|
|
1411
1557
|
if (chunkToDecrypt.length) {
|
|
1412
1558
|
const encryptedChunk = toBits(codecBytes, chunkToDecrypt);
|
|
@@ -1415,7 +1561,7 @@
|
|
|
1415
1561
|
decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
|
|
1416
1562
|
}
|
|
1417
1563
|
const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
|
|
1418
|
-
let invalidAuthenticationCode =
|
|
1564
|
+
let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
|
|
1419
1565
|
for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
|
|
1420
1566
|
invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
|
|
1421
1567
|
}
|
|
@@ -1459,14 +1605,14 @@
|
|
|
1459
1605
|
const {
|
|
1460
1606
|
ctr,
|
|
1461
1607
|
hmac,
|
|
1462
|
-
|
|
1608
|
+
pendingInput,
|
|
1463
1609
|
ready
|
|
1464
1610
|
} = this;
|
|
1465
1611
|
if (hmac && ctr) {
|
|
1466
1612
|
await ready;
|
|
1467
1613
|
let encryptedChunkArray = EMPTY_UINT8_ARRAY;
|
|
1468
|
-
if (
|
|
1469
|
-
const encryptedChunk = ctr.update(toBits(codecBytes,
|
|
1614
|
+
if (pendingInput.length) {
|
|
1615
|
+
const encryptedChunk = ctr.update(toBits(codecBytes, pendingInput));
|
|
1470
1616
|
hmac.update(encryptedChunk);
|
|
1471
1617
|
encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
|
|
1472
1618
|
}
|
|
@@ -1483,7 +1629,7 @@
|
|
|
1483
1629
|
ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
|
|
1484
1630
|
password: encodePassword(password, rawPassword),
|
|
1485
1631
|
strength: encryptionStrength - 1,
|
|
1486
|
-
|
|
1632
|
+
pendingInput: EMPTY_UINT8_ARRAY
|
|
1487
1633
|
});
|
|
1488
1634
|
}
|
|
1489
1635
|
|
|
@@ -1491,10 +1637,10 @@
|
|
|
1491
1637
|
const {
|
|
1492
1638
|
ctr,
|
|
1493
1639
|
hmac,
|
|
1494
|
-
|
|
1640
|
+
pendingInput
|
|
1495
1641
|
} = aesCrypto;
|
|
1496
|
-
if (
|
|
1497
|
-
input = concat(
|
|
1642
|
+
if (pendingInput.length) {
|
|
1643
|
+
input = concat(pendingInput, input);
|
|
1498
1644
|
}
|
|
1499
1645
|
const inputLength = input.length - paddingEnd;
|
|
1500
1646
|
output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
|
|
@@ -1510,7 +1656,7 @@
|
|
|
1510
1656
|
}
|
|
1511
1657
|
output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
|
|
1512
1658
|
}
|
|
1513
|
-
aesCrypto.
|
|
1659
|
+
aesCrypto.pendingInput = subarray(input, offset);
|
|
1514
1660
|
return output;
|
|
1515
1661
|
}
|
|
1516
1662
|
|
|
@@ -3283,6 +3429,96 @@
|
|
|
3283
3429
|
resetWebWorkerSupport();
|
|
3284
3430
|
}
|
|
3285
3431
|
|
|
3432
|
+
/*
|
|
3433
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
3434
|
+
|
|
3435
|
+
Redistribution and use in source and binary forms, with or without
|
|
3436
|
+
modification, are permitted provided that the following conditions are met:
|
|
3437
|
+
|
|
3438
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
3439
|
+
this list of conditions and the following disclaimer.
|
|
3440
|
+
|
|
3441
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
3442
|
+
notice, this list of conditions and the following disclaimer in
|
|
3443
|
+
the documentation and/or other materials provided with the distribution.
|
|
3444
|
+
|
|
3445
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
3446
|
+
derived from this software without specific prior written permission.
|
|
3447
|
+
|
|
3448
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
3449
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
3450
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
3451
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
3452
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
3453
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
3454
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
3455
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
3456
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
3457
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
3458
|
+
*/
|
|
3459
|
+
|
|
3460
|
+
/* global TextDecoder */
|
|
3461
|
+
|
|
3462
|
+
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
3463
|
+
const VALID_CP437 = CP437.length == 256;
|
|
3464
|
+
|
|
3465
|
+
function decodeCP437(stringValue) {
|
|
3466
|
+
if (VALID_CP437) {
|
|
3467
|
+
let result = "";
|
|
3468
|
+
for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
|
|
3469
|
+
result += CP437[stringValue[indexCharacter]];
|
|
3470
|
+
}
|
|
3471
|
+
return result;
|
|
3472
|
+
} else {
|
|
3473
|
+
return new TextDecoder().decode(stringValue);
|
|
3474
|
+
}
|
|
3475
|
+
}
|
|
3476
|
+
|
|
3477
|
+
/*
|
|
3478
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
3479
|
+
|
|
3480
|
+
Redistribution and use in source and binary forms, with or without
|
|
3481
|
+
modification, are permitted provided that the following conditions are met:
|
|
3482
|
+
|
|
3483
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
3484
|
+
this list of conditions and the following disclaimer.
|
|
3485
|
+
|
|
3486
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
3487
|
+
notice, this list of conditions and the following disclaimer in
|
|
3488
|
+
the documentation and/or other materials provided with the distribution.
|
|
3489
|
+
|
|
3490
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
3491
|
+
derived from this software without specific prior written permission.
|
|
3492
|
+
|
|
3493
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
3494
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
3495
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
3496
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
3497
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
3498
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
3499
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
3500
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
3501
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
3502
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
3503
|
+
*/
|
|
3504
|
+
|
|
3505
|
+
|
|
3506
|
+
function decodeText(value, encoding) {
|
|
3507
|
+
return decode(value, encoding, true);
|
|
3508
|
+
}
|
|
3509
|
+
|
|
3510
|
+
function decodeTextRemovingBOM(value, encoding) {
|
|
3511
|
+
return decode(value, encoding, false);
|
|
3512
|
+
}
|
|
3513
|
+
|
|
3514
|
+
function decode(value, encoding, ignoreBOM) {
|
|
3515
|
+
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
3516
|
+
return decodeCP437(value);
|
|
3517
|
+
} else {
|
|
3518
|
+
return new TextDecoder(encoding, { ignoreBOM }).decode(value);
|
|
3519
|
+
}
|
|
3520
|
+
}
|
|
3521
|
+
|
|
3286
3522
|
/*
|
|
3287
3523
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
3288
3524
|
|
|
@@ -3355,6 +3591,7 @@
|
|
|
3355
3591
|
createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
|
|
3356
3592
|
const reader = this;
|
|
3357
3593
|
let chunkOffset = 0;
|
|
3594
|
+
chunkSize = normalizeChunkSize(chunkSize);
|
|
3358
3595
|
return new ReadableStream({
|
|
3359
3596
|
async pull(controller) {
|
|
3360
3597
|
const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
|
|
@@ -3362,7 +3599,7 @@
|
|
|
3362
3599
|
if (data.length) {
|
|
3363
3600
|
controller.enqueue(data);
|
|
3364
3601
|
}
|
|
3365
|
-
if ((chunkOffset + chunkSize >= size) || (
|
|
3602
|
+
if ((chunkOffset + chunkSize >= size) || (!data.length && dataSize)) {
|
|
3366
3603
|
controller.close();
|
|
3367
3604
|
} else {
|
|
3368
3605
|
chunkOffset += chunkSize;
|
|
@@ -3442,31 +3679,31 @@
|
|
|
3442
3679
|
Object.assign(this, {
|
|
3443
3680
|
contentType,
|
|
3444
3681
|
data: "data:" + (contentType || "") + ";base64,",
|
|
3445
|
-
|
|
3682
|
+
pendingCharacters: ""
|
|
3446
3683
|
});
|
|
3447
3684
|
}
|
|
3448
3685
|
|
|
3449
3686
|
writeUint8Array(array) {
|
|
3450
3687
|
const writer = this;
|
|
3451
3688
|
let indexArray;
|
|
3452
|
-
let dataString = writer.
|
|
3453
|
-
const delta = writer.
|
|
3454
|
-
writer.
|
|
3689
|
+
let dataString = writer.pendingCharacters;
|
|
3690
|
+
const delta = writer.pendingCharacters.length;
|
|
3691
|
+
writer.pendingCharacters = "";
|
|
3455
3692
|
for (indexArray = 0; indexArray < (Math.floor((delta + array.length) / 3) * 3) - delta; indexArray++) {
|
|
3456
3693
|
dataString += String.fromCharCode(array[indexArray]);
|
|
3457
3694
|
}
|
|
3458
3695
|
for (; indexArray < array.length; indexArray++) {
|
|
3459
|
-
writer.
|
|
3696
|
+
writer.pendingCharacters += String.fromCharCode(array[indexArray]);
|
|
3460
3697
|
}
|
|
3461
3698
|
if (dataString.length > 2) {
|
|
3462
3699
|
writer.data += btoa(dataString);
|
|
3463
3700
|
} else {
|
|
3464
|
-
writer.
|
|
3701
|
+
writer.pendingCharacters = dataString + writer.pendingCharacters;
|
|
3465
3702
|
}
|
|
3466
3703
|
}
|
|
3467
3704
|
|
|
3468
3705
|
getData() {
|
|
3469
|
-
return this.data + btoa(this.
|
|
3706
|
+
return this.data + btoa(this.pendingCharacters);
|
|
3470
3707
|
}
|
|
3471
3708
|
}
|
|
3472
3709
|
|
|
@@ -3496,7 +3733,7 @@
|
|
|
3496
3733
|
constructor(blob) {
|
|
3497
3734
|
super();
|
|
3498
3735
|
Object.assign(this, {
|
|
3499
|
-
blob,
|
|
3736
|
+
sourceBlob: blob,
|
|
3500
3737
|
size: blob.size
|
|
3501
3738
|
});
|
|
3502
3739
|
if (!blobSliceProbe) {
|
|
@@ -3506,13 +3743,13 @@
|
|
|
3506
3743
|
|
|
3507
3744
|
createReadable(options) {
|
|
3508
3745
|
const reader = this;
|
|
3509
|
-
const {
|
|
3746
|
+
const { sourceBlob, size } = reader;
|
|
3510
3747
|
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
3511
3748
|
if (!offset && readSize >= size) {
|
|
3512
|
-
return toCompatibleReadable(
|
|
3749
|
+
return toCompatibleReadable(sourceBlob.stream());
|
|
3513
3750
|
}
|
|
3514
3751
|
if (blobSliceReliable) {
|
|
3515
|
-
return toCompatibleReadable(
|
|
3752
|
+
return toCompatibleReadable(sourceBlob.slice(offset, offset + readSize).stream());
|
|
3516
3753
|
}
|
|
3517
3754
|
return super.createReadable(options);
|
|
3518
3755
|
}
|
|
@@ -3521,7 +3758,7 @@
|
|
|
3521
3758
|
const reader = this;
|
|
3522
3759
|
const offsetEnd = offset + length;
|
|
3523
3760
|
const readsWholeBlob = !offset && offsetEnd >= reader.size;
|
|
3524
|
-
const blob = readsWholeBlob ? reader.
|
|
3761
|
+
const blob = readsWholeBlob ? reader.sourceBlob : reader.sourceBlob.slice(offset, offsetEnd);
|
|
3525
3762
|
let arrayBuffer = await blob.arrayBuffer();
|
|
3526
3763
|
const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
|
|
3527
3764
|
if (sliceIgnoredByBuggyImplementation) {
|
|
@@ -3543,12 +3780,12 @@
|
|
|
3543
3780
|
}
|
|
3544
3781
|
});
|
|
3545
3782
|
writer.contentType = contentType;
|
|
3546
|
-
writer.
|
|
3547
|
-
writer.
|
|
3783
|
+
writer.blobPromise = streamToBlob(transformStream.readable, contentType);
|
|
3784
|
+
writer.blobPromise.catch(() => { });
|
|
3548
3785
|
}
|
|
3549
3786
|
|
|
3550
3787
|
getData() {
|
|
3551
|
-
return this.
|
|
3788
|
+
return this.blobPromise;
|
|
3552
3789
|
}
|
|
3553
3790
|
}
|
|
3554
3791
|
|
|
@@ -3582,7 +3819,7 @@
|
|
|
3582
3819
|
class TextWriter extends BlobWriter {
|
|
3583
3820
|
|
|
3584
3821
|
constructor(encoding) {
|
|
3585
|
-
super(
|
|
3822
|
+
super();
|
|
3586
3823
|
Object.assign(this, {
|
|
3587
3824
|
encoding,
|
|
3588
3825
|
utf8: !encoding || encoding.toLowerCase() == "utf-8"
|
|
@@ -3598,14 +3835,7 @@
|
|
|
3598
3835
|
if (blob.text && utf8) {
|
|
3599
3836
|
return blob.text();
|
|
3600
3837
|
} else {
|
|
3601
|
-
|
|
3602
|
-
return new Promise((resolve, reject) => {
|
|
3603
|
-
Object.assign(reader, {
|
|
3604
|
-
onload: ({ target }) => resolve(target.result),
|
|
3605
|
-
onerror: () => reject(reader.error)
|
|
3606
|
-
});
|
|
3607
|
-
reader.readAsText(blob, encoding);
|
|
3608
|
-
});
|
|
3838
|
+
return decodeTextRemovingBOM(new Uint8Array(await blob.arrayBuffer()), encoding);
|
|
3609
3839
|
}
|
|
3610
3840
|
}
|
|
3611
3841
|
}
|
|
@@ -4273,85 +4503,13 @@
|
|
|
4273
4503
|
return reader.readUint8Array(offset, size);
|
|
4274
4504
|
}
|
|
4275
4505
|
|
|
4276
|
-
|
|
4277
|
-
|
|
4278
|
-
|
|
4279
|
-
|
|
4280
|
-
|
|
4281
|
-
|
|
4282
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4283
|
-
this list of conditions and the following disclaimer.
|
|
4284
|
-
|
|
4285
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4286
|
-
notice, this list of conditions and the following disclaimer in
|
|
4287
|
-
the documentation and/or other materials provided with the distribution.
|
|
4288
|
-
|
|
4289
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4290
|
-
derived from this software without specific prior written permission.
|
|
4291
|
-
|
|
4292
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4293
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4294
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4295
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4296
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4297
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4298
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4299
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4300
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4301
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4302
|
-
*/
|
|
4303
|
-
|
|
4304
|
-
/* global TextDecoder */
|
|
4305
|
-
|
|
4306
|
-
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
4307
|
-
const VALID_CP437 = CP437.length == 256;
|
|
4308
|
-
|
|
4309
|
-
function decodeCP437(stringValue) {
|
|
4310
|
-
if (VALID_CP437) {
|
|
4311
|
-
let result = "";
|
|
4312
|
-
for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
|
|
4313
|
-
result += CP437[stringValue[indexCharacter]];
|
|
4314
|
-
}
|
|
4315
|
-
return result;
|
|
4316
|
-
} else {
|
|
4317
|
-
return new TextDecoder().decode(stringValue);
|
|
4318
|
-
}
|
|
4319
|
-
}
|
|
4320
|
-
|
|
4321
|
-
/*
|
|
4322
|
-
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
4323
|
-
|
|
4324
|
-
Redistribution and use in source and binary forms, with or without
|
|
4325
|
-
modification, are permitted provided that the following conditions are met:
|
|
4326
|
-
|
|
4327
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4328
|
-
this list of conditions and the following disclaimer.
|
|
4329
|
-
|
|
4330
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4331
|
-
notice, this list of conditions and the following disclaimer in
|
|
4332
|
-
the documentation and/or other materials provided with the distribution.
|
|
4333
|
-
|
|
4334
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4335
|
-
derived from this software without specific prior written permission.
|
|
4336
|
-
|
|
4337
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4338
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4339
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4340
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4341
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4342
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4343
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4344
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4345
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4346
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4347
|
-
*/
|
|
4348
|
-
|
|
4349
|
-
|
|
4350
|
-
function decodeText(value, encoding) {
|
|
4351
|
-
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
4352
|
-
return decodeCP437(value);
|
|
4506
|
+
function createReadable(reader, options) {
|
|
4507
|
+
if (reader.createReadable) {
|
|
4508
|
+
return reader.createReadable(options);
|
|
4509
|
+
} else if (reader.readUint8Array) {
|
|
4510
|
+
return Reader.prototype.createReadable.call(reader, options);
|
|
4353
4511
|
} else {
|
|
4354
|
-
return
|
|
4512
|
+
return reader.readable;
|
|
4355
4513
|
}
|
|
4356
4514
|
}
|
|
4357
4515
|
|
|
@@ -4511,83 +4669,6 @@
|
|
|
4511
4669
|
|
|
4512
4670
|
}
|
|
4513
4671
|
|
|
4514
|
-
/*
|
|
4515
|
-
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
4516
|
-
|
|
4517
|
-
Redistribution and use in source and binary forms, with or without
|
|
4518
|
-
modification, are permitted provided that the following conditions are met:
|
|
4519
|
-
|
|
4520
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4521
|
-
this list of conditions and the following disclaimer.
|
|
4522
|
-
|
|
4523
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4524
|
-
notice, this list of conditions and the following disclaimer in
|
|
4525
|
-
the documentation and/or other materials provided with the distribution.
|
|
4526
|
-
|
|
4527
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4528
|
-
derived from this software without specific prior written permission.
|
|
4529
|
-
|
|
4530
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4531
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4532
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4533
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4534
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4535
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4536
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4537
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4538
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4539
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4540
|
-
*/
|
|
4541
|
-
|
|
4542
|
-
const OPTION_FILENAME_ENCODING = "filenameEncoding";
|
|
4543
|
-
const OPTION_COMMENT_ENCODING = "commentEncoding";
|
|
4544
|
-
const OPTION_DECODE_TEXT = "decodeText";
|
|
4545
|
-
const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
|
|
4546
|
-
const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
|
|
4547
|
-
const OPTION_PASSWORD = "password";
|
|
4548
|
-
const OPTION_RAW_PASSWORD = "rawPassword";
|
|
4549
|
-
const OPTION_PASS_THROUGH = "passThrough";
|
|
4550
|
-
const OPTION_SIGNAL = "signal";
|
|
4551
|
-
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
4552
|
-
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
4553
|
-
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
4554
|
-
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
4555
|
-
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
4556
|
-
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
4557
|
-
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
4558
|
-
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
4559
|
-
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
4560
|
-
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
4561
|
-
const OPTION_TRANSFER_STREAMS = "transferStreams";
|
|
4562
|
-
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
4563
|
-
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
4564
|
-
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
4565
|
-
const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
|
|
4566
|
-
const OPTION_KEEP_ORDER = "keepOrder";
|
|
4567
|
-
const OPTION_LEVEL = "level";
|
|
4568
|
-
const OPTION_BUFFERED_WRITE = "bufferedWrite";
|
|
4569
|
-
const OPTION_CREATE_TEMP_STREAM = "createTempStream";
|
|
4570
|
-
const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
|
|
4571
|
-
const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
|
|
4572
|
-
const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
|
|
4573
|
-
const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
|
|
4574
|
-
const OPTION_ENCODE_TEXT = "encodeText";
|
|
4575
|
-
const OPTION_OFFSET = "offset";
|
|
4576
|
-
const OPTION_USDZ = "usdz";
|
|
4577
|
-
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
4578
|
-
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
4579
|
-
const OPTION_STRICTNESS = "strictness";
|
|
4580
|
-
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
4581
|
-
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
4582
|
-
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
4583
|
-
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
4584
|
-
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
4585
|
-
const TEXT_TYPE_FILENAME = "filename";
|
|
4586
|
-
const TEXT_TYPE_COMMENT = "comment";
|
|
4587
|
-
const STRICTNESS_STRICT = "strict";
|
|
4588
|
-
const STRICTNESS_BALANCED = "balanced";
|
|
4589
|
-
const STRICTNESS_TOLERANT = "tolerant";
|
|
4590
|
-
|
|
4591
4672
|
/*
|
|
4592
4673
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4593
4674
|
|
|
@@ -4628,6 +4709,7 @@
|
|
|
4628
4709
|
const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
|
|
4629
4710
|
const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
4630
4711
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
4712
|
+
const ERR_ENTRY_DATA_OUT_OF_BOUNDS = "Entry data out of bounds";
|
|
4631
4713
|
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
4632
4714
|
const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
|
|
4633
4715
|
const ERR_UNSAFE_FILENAME = "Unsafe filename";
|
|
@@ -4648,7 +4730,7 @@
|
|
|
4648
4730
|
];
|
|
4649
4731
|
const ZIP64_EXTRACTION = {
|
|
4650
4732
|
[MAX_16_BITS]: {
|
|
4651
|
-
getValue: getUint32,
|
|
4733
|
+
getValue: getUint32$1,
|
|
4652
4734
|
bytes: 4
|
|
4653
4735
|
},
|
|
4654
4736
|
[MAX_32_BITS]: {
|
|
@@ -4657,6 +4739,7 @@
|
|
|
4657
4739
|
}
|
|
4658
4740
|
};
|
|
4659
4741
|
const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
|
|
4742
|
+
const MAX_DEFLATE_EXPANSION_RATIO = 1032;
|
|
4660
4743
|
const CENTRAL_DIRECTORY_UNREACHABLE = 0;
|
|
4661
4744
|
const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
|
|
4662
4745
|
const CENTRAL_DIRECTORY_REACHABLE = 2;
|
|
@@ -4667,7 +4750,6 @@
|
|
|
4667
4750
|
Object.assign(this, {
|
|
4668
4751
|
reader: new GenericReader(reader),
|
|
4669
4752
|
options,
|
|
4670
|
-
config: getConfiguration(),
|
|
4671
4753
|
readRanges: new Map()
|
|
4672
4754
|
});
|
|
4673
4755
|
}
|
|
@@ -4675,7 +4757,6 @@
|
|
|
4675
4757
|
async* getEntriesGenerator(options = {}) {
|
|
4676
4758
|
const zipReader = this;
|
|
4677
4759
|
let { reader } = zipReader;
|
|
4678
|
-
const { config } = zipReader;
|
|
4679
4760
|
await initStream(reader);
|
|
4680
4761
|
if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
|
|
4681
4762
|
reader = new BlobReader(await streamToBlob(reader.readable));
|
|
@@ -4692,9 +4773,7 @@
|
|
|
4692
4773
|
const normalizeFilename = getOptionValue$1(zipReader, options, OPTION_NORMALIZE_FILENAME);
|
|
4693
4774
|
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
4694
4775
|
if (!endOfDirectoryInfo) {
|
|
4695
|
-
|
|
4696
|
-
const signatureView = getDataView(signatureArray);
|
|
4697
|
-
if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
|
|
4776
|
+
if (await startsWithSplitZipSignature$1(reader)) {
|
|
4698
4777
|
throw new Error(ERR_SPLIT_ZIP_FILE);
|
|
4699
4778
|
} else {
|
|
4700
4779
|
throw new Error(ERR_EOCDR_NOT_FOUND);
|
|
@@ -4704,18 +4783,18 @@
|
|
|
4704
4783
|
throwAmbiguousArchive("multiple end of central directory records");
|
|
4705
4784
|
}
|
|
4706
4785
|
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
4707
|
-
let directoryDataLength = getUint32(endOfDirectoryView, 12);
|
|
4708
|
-
let directoryDataOffset = getUint32(endOfDirectoryView, 16);
|
|
4786
|
+
let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
|
|
4787
|
+
let directoryDataOffset = getUint32$1(endOfDirectoryView, 16);
|
|
4709
4788
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
4710
|
-
const commentLength = getUint16(endOfDirectoryView, 20);
|
|
4789
|
+
const commentLength = getUint16$1(endOfDirectoryView, 20);
|
|
4711
4790
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
4712
4791
|
if (reader.size - appendedDataOffset > maxAppendedDataSize) {
|
|
4713
4792
|
throwAmbiguousArchive("appended data");
|
|
4714
4793
|
}
|
|
4715
|
-
let lastDiskNumber = getUint16(endOfDirectoryView, 4);
|
|
4794
|
+
let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
|
|
4716
4795
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
4717
|
-
let diskNumber = getUint16(endOfDirectoryView, 6);
|
|
4718
|
-
let filesLength = getUint16(endOfDirectoryView, 10);
|
|
4796
|
+
let diskNumber = getUint16$1(endOfDirectoryView, 6);
|
|
4797
|
+
let filesLength = getUint16$1(endOfDirectoryView, 10);
|
|
4719
4798
|
let prependedDataLength = 0;
|
|
4720
4799
|
let startOffset;
|
|
4721
4800
|
let zip64EndOfDirectory;
|
|
@@ -4731,12 +4810,12 @@
|
|
|
4731
4810
|
EMPTY_UINT8_ARRAY;
|
|
4732
4811
|
const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
|
|
4733
4812
|
if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
|
|
4734
|
-
getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
4735
|
-
directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4813
|
+
getUint32$1(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
4814
|
+
directoryDataOffset = getDiskOffset$1(reader, getUint32$1(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4736
4815
|
let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4737
4816
|
let endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4738
4817
|
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
4739
|
-
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
4818
|
+
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
4740
4819
|
directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
|
|
4741
4820
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
4742
4821
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
@@ -4746,7 +4825,7 @@
|
|
|
4746
4825
|
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4747
4826
|
endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4748
4827
|
}
|
|
4749
|
-
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4828
|
+
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4750
4829
|
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4751
4830
|
}
|
|
4752
4831
|
zip64EndOfDirectory = true;
|
|
@@ -4761,13 +4840,13 @@
|
|
|
4761
4840
|
}
|
|
4762
4841
|
}
|
|
4763
4842
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
4764
|
-
lastDiskNumber = getUint32(endOfDirectoryView, 16);
|
|
4765
|
-
} else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
|
|
4843
|
+
lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
|
|
4844
|
+
} else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
|
|
4766
4845
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
4767
4846
|
}
|
|
4768
4847
|
if (diskNumber == MAX_16_BITS) {
|
|
4769
|
-
diskNumber = getUint32(endOfDirectoryView, 20);
|
|
4770
|
-
} else if (checkAmbiguity && diskNumber != getUint32(endOfDirectoryView, 20)) {
|
|
4848
|
+
diskNumber = getUint32$1(endOfDirectoryView, 20);
|
|
4849
|
+
} else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
|
|
4771
4850
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
4772
4851
|
}
|
|
4773
4852
|
if (filesLength == MAX_16_BITS) {
|
|
@@ -4805,11 +4884,11 @@
|
|
|
4805
4884
|
}
|
|
4806
4885
|
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
4807
4886
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4808
|
-
const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4887
|
+
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4809
4888
|
let reconcile = !storedPointsAtDirectory;
|
|
4810
4889
|
if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
4811
4890
|
const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
|
|
4812
|
-
reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4891
|
+
reconcile = getUint32$1(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4813
4892
|
}
|
|
4814
4893
|
if (reconcile) {
|
|
4815
4894
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
@@ -4833,10 +4912,10 @@
|
|
|
4833
4912
|
}
|
|
4834
4913
|
zipReader.directoryOffset = directoryDataOffset;
|
|
4835
4914
|
zipReader.directoryLength = declaredDirectoryDataLength;
|
|
4836
|
-
const decryptCentralDirectory =
|
|
4915
|
+
const decryptCentralDirectory = getFunctionOptionValue$1(zipReader, options, OPTION_DECRYPT_CENTRAL_DIRECTORY);
|
|
4837
4916
|
let decryptedDirectory;
|
|
4838
4917
|
if (decryptCentralDirectory && filesLength && directoryArray.length >= 4 &&
|
|
4839
|
-
getUint32(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
|
|
4918
|
+
getUint32$1(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
|
|
4840
4919
|
(zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4841
4920
|
directoryArray = await decryptCentralDirectory(directoryArray, directoryEncryptionInfo);
|
|
4842
4921
|
directoryView = getDataView(directoryArray);
|
|
@@ -4849,8 +4928,8 @@
|
|
|
4849
4928
|
const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
|
|
4850
4929
|
let duplicateFilename;
|
|
4851
4930
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
4852
|
-
const fileEntry = new ZipEntry$1(reader,
|
|
4853
|
-
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4931
|
+
const fileEntry = new ZipEntry$1(reader, zipReader.options);
|
|
4932
|
+
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32$1(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4854
4933
|
if (indexFile == 0 && !decryptedDirectory && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4855
4934
|
throw new Error(ERR_ENCRYPTED_CENTRAL_DIRECTORY);
|
|
4856
4935
|
}
|
|
@@ -4861,16 +4940,16 @@
|
|
|
4861
4940
|
const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
|
|
4862
4941
|
const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
|
|
4863
4942
|
const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
|
|
4864
|
-
const versionMadeBy = getUint16(directoryView, offset + 4);
|
|
4943
|
+
const versionMadeBy = getUint16$1(directoryView, offset + 4);
|
|
4865
4944
|
const msDosCompatible = versionMadeBy >> 8 == 0;
|
|
4866
4945
|
const unixCompatible = versionMadeBy >> 8 == 3;
|
|
4867
4946
|
const rawFilename = directoryArray.subarray(filenameOffset, extraFieldOffset);
|
|
4868
|
-
const commentLength = getUint16(directoryView, offset + 32);
|
|
4947
|
+
const commentLength = getUint16$1(directoryView, offset + 32);
|
|
4869
4948
|
const endOffset = commentOffset + commentLength;
|
|
4870
4949
|
const rawComment = directoryArray.subarray(commentOffset, endOffset);
|
|
4871
4950
|
const filenameUTF8 = languageEncodingFlag;
|
|
4872
4951
|
const commentUTF8 = languageEncodingFlag;
|
|
4873
|
-
const externalFileAttributes = getUint32(directoryView, offset + 38);
|
|
4952
|
+
const externalFileAttributes = getUint32$1(directoryView, offset + 38);
|
|
4874
4953
|
const msdosAttributesRaw = externalFileAttributes & MAX_8_BITS;
|
|
4875
4954
|
const msdosAttributes = {
|
|
4876
4955
|
readOnly: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_READONLY_MASK),
|
|
@@ -4879,8 +4958,8 @@
|
|
|
4879
4958
|
directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
|
|
4880
4959
|
archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
|
|
4881
4960
|
};
|
|
4882
|
-
const offsetFileEntry = getUint32(directoryView, offset + 42);
|
|
4883
|
-
const decode =
|
|
4961
|
+
const offsetFileEntry = getUint32$1(directoryView, offset + 42);
|
|
4962
|
+
const decode = getFunctionOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
4884
4963
|
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
4885
4964
|
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
4886
4965
|
let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
|
|
@@ -4911,8 +4990,8 @@
|
|
|
4911
4990
|
uncompressedSize: 0,
|
|
4912
4991
|
commentLength,
|
|
4913
4992
|
offset: offsetFileEntry,
|
|
4914
|
-
diskNumberStart: getUint16(directoryView, offset + 34),
|
|
4915
|
-
internalFileAttributes: getUint16(directoryView, offset + 36),
|
|
4993
|
+
diskNumberStart: getUint16$1(directoryView, offset + 34),
|
|
4994
|
+
internalFileAttributes: getUint16$1(directoryView, offset + 36),
|
|
4916
4995
|
externalFileAttributes,
|
|
4917
4996
|
msdosAttributesRaw,
|
|
4918
4997
|
msdosAttributes,
|
|
@@ -4980,8 +5059,8 @@
|
|
|
4980
5059
|
yield entry;
|
|
4981
5060
|
}
|
|
4982
5061
|
let offsetAfterSignature = offset;
|
|
4983
|
-
if (offset + 6 <= directoryArray.length && getUint32(directoryView, offset) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
|
|
4984
|
-
const signatureDataLength = getUint16(directoryView, offset + 4);
|
|
5062
|
+
if (offset + 6 <= directoryArray.length && getUint32$1(directoryView, offset) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
|
|
5063
|
+
const signatureDataLength = getUint16$1(directoryView, offset + 4);
|
|
4985
5064
|
if (offset + 6 + signatureDataLength <= directoryArray.length) {
|
|
4986
5065
|
zipReader.digitalSignature = directoryArray.subarray(offset + 6, offset + 6 + signatureDataLength);
|
|
4987
5066
|
offsetAfterSignature = offset + 6 + signatureDataLength;
|
|
@@ -4993,13 +5072,17 @@
|
|
|
4993
5072
|
if (duplicateFilename) {
|
|
4994
5073
|
throwAmbiguousArchive("duplicate filename");
|
|
4995
5074
|
}
|
|
4996
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > 0))) {
|
|
4997
|
-
throwAmbiguousArchive("prepended data");
|
|
4998
|
-
}
|
|
4999
5075
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
5000
5076
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5077
|
+
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5078
|
+
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5079
|
+
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5080
|
+
throwAmbiguousArchive("prepended data");
|
|
5081
|
+
}
|
|
5001
5082
|
if (extractPrependedData) {
|
|
5002
|
-
zipReader.prependedData = startOffset >
|
|
5083
|
+
zipReader.prependedData = startOffset > splitZipSignatureLength ?
|
|
5084
|
+
await readUint8Array(reader, splitZipSignatureLength, startOffset - splitZipSignatureLength) :
|
|
5085
|
+
EMPTY_UINT8_ARRAY;
|
|
5003
5086
|
}
|
|
5004
5087
|
zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : EMPTY_UINT8_ARRAY;
|
|
5005
5088
|
if (extractAppendedData) {
|
|
@@ -5066,16 +5149,16 @@
|
|
|
5066
5149
|
|
|
5067
5150
|
let ZipEntry$1 = class ZipEntry {
|
|
5068
5151
|
|
|
5069
|
-
constructor(reader,
|
|
5152
|
+
constructor(reader, options) {
|
|
5070
5153
|
Object.assign(this, {
|
|
5071
5154
|
reader,
|
|
5072
|
-
config,
|
|
5073
5155
|
options
|
|
5074
5156
|
});
|
|
5075
5157
|
}
|
|
5076
5158
|
|
|
5077
5159
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5078
5160
|
const zipEntry = this;
|
|
5161
|
+
const config = getConfiguration();
|
|
5079
5162
|
const {
|
|
5080
5163
|
reader,
|
|
5081
5164
|
index,
|
|
@@ -5084,7 +5167,6 @@
|
|
|
5084
5167
|
extraFieldAES,
|
|
5085
5168
|
extraFieldZip64,
|
|
5086
5169
|
compressionMethod,
|
|
5087
|
-
config,
|
|
5088
5170
|
bitFlag,
|
|
5089
5171
|
rawBitFlag,
|
|
5090
5172
|
crc32,
|
|
@@ -5102,6 +5184,7 @@
|
|
|
5102
5184
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
5103
5185
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
5104
5186
|
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
5187
|
+
checkPasswordOption(password, rawPassword);
|
|
5105
5188
|
password = password && password.length && password;
|
|
5106
5189
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
5107
5190
|
if (extraFieldAES) {
|
|
@@ -5109,7 +5192,7 @@
|
|
|
5109
5192
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
5110
5193
|
}
|
|
5111
5194
|
}
|
|
5112
|
-
if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
5195
|
+
if (dataArray.length < HEADER_SIZE || getUint32$1(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
5113
5196
|
throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
|
|
5114
5197
|
}
|
|
5115
5198
|
readCommonHeader(localDirectory, dataView, 4);
|
|
@@ -5171,9 +5254,12 @@
|
|
|
5171
5254
|
}
|
|
5172
5255
|
}
|
|
5173
5256
|
const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
|
|
5257
|
+
if (dataOffset + compressedSize > reader.size) {
|
|
5258
|
+
throw new Error(ERR_ENTRY_DATA_OUT_OF_BOUNDS);
|
|
5259
|
+
}
|
|
5174
5260
|
const size = compressedSize;
|
|
5175
5261
|
const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
|
|
5176
|
-
const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
|
|
5262
|
+
const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
|
|
5177
5263
|
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5178
5264
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
5179
5265
|
const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
|
|
@@ -5181,6 +5267,8 @@
|
|
|
5181
5267
|
checkOverlappingEntry = true;
|
|
5182
5268
|
}
|
|
5183
5269
|
const { onstart, onprogress, onend } = options;
|
|
5270
|
+
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThrough;
|
|
5271
|
+
const outputSize = passThrough ? compressedSize : uncompressedSize;
|
|
5184
5272
|
const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
|
|
5185
5273
|
let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
|
|
5186
5274
|
if (deflate64) {
|
|
@@ -5201,9 +5289,9 @@
|
|
|
5201
5289
|
checkCrc32,
|
|
5202
5290
|
checkAuthenticationCode: getOptionValue$1(zipEntry, options, OPTION_CHECK_AUTHENTICATION_CODE),
|
|
5203
5291
|
passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & MAX_8_BITS) : ((crc32 >>> 24) & MAX_8_BITS)),
|
|
5204
|
-
outputSize
|
|
5292
|
+
outputSize,
|
|
5205
5293
|
crc32,
|
|
5206
|
-
compressed
|
|
5294
|
+
compressed,
|
|
5207
5295
|
encrypted,
|
|
5208
5296
|
useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
|
|
5209
5297
|
useCompressionStream,
|
|
@@ -5240,11 +5328,11 @@
|
|
|
5240
5328
|
writer = new WritableStream();
|
|
5241
5329
|
}
|
|
5242
5330
|
writer = new GenericWriter(writer);
|
|
5243
|
-
await initStream(writer,
|
|
5331
|
+
await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
|
|
5244
5332
|
({ writable } = writer);
|
|
5245
|
-
const { outputSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5246
|
-
writer.size +=
|
|
5247
|
-
if (
|
|
5333
|
+
const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5334
|
+
writer.size += writtenSize;
|
|
5335
|
+
if (writtenSize != outputSize) {
|
|
5248
5336
|
throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
5249
5337
|
}
|
|
5250
5338
|
}
|
|
@@ -5278,7 +5366,7 @@
|
|
|
5278
5366
|
function detectEncryptedCentralDirectory(directoryView) {
|
|
5279
5367
|
const maxOffset = Math.min(directoryView.byteLength, 1024) - 3;
|
|
5280
5368
|
for (let offset = 0; offset < maxOffset; offset++) {
|
|
5281
|
-
if (getUint32(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
5369
|
+
if (getUint32$1(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
5282
5370
|
return true;
|
|
5283
5371
|
}
|
|
5284
5372
|
}
|
|
@@ -5289,15 +5377,15 @@
|
|
|
5289
5377
|
const directoryEncryptionInfo = { rawExtensibleData };
|
|
5290
5378
|
if (rawExtensibleData.length >= 28) {
|
|
5291
5379
|
const extensibleDataView = getDataView(rawExtensibleData);
|
|
5292
|
-
const hashDataLength = getUint16(extensibleDataView, 26);
|
|
5380
|
+
const hashDataLength = getUint16$1(extensibleDataView, 26);
|
|
5293
5381
|
Object.assign(directoryEncryptionInfo, {
|
|
5294
|
-
compressionMethod: getUint16(extensibleDataView, 0),
|
|
5382
|
+
compressionMethod: getUint16$1(extensibleDataView, 0),
|
|
5295
5383
|
compressedSize: Number(getBigUint64(extensibleDataView, 2)),
|
|
5296
5384
|
uncompressedSize: Number(getBigUint64(extensibleDataView, 10)),
|
|
5297
|
-
encryptionAlgorithm: getUint16(extensibleDataView, 18),
|
|
5298
|
-
bitLength: getUint16(extensibleDataView, 20),
|
|
5299
|
-
flags: getUint16(extensibleDataView, 22),
|
|
5300
|
-
hashAlgorithm: getUint16(extensibleDataView, 24),
|
|
5385
|
+
encryptionAlgorithm: getUint16$1(extensibleDataView, 18),
|
|
5386
|
+
bitLength: getUint16$1(extensibleDataView, 20),
|
|
5387
|
+
flags: getUint16$1(extensibleDataView, 22),
|
|
5388
|
+
hashAlgorithm: getUint16$1(extensibleDataView, 24),
|
|
5301
5389
|
hashData: rawExtensibleData.subarray(28, 28 + hashDataLength)
|
|
5302
5390
|
});
|
|
5303
5391
|
}
|
|
@@ -5305,12 +5393,12 @@
|
|
|
5305
5393
|
}
|
|
5306
5394
|
|
|
5307
5395
|
function readCommonHeader(directory, dataView, offset) {
|
|
5308
|
-
const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2);
|
|
5396
|
+
const rawBitFlag = directory.rawBitFlag = getUint16$1(dataView, offset + 2);
|
|
5309
5397
|
const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED;
|
|
5310
|
-
const rawLastModDate = getUint32(dataView, offset + 6);
|
|
5398
|
+
const rawLastModDate = getUint32$1(dataView, offset + 6);
|
|
5311
5399
|
Object.assign(directory, {
|
|
5312
5400
|
encrypted,
|
|
5313
|
-
version: getUint16(dataView, offset),
|
|
5401
|
+
version: getUint16$1(dataView, offset),
|
|
5314
5402
|
bitFlag: {
|
|
5315
5403
|
level: (rawBitFlag & BITFLAG_LEVEL) >> 1,
|
|
5316
5404
|
dataDescriptor: (rawBitFlag & BITFLAG_DATA_DESCRIPTOR) == BITFLAG_DATA_DESCRIPTOR,
|
|
@@ -5318,8 +5406,8 @@
|
|
|
5318
5406
|
},
|
|
5319
5407
|
rawLastModDate,
|
|
5320
5408
|
lastModDate: getDate(rawLastModDate),
|
|
5321
|
-
filenameLength: getUint16(dataView, offset + 22),
|
|
5322
|
-
extraFieldLength: getUint16(dataView, offset + 24)
|
|
5409
|
+
filenameLength: getUint16$1(dataView, offset + 22),
|
|
5410
|
+
extraFieldLength: getUint16$1(dataView, offset + 24)
|
|
5323
5411
|
});
|
|
5324
5412
|
}
|
|
5325
5413
|
|
|
@@ -5330,8 +5418,8 @@
|
|
|
5330
5418
|
let offsetExtraField = 0;
|
|
5331
5419
|
try {
|
|
5332
5420
|
while (offsetExtraField < rawExtraField.length) {
|
|
5333
|
-
const type = getUint16(rawExtraFieldView, offsetExtraField);
|
|
5334
|
-
const size = getUint16(rawExtraFieldView, offsetExtraField + 2);
|
|
5421
|
+
const type = getUint16$1(rawExtraFieldView, offsetExtraField);
|
|
5422
|
+
const size = getUint16$1(rawExtraFieldView, offsetExtraField + 2);
|
|
5335
5423
|
extraField.set(type, {
|
|
5336
5424
|
type,
|
|
5337
5425
|
data: rawExtraField.slice(offsetExtraField + 4, offsetExtraField + 4 + size)
|
|
@@ -5341,12 +5429,12 @@
|
|
|
5341
5429
|
} catch {
|
|
5342
5430
|
// ignored
|
|
5343
5431
|
}
|
|
5344
|
-
const compressionMethod = getUint16(dataView, offset + 4);
|
|
5432
|
+
const compressionMethod = getUint16$1(dataView, offset + 4);
|
|
5345
5433
|
Object.assign(directory, {
|
|
5346
|
-
signature: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5347
|
-
crc32: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5348
|
-
compressedSize: getUint32(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
|
|
5349
|
-
uncompressedSize: getUint32(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
|
|
5434
|
+
signature: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5435
|
+
crc32: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5436
|
+
compressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
|
|
5437
|
+
uncompressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
|
|
5350
5438
|
});
|
|
5351
5439
|
const extraFieldZip64 = extraField.get(EXTRAFIELD_TYPE_ZIP64);
|
|
5352
5440
|
if (extraFieldZip64) {
|
|
@@ -5435,11 +5523,11 @@
|
|
|
5435
5523
|
computedCrc32.append(fileEntry[rawPropertyName]);
|
|
5436
5524
|
const computedCrc32View = getDataView(new Uint8Array(4));
|
|
5437
5525
|
computedCrc32View.setUint32(0, computedCrc32.get(), true);
|
|
5438
|
-
const nameCrc32 = getUint32(extraFieldView, 1);
|
|
5526
|
+
const nameCrc32 = getUint32$1(extraFieldView, 1);
|
|
5439
5527
|
Object.assign(extraFieldUnicode, {
|
|
5440
5528
|
version: getUint8(extraFieldView, 0),
|
|
5441
5529
|
[propertyName]: decodeText(extraFieldUnicode.data.subarray(5)),
|
|
5442
|
-
valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32(computedCrc32View, 0)
|
|
5530
|
+
valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32$1(computedCrc32View, 0)
|
|
5443
5531
|
});
|
|
5444
5532
|
if (extraFieldUnicode.valid) {
|
|
5445
5533
|
directory[propertyName] = extraFieldUnicode[propertyName];
|
|
@@ -5455,7 +5543,7 @@
|
|
|
5455
5543
|
vendorId: getUint8(extraFieldView, 2),
|
|
5456
5544
|
strength,
|
|
5457
5545
|
originalCompressionMethod: compressionMethod,
|
|
5458
|
-
compressionMethod: getUint16(extraFieldView, 5)
|
|
5546
|
+
compressionMethod: getUint16$1(extraFieldView, 5)
|
|
5459
5547
|
});
|
|
5460
5548
|
directory.compressionMethod = extraFieldAES.compressionMethod;
|
|
5461
5549
|
if (extraFieldAES.vendorVersion != VENDOR_VERSION_AE_1$1) {
|
|
@@ -5469,8 +5557,8 @@
|
|
|
5469
5557
|
let tag1Data;
|
|
5470
5558
|
try {
|
|
5471
5559
|
while (offsetExtraField < extraFieldNTFS.data.length && !tag1Data) {
|
|
5472
|
-
const tagValue = getUint16(extraFieldView, offsetExtraField);
|
|
5473
|
-
const attributeSize = getUint16(extraFieldView, offsetExtraField + 2);
|
|
5560
|
+
const tagValue = getUint16$1(extraFieldView, offsetExtraField);
|
|
5561
|
+
const attributeSize = getUint16$1(extraFieldView, offsetExtraField + 2);
|
|
5474
5562
|
if (tagValue == EXTRAFIELD_TYPE_NTFS_TAG1) {
|
|
5475
5563
|
tag1Data = extraFieldNTFS.data.slice(offsetExtraField + 4, offsetExtraField + 4 + attributeSize);
|
|
5476
5564
|
}
|
|
@@ -5503,12 +5591,12 @@
|
|
|
5503
5591
|
return;
|
|
5504
5592
|
}
|
|
5505
5593
|
const extraFieldView = getDataView(extraField.data);
|
|
5506
|
-
const lastAccessDate = new Date((getUint32(extraFieldView, 0) | 0) * 1000);
|
|
5507
|
-
const lastModDate = new Date((getUint32(extraFieldView, 4) | 0) * 1000);
|
|
5594
|
+
const lastAccessDate = new Date((getUint32$1(extraFieldView, 0) | 0) * 1000);
|
|
5595
|
+
const lastModDate = new Date((getUint32$1(extraFieldView, 4) | 0) * 1000);
|
|
5508
5596
|
const extraFieldData = { lastAccessDate, lastModDate };
|
|
5509
5597
|
if (extraField.data.length >= 12) {
|
|
5510
|
-
extraFieldData.uid = getUint16(extraFieldView, 8);
|
|
5511
|
-
extraFieldData.gid = getUint16(extraFieldView, 10);
|
|
5598
|
+
extraFieldData.uid = getUint16$1(extraFieldView, 8);
|
|
5599
|
+
extraFieldData.gid = getUint16$1(extraFieldView, 10);
|
|
5512
5600
|
}
|
|
5513
5601
|
Object.assign(extraField, extraFieldData);
|
|
5514
5602
|
Object.assign(directory, extraFieldData);
|
|
@@ -5528,8 +5616,8 @@
|
|
|
5528
5616
|
gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
|
|
5529
5617
|
Object.assign(extraField, { version, uid, gid });
|
|
5530
5618
|
} else if (extraField.data.length >= 4) {
|
|
5531
|
-
uid = getUint16(view, 0);
|
|
5532
|
-
gid = getUint16(view, 2);
|
|
5619
|
+
uid = getUint16$1(view, 0);
|
|
5620
|
+
gid = getUint16$1(view, 2);
|
|
5533
5621
|
Object.assign(extraField, { uid, gid });
|
|
5534
5622
|
}
|
|
5535
5623
|
if (uid !== UNDEFINED_VALUE) {
|
|
@@ -5579,7 +5667,7 @@
|
|
|
5579
5667
|
let offset = 1;
|
|
5580
5668
|
timeProperties.forEach((propertyName, indexProperty) => {
|
|
5581
5669
|
if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
|
|
5582
|
-
const time = getUint32(extraFieldView, offset);
|
|
5670
|
+
const time = getUint32$1(extraFieldView, offset);
|
|
5583
5671
|
directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
|
|
5584
5672
|
const rawPropertyName = timeRawProperties[indexProperty];
|
|
5585
5673
|
extraFieldExtendedTimestamp[rawPropertyName] = time;
|
|
@@ -5613,7 +5701,7 @@
|
|
|
5613
5701
|
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
|
|
5614
5702
|
const dataDescriptorView = getDataView(dataDescriptorArray);
|
|
5615
5703
|
let signature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
|
|
5616
|
-
getUint32(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
5704
|
+
getUint32$1(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
5617
5705
|
if (signature) {
|
|
5618
5706
|
const signedDataDescriptor = readDataDescriptor(dataDescriptorView, DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, extraFieldZip64);
|
|
5619
5707
|
const matchCrc32 = (fileEntry.encrypted && !fileEntry.zipCrypto) || signedDataDescriptor.crc32 == crc32;
|
|
@@ -5647,15 +5735,15 @@
|
|
|
5647
5735
|
}
|
|
5648
5736
|
|
|
5649
5737
|
function readDataDescriptor(dataDescriptorView, offset, extraFieldZip64) {
|
|
5650
|
-
const crc32 = getUint32(dataDescriptorView, offset);
|
|
5738
|
+
const crc32 = getUint32$1(dataDescriptorView, offset);
|
|
5651
5739
|
let compressedSize;
|
|
5652
5740
|
let uncompressedSize;
|
|
5653
5741
|
if (extraFieldZip64) {
|
|
5654
5742
|
compressedSize = getBigUint64(dataDescriptorView, offset + 4);
|
|
5655
5743
|
uncompressedSize = getBigUint64(dataDescriptorView, offset + 12);
|
|
5656
5744
|
} else {
|
|
5657
|
-
compressedSize = getUint32(dataDescriptorView, offset + 4);
|
|
5658
|
-
uncompressedSize = getUint32(dataDescriptorView, offset + 8);
|
|
5745
|
+
compressedSize = getUint32$1(dataDescriptorView, offset + 4);
|
|
5746
|
+
uncompressedSize = getUint32$1(dataDescriptorView, offset + 8);
|
|
5659
5747
|
}
|
|
5660
5748
|
return { crc32, compressedSize, uncompressedSize };
|
|
5661
5749
|
}
|
|
@@ -5664,10 +5752,28 @@
|
|
|
5664
5752
|
return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
|
|
5665
5753
|
}
|
|
5666
5754
|
|
|
5755
|
+
async function startsWithSplitZipSignature$1(reader) {
|
|
5756
|
+
return await getFirstSignature(reader) == SPLIT_ZIP_FILE_SIGNATURE;
|
|
5757
|
+
}
|
|
5758
|
+
|
|
5759
|
+
async function startsWithSplitZipMarker(reader) {
|
|
5760
|
+
const signature = await getFirstSignature(reader);
|
|
5761
|
+
return signature == SPLIT_ZIP_FILE_SIGNATURE || signature == TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE;
|
|
5762
|
+
}
|
|
5763
|
+
|
|
5764
|
+
async function getFirstSignature(reader) {
|
|
5765
|
+
const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
5766
|
+
return getUint32$1(getDataView(signatureArray));
|
|
5767
|
+
}
|
|
5768
|
+
|
|
5667
5769
|
function isStrictnessValue(value) {
|
|
5668
5770
|
return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
|
|
5669
5771
|
}
|
|
5670
5772
|
|
|
5773
|
+
function getDecodableOutputSize(outputSize, compressedSize, compressed) {
|
|
5774
|
+
return Math.min(outputSize, compressed ? compressedSize * MAX_DEFLATE_EXPANSION_RATIO : compressedSize);
|
|
5775
|
+
}
|
|
5776
|
+
|
|
5671
5777
|
function getStrictness(options, inheritedOptions) {
|
|
5672
5778
|
return resolveStrictness(options, resolveStrictness(inheritedOptions, STRICTNESS_BALANCED));
|
|
5673
5779
|
}
|
|
@@ -5730,7 +5836,7 @@
|
|
|
5730
5836
|
|
|
5731
5837
|
function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
|
|
5732
5838
|
if (maxAppendedDataSize !== UNDEFINED_VALUE) {
|
|
5733
|
-
const size = toNumber
|
|
5839
|
+
const size = toNumber(maxAppendedDataSize);
|
|
5734
5840
|
if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
|
|
5735
5841
|
throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE);
|
|
5736
5842
|
}
|
|
@@ -5753,7 +5859,7 @@
|
|
|
5753
5859
|
let plausibleEndOfDirectoryInfo;
|
|
5754
5860
|
let endOfDirectoryReachingEndCount = 0;
|
|
5755
5861
|
for await (const [anchoredView, anchoredOffset, anchoredArray, indexByte, offset] of scanEndOfCentralDirectory(reader, anchoredLength)) {
|
|
5756
|
-
const commentLength = getUint16(anchoredView, indexByte + 20);
|
|
5862
|
+
const commentLength = getUint16$1(anchoredView, indexByte + 20);
|
|
5757
5863
|
if (offset + END_OF_CENTRAL_DIR_LENGTH + commentLength == size) {
|
|
5758
5864
|
const reachability = await getCentralDirectoryReachability(reader, anchoredView, anchoredOffset, indexByte, offset, size, remoteProbeBudget);
|
|
5759
5865
|
if (reachability == CENTRAL_DIRECTORY_REACHABLE) {
|
|
@@ -5804,7 +5910,7 @@
|
|
|
5804
5910
|
const scanArray = await readUint8Array(reader, scanOffset, scanLength);
|
|
5805
5911
|
const scanView = getDataView(scanArray);
|
|
5806
5912
|
for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
|
|
5807
|
-
if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
5913
|
+
if (getUint32$1(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
5808
5914
|
yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
|
|
5809
5915
|
}
|
|
5810
5916
|
}
|
|
@@ -5815,9 +5921,9 @@
|
|
|
5815
5921
|
}
|
|
5816
5922
|
|
|
5817
5923
|
async function getCentralDirectoryReachability(reader, view, anchoredOffset, indexByte, offset, size, remoteProbeBudget) {
|
|
5818
|
-
const filesLength = getUint16(view, indexByte + 10);
|
|
5819
|
-
const directoryDataLength = getUint32(view, indexByte + 12);
|
|
5820
|
-
const directoryDataOffset = getUint32(view, indexByte + 16);
|
|
5924
|
+
const filesLength = getUint16$1(view, indexByte + 10);
|
|
5925
|
+
const directoryDataLength = getUint32$1(view, indexByte + 12);
|
|
5926
|
+
const directoryDataOffset = getUint32$1(view, indexByte + 16);
|
|
5821
5927
|
if (filesLength == MAX_16_BITS || directoryDataLength == MAX_32_BITS || directoryDataOffset == MAX_32_BITS) {
|
|
5822
5928
|
const locatorSignature = await readSignature(reader, view, anchoredOffset, offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, size, remoteProbeBudget);
|
|
5823
5929
|
return locatorSignature == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE ? CENTRAL_DIRECTORY_REACHABLE : CENTRAL_DIRECTORY_UNREACHABLE;
|
|
@@ -5825,7 +5931,7 @@
|
|
|
5825
5931
|
if (!filesLength && !directoryDataLength) {
|
|
5826
5932
|
return CENTRAL_DIRECTORY_PLAUSIBLE;
|
|
5827
5933
|
}
|
|
5828
|
-
const directoryDiskNumber = getUint16(view, indexByte + 6);
|
|
5934
|
+
const directoryDiskNumber = getUint16$1(view, indexByte + 6);
|
|
5829
5935
|
for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
|
|
5830
5936
|
if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
5831
5937
|
return CENTRAL_DIRECTORY_REACHABLE;
|
|
@@ -5839,12 +5945,12 @@
|
|
|
5839
5945
|
return UNDEFINED_VALUE;
|
|
5840
5946
|
}
|
|
5841
5947
|
if (signatureOffset >= anchoredOffset) {
|
|
5842
|
-
return getUint32(view, signatureOffset - anchoredOffset);
|
|
5948
|
+
return getUint32$1(view, signatureOffset - anchoredOffset);
|
|
5843
5949
|
}
|
|
5844
5950
|
if (remoteProbeBudget.count > 0) {
|
|
5845
5951
|
remoteProbeBudget.count--;
|
|
5846
5952
|
const signatureArray = await readUint8Array(reader, signatureOffset, 4);
|
|
5847
|
-
return getUint32(getDataView(signatureArray), 0);
|
|
5953
|
+
return getUint32$1(getDataView(signatureArray), 0);
|
|
5848
5954
|
}
|
|
5849
5955
|
return UNDEFINED_VALUE;
|
|
5850
5956
|
}
|
|
@@ -5881,10 +5987,11 @@
|
|
|
5881
5987
|
return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
|
|
5882
5988
|
}
|
|
5883
5989
|
|
|
5884
|
-
function
|
|
5885
|
-
return
|
|
5990
|
+
function getFunctionOptionValue$1(zipReader, options, name) {
|
|
5991
|
+
return checkFunctionOption(getOptionValue$1(zipReader, options, name));
|
|
5886
5992
|
}
|
|
5887
5993
|
|
|
5994
|
+
|
|
5888
5995
|
function getDate(timeRaw) {
|
|
5889
5996
|
const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
|
|
5890
5997
|
return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
|
|
@@ -5898,11 +6005,11 @@
|
|
|
5898
6005
|
return view.getUint8(offset);
|
|
5899
6006
|
}
|
|
5900
6007
|
|
|
5901
|
-
function getUint16(view, offset) {
|
|
6008
|
+
function getUint16$1(view, offset) {
|
|
5902
6009
|
return view.getUint16(offset, true);
|
|
5903
6010
|
}
|
|
5904
6011
|
|
|
5905
|
-
function getUint32(view, offset) {
|
|
6012
|
+
function getUint32$1(view, offset) {
|
|
5906
6013
|
return view.getUint32(offset, true);
|
|
5907
6014
|
}
|
|
5908
6015
|
|
|
@@ -5917,6 +6024,7 @@
|
|
|
5917
6024
|
ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
|
|
5918
6025
|
ERR_ENCRYPTED: ERR_ENCRYPTED,
|
|
5919
6026
|
ERR_ENCRYPTED_CENTRAL_DIRECTORY: ERR_ENCRYPTED_CENTRAL_DIRECTORY,
|
|
6027
|
+
ERR_ENTRY_DATA_OUT_OF_BOUNDS: ERR_ENTRY_DATA_OUT_OF_BOUNDS,
|
|
5920
6028
|
ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
|
|
5921
6029
|
ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
|
|
5922
6030
|
ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
|
|
@@ -5973,12 +6081,16 @@
|
|
|
5973
6081
|
const ERR_INVALID_COMMENT = "Zip file comment exceeds 64KB";
|
|
5974
6082
|
const ERR_INVALID_COMMENT_TYPE = "Invalid zip file comment (must be a Uint8Array)";
|
|
5975
6083
|
const ERR_INVALID_ENTRY_COMMENT = "File entry comment exceeds 64KB";
|
|
6084
|
+
const ERR_INVALID_ENTRY_COMMENT_TYPE = "Invalid file entry comment (must be a string)";
|
|
6085
|
+
const ERR_INVALID_DATE = "Invalid date (must be a valid Date instance)";
|
|
5976
6086
|
const ERR_INVALID_ENTRY_NAME = "File entry name exceeds 64KB";
|
|
5977
6087
|
const ERR_INVALID_VERSION = "Version exceeds 65535";
|
|
5978
6088
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
5979
6089
|
const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
|
|
5980
6090
|
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
|
|
5981
|
-
const
|
|
6091
|
+
const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
|
|
6092
|
+
const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
|
|
6093
|
+
const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
|
|
5982
6094
|
const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
|
|
5983
6095
|
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
5984
6096
|
const MIN_UNIX_TIME = -2147483648;
|
|
@@ -5998,7 +6110,6 @@
|
|
|
5998
6110
|
const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
|
|
5999
6111
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
6000
6112
|
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
6001
|
-
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
6002
6113
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
6003
6114
|
|
|
6004
6115
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
@@ -6023,8 +6134,7 @@
|
|
|
6023
6134
|
writer,
|
|
6024
6135
|
addSplitZipSignature,
|
|
6025
6136
|
options,
|
|
6026
|
-
|
|
6027
|
-
files: new Map(),
|
|
6137
|
+
fileEntries: new Map(),
|
|
6028
6138
|
filenames: new Set(),
|
|
6029
6139
|
offset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options[OPTION_OFFSET],
|
|
6030
6140
|
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
@@ -6045,14 +6155,23 @@
|
|
|
6045
6155
|
await initStream(reader);
|
|
6046
6156
|
}
|
|
6047
6157
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6048
|
-
const zipReader$1 = new ZipReader(reader
|
|
6158
|
+
const zipReader$1 = new ZipReader(reader);
|
|
6049
6159
|
const entries = await zipReader$1.getEntries();
|
|
6050
6160
|
await zipReader$1.close();
|
|
6051
6161
|
await initStream(this.writer);
|
|
6052
|
-
|
|
6053
|
-
|
|
6162
|
+
const { directoryOffset } = zipReader$1;
|
|
6163
|
+
let splitZipSignatureLength = 0;
|
|
6164
|
+
if (this.addSplitZipSignature) {
|
|
6165
|
+
delete this.addSplitZipSignature;
|
|
6166
|
+
if (!await startsWithSplitZipSignature(reader)) {
|
|
6167
|
+
await writeData(this.writer, getSplitZipSignatureArray());
|
|
6168
|
+
splitZipSignatureLength = SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6169
|
+
this.offset += splitZipSignatureLength;
|
|
6170
|
+
}
|
|
6171
|
+
}
|
|
6172
|
+
const entryPositions = await copyZipData(this, reader, entries, directoryOffset, splitZipSignatureLength);
|
|
6054
6173
|
this.filenames = new Set(entries.map(entry => entry.filename));
|
|
6055
|
-
this.
|
|
6174
|
+
this.fileEntries = new Map(entries.map(entry => {
|
|
6056
6175
|
const {
|
|
6057
6176
|
version,
|
|
6058
6177
|
rawLastModDate,
|
|
@@ -6107,11 +6226,12 @@
|
|
|
6107
6226
|
if (crc32 !== UNDEFINED_VALUE) {
|
|
6108
6227
|
setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
|
|
6109
6228
|
}
|
|
6229
|
+
const { offset, diskNumberStart } = entryPositions.get(entry);
|
|
6110
6230
|
Object.assign(entry, {
|
|
6111
6231
|
zip64UncompressedSize,
|
|
6112
6232
|
zip64CompressedSize,
|
|
6113
|
-
|
|
6114
|
-
diskNumberStart
|
|
6233
|
+
offset,
|
|
6234
|
+
diskNumberStart,
|
|
6115
6235
|
zip64DiskNumberStart: false,
|
|
6116
6236
|
rawExtraFieldZip64,
|
|
6117
6237
|
rawExtraFieldAES,
|
|
@@ -6131,11 +6251,8 @@
|
|
|
6131
6251
|
async add(name = "", reader, options = {}) {
|
|
6132
6252
|
const zipWriter = this;
|
|
6133
6253
|
options = Object.assign({}, options);
|
|
6134
|
-
const {
|
|
6135
|
-
|
|
6136
|
-
config
|
|
6137
|
-
} = zipWriter;
|
|
6138
|
-
if (workers < config.maxWorkers) {
|
|
6254
|
+
const { pendingAddFileCalls } = zipWriter;
|
|
6255
|
+
if (workers < getConfiguration().maxWorkers) {
|
|
6139
6256
|
workers++;
|
|
6140
6257
|
} else {
|
|
6141
6258
|
await new Promise(resolve => pendingEntries.push(resolve));
|
|
@@ -6172,16 +6289,16 @@
|
|
|
6172
6289
|
}
|
|
6173
6290
|
|
|
6174
6291
|
remove(entry) {
|
|
6175
|
-
const { filenames,
|
|
6292
|
+
const { filenames, fileEntries } = this;
|
|
6176
6293
|
// deno-lint-ignore valid-typeof
|
|
6177
6294
|
if (typeof entry == STRING_TYPE) {
|
|
6178
|
-
entry =
|
|
6295
|
+
entry = fileEntries.get(entry);
|
|
6179
6296
|
}
|
|
6180
6297
|
if (entry && entry.filename !== UNDEFINED_VALUE) {
|
|
6181
6298
|
const { filename } = entry;
|
|
6182
|
-
if (filenames.has(filename) &&
|
|
6299
|
+
if (filenames.has(filename) && fileEntries.has(filename)) {
|
|
6183
6300
|
filenames.delete(filename);
|
|
6184
|
-
|
|
6301
|
+
fileEntries.delete(filename);
|
|
6185
6302
|
return true;
|
|
6186
6303
|
}
|
|
6187
6304
|
}
|
|
@@ -6278,12 +6395,12 @@
|
|
|
6278
6395
|
const metadataInfo = resolveMetadata(zipWriter, name, options);
|
|
6279
6396
|
const { comment } = metadataInfo;
|
|
6280
6397
|
const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
|
|
6281
|
-
zipWriter.
|
|
6398
|
+
zipWriter.fileEntries.set(name, UNDEFINED_VALUE);
|
|
6282
6399
|
let fileEntry;
|
|
6283
6400
|
try {
|
|
6284
6401
|
const { resolvedOptions } = metadataInfo;
|
|
6285
6402
|
if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
|
|
6286
|
-
!resolvedOptions.passThrough && !(await supportsDeflate(
|
|
6403
|
+
!resolvedOptions.passThrough && !(await supportsDeflate(getConfiguration()))) {
|
|
6287
6404
|
resolvedOptions.level = 0;
|
|
6288
6405
|
}
|
|
6289
6406
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
@@ -6301,7 +6418,7 @@
|
|
|
6301
6418
|
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
6302
6419
|
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
6303
6420
|
} catch (error) {
|
|
6304
|
-
zipWriter.
|
|
6421
|
+
zipWriter.fileEntries.delete(name);
|
|
6305
6422
|
throw error;
|
|
6306
6423
|
}
|
|
6307
6424
|
Object.assign(fileEntry, {
|
|
@@ -6345,9 +6462,9 @@
|
|
|
6345
6462
|
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
6346
6463
|
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE$1;
|
|
6347
6464
|
}
|
|
6348
|
-
let msdosAttributesRaw =
|
|
6465
|
+
let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
6349
6466
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
6350
|
-
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType;
|
|
6467
|
+
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType || executable;
|
|
6351
6468
|
const hasMsDosProvided = msdosAttributesRaw !== UNDEFINED_VALUE || msdosAttributes !== UNDEFINED_VALUE;
|
|
6352
6469
|
if (hasUnixMetadata) {
|
|
6353
6470
|
msDosCompatible = false;
|
|
@@ -6356,10 +6473,10 @@
|
|
|
6356
6473
|
msDosCompatible = true;
|
|
6357
6474
|
versionMadeBy = (versionMadeBy & MAX_8_BITS);
|
|
6358
6475
|
}
|
|
6359
|
-
if (msdosAttributesRaw !== UNDEFINED_VALUE && (msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
|
|
6476
|
+
if (msdosAttributesRaw !== UNDEFINED_VALUE && (!Number.isInteger(msdosAttributesRaw) || msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
|
|
6360
6477
|
throw new Error(ERR_INVALID_MSDOS_ATTRIBUTES);
|
|
6361
6478
|
}
|
|
6362
|
-
if (msdosAttributes && typeof msdosAttributes !== OBJECT_TYPE) {
|
|
6479
|
+
if (msdosAttributes && (typeof msdosAttributes !== OBJECT_TYPE || Array.isArray(msdosAttributes))) {
|
|
6363
6480
|
throw new Error(ERR_INVALID_MSDOS_DATA);
|
|
6364
6481
|
}
|
|
6365
6482
|
if (versionMadeBy > MAX_16_BITS) {
|
|
@@ -6447,7 +6564,7 @@
|
|
|
6447
6564
|
}
|
|
6448
6565
|
|
|
6449
6566
|
function resolveMetadata(zipWriter, name, options) {
|
|
6450
|
-
const encode =
|
|
6567
|
+
const encode = getFunctionOptionValue(zipWriter, options, OPTION_ENCODE_TEXT) || encodeText;
|
|
6451
6568
|
let rawFilename = encode(name, TEXT_TYPE_FILENAME);
|
|
6452
6569
|
if (rawFilename === UNDEFINED_VALUE) {
|
|
6453
6570
|
rawFilename = encodeText(name);
|
|
@@ -6456,6 +6573,10 @@
|
|
|
6456
6573
|
throw new Error(ERR_INVALID_ENTRY_NAME);
|
|
6457
6574
|
}
|
|
6458
6575
|
const comment = options[PROPERTY_NAME_COMMENT] || "";
|
|
6576
|
+
// deno-lint-ignore valid-typeof
|
|
6577
|
+
if (typeof comment != STRING_TYPE) {
|
|
6578
|
+
throw new Error(ERR_INVALID_ENTRY_COMMENT_TYPE);
|
|
6579
|
+
}
|
|
6459
6580
|
let rawComment = encode(comment, TEXT_TYPE_COMMENT);
|
|
6460
6581
|
if (rawComment === UNDEFINED_VALUE) {
|
|
6461
6582
|
rawComment = encodeText(comment);
|
|
@@ -6467,16 +6588,14 @@
|
|
|
6467
6588
|
if (version > MAX_16_BITS) {
|
|
6468
6589
|
throw new Error(ERR_INVALID_VERSION);
|
|
6469
6590
|
}
|
|
6470
|
-
const lastModDate =
|
|
6471
|
-
const lastAccessDate =
|
|
6472
|
-
const creationDate =
|
|
6591
|
+
const lastModDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE, new Date());
|
|
6592
|
+
const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
|
|
6593
|
+
const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
|
|
6473
6594
|
const internalFileAttributes = getAliasedOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, PROPERTY_NAME_DEPRECATED_INTERNAL_FILE_ATTRIBUTES, 0);
|
|
6474
6595
|
const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
|
|
6475
6596
|
const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6476
6597
|
const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6477
|
-
|
|
6478
|
-
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
6479
|
-
}
|
|
6598
|
+
checkPasswordOption(password, rawPassword);
|
|
6480
6599
|
const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
|
|
6481
6600
|
const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
|
|
6482
6601
|
const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
|
|
@@ -6485,9 +6604,9 @@
|
|
|
6485
6604
|
const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
|
|
6486
6605
|
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
|
|
6487
6606
|
const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
|
|
6488
|
-
const createTempStream =
|
|
6607
|
+
const createTempStream = getFunctionOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
6489
6608
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
6490
|
-
const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
|
|
6609
|
+
const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
|
|
6491
6610
|
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
|
|
6492
6611
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
6493
6612
|
const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
@@ -6567,18 +6686,26 @@
|
|
|
6567
6686
|
if (!extraField) {
|
|
6568
6687
|
return EMPTY_UINT8_ARRAY;
|
|
6569
6688
|
}
|
|
6689
|
+
if (!(extraField instanceof Map)) {
|
|
6690
|
+
throw new Error(ERR_INVALID_EXTRAFIELD);
|
|
6691
|
+
}
|
|
6570
6692
|
let extraFieldSize = 0;
|
|
6571
6693
|
let offset = 0;
|
|
6572
|
-
extraField.forEach(data => extraFieldSize += 4 + getLength(data));
|
|
6573
|
-
const rawExtraField = new Uint8Array(extraFieldSize);
|
|
6574
|
-
const rawExtraFieldView = getDataView(rawExtraField);
|
|
6575
6694
|
extraField.forEach((data, type) => {
|
|
6576
|
-
if (type > MAX_16_BITS) {
|
|
6695
|
+
if (!Number.isInteger(type) || type < 0 || type > MAX_16_BITS) {
|
|
6577
6696
|
throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
|
|
6578
6697
|
}
|
|
6698
|
+
if (!(data instanceof Uint8Array)) {
|
|
6699
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA_TYPE);
|
|
6700
|
+
}
|
|
6579
6701
|
if (getLength(data) > MAX_16_BITS) {
|
|
6580
6702
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
6581
6703
|
}
|
|
6704
|
+
extraFieldSize += 4 + getLength(data);
|
|
6705
|
+
});
|
|
6706
|
+
const rawExtraField = new Uint8Array(extraFieldSize);
|
|
6707
|
+
const rawExtraFieldView = getDataView(rawExtraField);
|
|
6708
|
+
extraField.forEach((data, type) => {
|
|
6582
6709
|
setUint16(rawExtraFieldView, offset, type);
|
|
6583
6710
|
setUint16(rawExtraFieldView, offset + 2, getLength(data));
|
|
6584
6711
|
arraySet(rawExtraField, data, offset + 4);
|
|
@@ -6665,8 +6792,8 @@
|
|
|
6665
6792
|
}
|
|
6666
6793
|
|
|
6667
6794
|
async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comment) {
|
|
6668
|
-
const zipWriter = { options: writerOptions
|
|
6669
|
-
if (writerOptions[OPTION_SIGN_CENTRAL_DIRECTORY]) {
|
|
6795
|
+
const zipWriter = { options: writerOptions };
|
|
6796
|
+
if (checkFunctionOption(writerOptions[OPTION_SIGN_CENTRAL_DIRECTORY])) {
|
|
6670
6797
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
6671
6798
|
}
|
|
6672
6799
|
if (comment !== UNDEFINED_VALUE && !(comment instanceof Uint8Array)) {
|
|
@@ -6692,7 +6819,7 @@
|
|
|
6692
6819
|
({ name } = attributesInfo);
|
|
6693
6820
|
const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
|
|
6694
6821
|
if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
|
|
6695
|
-
!metadata.passThrough && !(await supportsDeflate(
|
|
6822
|
+
!metadata.passThrough && !(await supportsDeflate(getConfiguration()))) {
|
|
6696
6823
|
metadata.level = 0;
|
|
6697
6824
|
}
|
|
6698
6825
|
const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
|
|
@@ -6741,7 +6868,7 @@
|
|
|
6741
6868
|
|
|
6742
6869
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
6743
6870
|
const {
|
|
6744
|
-
|
|
6871
|
+
fileEntries,
|
|
6745
6872
|
writer
|
|
6746
6873
|
} = zipWriter;
|
|
6747
6874
|
const {
|
|
@@ -6763,12 +6890,12 @@
|
|
|
6763
6890
|
let writerSizeBeforeEntry;
|
|
6764
6891
|
let flushedBufferedSize = 0;
|
|
6765
6892
|
let fileWriter;
|
|
6766
|
-
|
|
6893
|
+
fileEntries.set(name, fileEntry);
|
|
6767
6894
|
zipWriter.lastFileEntry = fileEntry;
|
|
6768
6895
|
try {
|
|
6769
6896
|
let lockPreviousFileEntry;
|
|
6770
6897
|
if (keepOrder) {
|
|
6771
|
-
lockPreviousFileEntry = previousFileEntry && previousFileEntry.
|
|
6898
|
+
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
|
|
6772
6899
|
requestLockCurrentFileEntry();
|
|
6773
6900
|
}
|
|
6774
6901
|
if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
|
|
@@ -6789,11 +6916,8 @@
|
|
|
6789
6916
|
const diskOffset = getDiskOffset(writer);
|
|
6790
6917
|
if (zipWriter.addSplitZipSignature) {
|
|
6791
6918
|
delete zipWriter.addSplitZipSignature;
|
|
6792
|
-
|
|
6793
|
-
|
|
6794
|
-
setUint32(signatureArrayView, 0, SPLIT_ZIP_FILE_SIGNATURE);
|
|
6795
|
-
await writeData(writer, signatureArray);
|
|
6796
|
-
zipWriter.offset += 4;
|
|
6919
|
+
await writeData(writer, getSplitZipSignatureArray());
|
|
6920
|
+
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6797
6921
|
}
|
|
6798
6922
|
if (usdz && !bufferedWrite) {
|
|
6799
6923
|
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
|
|
@@ -6811,11 +6935,11 @@
|
|
|
6811
6935
|
writerSizeBeforeEntry = writer.size;
|
|
6812
6936
|
await writeData(fileWriter, localHeaderArray);
|
|
6813
6937
|
}
|
|
6814
|
-
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo,
|
|
6938
|
+
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, getConfiguration(), options);
|
|
6815
6939
|
if (!bufferedWrite) {
|
|
6816
6940
|
writingEntryData = false;
|
|
6817
6941
|
}
|
|
6818
|
-
|
|
6942
|
+
fileEntries.set(name, fileEntry);
|
|
6819
6943
|
fileEntry.filename = name;
|
|
6820
6944
|
if (bufferedWrite) {
|
|
6821
6945
|
await Promise.all([fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
|
|
@@ -6856,7 +6980,7 @@
|
|
|
6856
6980
|
zipWriter.offset += flushedBufferedSize;
|
|
6857
6981
|
}
|
|
6858
6982
|
}
|
|
6859
|
-
|
|
6983
|
+
fileEntries.delete(name);
|
|
6860
6984
|
throw error;
|
|
6861
6985
|
} finally {
|
|
6862
6986
|
if (bufferedWrite) {
|
|
@@ -6878,7 +7002,7 @@
|
|
|
6878
7002
|
}
|
|
6879
7003
|
|
|
6880
7004
|
function requestLockCurrentFileEntry() {
|
|
6881
|
-
fileEntry.
|
|
7005
|
+
fileEntry.lockFileEntry = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
|
|
6882
7006
|
}
|
|
6883
7007
|
|
|
6884
7008
|
async function requestLockWriter() {
|
|
@@ -6898,7 +7022,7 @@
|
|
|
6898
7022
|
}
|
|
6899
7023
|
}
|
|
6900
7024
|
|
|
6901
|
-
async function createFileEntry(reader, writer, { diskNumberStart,
|
|
7025
|
+
async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry }, entryInfo, config, options) {
|
|
6902
7026
|
const {
|
|
6903
7027
|
headerInfo,
|
|
6904
7028
|
dataDescriptorInfo,
|
|
@@ -6966,7 +7090,7 @@
|
|
|
6966
7090
|
codecURI
|
|
6967
7091
|
} = options;
|
|
6968
7092
|
const fileEntry = {
|
|
6969
|
-
|
|
7093
|
+
lockFileEntry,
|
|
6970
7094
|
versionMadeBy,
|
|
6971
7095
|
zip64,
|
|
6972
7096
|
directory: Boolean(directory),
|
|
@@ -7008,7 +7132,7 @@
|
|
|
7008
7132
|
}
|
|
7009
7133
|
const { writable } = writer;
|
|
7010
7134
|
if (reader) {
|
|
7011
|
-
const readable = toCompatibleReadable(
|
|
7135
|
+
const readable = toCompatibleReadable(createReadable(reader));
|
|
7012
7136
|
const size = reader.size;
|
|
7013
7137
|
const workerOptions = {
|
|
7014
7138
|
options: {
|
|
@@ -7120,14 +7244,14 @@
|
|
|
7120
7244
|
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
7121
7245
|
const length = 4 + 16;
|
|
7122
7246
|
const extraFieldZip64 = createRecordWriter(length);
|
|
7123
|
-
extraFieldZip64.
|
|
7124
|
-
extraFieldZip64.
|
|
7247
|
+
extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
|
|
7248
|
+
extraFieldZip64.writeUint16(length - 4);
|
|
7125
7249
|
rawLocalExtraFieldZip64 = extraFieldZip64.array;
|
|
7126
7250
|
if (zip64ExtraFieldComplete) {
|
|
7127
|
-
extraFieldZip64.
|
|
7251
|
+
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7128
7252
|
if (uncompressedFile) {
|
|
7129
7253
|
const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
7130
|
-
extraFieldZip64.
|
|
7254
|
+
extraFieldZip64.writeUint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
|
|
7131
7255
|
}
|
|
7132
7256
|
}
|
|
7133
7257
|
} else {
|
|
@@ -7136,8 +7260,8 @@
|
|
|
7136
7260
|
let rawExtraFieldAES;
|
|
7137
7261
|
if (encrypted && !zipCrypto) {
|
|
7138
7262
|
const extraFieldAES = createRecordWriter(getLength(EXTRAFIELD_DATA_AES) + 2);
|
|
7139
|
-
extraFieldAES.
|
|
7140
|
-
extraFieldAES.
|
|
7263
|
+
extraFieldAES.writeUint16(EXTRAFIELD_TYPE_AES);
|
|
7264
|
+
extraFieldAES.writeBytes(EXTRAFIELD_DATA_AES);
|
|
7141
7265
|
rawExtraFieldAES = extraFieldAES.array;
|
|
7142
7266
|
rawExtraFieldAES[8] = encryptionStrength;
|
|
7143
7267
|
} else {
|
|
@@ -7153,15 +7277,15 @@
|
|
|
7153
7277
|
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
7154
7278
|
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
7155
7279
|
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
7156
|
-
extraFieldTimestamp.
|
|
7157
|
-
extraFieldTimestamp.
|
|
7158
|
-
extraFieldTimestamp.
|
|
7159
|
-
extraFieldTimestamp.
|
|
7280
|
+
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7281
|
+
extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
|
|
7282
|
+
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7283
|
+
extraFieldTimestamp.writeUint32(lastModTimeUnix);
|
|
7160
7284
|
if (lastAccessDate) {
|
|
7161
|
-
extraFieldTimestamp.
|
|
7285
|
+
extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(lastAccessDate)));
|
|
7162
7286
|
}
|
|
7163
7287
|
if (creationDate) {
|
|
7164
|
-
extraFieldTimestamp.
|
|
7288
|
+
extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(creationDate)));
|
|
7165
7289
|
}
|
|
7166
7290
|
rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
|
|
7167
7291
|
} else {
|
|
@@ -7174,14 +7298,14 @@
|
|
|
7174
7298
|
try {
|
|
7175
7299
|
const lastModTimeNTFS = getTimeNTFS(lastModDate);
|
|
7176
7300
|
const extraFieldNTFS = createRecordWriter(36);
|
|
7177
|
-
extraFieldNTFS.
|
|
7178
|
-
extraFieldNTFS.
|
|
7301
|
+
extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS);
|
|
7302
|
+
extraFieldNTFS.writeUint16(32);
|
|
7179
7303
|
extraFieldNTFS.skip(4);
|
|
7180
|
-
extraFieldNTFS.
|
|
7181
|
-
extraFieldNTFS.
|
|
7182
|
-
extraFieldNTFS.
|
|
7183
|
-
extraFieldNTFS.
|
|
7184
|
-
extraFieldNTFS.
|
|
7304
|
+
extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS_TAG1);
|
|
7305
|
+
extraFieldNTFS.writeUint16(24);
|
|
7306
|
+
extraFieldNTFS.writeUint64(lastModTimeNTFS);
|
|
7307
|
+
extraFieldNTFS.writeUint64(lastAccessDate ? getTimeNTFS(lastAccessDate) : lastModTimeNTFS);
|
|
7308
|
+
extraFieldNTFS.writeUint64(creationDate ? getTimeNTFS(creationDate) : lastModTimeNTFS);
|
|
7185
7309
|
rawExtraFieldNTFS = extraFieldNTFS.array;
|
|
7186
7310
|
} catch {
|
|
7187
7311
|
rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
|
|
@@ -7200,20 +7324,20 @@
|
|
|
7200
7324
|
const gidBytes = packUnixId(gid);
|
|
7201
7325
|
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
7202
7326
|
const extraFieldUnix = createRecordWriter(4 + payloadLength);
|
|
7203
|
-
extraFieldUnix.
|
|
7204
|
-
extraFieldUnix.
|
|
7205
|
-
extraFieldUnix.
|
|
7206
|
-
extraFieldUnix.
|
|
7207
|
-
extraFieldUnix.
|
|
7208
|
-
extraFieldUnix.
|
|
7209
|
-
extraFieldUnix.
|
|
7327
|
+
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_INFOZIP);
|
|
7328
|
+
extraFieldUnix.writeUint16(payloadLength);
|
|
7329
|
+
extraFieldUnix.writeUint8(1);
|
|
7330
|
+
extraFieldUnix.writeUint8(uidBytes.length);
|
|
7331
|
+
extraFieldUnix.writeBytes(uidBytes);
|
|
7332
|
+
extraFieldUnix.writeUint8(gidBytes.length);
|
|
7333
|
+
extraFieldUnix.writeBytes(gidBytes);
|
|
7210
7334
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
7211
7335
|
} else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
7212
7336
|
const extraFieldUnix = createRecordWriter(8);
|
|
7213
|
-
extraFieldUnix.
|
|
7214
|
-
extraFieldUnix.
|
|
7215
|
-
extraFieldUnix.
|
|
7216
|
-
extraFieldUnix.
|
|
7337
|
+
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
|
|
7338
|
+
extraFieldUnix.writeUint16(4);
|
|
7339
|
+
extraFieldUnix.writeUint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
|
|
7340
|
+
extraFieldUnix.writeUint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
|
|
7217
7341
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
7218
7342
|
} else {
|
|
7219
7343
|
rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
|
|
@@ -7263,18 +7387,18 @@
|
|
|
7263
7387
|
const localHeader = createRecordWriter(HEADER_SIZE + getLength(rawFilename) + extraFieldLength);
|
|
7264
7388
|
const localHeaderArray = localHeader.array;
|
|
7265
7389
|
const localHeaderView = getDataView(localHeaderArray);
|
|
7266
|
-
localHeader.
|
|
7267
|
-
localHeader.
|
|
7268
|
-
localHeader.
|
|
7390
|
+
localHeader.writeUint32(LOCAL_FILE_HEADER_SIGNATURE);
|
|
7391
|
+
localHeader.writeBytes(headerArray);
|
|
7392
|
+
localHeader.writeBytes(rawFilename);
|
|
7269
7393
|
if (writeLocalExtraFieldZip64) {
|
|
7270
|
-
localHeader.
|
|
7271
|
-
}
|
|
7272
|
-
localHeader.
|
|
7273
|
-
localHeader.
|
|
7274
|
-
localHeader.
|
|
7275
|
-
localHeader.
|
|
7276
|
-
localHeader.
|
|
7277
|
-
localHeader.
|
|
7394
|
+
localHeader.writeBytes(rawLocalExtraFieldZip64);
|
|
7395
|
+
}
|
|
7396
|
+
localHeader.writeBytes(rawExtraFieldAES);
|
|
7397
|
+
localHeader.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
7398
|
+
localHeader.writeBytes(rawExtraFieldNTFS);
|
|
7399
|
+
localHeader.writeBytes(rawExtraFieldUnix);
|
|
7400
|
+
localHeader.writeBytes(rawExtraField);
|
|
7401
|
+
localHeader.writeBytes(rawLocalExtraField);
|
|
7278
7402
|
if (dataDescriptor) {
|
|
7279
7403
|
if (!zip64CompressedSize) {
|
|
7280
7404
|
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
@@ -7464,7 +7588,7 @@
|
|
|
7464
7588
|
|
|
7465
7589
|
|
|
7466
7590
|
async function closeFile(zipWriter, comment, options) {
|
|
7467
|
-
const directoryDataLength = createDirectoryRecords(zipWriter.
|
|
7591
|
+
const directoryDataLength = createDirectoryRecords(zipWriter.fileEntries);
|
|
7468
7592
|
const { directoryStart, directoryArray } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
|
|
7469
7593
|
const signatureLength = await writeDigitalSignatureRecord(zipWriter, directoryArray, options);
|
|
7470
7594
|
await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength, signatureLength });
|
|
@@ -7494,19 +7618,19 @@
|
|
|
7494
7618
|
if (zip64Offset || zip64DiskNumberStart || zip64UncompressedSize || zip64CompressedSize) {
|
|
7495
7619
|
const length = 4 + (zip64UncompressedSize ? 8 : 0) + (zip64CompressedSize ? 8 : 0) + (zip64Offset ? 8 : 0) + (zip64DiskNumberStart ? 4 : 0);
|
|
7496
7620
|
const extraFieldZip64 = createRecordWriter(length);
|
|
7497
|
-
extraFieldZip64.
|
|
7498
|
-
extraFieldZip64.
|
|
7621
|
+
extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
|
|
7622
|
+
extraFieldZip64.writeUint16(length - 4);
|
|
7499
7623
|
if (zip64UncompressedSize) {
|
|
7500
|
-
extraFieldZip64.
|
|
7624
|
+
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7501
7625
|
}
|
|
7502
7626
|
if (zip64CompressedSize) {
|
|
7503
|
-
extraFieldZip64.
|
|
7627
|
+
extraFieldZip64.writeUint64(compressedSize);
|
|
7504
7628
|
}
|
|
7505
7629
|
if (zip64Offset) {
|
|
7506
|
-
extraFieldZip64.
|
|
7630
|
+
extraFieldZip64.writeUint64(fileEntry.offset);
|
|
7507
7631
|
}
|
|
7508
7632
|
if (zip64DiskNumberStart) {
|
|
7509
|
-
extraFieldZip64.
|
|
7633
|
+
extraFieldZip64.writeUint32(fileEntry.diskNumberStart);
|
|
7510
7634
|
}
|
|
7511
7635
|
rawExtraFieldZip64 = extraFieldZip64.array;
|
|
7512
7636
|
} else {
|
|
@@ -7519,10 +7643,10 @@
|
|
|
7519
7643
|
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
7520
7644
|
if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
|
|
7521
7645
|
const extraFieldTimestamp = createRecordWriter(9);
|
|
7522
|
-
extraFieldTimestamp.
|
|
7523
|
-
extraFieldTimestamp.
|
|
7524
|
-
extraFieldTimestamp.
|
|
7525
|
-
extraFieldTimestamp.
|
|
7646
|
+
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7647
|
+
extraFieldTimestamp.writeUint16(5);
|
|
7648
|
+
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7649
|
+
extraFieldTimestamp.writeUint32(lastModTimeUnix);
|
|
7526
7650
|
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
7527
7651
|
} else {
|
|
7528
7652
|
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
@@ -7544,14 +7668,14 @@
|
|
|
7544
7668
|
}
|
|
7545
7669
|
|
|
7546
7670
|
async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
7547
|
-
const {
|
|
7671
|
+
const { fileEntries, writer } = zipWriter;
|
|
7548
7672
|
const directoryArray = new Uint8Array(directoryDataLength);
|
|
7549
7673
|
await initStream(writer);
|
|
7550
7674
|
let offset = 0;
|
|
7551
7675
|
let directoryDiskOffset = 0;
|
|
7552
7676
|
let directoryStartDiskNumber = getDiskNumber(writer);
|
|
7553
7677
|
let directoryStartDiskOffset = getDiskOffset(writer);
|
|
7554
|
-
for (const [indexFileEntry, fileEntry] of Array.from(
|
|
7678
|
+
for (const [indexFileEntry, fileEntry] of Array.from(fileEntries.values()).entries()) {
|
|
7555
7679
|
const {
|
|
7556
7680
|
offset: fileEntryOffset,
|
|
7557
7681
|
rawFilename,
|
|
@@ -7596,28 +7720,28 @@
|
|
|
7596
7720
|
setUint16(headerView, HEADER_OFFSET_VERSION, VERSION_ZIP64);
|
|
7597
7721
|
}
|
|
7598
7722
|
const directoryRecord = createRecordWriter(directoryRecordLength);
|
|
7599
|
-
directoryRecord.
|
|
7600
|
-
directoryRecord.
|
|
7601
|
-
directoryRecord.
|
|
7602
|
-
directoryRecord.
|
|
7603
|
-
directoryRecord.
|
|
7604
|
-
directoryRecord.
|
|
7605
|
-
directoryRecord.
|
|
7606
|
-
directoryRecord.
|
|
7607
|
-
directoryRecord.
|
|
7608
|
-
directoryRecord.
|
|
7609
|
-
directoryRecord.
|
|
7610
|
-
directoryRecord.
|
|
7611
|
-
directoryRecord.
|
|
7612
|
-
directoryRecord.
|
|
7613
|
-
directoryRecord.
|
|
7614
|
-
directoryRecord.
|
|
7615
|
-
directoryRecord.
|
|
7723
|
+
directoryRecord.writeUint32(CENTRAL_FILE_HEADER_SIGNATURE);
|
|
7724
|
+
directoryRecord.writeUint16(versionMadeBy);
|
|
7725
|
+
directoryRecord.writeBytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
|
|
7726
|
+
directoryRecord.writeUint16(extraFieldLength);
|
|
7727
|
+
directoryRecord.writeUint16(getLength(rawComment));
|
|
7728
|
+
directoryRecord.writeUint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
|
|
7729
|
+
directoryRecord.writeUint16(internalFileAttributes);
|
|
7730
|
+
directoryRecord.writeUint32(externalFileAttributes);
|
|
7731
|
+
directoryRecord.writeUint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
|
|
7732
|
+
directoryRecord.writeBytes(rawFilename);
|
|
7733
|
+
directoryRecord.writeBytes(rawExtraFieldZip64);
|
|
7734
|
+
directoryRecord.writeBytes(rawExtraFieldAES);
|
|
7735
|
+
directoryRecord.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
7736
|
+
directoryRecord.writeBytes(rawExtraFieldNTFS);
|
|
7737
|
+
directoryRecord.writeBytes(rawExtraFieldUnix);
|
|
7738
|
+
directoryRecord.writeBytes(rawExtraField);
|
|
7739
|
+
directoryRecord.writeBytes(rawComment);
|
|
7616
7740
|
arraySet(directoryArray, directoryRecord.array, offset);
|
|
7617
7741
|
offset += directoryRecordLength;
|
|
7618
7742
|
if (options.onprogress) {
|
|
7619
7743
|
try {
|
|
7620
|
-
await options.onprogress(indexFileEntry + 1,
|
|
7744
|
+
await options.onprogress(indexFileEntry + 1, fileEntries.size, new Entry(fileEntry));
|
|
7621
7745
|
} catch {
|
|
7622
7746
|
// ignored
|
|
7623
7747
|
}
|
|
@@ -7631,7 +7755,7 @@
|
|
|
7631
7755
|
}
|
|
7632
7756
|
|
|
7633
7757
|
async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
|
|
7634
|
-
const signCentralDirectory =
|
|
7758
|
+
const signCentralDirectory = getFunctionOptionValue(zipWriter, options, OPTION_SIGN_CENTRAL_DIRECTORY);
|
|
7635
7759
|
if (signCentralDirectory) {
|
|
7636
7760
|
const signatureData = await signCentralDirectory(directoryArray);
|
|
7637
7761
|
const signatureDataLength = getLength(signatureData);
|
|
@@ -7639,9 +7763,9 @@
|
|
|
7639
7763
|
throw new Error(ERR_INVALID_SIGNATURE_DATA);
|
|
7640
7764
|
}
|
|
7641
7765
|
const signatureRecord = createRecordWriter(6 + signatureDataLength);
|
|
7642
|
-
signatureRecord.
|
|
7643
|
-
signatureRecord.
|
|
7644
|
-
signatureRecord.
|
|
7766
|
+
signatureRecord.writeUint32(DIGITAL_SIGNATURE_RECORD_SIGNATURE);
|
|
7767
|
+
signatureRecord.writeUint16(signatureDataLength);
|
|
7768
|
+
signatureRecord.writeBytes(signatureData);
|
|
7645
7769
|
await writeData(zipWriter.writer, signatureRecord.array);
|
|
7646
7770
|
return 6 + signatureDataLength;
|
|
7647
7771
|
}
|
|
@@ -7652,7 +7776,7 @@
|
|
|
7652
7776
|
const { writer } = zipWriter;
|
|
7653
7777
|
const { directoryStart, signatureLength } = cdInfo;
|
|
7654
7778
|
let { directoryDataLength } = cdInfo;
|
|
7655
|
-
let
|
|
7779
|
+
let fileEntriesLength = zipWriter.fileEntries.size;
|
|
7656
7780
|
let diskNumber = directoryStart.diskNumber;
|
|
7657
7781
|
let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
|
|
7658
7782
|
let lastDiskNumber = getDiskNumber(writer);
|
|
@@ -7660,7 +7784,7 @@
|
|
|
7660
7784
|
lastDiskNumber++;
|
|
7661
7785
|
}
|
|
7662
7786
|
let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
7663
|
-
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS ||
|
|
7787
|
+
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || fileEntriesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
|
|
7664
7788
|
if (zip64 === false) {
|
|
7665
7789
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
7666
7790
|
} else {
|
|
@@ -7677,37 +7801,37 @@
|
|
|
7677
7801
|
}
|
|
7678
7802
|
lastDiskNumber = getDiskNumber(writer);
|
|
7679
7803
|
if (zip64) {
|
|
7680
|
-
endOfdirectoryRecord.
|
|
7681
|
-
endOfdirectoryRecord.
|
|
7682
|
-
endOfdirectoryRecord.
|
|
7683
|
-
endOfdirectoryRecord.
|
|
7684
|
-
endOfdirectoryRecord.
|
|
7685
|
-
endOfdirectoryRecord.
|
|
7686
|
-
endOfdirectoryRecord.
|
|
7687
|
-
endOfdirectoryRecord.
|
|
7688
|
-
endOfdirectoryRecord.
|
|
7689
|
-
endOfdirectoryRecord.
|
|
7690
|
-
endOfdirectoryRecord.
|
|
7691
|
-
endOfdirectoryRecord.
|
|
7692
|
-
endOfdirectoryRecord.
|
|
7693
|
-
endOfdirectoryRecord.
|
|
7804
|
+
endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
|
|
7805
|
+
endOfdirectoryRecord.writeUint64(44);
|
|
7806
|
+
endOfdirectoryRecord.writeUint16(45);
|
|
7807
|
+
endOfdirectoryRecord.writeUint16(45);
|
|
7808
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber);
|
|
7809
|
+
endOfdirectoryRecord.writeUint32(diskNumber);
|
|
7810
|
+
endOfdirectoryRecord.writeUint64(fileEntriesLength);
|
|
7811
|
+
endOfdirectoryRecord.writeUint64(fileEntriesLength);
|
|
7812
|
+
endOfdirectoryRecord.writeUint64(directoryDataLength);
|
|
7813
|
+
endOfdirectoryRecord.writeUint64(directoryOffset);
|
|
7814
|
+
endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
|
|
7815
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber);
|
|
7816
|
+
endOfdirectoryRecord.writeUint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength) + BigInt(signatureLength));
|
|
7817
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber + 1);
|
|
7694
7818
|
const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
|
|
7695
7819
|
if (supportZip64SplitFile) {
|
|
7696
7820
|
lastDiskNumber = MAX_16_BITS;
|
|
7697
7821
|
diskNumber = MAX_16_BITS;
|
|
7698
7822
|
}
|
|
7699
|
-
|
|
7823
|
+
fileEntriesLength = MAX_16_BITS;
|
|
7700
7824
|
directoryOffset = MAX_32_BITS;
|
|
7701
7825
|
directoryDataLength = MAX_32_BITS;
|
|
7702
7826
|
}
|
|
7703
|
-
endOfdirectoryRecord.
|
|
7704
|
-
endOfdirectoryRecord.
|
|
7705
|
-
endOfdirectoryRecord.
|
|
7706
|
-
endOfdirectoryRecord.
|
|
7707
|
-
endOfdirectoryRecord.
|
|
7708
|
-
endOfdirectoryRecord.
|
|
7709
|
-
endOfdirectoryRecord.
|
|
7710
|
-
endOfdirectoryRecord.
|
|
7827
|
+
endOfdirectoryRecord.writeUint32(END_OF_CENTRAL_DIR_SIGNATURE);
|
|
7828
|
+
endOfdirectoryRecord.writeUint16(lastDiskNumber);
|
|
7829
|
+
endOfdirectoryRecord.writeUint16(diskNumber);
|
|
7830
|
+
endOfdirectoryRecord.writeUint16(fileEntriesLength);
|
|
7831
|
+
endOfdirectoryRecord.writeUint16(fileEntriesLength);
|
|
7832
|
+
endOfdirectoryRecord.writeUint32(directoryDataLength);
|
|
7833
|
+
endOfdirectoryRecord.writeUint32(directoryOffset);
|
|
7834
|
+
endOfdirectoryRecord.writeUint16(commentLength);
|
|
7711
7835
|
await writeData(writer, endOfdirectoryRecord.array);
|
|
7712
7836
|
if (commentLength) {
|
|
7713
7837
|
await writeData(writer, comment);
|
|
@@ -7720,11 +7844,11 @@
|
|
|
7720
7844
|
let offset = 0;
|
|
7721
7845
|
return {
|
|
7722
7846
|
array,
|
|
7723
|
-
|
|
7724
|
-
|
|
7725
|
-
|
|
7726
|
-
|
|
7727
|
-
|
|
7847
|
+
writeUint8: value => { setUint8(view, offset, value); offset += 1; },
|
|
7848
|
+
writeUint16: value => { setUint16(view, offset, value); offset += 2; },
|
|
7849
|
+
writeUint32: value => { setUint32(view, offset, value); offset += 4; },
|
|
7850
|
+
writeUint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
|
|
7851
|
+
writeBytes: value => { arraySet(array, value, offset); offset += getLength(value); },
|
|
7728
7852
|
skip: count => offset += count
|
|
7729
7853
|
};
|
|
7730
7854
|
}
|
|
@@ -7748,6 +7872,71 @@
|
|
|
7748
7872
|
return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
|
|
7749
7873
|
}
|
|
7750
7874
|
|
|
7875
|
+
async function startsWithSplitZipSignature(reader) {
|
|
7876
|
+
const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
7877
|
+
return getUint32(getDataView(signatureArray), 0) == SPLIT_ZIP_FILE_SIGNATURE;
|
|
7878
|
+
}
|
|
7879
|
+
|
|
7880
|
+
async function copyZipData(zipWriter, reader, entries, directoryOffset, splitZipSignatureLength) {
|
|
7881
|
+
const { writer } = zipWriter;
|
|
7882
|
+
const entryPositions = new Map();
|
|
7883
|
+
if (writer.closeDisk) {
|
|
7884
|
+
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
7885
|
+
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
7886
|
+
let copiedLength = 0;
|
|
7887
|
+
for (const entry of sortedEntries) {
|
|
7888
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
7889
|
+
await copyData(zipWriter, reader, copiedLength, sourceOffset - copiedLength);
|
|
7890
|
+
if (exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
7891
|
+
await writer.closeDisk();
|
|
7892
|
+
}
|
|
7893
|
+
entryPositions.set(entry, {
|
|
7894
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
7895
|
+
diskNumberStart: getDiskNumber(writer)
|
|
7896
|
+
});
|
|
7897
|
+
copiedLength = sourceOffset;
|
|
7898
|
+
}
|
|
7899
|
+
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
7900
|
+
} else {
|
|
7901
|
+
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
7902
|
+
entries.forEach(entry => entryPositions.set(entry, {
|
|
7903
|
+
offset: splitZipSignatureLength + getSourceOffset(reader, entry),
|
|
7904
|
+
diskNumberStart: 0
|
|
7905
|
+
}));
|
|
7906
|
+
}
|
|
7907
|
+
return entryPositions;
|
|
7908
|
+
}
|
|
7909
|
+
|
|
7910
|
+
async function copyData(zipWriter, reader, offset, size) {
|
|
7911
|
+
if (size > 0) {
|
|
7912
|
+
const { writer } = zipWriter;
|
|
7913
|
+
await createReadable(reader, { offset, size }).pipeTo(writer.writable, { preventClose: true, preventAbort: true });
|
|
7914
|
+
writer.size += size;
|
|
7915
|
+
zipWriter.offset += size;
|
|
7916
|
+
}
|
|
7917
|
+
}
|
|
7918
|
+
|
|
7919
|
+
async function getLocalHeaderLength(reader, offset) {
|
|
7920
|
+
const headerArray = await readUint8Array(reader, offset, HEADER_SIZE);
|
|
7921
|
+
if (getLength(headerArray) < HEADER_SIZE) {
|
|
7922
|
+
return HEADER_SIZE;
|
|
7923
|
+
}
|
|
7924
|
+
const headerView = getDataView(headerArray);
|
|
7925
|
+
return HEADER_SIZE +
|
|
7926
|
+
getUint16(headerView, HEADER_OFFSET_FILENAME_LENGTH + LOCAL_HEADER_COMMON_OFFSET) +
|
|
7927
|
+
getUint16(headerView, HEADER_OFFSET_EXTRAFIELD_LENGTH + LOCAL_HEADER_COMMON_OFFSET);
|
|
7928
|
+
}
|
|
7929
|
+
|
|
7930
|
+
function getSourceOffset(reader, { offset, diskNumberStart }) {
|
|
7931
|
+
return offset + (reader.getDiskOffset ? reader.getDiskOffset(diskNumberStart) : 0);
|
|
7932
|
+
}
|
|
7933
|
+
|
|
7934
|
+
function getSplitZipSignatureArray() {
|
|
7935
|
+
const signatureArray = new Uint8Array(SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
7936
|
+
setUint32(getDataView(signatureArray), 0, SPLIT_ZIP_FILE_SIGNATURE);
|
|
7937
|
+
return signatureArray;
|
|
7938
|
+
}
|
|
7939
|
+
|
|
7751
7940
|
async function writeData(writer, array) {
|
|
7752
7941
|
const { writable } = writer;
|
|
7753
7942
|
const streamWriter = writable.getWriter();
|
|
@@ -7799,6 +7988,21 @@
|
|
|
7799
7988
|
return result === UNDEFINED_VALUE ? defaultValue : result;
|
|
7800
7989
|
}
|
|
7801
7990
|
|
|
7991
|
+
function getDateOptionValue(zipWriter, options, name, defaultValue) {
|
|
7992
|
+
const date = getOptionValue(zipWriter, options, name, defaultValue);
|
|
7993
|
+
if (date === null) {
|
|
7994
|
+
return defaultValue;
|
|
7995
|
+
}
|
|
7996
|
+
if (date !== UNDEFINED_VALUE && (typeof date.getTime != FUNCTION_TYPE || Number.isNaN(date.getTime()))) {
|
|
7997
|
+
throw new Error(ERR_INVALID_DATE);
|
|
7998
|
+
}
|
|
7999
|
+
return date;
|
|
8000
|
+
}
|
|
8001
|
+
|
|
8002
|
+
function getFunctionOptionValue(zipWriter, options, name) {
|
|
8003
|
+
return checkFunctionOption(getOptionValue(zipWriter, options, name));
|
|
8004
|
+
}
|
|
8005
|
+
|
|
7802
8006
|
function getAliasedOptionValue(zipWriter, options, name, deprecatedName, defaultValue) {
|
|
7803
8007
|
const value = getAliasedValue(options, name, deprecatedName);
|
|
7804
8008
|
const result = value === UNDEFINED_VALUE ? getAliasedValue(zipWriter.options, name, deprecatedName) : value;
|
|
@@ -7813,9 +8017,6 @@
|
|
|
7813
8017
|
return toNumber(getOptionValue(zipWriter, options, name, defaultValue));
|
|
7814
8018
|
}
|
|
7815
8019
|
|
|
7816
|
-
function toNumber(value) {
|
|
7817
|
-
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
7818
|
-
}
|
|
7819
8020
|
|
|
7820
8021
|
function getMaximumCompressedSize(uncompressedSize) {
|
|
7821
8022
|
return uncompressedSize + (5 * (Math.floor(uncompressedSize / 16383) + 1));
|
|
@@ -7827,6 +8028,14 @@
|
|
|
7827
8028
|
: compressionMethod !== COMPRESSION_METHOD_STORE;
|
|
7828
8029
|
}
|
|
7829
8030
|
|
|
8031
|
+
function getUint16(view, offset) {
|
|
8032
|
+
return view.getUint16(offset, true);
|
|
8033
|
+
}
|
|
8034
|
+
|
|
8035
|
+
function getUint32(view, offset) {
|
|
8036
|
+
return view.getUint32(offset, true);
|
|
8037
|
+
}
|
|
8038
|
+
|
|
7830
8039
|
function setUint8(view, offset, value) {
|
|
7831
8040
|
view.setUint8(offset, value);
|
|
7832
8041
|
}
|
|
@@ -7870,9 +8079,9 @@
|
|
|
7870
8079
|
const headerRecord = createRecordWriter(HEADER_SIZE - 4);
|
|
7871
8080
|
const headerArray = headerRecord.array;
|
|
7872
8081
|
const headerView = getDataView(headerArray);
|
|
7873
|
-
headerRecord.
|
|
7874
|
-
headerRecord.
|
|
7875
|
-
headerRecord.
|
|
8082
|
+
headerRecord.writeUint16(version);
|
|
8083
|
+
headerRecord.writeUint16(bitFlag);
|
|
8084
|
+
headerRecord.writeUint16(compressionMethod);
|
|
7876
8085
|
if (rawLastModDate === UNDEFINED_VALUE) {
|
|
7877
8086
|
const dateArray = new Uint32Array(1);
|
|
7878
8087
|
const dateView = getDataView(dateArray);
|
|
@@ -7880,20 +8089,20 @@
|
|
|
7880
8089
|
setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
|
|
7881
8090
|
rawLastModDate = dateArray[0];
|
|
7882
8091
|
}
|
|
7883
|
-
headerRecord.
|
|
8092
|
+
headerRecord.writeUint32(rawLastModDate);
|
|
7884
8093
|
headerRecord.skip(4);
|
|
7885
8094
|
if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
|
|
7886
|
-
headerRecord.
|
|
8095
|
+
headerRecord.writeUint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
|
|
7887
8096
|
} else {
|
|
7888
8097
|
headerRecord.skip(4);
|
|
7889
8098
|
}
|
|
7890
8099
|
if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
|
|
7891
|
-
headerRecord.
|
|
8100
|
+
headerRecord.writeUint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
|
|
7892
8101
|
} else {
|
|
7893
8102
|
headerRecord.skip(4);
|
|
7894
8103
|
}
|
|
7895
|
-
headerRecord.
|
|
7896
|
-
headerRecord.
|
|
8104
|
+
headerRecord.writeUint16(getLength(rawFilename));
|
|
8105
|
+
headerRecord.writeUint16(extraFieldLength);
|
|
7897
8106
|
return {
|
|
7898
8107
|
headerArray,
|
|
7899
8108
|
headerView,
|
|
@@ -8476,6 +8685,7 @@
|
|
|
8476
8685
|
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
8477
8686
|
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
8478
8687
|
const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
|
|
8688
|
+
const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
|
|
8479
8689
|
const ERR_ABORT_EXPORT = "zipjs-abort-export";
|
|
8480
8690
|
const ERR_ABORTED = "The operation was aborted";
|
|
8481
8691
|
const ABORT_ERROR_NAME = "AbortError";
|
|
@@ -8508,13 +8718,14 @@
|
|
|
8508
8718
|
fs,
|
|
8509
8719
|
name,
|
|
8510
8720
|
data: params.data,
|
|
8511
|
-
options: params.options,
|
|
8721
|
+
options: params.options && Object.assign({}, params.options),
|
|
8512
8722
|
id: fs.entryIdCounter++,
|
|
8513
8723
|
parent,
|
|
8514
8724
|
children: [],
|
|
8515
8725
|
uncompressedSize: params.uncompressedSize || 0,
|
|
8516
8726
|
undeterminedSize: params.undeterminedSize || params.uncompressedSize === UNDEFINED_VALUE,
|
|
8517
|
-
passThrough: params.passThrough
|
|
8727
|
+
passThrough: params.passThrough,
|
|
8728
|
+
defaultLastModDate: params.defaultLastModDate || new Date()
|
|
8518
8729
|
});
|
|
8519
8730
|
if (parent || !fs.root) {
|
|
8520
8731
|
fs.entries[zipEntry.id] = zipEntry;
|
|
@@ -8524,12 +8735,6 @@
|
|
|
8524
8735
|
}
|
|
8525
8736
|
}
|
|
8526
8737
|
|
|
8527
|
-
moveTo(target) {
|
|
8528
|
-
// deprecated
|
|
8529
|
-
const zipEntry = this;
|
|
8530
|
-
zipEntry.fs.move(zipEntry, target);
|
|
8531
|
-
}
|
|
8532
|
-
|
|
8533
8738
|
getFullname() {
|
|
8534
8739
|
return this.getRelativeName();
|
|
8535
8740
|
}
|
|
@@ -8561,6 +8766,11 @@
|
|
|
8561
8766
|
this.name = name;
|
|
8562
8767
|
}
|
|
8563
8768
|
}
|
|
8769
|
+
|
|
8770
|
+
setOptions(options) {
|
|
8771
|
+
const entryOptions = Object.assign({}, this.options, options);
|
|
8772
|
+
this.options = Object.fromEntries(Object.entries(entryOptions).filter(([, value]) => value !== UNDEFINED_VALUE));
|
|
8773
|
+
}
|
|
8564
8774
|
}
|
|
8565
8775
|
|
|
8566
8776
|
class ZipFileEntry extends ZipEntry {
|
|
@@ -8587,7 +8797,7 @@
|
|
|
8587
8797
|
const reader = zipEntry.reader = createReader(zipEntry.Reader, zipEntry.data, options);
|
|
8588
8798
|
const dataSize = zipEntry.uncompressedSize || reader.size;
|
|
8589
8799
|
await Promise.all([initStream(reader), initStream(writer, dataSize)]);
|
|
8590
|
-
const
|
|
8800
|
+
const signal = checkSignalOption(options.signal);
|
|
8591
8801
|
const readable = createProgressReadable(zipEntry, reader, options, signal);
|
|
8592
8802
|
const preventClose = !ownsWritable(writer) && Boolean(options.preventClose);
|
|
8593
8803
|
zipEntry.uncompressedSize = reader.size;
|
|
@@ -8805,10 +9015,6 @@
|
|
|
8805
9015
|
});
|
|
8806
9016
|
}
|
|
8807
9017
|
|
|
8808
|
-
addData(name, params) {
|
|
8809
|
-
return addChild(this, name, params);
|
|
8810
|
-
}
|
|
8811
|
-
|
|
8812
9018
|
importBlob(blob, options) {
|
|
8813
9019
|
return this.importZip(new BlobReader(blob), options);
|
|
8814
9020
|
}
|
|
@@ -8922,7 +9128,7 @@
|
|
|
8922
9128
|
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
8923
9129
|
options.bufferedWrite = true;
|
|
8924
9130
|
}
|
|
8925
|
-
const [readers] = await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
|
|
9131
|
+
const [readers] = await Promise.all([initReaders(zipEntry, checkReaderOptions(options.readerOptions)), initStream(writer)]);
|
|
8926
9132
|
const zipWriter = new ZipWriter(writer, options);
|
|
8927
9133
|
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
|
|
8928
9134
|
await zipWriter.close(options.globalComment);
|
|
@@ -8932,12 +9138,13 @@
|
|
|
8932
9138
|
getExportedSize(options = {}) {
|
|
8933
9139
|
const zipEntry = this;
|
|
8934
9140
|
options = Object.assign({}, options);
|
|
9141
|
+
checkReaderOptions(options.readerOptions);
|
|
8935
9142
|
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
8936
9143
|
options.bufferedWrite = true;
|
|
8937
9144
|
}
|
|
8938
9145
|
const writeOrderGuaranteed = !options.bufferedWrite ||
|
|
8939
9146
|
(options.keepOrder !== false && zipEntry.children.every(child => !child.children.length));
|
|
8940
|
-
return getEntriesSize(options,
|
|
9147
|
+
return getEntriesSize(options, zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
|
|
8941
9148
|
const { name, entryOptions } = getChildEntryOptions(child, zipEntry, options);
|
|
8942
9149
|
return { name, size: child.directory ? 0 : getDeterminedSize(child, isPassThrough(child, options)), options: entryOptions };
|
|
8943
9150
|
}), writeOrderGuaranteed, options.globalComment);
|
|
@@ -8976,7 +9183,7 @@
|
|
|
8976
9183
|
}
|
|
8977
9184
|
|
|
8978
9185
|
|
|
8979
|
-
class
|
|
9186
|
+
class ZipFS {
|
|
8980
9187
|
|
|
8981
9188
|
constructor() {
|
|
8982
9189
|
resetFS(this);
|
|
@@ -9092,10 +9299,6 @@
|
|
|
9092
9299
|
return this.root.addFile(file, options);
|
|
9093
9300
|
}
|
|
9094
9301
|
|
|
9095
|
-
addData(name, params) {
|
|
9096
|
-
return this.root.addData(name, params);
|
|
9097
|
-
}
|
|
9098
|
-
|
|
9099
9302
|
importBlob(blob, options) {
|
|
9100
9303
|
resetFS(this);
|
|
9101
9304
|
return this.root.importBlob(blob, options);
|
|
@@ -9163,7 +9366,7 @@
|
|
|
9163
9366
|
}
|
|
9164
9367
|
}
|
|
9165
9368
|
|
|
9166
|
-
const fs = { FS, ZipDirectoryEntry, ZipFileEntry };
|
|
9369
|
+
const fs = { FS: ZipFS, ZipDirectoryEntry, ZipFileEntry };
|
|
9167
9370
|
|
|
9168
9371
|
function getTotalSize(entries, getEntrySize) {
|
|
9169
9372
|
let size = 0;
|
|
@@ -9307,7 +9510,7 @@
|
|
|
9307
9510
|
}
|
|
9308
9511
|
|
|
9309
9512
|
function forwardAbort(signal, abortController) {
|
|
9310
|
-
if (!signal) {
|
|
9513
|
+
if (!checkSignalOption(signal)) {
|
|
9311
9514
|
return () => { };
|
|
9312
9515
|
}
|
|
9313
9516
|
if (signal.aborted) {
|
|
@@ -9403,7 +9606,7 @@
|
|
|
9403
9606
|
};
|
|
9404
9607
|
}
|
|
9405
9608
|
}
|
|
9406
|
-
const entryOptions = Object.assign({}, zipEntryMetadata, options,
|
|
9609
|
+
const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
|
|
9407
9610
|
if (!child.directory && entryOptions.passThrough && entryOptions.uncompressedSize === UNDEFINED_VALUE) {
|
|
9408
9611
|
throw new Error(ERR_INVALID_PASS_THROUGH);
|
|
9409
9612
|
}
|
|
@@ -9418,11 +9621,22 @@
|
|
|
9418
9621
|
return child.undeterminedSize ? UNDEFINED_VALUE : getExtractedSize(child, passThrough);
|
|
9419
9622
|
}
|
|
9420
9623
|
|
|
9624
|
+
function checkReaderOptions(readerOptions) {
|
|
9625
|
+
if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
|
|
9626
|
+
throw new Error(ERR_INVALID_READER_OPTIONS);
|
|
9627
|
+
}
|
|
9628
|
+
return readerOptions;
|
|
9629
|
+
}
|
|
9630
|
+
|
|
9421
9631
|
function isPassThrough(child, options) {
|
|
9422
9632
|
const { readerOptions } = options;
|
|
9423
9633
|
return Boolean(!child.directory && (child.passThrough || (readerOptions && readerOptions.passThrough)));
|
|
9424
9634
|
}
|
|
9425
9635
|
|
|
9636
|
+
function isImplicitDirectory(child) {
|
|
9637
|
+
return child.directory && child.data === null;
|
|
9638
|
+
}
|
|
9639
|
+
|
|
9426
9640
|
function getUserExtraField(extraField) {
|
|
9427
9641
|
if (extraField) {
|
|
9428
9642
|
const userExtraField = new Map();
|
|
@@ -9440,7 +9654,7 @@
|
|
|
9440
9654
|
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
9441
9655
|
const { onstart, onprogress, onend, onentryprogress } = options;
|
|
9442
9656
|
const selectedEntry = entry;
|
|
9443
|
-
const totalEntries = getTotalSize(entry.children, ()
|
|
9657
|
+
const totalEntries = getTotalSize(entry.children, child => isImplicitDirectory(child) ? 0 : 1);
|
|
9444
9658
|
let writtenSize = 0;
|
|
9445
9659
|
let writtenEntries = 0;
|
|
9446
9660
|
if (onstart) {
|
|
@@ -9469,6 +9683,9 @@
|
|
|
9469
9683
|
}
|
|
9470
9684
|
|
|
9471
9685
|
async function addChild(child) {
|
|
9686
|
+
if (isImplicitDirectory(child)) {
|
|
9687
|
+
return;
|
|
9688
|
+
}
|
|
9472
9689
|
const { name, entryOptions } = getChildEntryOptions(child, selectedEntry, options);
|
|
9473
9690
|
let entryWrittenSize = 0;
|
|
9474
9691
|
const entryMetadata = await zipWriter.add(name, readers.get(child), Object.assign(entryOptions, {
|
|
@@ -9502,7 +9719,7 @@
|
|
|
9502
9719
|
if (handle.kind == "file") {
|
|
9503
9720
|
const file = await handle.getFile();
|
|
9504
9721
|
addedEntries.push(
|
|
9505
|
-
parentEntry
|
|
9722
|
+
addChild(parentEntry, file.name, {
|
|
9506
9723
|
Reader: function () {
|
|
9507
9724
|
const readable = file.stream();
|
|
9508
9725
|
const size = file.size;
|
|
@@ -9536,10 +9753,11 @@
|
|
|
9536
9753
|
|
|
9537
9754
|
async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
9538
9755
|
const { onstart, onprogress, onend } = options;
|
|
9756
|
+
const readerOptions = checkReaderOptions(options.readerOptions);
|
|
9539
9757
|
const abortController = new AbortController();
|
|
9540
9758
|
const { signal } = abortController;
|
|
9541
9759
|
const releaseSignal = forwardAbort(options.signal, abortController);
|
|
9542
|
-
const getDataOptions = Object.assign({}, options,
|
|
9760
|
+
const getDataOptions = Object.assign({}, options, readerOptions, {
|
|
9543
9761
|
signal,
|
|
9544
9762
|
onstart: UNDEFINED_VALUE,
|
|
9545
9763
|
onprogress: UNDEFINED_VALUE,
|
|
@@ -9826,7 +10044,7 @@
|
|
|
9826
10044
|
*/
|
|
9827
10045
|
|
|
9828
10046
|
|
|
9829
|
-
|
|
10047
|
+
a(setDefaultConfiguration);
|
|
9830
10048
|
|
|
9831
10049
|
exports.BlobReader = BlobReader;
|
|
9832
10050
|
exports.BlobWriter = BlobWriter;
|
|
@@ -9839,6 +10057,7 @@
|
|
|
9839
10057
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
9840
10058
|
exports.ERR_ENCRYPTED = ERR_ENCRYPTED;
|
|
9841
10059
|
exports.ERR_ENCRYPTED_CENTRAL_DIRECTORY = ERR_ENCRYPTED_CENTRAL_DIRECTORY;
|
|
10060
|
+
exports.ERR_ENTRY_DATA_OUT_OF_BOUNDS = ERR_ENTRY_DATA_OUT_OF_BOUNDS;
|
|
9842
10061
|
exports.ERR_ENTRY_EXISTS = ERR_ENTRY_EXISTS;
|
|
9843
10062
|
exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
|
|
9844
10063
|
exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
|
|
@@ -9852,20 +10071,28 @@
|
|
|
9852
10071
|
exports.ERR_INVALID_COMMENT_TYPE = ERR_INVALID_COMMENT_TYPE;
|
|
9853
10072
|
exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
|
|
9854
10073
|
exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
|
|
10074
|
+
exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
|
|
9855
10075
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
9856
10076
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
10077
|
+
exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
|
|
9857
10078
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
10079
|
+
exports.ERR_INVALID_EXTRAFIELD = ERR_INVALID_EXTRAFIELD;
|
|
9858
10080
|
exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
|
|
10081
|
+
exports.ERR_INVALID_EXTRAFIELD_DATA_TYPE = ERR_INVALID_EXTRAFIELD_DATA_TYPE;
|
|
9859
10082
|
exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
|
|
9860
10083
|
exports.ERR_INVALID_FILENAME_VALIDATION = ERR_INVALID_FILENAME_VALIDATION;
|
|
10084
|
+
exports.ERR_INVALID_FUNCTION_OPTION = ERR_INVALID_FUNCTION_OPTION;
|
|
9861
10085
|
exports.ERR_INVALID_GID = ERR_INVALID_GID;
|
|
9862
10086
|
exports.ERR_INVALID_LEVEL = ERR_INVALID_LEVEL;
|
|
9863
10087
|
exports.ERR_INVALID_MAX_APPENDED_DATA_SIZE = ERR_INVALID_MAX_APPENDED_DATA_SIZE;
|
|
10088
|
+
exports.ERR_INVALID_MAX_WORKERS = ERR_INVALID_MAX_WORKERS;
|
|
9864
10089
|
exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
|
|
9865
10090
|
exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
|
|
9866
10091
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
9867
10092
|
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
9868
10093
|
exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
|
|
10094
|
+
exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
|
|
10095
|
+
exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
|
|
9869
10096
|
exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
|
|
9870
10097
|
exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
|
|
9871
10098
|
exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
|
|
@@ -9905,6 +10132,10 @@
|
|
|
9905
10132
|
exports.Uint8ArrayReader = Uint8ArrayReader;
|
|
9906
10133
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
9907
10134
|
exports.Writer = Writer;
|
|
10135
|
+
exports.ZipDirectoryEntry = ZipDirectoryEntry;
|
|
10136
|
+
exports.ZipEntry = ZipEntry;
|
|
10137
|
+
exports.ZipFS = ZipFS;
|
|
10138
|
+
exports.ZipFileEntry = ZipFileEntry;
|
|
9908
10139
|
exports.ZipReader = ZipReader;
|
|
9909
10140
|
exports.ZipReaderStream = ZipReaderStream;
|
|
9910
10141
|
exports.ZipWriter = ZipWriter;
|