stream: add brotli support to CompressionStream and DecompressionStream

Refs: https://github.com/whatwg/compression/issues/34
PR-URL: https://github.com/nodejs/node/pull/59464
Reviewed-By: Mattias Buelens <mattias@buelens.com>
Reviewed-By: Jason Zhang <xzha4350@gmail.com>
Reviewed-By: Ethan Arrowood <ethan@arrowood.dev>
This commit is contained in:
Khafra 2025-08-20 22:22:19 -04:00 committed by GitHub
parent 3e1ae63451
commit 44d9e6d8ad
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 24 additions and 5 deletions

View File

@ -330,6 +330,9 @@ with the [`--no-experimental-websocket`][] CLI flag.
<!-- YAML
added: v18.0.0
changes:
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/59464
description: format now accepts `brotli` value.
- version:
- v23.11.0
- v22.15.0
@ -445,6 +448,9 @@ A browser-compatible implementation of {CustomEvent}.
<!-- YAML
added: v18.0.0
changes:
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/59464
description: format now accepts `brotli` value.
- version:
- v23.11.0
- v22.15.0

View File

@ -1480,6 +1480,9 @@ changes:
<!-- YAML
added: v17.0.0
changes:
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/59464
description: format now accepts `brotli` value.
- version:
- v21.2.0
- v20.12.0
@ -1487,7 +1490,7 @@ changes:
description: format now accepts `deflate-raw` value.
-->
* `format` {string} One of `'deflate'`, `'deflate-raw'`, or `'gzip'`.
* `format` {string} One of `'deflate'`, `'deflate-raw'`, `'gzip'`, or `'brotli'`.
#### `compressionStream.readable`
@ -1520,6 +1523,9 @@ changes:
<!-- YAML
added: v17.0.0
changes:
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/59464
description: format now accepts `brotli` value.
- version:
- v21.2.0
- v20.12.0
@ -1527,7 +1533,7 @@ changes:
description: format now accepts `deflate-raw` value.
-->
* `format` {string} One of `'deflate'`, `'deflate-raw'`, or `'gzip'`.
* `format` {string} One of `'deflate'`, `'deflate-raw'`, `'gzip'`, or `'brotli'`.
#### `decompressionStream.readable`

View File

@ -28,6 +28,7 @@ const formatConverter = createEnumConverter('CompressionFormat', [
'deflate',
'deflate-raw',
'gzip',
'brotli',
]);
/**
@ -40,7 +41,7 @@ class CompressionStream {
#transform;
/**
* @param {'deflate'|'deflate-raw'|'gzip'} format
* @param {'deflate'|'deflate-raw'|'gzip'|'brotli'} format
*/
constructor(format) {
format = formatConverter(format, {
@ -57,6 +58,9 @@ class CompressionStream {
case 'gzip':
this.#handle = lazyZlib().createGzip();
break;
case 'brotli':
this.#handle = lazyZlib().createBrotliCompress();
break;
}
this.#transform = newReadableWritablePairFromDuplex(this.#handle);
}
@ -90,7 +94,7 @@ class DecompressionStream {
#transform;
/**
* @param {'deflate'|'deflate-raw'|'gzip'} format
* @param {'deflate'|'deflate-raw'|'gzip'|'brotli'} format
*/
constructor(format) {
format = formatConverter(format, {
@ -111,6 +115,9 @@ class DecompressionStream {
rejectGarbageAfterEnd: true,
});
break;
case 'brotli':
this.#handle = lazyZlib().createBrotliDecompress();
break;
}
this.#transform = newReadableWritablePairFromDuplex(this.#handle);

View File

@ -41,7 +41,7 @@ async function test(format) {
]);
}
Promise.all(['gzip', 'deflate', 'deflate-raw'].map((i) => test(i))).then(common.mustCall());
Promise.all(['gzip', 'deflate', 'deflate-raw', 'brotli'].map((i) => test(i))).then(common.mustCall());
[1, 'hello', false, {}].forEach((i) => {
assert.throws(() => new CompressionStream(i), {