77<!-- source_link=lib/zlib.js -->
88
99The ` node:zlib ` module provides compression functionality implemented using
10- Gzip, Deflate/Inflate, and Brotli .
10+ Gzip, Deflate/Inflate, Brotli, and Zstd .
1111
1212To access it:
1313
@@ -220,8 +220,8 @@ operations be cached to avoid duplication of effort.
220220
221221## Compressing HTTP requests and responses
222222
223- The ` node:zlib ` module can be used to implement support for the ` gzip ` , ` deflate `
224- and ` br ` content-encoding mechanisms defined by
223+ The ` node:zlib ` module can be used to implement support for the ` gzip ` , ` deflate ` ,
224+ ` br ` , and ` zstd ` content-encoding mechanisms defined by
225225[ HTTP] ( https://tools.ietf.org/html/rfc7230#section-4.2 ) .
226226
227227The HTTP [ ` Accept-Encoding ` ] [ ] header is used within an HTTP request to identify
@@ -284,7 +284,7 @@ const { pipeline } = require('node:stream');
284284const request = http .get ({ host: ' example.com' ,
285285 path: ' /' ,
286286 port: 80 ,
287- headers: { ' Accept-Encoding' : ' br,gzip,deflate' } });
287+ headers: { ' Accept-Encoding' : ' br,gzip,deflate,zstd ' } });
288288request .on (' response' , (response ) => {
289289 const output = fs .createWriteStream (' example.com_index.html' );
290290
@@ -306,6 +306,9 @@ request.on('response', (response) => {
306306 case ' deflate' :
307307 pipeline (response, zlib .createInflate (), output, onError);
308308 break ;
309+ case ' zstd' :
310+ pipeline (response, zlib .createZstdDecompress (), output, onError);
311+ break ;
309312 default :
310313 pipeline (response, output, onError);
311314 break ;
@@ -396,6 +399,9 @@ http.createServer((request, response) => {
396399 } else if (/ \b br\b / .test (acceptEncoding)) {
397400 response .writeHead (200 , { ' Content-Encoding' : ' br' });
398401 pipeline (raw, zlib .createBrotliCompress (), response, onError);
402+ } else if (/ \b zstd\b / .test (acceptEncoding)) {
403+ response .writeHead (200 , { ' Content-Encoding' : ' zstd' });
404+ pipeline (raw, zlib .createZstdCompress (), response, onError);
399405 } else {
400406 response .writeHead (200 , {});
401407 pipeline (raw, response, onError);
@@ -416,6 +422,7 @@ const buffer = Buffer.from('eJzT0yMA', 'base64');
416422zlib .unzip (
417423 buffer,
418424 // For Brotli, the equivalent is zlib.constants.BROTLI_OPERATION_FLUSH.
425+ // For Zstd, the equivalent is zlib.constants.ZSTD_e_flush.
419426 { finishFlush: zlib .constants .Z_SYNC_FLUSH },
420427 (err , buffer ) => {
421428 if (err) {
@@ -487,6 +494,16 @@ these options have different ranges than the zlib ones:
487494
488495See [ below] [ Brotli parameters ] for more details on Brotli-specific options.
489496
497+ ### For Zstd-based streams
498+
499+ There are equivalents to the zlib options for Zstd-based streams, although
500+ these options have different ranges than the zlib ones:
501+
502+ * zlib's ` level ` option matches Zstd's ` ZSTD_c_compressionLevel ` option.
503+ * zlib's ` windowBits ` option matches Zstd's ` ZSTD_c_windowLog ` option.
504+
505+ See [ below] [ Zstd parameters ] for more details on Zstd-specific options.
506+
490507## Flushing
491508
492509Calling [ ` .flush() ` ] [ ] on a compression stream will make ` zlib ` return as much
@@ -701,6 +718,50 @@ These advanced options are available for controlling decompression:
701718 * Boolean flag enabling “Large Window Brotli” mode (not compatible with the
702719 Brotli format as standardized in [ RFC 7932] [ ] ).
703720
721+ ### Zstd constants
722+
723+ <!-- YAML
724+ added: REPLACEME
725+ -->
726+
727+ There are several options and other constants available for Zstd-based
728+ streams:
729+
730+ #### Flush operations
731+
732+ The following values are valid flush operations for Zstd-based streams:
733+
734+ * ` zlib.constants.ZSTD_e_continue ` (default for all operations)
735+ * ` zlib.constants.ZSTD_e_flush ` (default when calling ` .flush() ` )
736+ * ` zlib.constants.ZSTD_e_end ` (default for the last chunk)
737+
738+ #### Compressor options
739+
740+ There are several options that can be set on Zstd encoders, affecting
741+ compression efficiency and speed. Both the keys and the values can be accessed
742+ as properties of the ` zlib.constants ` object.
743+
744+ The most important options are:
745+
746+ * ` ZSTD_c_compressionLevel `
747+ * Set compression parameters according to pre-defined cLevel table. Default
748+ level is ZSTD\_ CLEVEL\_ DEFAULT==3.
749+
750+ #### Pledged Source Size
751+
752+ It's possible to specify the expected total size of the uncompressed input via
753+ ` opts.pledgedSrcSize ` . If the size doesn't match at the end of the input,
754+ compression will fail with the code ` ZSTD_error_srcSize_wrong ` .
755+
756+ #### Decompressor options
757+
758+ These advanced options are available for controlling decompression:
759+
760+ * ` ZSTD_d_windowLogMax `
761+ * Select a size limit (in power of 2) beyond which the streaming API will
762+ refuse to allocate memory buffer in order to protect the host from
763+ unreasonable memory requirements.
764+
704765## Class: ` Options `
705766
706767<!-- YAML
@@ -962,6 +1023,51 @@ added: v0.7.0
9621023Reset the compressor/decompressor to factory defaults. Only applicable to
9631024the inflate and deflate algorithms.
9641025
1026+ ## Class: ` ZstdOptions `
1027+
1028+ <!-- YAML
1029+ added: REPLACEME
1030+ -->
1031+
1032+ <!-- type=misc-->
1033+
1034+ Each Zstd-based class takes an ` options ` object. All options are optional.
1035+
1036+ * ` flush ` {integer} ** Default:** ` zlib.constants.ZSTD_e_continue `
1037+ * ` finishFlush ` {integer} ** Default:** ` zlib.constants.ZSTD_e_end `
1038+ * ` chunkSize ` {integer} ** Default:** ` 16 * 1024 `
1039+ * ` params ` {Object} Key-value object containing indexed [ Zstd parameters] [ ] .
1040+ * ` maxOutputLength ` {integer} Limits output size when using
1041+ [ convenience methods] [ ] . ** Default:** [ ` buffer.kMaxLength ` ] [ ]
1042+
1043+ For example:
1044+
1045+ ``` js
1046+ const stream = zlib .createZstdCompress ({
1047+ chunkSize: 32 * 1024 ,
1048+ params: {
1049+ [zlib .constants .ZSTD_c_compressionLevel ]: 10 ,
1050+ [zlib .constants .ZSTD_c_checksumFlag ]: 1 ,
1051+ },
1052+ });
1053+ ```
1054+
1055+ ## Class: ` zlib.ZstdCompress `
1056+
1057+ <!-- YAML
1058+ added: REPLACEME
1059+ -->
1060+
1061+ Compress data using the Zstd algorithm.
1062+
1063+ ## Class: ` zlib.ZstdDecompress `
1064+
1065+ <!-- YAML
1066+ added: REPLACEME
1067+ -->
1068+
1069+ Decompress data using the Zstd algorithm.
1070+
9651071## ` zlib.constants `
9661072
9671073<!-- YAML
@@ -1135,6 +1241,26 @@ added: v0.5.8
11351241
11361242Creates and returns a new [ ` Unzip ` ] [ ] object.
11371243
1244+ ## ` zlib.createZstdCompress([options]) `
1245+
1246+ <!-- YAML
1247+ added: REPLACEME
1248+ -->
1249+
1250+ * ` options ` {zstd options}
1251+
1252+ Creates and returns a new [ ` ZstdCompress ` ] [ ] object.
1253+
1254+ ## ` zlib.createZstdDecompress([options]) `
1255+
1256+ <!-- YAML
1257+ added: REPLACEME
1258+ -->
1259+
1260+ * ` options ` {zstd options}
1261+
1262+ Creates and returns a new [ ` ZstdDecompress ` ] [ ] object.
1263+
11381264## Convenience methods
11391265
11401266<!-- type=misc-->
@@ -1481,11 +1607,54 @@ changes:
14811607
14821608Decompress a chunk of data with [ ` Unzip ` ] [ ] .
14831609
1610+ ### ` zlib.zstdCompress(buffer[, options], callback) `
1611+
1612+ <!-- YAML
1613+ added: REPLACEME
1614+ -->
1615+
1616+ * ` buffer ` {Buffer|TypedArray|DataView|ArrayBuffer|string}
1617+ * ` options ` {zstd options}
1618+ * ` callback ` {Function}
1619+
1620+ ### ` zlib.zstdCompressSync(buffer[, options]) `
1621+
1622+ <!-- YAML
1623+ added: REPLACEME
1624+ -->
1625+
1626+ * ` buffer ` {Buffer|TypedArray|DataView|ArrayBuffer|string}
1627+ * ` options ` {zstd options}
1628+
1629+ Compress a chunk of data with [ ` ZstdCompress ` ] [ ] .
1630+
1631+ ### ` zlib.zstdDecompress(buffer[, options], callback) `
1632+
1633+ <!-- YAML
1634+ added: REPLACEME
1635+ -->
1636+
1637+ * ` buffer ` {Buffer|TypedArray|DataView|ArrayBuffer|string}
1638+ * ` options ` {zstd options}
1639+ * ` callback ` {Function}
1640+
1641+ ### ` zlib.zstdDecompressSync(buffer[, options]) `
1642+
1643+ <!-- YAML
1644+ added: REPLACEME
1645+ -->
1646+
1647+ * ` buffer ` {Buffer|TypedArray|DataView|ArrayBuffer|string}
1648+ * ` options ` {zstd options}
1649+
1650+ Decompress a chunk of data with [ ` ZstdDecompress ` ] [ ] .
1651+
14841652[ Brotli parameters ] : #brotli-constants
14851653[ Cyclic redundancy check ] : https://en.wikipedia.org/wiki/Cyclic_redundancy_check
14861654[ Memory usage tuning ] : #memory-usage-tuning
14871655[ RFC 7932 ] : https://www.rfc-editor.org/rfc/rfc7932.txt
14881656[ Streams API ] : stream.md
1657+ [ Zstd parameters ] : #zstd-constants
14891658[ `.flush()` ] : #zlibflushkind-callback
14901659[ `Accept-Encoding` ] : https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
14911660[ `BrotliCompress` ] : #class-zlibbrotlicompress
@@ -1498,6 +1667,8 @@ Decompress a chunk of data with [`Unzip`][].
14981667[ `InflateRaw` ] : #class-zlibinflateraw
14991668[ `Inflate` ] : #class-zlibinflate
15001669[ `Unzip` ] : #class-zlibunzip
1670+ [ `ZstdCompress` ] : #class-zlibzstdcompress
1671+ [ `ZstdDecompress` ] : #class-zlibzstddecompress
15011672[ `buffer.kMaxLength` ] : buffer.md#bufferkmaxlength
15021673[ `deflateInit2` and `inflateInit2` ] : https://zlib.net/manual.html#Advanced
15031674[ `stream.Transform` ] : stream.md#class-streamtransform
0 commit comments