@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/index-native.cjs
CHANGED
|
@@ -39,6 +39,7 @@ const COMPRESSION_METHOD_AES = 0x63;
|
|
|
39
39
|
|
|
40
40
|
const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;
|
|
41
41
|
const SPLIT_ZIP_FILE_SIGNATURE = 0x08074b50;
|
|
42
|
+
const TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE = 0x30304b50;
|
|
42
43
|
const DATA_DESCRIPTOR_RECORD_SIGNATURE = SPLIT_ZIP_FILE_SIGNATURE;
|
|
43
44
|
const ARCHIVE_EXTRA_DATA_SIGNATURE = 0x08064b50;
|
|
44
45
|
const DIGITAL_SIGNATURE_RECORD_SIGNATURE = 0x05054b50;
|
|
@@ -55,6 +56,7 @@ const ZIP64_END_OF_CENTRAL_DIR_TOTAL_LENGTH = END_OF_CENTRAL_DIR_LENGTH + ZIP64_
|
|
|
55
56
|
const DATA_DESCRIPTOR_RECORD_LENGTH = 12;
|
|
56
57
|
const DATA_DESCRIPTOR_RECORD_ZIP_64_LENGTH = 20;
|
|
57
58
|
const DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH = 4;
|
|
59
|
+
const SPLIT_ZIP_FILE_SIGNATURE_LENGTH = 4;
|
|
58
60
|
|
|
59
61
|
const EXTRAFIELD_TYPE_ZIP64 = 0x0001;
|
|
60
62
|
const EXTRAFIELD_TYPE_AES = 0x9901;
|
|
@@ -106,6 +108,8 @@ const HEADER_OFFSET_VERSION = 0;
|
|
|
106
108
|
const HEADER_OFFSET_SIGNATURE = 10;
|
|
107
109
|
const HEADER_OFFSET_COMPRESSED_SIZE = 14;
|
|
108
110
|
const HEADER_OFFSET_UNCOMPRESSED_SIZE = 18;
|
|
111
|
+
const HEADER_OFFSET_FILENAME_LENGTH = 22;
|
|
112
|
+
const HEADER_OFFSET_EXTRAFIELD_LENGTH = 24;
|
|
109
113
|
const LOCAL_HEADER_COMMON_OFFSET = 4;
|
|
110
114
|
|
|
111
115
|
const MAX_DATE = new Date(2107, 11, 31, 23, 59, 58);
|
|
@@ -118,9 +122,116 @@ const FUNCTION_TYPE = "function";
|
|
|
118
122
|
const OBJECT_TYPE = "object";
|
|
119
123
|
const STRING_TYPE = "string";
|
|
120
124
|
const NUMBER_TYPE = "number";
|
|
125
|
+
const BOOLEAN_TYPE = "boolean";
|
|
121
126
|
|
|
122
127
|
const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
123
128
|
|
|
129
|
+
/*
|
|
130
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
131
|
+
|
|
132
|
+
Redistribution and use in source and binary forms, with or without
|
|
133
|
+
modification, are permitted provided that the following conditions are met:
|
|
134
|
+
|
|
135
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
136
|
+
this list of conditions and the following disclaimer.
|
|
137
|
+
|
|
138
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
139
|
+
notice, this list of conditions and the following disclaimer in
|
|
140
|
+
the documentation and/or other materials provided with the distribution.
|
|
141
|
+
|
|
142
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
143
|
+
derived from this software without specific prior written permission.
|
|
144
|
+
|
|
145
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
146
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
147
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
148
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
149
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
150
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
151
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
152
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
153
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
154
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
155
|
+
*/
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
const OPTION_FILENAME_ENCODING = "filenameEncoding";
|
|
159
|
+
const OPTION_COMMENT_ENCODING = "commentEncoding";
|
|
160
|
+
const OPTION_DECODE_TEXT = "decodeText";
|
|
161
|
+
const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
|
|
162
|
+
const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
|
|
163
|
+
const OPTION_PASSWORD = "password";
|
|
164
|
+
const OPTION_RAW_PASSWORD = "rawPassword";
|
|
165
|
+
const OPTION_PASS_THROUGH = "passThrough";
|
|
166
|
+
const OPTION_SIGNAL = "signal";
|
|
167
|
+
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
168
|
+
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
169
|
+
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
170
|
+
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
171
|
+
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
172
|
+
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
173
|
+
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
174
|
+
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
175
|
+
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
176
|
+
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
177
|
+
const OPTION_TRANSFER_STREAMS = "transferStreams";
|
|
178
|
+
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
179
|
+
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
180
|
+
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
181
|
+
const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
|
|
182
|
+
const OPTION_KEEP_ORDER = "keepOrder";
|
|
183
|
+
const OPTION_LEVEL = "level";
|
|
184
|
+
const OPTION_BUFFERED_WRITE = "bufferedWrite";
|
|
185
|
+
const OPTION_CREATE_TEMP_STREAM = "createTempStream";
|
|
186
|
+
const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
|
|
187
|
+
const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
|
|
188
|
+
const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
|
|
189
|
+
const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
|
|
190
|
+
const OPTION_ENCODE_TEXT = "encodeText";
|
|
191
|
+
const OPTION_OFFSET = "offset";
|
|
192
|
+
const OPTION_USDZ = "usdz";
|
|
193
|
+
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
194
|
+
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
195
|
+
const OPTION_STRICTNESS = "strictness";
|
|
196
|
+
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
197
|
+
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
198
|
+
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
199
|
+
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
200
|
+
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
201
|
+
const TEXT_TYPE_FILENAME = "filename";
|
|
202
|
+
const TEXT_TYPE_COMMENT = "comment";
|
|
203
|
+
const STRICTNESS_STRICT = "strict";
|
|
204
|
+
const STRICTNESS_BALANCED = "balanced";
|
|
205
|
+
const STRICTNESS_TOLERANT = "tolerant";
|
|
206
|
+
|
|
207
|
+
const ERR_INVALID_FUNCTION_OPTION = "Invalid option (must be a function)";
|
|
208
|
+
const ERR_INVALID_SIGNAL = "Invalid signal (must be an AbortSignal instance)";
|
|
209
|
+
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
210
|
+
|
|
211
|
+
function checkFunctionOption(value) {
|
|
212
|
+
if (value && typeof value != FUNCTION_TYPE) {
|
|
213
|
+
throw new Error(ERR_INVALID_FUNCTION_OPTION);
|
|
214
|
+
}
|
|
215
|
+
return value;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function checkSignalOption(signal) {
|
|
219
|
+
if (signal && (typeof signal.addEventListener != FUNCTION_TYPE || typeof signal.aborted != BOOLEAN_TYPE)) {
|
|
220
|
+
throw new Error(ERR_INVALID_SIGNAL);
|
|
221
|
+
}
|
|
222
|
+
return signal || UNDEFINED_VALUE;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function checkPasswordOption(password, rawPassword) {
|
|
226
|
+
if ((password && typeof password != STRING_TYPE) || (rawPassword && !(rawPassword instanceof Uint8Array))) {
|
|
227
|
+
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function toNumber(value) {
|
|
232
|
+
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
233
|
+
}
|
|
234
|
+
|
|
124
235
|
/*
|
|
125
236
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
126
237
|
|
|
@@ -150,7 +261,10 @@ const EMPTY_UINT8_ARRAY = new Uint8Array();
|
|
|
150
261
|
*/
|
|
151
262
|
|
|
152
263
|
|
|
264
|
+
const DEFAULT_CHUNK_SIZE$1 = 64 * 1024;
|
|
153
265
|
const MINIMUM_CHUNK_SIZE = 64;
|
|
266
|
+
const MINIMUM_PROPERTY_VALUE = 1;
|
|
267
|
+
const ERR_INVALID_MAX_WORKERS = "Invalid maxWorkers (must be an integer greater than 0)";
|
|
154
268
|
let maxWorkers = 2;
|
|
155
269
|
try {
|
|
156
270
|
if (typeof navigator != UNDEFINED_TYPE && navigator.hardwareConcurrency) {
|
|
@@ -162,7 +276,7 @@ try {
|
|
|
162
276
|
const DEFAULT_CONFIGURATION = {
|
|
163
277
|
workerURI: "./core/web-worker-wasm.js",
|
|
164
278
|
wasmURI: "./core/streams/zlib-wasm/zlib-streams.wasm",
|
|
165
|
-
chunkSize:
|
|
279
|
+
chunkSize: DEFAULT_CHUNK_SIZE$1,
|
|
166
280
|
maxWorkers,
|
|
167
281
|
terminateWorkerTimeout: 5000,
|
|
168
282
|
workerStarvationTimeout: 5000,
|
|
@@ -174,24 +288,38 @@ const DEFAULT_CONFIGURATION = {
|
|
|
174
288
|
DecompressionStream: typeof DecompressionStream != UNDEFINED_TYPE && DecompressionStream
|
|
175
289
|
};
|
|
176
290
|
|
|
177
|
-
const
|
|
291
|
+
const PROPERTY_NAME_MAX_WORKERS = "maxWorkers";
|
|
292
|
+
|
|
293
|
+
const STRING_PROPERTY_NAMES = [
|
|
178
294
|
"baseURI",
|
|
179
295
|
"wasmURI",
|
|
180
|
-
"workerURI"
|
|
181
|
-
|
|
296
|
+
"workerURI"
|
|
297
|
+
];
|
|
298
|
+
const BOOLEAN_PROPERTY_NAMES = [
|
|
299
|
+
"useCompressionStream",
|
|
300
|
+
"useWebWorkers",
|
|
301
|
+
"transferStreams"
|
|
302
|
+
];
|
|
303
|
+
const NUMBER_PROPERTY_NAMES = [
|
|
182
304
|
"chunkSize",
|
|
183
|
-
|
|
305
|
+
PROPERTY_NAME_MAX_WORKERS,
|
|
184
306
|
"terminateWorkerTimeout",
|
|
185
307
|
"workerStarvationTimeout",
|
|
186
|
-
"workerStartupTimeout"
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
"
|
|
308
|
+
"workerStartupTimeout"
|
|
309
|
+
];
|
|
310
|
+
const FUNCTION_PROPERTY_NAMES = [
|
|
311
|
+
"createWorker",
|
|
190
312
|
"CompressionStream",
|
|
191
313
|
"DecompressionStream",
|
|
192
314
|
"CompressionStreamFallback",
|
|
193
315
|
"DecompressionStreamFallback"
|
|
194
316
|
];
|
|
317
|
+
const CONFIGURABLE_PROPERTY_NAMES = [
|
|
318
|
+
...STRING_PROPERTY_NAMES,
|
|
319
|
+
...BOOLEAN_PROPERTY_NAMES,
|
|
320
|
+
...NUMBER_PROPERTY_NAMES,
|
|
321
|
+
...FUNCTION_PROPERTY_NAMES
|
|
322
|
+
];
|
|
195
323
|
|
|
196
324
|
const config = { ...DEFAULT_CONFIGURATION };
|
|
197
325
|
|
|
@@ -200,20 +328,43 @@ function getConfiguration() {
|
|
|
200
328
|
}
|
|
201
329
|
|
|
202
330
|
function getChunkSize(config) {
|
|
203
|
-
return
|
|
331
|
+
return normalizeChunkSize(config.chunkSize);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
function normalizeChunkSize(chunkSize) {
|
|
335
|
+
chunkSize = toNumber(chunkSize);
|
|
336
|
+
return Number.isInteger(chunkSize) && chunkSize >= MINIMUM_PROPERTY_VALUE ? Math.max(chunkSize, MINIMUM_CHUNK_SIZE) : DEFAULT_CHUNK_SIZE$1;
|
|
204
337
|
}
|
|
205
338
|
|
|
206
339
|
function configure(configuration) {
|
|
207
|
-
|
|
340
|
+
Object.assign(config, checkConfiguration(normalizeConfiguration(configuration)));
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
function checkConfiguration(configuration) {
|
|
344
|
+
const checkedConfiguration = {};
|
|
208
345
|
for (const propertyName of CONFIGURABLE_PROPERTY_NAMES) {
|
|
209
346
|
const propertyValue = configuration[propertyName];
|
|
210
347
|
if (propertyValue !== UNDEFINED_VALUE) {
|
|
211
|
-
|
|
348
|
+
checkedConfiguration[propertyName] = checkPropertyValue(propertyName, propertyValue);
|
|
212
349
|
}
|
|
213
350
|
}
|
|
351
|
+
return checkedConfiguration;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
function checkPropertyValue(propertyName, propertyValue) {
|
|
355
|
+
if (NUMBER_PROPERTY_NAMES.includes(propertyName)) {
|
|
356
|
+
propertyValue = toNumber(propertyValue);
|
|
357
|
+
if (propertyName == PROPERTY_NAME_MAX_WORKERS && (!Number.isInteger(propertyValue) || propertyValue < MINIMUM_PROPERTY_VALUE)) {
|
|
358
|
+
throw new Error(ERR_INVALID_MAX_WORKERS);
|
|
359
|
+
}
|
|
360
|
+
} else if (FUNCTION_PROPERTY_NAMES.includes(propertyName)) {
|
|
361
|
+
checkFunctionOption(propertyValue);
|
|
362
|
+
}
|
|
363
|
+
return propertyValue;
|
|
214
364
|
}
|
|
215
365
|
|
|
216
366
|
function normalizeConfiguration(configuration) {
|
|
367
|
+
configuration = configuration || {};
|
|
217
368
|
const { CompressionStreamZlib, DecompressionStreamZlib } = configuration;
|
|
218
369
|
if (CompressionStreamZlib === UNDEFINED_VALUE && DecompressionStreamZlib === UNDEFINED_VALUE) {
|
|
219
370
|
return configuration;
|
|
@@ -229,14 +380,9 @@ function normalizeConfiguration(configuration) {
|
|
|
229
380
|
}
|
|
230
381
|
|
|
231
382
|
function setDefaultConfiguration(configuration) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
if (propertyValue !== UNDEFINED_VALUE) {
|
|
236
|
-
DEFAULT_CONFIGURATION[propertyName] = propertyValue;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
configure(configuration);
|
|
383
|
+
const checkedConfiguration = checkConfiguration(normalizeConfiguration(configuration));
|
|
384
|
+
Object.assign(DEFAULT_CONFIGURATION, checkedConfiguration);
|
|
385
|
+
Object.assign(config, checkedConfiguration);
|
|
240
386
|
}
|
|
241
387
|
|
|
242
388
|
function resetConfiguration() {
|
|
@@ -246,7 +392,7 @@ function resetConfiguration() {
|
|
|
246
392
|
Object.assign(config, DEFAULT_CONFIGURATION);
|
|
247
393
|
}
|
|
248
394
|
|
|
249
|
-
const r=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],t=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],f=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],n=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],c=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],e=new Uint8Array(288);e.fill(8,0,144),e.fill(9,144,256),e.fill(7,256,280),e.fill(8,280,288);const j$1=new Uint8Array(30).fill(5);function z$1(r){const t=new Uint16Array(16);for(const f of r)t[f]++;t[0]=0;const f=new Uint16Array(17);for(let r=1;15>=r;r++)f[r+1]=f[r]+t[r];const n=new Uint16Array(r.length);for(let t=0;t<r.length;t++)r[t]&&(n[f[r[t]]++]=t);return {j:t,symbols:n}}const W$1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",p$1=(s=()=>(W=>{let p=0,s=0,o=0,Y=new Uint8Array(1024),l=0,B=0;for(;!B;){B=u(1);const r=u(2);if(0==r)T();else if(1==r)w(z$1(e),z$1(j$1));else {if(2!=r)throw Error("invalid deflate block type");w(...K());}}return Y.subarray(0,l);function S(){if(p>=W.length)throw Error("unexpected end of deflate data");return W[p++]}function u(r){for(;r>o;)s|=S()<<o,o+=8;const t=s&(1<<r)-1;return s>>>=r,o-=r,t}function T(){s=0,o=0;const r=S()|S()<<8;p+=2,D(l+r);for(let t=0;r>t;t++)Y[l++]=S();}function w(c,e){let j=q(c);for(;256!=j;){if(256>j)D(l+1),Y[l++]=j;else {const c=j-257,z=r[c]+u(t[c]),W=q(e),p=f[W]+u(n[W]);D(l+z);const s=l-p;for(let r=0;z>r;r++)Y[l++]=Y[s+r];}j=q(c);}}function K(){const r=u(5)+257,t=u(5)+1,f=u(4)+4,n=new Uint8Array(19);for(let r=0;f>r;r++)n[c[r]]=u(3);const e=z$1(n),j=new Uint8Array(r+t);let W=0;for(;W<j.length;){const r=q(e);if(16>r)j[W++]=r;else if(16==r){const r=j[W-1];let t=u(2)+3;for(;t--;)j[W++]=r;}else W+=17==r?u(3)+3:u(7)+11;}return [z$1(j.subarray(0,r)),z$1(j.subarray(r))]}function q(r){const{j:t,symbols:f}=r;let n=0,c=0,e=0;for(let r=1;15>=r;r++){n|=u(1);const j=t[r];if(j>n-c)return f[e+(n-c)];e+=j,c=c+j<<1,n<<=1;}throw Error("invalid huffman code")}function D(r){if(Y.length<r){let t=2*Y.length;for(;r>t;)t*=2;const f=new Uint8Array(t);f.set(Y.subarray(0,l)),Y=f;}}})((r=>{const t=(r=(r+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,f=[];for(let n=0;t>n;n+=4){const t=W$1.indexOf(r[n])<<18|W$1.indexOf(r[n+1])<<12|(63&W$1.indexOf(r[n+2]))<<6|63&W$1.indexOf(r[n+3]);f.push(t>>16&255),"="!==r[n+2]&&f.push(t>>8&255),"="!==r[n+3]&&f.push(255&t);}return new Uint8Array(f)})("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")),r=>r({workerURI:r=>{const t="text/javascript";let f=s();if("string"==typeof f&&(f=(new TextEncoder).encode(f)),r){const r=new Blob([f],{type:t});return URL.createObjectURL(r)}return "data:"+t+";base64,"+(r=>{let t="";const f=r.length;let n=0;for(;f>n+2;n+=3){const f=r[n]<<16|r[n+1]<<8|r[n+2];t+=W$1[f>>18&63]+W$1[f>>12&63]+W$1[f>>6&63]+W$1[63&f];}const c=f-n;if(1===c){const f=r[n]<<16;t+=W$1[f>>18&63]+W$1[f>>12&63]+"==";}else if(2===c){const f=r[n]<<16|r[n+1]<<8;t+=W$1[f>>18&63]+W$1[f>>12&63]+W$1[f>>6&63]+"=";}return t})(f)}}));var s;
|
|
395
|
+
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;
|
|
250
396
|
|
|
251
397
|
/*
|
|
252
398
|
Copyright (c) 2026 Gildas Lormeau. All rights reserved.
|
|
@@ -1394,13 +1540,13 @@ class AESDecryptionStream extends TransformStream {
|
|
|
1394
1540
|
const {
|
|
1395
1541
|
ctr,
|
|
1396
1542
|
hmac,
|
|
1397
|
-
|
|
1543
|
+
pendingInput,
|
|
1398
1544
|
ready
|
|
1399
1545
|
} = this;
|
|
1400
1546
|
if (hmac && ctr) {
|
|
1401
1547
|
await ready;
|
|
1402
|
-
const chunkToDecrypt = subarray(
|
|
1403
|
-
const originalAuthenticationCode = subarray(
|
|
1548
|
+
const chunkToDecrypt = subarray(pendingInput, 0, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1549
|
+
const originalAuthenticationCode = subarray(pendingInput, pendingInput.length - AUTHENTICATION_CODE_LENGTH);
|
|
1404
1550
|
let decryptedChunkArray = EMPTY_UINT8_ARRAY;
|
|
1405
1551
|
if (chunkToDecrypt.length) {
|
|
1406
1552
|
const encryptedChunk = toBits(codecBytes, chunkToDecrypt);
|
|
@@ -1409,7 +1555,7 @@ class AESDecryptionStream extends TransformStream {
|
|
|
1409
1555
|
decryptedChunkArray = fromBits(codecBytes, decryptedChunk);
|
|
1410
1556
|
}
|
|
1411
1557
|
const authenticationCode = subarray(fromBits(codecBytes, hmac.digest()), 0, AUTHENTICATION_CODE_LENGTH);
|
|
1412
|
-
let invalidAuthenticationCode =
|
|
1558
|
+
let invalidAuthenticationCode = pendingInput.length < AUTHENTICATION_CODE_LENGTH ? 1 : 0;
|
|
1413
1559
|
for (let indexByte = 0; indexByte < AUTHENTICATION_CODE_LENGTH; indexByte++) {
|
|
1414
1560
|
invalidAuthenticationCode |= authenticationCode[indexByte] ^ originalAuthenticationCode[indexByte];
|
|
1415
1561
|
}
|
|
@@ -1453,14 +1599,14 @@ class AESEncryptionStream extends TransformStream {
|
|
|
1453
1599
|
const {
|
|
1454
1600
|
ctr,
|
|
1455
1601
|
hmac,
|
|
1456
|
-
|
|
1602
|
+
pendingInput,
|
|
1457
1603
|
ready
|
|
1458
1604
|
} = this;
|
|
1459
1605
|
if (hmac && ctr) {
|
|
1460
1606
|
await ready;
|
|
1461
1607
|
let encryptedChunkArray = EMPTY_UINT8_ARRAY;
|
|
1462
|
-
if (
|
|
1463
|
-
const encryptedChunk = ctr.update(toBits(codecBytes,
|
|
1608
|
+
if (pendingInput.length) {
|
|
1609
|
+
const encryptedChunk = ctr.update(toBits(codecBytes, pendingInput));
|
|
1464
1610
|
hmac.update(encryptedChunk);
|
|
1465
1611
|
encryptedChunkArray = fromBits(codecBytes, encryptedChunk);
|
|
1466
1612
|
}
|
|
@@ -1477,7 +1623,7 @@ function initAesCrypto(aesCrypto, password, rawPassword, encryptionStrength) {
|
|
|
1477
1623
|
ready: new Promise(resolve => aesCrypto.resolveReady = resolve),
|
|
1478
1624
|
password: encodePassword(password, rawPassword),
|
|
1479
1625
|
strength: encryptionStrength - 1,
|
|
1480
|
-
|
|
1626
|
+
pendingInput: EMPTY_UINT8_ARRAY
|
|
1481
1627
|
});
|
|
1482
1628
|
}
|
|
1483
1629
|
|
|
@@ -1485,10 +1631,10 @@ function append(aesCrypto, input, output, paddingStart, paddingEnd, verifyAuthen
|
|
|
1485
1631
|
const {
|
|
1486
1632
|
ctr,
|
|
1487
1633
|
hmac,
|
|
1488
|
-
|
|
1634
|
+
pendingInput
|
|
1489
1635
|
} = aesCrypto;
|
|
1490
|
-
if (
|
|
1491
|
-
input = concat(
|
|
1636
|
+
if (pendingInput.length) {
|
|
1637
|
+
input = concat(pendingInput, input);
|
|
1492
1638
|
}
|
|
1493
1639
|
const inputLength = input.length - paddingEnd;
|
|
1494
1640
|
output = expand(output, paddingStart + (inputLength - (inputLength % BLOCK_LENGTH)));
|
|
@@ -1504,7 +1650,7 @@ function append(aesCrypto, input, output, paddingStart, paddingEnd, verifyAuthen
|
|
|
1504
1650
|
}
|
|
1505
1651
|
output.set(fromBits(codecBytes, outputChunk), offset + paddingStart);
|
|
1506
1652
|
}
|
|
1507
|
-
aesCrypto.
|
|
1653
|
+
aesCrypto.pendingInput = subarray(input, offset);
|
|
1508
1654
|
return output;
|
|
1509
1655
|
}
|
|
1510
1656
|
|
|
@@ -3277,6 +3423,96 @@ async function terminateWorkers() {
|
|
|
3277
3423
|
resetWebWorkerSupport();
|
|
3278
3424
|
}
|
|
3279
3425
|
|
|
3426
|
+
/*
|
|
3427
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
3428
|
+
|
|
3429
|
+
Redistribution and use in source and binary forms, with or without
|
|
3430
|
+
modification, are permitted provided that the following conditions are met:
|
|
3431
|
+
|
|
3432
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
3433
|
+
this list of conditions and the following disclaimer.
|
|
3434
|
+
|
|
3435
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
3436
|
+
notice, this list of conditions and the following disclaimer in
|
|
3437
|
+
the documentation and/or other materials provided with the distribution.
|
|
3438
|
+
|
|
3439
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
3440
|
+
derived from this software without specific prior written permission.
|
|
3441
|
+
|
|
3442
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
3443
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
3444
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
3445
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
3446
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
3447
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
3448
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
3449
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
3450
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
3451
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
3452
|
+
*/
|
|
3453
|
+
|
|
3454
|
+
/* global TextDecoder */
|
|
3455
|
+
|
|
3456
|
+
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
3457
|
+
const VALID_CP437 = CP437.length == 256;
|
|
3458
|
+
|
|
3459
|
+
function decodeCP437(stringValue) {
|
|
3460
|
+
if (VALID_CP437) {
|
|
3461
|
+
let result = "";
|
|
3462
|
+
for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
|
|
3463
|
+
result += CP437[stringValue[indexCharacter]];
|
|
3464
|
+
}
|
|
3465
|
+
return result;
|
|
3466
|
+
} else {
|
|
3467
|
+
return new TextDecoder().decode(stringValue);
|
|
3468
|
+
}
|
|
3469
|
+
}
|
|
3470
|
+
|
|
3471
|
+
/*
|
|
3472
|
+
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
3473
|
+
|
|
3474
|
+
Redistribution and use in source and binary forms, with or without
|
|
3475
|
+
modification, are permitted provided that the following conditions are met:
|
|
3476
|
+
|
|
3477
|
+
1. Redistributions of source code must retain the above copyright notice,
|
|
3478
|
+
this list of conditions and the following disclaimer.
|
|
3479
|
+
|
|
3480
|
+
2. Redistributions in binary form must reproduce the above copyright
|
|
3481
|
+
notice, this list of conditions and the following disclaimer in
|
|
3482
|
+
the documentation and/or other materials provided with the distribution.
|
|
3483
|
+
|
|
3484
|
+
3. The names of the authors may not be used to endorse or promote products
|
|
3485
|
+
derived from this software without specific prior written permission.
|
|
3486
|
+
|
|
3487
|
+
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
3488
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
3489
|
+
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
3490
|
+
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
3491
|
+
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
3492
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
3493
|
+
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
3494
|
+
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
3495
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
3496
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
3497
|
+
*/
|
|
3498
|
+
|
|
3499
|
+
|
|
3500
|
+
function decodeText(value, encoding) {
|
|
3501
|
+
return decode(value, encoding, true);
|
|
3502
|
+
}
|
|
3503
|
+
|
|
3504
|
+
function decodeTextRemovingBOM(value, encoding) {
|
|
3505
|
+
return decode(value, encoding, false);
|
|
3506
|
+
}
|
|
3507
|
+
|
|
3508
|
+
function decode(value, encoding, ignoreBOM) {
|
|
3509
|
+
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
3510
|
+
return decodeCP437(value);
|
|
3511
|
+
} else {
|
|
3512
|
+
return new TextDecoder(encoding, { ignoreBOM }).decode(value);
|
|
3513
|
+
}
|
|
3514
|
+
}
|
|
3515
|
+
|
|
3280
3516
|
/*
|
|
3281
3517
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
3282
3518
|
|
|
@@ -3349,6 +3585,7 @@ class Reader extends Stream {
|
|
|
3349
3585
|
createReadable({ offset = 0, size, chunkSize = getChunkSize(getConfiguration()) } = {}) {
|
|
3350
3586
|
const reader = this;
|
|
3351
3587
|
let chunkOffset = 0;
|
|
3588
|
+
chunkSize = normalizeChunkSize(chunkSize);
|
|
3352
3589
|
return new ReadableStream({
|
|
3353
3590
|
async pull(controller) {
|
|
3354
3591
|
const dataSize = size === UNDEFINED_VALUE ? chunkSize : Math.min(chunkSize, size - chunkOffset);
|
|
@@ -3356,7 +3593,7 @@ class Reader extends Stream {
|
|
|
3356
3593
|
if (data.length) {
|
|
3357
3594
|
controller.enqueue(data);
|
|
3358
3595
|
}
|
|
3359
|
-
if ((chunkOffset + chunkSize >= size) || (
|
|
3596
|
+
if ((chunkOffset + chunkSize >= size) || (!data.length && dataSize)) {
|
|
3360
3597
|
controller.close();
|
|
3361
3598
|
} else {
|
|
3362
3599
|
chunkOffset += chunkSize;
|
|
@@ -3436,31 +3673,31 @@ class Data64URIWriter extends Writer {
|
|
|
3436
3673
|
Object.assign(this, {
|
|
3437
3674
|
contentType,
|
|
3438
3675
|
data: "data:" + (contentType || "") + ";base64,",
|
|
3439
|
-
|
|
3676
|
+
pendingCharacters: ""
|
|
3440
3677
|
});
|
|
3441
3678
|
}
|
|
3442
3679
|
|
|
3443
3680
|
writeUint8Array(array) {
|
|
3444
3681
|
const writer = this;
|
|
3445
3682
|
let indexArray;
|
|
3446
|
-
let dataString = writer.
|
|
3447
|
-
const delta = writer.
|
|
3448
|
-
writer.
|
|
3683
|
+
let dataString = writer.pendingCharacters;
|
|
3684
|
+
const delta = writer.pendingCharacters.length;
|
|
3685
|
+
writer.pendingCharacters = "";
|
|
3449
3686
|
for (indexArray = 0; indexArray < (Math.floor((delta + array.length) / 3) * 3) - delta; indexArray++) {
|
|
3450
3687
|
dataString += String.fromCharCode(array[indexArray]);
|
|
3451
3688
|
}
|
|
3452
3689
|
for (; indexArray < array.length; indexArray++) {
|
|
3453
|
-
writer.
|
|
3690
|
+
writer.pendingCharacters += String.fromCharCode(array[indexArray]);
|
|
3454
3691
|
}
|
|
3455
3692
|
if (dataString.length > 2) {
|
|
3456
3693
|
writer.data += btoa(dataString);
|
|
3457
3694
|
} else {
|
|
3458
|
-
writer.
|
|
3695
|
+
writer.pendingCharacters = dataString + writer.pendingCharacters;
|
|
3459
3696
|
}
|
|
3460
3697
|
}
|
|
3461
3698
|
|
|
3462
3699
|
getData() {
|
|
3463
|
-
return this.data + btoa(this.
|
|
3700
|
+
return this.data + btoa(this.pendingCharacters);
|
|
3464
3701
|
}
|
|
3465
3702
|
}
|
|
3466
3703
|
|
|
@@ -3490,7 +3727,7 @@ class BlobReader extends Reader {
|
|
|
3490
3727
|
constructor(blob) {
|
|
3491
3728
|
super();
|
|
3492
3729
|
Object.assign(this, {
|
|
3493
|
-
blob,
|
|
3730
|
+
sourceBlob: blob,
|
|
3494
3731
|
size: blob.size
|
|
3495
3732
|
});
|
|
3496
3733
|
if (!blobSliceProbe) {
|
|
@@ -3500,13 +3737,13 @@ class BlobReader extends Reader {
|
|
|
3500
3737
|
|
|
3501
3738
|
createReadable(options) {
|
|
3502
3739
|
const reader = this;
|
|
3503
|
-
const {
|
|
3740
|
+
const { sourceBlob, size } = reader;
|
|
3504
3741
|
const { offset = 0, size: readSize = size - offset } = options || {};
|
|
3505
3742
|
if (!offset && readSize >= size) {
|
|
3506
|
-
return toCompatibleReadable(
|
|
3743
|
+
return toCompatibleReadable(sourceBlob.stream());
|
|
3507
3744
|
}
|
|
3508
3745
|
if (blobSliceReliable) {
|
|
3509
|
-
return toCompatibleReadable(
|
|
3746
|
+
return toCompatibleReadable(sourceBlob.slice(offset, offset + readSize).stream());
|
|
3510
3747
|
}
|
|
3511
3748
|
return super.createReadable(options);
|
|
3512
3749
|
}
|
|
@@ -3515,7 +3752,7 @@ class BlobReader extends Reader {
|
|
|
3515
3752
|
const reader = this;
|
|
3516
3753
|
const offsetEnd = offset + length;
|
|
3517
3754
|
const readsWholeBlob = !offset && offsetEnd >= reader.size;
|
|
3518
|
-
const blob = readsWholeBlob ? reader.
|
|
3755
|
+
const blob = readsWholeBlob ? reader.sourceBlob : reader.sourceBlob.slice(offset, offsetEnd);
|
|
3519
3756
|
let arrayBuffer = await blob.arrayBuffer();
|
|
3520
3757
|
const sliceIgnoredByBuggyImplementation = arrayBuffer.byteLength > length;
|
|
3521
3758
|
if (sliceIgnoredByBuggyImplementation) {
|
|
@@ -3537,12 +3774,12 @@ class BlobWriter extends Stream {
|
|
|
3537
3774
|
}
|
|
3538
3775
|
});
|
|
3539
3776
|
writer.contentType = contentType;
|
|
3540
|
-
writer.
|
|
3541
|
-
writer.
|
|
3777
|
+
writer.blobPromise = streamToBlob(transformStream.readable, contentType);
|
|
3778
|
+
writer.blobPromise.catch(() => { });
|
|
3542
3779
|
}
|
|
3543
3780
|
|
|
3544
3781
|
getData() {
|
|
3545
|
-
return this.
|
|
3782
|
+
return this.blobPromise;
|
|
3546
3783
|
}
|
|
3547
3784
|
}
|
|
3548
3785
|
|
|
@@ -3576,7 +3813,7 @@ function getTextSize(text) {
|
|
|
3576
3813
|
class TextWriter extends BlobWriter {
|
|
3577
3814
|
|
|
3578
3815
|
constructor(encoding) {
|
|
3579
|
-
super(
|
|
3816
|
+
super();
|
|
3580
3817
|
Object.assign(this, {
|
|
3581
3818
|
encoding,
|
|
3582
3819
|
utf8: !encoding || encoding.toLowerCase() == "utf-8"
|
|
@@ -3592,14 +3829,7 @@ class TextWriter extends BlobWriter {
|
|
|
3592
3829
|
if (blob.text && utf8) {
|
|
3593
3830
|
return blob.text();
|
|
3594
3831
|
} else {
|
|
3595
|
-
|
|
3596
|
-
return new Promise((resolve, reject) => {
|
|
3597
|
-
Object.assign(reader, {
|
|
3598
|
-
onload: ({ target }) => resolve(target.result),
|
|
3599
|
-
onerror: () => reject(reader.error)
|
|
3600
|
-
});
|
|
3601
|
-
reader.readAsText(blob, encoding);
|
|
3602
|
-
});
|
|
3832
|
+
return decodeTextRemovingBOM(new Uint8Array(await blob.arrayBuffer()), encoding);
|
|
3603
3833
|
}
|
|
3604
3834
|
}
|
|
3605
3835
|
}
|
|
@@ -4267,85 +4497,13 @@ function readUint8Array(reader, offset, size) {
|
|
|
4267
4497
|
return reader.readUint8Array(offset, size);
|
|
4268
4498
|
}
|
|
4269
4499
|
|
|
4270
|
-
|
|
4271
|
-
|
|
4272
|
-
|
|
4273
|
-
|
|
4274
|
-
|
|
4275
|
-
|
|
4276
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4277
|
-
this list of conditions and the following disclaimer.
|
|
4278
|
-
|
|
4279
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4280
|
-
notice, this list of conditions and the following disclaimer in
|
|
4281
|
-
the documentation and/or other materials provided with the distribution.
|
|
4282
|
-
|
|
4283
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4284
|
-
derived from this software without specific prior written permission.
|
|
4285
|
-
|
|
4286
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4287
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4288
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4289
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4290
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4291
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4292
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4293
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4294
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4295
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4296
|
-
*/
|
|
4297
|
-
|
|
4298
|
-
/* global TextDecoder */
|
|
4299
|
-
|
|
4300
|
-
const CP437 = "\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split("");
|
|
4301
|
-
const VALID_CP437 = CP437.length == 256;
|
|
4302
|
-
|
|
4303
|
-
function decodeCP437(stringValue) {
|
|
4304
|
-
if (VALID_CP437) {
|
|
4305
|
-
let result = "";
|
|
4306
|
-
for (let indexCharacter = 0; indexCharacter < stringValue.length; indexCharacter++) {
|
|
4307
|
-
result += CP437[stringValue[indexCharacter]];
|
|
4308
|
-
}
|
|
4309
|
-
return result;
|
|
4310
|
-
} else {
|
|
4311
|
-
return new TextDecoder().decode(stringValue);
|
|
4312
|
-
}
|
|
4313
|
-
}
|
|
4314
|
-
|
|
4315
|
-
/*
|
|
4316
|
-
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
4317
|
-
|
|
4318
|
-
Redistribution and use in source and binary forms, with or without
|
|
4319
|
-
modification, are permitted provided that the following conditions are met:
|
|
4320
|
-
|
|
4321
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4322
|
-
this list of conditions and the following disclaimer.
|
|
4323
|
-
|
|
4324
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4325
|
-
notice, this list of conditions and the following disclaimer in
|
|
4326
|
-
the documentation and/or other materials provided with the distribution.
|
|
4327
|
-
|
|
4328
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4329
|
-
derived from this software without specific prior written permission.
|
|
4330
|
-
|
|
4331
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4332
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4333
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4334
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4335
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4336
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4337
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4338
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4339
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4340
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4341
|
-
*/
|
|
4342
|
-
|
|
4343
|
-
|
|
4344
|
-
function decodeText(value, encoding) {
|
|
4345
|
-
if (encoding && encoding.trim().toLowerCase() == "cp437") {
|
|
4346
|
-
return decodeCP437(value);
|
|
4500
|
+
function createReadable(reader, options) {
|
|
4501
|
+
if (reader.createReadable) {
|
|
4502
|
+
return reader.createReadable(options);
|
|
4503
|
+
} else if (reader.readUint8Array) {
|
|
4504
|
+
return Reader.prototype.createReadable.call(reader, options);
|
|
4347
4505
|
} else {
|
|
4348
|
-
return
|
|
4506
|
+
return reader.readable;
|
|
4349
4507
|
}
|
|
4350
4508
|
}
|
|
4351
4509
|
|
|
@@ -4505,83 +4663,6 @@ class Entry {
|
|
|
4505
4663
|
|
|
4506
4664
|
}
|
|
4507
4665
|
|
|
4508
|
-
/*
|
|
4509
|
-
Copyright (c) 2022 Gildas Lormeau. All rights reserved.
|
|
4510
|
-
|
|
4511
|
-
Redistribution and use in source and binary forms, with or without
|
|
4512
|
-
modification, are permitted provided that the following conditions are met:
|
|
4513
|
-
|
|
4514
|
-
1. Redistributions of source code must retain the above copyright notice,
|
|
4515
|
-
this list of conditions and the following disclaimer.
|
|
4516
|
-
|
|
4517
|
-
2. Redistributions in binary form must reproduce the above copyright
|
|
4518
|
-
notice, this list of conditions and the following disclaimer in
|
|
4519
|
-
the documentation and/or other materials provided with the distribution.
|
|
4520
|
-
|
|
4521
|
-
3. The names of the authors may not be used to endorse or promote products
|
|
4522
|
-
derived from this software without specific prior written permission.
|
|
4523
|
-
|
|
4524
|
-
THIS SOFTWARE IS PROVIDED ''AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
|
|
4525
|
-
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
4526
|
-
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
|
|
4527
|
-
INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
4528
|
-
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
4529
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
|
4530
|
-
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
4531
|
-
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
4532
|
-
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
4533
|
-
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
4534
|
-
*/
|
|
4535
|
-
|
|
4536
|
-
const OPTION_FILENAME_ENCODING = "filenameEncoding";
|
|
4537
|
-
const OPTION_COMMENT_ENCODING = "commentEncoding";
|
|
4538
|
-
const OPTION_DECODE_TEXT = "decodeText";
|
|
4539
|
-
const OPTION_EXTRACT_PREPENDED_DATA = "extractPrependedData";
|
|
4540
|
-
const OPTION_EXTRACT_APPENDED_DATA = "extractAppendedData";
|
|
4541
|
-
const OPTION_PASSWORD = "password";
|
|
4542
|
-
const OPTION_RAW_PASSWORD = "rawPassword";
|
|
4543
|
-
const OPTION_PASS_THROUGH = "passThrough";
|
|
4544
|
-
const OPTION_SIGNAL = "signal";
|
|
4545
|
-
const OPTION_CHECK_PASSWORD_ONLY = "checkPasswordOnly";
|
|
4546
|
-
const OPTION_CHECK_OVERLAPPING_ENTRY_ONLY = "checkOverlappingEntryOnly";
|
|
4547
|
-
const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
|
|
4548
|
-
const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
|
|
4549
|
-
const OPTION_CHECK_LOCAL_DIRECTORY = "checkLocalDirectory";
|
|
4550
|
-
const OPTION_CHECK_SIGNATURE = "checkSignature";
|
|
4551
|
-
const OPTION_CHECK_CRC32 = "checkCrc32";
|
|
4552
|
-
const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
|
|
4553
|
-
const OPTION_USE_WEB_WORKERS = "useWebWorkers";
|
|
4554
|
-
const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
|
|
4555
|
-
const OPTION_TRANSFER_STREAMS = "transferStreams";
|
|
4556
|
-
const OPTION_PREVENT_CLOSE = "preventClose";
|
|
4557
|
-
const OPTION_ENCRYPTION_STRENGTH = "encryptionStrength";
|
|
4558
|
-
const OPTION_EXTENDED_TIMESTAMP = "extendedTimestamp";
|
|
4559
|
-
const OPTION_NTFS_TIMESTAMP = "ntfsTimestamp";
|
|
4560
|
-
const OPTION_KEEP_ORDER = "keepOrder";
|
|
4561
|
-
const OPTION_LEVEL = "level";
|
|
4562
|
-
const OPTION_BUFFERED_WRITE = "bufferedWrite";
|
|
4563
|
-
const OPTION_CREATE_TEMP_STREAM = "createTempStream";
|
|
4564
|
-
const OPTION_DATA_DESCRIPTOR_SIGNATURE = "dataDescriptorSignature";
|
|
4565
|
-
const OPTION_USE_UNICODE_FILE_NAMES = "useUnicodeFileNames";
|
|
4566
|
-
const OPTION_DATA_DESCRIPTOR = "dataDescriptor";
|
|
4567
|
-
const OPTION_SUPPORT_ZIP64_SPLIT_FILE = "supportZip64SplitFile";
|
|
4568
|
-
const OPTION_ENCODE_TEXT = "encodeText";
|
|
4569
|
-
const OPTION_OFFSET = "offset";
|
|
4570
|
-
const OPTION_USDZ = "usdz";
|
|
4571
|
-
const OPTION_UNIX_EXTRA_FIELD_TYPE = "unixExtraFieldType";
|
|
4572
|
-
const OPTION_LOCAL_EXTRA_FIELD = "localExtraField";
|
|
4573
|
-
const OPTION_STRICTNESS = "strictness";
|
|
4574
|
-
const OPTION_FILENAME_VALIDATION = "filenameValidation";
|
|
4575
|
-
const OPTION_NORMALIZE_FILENAME = "normalizeFilename";
|
|
4576
|
-
const OPTION_MAX_APPENDED_DATA_SIZE = "maxAppendedDataSize";
|
|
4577
|
-
const OPTION_DECRYPT_CENTRAL_DIRECTORY = "decryptCentralDirectory";
|
|
4578
|
-
const OPTION_SIGN_CENTRAL_DIRECTORY = "signCentralDirectory";
|
|
4579
|
-
const TEXT_TYPE_FILENAME = "filename";
|
|
4580
|
-
const TEXT_TYPE_COMMENT = "comment";
|
|
4581
|
-
const STRICTNESS_STRICT = "strict";
|
|
4582
|
-
const STRICTNESS_BALANCED = "balanced";
|
|
4583
|
-
const STRICTNESS_TOLERANT = "tolerant";
|
|
4584
|
-
|
|
4585
4666
|
/*
|
|
4586
4667
|
Copyright (c) 2025 Gildas Lormeau. All rights reserved.
|
|
4587
4668
|
|
|
@@ -4622,6 +4703,7 @@ const ERR_UNSUPPORTED_ENCRYPTION = "Encryption method not supported";
|
|
|
4622
4703
|
const ERR_UNSUPPORTED_COMPRESSION$1 = "Compression method not supported";
|
|
4623
4704
|
const ERR_SPLIT_ZIP_FILE = "Split zip file";
|
|
4624
4705
|
const ERR_OVERLAPPING_ENTRY = "Overlapping entry found";
|
|
4706
|
+
const ERR_ENTRY_DATA_OUT_OF_BOUNDS = "Entry data out of bounds";
|
|
4625
4707
|
const ERR_AMBIGUOUS_ARCHIVE = "Ambiguous archive";
|
|
4626
4708
|
const ERR_ENCRYPTED_CENTRAL_DIRECTORY = "Encrypted central directory is not supported";
|
|
4627
4709
|
const ERR_UNSAFE_FILENAME = "Unsafe filename";
|
|
@@ -4642,7 +4724,7 @@ const ZIP64_PROPERTIES = [
|
|
|
4642
4724
|
];
|
|
4643
4725
|
const ZIP64_EXTRACTION = {
|
|
4644
4726
|
[MAX_16_BITS]: {
|
|
4645
|
-
getValue: getUint32,
|
|
4727
|
+
getValue: getUint32$1,
|
|
4646
4728
|
bytes: 4
|
|
4647
4729
|
},
|
|
4648
4730
|
[MAX_32_BITS]: {
|
|
@@ -4651,6 +4733,7 @@ const ZIP64_EXTRACTION = {
|
|
|
4651
4733
|
}
|
|
4652
4734
|
};
|
|
4653
4735
|
const MAX_END_OF_CENTRAL_DIR_PROBES = 64;
|
|
4736
|
+
const MAX_DEFLATE_EXPANSION_RATIO = 1032;
|
|
4654
4737
|
const CENTRAL_DIRECTORY_UNREACHABLE = 0;
|
|
4655
4738
|
const CENTRAL_DIRECTORY_PLAUSIBLE = 1;
|
|
4656
4739
|
const CENTRAL_DIRECTORY_REACHABLE = 2;
|
|
@@ -4661,7 +4744,6 @@ class ZipReader {
|
|
|
4661
4744
|
Object.assign(this, {
|
|
4662
4745
|
reader: new GenericReader(reader),
|
|
4663
4746
|
options,
|
|
4664
|
-
config: getConfiguration(),
|
|
4665
4747
|
readRanges: new Map()
|
|
4666
4748
|
});
|
|
4667
4749
|
}
|
|
@@ -4669,7 +4751,6 @@ class ZipReader {
|
|
|
4669
4751
|
async* getEntriesGenerator(options = {}) {
|
|
4670
4752
|
const zipReader = this;
|
|
4671
4753
|
let { reader } = zipReader;
|
|
4672
|
-
const { config } = zipReader;
|
|
4673
4754
|
await initStream(reader);
|
|
4674
4755
|
if (reader.size === UNDEFINED_VALUE || !reader.readUint8Array) {
|
|
4675
4756
|
reader = new BlobReader(await streamToBlob(reader.readable));
|
|
@@ -4686,9 +4767,7 @@ class ZipReader {
|
|
|
4686
4767
|
const normalizeFilename = getOptionValue$1(zipReader, options, OPTION_NORMALIZE_FILENAME);
|
|
4687
4768
|
const { endOfDirectoryInfo, endOfDirectoryReachingEndCount } = await findEndOfCentralDirectory(reader, rejectAmbiguousEndOfDirectory, maxAppendedDataSize);
|
|
4688
4769
|
if (!endOfDirectoryInfo) {
|
|
4689
|
-
|
|
4690
|
-
const signatureView = getDataView(signatureArray);
|
|
4691
|
-
if (getUint32(signatureView) == SPLIT_ZIP_FILE_SIGNATURE) {
|
|
4770
|
+
if (await startsWithSplitZipSignature$1(reader)) {
|
|
4692
4771
|
throw new Error(ERR_SPLIT_ZIP_FILE);
|
|
4693
4772
|
} else {
|
|
4694
4773
|
throw new Error(ERR_EOCDR_NOT_FOUND);
|
|
@@ -4698,18 +4777,18 @@ class ZipReader {
|
|
|
4698
4777
|
throwAmbiguousArchive("multiple end of central directory records");
|
|
4699
4778
|
}
|
|
4700
4779
|
const endOfDirectoryView = getDataView(endOfDirectoryInfo);
|
|
4701
|
-
let directoryDataLength = getUint32(endOfDirectoryView, 12);
|
|
4702
|
-
let directoryDataOffset = getUint32(endOfDirectoryView, 16);
|
|
4780
|
+
let directoryDataLength = getUint32$1(endOfDirectoryView, 12);
|
|
4781
|
+
let directoryDataOffset = getUint32$1(endOfDirectoryView, 16);
|
|
4703
4782
|
const commentOffset = endOfDirectoryInfo.offset;
|
|
4704
|
-
const commentLength = getUint16(endOfDirectoryView, 20);
|
|
4783
|
+
const commentLength = getUint16$1(endOfDirectoryView, 20);
|
|
4705
4784
|
const appendedDataOffset = commentOffset + END_OF_CENTRAL_DIR_LENGTH + commentLength;
|
|
4706
4785
|
if (reader.size - appendedDataOffset > maxAppendedDataSize) {
|
|
4707
4786
|
throwAmbiguousArchive("appended data");
|
|
4708
4787
|
}
|
|
4709
|
-
let lastDiskNumber = getUint16(endOfDirectoryView, 4);
|
|
4788
|
+
let lastDiskNumber = getUint16$1(endOfDirectoryView, 4);
|
|
4710
4789
|
const expectedLastDiskNumber = reader.lastDiskNumber || 0;
|
|
4711
|
-
let diskNumber = getUint16(endOfDirectoryView, 6);
|
|
4712
|
-
let filesLength = getUint16(endOfDirectoryView, 10);
|
|
4790
|
+
let diskNumber = getUint16$1(endOfDirectoryView, 6);
|
|
4791
|
+
let filesLength = getUint16$1(endOfDirectoryView, 10);
|
|
4713
4792
|
let prependedDataLength = 0;
|
|
4714
4793
|
let startOffset;
|
|
4715
4794
|
let zip64EndOfDirectory;
|
|
@@ -4725,12 +4804,12 @@ class ZipReader {
|
|
|
4725
4804
|
EMPTY_UINT8_ARRAY;
|
|
4726
4805
|
const endOfDirectoryLocatorView = getDataView(endOfDirectoryLocatorArray);
|
|
4727
4806
|
if (endOfDirectoryLocatorArray.length == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH &&
|
|
4728
|
-
getUint32(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
4729
|
-
directoryDataOffset = getDiskOffset$1(reader, getUint32(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4807
|
+
getUint32$1(endOfDirectoryLocatorView, 0) == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE) {
|
|
4808
|
+
directoryDataOffset = getDiskOffset$1(reader, getUint32$1(endOfDirectoryLocatorView, 4)) + getBigUint64(endOfDirectoryLocatorView, 8);
|
|
4730
4809
|
let endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4731
4810
|
let endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4732
4811
|
const expectedDirectoryDataOffset = endOfDirectoryInfo.offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH - ZIP64_END_OF_CENTRAL_DIR_LENGTH;
|
|
4733
|
-
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
4812
|
+
if ((endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) &&
|
|
4734
4813
|
directoryDataOffset != expectedDirectoryDataOffset && expectedDirectoryDataOffset >= 0) {
|
|
4735
4814
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
4736
4815
|
directoryDataOffset = expectedDirectoryDataOffset;
|
|
@@ -4740,7 +4819,7 @@ class ZipReader {
|
|
|
4740
4819
|
endOfDirectoryArray = await readUint8Array(reader, directoryDataOffset, ZIP64_END_OF_CENTRAL_DIR_LENGTH);
|
|
4741
4820
|
endOfDirectoryView = getDataView(endOfDirectoryArray);
|
|
4742
4821
|
}
|
|
4743
|
-
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4822
|
+
if (endOfDirectoryArray.length < ZIP64_END_OF_CENTRAL_DIR_LENGTH || getUint32$1(endOfDirectoryView, 0) != ZIP64_END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
4744
4823
|
throw new Error(ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND);
|
|
4745
4824
|
}
|
|
4746
4825
|
zip64EndOfDirectory = true;
|
|
@@ -4755,13 +4834,13 @@ class ZipReader {
|
|
|
4755
4834
|
}
|
|
4756
4835
|
}
|
|
4757
4836
|
if (lastDiskNumber == MAX_16_BITS) {
|
|
4758
|
-
lastDiskNumber = getUint32(endOfDirectoryView, 16);
|
|
4759
|
-
} else if (checkAmbiguity && lastDiskNumber != getUint32(endOfDirectoryView, 16)) {
|
|
4837
|
+
lastDiskNumber = getUint32$1(endOfDirectoryView, 16);
|
|
4838
|
+
} else if (checkAmbiguity && lastDiskNumber != getUint32$1(endOfDirectoryView, 16)) {
|
|
4760
4839
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
4761
4840
|
}
|
|
4762
4841
|
if (diskNumber == MAX_16_BITS) {
|
|
4763
|
-
diskNumber = getUint32(endOfDirectoryView, 20);
|
|
4764
|
-
} else if (checkAmbiguity && diskNumber != getUint32(endOfDirectoryView, 20)) {
|
|
4842
|
+
diskNumber = getUint32$1(endOfDirectoryView, 20);
|
|
4843
|
+
} else if (checkAmbiguity && diskNumber != getUint32$1(endOfDirectoryView, 20)) {
|
|
4765
4844
|
throwAmbiguousArchive("mismatched zip64 end of central directory record");
|
|
4766
4845
|
}
|
|
4767
4846
|
if (filesLength == MAX_16_BITS) {
|
|
@@ -4799,11 +4878,11 @@ class ZipReader {
|
|
|
4799
4878
|
}
|
|
4800
4879
|
const expectedDirectoryDataOffset = centralDirectoryEndOffset - directoryDataLength;
|
|
4801
4880
|
if (directoryDataOffset != expectedDirectoryDataOffset && diskNumber == lastDiskNumber) {
|
|
4802
|
-
const storedPointsAtDirectory = getUint32(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4881
|
+
const storedPointsAtDirectory = getUint32$1(directoryView, offset) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4803
4882
|
let reconcile = !storedPointsAtDirectory;
|
|
4804
4883
|
if (!reconcile && expectedDirectoryDataOffset >= 0 && expectedDirectoryDataOffset + 4 <= reader.size) {
|
|
4805
4884
|
const expectedSignatureArray = await readUint8Array(reader, expectedDirectoryDataOffset, 4);
|
|
4806
|
-
reconcile = getUint32(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4885
|
+
reconcile = getUint32$1(getDataView(expectedSignatureArray), 0) == CENTRAL_FILE_HEADER_SIGNATURE;
|
|
4807
4886
|
}
|
|
4808
4887
|
if (reconcile) {
|
|
4809
4888
|
const originalDirectoryDataOffset = directoryDataOffset;
|
|
@@ -4827,10 +4906,10 @@ class ZipReader {
|
|
|
4827
4906
|
}
|
|
4828
4907
|
zipReader.directoryOffset = directoryDataOffset;
|
|
4829
4908
|
zipReader.directoryLength = declaredDirectoryDataLength;
|
|
4830
|
-
const decryptCentralDirectory =
|
|
4909
|
+
const decryptCentralDirectory = getFunctionOptionValue$1(zipReader, options, OPTION_DECRYPT_CENTRAL_DIRECTORY);
|
|
4831
4910
|
let decryptedDirectory;
|
|
4832
4911
|
if (decryptCentralDirectory && filesLength && directoryArray.length >= 4 &&
|
|
4833
|
-
getUint32(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
|
|
4912
|
+
getUint32$1(directoryView, 0) != CENTRAL_FILE_HEADER_SIGNATURE &&
|
|
4834
4913
|
(zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4835
4914
|
directoryArray = await decryptCentralDirectory(directoryArray, directoryEncryptionInfo);
|
|
4836
4915
|
directoryView = getDataView(directoryArray);
|
|
@@ -4843,8 +4922,8 @@ class ZipReader {
|
|
|
4843
4922
|
const filenames = checkAmbiguity ? new Set() : UNDEFINED_VALUE;
|
|
4844
4923
|
let duplicateFilename;
|
|
4845
4924
|
for (let indexFile = 0; indexFile < filesLength; indexFile++) {
|
|
4846
|
-
const fileEntry = new ZipEntry$1(reader,
|
|
4847
|
-
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4925
|
+
const fileEntry = new ZipEntry$1(reader, zipReader.options);
|
|
4926
|
+
if (offset + CENTRAL_FILE_HEADER_LENGTH > directoryArray.length || getUint32$1(directoryView, offset) != CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
4848
4927
|
if (indexFile == 0 && !decryptedDirectory && (zip64EndOfDirectoryVersion2 || detectEncryptedCentralDirectory(directoryView))) {
|
|
4849
4928
|
throw new Error(ERR_ENCRYPTED_CENTRAL_DIRECTORY);
|
|
4850
4929
|
}
|
|
@@ -4855,16 +4934,16 @@ class ZipReader {
|
|
|
4855
4934
|
const filenameOffset = offset + CENTRAL_FILE_HEADER_LENGTH;
|
|
4856
4935
|
const extraFieldOffset = filenameOffset + fileEntry.filenameLength;
|
|
4857
4936
|
const commentOffset = extraFieldOffset + fileEntry.extraFieldLength;
|
|
4858
|
-
const versionMadeBy = getUint16(directoryView, offset + 4);
|
|
4937
|
+
const versionMadeBy = getUint16$1(directoryView, offset + 4);
|
|
4859
4938
|
const msDosCompatible = versionMadeBy >> 8 == 0;
|
|
4860
4939
|
const unixCompatible = versionMadeBy >> 8 == 3;
|
|
4861
4940
|
const rawFilename = directoryArray.subarray(filenameOffset, extraFieldOffset);
|
|
4862
|
-
const commentLength = getUint16(directoryView, offset + 32);
|
|
4941
|
+
const commentLength = getUint16$1(directoryView, offset + 32);
|
|
4863
4942
|
const endOffset = commentOffset + commentLength;
|
|
4864
4943
|
const rawComment = directoryArray.subarray(commentOffset, endOffset);
|
|
4865
4944
|
const filenameUTF8 = languageEncodingFlag;
|
|
4866
4945
|
const commentUTF8 = languageEncodingFlag;
|
|
4867
|
-
const externalFileAttributes = getUint32(directoryView, offset + 38);
|
|
4946
|
+
const externalFileAttributes = getUint32$1(directoryView, offset + 38);
|
|
4868
4947
|
const msdosAttributesRaw = externalFileAttributes & MAX_8_BITS;
|
|
4869
4948
|
const msdosAttributes = {
|
|
4870
4949
|
readOnly: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_READONLY_MASK),
|
|
@@ -4873,8 +4952,8 @@ class ZipReader {
|
|
|
4873
4952
|
directory: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_DIR_MASK),
|
|
4874
4953
|
archive: Boolean(msdosAttributesRaw & FILE_ATTR_MSDOS_ARCHIVE_MASK)
|
|
4875
4954
|
};
|
|
4876
|
-
const offsetFileEntry = getUint32(directoryView, offset + 42);
|
|
4877
|
-
const decode =
|
|
4955
|
+
const offsetFileEntry = getUint32$1(directoryView, offset + 42);
|
|
4956
|
+
const decode = getFunctionOptionValue$1(zipReader, options, OPTION_DECODE_TEXT) || decodeText;
|
|
4878
4957
|
const rawFilenameEncoding = filenameUTF8 ? CHARSET_UTF8 : filenameEncoding || CHARSET_CP437;
|
|
4879
4958
|
const rawCommentEncoding = commentUTF8 ? CHARSET_UTF8 : commentEncoding || CHARSET_CP437;
|
|
4880
4959
|
let filename = decode(rawFilename, rawFilenameEncoding, TEXT_TYPE_FILENAME);
|
|
@@ -4905,8 +4984,8 @@ class ZipReader {
|
|
|
4905
4984
|
uncompressedSize: 0,
|
|
4906
4985
|
commentLength,
|
|
4907
4986
|
offset: offsetFileEntry,
|
|
4908
|
-
diskNumberStart: getUint16(directoryView, offset + 34),
|
|
4909
|
-
internalFileAttributes: getUint16(directoryView, offset + 36),
|
|
4987
|
+
diskNumberStart: getUint16$1(directoryView, offset + 34),
|
|
4988
|
+
internalFileAttributes: getUint16$1(directoryView, offset + 36),
|
|
4910
4989
|
externalFileAttributes,
|
|
4911
4990
|
msdosAttributesRaw,
|
|
4912
4991
|
msdosAttributes,
|
|
@@ -4974,8 +5053,8 @@ class ZipReader {
|
|
|
4974
5053
|
yield entry;
|
|
4975
5054
|
}
|
|
4976
5055
|
let offsetAfterSignature = offset;
|
|
4977
|
-
if (offset + 6 <= directoryArray.length && getUint32(directoryView, offset) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
|
|
4978
|
-
const signatureDataLength = getUint16(directoryView, offset + 4);
|
|
5056
|
+
if (offset + 6 <= directoryArray.length && getUint32$1(directoryView, offset) == DIGITAL_SIGNATURE_RECORD_SIGNATURE) {
|
|
5057
|
+
const signatureDataLength = getUint16$1(directoryView, offset + 4);
|
|
4979
5058
|
if (offset + 6 + signatureDataLength <= directoryArray.length) {
|
|
4980
5059
|
zipReader.digitalSignature = directoryArray.subarray(offset + 6, offset + 6 + signatureDataLength);
|
|
4981
5060
|
offsetAfterSignature = offset + 6 + signatureDataLength;
|
|
@@ -4987,13 +5066,17 @@ class ZipReader {
|
|
|
4987
5066
|
if (duplicateFilename) {
|
|
4988
5067
|
throwAmbiguousArchive("duplicate filename");
|
|
4989
5068
|
}
|
|
4990
|
-
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > 0))) {
|
|
4991
|
-
throwAmbiguousArchive("prepended data");
|
|
4992
|
-
}
|
|
4993
5069
|
const extractPrependedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_PREPENDED_DATA);
|
|
4994
5070
|
const extractAppendedData = getOptionValue$1(zipReader, options, OPTION_EXTRACT_APPENDED_DATA);
|
|
5071
|
+
const splitZipSignatureLength = (checkAmbiguity || extractPrependedData) && filesLength &&
|
|
5072
|
+
startOffset == SPLIT_ZIP_FILE_SIGNATURE_LENGTH && await startsWithSplitZipMarker(reader) ? SPLIT_ZIP_FILE_SIGNATURE_LENGTH : 0;
|
|
5073
|
+
if (checkAmbiguity && (prependedDataLength || (filesLength && startOffset > splitZipSignatureLength))) {
|
|
5074
|
+
throwAmbiguousArchive("prepended data");
|
|
5075
|
+
}
|
|
4995
5076
|
if (extractPrependedData) {
|
|
4996
|
-
zipReader.prependedData = startOffset >
|
|
5077
|
+
zipReader.prependedData = startOffset > splitZipSignatureLength ?
|
|
5078
|
+
await readUint8Array(reader, splitZipSignatureLength, startOffset - splitZipSignatureLength) :
|
|
5079
|
+
EMPTY_UINT8_ARRAY;
|
|
4997
5080
|
}
|
|
4998
5081
|
zipReader.comment = commentLength ? await readUint8Array(reader, commentOffset + END_OF_CENTRAL_DIR_LENGTH, commentLength) : EMPTY_UINT8_ARRAY;
|
|
4999
5082
|
if (extractAppendedData) {
|
|
@@ -5060,16 +5143,16 @@ class ZipReaderStream {
|
|
|
5060
5143
|
|
|
5061
5144
|
let ZipEntry$1 = class ZipEntry {
|
|
5062
5145
|
|
|
5063
|
-
constructor(reader,
|
|
5146
|
+
constructor(reader, options) {
|
|
5064
5147
|
Object.assign(this, {
|
|
5065
5148
|
reader,
|
|
5066
|
-
config,
|
|
5067
5149
|
options
|
|
5068
5150
|
});
|
|
5069
5151
|
}
|
|
5070
5152
|
|
|
5071
5153
|
async getData(writer, fileEntry, readRanges, options = {}) {
|
|
5072
5154
|
const zipEntry = this;
|
|
5155
|
+
const config = getConfiguration();
|
|
5073
5156
|
const {
|
|
5074
5157
|
reader,
|
|
5075
5158
|
index,
|
|
@@ -5078,7 +5161,6 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5078
5161
|
extraFieldAES,
|
|
5079
5162
|
extraFieldZip64,
|
|
5080
5163
|
compressionMethod,
|
|
5081
|
-
config,
|
|
5082
5164
|
bitFlag,
|
|
5083
5165
|
rawBitFlag,
|
|
5084
5166
|
crc32,
|
|
@@ -5096,6 +5178,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5096
5178
|
let password = getOptionValue$1(zipEntry, options, OPTION_PASSWORD);
|
|
5097
5179
|
let rawPassword = getOptionValue$1(zipEntry, options, OPTION_RAW_PASSWORD);
|
|
5098
5180
|
const passThrough = getOptionValue$1(zipEntry, options, OPTION_PASS_THROUGH);
|
|
5181
|
+
checkPasswordOption(password, rawPassword);
|
|
5099
5182
|
password = password && password.length && password;
|
|
5100
5183
|
rawPassword = rawPassword && rawPassword.length && rawPassword;
|
|
5101
5184
|
if (extraFieldAES) {
|
|
@@ -5103,7 +5186,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5103
5186
|
throw new Error(ERR_UNSUPPORTED_COMPRESSION$1);
|
|
5104
5187
|
}
|
|
5105
5188
|
}
|
|
5106
|
-
if (dataArray.length < HEADER_SIZE || getUint32(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
5189
|
+
if (dataArray.length < HEADER_SIZE || getUint32$1(dataView, 0) != LOCAL_FILE_HEADER_SIGNATURE) {
|
|
5107
5190
|
throw new Error(ERR_LOCAL_FILE_HEADER_NOT_FOUND);
|
|
5108
5191
|
}
|
|
5109
5192
|
readCommonHeader(localDirectory, dataView, 4);
|
|
@@ -5165,9 +5248,12 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5165
5248
|
}
|
|
5166
5249
|
}
|
|
5167
5250
|
const dataOffset = localHeaderOffset + HEADER_SIZE + filenameLength + extraFieldLength;
|
|
5251
|
+
if (dataOffset + compressedSize > reader.size) {
|
|
5252
|
+
throw new Error(ERR_ENTRY_DATA_OUT_OF_BOUNDS);
|
|
5253
|
+
}
|
|
5168
5254
|
const size = compressedSize;
|
|
5169
5255
|
const readable = toCompatibleReadable(reader.createReadable({ offset: dataOffset, size }));
|
|
5170
|
-
const signal = getOptionValue$1(zipEntry, options, OPTION_SIGNAL);
|
|
5256
|
+
const signal = checkSignalOption(getOptionValue$1(zipEntry, options, OPTION_SIGNAL));
|
|
5171
5257
|
const checkPasswordOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_PASSWORD_ONLY);
|
|
5172
5258
|
let checkOverlappingEntry = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY);
|
|
5173
5259
|
const checkOverlappingEntryOnly = getOptionValue$1(zipEntry, options, OPTION_CHECK_OVERLAPPING_ENTRY_ONLY);
|
|
@@ -5175,6 +5261,8 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5175
5261
|
checkOverlappingEntry = true;
|
|
5176
5262
|
}
|
|
5177
5263
|
const { onstart, onprogress, onend } = options;
|
|
5264
|
+
const compressed = compressionMethod != COMPRESSION_METHOD_STORE && !passThrough;
|
|
5265
|
+
const outputSize = passThrough ? compressedSize : uncompressedSize;
|
|
5178
5266
|
const deflate64 = compressionMethod == COMPRESSION_METHOD_DEFLATE_64;
|
|
5179
5267
|
let useCompressionStream = getOptionValue$1(zipEntry, options, OPTION_USE_COMPRESSION_STREAM);
|
|
5180
5268
|
if (deflate64) {
|
|
@@ -5195,9 +5283,9 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5195
5283
|
checkCrc32,
|
|
5196
5284
|
checkAuthenticationCode: getOptionValue$1(zipEntry, options, OPTION_CHECK_AUTHENTICATION_CODE),
|
|
5197
5285
|
passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & MAX_8_BITS) : ((crc32 >>> 24) & MAX_8_BITS)),
|
|
5198
|
-
outputSize
|
|
5286
|
+
outputSize,
|
|
5199
5287
|
crc32,
|
|
5200
|
-
compressed
|
|
5288
|
+
compressed,
|
|
5201
5289
|
encrypted,
|
|
5202
5290
|
useWebWorkers: getOptionValue$1(zipEntry, options, OPTION_USE_WEB_WORKERS),
|
|
5203
5291
|
useCompressionStream,
|
|
@@ -5234,11 +5322,11 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5234
5322
|
writer = new WritableStream();
|
|
5235
5323
|
}
|
|
5236
5324
|
writer = new GenericWriter(writer);
|
|
5237
|
-
await initStream(writer,
|
|
5325
|
+
await initStream(writer, getDecodableOutputSize(outputSize, compressedSize, compressed));
|
|
5238
5326
|
({ writable } = writer);
|
|
5239
|
-
const { outputSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5240
|
-
writer.size +=
|
|
5241
|
-
if (
|
|
5327
|
+
const { outputSize: writtenSize } = await runWorker({ readable, writable }, workerOptions);
|
|
5328
|
+
writer.size += writtenSize;
|
|
5329
|
+
if (writtenSize != outputSize) {
|
|
5242
5330
|
throw new Error(ERR_INVALID_UNCOMPRESSED_SIZE);
|
|
5243
5331
|
}
|
|
5244
5332
|
}
|
|
@@ -5272,7 +5360,7 @@ let ZipEntry$1 = class ZipEntry {
|
|
|
5272
5360
|
function detectEncryptedCentralDirectory(directoryView) {
|
|
5273
5361
|
const maxOffset = Math.min(directoryView.byteLength, 1024) - 3;
|
|
5274
5362
|
for (let offset = 0; offset < maxOffset; offset++) {
|
|
5275
|
-
if (getUint32(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
5363
|
+
if (getUint32$1(directoryView, offset) == ARCHIVE_EXTRA_DATA_SIGNATURE) {
|
|
5276
5364
|
return true;
|
|
5277
5365
|
}
|
|
5278
5366
|
}
|
|
@@ -5283,15 +5371,15 @@ function getDirectoryEncryptionInfo(rawExtensibleData) {
|
|
|
5283
5371
|
const directoryEncryptionInfo = { rawExtensibleData };
|
|
5284
5372
|
if (rawExtensibleData.length >= 28) {
|
|
5285
5373
|
const extensibleDataView = getDataView(rawExtensibleData);
|
|
5286
|
-
const hashDataLength = getUint16(extensibleDataView, 26);
|
|
5374
|
+
const hashDataLength = getUint16$1(extensibleDataView, 26);
|
|
5287
5375
|
Object.assign(directoryEncryptionInfo, {
|
|
5288
|
-
compressionMethod: getUint16(extensibleDataView, 0),
|
|
5376
|
+
compressionMethod: getUint16$1(extensibleDataView, 0),
|
|
5289
5377
|
compressedSize: Number(getBigUint64(extensibleDataView, 2)),
|
|
5290
5378
|
uncompressedSize: Number(getBigUint64(extensibleDataView, 10)),
|
|
5291
|
-
encryptionAlgorithm: getUint16(extensibleDataView, 18),
|
|
5292
|
-
bitLength: getUint16(extensibleDataView, 20),
|
|
5293
|
-
flags: getUint16(extensibleDataView, 22),
|
|
5294
|
-
hashAlgorithm: getUint16(extensibleDataView, 24),
|
|
5379
|
+
encryptionAlgorithm: getUint16$1(extensibleDataView, 18),
|
|
5380
|
+
bitLength: getUint16$1(extensibleDataView, 20),
|
|
5381
|
+
flags: getUint16$1(extensibleDataView, 22),
|
|
5382
|
+
hashAlgorithm: getUint16$1(extensibleDataView, 24),
|
|
5295
5383
|
hashData: rawExtensibleData.subarray(28, 28 + hashDataLength)
|
|
5296
5384
|
});
|
|
5297
5385
|
}
|
|
@@ -5299,12 +5387,12 @@ function getDirectoryEncryptionInfo(rawExtensibleData) {
|
|
|
5299
5387
|
}
|
|
5300
5388
|
|
|
5301
5389
|
function readCommonHeader(directory, dataView, offset) {
|
|
5302
|
-
const rawBitFlag = directory.rawBitFlag = getUint16(dataView, offset + 2);
|
|
5390
|
+
const rawBitFlag = directory.rawBitFlag = getUint16$1(dataView, offset + 2);
|
|
5303
5391
|
const encrypted = (rawBitFlag & BITFLAG_ENCRYPTED) == BITFLAG_ENCRYPTED;
|
|
5304
|
-
const rawLastModDate = getUint32(dataView, offset + 6);
|
|
5392
|
+
const rawLastModDate = getUint32$1(dataView, offset + 6);
|
|
5305
5393
|
Object.assign(directory, {
|
|
5306
5394
|
encrypted,
|
|
5307
|
-
version: getUint16(dataView, offset),
|
|
5395
|
+
version: getUint16$1(dataView, offset),
|
|
5308
5396
|
bitFlag: {
|
|
5309
5397
|
level: (rawBitFlag & BITFLAG_LEVEL) >> 1,
|
|
5310
5398
|
dataDescriptor: (rawBitFlag & BITFLAG_DATA_DESCRIPTOR) == BITFLAG_DATA_DESCRIPTOR,
|
|
@@ -5312,8 +5400,8 @@ function readCommonHeader(directory, dataView, offset) {
|
|
|
5312
5400
|
},
|
|
5313
5401
|
rawLastModDate,
|
|
5314
5402
|
lastModDate: getDate(rawLastModDate),
|
|
5315
|
-
filenameLength: getUint16(dataView, offset + 22),
|
|
5316
|
-
extraFieldLength: getUint16(dataView, offset + 24)
|
|
5403
|
+
filenameLength: getUint16$1(dataView, offset + 22),
|
|
5404
|
+
extraFieldLength: getUint16$1(dataView, offset + 24)
|
|
5317
5405
|
});
|
|
5318
5406
|
}
|
|
5319
5407
|
|
|
@@ -5324,8 +5412,8 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
5324
5412
|
let offsetExtraField = 0;
|
|
5325
5413
|
try {
|
|
5326
5414
|
while (offsetExtraField < rawExtraField.length) {
|
|
5327
|
-
const type = getUint16(rawExtraFieldView, offsetExtraField);
|
|
5328
|
-
const size = getUint16(rawExtraFieldView, offsetExtraField + 2);
|
|
5415
|
+
const type = getUint16$1(rawExtraFieldView, offsetExtraField);
|
|
5416
|
+
const size = getUint16$1(rawExtraFieldView, offsetExtraField + 2);
|
|
5329
5417
|
extraField.set(type, {
|
|
5330
5418
|
type,
|
|
5331
5419
|
data: rawExtraField.slice(offsetExtraField + 4, offsetExtraField + 4 + size)
|
|
@@ -5335,12 +5423,12 @@ function readCommonFooter(fileEntry, directory, dataView, offset, localDirectory
|
|
|
5335
5423
|
} catch {
|
|
5336
5424
|
// ignored
|
|
5337
5425
|
}
|
|
5338
|
-
const compressionMethod = getUint16(dataView, offset + 4);
|
|
5426
|
+
const compressionMethod = getUint16$1(dataView, offset + 4);
|
|
5339
5427
|
Object.assign(directory, {
|
|
5340
|
-
signature: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5341
|
-
crc32: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5342
|
-
compressedSize: getUint32(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
|
|
5343
|
-
uncompressedSize: getUint32(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
|
|
5428
|
+
signature: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5429
|
+
crc32: getUint32$1(dataView, offset + HEADER_OFFSET_SIGNATURE),
|
|
5430
|
+
compressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
|
|
5431
|
+
uncompressedSize: getUint32$1(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
|
|
5344
5432
|
});
|
|
5345
5433
|
const extraFieldZip64 = extraField.get(EXTRAFIELD_TYPE_ZIP64);
|
|
5346
5434
|
if (extraFieldZip64) {
|
|
@@ -5429,11 +5517,11 @@ function readExtraFieldUnicode(extraFieldUnicode, propertyName, rawPropertyName,
|
|
|
5429
5517
|
computedCrc32.append(fileEntry[rawPropertyName]);
|
|
5430
5518
|
const computedCrc32View = getDataView(new Uint8Array(4));
|
|
5431
5519
|
computedCrc32View.setUint32(0, computedCrc32.get(), true);
|
|
5432
|
-
const nameCrc32 = getUint32(extraFieldView, 1);
|
|
5520
|
+
const nameCrc32 = getUint32$1(extraFieldView, 1);
|
|
5433
5521
|
Object.assign(extraFieldUnicode, {
|
|
5434
5522
|
version: getUint8(extraFieldView, 0),
|
|
5435
5523
|
[propertyName]: decodeText(extraFieldUnicode.data.subarray(5)),
|
|
5436
|
-
valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32(computedCrc32View, 0)
|
|
5524
|
+
valid: !fileEntry.bitFlag.languageEncodingFlag && nameCrc32 == getUint32$1(computedCrc32View, 0)
|
|
5437
5525
|
});
|
|
5438
5526
|
if (extraFieldUnicode.valid) {
|
|
5439
5527
|
directory[propertyName] = extraFieldUnicode[propertyName];
|
|
@@ -5449,7 +5537,7 @@ function readExtraFieldAES(extraFieldAES, directory, compressionMethod) {
|
|
|
5449
5537
|
vendorId: getUint8(extraFieldView, 2),
|
|
5450
5538
|
strength,
|
|
5451
5539
|
originalCompressionMethod: compressionMethod,
|
|
5452
|
-
compressionMethod: getUint16(extraFieldView, 5)
|
|
5540
|
+
compressionMethod: getUint16$1(extraFieldView, 5)
|
|
5453
5541
|
});
|
|
5454
5542
|
directory.compressionMethod = extraFieldAES.compressionMethod;
|
|
5455
5543
|
if (extraFieldAES.vendorVersion != VENDOR_VERSION_AE_1$1) {
|
|
@@ -5463,8 +5551,8 @@ function readExtraFieldNTFS(extraFieldNTFS, directory) {
|
|
|
5463
5551
|
let tag1Data;
|
|
5464
5552
|
try {
|
|
5465
5553
|
while (offsetExtraField < extraFieldNTFS.data.length && !tag1Data) {
|
|
5466
|
-
const tagValue = getUint16(extraFieldView, offsetExtraField);
|
|
5467
|
-
const attributeSize = getUint16(extraFieldView, offsetExtraField + 2);
|
|
5554
|
+
const tagValue = getUint16$1(extraFieldView, offsetExtraField);
|
|
5555
|
+
const attributeSize = getUint16$1(extraFieldView, offsetExtraField + 2);
|
|
5468
5556
|
if (tagValue == EXTRAFIELD_TYPE_NTFS_TAG1) {
|
|
5469
5557
|
tag1Data = extraFieldNTFS.data.slice(offsetExtraField + 4, offsetExtraField + 4 + attributeSize);
|
|
5470
5558
|
}
|
|
@@ -5497,12 +5585,12 @@ function readExtraFieldUnixDates(extraField, directory) {
|
|
|
5497
5585
|
return;
|
|
5498
5586
|
}
|
|
5499
5587
|
const extraFieldView = getDataView(extraField.data);
|
|
5500
|
-
const lastAccessDate = new Date((getUint32(extraFieldView, 0) | 0) * 1000);
|
|
5501
|
-
const lastModDate = new Date((getUint32(extraFieldView, 4) | 0) * 1000);
|
|
5588
|
+
const lastAccessDate = new Date((getUint32$1(extraFieldView, 0) | 0) * 1000);
|
|
5589
|
+
const lastModDate = new Date((getUint32$1(extraFieldView, 4) | 0) * 1000);
|
|
5502
5590
|
const extraFieldData = { lastAccessDate, lastModDate };
|
|
5503
5591
|
if (extraField.data.length >= 12) {
|
|
5504
|
-
extraFieldData.uid = getUint16(extraFieldView, 8);
|
|
5505
|
-
extraFieldData.gid = getUint16(extraFieldView, 10);
|
|
5592
|
+
extraFieldData.uid = getUint16$1(extraFieldView, 8);
|
|
5593
|
+
extraFieldData.gid = getUint16$1(extraFieldView, 10);
|
|
5506
5594
|
}
|
|
5507
5595
|
Object.assign(extraField, extraFieldData);
|
|
5508
5596
|
Object.assign(directory, extraFieldData);
|
|
@@ -5522,8 +5610,8 @@ function readExtraFieldUnix(extraField, directory, isInfoZip) {
|
|
|
5522
5610
|
gid = unpackUnixId(extraField.data.subarray(offset, offset + gidSize));
|
|
5523
5611
|
Object.assign(extraField, { version, uid, gid });
|
|
5524
5612
|
} else if (extraField.data.length >= 4) {
|
|
5525
|
-
uid = getUint16(view, 0);
|
|
5526
|
-
gid = getUint16(view, 2);
|
|
5613
|
+
uid = getUint16$1(view, 0);
|
|
5614
|
+
gid = getUint16$1(view, 2);
|
|
5527
5615
|
Object.assign(extraField, { uid, gid });
|
|
5528
5616
|
}
|
|
5529
5617
|
if (uid !== UNDEFINED_VALUE) {
|
|
@@ -5573,7 +5661,7 @@ function readExtraFieldExtendedTimestamp(extraFieldExtendedTimestamp, directory,
|
|
|
5573
5661
|
let offset = 1;
|
|
5574
5662
|
timeProperties.forEach((propertyName, indexProperty) => {
|
|
5575
5663
|
if (extraFieldExtendedTimestamp.data.length >= offset + 4) {
|
|
5576
|
-
const time = getUint32(extraFieldView, offset);
|
|
5664
|
+
const time = getUint32$1(extraFieldView, offset);
|
|
5577
5665
|
directory[propertyName] = extraFieldExtendedTimestamp[propertyName] = new Date((time | 0) * 1000);
|
|
5578
5666
|
const rawPropertyName = timeRawProperties[indexProperty];
|
|
5579
5667
|
extraFieldExtendedTimestamp[rawPropertyName] = time;
|
|
@@ -5607,7 +5695,7 @@ async function detectOverlappingEntry({
|
|
|
5607
5695
|
const dataDescriptorArray = await readUint8Array(reader, dataOffset + compressedSize, dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH);
|
|
5608
5696
|
const dataDescriptorView = getDataView(dataDescriptorArray);
|
|
5609
5697
|
let signature = dataDescriptorArray.length == dataDescriptorLength + DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH &&
|
|
5610
|
-
getUint32(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
5698
|
+
getUint32$1(dataDescriptorView, 0) == DATA_DESCRIPTOR_RECORD_SIGNATURE;
|
|
5611
5699
|
if (signature) {
|
|
5612
5700
|
const signedDataDescriptor = readDataDescriptor(dataDescriptorView, DATA_DESCRIPTOR_RECORD_SIGNATURE_LENGTH, extraFieldZip64);
|
|
5613
5701
|
const matchCrc32 = (fileEntry.encrypted && !fileEntry.zipCrypto) || signedDataDescriptor.crc32 == crc32;
|
|
@@ -5641,15 +5729,15 @@ async function detectOverlappingEntry({
|
|
|
5641
5729
|
}
|
|
5642
5730
|
|
|
5643
5731
|
function readDataDescriptor(dataDescriptorView, offset, extraFieldZip64) {
|
|
5644
|
-
const crc32 = getUint32(dataDescriptorView, offset);
|
|
5732
|
+
const crc32 = getUint32$1(dataDescriptorView, offset);
|
|
5645
5733
|
let compressedSize;
|
|
5646
5734
|
let uncompressedSize;
|
|
5647
5735
|
if (extraFieldZip64) {
|
|
5648
5736
|
compressedSize = getBigUint64(dataDescriptorView, offset + 4);
|
|
5649
5737
|
uncompressedSize = getBigUint64(dataDescriptorView, offset + 12);
|
|
5650
5738
|
} else {
|
|
5651
|
-
compressedSize = getUint32(dataDescriptorView, offset + 4);
|
|
5652
|
-
uncompressedSize = getUint32(dataDescriptorView, offset + 8);
|
|
5739
|
+
compressedSize = getUint32$1(dataDescriptorView, offset + 4);
|
|
5740
|
+
uncompressedSize = getUint32$1(dataDescriptorView, offset + 8);
|
|
5653
5741
|
}
|
|
5654
5742
|
return { crc32, compressedSize, uncompressedSize };
|
|
5655
5743
|
}
|
|
@@ -5658,10 +5746,28 @@ function getDiskOffset$1(reader, diskNumber) {
|
|
|
5658
5746
|
return reader.getDiskOffset ? reader.getDiskOffset(diskNumber) : 0;
|
|
5659
5747
|
}
|
|
5660
5748
|
|
|
5749
|
+
async function startsWithSplitZipSignature$1(reader) {
|
|
5750
|
+
return await getFirstSignature(reader) == SPLIT_ZIP_FILE_SIGNATURE;
|
|
5751
|
+
}
|
|
5752
|
+
|
|
5753
|
+
async function startsWithSplitZipMarker(reader) {
|
|
5754
|
+
const signature = await getFirstSignature(reader);
|
|
5755
|
+
return signature == SPLIT_ZIP_FILE_SIGNATURE || signature == TEMPORARY_SPLIT_ZIP_FILE_SIGNATURE;
|
|
5756
|
+
}
|
|
5757
|
+
|
|
5758
|
+
async function getFirstSignature(reader) {
|
|
5759
|
+
const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
5760
|
+
return getUint32$1(getDataView(signatureArray));
|
|
5761
|
+
}
|
|
5762
|
+
|
|
5661
5763
|
function isStrictnessValue(value) {
|
|
5662
5764
|
return value === STRICTNESS_STRICT || value === STRICTNESS_BALANCED || value === STRICTNESS_TOLERANT;
|
|
5663
5765
|
}
|
|
5664
5766
|
|
|
5767
|
+
function getDecodableOutputSize(outputSize, compressedSize, compressed) {
|
|
5768
|
+
return Math.min(outputSize, compressed ? compressedSize * MAX_DEFLATE_EXPANSION_RATIO : compressedSize);
|
|
5769
|
+
}
|
|
5770
|
+
|
|
5665
5771
|
function getStrictness(options, inheritedOptions) {
|
|
5666
5772
|
return resolveStrictness(options, resolveStrictness(inheritedOptions, STRICTNESS_BALANCED));
|
|
5667
5773
|
}
|
|
@@ -5724,7 +5830,7 @@ function isUnsafeFilename(filename, filenameValidation) {
|
|
|
5724
5830
|
|
|
5725
5831
|
function getMaxAppendedDataSize(maxAppendedDataSize, strictness) {
|
|
5726
5832
|
if (maxAppendedDataSize !== UNDEFINED_VALUE) {
|
|
5727
|
-
const size = toNumber
|
|
5833
|
+
const size = toNumber(maxAppendedDataSize);
|
|
5728
5834
|
if (typeof size != NUMBER_TYPE || Number.isNaN(size) || size < 0) {
|
|
5729
5835
|
throw new Error(ERR_INVALID_MAX_APPENDED_DATA_SIZE);
|
|
5730
5836
|
}
|
|
@@ -5747,7 +5853,7 @@ async function findEndOfCentralDirectory(reader, rejectAmbiguous, maxAppendedDat
|
|
|
5747
5853
|
let plausibleEndOfDirectoryInfo;
|
|
5748
5854
|
let endOfDirectoryReachingEndCount = 0;
|
|
5749
5855
|
for await (const [anchoredView, anchoredOffset, anchoredArray, indexByte, offset] of scanEndOfCentralDirectory(reader, anchoredLength)) {
|
|
5750
|
-
const commentLength = getUint16(anchoredView, indexByte + 20);
|
|
5856
|
+
const commentLength = getUint16$1(anchoredView, indexByte + 20);
|
|
5751
5857
|
if (offset + END_OF_CENTRAL_DIR_LENGTH + commentLength == size) {
|
|
5752
5858
|
const reachability = await getCentralDirectoryReachability(reader, anchoredView, anchoredOffset, indexByte, offset, size, remoteProbeBudget);
|
|
5753
5859
|
if (reachability == CENTRAL_DIRECTORY_REACHABLE) {
|
|
@@ -5798,7 +5904,7 @@ async function* scanEndOfCentralDirectory(reader, scanLength) {
|
|
|
5798
5904
|
const scanArray = await readUint8Array(reader, scanOffset, scanLength);
|
|
5799
5905
|
const scanView = getDataView(scanArray);
|
|
5800
5906
|
for (let indexByte = scanArray.length - END_OF_CENTRAL_DIR_LENGTH; indexByte >= 0; indexByte--) {
|
|
5801
|
-
if (getUint32(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
5907
|
+
if (getUint32$1(scanView, indexByte) == END_OF_CENTRAL_DIR_SIGNATURE) {
|
|
5802
5908
|
yield [scanView, scanOffset, scanArray, indexByte, scanOffset + indexByte];
|
|
5803
5909
|
}
|
|
5804
5910
|
}
|
|
@@ -5809,9 +5915,9 @@ function getEndOfCentralDirectoryInfo(scanArray, indexByte, offset) {
|
|
|
5809
5915
|
}
|
|
5810
5916
|
|
|
5811
5917
|
async function getCentralDirectoryReachability(reader, view, anchoredOffset, indexByte, offset, size, remoteProbeBudget) {
|
|
5812
|
-
const filesLength = getUint16(view, indexByte + 10);
|
|
5813
|
-
const directoryDataLength = getUint32(view, indexByte + 12);
|
|
5814
|
-
const directoryDataOffset = getUint32(view, indexByte + 16);
|
|
5918
|
+
const filesLength = getUint16$1(view, indexByte + 10);
|
|
5919
|
+
const directoryDataLength = getUint32$1(view, indexByte + 12);
|
|
5920
|
+
const directoryDataOffset = getUint32$1(view, indexByte + 16);
|
|
5815
5921
|
if (filesLength == MAX_16_BITS || directoryDataLength == MAX_32_BITS || directoryDataOffset == MAX_32_BITS) {
|
|
5816
5922
|
const locatorSignature = await readSignature(reader, view, anchoredOffset, offset - ZIP64_END_OF_CENTRAL_DIR_LOCATOR_LENGTH, size, remoteProbeBudget);
|
|
5817
5923
|
return locatorSignature == ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE ? CENTRAL_DIRECTORY_REACHABLE : CENTRAL_DIRECTORY_UNREACHABLE;
|
|
@@ -5819,7 +5925,7 @@ async function getCentralDirectoryReachability(reader, view, anchoredOffset, ind
|
|
|
5819
5925
|
if (!filesLength && !directoryDataLength) {
|
|
5820
5926
|
return CENTRAL_DIRECTORY_PLAUSIBLE;
|
|
5821
5927
|
}
|
|
5822
|
-
const directoryDiskNumber = getUint16(view, indexByte + 6);
|
|
5928
|
+
const directoryDiskNumber = getUint16$1(view, indexByte + 6);
|
|
5823
5929
|
for (const centralDirectoryOffset of [offset - directoryDataLength, getDiskOffset$1(reader, directoryDiskNumber) + directoryDataOffset]) {
|
|
5824
5930
|
if (await readSignature(reader, view, anchoredOffset, centralDirectoryOffset, size, remoteProbeBudget) == CENTRAL_FILE_HEADER_SIGNATURE) {
|
|
5825
5931
|
return CENTRAL_DIRECTORY_REACHABLE;
|
|
@@ -5833,12 +5939,12 @@ async function readSignature(reader, view, anchoredOffset, signatureOffset, size
|
|
|
5833
5939
|
return UNDEFINED_VALUE;
|
|
5834
5940
|
}
|
|
5835
5941
|
if (signatureOffset >= anchoredOffset) {
|
|
5836
|
-
return getUint32(view, signatureOffset - anchoredOffset);
|
|
5942
|
+
return getUint32$1(view, signatureOffset - anchoredOffset);
|
|
5837
5943
|
}
|
|
5838
5944
|
if (remoteProbeBudget.count > 0) {
|
|
5839
5945
|
remoteProbeBudget.count--;
|
|
5840
5946
|
const signatureArray = await readUint8Array(reader, signatureOffset, 4);
|
|
5841
|
-
return getUint32(getDataView(signatureArray), 0);
|
|
5947
|
+
return getUint32$1(getDataView(signatureArray), 0);
|
|
5842
5948
|
}
|
|
5843
5949
|
return UNDEFINED_VALUE;
|
|
5844
5950
|
}
|
|
@@ -5875,10 +5981,11 @@ function getOptionValue$1(zipReader, options, name) {
|
|
|
5875
5981
|
return options[name] === UNDEFINED_VALUE ? zipReader.options[name] : options[name];
|
|
5876
5982
|
}
|
|
5877
5983
|
|
|
5878
|
-
function
|
|
5879
|
-
return
|
|
5984
|
+
function getFunctionOptionValue$1(zipReader, options, name) {
|
|
5985
|
+
return checkFunctionOption(getOptionValue$1(zipReader, options, name));
|
|
5880
5986
|
}
|
|
5881
5987
|
|
|
5988
|
+
|
|
5882
5989
|
function getDate(timeRaw) {
|
|
5883
5990
|
const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
|
|
5884
5991
|
return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
|
|
@@ -5892,11 +5999,11 @@ function getUint8(view, offset) {
|
|
|
5892
5999
|
return view.getUint8(offset);
|
|
5893
6000
|
}
|
|
5894
6001
|
|
|
5895
|
-
function getUint16(view, offset) {
|
|
6002
|
+
function getUint16$1(view, offset) {
|
|
5896
6003
|
return view.getUint16(offset, true);
|
|
5897
6004
|
}
|
|
5898
6005
|
|
|
5899
|
-
function getUint32(view, offset) {
|
|
6006
|
+
function getUint32$1(view, offset) {
|
|
5900
6007
|
return view.getUint32(offset, true);
|
|
5901
6008
|
}
|
|
5902
6009
|
|
|
@@ -5911,6 +6018,7 @@ var zipReader = /*#__PURE__*/Object.freeze({
|
|
|
5911
6018
|
ERR_CENTRAL_DIRECTORY_NOT_FOUND: ERR_CENTRAL_DIRECTORY_NOT_FOUND,
|
|
5912
6019
|
ERR_ENCRYPTED: ERR_ENCRYPTED,
|
|
5913
6020
|
ERR_ENCRYPTED_CENTRAL_DIRECTORY: ERR_ENCRYPTED_CENTRAL_DIRECTORY,
|
|
6021
|
+
ERR_ENTRY_DATA_OUT_OF_BOUNDS: ERR_ENTRY_DATA_OUT_OF_BOUNDS,
|
|
5914
6022
|
ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
|
|
5915
6023
|
ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
|
|
5916
6024
|
ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
|
|
@@ -5967,12 +6075,16 @@ const ERR_DUPLICATED_NAME = "File already exists";
|
|
|
5967
6075
|
const ERR_INVALID_COMMENT = "Zip file comment exceeds 64KB";
|
|
5968
6076
|
const ERR_INVALID_COMMENT_TYPE = "Invalid zip file comment (must be a Uint8Array)";
|
|
5969
6077
|
const ERR_INVALID_ENTRY_COMMENT = "File entry comment exceeds 64KB";
|
|
6078
|
+
const ERR_INVALID_ENTRY_COMMENT_TYPE = "Invalid file entry comment (must be a string)";
|
|
6079
|
+
const ERR_INVALID_DATE = "Invalid date (must be a valid Date instance)";
|
|
5970
6080
|
const ERR_INVALID_ENTRY_NAME = "File entry name exceeds 64KB";
|
|
5971
6081
|
const ERR_INVALID_VERSION = "Version exceeds 65535";
|
|
5972
6082
|
const ERR_INVALID_ENCRYPTION_STRENGTH = "The strength must equal 1, 2, or 3";
|
|
5973
6083
|
const ERR_UNSUPPORTED_ENCRYPTION_USDZ = "Encryption is not supported in USDZ files";
|
|
5974
6084
|
const ERR_UNSUPPORTED_ENCRYPTION_PASS_THROUGH = "Encryption is not supported when the 'passThrough' option is set";
|
|
5975
|
-
const
|
|
6085
|
+
const ERR_INVALID_EXTRAFIELD = "Invalid extra field (must be a Map)";
|
|
6086
|
+
const ERR_INVALID_EXTRAFIELD_TYPE = "Invalid extra field type (must be integer 0..65535)";
|
|
6087
|
+
const ERR_INVALID_EXTRAFIELD_DATA_TYPE = "Invalid extra field data (must be a Uint8Array)";
|
|
5976
6088
|
const ERR_INVALID_EXTRAFIELD_DATA = "Extra field data exceeds 64KB";
|
|
5977
6089
|
const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
|
|
5978
6090
|
const MIN_UNIX_TIME = -2147483648;
|
|
@@ -5992,7 +6104,6 @@ const ERR_INVALID_UNIX_ID_SIZE = "uid/gid must be 0..65535 for unixExtraFieldTyp
|
|
|
5992
6104
|
const ERR_INVALID_MSDOS_ATTRIBUTES = "Invalid msdosAttributesRaw (must be integer 0..255)";
|
|
5993
6105
|
const ERR_INVALID_MSDOS_DATA = "Invalid msdosAttributes (must be an object with boolean flags)";
|
|
5994
6106
|
const ERR_INVALID_LEVEL = "Invalid level (must be integer 0..9)";
|
|
5995
|
-
const ERR_INVALID_PASSWORD_TYPE = "Invalid password (password must be a string, rawPassword must be a Uint8Array)";
|
|
5996
6107
|
const ERR_INVALID_SIGNATURE_DATA = "Signature data exceeds 64KB";
|
|
5997
6108
|
|
|
5998
6109
|
const EXTRAFIELD_DATA_AES = new Uint8Array([0x07, 0x00, 0x02, 0x00, 0x41, 0x45, 0x03, 0x00, 0x00]);
|
|
@@ -6017,8 +6128,7 @@ class ZipWriter {
|
|
|
6017
6128
|
writer,
|
|
6018
6129
|
addSplitZipSignature,
|
|
6019
6130
|
options,
|
|
6020
|
-
|
|
6021
|
-
files: new Map(),
|
|
6131
|
+
fileEntries: new Map(),
|
|
6022
6132
|
filenames: new Set(),
|
|
6023
6133
|
offset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? writer.size || writer.writable.size || 0 : options[OPTION_OFFSET],
|
|
6024
6134
|
initialOffset: options[OPTION_OFFSET] === UNDEFINED_VALUE ? 0 : options[OPTION_OFFSET] - (writer.size || writer.writable.size || 0),
|
|
@@ -6039,14 +6149,23 @@ class ZipWriter {
|
|
|
6039
6149
|
await initStream(reader);
|
|
6040
6150
|
}
|
|
6041
6151
|
const { ZipReader } = await Promise.resolve().then(function () { return zipReader; });
|
|
6042
|
-
const zipReader$1 = new ZipReader(reader
|
|
6152
|
+
const zipReader$1 = new ZipReader(reader);
|
|
6043
6153
|
const entries = await zipReader$1.getEntries();
|
|
6044
6154
|
await zipReader$1.close();
|
|
6045
6155
|
await initStream(this.writer);
|
|
6046
|
-
|
|
6047
|
-
|
|
6156
|
+
const { directoryOffset } = zipReader$1;
|
|
6157
|
+
let splitZipSignatureLength = 0;
|
|
6158
|
+
if (this.addSplitZipSignature) {
|
|
6159
|
+
delete this.addSplitZipSignature;
|
|
6160
|
+
if (!await startsWithSplitZipSignature(reader)) {
|
|
6161
|
+
await writeData(this.writer, getSplitZipSignatureArray());
|
|
6162
|
+
splitZipSignatureLength = SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6163
|
+
this.offset += splitZipSignatureLength;
|
|
6164
|
+
}
|
|
6165
|
+
}
|
|
6166
|
+
const entryPositions = await copyZipData(this, reader, entries, directoryOffset, splitZipSignatureLength);
|
|
6048
6167
|
this.filenames = new Set(entries.map(entry => entry.filename));
|
|
6049
|
-
this.
|
|
6168
|
+
this.fileEntries = new Map(entries.map(entry => {
|
|
6050
6169
|
const {
|
|
6051
6170
|
version,
|
|
6052
6171
|
rawLastModDate,
|
|
@@ -6101,11 +6220,12 @@ class ZipWriter {
|
|
|
6101
6220
|
if (crc32 !== UNDEFINED_VALUE) {
|
|
6102
6221
|
setUint32(headerView, HEADER_OFFSET_SIGNATURE, crc32);
|
|
6103
6222
|
}
|
|
6223
|
+
const { offset, diskNumberStart } = entryPositions.get(entry);
|
|
6104
6224
|
Object.assign(entry, {
|
|
6105
6225
|
zip64UncompressedSize,
|
|
6106
6226
|
zip64CompressedSize,
|
|
6107
|
-
|
|
6108
|
-
diskNumberStart
|
|
6227
|
+
offset,
|
|
6228
|
+
diskNumberStart,
|
|
6109
6229
|
zip64DiskNumberStart: false,
|
|
6110
6230
|
rawExtraFieldZip64,
|
|
6111
6231
|
rawExtraFieldAES,
|
|
@@ -6125,11 +6245,8 @@ class ZipWriter {
|
|
|
6125
6245
|
async add(name = "", reader, options = {}) {
|
|
6126
6246
|
const zipWriter = this;
|
|
6127
6247
|
options = Object.assign({}, options);
|
|
6128
|
-
const {
|
|
6129
|
-
|
|
6130
|
-
config
|
|
6131
|
-
} = zipWriter;
|
|
6132
|
-
if (workers < config.maxWorkers) {
|
|
6248
|
+
const { pendingAddFileCalls } = zipWriter;
|
|
6249
|
+
if (workers < getConfiguration().maxWorkers) {
|
|
6133
6250
|
workers++;
|
|
6134
6251
|
} else {
|
|
6135
6252
|
await new Promise(resolve => pendingEntries.push(resolve));
|
|
@@ -6166,16 +6283,16 @@ class ZipWriter {
|
|
|
6166
6283
|
}
|
|
6167
6284
|
|
|
6168
6285
|
remove(entry) {
|
|
6169
|
-
const { filenames,
|
|
6286
|
+
const { filenames, fileEntries } = this;
|
|
6170
6287
|
// deno-lint-ignore valid-typeof
|
|
6171
6288
|
if (typeof entry == STRING_TYPE) {
|
|
6172
|
-
entry =
|
|
6289
|
+
entry = fileEntries.get(entry);
|
|
6173
6290
|
}
|
|
6174
6291
|
if (entry && entry.filename !== UNDEFINED_VALUE) {
|
|
6175
6292
|
const { filename } = entry;
|
|
6176
|
-
if (filenames.has(filename) &&
|
|
6293
|
+
if (filenames.has(filename) && fileEntries.has(filename)) {
|
|
6177
6294
|
filenames.delete(filename);
|
|
6178
|
-
|
|
6295
|
+
fileEntries.delete(filename);
|
|
6179
6296
|
return true;
|
|
6180
6297
|
}
|
|
6181
6298
|
}
|
|
@@ -6272,12 +6389,12 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
6272
6389
|
const metadataInfo = resolveMetadata(zipWriter, name, options);
|
|
6273
6390
|
const { comment } = metadataInfo;
|
|
6274
6391
|
const extraField = options[PROPERTY_NAME_EXTRA_FIELD];
|
|
6275
|
-
zipWriter.
|
|
6392
|
+
zipWriter.fileEntries.set(name, UNDEFINED_VALUE);
|
|
6276
6393
|
let fileEntry;
|
|
6277
6394
|
try {
|
|
6278
6395
|
const { resolvedOptions } = metadataInfo;
|
|
6279
6396
|
if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
|
|
6280
|
-
!resolvedOptions.passThrough && !(await supportsDeflate(
|
|
6397
|
+
!resolvedOptions.passThrough && !(await supportsDeflate(getConfiguration()))) {
|
|
6281
6398
|
resolvedOptions.level = 0;
|
|
6282
6399
|
}
|
|
6283
6400
|
const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
|
|
@@ -6295,7 +6412,7 @@ async function addFile(zipWriter, name, reader, options) {
|
|
|
6295
6412
|
const metadataSize = getLength(headerInfo.localHeaderArray, dataDescriptorInfo.dataDescriptorArray);
|
|
6296
6413
|
fileEntry = await getFileEntry(zipWriter, name, reader, { headerInfo, dataDescriptorInfo, metadataSize }, options);
|
|
6297
6414
|
} catch (error) {
|
|
6298
|
-
zipWriter.
|
|
6415
|
+
zipWriter.fileEntries.delete(name);
|
|
6299
6416
|
throw error;
|
|
6300
6417
|
}
|
|
6301
6418
|
Object.assign(fileEntry, {
|
|
@@ -6339,9 +6456,9 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6339
6456
|
if (unixExtraFieldType === UNDEFINED_VALUE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
6340
6457
|
unixExtraFieldType = INFOZIP_EXTRA_FIELD_TYPE$1;
|
|
6341
6458
|
}
|
|
6342
|
-
let msdosAttributesRaw =
|
|
6459
|
+
let msdosAttributesRaw = getNumberOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES_RAW);
|
|
6343
6460
|
let msdosAttributes = getOptionValue(zipWriter, options, PROPERTY_NAME_MSDOS_ATTRIBUTES);
|
|
6344
|
-
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType;
|
|
6461
|
+
const hasUnixMetadata = uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE || unixMode !== UNDEFINED_VALUE || unixExtraFieldType || executable;
|
|
6345
6462
|
const hasMsDosProvided = msdosAttributesRaw !== UNDEFINED_VALUE || msdosAttributes !== UNDEFINED_VALUE;
|
|
6346
6463
|
if (hasUnixMetadata) {
|
|
6347
6464
|
msDosCompatible = false;
|
|
@@ -6350,10 +6467,10 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6350
6467
|
msDosCompatible = true;
|
|
6351
6468
|
versionMadeBy = (versionMadeBy & MAX_8_BITS);
|
|
6352
6469
|
}
|
|
6353
|
-
if (msdosAttributesRaw !== UNDEFINED_VALUE && (msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
|
|
6470
|
+
if (msdosAttributesRaw !== UNDEFINED_VALUE && (!Number.isInteger(msdosAttributesRaw) || msdosAttributesRaw < 0 || msdosAttributesRaw > MAX_8_BITS)) {
|
|
6354
6471
|
throw new Error(ERR_INVALID_MSDOS_ATTRIBUTES);
|
|
6355
6472
|
}
|
|
6356
|
-
if (msdosAttributes && typeof msdosAttributes !== OBJECT_TYPE) {
|
|
6473
|
+
if (msdosAttributes && (typeof msdosAttributes !== OBJECT_TYPE || Array.isArray(msdosAttributes))) {
|
|
6357
6474
|
throw new Error(ERR_INVALID_MSDOS_DATA);
|
|
6358
6475
|
}
|
|
6359
6476
|
if (versionMadeBy > MAX_16_BITS) {
|
|
@@ -6441,7 +6558,7 @@ function resolveAttributes(zipWriter, name, options) {
|
|
|
6441
6558
|
}
|
|
6442
6559
|
|
|
6443
6560
|
function resolveMetadata(zipWriter, name, options) {
|
|
6444
|
-
const encode =
|
|
6561
|
+
const encode = getFunctionOptionValue(zipWriter, options, OPTION_ENCODE_TEXT) || encodeText;
|
|
6445
6562
|
let rawFilename = encode(name, TEXT_TYPE_FILENAME);
|
|
6446
6563
|
if (rawFilename === UNDEFINED_VALUE) {
|
|
6447
6564
|
rawFilename = encodeText(name);
|
|
@@ -6450,6 +6567,10 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6450
6567
|
throw new Error(ERR_INVALID_ENTRY_NAME);
|
|
6451
6568
|
}
|
|
6452
6569
|
const comment = options[PROPERTY_NAME_COMMENT] || "";
|
|
6570
|
+
// deno-lint-ignore valid-typeof
|
|
6571
|
+
if (typeof comment != STRING_TYPE) {
|
|
6572
|
+
throw new Error(ERR_INVALID_ENTRY_COMMENT_TYPE);
|
|
6573
|
+
}
|
|
6453
6574
|
let rawComment = encode(comment, TEXT_TYPE_COMMENT);
|
|
6454
6575
|
if (rawComment === UNDEFINED_VALUE) {
|
|
6455
6576
|
rawComment = encodeText(comment);
|
|
@@ -6461,16 +6582,14 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6461
6582
|
if (version > MAX_16_BITS) {
|
|
6462
6583
|
throw new Error(ERR_INVALID_VERSION);
|
|
6463
6584
|
}
|
|
6464
|
-
const lastModDate =
|
|
6465
|
-
const lastAccessDate =
|
|
6466
|
-
const creationDate =
|
|
6585
|
+
const lastModDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_MODIFICATION_DATE, new Date());
|
|
6586
|
+
const lastAccessDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_LAST_ACCESS_DATE);
|
|
6587
|
+
const creationDate = getDateOptionValue(zipWriter, options, PROPERTY_NAME_CREATION_DATE);
|
|
6467
6588
|
const internalFileAttributes = getAliasedOptionValue(zipWriter, options, PROPERTY_NAME_INTERNAL_FILE_ATTRIBUTES, PROPERTY_NAME_DEPRECATED_INTERNAL_FILE_ATTRIBUTES, 0);
|
|
6468
6589
|
const passThrough = getOptionValue(zipWriter, options, OPTION_PASS_THROUGH);
|
|
6469
6590
|
const password = getOptionValue(zipWriter, options, OPTION_PASSWORD);
|
|
6470
6591
|
const rawPassword = getOptionValue(zipWriter, options, OPTION_RAW_PASSWORD);
|
|
6471
|
-
|
|
6472
|
-
throw new Error(ERR_INVALID_PASSWORD_TYPE);
|
|
6473
|
-
}
|
|
6592
|
+
checkPasswordOption(password, rawPassword);
|
|
6474
6593
|
const encryptionStrength = getNumberOptionValue(zipWriter, options, OPTION_ENCRYPTION_STRENGTH, 3);
|
|
6475
6594
|
const zipCrypto = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIPCRYPTO);
|
|
6476
6595
|
const extendedTimestamp = getOptionValue(zipWriter, options, OPTION_EXTENDED_TIMESTAMP, true);
|
|
@@ -6479,9 +6598,9 @@ function resolveMetadata(zipWriter, name, options) {
|
|
|
6479
6598
|
const useWebWorkers = getOptionValue(zipWriter, options, OPTION_USE_WEB_WORKERS);
|
|
6480
6599
|
const transferStreams = getOptionValue(zipWriter, options, OPTION_TRANSFER_STREAMS);
|
|
6481
6600
|
const bufferedWrite = getOptionValue(zipWriter, options, OPTION_BUFFERED_WRITE);
|
|
6482
|
-
const createTempStream =
|
|
6601
|
+
const createTempStream = getFunctionOptionValue(zipWriter, options, OPTION_CREATE_TEMP_STREAM);
|
|
6483
6602
|
const dataDescriptorSignature = getOptionValue(zipWriter, options, OPTION_DATA_DESCRIPTOR_SIGNATURE, true);
|
|
6484
|
-
const signal = getOptionValue(zipWriter, options, OPTION_SIGNAL);
|
|
6603
|
+
const signal = checkSignalOption(getOptionValue(zipWriter, options, OPTION_SIGNAL));
|
|
6485
6604
|
const useUnicodeFileNames = getOptionValue(zipWriter, options, OPTION_USE_UNICODE_FILE_NAMES, true);
|
|
6486
6605
|
const compressionMethod = getOptionValue(zipWriter, options, PROPERTY_NAME_COMPRESSION_METHOD);
|
|
6487
6606
|
const registeredCodec = passThrough || compressionMethod === UNDEFINED_VALUE ? UNDEFINED_VALUE : getRegisteredCodec(compressionMethod);
|
|
@@ -6561,18 +6680,26 @@ function serializeExtraField(extraField) {
|
|
|
6561
6680
|
if (!extraField) {
|
|
6562
6681
|
return EMPTY_UINT8_ARRAY;
|
|
6563
6682
|
}
|
|
6683
|
+
if (!(extraField instanceof Map)) {
|
|
6684
|
+
throw new Error(ERR_INVALID_EXTRAFIELD);
|
|
6685
|
+
}
|
|
6564
6686
|
let extraFieldSize = 0;
|
|
6565
6687
|
let offset = 0;
|
|
6566
|
-
extraField.forEach(data => extraFieldSize += 4 + getLength(data));
|
|
6567
|
-
const rawExtraField = new Uint8Array(extraFieldSize);
|
|
6568
|
-
const rawExtraFieldView = getDataView(rawExtraField);
|
|
6569
6688
|
extraField.forEach((data, type) => {
|
|
6570
|
-
if (type > MAX_16_BITS) {
|
|
6689
|
+
if (!Number.isInteger(type) || type < 0 || type > MAX_16_BITS) {
|
|
6571
6690
|
throw new Error(ERR_INVALID_EXTRAFIELD_TYPE);
|
|
6572
6691
|
}
|
|
6692
|
+
if (!(data instanceof Uint8Array)) {
|
|
6693
|
+
throw new Error(ERR_INVALID_EXTRAFIELD_DATA_TYPE);
|
|
6694
|
+
}
|
|
6573
6695
|
if (getLength(data) > MAX_16_BITS) {
|
|
6574
6696
|
throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
|
|
6575
6697
|
}
|
|
6698
|
+
extraFieldSize += 4 + getLength(data);
|
|
6699
|
+
});
|
|
6700
|
+
const rawExtraField = new Uint8Array(extraFieldSize);
|
|
6701
|
+
const rawExtraFieldView = getDataView(rawExtraField);
|
|
6702
|
+
extraField.forEach((data, type) => {
|
|
6576
6703
|
setUint16(rawExtraFieldView, offset, type);
|
|
6577
6704
|
setUint16(rawExtraFieldView, offset + 2, getLength(data));
|
|
6578
6705
|
arraySet(rawExtraField, data, offset + 4);
|
|
@@ -6659,8 +6786,8 @@ function resolveEntrySizes(zipWriter, hasContent, contentSize, metadata, options
|
|
|
6659
6786
|
}
|
|
6660
6787
|
|
|
6661
6788
|
async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comment) {
|
|
6662
|
-
const zipWriter = { options: writerOptions
|
|
6663
|
-
if (writerOptions[OPTION_SIGN_CENTRAL_DIRECTORY]) {
|
|
6789
|
+
const zipWriter = { options: writerOptions };
|
|
6790
|
+
if (checkFunctionOption(writerOptions[OPTION_SIGN_CENTRAL_DIRECTORY])) {
|
|
6664
6791
|
throw new Error(ERR_UNDETERMINED_SIZE);
|
|
6665
6792
|
}
|
|
6666
6793
|
if (comment !== UNDEFINED_VALUE && !(comment instanceof Uint8Array)) {
|
|
@@ -6686,7 +6813,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
6686
6813
|
({ name } = attributesInfo);
|
|
6687
6814
|
const { resolvedOptions: metadata } = resolveMetadata(zipWriter, name, options);
|
|
6688
6815
|
if (metadata.level != 0 && metadata.compressionMethod === UNDEFINED_VALUE &&
|
|
6689
|
-
!metadata.passThrough && !(await supportsDeflate(
|
|
6816
|
+
!metadata.passThrough && !(await supportsDeflate(getConfiguration()))) {
|
|
6690
6817
|
metadata.level = 0;
|
|
6691
6818
|
}
|
|
6692
6819
|
const hasContent = !getOptionValue(zipWriter, options, PROPERTY_NAME_DIRECTORY);
|
|
@@ -6735,7 +6862,7 @@ async function getEntriesSize(writerOptions, entries, writeOrderGuaranteed, comm
|
|
|
6735
6862
|
|
|
6736
6863
|
async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
6737
6864
|
const {
|
|
6738
|
-
|
|
6865
|
+
fileEntries,
|
|
6739
6866
|
writer
|
|
6740
6867
|
} = zipWriter;
|
|
6741
6868
|
const {
|
|
@@ -6757,12 +6884,12 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6757
6884
|
let writerSizeBeforeEntry;
|
|
6758
6885
|
let flushedBufferedSize = 0;
|
|
6759
6886
|
let fileWriter;
|
|
6760
|
-
|
|
6887
|
+
fileEntries.set(name, fileEntry);
|
|
6761
6888
|
zipWriter.lastFileEntry = fileEntry;
|
|
6762
6889
|
try {
|
|
6763
6890
|
let lockPreviousFileEntry;
|
|
6764
6891
|
if (keepOrder) {
|
|
6765
|
-
lockPreviousFileEntry = previousFileEntry && previousFileEntry.
|
|
6892
|
+
lockPreviousFileEntry = previousFileEntry && previousFileEntry.lockFileEntry;
|
|
6766
6893
|
requestLockCurrentFileEntry();
|
|
6767
6894
|
}
|
|
6768
6895
|
if (options.bufferedWrite || !keepOrder || zipWriter.writerLocked || zipWriter.bufferedWrites || !dataDescriptor) {
|
|
@@ -6783,11 +6910,8 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6783
6910
|
const diskOffset = getDiskOffset(writer);
|
|
6784
6911
|
if (zipWriter.addSplitZipSignature) {
|
|
6785
6912
|
delete zipWriter.addSplitZipSignature;
|
|
6786
|
-
|
|
6787
|
-
|
|
6788
|
-
setUint32(signatureArrayView, 0, SPLIT_ZIP_FILE_SIGNATURE);
|
|
6789
|
-
await writeData(writer, signatureArray);
|
|
6790
|
-
zipWriter.offset += 4;
|
|
6913
|
+
await writeData(writer, getSplitZipSignatureArray());
|
|
6914
|
+
zipWriter.offset += SPLIT_ZIP_FILE_SIGNATURE_LENGTH;
|
|
6791
6915
|
}
|
|
6792
6916
|
if (usdz && !bufferedWrite) {
|
|
6793
6917
|
appendExtraFieldUSDZ(entryInfo, zipWriter.offset - diskOffset);
|
|
@@ -6805,11 +6929,11 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6805
6929
|
writerSizeBeforeEntry = writer.size;
|
|
6806
6930
|
await writeData(fileWriter, localHeaderArray);
|
|
6807
6931
|
}
|
|
6808
|
-
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo,
|
|
6932
|
+
fileEntry = await createFileEntry(reader, fileWriter, fileEntry, entryInfo, getConfiguration(), options);
|
|
6809
6933
|
if (!bufferedWrite) {
|
|
6810
6934
|
writingEntryData = false;
|
|
6811
6935
|
}
|
|
6812
|
-
|
|
6936
|
+
fileEntries.set(name, fileEntry);
|
|
6813
6937
|
fileEntry.filename = name;
|
|
6814
6938
|
if (bufferedWrite) {
|
|
6815
6939
|
await Promise.all([fileWriter.writable.getWriter().close(), lockPreviousFileEntry]);
|
|
@@ -6850,7 +6974,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6850
6974
|
zipWriter.offset += flushedBufferedSize;
|
|
6851
6975
|
}
|
|
6852
6976
|
}
|
|
6853
|
-
|
|
6977
|
+
fileEntries.delete(name);
|
|
6854
6978
|
throw error;
|
|
6855
6979
|
} finally {
|
|
6856
6980
|
if (bufferedWrite) {
|
|
@@ -6872,7 +6996,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6872
6996
|
}
|
|
6873
6997
|
|
|
6874
6998
|
function requestLockCurrentFileEntry() {
|
|
6875
|
-
fileEntry.
|
|
6999
|
+
fileEntry.lockFileEntry = new Promise(resolve => releaseLockCurrentFileEntry = resolve);
|
|
6876
7000
|
}
|
|
6877
7001
|
|
|
6878
7002
|
async function requestLockWriter() {
|
|
@@ -6892,7 +7016,7 @@ async function getFileEntry(zipWriter, name, reader, entryInfo, options) {
|
|
|
6892
7016
|
}
|
|
6893
7017
|
}
|
|
6894
7018
|
|
|
6895
|
-
async function createFileEntry(reader, writer, { diskNumberStart,
|
|
7019
|
+
async function createFileEntry(reader, writer, { diskNumberStart, lockFileEntry }, entryInfo, config, options) {
|
|
6896
7020
|
const {
|
|
6897
7021
|
headerInfo,
|
|
6898
7022
|
dataDescriptorInfo,
|
|
@@ -6960,7 +7084,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
|
|
|
6960
7084
|
codecURI
|
|
6961
7085
|
} = options;
|
|
6962
7086
|
const fileEntry = {
|
|
6963
|
-
|
|
7087
|
+
lockFileEntry,
|
|
6964
7088
|
versionMadeBy,
|
|
6965
7089
|
zip64,
|
|
6966
7090
|
directory: Boolean(directory),
|
|
@@ -7002,7 +7126,7 @@ async function createFileEntry(reader, writer, { diskNumberStart, lock }, entryI
|
|
|
7002
7126
|
}
|
|
7003
7127
|
const { writable } = writer;
|
|
7004
7128
|
if (reader) {
|
|
7005
|
-
const readable = toCompatibleReadable(
|
|
7129
|
+
const readable = toCompatibleReadable(createReadable(reader));
|
|
7006
7130
|
const size = reader.size;
|
|
7007
7131
|
const workerOptions = {
|
|
7008
7132
|
options: {
|
|
@@ -7114,14 +7238,14 @@ function getHeaderInfo(options) {
|
|
|
7114
7238
|
if (zip64 && (zip64UncompressedSize || zip64CompressedSize)) {
|
|
7115
7239
|
const length = 4 + 16;
|
|
7116
7240
|
const extraFieldZip64 = createRecordWriter(length);
|
|
7117
|
-
extraFieldZip64.
|
|
7118
|
-
extraFieldZip64.
|
|
7241
|
+
extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
|
|
7242
|
+
extraFieldZip64.writeUint16(length - 4);
|
|
7119
7243
|
rawLocalExtraFieldZip64 = extraFieldZip64.array;
|
|
7120
7244
|
if (zip64ExtraFieldComplete) {
|
|
7121
|
-
extraFieldZip64.
|
|
7245
|
+
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7122
7246
|
if (uncompressedFile) {
|
|
7123
7247
|
const encryptionOverhead = encrypted ? (zipCrypto ? 12 : 16 + encryptionStrength * 4) : 0;
|
|
7124
|
-
extraFieldZip64.
|
|
7248
|
+
extraFieldZip64.writeUint64(passThrough ? 0 : uncompressedSize + encryptionOverhead);
|
|
7125
7249
|
}
|
|
7126
7250
|
}
|
|
7127
7251
|
} else {
|
|
@@ -7130,8 +7254,8 @@ function getHeaderInfo(options) {
|
|
|
7130
7254
|
let rawExtraFieldAES;
|
|
7131
7255
|
if (encrypted && !zipCrypto) {
|
|
7132
7256
|
const extraFieldAES = createRecordWriter(getLength(EXTRAFIELD_DATA_AES) + 2);
|
|
7133
|
-
extraFieldAES.
|
|
7134
|
-
extraFieldAES.
|
|
7257
|
+
extraFieldAES.writeUint16(EXTRAFIELD_TYPE_AES);
|
|
7258
|
+
extraFieldAES.writeBytes(EXTRAFIELD_DATA_AES);
|
|
7135
7259
|
rawExtraFieldAES = extraFieldAES.array;
|
|
7136
7260
|
rawExtraFieldAES[8] = encryptionStrength;
|
|
7137
7261
|
} else {
|
|
@@ -7147,15 +7271,15 @@ function getHeaderInfo(options) {
|
|
|
7147
7271
|
const extraFieldTimestampLength = 9 + (lastAccessDate ? 4 : 0) + (creationDate ? 4 : 0);
|
|
7148
7272
|
const extraFieldTimestamp = createRecordWriter(extraFieldTimestampLength);
|
|
7149
7273
|
extraFieldExtendedTimestampFlag = 0x1 + (lastAccessDate ? 0x2 : 0) + (creationDate ? 0x4 : 0);
|
|
7150
|
-
extraFieldTimestamp.
|
|
7151
|
-
extraFieldTimestamp.
|
|
7152
|
-
extraFieldTimestamp.
|
|
7153
|
-
extraFieldTimestamp.
|
|
7274
|
+
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7275
|
+
extraFieldTimestamp.writeUint16(extraFieldTimestampLength - 4);
|
|
7276
|
+
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7277
|
+
extraFieldTimestamp.writeUint32(lastModTimeUnix);
|
|
7154
7278
|
if (lastAccessDate) {
|
|
7155
|
-
extraFieldTimestamp.
|
|
7279
|
+
extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(lastAccessDate)));
|
|
7156
7280
|
}
|
|
7157
7281
|
if (creationDate) {
|
|
7158
|
-
extraFieldTimestamp.
|
|
7282
|
+
extraFieldTimestamp.writeUint32(clampUnixTime(getTimeUnix(creationDate)));
|
|
7159
7283
|
}
|
|
7160
7284
|
rawExtraFieldExtendedTimestamp = extraFieldTimestamp.array;
|
|
7161
7285
|
} else {
|
|
@@ -7168,14 +7292,14 @@ function getHeaderInfo(options) {
|
|
|
7168
7292
|
try {
|
|
7169
7293
|
const lastModTimeNTFS = getTimeNTFS(lastModDate);
|
|
7170
7294
|
const extraFieldNTFS = createRecordWriter(36);
|
|
7171
|
-
extraFieldNTFS.
|
|
7172
|
-
extraFieldNTFS.
|
|
7295
|
+
extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS);
|
|
7296
|
+
extraFieldNTFS.writeUint16(32);
|
|
7173
7297
|
extraFieldNTFS.skip(4);
|
|
7174
|
-
extraFieldNTFS.
|
|
7175
|
-
extraFieldNTFS.
|
|
7176
|
-
extraFieldNTFS.
|
|
7177
|
-
extraFieldNTFS.
|
|
7178
|
-
extraFieldNTFS.
|
|
7298
|
+
extraFieldNTFS.writeUint16(EXTRAFIELD_TYPE_NTFS_TAG1);
|
|
7299
|
+
extraFieldNTFS.writeUint16(24);
|
|
7300
|
+
extraFieldNTFS.writeUint64(lastModTimeNTFS);
|
|
7301
|
+
extraFieldNTFS.writeUint64(lastAccessDate ? getTimeNTFS(lastAccessDate) : lastModTimeNTFS);
|
|
7302
|
+
extraFieldNTFS.writeUint64(creationDate ? getTimeNTFS(creationDate) : lastModTimeNTFS);
|
|
7179
7303
|
rawExtraFieldNTFS = extraFieldNTFS.array;
|
|
7180
7304
|
} catch {
|
|
7181
7305
|
rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
|
|
@@ -7194,20 +7318,20 @@ function getHeaderInfo(options) {
|
|
|
7194
7318
|
const gidBytes = packUnixId(gid);
|
|
7195
7319
|
const payloadLength = 3 + uidBytes.length + gidBytes.length;
|
|
7196
7320
|
const extraFieldUnix = createRecordWriter(4 + payloadLength);
|
|
7197
|
-
extraFieldUnix.
|
|
7198
|
-
extraFieldUnix.
|
|
7199
|
-
extraFieldUnix.
|
|
7200
|
-
extraFieldUnix.
|
|
7201
|
-
extraFieldUnix.
|
|
7202
|
-
extraFieldUnix.
|
|
7203
|
-
extraFieldUnix.
|
|
7321
|
+
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_INFOZIP);
|
|
7322
|
+
extraFieldUnix.writeUint16(payloadLength);
|
|
7323
|
+
extraFieldUnix.writeUint8(1);
|
|
7324
|
+
extraFieldUnix.writeUint8(uidBytes.length);
|
|
7325
|
+
extraFieldUnix.writeBytes(uidBytes);
|
|
7326
|
+
extraFieldUnix.writeUint8(gidBytes.length);
|
|
7327
|
+
extraFieldUnix.writeBytes(gidBytes);
|
|
7204
7328
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
7205
7329
|
} else if (unixExtraFieldType == UNIX_EXTRA_FIELD_TYPE && (uid !== UNDEFINED_VALUE || gid !== UNDEFINED_VALUE)) {
|
|
7206
7330
|
const extraFieldUnix = createRecordWriter(8);
|
|
7207
|
-
extraFieldUnix.
|
|
7208
|
-
extraFieldUnix.
|
|
7209
|
-
extraFieldUnix.
|
|
7210
|
-
extraFieldUnix.
|
|
7331
|
+
extraFieldUnix.writeUint16(EXTRAFIELD_TYPE_UNIX);
|
|
7332
|
+
extraFieldUnix.writeUint16(4);
|
|
7333
|
+
extraFieldUnix.writeUint16((uid === UNDEFINED_VALUE ? 0 : uid) & MAX_16_BITS);
|
|
7334
|
+
extraFieldUnix.writeUint16((gid === UNDEFINED_VALUE ? 0 : gid) & MAX_16_BITS);
|
|
7211
7335
|
rawExtraFieldUnix = extraFieldUnix.array;
|
|
7212
7336
|
} else {
|
|
7213
7337
|
rawExtraFieldUnix = EMPTY_UINT8_ARRAY;
|
|
@@ -7257,18 +7381,18 @@ function getHeaderInfo(options) {
|
|
|
7257
7381
|
const localHeader = createRecordWriter(HEADER_SIZE + getLength(rawFilename) + extraFieldLength);
|
|
7258
7382
|
const localHeaderArray = localHeader.array;
|
|
7259
7383
|
const localHeaderView = getDataView(localHeaderArray);
|
|
7260
|
-
localHeader.
|
|
7261
|
-
localHeader.
|
|
7262
|
-
localHeader.
|
|
7384
|
+
localHeader.writeUint32(LOCAL_FILE_HEADER_SIGNATURE);
|
|
7385
|
+
localHeader.writeBytes(headerArray);
|
|
7386
|
+
localHeader.writeBytes(rawFilename);
|
|
7263
7387
|
if (writeLocalExtraFieldZip64) {
|
|
7264
|
-
localHeader.
|
|
7265
|
-
}
|
|
7266
|
-
localHeader.
|
|
7267
|
-
localHeader.
|
|
7268
|
-
localHeader.
|
|
7269
|
-
localHeader.
|
|
7270
|
-
localHeader.
|
|
7271
|
-
localHeader.
|
|
7388
|
+
localHeader.writeBytes(rawLocalExtraFieldZip64);
|
|
7389
|
+
}
|
|
7390
|
+
localHeader.writeBytes(rawExtraFieldAES);
|
|
7391
|
+
localHeader.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
7392
|
+
localHeader.writeBytes(rawExtraFieldNTFS);
|
|
7393
|
+
localHeader.writeBytes(rawExtraFieldUnix);
|
|
7394
|
+
localHeader.writeBytes(rawExtraField);
|
|
7395
|
+
localHeader.writeBytes(rawLocalExtraField);
|
|
7272
7396
|
if (dataDescriptor) {
|
|
7273
7397
|
if (!zip64CompressedSize) {
|
|
7274
7398
|
setUint32(localHeaderView, HEADER_OFFSET_COMPRESSED_SIZE + LOCAL_HEADER_COMMON_OFFSET, 0);
|
|
@@ -7458,7 +7582,7 @@ function updateLocalHeader({
|
|
|
7458
7582
|
|
|
7459
7583
|
|
|
7460
7584
|
async function closeFile(zipWriter, comment, options) {
|
|
7461
|
-
const directoryDataLength = createDirectoryRecords(zipWriter.
|
|
7585
|
+
const directoryDataLength = createDirectoryRecords(zipWriter.fileEntries);
|
|
7462
7586
|
const { directoryStart, directoryArray } = await writeDirectoryRecords(zipWriter, directoryDataLength, options);
|
|
7463
7587
|
const signatureLength = await writeDigitalSignatureRecord(zipWriter, directoryArray, options);
|
|
7464
7588
|
await writeEndOfDirectoryRecord(zipWriter, comment, options, { directoryStart, directoryDataLength, signatureLength });
|
|
@@ -7488,19 +7612,19 @@ function createDirectoryRecords(files) {
|
|
|
7488
7612
|
if (zip64Offset || zip64DiskNumberStart || zip64UncompressedSize || zip64CompressedSize) {
|
|
7489
7613
|
const length = 4 + (zip64UncompressedSize ? 8 : 0) + (zip64CompressedSize ? 8 : 0) + (zip64Offset ? 8 : 0) + (zip64DiskNumberStart ? 4 : 0);
|
|
7490
7614
|
const extraFieldZip64 = createRecordWriter(length);
|
|
7491
|
-
extraFieldZip64.
|
|
7492
|
-
extraFieldZip64.
|
|
7615
|
+
extraFieldZip64.writeUint16(EXTRAFIELD_TYPE_ZIP64);
|
|
7616
|
+
extraFieldZip64.writeUint16(length - 4);
|
|
7493
7617
|
if (zip64UncompressedSize) {
|
|
7494
|
-
extraFieldZip64.
|
|
7618
|
+
extraFieldZip64.writeUint64(uncompressedSize);
|
|
7495
7619
|
}
|
|
7496
7620
|
if (zip64CompressedSize) {
|
|
7497
|
-
extraFieldZip64.
|
|
7621
|
+
extraFieldZip64.writeUint64(compressedSize);
|
|
7498
7622
|
}
|
|
7499
7623
|
if (zip64Offset) {
|
|
7500
|
-
extraFieldZip64.
|
|
7624
|
+
extraFieldZip64.writeUint64(fileEntry.offset);
|
|
7501
7625
|
}
|
|
7502
7626
|
if (zip64DiskNumberStart) {
|
|
7503
|
-
extraFieldZip64.
|
|
7627
|
+
extraFieldZip64.writeUint32(fileEntry.diskNumberStart);
|
|
7504
7628
|
}
|
|
7505
7629
|
rawExtraFieldZip64 = extraFieldZip64.array;
|
|
7506
7630
|
} else {
|
|
@@ -7513,10 +7637,10 @@ function createDirectoryRecords(files) {
|
|
|
7513
7637
|
const lastModTimeUnix = getTimeUnix(lastModDate);
|
|
7514
7638
|
if (extendedTimestamp && inUnixTimeRange(lastModTimeUnix)) {
|
|
7515
7639
|
const extraFieldTimestamp = createRecordWriter(9);
|
|
7516
|
-
extraFieldTimestamp.
|
|
7517
|
-
extraFieldTimestamp.
|
|
7518
|
-
extraFieldTimestamp.
|
|
7519
|
-
extraFieldTimestamp.
|
|
7640
|
+
extraFieldTimestamp.writeUint16(EXTRAFIELD_TYPE_EXTENDED_TIMESTAMP);
|
|
7641
|
+
extraFieldTimestamp.writeUint16(5);
|
|
7642
|
+
extraFieldTimestamp.writeUint8(extraFieldExtendedTimestampFlag);
|
|
7643
|
+
extraFieldTimestamp.writeUint32(lastModTimeUnix);
|
|
7520
7644
|
rawExtraFieldTimestamp = extraFieldTimestamp.array;
|
|
7521
7645
|
} else {
|
|
7522
7646
|
rawExtraFieldTimestamp = EMPTY_UINT8_ARRAY;
|
|
@@ -7538,14 +7662,14 @@ function createDirectoryRecords(files) {
|
|
|
7538
7662
|
}
|
|
7539
7663
|
|
|
7540
7664
|
async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
7541
|
-
const {
|
|
7665
|
+
const { fileEntries, writer } = zipWriter;
|
|
7542
7666
|
const directoryArray = new Uint8Array(directoryDataLength);
|
|
7543
7667
|
await initStream(writer);
|
|
7544
7668
|
let offset = 0;
|
|
7545
7669
|
let directoryDiskOffset = 0;
|
|
7546
7670
|
let directoryStartDiskNumber = getDiskNumber(writer);
|
|
7547
7671
|
let directoryStartDiskOffset = getDiskOffset(writer);
|
|
7548
|
-
for (const [indexFileEntry, fileEntry] of Array.from(
|
|
7672
|
+
for (const [indexFileEntry, fileEntry] of Array.from(fileEntries.values()).entries()) {
|
|
7549
7673
|
const {
|
|
7550
7674
|
offset: fileEntryOffset,
|
|
7551
7675
|
rawFilename,
|
|
@@ -7590,28 +7714,28 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
|
7590
7714
|
setUint16(headerView, HEADER_OFFSET_VERSION, VERSION_ZIP64);
|
|
7591
7715
|
}
|
|
7592
7716
|
const directoryRecord = createRecordWriter(directoryRecordLength);
|
|
7593
|
-
directoryRecord.
|
|
7594
|
-
directoryRecord.
|
|
7595
|
-
directoryRecord.
|
|
7596
|
-
directoryRecord.
|
|
7597
|
-
directoryRecord.
|
|
7598
|
-
directoryRecord.
|
|
7599
|
-
directoryRecord.
|
|
7600
|
-
directoryRecord.
|
|
7601
|
-
directoryRecord.
|
|
7602
|
-
directoryRecord.
|
|
7603
|
-
directoryRecord.
|
|
7604
|
-
directoryRecord.
|
|
7605
|
-
directoryRecord.
|
|
7606
|
-
directoryRecord.
|
|
7607
|
-
directoryRecord.
|
|
7608
|
-
directoryRecord.
|
|
7609
|
-
directoryRecord.
|
|
7717
|
+
directoryRecord.writeUint32(CENTRAL_FILE_HEADER_SIGNATURE);
|
|
7718
|
+
directoryRecord.writeUint16(versionMadeBy);
|
|
7719
|
+
directoryRecord.writeBytes(headerArray.subarray(0, HEADER_SIZE - 4 - 2));
|
|
7720
|
+
directoryRecord.writeUint16(extraFieldLength);
|
|
7721
|
+
directoryRecord.writeUint16(getLength(rawComment));
|
|
7722
|
+
directoryRecord.writeUint16(zip64DiskNumberStart ? MAX_16_BITS : diskNumberStart);
|
|
7723
|
+
directoryRecord.writeUint16(internalFileAttributes);
|
|
7724
|
+
directoryRecord.writeUint32(externalFileAttributes);
|
|
7725
|
+
directoryRecord.writeUint32(zip64Offset ? MAX_32_BITS : fileEntryOffset);
|
|
7726
|
+
directoryRecord.writeBytes(rawFilename);
|
|
7727
|
+
directoryRecord.writeBytes(rawExtraFieldZip64);
|
|
7728
|
+
directoryRecord.writeBytes(rawExtraFieldAES);
|
|
7729
|
+
directoryRecord.writeBytes(rawExtraFieldExtendedTimestamp);
|
|
7730
|
+
directoryRecord.writeBytes(rawExtraFieldNTFS);
|
|
7731
|
+
directoryRecord.writeBytes(rawExtraFieldUnix);
|
|
7732
|
+
directoryRecord.writeBytes(rawExtraField);
|
|
7733
|
+
directoryRecord.writeBytes(rawComment);
|
|
7610
7734
|
arraySet(directoryArray, directoryRecord.array, offset);
|
|
7611
7735
|
offset += directoryRecordLength;
|
|
7612
7736
|
if (options.onprogress) {
|
|
7613
7737
|
try {
|
|
7614
|
-
await options.onprogress(indexFileEntry + 1,
|
|
7738
|
+
await options.onprogress(indexFileEntry + 1, fileEntries.size, new Entry(fileEntry));
|
|
7615
7739
|
} catch {
|
|
7616
7740
|
// ignored
|
|
7617
7741
|
}
|
|
@@ -7625,7 +7749,7 @@ async function writeDirectoryRecords(zipWriter, directoryDataLength, options) {
|
|
|
7625
7749
|
}
|
|
7626
7750
|
|
|
7627
7751
|
async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
|
|
7628
|
-
const signCentralDirectory =
|
|
7752
|
+
const signCentralDirectory = getFunctionOptionValue(zipWriter, options, OPTION_SIGN_CENTRAL_DIRECTORY);
|
|
7629
7753
|
if (signCentralDirectory) {
|
|
7630
7754
|
const signatureData = await signCentralDirectory(directoryArray);
|
|
7631
7755
|
const signatureDataLength = getLength(signatureData);
|
|
@@ -7633,9 +7757,9 @@ async function writeDigitalSignatureRecord(zipWriter, directoryArray, options) {
|
|
|
7633
7757
|
throw new Error(ERR_INVALID_SIGNATURE_DATA);
|
|
7634
7758
|
}
|
|
7635
7759
|
const signatureRecord = createRecordWriter(6 + signatureDataLength);
|
|
7636
|
-
signatureRecord.
|
|
7637
|
-
signatureRecord.
|
|
7638
|
-
signatureRecord.
|
|
7760
|
+
signatureRecord.writeUint32(DIGITAL_SIGNATURE_RECORD_SIGNATURE);
|
|
7761
|
+
signatureRecord.writeUint16(signatureDataLength);
|
|
7762
|
+
signatureRecord.writeBytes(signatureData);
|
|
7639
7763
|
await writeData(zipWriter.writer, signatureRecord.array);
|
|
7640
7764
|
return 6 + signatureDataLength;
|
|
7641
7765
|
}
|
|
@@ -7646,7 +7770,7 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
|
7646
7770
|
const { writer } = zipWriter;
|
|
7647
7771
|
const { directoryStart, signatureLength } = cdInfo;
|
|
7648
7772
|
let { directoryDataLength } = cdInfo;
|
|
7649
|
-
let
|
|
7773
|
+
let fileEntriesLength = zipWriter.fileEntries.size;
|
|
7650
7774
|
let diskNumber = directoryStart.diskNumber;
|
|
7651
7775
|
let directoryOffset = getSegmentOffset(zipWriter, directoryStart);
|
|
7652
7776
|
let lastDiskNumber = getDiskNumber(writer);
|
|
@@ -7654,7 +7778,7 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
|
7654
7778
|
lastDiskNumber++;
|
|
7655
7779
|
}
|
|
7656
7780
|
let zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
|
|
7657
|
-
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS ||
|
|
7781
|
+
if (directoryOffset >= MAX_32_BITS || directoryDataLength >= MAX_32_BITS || fileEntriesLength >= MAX_16_BITS || lastDiskNumber >= MAX_16_BITS) {
|
|
7658
7782
|
if (zip64 === false) {
|
|
7659
7783
|
throw new Error(ERR_UNSUPPORTED_FORMAT);
|
|
7660
7784
|
} else {
|
|
@@ -7671,37 +7795,37 @@ async function writeEndOfDirectoryRecord(zipWriter, comment, options, cdInfo) {
|
|
|
7671
7795
|
}
|
|
7672
7796
|
lastDiskNumber = getDiskNumber(writer);
|
|
7673
7797
|
if (zip64) {
|
|
7674
|
-
endOfdirectoryRecord.
|
|
7675
|
-
endOfdirectoryRecord.
|
|
7676
|
-
endOfdirectoryRecord.
|
|
7677
|
-
endOfdirectoryRecord.
|
|
7678
|
-
endOfdirectoryRecord.
|
|
7679
|
-
endOfdirectoryRecord.
|
|
7680
|
-
endOfdirectoryRecord.
|
|
7681
|
-
endOfdirectoryRecord.
|
|
7682
|
-
endOfdirectoryRecord.
|
|
7683
|
-
endOfdirectoryRecord.
|
|
7684
|
-
endOfdirectoryRecord.
|
|
7685
|
-
endOfdirectoryRecord.
|
|
7686
|
-
endOfdirectoryRecord.
|
|
7687
|
-
endOfdirectoryRecord.
|
|
7798
|
+
endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_SIGNATURE);
|
|
7799
|
+
endOfdirectoryRecord.writeUint64(44);
|
|
7800
|
+
endOfdirectoryRecord.writeUint16(45);
|
|
7801
|
+
endOfdirectoryRecord.writeUint16(45);
|
|
7802
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber);
|
|
7803
|
+
endOfdirectoryRecord.writeUint32(diskNumber);
|
|
7804
|
+
endOfdirectoryRecord.writeUint64(fileEntriesLength);
|
|
7805
|
+
endOfdirectoryRecord.writeUint64(fileEntriesLength);
|
|
7806
|
+
endOfdirectoryRecord.writeUint64(directoryDataLength);
|
|
7807
|
+
endOfdirectoryRecord.writeUint64(directoryOffset);
|
|
7808
|
+
endOfdirectoryRecord.writeUint32(ZIP64_END_OF_CENTRAL_DIR_LOCATOR_SIGNATURE);
|
|
7809
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber);
|
|
7810
|
+
endOfdirectoryRecord.writeUint64(BigInt(getSegmentOffset(zipWriter, writer)) + BigInt(directoryDataLength) + BigInt(signatureLength));
|
|
7811
|
+
endOfdirectoryRecord.writeUint32(lastDiskNumber + 1);
|
|
7688
7812
|
const supportZip64SplitFile = getOptionValue(zipWriter, options, OPTION_SUPPORT_ZIP64_SPLIT_FILE, true);
|
|
7689
7813
|
if (supportZip64SplitFile) {
|
|
7690
7814
|
lastDiskNumber = MAX_16_BITS;
|
|
7691
7815
|
diskNumber = MAX_16_BITS;
|
|
7692
7816
|
}
|
|
7693
|
-
|
|
7817
|
+
fileEntriesLength = MAX_16_BITS;
|
|
7694
7818
|
directoryOffset = MAX_32_BITS;
|
|
7695
7819
|
directoryDataLength = MAX_32_BITS;
|
|
7696
7820
|
}
|
|
7697
|
-
endOfdirectoryRecord.
|
|
7698
|
-
endOfdirectoryRecord.
|
|
7699
|
-
endOfdirectoryRecord.
|
|
7700
|
-
endOfdirectoryRecord.
|
|
7701
|
-
endOfdirectoryRecord.
|
|
7702
|
-
endOfdirectoryRecord.
|
|
7703
|
-
endOfdirectoryRecord.
|
|
7704
|
-
endOfdirectoryRecord.
|
|
7821
|
+
endOfdirectoryRecord.writeUint32(END_OF_CENTRAL_DIR_SIGNATURE);
|
|
7822
|
+
endOfdirectoryRecord.writeUint16(lastDiskNumber);
|
|
7823
|
+
endOfdirectoryRecord.writeUint16(diskNumber);
|
|
7824
|
+
endOfdirectoryRecord.writeUint16(fileEntriesLength);
|
|
7825
|
+
endOfdirectoryRecord.writeUint16(fileEntriesLength);
|
|
7826
|
+
endOfdirectoryRecord.writeUint32(directoryDataLength);
|
|
7827
|
+
endOfdirectoryRecord.writeUint32(directoryOffset);
|
|
7828
|
+
endOfdirectoryRecord.writeUint16(commentLength);
|
|
7705
7829
|
await writeData(writer, endOfdirectoryRecord.array);
|
|
7706
7830
|
if (commentLength) {
|
|
7707
7831
|
await writeData(writer, comment);
|
|
@@ -7714,11 +7838,11 @@ function createRecordWriter(length) {
|
|
|
7714
7838
|
let offset = 0;
|
|
7715
7839
|
return {
|
|
7716
7840
|
array,
|
|
7717
|
-
|
|
7718
|
-
|
|
7719
|
-
|
|
7720
|
-
|
|
7721
|
-
|
|
7841
|
+
writeUint8: value => { setUint8(view, offset, value); offset += 1; },
|
|
7842
|
+
writeUint16: value => { setUint16(view, offset, value); offset += 2; },
|
|
7843
|
+
writeUint32: value => { setUint32(view, offset, value); offset += 4; },
|
|
7844
|
+
writeUint64: value => { setBigUint64(view, offset, BigInt(value)); offset += 8; },
|
|
7845
|
+
writeBytes: value => { arraySet(array, value, offset); offset += getLength(value); },
|
|
7722
7846
|
skip: count => offset += count
|
|
7723
7847
|
};
|
|
7724
7848
|
}
|
|
@@ -7742,6 +7866,71 @@ function getSegmentOffset(zipWriter, { diskNumber = 0, diskOffset = 0 }) {
|
|
|
7742
7866
|
return zipWriter.offset - diskOffset - (diskNumber ? zipWriter.initialOffset : 0);
|
|
7743
7867
|
}
|
|
7744
7868
|
|
|
7869
|
+
async function startsWithSplitZipSignature(reader) {
|
|
7870
|
+
const signatureArray = await readUint8Array(reader, 0, SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
7871
|
+
return getUint32(getDataView(signatureArray), 0) == SPLIT_ZIP_FILE_SIGNATURE;
|
|
7872
|
+
}
|
|
7873
|
+
|
|
7874
|
+
async function copyZipData(zipWriter, reader, entries, directoryOffset, splitZipSignatureLength) {
|
|
7875
|
+
const { writer } = zipWriter;
|
|
7876
|
+
const entryPositions = new Map();
|
|
7877
|
+
if (writer.closeDisk) {
|
|
7878
|
+
const sortedEntries = Array.from(entries).sort((firstEntry, secondEntry) =>
|
|
7879
|
+
getSourceOffset(reader, firstEntry) - getSourceOffset(reader, secondEntry));
|
|
7880
|
+
let copiedLength = 0;
|
|
7881
|
+
for (const entry of sortedEntries) {
|
|
7882
|
+
const sourceOffset = getSourceOffset(reader, entry);
|
|
7883
|
+
await copyData(zipWriter, reader, copiedLength, sourceOffset - copiedLength);
|
|
7884
|
+
if (exceedsAvailableSize(writer, await getLocalHeaderLength(reader, sourceOffset))) {
|
|
7885
|
+
await writer.closeDisk();
|
|
7886
|
+
}
|
|
7887
|
+
entryPositions.set(entry, {
|
|
7888
|
+
offset: getSegmentOffset(zipWriter, writer),
|
|
7889
|
+
diskNumberStart: getDiskNumber(writer)
|
|
7890
|
+
});
|
|
7891
|
+
copiedLength = sourceOffset;
|
|
7892
|
+
}
|
|
7893
|
+
await copyData(zipWriter, reader, copiedLength, directoryOffset - copiedLength);
|
|
7894
|
+
} else {
|
|
7895
|
+
await copyData(zipWriter, reader, 0, directoryOffset);
|
|
7896
|
+
entries.forEach(entry => entryPositions.set(entry, {
|
|
7897
|
+
offset: splitZipSignatureLength + getSourceOffset(reader, entry),
|
|
7898
|
+
diskNumberStart: 0
|
|
7899
|
+
}));
|
|
7900
|
+
}
|
|
7901
|
+
return entryPositions;
|
|
7902
|
+
}
|
|
7903
|
+
|
|
7904
|
+
async function copyData(zipWriter, reader, offset, size) {
|
|
7905
|
+
if (size > 0) {
|
|
7906
|
+
const { writer } = zipWriter;
|
|
7907
|
+
await createReadable(reader, { offset, size }).pipeTo(writer.writable, { preventClose: true, preventAbort: true });
|
|
7908
|
+
writer.size += size;
|
|
7909
|
+
zipWriter.offset += size;
|
|
7910
|
+
}
|
|
7911
|
+
}
|
|
7912
|
+
|
|
7913
|
+
async function getLocalHeaderLength(reader, offset) {
|
|
7914
|
+
const headerArray = await readUint8Array(reader, offset, HEADER_SIZE);
|
|
7915
|
+
if (getLength(headerArray) < HEADER_SIZE) {
|
|
7916
|
+
return HEADER_SIZE;
|
|
7917
|
+
}
|
|
7918
|
+
const headerView = getDataView(headerArray);
|
|
7919
|
+
return HEADER_SIZE +
|
|
7920
|
+
getUint16(headerView, HEADER_OFFSET_FILENAME_LENGTH + LOCAL_HEADER_COMMON_OFFSET) +
|
|
7921
|
+
getUint16(headerView, HEADER_OFFSET_EXTRAFIELD_LENGTH + LOCAL_HEADER_COMMON_OFFSET);
|
|
7922
|
+
}
|
|
7923
|
+
|
|
7924
|
+
function getSourceOffset(reader, { offset, diskNumberStart }) {
|
|
7925
|
+
return offset + (reader.getDiskOffset ? reader.getDiskOffset(diskNumberStart) : 0);
|
|
7926
|
+
}
|
|
7927
|
+
|
|
7928
|
+
function getSplitZipSignatureArray() {
|
|
7929
|
+
const signatureArray = new Uint8Array(SPLIT_ZIP_FILE_SIGNATURE_LENGTH);
|
|
7930
|
+
setUint32(getDataView(signatureArray), 0, SPLIT_ZIP_FILE_SIGNATURE);
|
|
7931
|
+
return signatureArray;
|
|
7932
|
+
}
|
|
7933
|
+
|
|
7745
7934
|
async function writeData(writer, array) {
|
|
7746
7935
|
const { writable } = writer;
|
|
7747
7936
|
const streamWriter = writable.getWriter();
|
|
@@ -7793,6 +7982,21 @@ function getOptionValue(zipWriter, options, name, defaultValue) {
|
|
|
7793
7982
|
return result === UNDEFINED_VALUE ? defaultValue : result;
|
|
7794
7983
|
}
|
|
7795
7984
|
|
|
7985
|
+
function getDateOptionValue(zipWriter, options, name, defaultValue) {
|
|
7986
|
+
const date = getOptionValue(zipWriter, options, name, defaultValue);
|
|
7987
|
+
if (date === null) {
|
|
7988
|
+
return defaultValue;
|
|
7989
|
+
}
|
|
7990
|
+
if (date !== UNDEFINED_VALUE && (typeof date.getTime != FUNCTION_TYPE || Number.isNaN(date.getTime()))) {
|
|
7991
|
+
throw new Error(ERR_INVALID_DATE);
|
|
7992
|
+
}
|
|
7993
|
+
return date;
|
|
7994
|
+
}
|
|
7995
|
+
|
|
7996
|
+
function getFunctionOptionValue(zipWriter, options, name) {
|
|
7997
|
+
return checkFunctionOption(getOptionValue(zipWriter, options, name));
|
|
7998
|
+
}
|
|
7999
|
+
|
|
7796
8000
|
function getAliasedOptionValue(zipWriter, options, name, deprecatedName, defaultValue) {
|
|
7797
8001
|
const value = getAliasedValue(options, name, deprecatedName);
|
|
7798
8002
|
const result = value === UNDEFINED_VALUE ? getAliasedValue(zipWriter.options, name, deprecatedName) : value;
|
|
@@ -7807,9 +8011,6 @@ function getNumberOptionValue(zipWriter, options, name, defaultValue) {
|
|
|
7807
8011
|
return toNumber(getOptionValue(zipWriter, options, name, defaultValue));
|
|
7808
8012
|
}
|
|
7809
8013
|
|
|
7810
|
-
function toNumber(value) {
|
|
7811
|
-
return typeof value == STRING_TYPE && value.trim() ? Number(value) : value;
|
|
7812
|
-
}
|
|
7813
8014
|
|
|
7814
8015
|
function getMaximumCompressedSize(uncompressedSize) {
|
|
7815
8016
|
return uncompressedSize + (5 * (Math.floor(uncompressedSize / 16383) + 1));
|
|
@@ -7821,6 +8022,14 @@ function isCompressed(compressionMethod, level) {
|
|
|
7821
8022
|
: compressionMethod !== COMPRESSION_METHOD_STORE;
|
|
7822
8023
|
}
|
|
7823
8024
|
|
|
8025
|
+
function getUint16(view, offset) {
|
|
8026
|
+
return view.getUint16(offset, true);
|
|
8027
|
+
}
|
|
8028
|
+
|
|
8029
|
+
function getUint32(view, offset) {
|
|
8030
|
+
return view.getUint32(offset, true);
|
|
8031
|
+
}
|
|
8032
|
+
|
|
7824
8033
|
function setUint8(view, offset, value) {
|
|
7825
8034
|
view.setUint8(offset, value);
|
|
7826
8035
|
}
|
|
@@ -7864,9 +8073,9 @@ function getHeaderArrayData({
|
|
|
7864
8073
|
const headerRecord = createRecordWriter(HEADER_SIZE - 4);
|
|
7865
8074
|
const headerArray = headerRecord.array;
|
|
7866
8075
|
const headerView = getDataView(headerArray);
|
|
7867
|
-
headerRecord.
|
|
7868
|
-
headerRecord.
|
|
7869
|
-
headerRecord.
|
|
8076
|
+
headerRecord.writeUint16(version);
|
|
8077
|
+
headerRecord.writeUint16(bitFlag);
|
|
8078
|
+
headerRecord.writeUint16(compressionMethod);
|
|
7870
8079
|
if (rawLastModDate === UNDEFINED_VALUE) {
|
|
7871
8080
|
const dateArray = new Uint32Array(1);
|
|
7872
8081
|
const dateView = getDataView(dateArray);
|
|
@@ -7874,20 +8083,20 @@ function getHeaderArrayData({
|
|
|
7874
8083
|
setUint16(dateView, 2, ((((lastModDate.getFullYear() - 1980) << 4) | (lastModDate.getMonth() + 1)) << 5) | lastModDate.getDate());
|
|
7875
8084
|
rawLastModDate = dateArray[0];
|
|
7876
8085
|
}
|
|
7877
|
-
headerRecord.
|
|
8086
|
+
headerRecord.writeUint32(rawLastModDate);
|
|
7878
8087
|
headerRecord.skip(4);
|
|
7879
8088
|
if (zip64CompressedSize || compressedSize !== UNDEFINED_VALUE) {
|
|
7880
|
-
headerRecord.
|
|
8089
|
+
headerRecord.writeUint32(zip64CompressedSize ? MAX_32_BITS : compressedSize);
|
|
7881
8090
|
} else {
|
|
7882
8091
|
headerRecord.skip(4);
|
|
7883
8092
|
}
|
|
7884
8093
|
if (zip64UncompressedSize || uncompressedSize !== UNDEFINED_VALUE) {
|
|
7885
|
-
headerRecord.
|
|
8094
|
+
headerRecord.writeUint32(zip64UncompressedSize ? MAX_32_BITS : uncompressedSize);
|
|
7886
8095
|
} else {
|
|
7887
8096
|
headerRecord.skip(4);
|
|
7888
8097
|
}
|
|
7889
|
-
headerRecord.
|
|
7890
|
-
headerRecord.
|
|
8098
|
+
headerRecord.writeUint16(getLength(rawFilename));
|
|
8099
|
+
headerRecord.writeUint16(extraFieldLength);
|
|
7891
8100
|
return {
|
|
7892
8101
|
headerArray,
|
|
7893
8102
|
headerView,
|
|
@@ -8470,6 +8679,7 @@ setDefaultConfiguration({
|
|
|
8470
8679
|
const ERR_ENTRY_EXISTS = "Entry filename already exists";
|
|
8471
8680
|
const ERR_READABLE_CONSUMED = "Readable stream already consumed";
|
|
8472
8681
|
const ERR_INVALID_PASS_THROUGH = "Invalid passThrough option (use readerOptions.passThrough or set uncompressedSize for each entry)";
|
|
8682
|
+
const ERR_INVALID_READER_OPTIONS = "Invalid readerOptions (must be an object)";
|
|
8473
8683
|
const ERR_ABORT_EXPORT = "zipjs-abort-export";
|
|
8474
8684
|
const ERR_ABORTED = "The operation was aborted";
|
|
8475
8685
|
const ABORT_ERROR_NAME = "AbortError";
|
|
@@ -8502,13 +8712,14 @@ class ZipEntry {
|
|
|
8502
8712
|
fs,
|
|
8503
8713
|
name,
|
|
8504
8714
|
data: params.data,
|
|
8505
|
-
options: params.options,
|
|
8715
|
+
options: params.options && Object.assign({}, params.options),
|
|
8506
8716
|
id: fs.entryIdCounter++,
|
|
8507
8717
|
parent,
|
|
8508
8718
|
children: [],
|
|
8509
8719
|
uncompressedSize: params.uncompressedSize || 0,
|
|
8510
8720
|
undeterminedSize: params.undeterminedSize || params.uncompressedSize === UNDEFINED_VALUE,
|
|
8511
|
-
passThrough: params.passThrough
|
|
8721
|
+
passThrough: params.passThrough,
|
|
8722
|
+
defaultLastModDate: params.defaultLastModDate || new Date()
|
|
8512
8723
|
});
|
|
8513
8724
|
if (parent || !fs.root) {
|
|
8514
8725
|
fs.entries[zipEntry.id] = zipEntry;
|
|
@@ -8518,12 +8729,6 @@ class ZipEntry {
|
|
|
8518
8729
|
}
|
|
8519
8730
|
}
|
|
8520
8731
|
|
|
8521
|
-
moveTo(target) {
|
|
8522
|
-
// deprecated
|
|
8523
|
-
const zipEntry = this;
|
|
8524
|
-
zipEntry.fs.move(zipEntry, target);
|
|
8525
|
-
}
|
|
8526
|
-
|
|
8527
8732
|
getFullname() {
|
|
8528
8733
|
return this.getRelativeName();
|
|
8529
8734
|
}
|
|
@@ -8555,6 +8760,11 @@ class ZipEntry {
|
|
|
8555
8760
|
this.name = name;
|
|
8556
8761
|
}
|
|
8557
8762
|
}
|
|
8763
|
+
|
|
8764
|
+
setOptions(options) {
|
|
8765
|
+
const entryOptions = Object.assign({}, this.options, options);
|
|
8766
|
+
this.options = Object.fromEntries(Object.entries(entryOptions).filter(([, value]) => value !== UNDEFINED_VALUE));
|
|
8767
|
+
}
|
|
8558
8768
|
}
|
|
8559
8769
|
|
|
8560
8770
|
class ZipFileEntry extends ZipEntry {
|
|
@@ -8581,7 +8791,7 @@ class ZipFileEntry extends ZipEntry {
|
|
|
8581
8791
|
const reader = zipEntry.reader = createReader(zipEntry.Reader, zipEntry.data, options);
|
|
8582
8792
|
const dataSize = zipEntry.uncompressedSize || reader.size;
|
|
8583
8793
|
await Promise.all([initStream(reader), initStream(writer, dataSize)]);
|
|
8584
|
-
const
|
|
8794
|
+
const signal = checkSignalOption(options.signal);
|
|
8585
8795
|
const readable = createProgressReadable(zipEntry, reader, options, signal);
|
|
8586
8796
|
const preventClose = !ownsWritable(writer) && Boolean(options.preventClose);
|
|
8587
8797
|
zipEntry.uncompressedSize = reader.size;
|
|
@@ -8799,10 +9009,6 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
8799
9009
|
});
|
|
8800
9010
|
}
|
|
8801
9011
|
|
|
8802
|
-
addData(name, params) {
|
|
8803
|
-
return addChild(this, name, params);
|
|
8804
|
-
}
|
|
8805
|
-
|
|
8806
9012
|
importBlob(blob, options) {
|
|
8807
9013
|
return this.importZip(new BlobReader(blob), options);
|
|
8808
9014
|
}
|
|
@@ -8916,7 +9122,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
8916
9122
|
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
8917
9123
|
options.bufferedWrite = true;
|
|
8918
9124
|
}
|
|
8919
|
-
const [readers] = await Promise.all([initReaders(zipEntry, options.readerOptions), initStream(writer)]);
|
|
9125
|
+
const [readers] = await Promise.all([initReaders(zipEntry, checkReaderOptions(options.readerOptions)), initStream(writer)]);
|
|
8920
9126
|
const zipWriter = new ZipWriter(writer, options);
|
|
8921
9127
|
await exportZip(zipWriter, zipEntry, getTotalSize([zipEntry], getUncompressedSize), options, readers);
|
|
8922
9128
|
await zipWriter.close(options.globalComment);
|
|
@@ -8926,12 +9132,13 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
8926
9132
|
getExportedSize(options = {}) {
|
|
8927
9133
|
const zipEntry = this;
|
|
8928
9134
|
options = Object.assign({}, options);
|
|
9135
|
+
checkReaderOptions(options.readerOptions);
|
|
8929
9136
|
if (options.bufferedWrite === UNDEFINED_VALUE) {
|
|
8930
9137
|
options.bufferedWrite = true;
|
|
8931
9138
|
}
|
|
8932
9139
|
const writeOrderGuaranteed = !options.bufferedWrite ||
|
|
8933
9140
|
(options.keepOrder !== false && zipEntry.children.every(child => !child.children.length));
|
|
8934
|
-
return getEntriesSize(options,
|
|
9141
|
+
return getEntriesSize(options, zipEntry.getChildren({ recursive: true }).filter(child => !isImplicitDirectory(child)).map(child => {
|
|
8935
9142
|
const { name, entryOptions } = getChildEntryOptions(child, zipEntry, options);
|
|
8936
9143
|
return { name, size: child.directory ? 0 : getDeterminedSize(child, isPassThrough(child, options)), options: entryOptions };
|
|
8937
9144
|
}), writeOrderGuaranteed, options.globalComment);
|
|
@@ -8970,7 +9177,7 @@ class ZipDirectoryEntry extends ZipEntry {
|
|
|
8970
9177
|
}
|
|
8971
9178
|
|
|
8972
9179
|
|
|
8973
|
-
class
|
|
9180
|
+
class ZipFS {
|
|
8974
9181
|
|
|
8975
9182
|
constructor() {
|
|
8976
9183
|
resetFS(this);
|
|
@@ -9086,10 +9293,6 @@ class FS {
|
|
|
9086
9293
|
return this.root.addFile(file, options);
|
|
9087
9294
|
}
|
|
9088
9295
|
|
|
9089
|
-
addData(name, params) {
|
|
9090
|
-
return this.root.addData(name, params);
|
|
9091
|
-
}
|
|
9092
|
-
|
|
9093
9296
|
importBlob(blob, options) {
|
|
9094
9297
|
resetFS(this);
|
|
9095
9298
|
return this.root.importBlob(blob, options);
|
|
@@ -9157,7 +9360,7 @@ class FS {
|
|
|
9157
9360
|
}
|
|
9158
9361
|
}
|
|
9159
9362
|
|
|
9160
|
-
const fs = { FS, ZipDirectoryEntry, ZipFileEntry };
|
|
9363
|
+
const fs = { FS: ZipFS, ZipDirectoryEntry, ZipFileEntry };
|
|
9161
9364
|
|
|
9162
9365
|
function getTotalSize(entries, getEntrySize) {
|
|
9163
9366
|
let size = 0;
|
|
@@ -9301,7 +9504,7 @@ function detach(entry) {
|
|
|
9301
9504
|
}
|
|
9302
9505
|
|
|
9303
9506
|
function forwardAbort(signal, abortController) {
|
|
9304
|
-
if (!signal) {
|
|
9507
|
+
if (!checkSignalOption(signal)) {
|
|
9305
9508
|
return () => { };
|
|
9306
9509
|
}
|
|
9307
9510
|
if (signal.aborted) {
|
|
@@ -9397,7 +9600,7 @@ function getChildEntryOptions(child, selectedEntry, options) {
|
|
|
9397
9600
|
};
|
|
9398
9601
|
}
|
|
9399
9602
|
}
|
|
9400
|
-
const entryOptions = Object.assign({}, zipEntryMetadata, options,
|
|
9603
|
+
const entryOptions = Object.assign({ lastModDate: child.defaultLastModDate }, zipEntryMetadata, options, childOptions, passThroughOptions, { directory: child.directory });
|
|
9401
9604
|
if (!child.directory && entryOptions.passThrough && entryOptions.uncompressedSize === UNDEFINED_VALUE) {
|
|
9402
9605
|
throw new Error(ERR_INVALID_PASS_THROUGH);
|
|
9403
9606
|
}
|
|
@@ -9412,11 +9615,22 @@ function getDeterminedSize(child, passThrough) {
|
|
|
9412
9615
|
return child.undeterminedSize ? UNDEFINED_VALUE : getExtractedSize(child, passThrough);
|
|
9413
9616
|
}
|
|
9414
9617
|
|
|
9618
|
+
function checkReaderOptions(readerOptions) {
|
|
9619
|
+
if (readerOptions && (typeof readerOptions != OBJECT_TYPE || Array.isArray(readerOptions))) {
|
|
9620
|
+
throw new Error(ERR_INVALID_READER_OPTIONS);
|
|
9621
|
+
}
|
|
9622
|
+
return readerOptions;
|
|
9623
|
+
}
|
|
9624
|
+
|
|
9415
9625
|
function isPassThrough(child, options) {
|
|
9416
9626
|
const { readerOptions } = options;
|
|
9417
9627
|
return Boolean(!child.directory && (child.passThrough || (readerOptions && readerOptions.passThrough)));
|
|
9418
9628
|
}
|
|
9419
9629
|
|
|
9630
|
+
function isImplicitDirectory(child) {
|
|
9631
|
+
return child.directory && child.data === null;
|
|
9632
|
+
}
|
|
9633
|
+
|
|
9420
9634
|
function getUserExtraField(extraField) {
|
|
9421
9635
|
if (extraField) {
|
|
9422
9636
|
const userExtraField = new Map();
|
|
@@ -9434,7 +9648,7 @@ function getUserExtraField(extraField) {
|
|
|
9434
9648
|
async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
9435
9649
|
const { onstart, onprogress, onend, onentryprogress } = options;
|
|
9436
9650
|
const selectedEntry = entry;
|
|
9437
|
-
const totalEntries = getTotalSize(entry.children, ()
|
|
9651
|
+
const totalEntries = getTotalSize(entry.children, child => isImplicitDirectory(child) ? 0 : 1);
|
|
9438
9652
|
let writtenSize = 0;
|
|
9439
9653
|
let writtenEntries = 0;
|
|
9440
9654
|
if (onstart) {
|
|
@@ -9463,6 +9677,9 @@ async function exportZip(zipWriter, entry, totalSize, options, readers) {
|
|
|
9463
9677
|
}
|
|
9464
9678
|
|
|
9465
9679
|
async function addChild(child) {
|
|
9680
|
+
if (isImplicitDirectory(child)) {
|
|
9681
|
+
return;
|
|
9682
|
+
}
|
|
9466
9683
|
const { name, entryOptions } = getChildEntryOptions(child, selectedEntry, options);
|
|
9467
9684
|
let entryWrittenSize = 0;
|
|
9468
9685
|
const entryMetadata = await zipWriter.add(name, readers.get(child), Object.assign(entryOptions, {
|
|
@@ -9496,7 +9713,7 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
9496
9713
|
if (handle.kind == "file") {
|
|
9497
9714
|
const file = await handle.getFile();
|
|
9498
9715
|
addedEntries.push(
|
|
9499
|
-
parentEntry
|
|
9716
|
+
addChild(parentEntry, file.name, {
|
|
9500
9717
|
Reader: function () {
|
|
9501
9718
|
const readable = file.stream();
|
|
9502
9719
|
const size = file.size;
|
|
@@ -9530,10 +9747,11 @@ function addFileSystemHandle(zipEntry, handle, options) {
|
|
|
9530
9747
|
|
|
9531
9748
|
async function exportFileSystemHandle(zipEntry, directoryHandle, options) {
|
|
9532
9749
|
const { onstart, onprogress, onend } = options;
|
|
9750
|
+
const readerOptions = checkReaderOptions(options.readerOptions);
|
|
9533
9751
|
const abortController = new AbortController();
|
|
9534
9752
|
const { signal } = abortController;
|
|
9535
9753
|
const releaseSignal = forwardAbort(options.signal, abortController);
|
|
9536
|
-
const getDataOptions = Object.assign({}, options,
|
|
9754
|
+
const getDataOptions = Object.assign({}, options, readerOptions, {
|
|
9537
9755
|
signal,
|
|
9538
9756
|
onstart: UNDEFINED_VALUE,
|
|
9539
9757
|
onprogress: UNDEFINED_VALUE,
|
|
@@ -9820,7 +10038,7 @@ function decodeMimeTypes(data) {
|
|
|
9820
10038
|
*/
|
|
9821
10039
|
|
|
9822
10040
|
|
|
9823
|
-
|
|
10041
|
+
a(setDefaultConfiguration);
|
|
9824
10042
|
|
|
9825
10043
|
exports.BlobReader = BlobReader;
|
|
9826
10044
|
exports.BlobWriter = BlobWriter;
|
|
@@ -9833,6 +10051,7 @@ exports.ERR_CENTRAL_DIRECTORY_NOT_FOUND = ERR_CENTRAL_DIRECTORY_NOT_FOUND;
|
|
|
9833
10051
|
exports.ERR_DUPLICATED_NAME = ERR_DUPLICATED_NAME;
|
|
9834
10052
|
exports.ERR_ENCRYPTED = ERR_ENCRYPTED;
|
|
9835
10053
|
exports.ERR_ENCRYPTED_CENTRAL_DIRECTORY = ERR_ENCRYPTED_CENTRAL_DIRECTORY;
|
|
10054
|
+
exports.ERR_ENTRY_DATA_OUT_OF_BOUNDS = ERR_ENTRY_DATA_OUT_OF_BOUNDS;
|
|
9836
10055
|
exports.ERR_ENTRY_EXISTS = ERR_ENTRY_EXISTS;
|
|
9837
10056
|
exports.ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND = ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND;
|
|
9838
10057
|
exports.ERR_EOCDR_NOT_FOUND = ERR_EOCDR_NOT_FOUND;
|
|
@@ -9846,20 +10065,28 @@ exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
|
|
|
9846
10065
|
exports.ERR_INVALID_COMMENT_TYPE = ERR_INVALID_COMMENT_TYPE;
|
|
9847
10066
|
exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
|
|
9848
10067
|
exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
|
|
10068
|
+
exports.ERR_INVALID_DATE = ERR_INVALID_DATE;
|
|
9849
10069
|
exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
|
|
9850
10070
|
exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
|
|
10071
|
+
exports.ERR_INVALID_ENTRY_COMMENT_TYPE = ERR_INVALID_ENTRY_COMMENT_TYPE;
|
|
9851
10072
|
exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;
|
|
10073
|
+
exports.ERR_INVALID_EXTRAFIELD = ERR_INVALID_EXTRAFIELD;
|
|
9852
10074
|
exports.ERR_INVALID_EXTRAFIELD_DATA = ERR_INVALID_EXTRAFIELD_DATA;
|
|
10075
|
+
exports.ERR_INVALID_EXTRAFIELD_DATA_TYPE = ERR_INVALID_EXTRAFIELD_DATA_TYPE;
|
|
9853
10076
|
exports.ERR_INVALID_EXTRAFIELD_TYPE = ERR_INVALID_EXTRAFIELD_TYPE;
|
|
9854
10077
|
exports.ERR_INVALID_FILENAME_VALIDATION = ERR_INVALID_FILENAME_VALIDATION;
|
|
10078
|
+
exports.ERR_INVALID_FUNCTION_OPTION = ERR_INVALID_FUNCTION_OPTION;
|
|
9855
10079
|
exports.ERR_INVALID_GID = ERR_INVALID_GID;
|
|
9856
10080
|
exports.ERR_INVALID_LEVEL = ERR_INVALID_LEVEL;
|
|
9857
10081
|
exports.ERR_INVALID_MAX_APPENDED_DATA_SIZE = ERR_INVALID_MAX_APPENDED_DATA_SIZE;
|
|
10082
|
+
exports.ERR_INVALID_MAX_WORKERS = ERR_INVALID_MAX_WORKERS;
|
|
9858
10083
|
exports.ERR_INVALID_MSDOS_ATTRIBUTES = ERR_INVALID_MSDOS_ATTRIBUTES;
|
|
9859
10084
|
exports.ERR_INVALID_MSDOS_DATA = ERR_INVALID_MSDOS_DATA;
|
|
9860
10085
|
exports.ERR_INVALID_PASSWORD = ERR_INVALID_PASSWORD;
|
|
9861
10086
|
exports.ERR_INVALID_PASSWORD_TYPE = ERR_INVALID_PASSWORD_TYPE;
|
|
9862
10087
|
exports.ERR_INVALID_PASS_THROUGH = ERR_INVALID_PASS_THROUGH;
|
|
10088
|
+
exports.ERR_INVALID_READER_OPTIONS = ERR_INVALID_READER_OPTIONS;
|
|
10089
|
+
exports.ERR_INVALID_SIGNAL = ERR_INVALID_SIGNAL;
|
|
9863
10090
|
exports.ERR_INVALID_SIGNATURE = ERR_INVALID_SIGNATURE;
|
|
9864
10091
|
exports.ERR_INVALID_SIGNATURE_DATA = ERR_INVALID_SIGNATURE_DATA;
|
|
9865
10092
|
exports.ERR_INVALID_STRICTNESS = ERR_INVALID_STRICTNESS;
|
|
@@ -9899,6 +10126,10 @@ exports.TextWriter = TextWriter;
|
|
|
9899
10126
|
exports.Uint8ArrayReader = Uint8ArrayReader;
|
|
9900
10127
|
exports.Uint8ArrayWriter = Uint8ArrayWriter;
|
|
9901
10128
|
exports.Writer = Writer;
|
|
10129
|
+
exports.ZipDirectoryEntry = ZipDirectoryEntry;
|
|
10130
|
+
exports.ZipEntry = ZipEntry;
|
|
10131
|
+
exports.ZipFS = ZipFS;
|
|
10132
|
+
exports.ZipFileEntry = ZipFileEntry;
|
|
9902
10133
|
exports.ZipReader = ZipReader;
|
|
9903
10134
|
exports.ZipReaderStream = ZipReaderStream;
|
|
9904
10135
|
exports.ZipWriter = ZipWriter;
|