@zip.js/zip.js 2.8.42 → 2.8.44

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 (46) hide show
  1. package/README.md +0 -37
  2. package/deno.json +1 -1
  3. package/dist/zip-core-external.js +178 -77
  4. package/dist/zip-core-external.min.js +1 -1
  5. package/dist/zip-core.js +179 -76
  6. package/dist/zip-core.min.js +1 -1
  7. package/dist/zip-fs-core-external.js +178 -77
  8. package/dist/zip-fs-core-external.min.js +1 -1
  9. package/dist/zip-fs-core.js +177 -76
  10. package/dist/zip-fs-core.min.js +1 -1
  11. package/dist/zip-fs-external.js +178 -77
  12. package/dist/zip-fs-external.min.js +1 -1
  13. package/dist/zip-fs-native.js +180 -77
  14. package/dist/zip-fs-native.min.js +1 -1
  15. package/dist/zip-fs.js +180 -77
  16. package/dist/zip-fs.min.js +1 -1
  17. package/dist/zip-legacy.js +180 -77
  18. package/dist/zip-legacy.min.js +1 -1
  19. package/dist/zip-native.js +180 -77
  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 +180 -77
  24. package/dist/zip.min.js +1 -1
  25. package/index-native.cjs +180 -77
  26. package/index-native.min.js +1 -1
  27. package/index.cjs +180 -77
  28. package/index.d.cts +80 -7
  29. package/index.d.ts +80 -7
  30. package/index.min.js +1 -1
  31. package/lib/core/codec-pool.js +6 -2
  32. package/lib/core/codec-worker.js +23 -2
  33. package/lib/core/options.js +4 -0
  34. package/lib/core/streams/aes-crypto-stream.js +4 -4
  35. package/lib/core/streams/codec-stream.js +8 -2
  36. package/lib/core/streams/common-crypto.js +2 -0
  37. package/lib/core/streams/zip-entry-stream.js +102 -36
  38. package/lib/core/web-worker-inline-native.js +1 -1
  39. package/lib/core/web-worker-inline-wasm.js +1 -1
  40. package/lib/core/web-worker-wasm.js +4 -8
  41. package/lib/core/zip-entry.js +3 -0
  42. package/lib/core/zip-reader.js +35 -26
  43. package/lib/core/zip-writer.js +22 -10
  44. package/lib/zip-core-reader.js +2 -0
  45. package/package.json +1 -1
  46. package/worker-message-property-names.js +1 -1
@@ -224,7 +224,7 @@
224
224
  Object.assign(config, DEFAULT_CONFIGURATION);
225
225
  }
226
226
 
