@zip.js/zip.js 2.8.53 → 2.8.55

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