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