227
- const l=[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],t=[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],P=[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 b=new Uint8Array(30).fill(5);function s(l){const r=new Uint16Array(16);for(const t of l)r[t]++;r[0]=0;const t=new Uint16Array(17);for(let l=1;15>=l;l++)t[l+1]=t[l]+r[l];const n=new Uint16Array(l.length);for(let r=0;r<l.length;r++)l[r]&&(n[t[l[r]]++]=r);return {l:r,symbols:n}}const i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function f(f){f({workerURI:f=>{const a="text/javascript",e=(i=>{let f=0,a=0,e=0,F=new Uint8Array(1024),v=0,c=0;for(;!c;){c=d(1);const l=d(2);if(0==l)q();else if(1==l)p(s(o),s(b));else {if(2!=l)throw Error("invalid deflate block type");p(...M());}}return F.subarray(0,v);function K(){if(f>=i.length)throw Error("unexpected end of deflate data");return i[f++]}function d(l){for(;l>e;)a|=K()<<e,e+=8;const r=a&(1<<l)-1;return a>>>=l,e-=l,r}function q(){a=0,e=0;const l=K()|K()<<8;f+=2,j(v+l);for(let r=0;l>r;r++)F[v++]=K();}function p(P,o){let b=U(P);for(;256!=b;){if(256>b)j(v+1),F[v++]=b;else {const P=b-257,s=l[P]+d(r[P]),i=U(o),f=t[i]+d(n[i]);j(v+s);const a=v-f;for(let l=0;s>l;l++)F[v++]=F[a+l];}b=U(P);}}function M(){const l=d(5)+257,r=d(5)+1,t=d(4)+4,n=new Uint8Array(19);for(let l=0;t>l;l++)n[P[l]]=d(3);const o=s(n),b=new Uint8Array(l+r);let i=0;for(;i<b.length;){const l=U(o);if(16>l)b[i++]=l;else if(16==l){const l=b[i-1];let r=d(2)+3;for(;r--;)b[i++]=l;}else i+=17==l?d(3)+3:d(7)+11;}return [s(b.subarray(0,l)),s(b.subarray(l))]}function U(l){const{l:r,symbols:t}=l;let n=0,P=0,o=0;for(let l=1;15>=l;l++){n|=d(1);const b=r[l];if(b>n-P)return t[o+(n-P)];o+=b,P=P+b<<1,n<<=1;}throw Error("invalid huffman code")}function j(l){if(F.length<l){let r=2*F.length;for(;l>r;)r*=2;const t=new Uint8Array(r);t.set(F.subarray(0,v)),F=t;}}})((l=>{const r=(l=(l+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,t=[];for(let n=0;r>n;n+=4){const r=i.indexOf(l[n])<<18|i.indexOf(l[n+1])<<12|(63&i.indexOf(l[n+2]))<<6|63&i.indexOf(l[n+3]);t.push(r>>16&255),"="!==l[n+2]&&t.push(r>>8&255),"="!==l[n+3]&&t.push(255&r);}return new Uint8Array(t)})("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"));if(f){const l=new Blob([e],{type:a});return URL.createObjectURL(l)}return "data:"+a+";base64,"+(l=>{let r="";const t=l.length;let n=0;for(;t>n+2;n+=3){const t=l[n]<<16|l[n+1]<<8|l[n+2];r+=i[t>>18&63]+i[t>>12&63]+i[t>>6&63]+i[63&t];}const P=t-n;if(1===P){const t=l[n]<<16;r+=i[t>>18&63]+i[t>>12&63]+"==";}else if(2===P){const t=l[n]<<16|l[n+1]<<8;r+=i[t>>18&63]+i[t>>12&63]+i[t>>6&63]+"=";}return r})(e)}});}
227
+ const t=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],e=[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],o=[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],h=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],r=new Uint8Array(288);r.fill(8,0,144),r.fill(9,144,256),r.fill(7,256,280),r.fill(8,280,288);const s=new Uint8Array(30).fill(5);function u(t){const e=new Uint16Array(16);for(const o of t)e[o]++;e[0]=0;const o=new Uint16Array(17);for(let t=1;15>=t;t++)o[t+1]=o[t]+e[t];const n=new Uint16Array(t.length);for(let e=0;e<t.length;e++)t[e]&&(n[o[t[e]]++]=e);return {o:e,symbols:n}}const b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function f(f){f({workerURI:f=>{const i="text/javascript",w=(b=>{let f=0,i=0,w=0,M=new Uint8Array(1024),c=0,z=0;for(;!z;){z=V(1);const t=V(2);if(0==t)a();else if(1==t)W(u(r),u(s));else {if(2!=t)throw Error("invalid deflate block type");W(...m());}}return M.subarray(0,c);function F(){if(f>=b.length)throw Error("unexpected end of deflate data");return b[f++]}function V(t){for(;t>w;)i|=F()<<w,w+=8;const e=i&(1<<t)-1;return i>>>=t,w-=t,e}function a(){i=0,w=0;const t=F()|F()<<8;f+=2,G(c+t);for(let e=0;t>e;e++)M[c++]=F();}function W(h,r){let s=Z(h);for(;256!=s;){if(256>s)G(c+1),M[c++]=s;else {const h=s-257,u=t[h]+V(e[h]),b=Z(r),f=o[b]+V(n[b]);G(c+u);const i=c-f;for(let t=0;u>t;t++)M[c++]=M[i+t];}s=Z(h);}}function m(){const t=V(5)+257,e=V(5)+1,o=V(4)+4,n=new Uint8Array(19);for(let t=0;o>t;t++)n[h[t]]=V(3);const r=u(n),s=new Uint8Array(t+e);let b=0;for(;b<s.length;){const t=Z(r);if(16>t)s[b++]=t;else if(16==t){const t=s[b-1];let e=V(2)+3;for(;e--;)s[b++]=t;}else b+=17==t?V(3)+3:V(7)+11;}return [u(s.subarray(0,t)),u(s.subarray(t))]}function Z(t){const{o:e,symbols:o}=t;let n=0,h=0,r=0;for(let t=1;15>=t;t++){n|=V(1);const s=e[t];if(s>n-h)return o[r+(n-h)];r+=s,h=h+s<<1,n<<=1;}throw Error("invalid huffman code")}function G(t){if(M.length<t){let e=2*M.length;for(;t>e;)e*=2;const o=new Uint8Array(e);o.set(M.subarray(0,c)),M=o;}}})((t=>{const e=(t=(t+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,o=[];for(let n=0;e>n;n+=4){const e=b.indexOf(t[n])<<18|b.indexOf(t[n+1])<<12|(63&b.indexOf(t[n+2]))<<6|63&b.indexOf(t[n+3]);o.push(e>>16&255),"="!==t[n+2]&&o.push(e>>8&255),"="!==t[n+3]&&o.push(255&e);}return new Uint8Array(o)})("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"));if(f){const t=new Blob([w],{type:i});return URL.createObjectURL(t)}return "data:"+i+";base64,"+(t=>{let e="";const o=t.length;let n=0;for(;o>n+2;n+=3){const o=t[n]<<16|t[n+1]<<8|t[n+2];e+=b[o>>18&63]+b[o>>12&63]+b[o>>6&63]+b[63&o];}const h=o-n;if(1===h){const o=t[n]<<16;e+=b[o>>18&63]+b[o>>12&63]+"==";}else if(2===h){const o=t[n]<<16|t[n+1]<<8;e+=b[o>>18&63]+b[o>>12&63]+b[o>>6&63]+"=";}return e})(w)}});}
228
228
 
229
229
  /*
230
230
  Copyright (c) 2025 Gildas Lormeau. All rights reserved.
@@ -1371,6 +1371,7 @@
1371
1371
 
1372
1372
  const ERR_INVALID_PASSWORD = "Invalid password";
1373
1373
  const ERR_INVALID_SIGNATURE = "Invalid signature";
1374
+ const ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_SIGNATURE;
1374
1375
  const ERR_ABORT_CHECK_PASSWORD = "zipjs-abort-check-password";
1375
1376
  const ERR_UNSUPPORTED_CRYPTO_API = "Crypto API not supported";
1376
1377
 
@@ -1437,7 +1438,7 @@
1437
1438
 
1438
1439
  class AESDecryptionStream extends TransformStream {
1439
1440
 
1440
- constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly }) {
1441
+ constructor({ password, rawPassword, encryptionStrength, checkPasswordOnly, checkAuthenticationCode = true }) {
1441
1442
  super({
1442
1443
  start() {
1443
1444
  initAesCrypto(this, password, rawPassword, encryptionStrength);
@@ -1487,8 +1488,8 @@
1487
1488
  for (let indexSignature = 0; indexSignature < SIGNATURE_LENGTH; indexSignature++) {
1488
1489
  invalidSignature |= signature[indexSignature] ^ originalSignature[indexSignature];
1489
1490
  }
1490
- if (invalidSignature) {
1491
- throw new Error(ERR_INVALID_SIGNATURE);
1491
+ if (invalidSignature && checkAuthenticationCode) {
1492
+ throw new Error(ERR_INVALID_AUTHENTICATION_CODE);
1492
1493
  }
1493
1494
  controller.enqueue(decryptedChunkArray);
1494
1495
  }
@@ -1926,6 +1927,7 @@
1926
1927
 
1927
1928
  const ERR_INVALID_UNCOMPRESSED_SIZE = "Invalid uncompressed size";
1928
1929
  const ERR_INVALID_COMPRESSED_DATA = "Invalid compressed data";
1930
+ const ERR_INVALID_CRC32 = ERR_INVALID_SIGNATURE;
1929
1931
  const ERR_UNSUPPORTED_COMPRESSION$2 = "Compression method not supported";
1930
1932
  const FORMAT_DEFLATE_RAW = "deflate-raw";
1931
1933
  const FORMAT_DEFLATE64_RAW = "deflate64-raw";
@@ -1933,19 +1935,20 @@
1933
1935
  const GZIP_HEADER_LENGTH = 10;
1934
1936
  const GZIP_TRAILER_LENGTH = 8;
1935
1937
  const GZIP_HEADER_BYTES = [0x1f, 0x8b, 0x08];
1938
+ const GZIP_OUTPUT_STALL_TIMEOUT = 5000;
1936
1939
 
1937
1940
  class DeflateStream extends TransformStream {
1938
1941
 
1939
1942
  constructor(options, { chunkSize, CompressionStreamZlib, CompressionStream }) {
1940
1943
  super({});
1941
- const { compressed, encrypted, useCompressionStream, zipCrypto, signed, level, deflate64, format, compressionMethod } = options;
1944
+ const { compressed, encrypted, useCompressionStream, zipCrypto, computeCrc32, level, deflate64, format, compressionMethod } = options;
1942
1945
  const stream = this;
1943
1946
  let crc32Stream, encryptionStream, gzipCrc32Stream;
1944
1947
  let readable = super.readable;
1945
1948
  const codecStreams = format && getCodecStreams(format);
1946
- const useGzipCrc32 = signed && compressed && !deflate64 && !codecStreams && (!encrypted || zipCrypto) &&
1949
+ const useGzipCrc32 = computeCrc32 && compressed && !deflate64 && !codecStreams && (!encrypted || zipCrypto) &&
1947
1950
  Boolean(useCompressionStream && CompressionStream);
1948
- if ((!encrypted || zipCrypto) && signed && !useGzipCrc32) {
1951
+ if ((!encrypted || zipCrypto) && computeCrc32 && !useGzipCrc32) {
1949
1952
  crc32Stream = new Crc32Stream();
1950
1953
  readable = pipeThrough(readable, crc32Stream);
1951
1954
  }
@@ -1984,7 +1987,7 @@
1984
1987
  if (encrypted && !zipCrypto) {
1985
1988
  signature = encryptionStream.signature;
1986
1989
  }
1987
- if ((!encrypted || zipCrypto) && signed) {
1990
+ if ((!encrypted || zipCrypto) && computeCrc32) {
1988
1991
  signature = useGzipCrc32 ? gzipCrc32Stream.signature : new DataView(crc32Stream.value.buffer).getUint32(0);
1989
1992
  }
1990
1993
  stream.signature = signature;
@@ -2033,26 +2036,73 @@
2033
2036
  }
2034
2037
  }
2035
2038
 
2036
- class RawDeflateToGzipStream extends TransformStream {
2039
+ function pipeThroughGzipDecompressionStream(readable, gzipStream, outputSize) {
2040
+ const crc32 = new Crc32();
2041
+ let outputLength = 0;
2042
+ let inputDone = false;
2043
+ let watchdogTimeout;
2044
+ let resolveTrailerReady, rejectTrailerReady;
2045
+ const trailerReady = new Promise((resolve, reject) => {
2046
+ resolveTrailerReady = resolve;
2047
+ rejectTrailerReady = reject;
2048
+ });
2049
+ trailerReady.catch(() => { });
2050
+ if (!outputSize) {
2051
+ resolveTrailerReady();
2052
+ }
2053
+ const gzipWrapStream = new TransformStream({
2054
+ start(controller) {
2055
+ const header = new Uint8Array(GZIP_HEADER_LENGTH);
2056
+ header.set(GZIP_HEADER_BYTES);
2057
+ controller.enqueue(header);
2058
+ },
2059
+ transform(chunk, controller) {
2060
+ controller.enqueue(chunk);
2061
+ },
2062
+ async flush(controller) {
2063
+ inputDone = true;
2064
+ startWatchdog();
2065
+ try {
2066
+ await trailerReady;
2067
+ } finally {
2068
+ stopWatchdog();
2069
+ }
2070
+ const trailer = new Uint8Array(GZIP_TRAILER_LENGTH);
2071
+ const dataView = getDataView(trailer);
2072
+ dataView.setUint32(0, crc32.get(), true);
2073
+ dataView.setUint32(4, outputSize, true);
2074
+ controller.enqueue(trailer);
2075
+ },
2076
+ cancel(reason) {
2077
+ rejectTrailerReady(reason);
2078
+ }
2079
+ });
2080
+ const outputStream = new TransformStream({
2081
+ transform(chunk, controller) {
2082
+ crc32.append(chunk);
2083
+ outputLength += chunk.length;
2084
+ if (outputLength >= outputSize) {
2085
+ resolveTrailerReady();
2086
+ } else if (inputDone) {
2087
+ startWatchdog();
2088
+ }
2089
+ controller.enqueue(chunk);
2090
+ },
2091
+ cancel(reason) {
2092
+ rejectTrailerReady(reason);
2093
+ }
2094
+ });
2095
+ readable = pipeThrough(readable, gzipWrapStream);
2096
+ readable = pipeThroughBackpressured(readable, gzipStream);
2097
+ return pipeThrough(readable, outputStream);
2037
2098
 
2038
- constructor(signature, uncompressedSize) {
2039
- super({
2040
- start(controller) {
2041
- const header = new Uint8Array(GZIP_HEADER_LENGTH);
2042
- header.set(GZIP_HEADER_BYTES);
2043
- controller.enqueue(header);
2044
- },
2045
- transform(chunk, controller) {
2046
- controller.enqueue(chunk);
2047
- },
2048
- flush(controller) {
2049
- const trailer = new Uint8Array(GZIP_TRAILER_LENGTH);
2050
- const dataView = getDataView(trailer);
2051
- dataView.setUint32(0, signature, true);
2052
- dataView.setUint32(4, uncompressedSize, true);
2053
- controller.enqueue(trailer);
2054
- }
2055
- });
2099
+ function startWatchdog() {
2100
+ stopWatchdog();
2101
+ watchdogTimeout = setTimeout(() => rejectTrailerReady(new Error(ERR_INVALID_UNCOMPRESSED_SIZE)), GZIP_OUTPUT_STALL_TIMEOUT);
2102
+ }
2103
+
2104
+ function stopWatchdog() {
2105
+ clearTimeout(watchdogTimeout);
2056
2106
  }
2057
2107
  }
2058
2108
 
@@ -2060,7 +2110,7 @@
2060
2110
 
2061
2111
  constructor(options, { chunkSize, DecompressionStreamZlib, DecompressionStream }) {
2062
2112
  super({});
2063
- const { zipCrypto, encrypted, signed, signature, compressed, useCompressionStream, deflate64, format, compressionMethod, rawBitFlag, outputSize } = options;
2113
+ const { zipCrypto, encrypted, checkCrc32, signature, compressed, useCompressionStream, deflate64, format, compressionMethod, rawBitFlag, outputSize } = options;
2064
2114
  let crc32Stream, decryptionStream;
2065
2115
  let readable = super.readable;
2066
2116
  if (encrypted) {
@@ -2079,7 +2129,7 @@
2079
2129
  try {
2080
2130
  readable = pipeThroughCompressionStream(readable, useCompressionStream, { chunkSize, deflate64 }, DecompressionStream, DecompressionStreamZlib);
2081
2131
  } catch (error) {
2082
- if (deflate64 || (encrypted && !zipCrypto) || signature === UNDEFINED_VALUE || outputSize === UNDEFINED_VALUE) {
2132
+ if (deflate64 || outputSize === UNDEFINED_VALUE) {
2083
2133
  throw error;
2084
2134
  }
2085
2135
  let gzipStream;
@@ -2088,46 +2138,58 @@
2088
2138
  } catch {
2089
2139
  throw error;
2090
2140
  }
2091
- readable = pipeThrough(readable, new RawDeflateToGzipStream(signature, outputSize));
2092
- readable = pipeThroughBackpressured(readable, gzipStream);
2141
+ readable = pipeThroughGzipDecompressionStream(readable, gzipStream, outputSize);
2093
2142
  }
2094
2143
  }
2095
2144
  readable = mapInflateStreamError(readable);
2096
2145
  }
2097
- if ((!encrypted || zipCrypto) && signed) {
2146
+ if (checkCrc32) {
2098
2147
  crc32Stream = new Crc32Stream();
2099
2148
  readable = pipeThrough(readable, crc32Stream);
2100
2149
  }
2101
2150
  setReadable(this, readable, () => {
2102
- if ((!encrypted || zipCrypto) && signed) {
2151
+ if (checkCrc32) {
2103
2152
  const dataViewSignature = new DataView(crc32Stream.value.buffer);
2104
2153
  if (signature != dataViewSignature.getUint32(0, false)) {
2105
- throw new Error(ERR_INVALID_SIGNATURE);
2154
+ throw new Error(ERR_INVALID_CRC32);
2106
2155
  }
2107
2156
  }
2108
2157
  });
2109
2158
  }
2110
2159
  }
2111
2160
 
2112
- const deflateRawSupportByStream = new Map();
2161
+ const formatSupportByStream = new Map();
2113
2162
 
2114
- function supportsDeflateRaw(StreamClass) {
2163
+ function supportsFormat(StreamClass, format) {
2115
2164
  if (!StreamClass) {
2116
2165
  return false;
2117
2166
  }
2118
- let supported = deflateRawSupportByStream.get(StreamClass);
2167
+ let supportByFormat = formatSupportByStream.get(StreamClass);
2168
+ if (!supportByFormat) {
2169
+ supportByFormat = new Map();
2170
+ formatSupportByStream.set(StreamClass, supportByFormat);
2171
+ }
2172
+ let supported = supportByFormat.get(format);
2119
2173
  if (supported === UNDEFINED_VALUE) {
2120
2174
  try {
2121
- new StreamClass(FORMAT_DEFLATE_RAW);
2175
+ new StreamClass(format);
2122
2176
  supported = true;
2123
2177
  } catch {
2124
2178
  supported = false;
2125
2179
  }
2126
- deflateRawSupportByStream.set(StreamClass, supported);
2180
+ supportByFormat.set(format, supported);
2127
2181
  }
2128
2182
  return supported;
2129
2183
  }
2130
2184
 
2185
+ function supportsDeflateRaw(StreamClass) {
2186
+ return supportsFormat(StreamClass, FORMAT_DEFLATE_RAW);
2187
+ }
2188
+
2189
+ function supportsGzip(StreamClass) {
2190
+ return supportsFormat(StreamClass, FORMAT_GZIP);
2191
+ }
2192
+
2131
2193
  function setReadable(stream, readable, flush) {
2132
2194
  readable = pipeThrough(readable, new TransformStream({ flush }));
2133
2195
  Object.defineProperty(stream, "readable", {
@@ -2426,6 +2488,25 @@
2426
2488
  }
2427
2489
  let initModule = () => { };
2428
2490
 
2491
+ async function supportsDeflate(config) {
2492
+ const { CompressionStream: NativeStream, CompressionStreamZlib: ZlibStream } = config;
2493
+ if (ZlibStream && !ZlibStream.requiresModule) {
2494
+ return true;
2495
+ }
2496
+ if (supportsDeflateRaw(NativeStream) || supportsGzip(NativeStream)) {
2497
+ return true;
2498
+ }
2499
+ if (ZlibStream) {
2500
+ try {
2501
+ await initModule(config);
2502
+ return true;
2503
+ } catch {
2504
+ return false;
2505
+ }
2506
+ }
2507
+ return false;
2508
+ }
2509
+
2429
2510
  function resetWebWorkerSupport() {
2430
2511
  webWorkerSupported = UNDEFINED_VALUE;
2431
2512
  }
@@ -2961,7 +3042,7 @@
2961
3042
 
2962
3043
  async function runWorker(stream, workerOptions) {
2963
3044
  const { options, config } = workerOptions;
2964
- const { transferStreams, useWebWorkers, useCompressionStream, compressed, signed, encrypted, format, codecURI } = options;
3045
+ const { transferStreams, useWebWorkers, useCompressionStream, compressed, checkCrc32, computeCrc32, encrypted, format, codecURI } = options;
2965
3046
  const { workerURI, maxWorkers } = config;
2966
3047
  if (format) {
2967
3048
  if (codecURI) {
@@ -2970,7 +3051,7 @@
2970
3051
  await ensureCodecStreams(format, options.codecURI);
2971
3052
  }
2972
3053
  workerOptions.transferStreams = transferStreams || (transferStreams === UNDEFINED_VALUE && config.transferStreams);
2973
- const streamCopy = !compressed && !signed && !encrypted;
3054
+ const streamCopy = !compressed && !checkCrc32 && !computeCrc32 && !encrypted;
2974
3055
  const workerSupported = format === UNDEFINED_VALUE || Boolean(options.codecURI);
2975
3056
  workerOptions.useWebWorkers = !streamCopy && workerSupported && (useWebWorkers || (useWebWorkers === UNDEFINED_VALUE && config.useWebWorkers));
2976
3057
  workerOptions.workerURI = workerOptions.useWebWorkers && workerURI ? workerURI : UNDEFINED_VALUE;
@@ -4194,6 +4275,7 @@
4194
4275
  const PROPERTY_NAME_EXECUTABLE = "executable";
4195
4276
  const PROPERTY_NAME_COMPRESSION_METHOD = "compressionMethod";
4196
4277
  const PROPERTY_NAME_SIGNATURE = "signature";
4278
+ const PROPERTY_NAME_CRC32 = "crc32";
4197
4279
  const PROPERTY_NAME_EXTRA_FIELD = "extraField";
4198
4280
  const PROPERTY_NAME_EXTRA_FIELD_INFOZIP = "extraFieldInfoZip";
4199
4281
  const PROPERTY_NAME_EXTRA_FIELD_UNIX = "extraFieldUnix";
@@ -4242,6 +4324,7 @@
4242
4324
  PROPERTY_NAME_EXECUTABLE,
4243
4325
  PROPERTY_NAME_COMPRESSION_METHOD,
4244
4326
  PROPERTY_NAME_SIGNATURE,
4327
+ PROPERTY_NAME_CRC32,
4245
4328
  PROPERTY_NAME_EXTRA_FIELD,
4246
4329
  PROPERTY_NAME_EXTRA_FIELD_UNIX,
4247
4330
  PROPERTY_NAME_EXTRA_FIELD_INFOZIP,
@@ -4313,6 +4396,8 @@
4313
4396
  const OPTION_CHECK_OVERLAPPING_ENTRY = "checkOverlappingEntry";
4314
4397
  const OPTION_CHECK_AMBIGUITY = "checkAmbiguity";
4315
4398
  const OPTION_CHECK_SIGNATURE = "checkSignature";
4399
+ const OPTION_CHECK_CRC32 = "checkCrc32";
4400
+ const OPTION_CHECK_AUTHENTICATION_CODE = "checkAuthenticationCode";
4316
4401
  const OPTION_USE_WEB_WORKERS = "useWebWorkers";
4317
4402
  const OPTION_USE_COMPRESSION_STREAM = "useCompressionStream";
4318
4403
  const OPTION_TRANSFER_STREAMS = "transferStreams";
@@ -4384,6 +4469,7 @@
4384
4469
  const PROPERTY_NAME_UTF8_SUFFIX = "UTF8";
4385
4470
  const CHARSET_CP437 = "cp437";
4386
4471
  const BITFLAG_AMBIGUITY_MASK = BITFLAG_ENCRYPTED | BITFLAG_DATA_DESCRIPTOR | BITFLAG_LANG_ENCODING_FLAG;
4472
+ const VENDOR_VERSION_AE_1 = 1;
4387
4473
  const ZIP64_PROPERTIES = [
4388
4474
  [PROPERTY_NAME_UNCOMPRESSED_SIZE, MAX_32_BITS],
4389
4475
  [PROPERTY_NAME_COMPRESSED_SIZE, MAX_32_BITS],
@@ -4863,6 +4949,11 @@
4863
4949
  if (deflate64) {
4864
4950
  useCompressionStream = false;
4865
4951
  }
4952
+ const checkCrc32Option = getOptionValue$1(zipEntry, options, OPTION_CHECK_CRC32);
4953
+ const checkCrc32 = (checkCrc32Option === UNDEFINED_VALUE ?
4954
+ getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) :
4955
+ checkCrc32Option) && !passThrough &&
4956
+ (!encrypted || zipCrypto || (extraFieldAES && extraFieldAES.vendorVersion == VENDOR_VERSION_AE_1));
4866
4957
  const workerOptions = {
4867
4958
  options: {
4868
4959
  codecType: CODEC_INFLATE,
@@ -4870,7 +4961,8 @@
4870
4961
  rawPassword,
4871
4962
  zipCrypto,
4872
4963
  encryptionStrength: extraFieldAES && extraFieldAES.strength,
4873
- signed: getOptionValue$1(zipEntry, options, OPTION_CHECK_SIGNATURE) && !passThrough,
4964
+ checkCrc32,
4965
+ checkAuthenticationCode: getOptionValue$1(zipEntry, options, OPTION_CHECK_AUTHENTICATION_CODE),
4874
4966
  passwordVerification: zipCrypto && (dataDescriptor ? ((rawLastModDate >>> 8) & MAX_8_BITS) : ((signature >>> 24) & MAX_8_BITS)),
4875
4967
  outputSize: passThrough ? compressedSize : uncompressedSize,
4876
4968
  signature,
@@ -4986,6 +5078,7 @@
4986
5078
  const compressionMethod = getUint16(dataView, offset + 4);
4987
5079
  Object.assign(directory, {
4988
5080
  signature: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
5081
+ crc32: getUint32(dataView, offset + HEADER_OFFSET_SIGNATURE),
4989
5082
  compressedSize: getUint32(dataView, offset + HEADER_OFFSET_COMPRESSED_SIZE),
4990
5083
  uncompressedSize: getUint32(dataView, offset + HEADER_OFFSET_UNCOMPRESSED_SIZE)
4991
5084
  });
@@ -5087,6 +5180,9 @@
5087
5180
  compressionMethod: getUint16(extraFieldView, 5)
5088
5181
  });
5089
5182
  directory.compressionMethod = extraFieldAES.compressionMethod;
5183
+ if (extraFieldAES.vendorVersion != VENDOR_VERSION_AE_1) {
5184
+ directory.crc32 = UNDEFINED_VALUE;
5185
+ }
5090
5186
  }
5091
5187
 
5092
5188
  function readExtraFieldNTFS(extraFieldNTFS, directory) {
@@ -5105,26 +5201,22 @@
5105
5201
  } catch {
5106
5202
  // ignored
5107
5203
  }
5108
- try {
5109
- if (tag1Data && tag1Data.length == 24) {
5110
- const tag1View = getDataView(tag1Data);
5111
- const rawLastModDate = tag1View.getBigUint64(0, true);
5112
- const rawLastAccessDate = tag1View.getBigUint64(8, true);
5113
- const rawCreationDate = tag1View.getBigUint64(16, true);
5114
- Object.assign(extraFieldNTFS, {
5115
- rawLastModDate,
5116
- rawLastAccessDate,
5117
- rawCreationDate
5118
- });
5119
- const lastModDate = getDateNTFS(rawLastModDate);
5120
- const lastAccessDate = getDateNTFS(rawLastAccessDate);
5121
- const creationDate = getDateNTFS(rawCreationDate);
5122
- const extraFieldData = { lastModDate, lastAccessDate, creationDate };
5123
- Object.assign(extraFieldNTFS, extraFieldData);
5124
- Object.assign(directory, extraFieldData);
5125
- }
5126
- } catch {
5127
- // ignored
5204
+ if (tag1Data && tag1Data.length == 24) {
5205
+ const tag1View = getDataView(tag1Data);
5206
+ const rawLastModDate = tag1View.getBigUint64(0, true);
5207
+ const rawLastAccessDate = tag1View.getBigUint64(8, true);
5208
+ const rawCreationDate = tag1View.getBigUint64(16, true);
5209
+ Object.assign(extraFieldNTFS, {
5210
+ rawLastModDate,
5211
+ rawLastAccessDate,
5212
+ rawCreationDate
5213
+ });
5214
+ const lastModDate = getDateNTFS(rawLastModDate);
5215
+ const lastAccessDate = getDateNTFS(rawLastAccessDate);
5216
+ const creationDate = getDateNTFS(rawCreationDate);
5217
+ const extraFieldData = { lastModDate, lastAccessDate, creationDate };
5218
+ Object.assign(extraFieldNTFS, extraFieldData);
5219
+ Object.assign(directory, extraFieldData);
5128
5220
  }
5129
5221
  }
5130
5222
 
@@ -5427,11 +5519,7 @@
5427
5519
 
5428
5520
  function getDate(timeRaw) {
5429
5521
  const date = (timeRaw & 0xffff0000) >> 16, time = timeRaw & MAX_16_BITS;
5430
- try {
5431
- return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
5432
- } catch {
5433
- // ignored
5434
- }
5522
+ return new Date(1980 + ((date & 0xFE00) >> 9), ((date & 0x01E0) >> 5) - 1, date & 0x001F, (time & 0xF800) >> 11, (time & 0x07E0) >> 5, (time & 0x001F) * 2, 0);
5435
5523
  }
5436
5524
 
5437
5525
  function getDateNTFS(timeRaw) {
@@ -5464,7 +5552,9 @@
5464
5552
  ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND: ERR_EOCDR_LOCATOR_ZIP64_NOT_FOUND,
5465
5553
  ERR_EOCDR_NOT_FOUND: ERR_EOCDR_NOT_FOUND,
5466
5554
  ERR_EXTRAFIELD_ZIP64_NOT_FOUND: ERR_EXTRAFIELD_ZIP64_NOT_FOUND,
5555
+ ERR_INVALID_AUTHENTICATION_CODE: ERR_INVALID_AUTHENTICATION_CODE,
5467
5556
  ERR_INVALID_COMPRESSED_DATA: ERR_INVALID_COMPRESSED_DATA,
5557
+ ERR_INVALID_CRC32: ERR_INVALID_CRC32,
5468
5558
  ERR_INVALID_PASSWORD: ERR_INVALID_PASSWORD,
5469
5559
  ERR_INVALID_SIGNATURE: ERR_INVALID_SIGNATURE,
5470
5560
  ERR_INVALID_UNCOMPRESSED_SIZE: ERR_INVALID_UNCOMPRESSED_SIZE,
@@ -5518,6 +5608,8 @@
5518
5608
  const ERR_UNSUPPORTED_COMPRESSION = "Compression method not supported";
5519
5609
  const MIN_UNIX_TIME = -2147483648;
5520
5610
  const MAX_UNIX_TIME = 2147483647;
5611
+ const MIN_NTFS_TIME = BigInt(0);
5612
+ const MAX_NTFS_TIME = BigInt("0x7fffffffffffffff");
5521
5613
  const ERR_UNSUPPORTED_FORMAT = "Zip64 is not supported (set the 'zip64' option to 'true')";
5522
5614
  const ERR_UNDEFINED_UNCOMPRESSED_SIZE = "Undefined uncompressed size";
5523
5615
  const ERR_UNDEFINED_READER = "Undefined reader";
@@ -5799,6 +5891,11 @@
5799
5891
  zipWriter.files.set(name, UNDEFINED_VALUE);
5800
5892
  let fileEntry;
5801
5893
  try {
5894
+ const { resolvedOptions } = metadataInfo;
5895
+ if (resolvedOptions.level != 0 && resolvedOptions.compressionMethod === UNDEFINED_VALUE &&
5896
+ !resolvedOptions.passThrough && !(await supportsDeflate(zipWriter.config))) {
5897
+ resolvedOptions.level = 0;
5898
+ }
5802
5899
  const sizesInfo = await resolveSizes(zipWriter, reader, metadataInfo, options);
5803
5900
  ({ reader } = sizesInfo);
5804
5901
  const diskOffset = getDiskOffset(zipWriter.writer);
@@ -6019,9 +6116,6 @@
6019
6116
  if (level !== UNDEFINED_VALUE && level != 6) {
6020
6117
  useCompressionStream = false;
6021
6118
  }
6022
- if (!useCompressionStream && !registeredCodec && (zipWriter.config.CompressionStream === UNDEFINED_VALUE && zipWriter.config.CompressionStreamZlib === UNDEFINED_VALUE)) {
6023
- level = 0;
6024
- }
6025
6119
  const zip64 = getOptionValue(zipWriter, options, PROPERTY_NAME_ZIP64);
6026
6120
  if (!zipCrypto && (password !== UNDEFINED_VALUE || rawPassword !== UNDEFINED_VALUE) && !(encryptionStrength >= 1 && encryptionStrength <= 3)) {
6027
6121
  throw new Error(ERR_INVALID_ENCRYPTION_STRENGTH);
@@ -6409,9 +6503,12 @@
6409
6503
  msdosAttributes
6410
6504
  };
6411
6505
  let {
6412
- signature,
6506
+ crc32: signature,
6413
6507
  uncompressedSize
6414
6508
  } = options;
6509
+ if (signature === UNDEFINED_VALUE) {
6510
+ ({ signature } = options);
6511
+ }
6415
6512
  let compressedSize = 0;
6416
6513
  if (!passThrough) {
6417
6514
  uncompressedSize = 0;
@@ -6429,7 +6526,7 @@
6429
6526
  encryptionStrength,
6430
6527
  zipCrypto: encrypted && zipCrypto,
6431
6528
  passwordVerification: encrypted && zipCrypto && (rawLastModDate >> 8) & MAX_8_BITS,
6432
- signed: !passThrough,
6529
+ computeCrc32: !passThrough,
6433
6530
  compressed: compressed && !passThrough,
6434
6531
  encrypted: encrypted && !passThrough,
6435
6532
  useWebWorkers,
@@ -6448,7 +6545,9 @@
6448
6545
  writer.size += compressedSize;
6449
6546
  if (!passThrough) {
6450
6547
  uncompressedSize = result.inputSize;
6451
- signature = result.signature;
6548
+ if (!encrypted || zipCrypto) {
6549
+ signature = result.signature;
6550
+ }
6452
6551
  }
6453
6552
  if ((!zip64CompressedSize && compressedSize >= MAX_32_BITS) ||
6454
6553
  (!zip64UncompressedSize && uncompressedSize >= MAX_32_BITS)) {
@@ -6487,6 +6586,7 @@
6487
6586
  headerArray,
6488
6587
  headerView,
6489
6588
  signature,
6589
+ crc32: encrypted && !zipCrypto ? UNDEFINED_VALUE : signature,
6490
6590
  extraFieldExtendedTimestampFlag,
6491
6591
  zip64UncompressedSize,
6492
6592
  zip64CompressedSize
@@ -6587,8 +6687,8 @@
6587
6687
  extraFieldNTFS.uint16(EXTRAFIELD_TYPE_NTFS_TAG1);
6588
6688
  extraFieldNTFS.uint16(24);
6589
6689
  extraFieldNTFS.uint64(lastModTimeNTFS);
6590
- extraFieldNTFS.uint64(getTimeNTFS(lastAccessDate) || lastModTimeNTFS);
6591
- extraFieldNTFS.uint64(getTimeNTFS(creationDate) || lastModTimeNTFS);
6690
+ extraFieldNTFS.uint64(lastAccessDate ? getTimeNTFS(lastAccessDate) : lastModTimeNTFS);
6691
+ extraFieldNTFS.uint64(creationDate ? getTimeNTFS(creationDate) : lastModTimeNTFS);
6592
6692
  rawExtraFieldNTFS = extraFieldNTFS.array;
6593
6693
  } catch {
6594
6694
  rawExtraFieldNTFS = EMPTY_UINT8_ARRAY;
@@ -6648,7 +6748,7 @@
6648
6748
  if (extraFieldLength > MAX_16_BITS) {
6649
6749
  throw new Error(ERR_INVALID_EXTRAFIELD_DATA);
6650
6750
  }
6651
- const dosLastModDate = new Date(Math.ceil(lastModDate.getTime() / 2000) * 2000);
6751
+ const dosLastModDate = new Date(Math.ceil(Math.floor(lastModDate.getTime() / 1000) / 2) * 2000);
6652
6752
  const {
6653
6753
  headerArray,
6654
6754
  headerView,
@@ -7157,7 +7257,8 @@
7157
7257
 
7158
7258
  function getTimeNTFS(date) {
7159
7259
  if (date) {
7160
- return ((BigInt(date.getTime()) + BigInt(11644473600000)) * BigInt(10000));
7260
+ const timeNTFS = ((BigInt(date.getTime()) + BigInt(11644473600000)) * BigInt(10000));
7261
+ return timeNTFS < MIN_NTFS_TIME ? MIN_NTFS_TIME : timeNTFS > MAX_NTFS_TIME ? MAX_NTFS_TIME : timeNTFS;
7161
7262
  }
7162
7263
  }
7163
7264
 
@@ -10484,10 +10585,12 @@
10484
10585
  exports.ERR_EXTRAFIELD_ZIP64_NOT_FOUND = ERR_EXTRAFIELD_ZIP64_NOT_FOUND;
10485
10586
  exports.ERR_HTTP_RANGE = ERR_HTTP_RANGE;
10486
10587
  exports.ERR_HTTP_RESOURCE_CHANGED = ERR_HTTP_RESOURCE_CHANGED;
10588
+ exports.ERR_INVALID_AUTHENTICATION_CODE = ERR_INVALID_AUTHENTICATION_CODE;
10487
10589
  exports.ERR_INVALID_CODEC_DEFINITION = ERR_INVALID_CODEC_DEFINITION;
10488
10590
  exports.ERR_INVALID_CODEC_MODULE = ERR_INVALID_CODEC_MODULE;
10489
10591
  exports.ERR_INVALID_COMMENT = ERR_INVALID_COMMENT;
10490
10592
  exports.ERR_INVALID_COMPRESSED_DATA = ERR_INVALID_COMPRESSED_DATA;
10593
+ exports.ERR_INVALID_CRC32 = ERR_INVALID_CRC32;
10491
10594
  exports.ERR_INVALID_ENCRYPTION_STRENGTH = ERR_INVALID_ENCRYPTION_STRENGTH;
10492
10595
  exports.ERR_INVALID_ENTRY_COMMENT = ERR_INVALID_ENTRY_COMMENT;
10493
10596
  exports.ERR_INVALID_ENTRY_NAME = ERR_INVALID_ENTRY_NAME;