GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing nodejs.org — Zlib | Node.js v26.13.1 Documentation Skip to content
Zlib#Source Code: lib/zlib.js Stability: 2 - Stable The To access it:
Compression and decompression are built around the Node.js Streams API. Compressing or decompressing a stream (such as a file) can be accomplished by
piping the source stream through a
Or, using the promise
It is also possible to compress or decompress data in a single step:
Threadpool usage and performance considerations#All Creating and using a large number of zlib objects simultaneously can cause significant memory fragmentation.
In the preceding example, 30,000 deflate instances are created concurrently. Because of how some operating systems handle memory allocation and deallocation, this may lead to significant memory fragmentation. It is strongly recommended that the results of compression operations be cached to avoid duplication of effort. Compressing HTTP requests and responses#The The HTTP The examples given below are drastically simplified to show the basic concept.
Using
By default, the
This will not change the behavior in other error-throwing situations, e.g. when the input data has an invalid format. Using this method, it will not be possible to determine whether the input ended prematurely or lacks the integrity checks, making it necessary to manually check that the decompressed result is valid. Memory usage tuning#For zlib-based streams#From The memory requirements for deflate are (in bytes):
That is: 128K for For example, to reduce the default memory requirements from 256K to 128K, the options should be set to:
This will, however, generally degrade compression. The memory requirements for inflate are (in bytes) This is in addition to a single internal output slab buffer of size
The speed of In general, greater memory usage options will mean that Node.js has to make
fewer calls to For Brotli-based streams#There are equivalents to the zlib options for Brotli-based streams, although these options have different ranges than the zlib ones:
See below for more details on Brotli-specific options. For Zstd-based streams#Stability: 1 - Experimental There are equivalents to the zlib options for Zstd-based streams, although these options have different ranges than the zlib ones:
See below for more details on Zstd-specific options. Flushing#Calling In the following example,
Constants#Added in: v0.5.8 zlib constants#All of the constants defined in Previously, the constants were available directly from Allowed flush values.
Return codes for the compression/decompression functions. Negative values are errors, positive values are used for special but normal events.
Compression levels.
Compression strategy.
Brotli constants#Added in: v11.7.0, v10.16.0 There are several options and other constants available for Brotli-based streams: Flush operations#The following values are valid flush operations for Brotli-based streams:
Compressor options#There are several options that can be set on Brotli encoders, affecting
compression efficiency and speed. Both the keys and the values can be accessed
as properties of the The most important options are:
The following flags can be set for advanced control over the compression algorithm and memory usage tuning:
Decompressor options#These advanced options are available for controlling decompression:
Zstd constants#Added in: v23.8.0, v22.15.0 Stability: 1 - Experimental There are several options and other constants available for Zstd-based streams: Flush operations#The following values are valid flush operations for Zstd-based streams:
Compressor options#There are several options that can be set on Zstd encoders, affecting
compression efficiency and speed. Both the keys and the values can be accessed
as properties of the The most important options are:
Strategy options#The following constants can be used as values for the
Example:
Pledged Source Size#It's possible to specify the expected total size of the uncompressed input via
Decompressor options#These advanced options are available for controlling decompression:
Class: |
| Version | Changes |
|---|---|
| v26.5.0 | The |
| v14.5.0, v12.19.0 | The |
| v9.4.0 | The |
| v8.0.0 | The |
| v5.11.0 | The |
Each zlib-based class takes an options object. No options are required.
Some options are only relevant when compressing and are ignored by the decompression classes.
flush <integer> Default: zlib.constants.Z_NO_FLUSHfinishFlush <integer> Default: zlib.constants.Z_FINISHchunkSize <integer> Default: 16 * 1024windowBits <integer>level <integer> (compression only)memLevel <integer> (compression only)strategy <integer> (compression only)dictionary <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> (deflate/inflate only,
empty dictionary by default)info <boolean> (If true, returns an object with buffer and engine.)maxOutputLength <integer> Limits output size when using convenience methods. Default: buffer.kMaxLengthrejectGarbageAfterEnd <boolean> If true, decompression fails when
trailing input is detected after the end of the compressed stream. This
includes unreadable bytes and, when decompressing gzip, additional gzip
members following the first member. Default: falseSee the deflateInit2 and inflateInit2 documentation for more
information.
BrotliOptions#| Version | Changes |
|---|---|
| v26.5.0 | The |
| v14.5.0, v12.19.0 | The |
Each Brotli-based class takes an options object. All options are optional.
flush <integer> Default: zlib.constants.BROTLI_OPERATION_PROCESSfinishFlush <integer> Default: zlib.constants.BROTLI_OPERATION_FINISHchunkSize <integer> Default: 16 * 1024params <Object> Key-value object containing indexed Brotli parameters.maxOutputLength <integer> Limits output size when using convenience methods. Default: buffer.kMaxLengthinfo <boolean> If true, returns an object with buffer and engine. Default: falserejectGarbageAfterEnd <boolean> If true, decompression fails when
input remains after the first complete compressed stream. Default: falseFor example:
const stream = zlib.createBrotliCompress({ chunkSize: 32 * 1024, params: { [zlib.constants.BROTLI_PARAM_MODE]: zlib.constants.BROTLI_MODE_TEXT, [zlib.constants.BROTLI_PARAM_QUALITY]: 4, [zlib.constants.BROTLI_PARAM_SIZE_HINT]: fs.statSync(inputFile).size, }, });js
zlib.BrotliCompress#ZlibBaseCompress data using the Brotli algorithm.
zlib.BrotliDecompress#ZlibBaseDecompress data using the Brotli algorithm.
zlib.Deflate#ZlibBaseCompress data using deflate.
zlib.DeflateRaw#ZlibBaseCompress data using deflate, and do not append a zlib header.
zlib.Gunzip#| Version | Changes |
|---|---|
| v6.0.0 | Trailing garbage at the end of the input stream will now result in an |
| v5.9.0 | Multiple concatenated gzip file members are supported now. |
| v5.0.0 | A truncated input stream will now result in an |
ZlibBaseDecompress a gzip stream.
zlib.Gzip#ZlibBaseCompress data using gzip.
zlib.Inflate#| Version | Changes |
|---|---|
| v5.0.0 | A truncated input stream will now result in an |
ZlibBaseDecompress a deflate stream.
zlib.InflateRaw#| Version | Changes |
|---|---|
| v6.8.0 | Custom dictionaries are now supported by |
| v5.0.0 | A truncated input stream will now result in an |
ZlibBaseDecompress a raw deflate stream.
zlib.Unzip#ZlibBaseDecompress either a Gzip- or Deflate-compressed stream by auto-detecting the header.
zlib.ZipBuffer#Stability: 1.0 - Early development
The ZIP archive API is experimental. Using any part of it (this class among
them) emits an experimental warning the first time; merely importing
node:zlib does not.
An in-memory, zero-copy view over the entries of a ZIP archive already
held in a Buffer, TypedArray, DataView, or ArrayBuffer. Its set of
entries can be edited - entries added or removed - but, unlike ZipFile,
those edits are not written into the source buffer: a newly added entry is
held as a separate in-memory ZipEntry (the passed buffer is a fixed-size
view with no room to append to), and removal just drops the entry from
ZipBuffer's index. The original bytes are never modified.
zipBuffer.toBuffer() serializes the current set of entries into a fresh
archive.
ZipBuffer does not copy the archive you hand it. It keeps a view onto that
memory and reads each entry's content lazily and directly from it, which is
what makes construction cheap regardless of archive size. The trade-off is
that you must not modify or reuse that memory - including the
ArrayBuffer backing a TypedArray/DataView - while the ZipBuffer, or
any ZipEntry obtained from it, is still in use: a later read would
observe the change and may fail or return corrupt data. Pass a copy (for
example Buffer.from(source)) if the source might be mutated or reused.
add() and toBuffer() each have a *Sync counterpart
(addSync(), toBufferSync())
that performs the same compression work synchronously. As with the
synchronous node:fs APIs, these block the Node.js event loop and further
JavaScript execution until the operation completes; use them only where
synchronous execution is appropriate (for example, short-lived scripts or
startup code), not in code that must stay responsive.
import { ZipBuffer } from 'node:zlib'; import { readFileSync, writeFileSync } from 'node:fs'; import { Buffer } from 'node:buffer'; const zip = new ZipBuffer(readFileSync('archive.zip')); for (const [name, entry] of zip) { console.log(name, entry.size); } await zip.add('hello.txt', Buffer.from('Hello, world!')); zip.delete('unwanted.txt'); writeFileSync('archive.zip', await zip.toBuffer());const { ZipBuffer } = require('node:zlib'); const { readFileSync, writeFileSync } = require('node:fs'); async function main() { const zip = new ZipBuffer(readFileSync('archive.zip')); for (const [name, entry] of zip) { console.log(name, entry.size); } await zip.add('hello.txt', Buffer.from('Hello, world!')); zip.delete('unwanted.txt'); writeFileSync('archive.zip', await zip.toBuffer()); } main();javascript
new zlib.ZipBuffer(buffer)#buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> A complete ZIP archive.Parses the archive's central directory. Throws an ERR_ZIP_INVALID_ARCHIVE
or ERR_ZIP_UNSUPPORTED_FEATURE error if buffer is not a well-formed,
supported archive.
buffer is not copied: the ZipBuffer retains a zero-copy view of it (for
a TypedArray, DataView, or ArrayBuffer, of the underlying ArrayBuffer)
and reads entry content directly from it on demand. Do not mutate or reuse that
memory while the ZipBuffer or any entry read from it is still live; pass a
copy if it might change.
zipBuffer.add(filename, data[, options])#filename <string> The entry's name within the archive. A trailing /
marks a directory entry.data <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> The entry's complete,
uncompressed content.options <Object> See zlib.ZipEntry.create().<Promise> Fulfilled with the created <ZipEntry>.Equivalent to zipBuffer.addEntry(await zlib.ZipEntry.create(filename, data, options)).
zipBuffer.addSync(filename, data[, options])#filename <string> The entry's name within the archive. A trailing /
marks a directory entry.data <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> The entry's complete,
uncompressed content.options <Object> See zlib.ZipEntry.createSync().<ZipEntry> The created entry.The synchronous version of zipBuffer.add(). Equivalent to
zipBuffer.addEntry(zlib.ZipEntry.createSync(filename, data, options)).
zipBuffer.addEntry(entry)#entry <ZipEntry><ZipEntry> entry.Adds an already-built entry, keyed by its own zipEntry.name. Replaces
any existing entry of that name.
zipBuffer.clear()#Removes every entry.
zipBuffer.comment#<string>The archive-level comment, preserved byte-for-byte across
zipBuffer.toBuffer() calls unless overridden. The bytes are decoded as
UTF-8 when they are valid UTF-8 and as CP437 otherwise (the field carries no
encoding flag of its own).
zipBuffer.delete(name)#zipBuffer.entries()#<Iterator> of [name, entry] pairs, where entry is a
ZipEntry.zipBuffer.forEach(callback[, thisArg])#callback <Function>thisArg <any>Calls callback once for each entry, in the order the archive lists them.
zipBuffer.get(name)#name <string><ZipEntry>Throws ERR_ZIP_ENTRY_NOT_FOUND if the archive has no entry named name.
zipBuffer.has(name)#zipBuffer.keys()#<Iterator> of entry names.zipBuffer.size#<number>The number of entries in the archive.
zipBuffer.toBuffer([options])#options <string> | <Object> An archive comment, as a shorthand for { comment: options }.
comment <string> An archive comment. Default: zipBuffer.comment.baseOffset <number> Shifts every offset the archive records by this
many bytes, so the serialized archive is self-describing even when it is
written somewhere other than the start of its eventual file - for example,
after baseOffset bytes of other content already written to the same
output. Default: 0.<Promise> Fulfilled with a <Buffer> containing the serialized
archive.Serializes the current set of entries - in the order they were added or
read - into a fresh archive, switching to Zip64 structures automatically as
needed (see zlib.createZipArchive()).
zipBuffer.toBufferSync([options])#options <string> | <Object> See zipBuffer.toBuffer().<Buffer> The serialized archive.The synchronous version of zipBuffer.toBuffer() (see
zlib.createZipArchiveSync()).
zipBuffer.values()#<Iterator> of ZipEntry.zipBuffer.writable#<boolean>Always true.
zlib.ZipEntry#Stability: 1.0 - Early development
The ZIP archive API is experimental. Using any part of it (this class among
them) emits an experimental warning the first time; merely importing
node:zlib does not.
A single file or directory inside a ZIP archive. Instances are produced by
ZipBuffer and ZipFile, or created directly for writing with
ZipEntry.create()/ZipEntry.createStream().
create() and content() each have a *Sync counterpart (the streaming
contentIterator() does not). As with the synchronous node:fs APIs, these
block the
Node.js event loop and further JavaScript execution until the operation
(including any deflate/inflate pass) completes; use them only where
synchronous execution is appropriate (for example, short-lived scripts or
startup code), not in code that must stay responsive.
zlib.ZipEntry.create(filename, data[, options])#filename <string> The entry's name within the archive. A trailing /
marks a directory entry.data <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> The entry's complete,
uncompressed content. Must be empty when filename names a directory.options <Object>
comment <string> An entry comment.mode <integer> Unix permission bits. Default: 0o644 (0o755 for
directories).modified <Date> The entry's modification time. Default: the
current time.method <string> One of 'deflate', 'store', or 'zstd'. Default:
'deflate', except for directories and empty content, which are always
stored.<Promise> Fulfilled with a <ZipEntry>.Compresses data (unless method is 'store', or compression would not
reduce its size) and computes its CRC-32.
When the entry ends up stored uncompressed (because method is 'store',
or because compression would not reduce the size), the entry retains a
zero-copy view of data rather than a copy, and its CRC-32 has already been
recorded. Do not mutate data after creating the entry; pass a copy if it
might change.
The MS-DOS date/time fields ZIP uses for modified have 2-second resolution
and no time zone. When modified does not fall on a whole 2-second
boundary, an Info-ZIP extended-timestamp extra field is written as well,
recording the whole (UTC) second so the time round-trips more precisely (see
zipEntry.modified). This applies to every entry-creation path.
zlib.ZipEntry.createStream(filename, source[, options])#filename <string> The entry's name within the archive. Must not end
in /.source <AsyncIterable> Yields the entry's uncompressed content as Uint8Array chunks.options <Object>
<ZipEntry>Creates an entry whose content is compressed on the fly as it is serialized
by zlib.createZipArchive(), without buffering source in memory. Its
size, compressedSize, and crc32 only become available once
serialization has finished. There is no synchronous counterpart: streaming
entries only make sense with an asynchronous, incrementally-produced
source.
source is drained exactly once, during serialization. Until that happens
the entry has no readable content, so zipEntry.content(),
zipEntry.contentSync(), and zipEntry.contentIterator() throw
ERR_INVALID_STATE. If the entry is serialized by adding it to a writable
ZipFile with zipFile.addEntry() (or addEntrySync()), it is then
promoted in place to a file-backed entry pointing at the copy just written,
so it becomes readable (and can be serialized again) for as long as that
ZipFile stays open. Serializing it any other way (for example directly
through zlib.createZipArchive()) leaves it spent and unreadable.
Because source may hold an operating-system resource (a file read stream,
say), a streaming entry is disposable: its Symbol.dispose and
Symbol.asyncDispose methods destroy source if it has not been consumed.
An entry passed to an archive is disposed by that archive (see
zlib.createZipArchive()); dispose an entry directly only when it was
built but never handed to one. Disposal is a no-op for non-streaming entries -
in particular a file-backed entry never closes the ZipFile descriptor it
borrows.
zlib.ZipEntry.createSymlink(filename, target[, options])#filename <string> The entry's name within the archive.target <string> The symbolic link's target path.options <Object>
<ZipEntry>Creates a symbolic-link entry: a stored entry whose content is target and
whose Unix mode type bits mark it as a symlink, so zipEntry.isSymlink is
true when it is read back. Extraction tools that honor symlink entries
recreate the link; treat target as untrusted (see zipEntry.name on
path safety).
zlib.ZipEntry.createSync(filename, data[, options])#filename <string> The entry's name within the archive. A trailing /
marks a directory entry.data <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> The entry's complete,
uncompressed content. Must be empty when filename names a directory.options <Object> See zlib.ZipEntry.create().<ZipEntry>The synchronous version of zlib.ZipEntry.create().
zlib.ZipEntry.read(buffer)#buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> A complete ZIP archive.<Iterator> of <ZipEntry>.Parses every entry out of buffer directly, without indexing it into a
ZipBuffer. Like ZipBuffer, the yielded entries hold zero-copy views
of buffer rather than copies of their content, so the same rule applies: do
not mutate or reuse buffer while any of them is still in use.
zipEntry.comment#<string>zipEntry.compressed#<boolean>true if the entry's content is stored in compressed form (any compression
method, currently deflate or Zstandard); false if it is stored
uncompressed.
zipEntry.compressedSize#<number>zipEntry.content([options])#options <Object>
verify <boolean> Verify the entry's CRC-32 checksum. Default: true.maxSize <number> Reject content declaring more than this many
uncompressed bytes, before allocating anything. Default:
zlib.getMaxZipContentSize().<Promise> Fulfilled with a <Buffer> containing the entry's
decompressed content. The buffer is a fresh copy that shares no memory
with the archive or with data the entry was created from.Throws an ERR_ZIP_ENTRY_TOO_LARGE error if the entry's declared size
exceeds maxSize, an ERR_ZIP_ENTRY_CORRUPT error if the content fails
CRC-32 verification or does not match its declared size, and an
ERR_INVALID_STATE error for a streaming entry
(zlib.ZipEntry.createStream()) whose content is not yet available (see
that method for when a streaming entry becomes readable).
zipEntry.contentSync([options])#options <Object> See zipEntry.content().<Buffer> The entry's decompressed content.The synchronous version of zipEntry.content().
zipEntry.contentIterator([options])#options <Object>
<AsyncIterator> of <Buffer> chunks of the entry's decompressed
content.Unlike zipEntry.content(), this does not buffer the whole member in
memory. For a file-backed entry (one returned by zipFile.get()) the
compressed bytes are read from disk as the iterator is consumed and nothing is
retained; the entry is valid only while its ZipFile is open.
Because streaming is the bounded-memory path for arbitrarily large members, it
is not capped by zlib.getMaxZipContentSize() the way
zipEntry.content() is - that default guards a single large allocation,
which streaming never makes. Output is still bounded per chunk to the declared
uncompressed size; pass maxSize to impose an explicit ceiling.
For an in-memory entry stored without compression, the yielded chunks are
zero-copy views of the entry's retained content (see
zipEntry.rawContent); do not mutate them.
The yielded chunks are provisional until the iterator completes. CRC-32
verification (and the final declared-size check) can only run once every byte
has been read, so a corrupt or truncated entry is reported by the iterator
throwing after the last chunk, not before the first. Each chunk is still
bounded so the total never exceeds the declared size or maxSize, but a
consumer that must not act on unverified bytes should buffer them (or use
zipEntry.content(), which verifies before returning anything) rather than
processing chunks as they arrive.
zipEntry.crc32#<number>zipEntry.flags#<number>The entry's raw general-purpose bit flag.
zipEntry.isDirectory#<boolean>true if the entry is a directory (its name ends with /).
zipEntry.isFile#<boolean>true if the entry is a regular file — that is, neither a directory nor a
symbolic link.
zipEntry.isSymlink#<boolean>true if the entry is a symbolic link (its Unix mode type bits are
S_IFLNK); its content is the link target. Always false for archives not
written on a Unix-like system. When extracting, treat a symlink's target as
untrusted — see zipEntry.name on path safety.
zipEntry.mode#<number>The entry's Unix mode permission bits, including the setuid, setgid, and
sticky bits (the low 12 bits, 0o7777), or 0 if the archive was not written
on a Unix-like system. The file-type bits are not included here; use
zipEntry.isDirectory / zipEntry.isSymlink for the type.
zipEntry.modified#<Date>The entry's last-modification time. When the archive carries a higher-fidelity
timestamp in an extra field — an NTFS (0x000a), Info-ZIP extended (0x5455),
or Info-ZIP Unix (0x5855) field, as most modern tools write — that absolute
(UTC) time is used; otherwise the coarse, local-time MS-DOS date/time field
(2-second resolution) is used.
Some tools store their high-fidelity timestamp only in the local file header,
so on a file-backed entry (one returned by zipFile.get()) the first read
of this property may perform a small synchronous positioned disk read to
resolve that header. If that read fails, the value silently falls back to the
central-directory data.
zipEntry.method#<number>The entry's raw compression method: 0 for stored, 8 for deflate, 93
for Zstandard.
zipEntry.name#<string>The entry's name, decoded from the central directory, which is treated as
authoritative — a local file header that disagrees is ignored, so a
mismatched-header ("ZIP-confusion") archive cannot make name disagree with
what is read. The bytes are decoded from a valid Info-ZIP Unicode Path extra
field (0x7075) when one is present; otherwise as UTF-8 when the
language-encoding flag (general-purpose bit 11) is set or the bytes are
valid UTF-8 (plenty of tools wrote UTF-8 names without ever setting the
flag); and as CP437 — the historical default — only when they are not.
See zipEntry.nameBuffer for the raw bytes.
The name is returned verbatim: it is never normalized, and a name
containing .., a leading /, a drive letter, or backslashes is neither
rewritten nor rejected. A ZipFile/ZipBuffer never writes to disk, so
guarding against path traversal ("Zip Slip") when extracting is the caller's
responsibility.
zipEntry.nameBuffer#<Buffer>The entry's raw name bytes, before any character decoding. Useful when the archive's names are in an encoding other than UTF-8 or CP437 and the caller wants to decode them itself.
zipEntry.rawContent#The entry's raw (still compressed, if applicable) content when it is held in
memory, or null when there is no in-memory buffer to expose - for an entry
created with zlib.ZipEntry.createStream(), or a file-backed entry
returned by zipFile.get(), whose bytes are read from disk on demand
rather than retained. Use zipEntry.content() or
zipEntry.contentIterator() to read a file-backed entry.
zipEntry.size#<number>The entry's uncompressed size, in bytes.
zlib.ZipFile#Stability: 1.0 - Early development
The ZIP archive API is experimental. Using any part of it (this class among
them) emits an experimental warning the first time; merely importing
node:zlib does not.
A random-access view over the entries of a ZIP archive on disk. Only the
archive's tail and central directory are read up front; member content is
read from disk lazily, on demand. Writable when opened with
{ writable: true }: zipFile.addEntry()/zipFile.add() append the
new member's data where the central directory used to be, then rewrite the
central directory immediately after it; zipFile.delete() just rewrites
the central directory. Both mean the file is altered as soon as the method's
returned Promise fulfills. Deleted or replaced members are left behind as
dead space; zipFile.compact() produces a stream with none.
These in-place edits are not crash-atomic. Rewriting the central directory
happens in place, so a write that fails partway - the disk fills, the device
disconnects, the process is killed - can leave the archive on disk with a
partial or missing central directory, i.e. unreadable, even though the member
data before it is intact. The rejected call surfaces the underlying error and
the ZipFile object is left usable (its in-memory view is not discarded, so a
caller can attempt recovery - for example re-writing the entries elsewhere with
zipFile.compact()), but that in-memory view may no longer match the bytes
on disk. Write to a copy, or compact() into a fresh file, when durability
across a failure matters.
Every method has a *Sync counterpart. As with the synchronous node:fs
APIs, these block the Node.js event loop and further JavaScript execution
until the operation completes; use them only where synchronous execution is
appropriate (for example, short-lived scripts or startup code), not in code
that must stay responsive. A synchronous method throws ERR_INVALID_STATE
if called while an asynchronous add(), addEntry(), delete(), or
close() on the same ZipFile has not settled yet, since letting the two
interleave could corrupt the archive.
import { ZipFile } from 'node:zlib'; import { Buffer } from 'node:buffer'; const zip = await ZipFile.open('archive.zip', { writable: true }); try { const entry = await zip.get('member.txt'); console.log((await entry.content()).toString()); for await (const chunk of await zip.stream('huge.bin')) { // Process each chunk without buffering the whole member. } await zip.add('new.txt', Buffer.from('hello')); await zip.delete('unwanted.txt'); } finally { await zip.close(); }const { ZipFile } = require('node:zlib'); async function main() { const zip = await ZipFile.open('archive.zip', { writable: true }); try { const entry = await zip.get('member.txt'); console.log((await entry.content()).toString()); for await (const chunk of await zip.stream('huge.bin')) { // Process each chunk without buffering the whole member. } await zip.add('new.txt', Buffer.from('hello')); await zip.delete('unwanted.txt'); } finally { await zip.close(); } } main();javascript
zlib.ZipFile.open(filename[, options])#filename <string>options <Object>
writable <boolean> Open the underlying file for both reading and
writing ('r+'), enabling zipFile.addEntry()/zipFile.add()/
zipFile.delete(). Default: false.<Promise> Fulfilled with a <ZipFile>.Throws an ERR_ZIP_ARCHIVE_TOO_LARGE error if the archive's central
directory is too large to buffer in memory.
zlib.ZipFile.openSync(filename[, options])#filename <string>options <Object> See zlib.ZipFile.open().<ZipFile>The synchronous version of zlib.ZipFile.open().
zipFile.add(filename, data[, options])#filename <string> The entry's name within the archive. A trailing /
marks a directory entry.data <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> The entry's complete,
uncompressed content.options <Object> See zlib.ZipEntry.create().<Promise> Fulfilled with the created <ZipEntry>.Equivalent to zipFile.addEntry(await zlib.ZipEntry.create(filename, data, options)).
zipFile.addEntry(entry)#entry <ZipEntry><Promise> Fulfilled with entry.Writes entry where the central directory currently starts, then rewrites
the central directory to include it, replacing any existing entry of the
same name. Throws ERR_ZIP_NOT_WRITABLE if the ZipFile was not opened
with { writable: true }.
The returned (same) entry is left readable: a streaming entry created with
zlib.ZipEntry.createStream(), which would otherwise be spent once
serialized, is promoted in place to a file-backed entry pointing at the copy
just written (valid while this ZipFile is open). In-memory entries keep their
own buffer unchanged.
zipFile.addEntrySync(entry)#entry <ZipEntry><ZipEntry> entry.The synchronous version of zipFile.addEntry(). entry must not be a
pending streaming entry (one created with
zlib.ZipEntry.createStream()) - there is no synchronous way to drain
its asynchronous source.
zipFile.addSync(filename, data[, options])#filename <string> The entry's name within the archive. A trailing /
marks a directory entry.data <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> The entry's complete,
uncompressed content.options <Object> See zlib.ZipEntry.createSync().<ZipEntry> The created entry.The synchronous version of zipFile.add(). Equivalent to
zipFile.addEntrySync(zlib.ZipEntry.createSync(filename, data, options)).
zipFile.close()#<Promise>Closes the underlying file handle.
Closing does not invalidate outstanding objects: ZipEntry objects previously
returned by zipFile.get() and the ZipFile's own methods will fail with
system-level errors (for example EBADF) if used after close, rather than a
dedicated Node.js error code. The same applies to zipFile.closeSync().
zipFile.closeSync()#The synchronous version of zipFile.close().
zipFile.comment#<string>The archive-level comment, preserved byte-for-byte across
zipFile.addEntry()/zipFile.delete() calls. The bytes are decoded
as UTF-8 when they are valid UTF-8 and as CP437 otherwise (the field carries
no encoding flag of its own).
zipFile.compact([comment])#comment <string> An archive comment. Default: zipFile.comment.<stream.Readable> A stream of the currently live entries,
serialized as a fresh archive with no dead space left by prior zipFile.addEntry()/zipFile.delete() calls.Does not modify the open file; pipe the result into a new one:
import { createWriteStream } from 'node:fs'; zip.compact().pipe(createWriteStream('compacted.zip'));mjs
zipFile.compactSync([comment])#comment <string> An archive comment. Default: zipFile.comment.<Buffer> The currently live entries, serialized as a fresh
archive with no dead space left by prior zipFile.addEntry()/zipFile.delete() calls.The synchronous version of zipFile.compact(). Does not modify the
open file.
zipFile.delete(name)#name <string><Promise> Fulfilled with true if an entry named name existed
and was removed, false otherwise.Rewrites the central directory without writing any new content - the
archive does not grow. Throws ERR_ZIP_NOT_WRITABLE if the ZipFile was
not opened with { writable: true }.
zipFile.deleteSync(name)#name <string><boolean> true if an entry named name existed and was
removed, false otherwise.The synchronous version of zipFile.delete().
zipFile.entries()#<Iterator> of [name, entry] pairs, where entry is a
<Promise> fulfilled with a ZipEntry.zipFile.entriesSync()#<Iterator> of [name, entry] pairs, where entry is a resolved
ZipEntry (not a Promise).The synchronous version of zipFile.entries().
zipFile.forEach(callback[, thisArg])#callback <Function>thisArg <any>zipFile.forEachSync(callback[, thisArg])#callback <Function>thisArg <any>The synchronous version of zipFile.forEach(): callback is invoked
with a resolved ZipEntry instead of a Promise.
zipFile.get(name)#name <string><Promise> Fulfilled with a <ZipEntry>.Returns a lazy, file-backed ZipEntry for name. Nothing is read from
disk here and no content is buffered: the returned entry reads (and, for
zipEntry.content(), decompresses) its member straight from the file on
each access, and the ZipFile retains no member content. The entry is valid
only while this ZipFile is open. Reading its content later may throw
ERR_ZIP_ENTRY_TOO_LARGE if the member is too large to hold in a single
buffer; use zipEntry.contentIterator() (or zipFile.stream())
instead. Throws ERR_ZIP_ENTRY_NOT_FOUND if the archive has no entry
named name.
zipFile.getSync(name)#name <string><ZipEntry>The synchronous version of zipFile.get(). Like get(), it reads
nothing up front and only builds the lazy handle, so it does not itself block
on I/O - but reads performed later through the returned entry (such as
zipEntry.contentSync()) do; see the note above on synchronous methods.
zipFile.has(name)#zipFile.keys()#<Iterator> of entry names.zipFile.size#<number>The number of entries in the archive.
zipFile.stream(name[, options])#name <string>options <Object>
<Promise> Fulfilled with a <stream.Readable> of the member's
decompressed content, without buffering the whole member in memory.Convenience wrapper that resolves to a Readable over
zipEntry.contentIterator() of zipFile.get()(name); the
compressed bytes are read from disk as the stream is consumed. The returned
promise rejects with ERR_ZIP_ENTRY_NOT_FOUND if the archive has no entry
named name.
zipFile.values()#<Iterator> of <Promise> objects, each fulfilled with a ZipEntry.zipFile.valuesSync()#<Iterator> of resolved ZipEntry values (not Promises).The synchronous version of zipFile.values().
zipFile.writable#<boolean>Whether this ZipFile was opened with { writable: true }.
zlib.ZlibBase#| Version | Changes |
|---|---|
| v11.7.0, v10.16.0 | This class was renamed from |
stream.TransformNot exported by the node:zlib module. It is documented here because it is the
base class of the compressor/decompressor classes.
This class inherits from stream.Transform, allowing node:zlib objects to
be used in pipes and similar stream operations.
zlib.bytesWritten#<number>The zlib.bytesWritten property specifies the number of bytes written to
the engine, before the bytes are processed (compressed or decompressed,
as appropriate for the derived class).
zlib.close([callback])#callback <Function>Close the underlying handle.
zlib.flush([kind, ]callback)#kind Default: zlib.constants.Z_FULL_FLUSH for zlib-based streams,
zlib.constants.BROTLI_OPERATION_FLUSH for Brotli-based streams, and
zlib.constants.ZSTD_e_flush for Zstd-based streams.callback <Function>Flush pending data. Don't call this frivolously, premature flushes negatively impact the effectiveness of the compression algorithm.
Calling this only flushes data from the internal zlib state, and does not
perform flushing of any kind on the streams level. Rather, it behaves like a
normal call to .write(), i.e. it will be queued up behind other pending
writes and will only produce output when data is being read from the stream.
zlib.params(level, strategy, callback)#level <integer>strategy <integer>callback <Function>This function is only available for zlib-based streams, i.e. not Brotli.
Dynamically update the compression level and compression strategy. Only applicable to deflate algorithm.
zlib.reset()#| Version | Changes |
|---|---|
| v26.11.0 | Brotli streams preserve parameters and dictionary on reset. |
For inflate and deflate streams, reset the compressor/decompressor to factory defaults.
For Brotli streams, start a new compression or decompression session while preserving the configured parameters and dictionary.
For Zstd streams, cancel the current frame and start a new session while
preserving the configured parameters and dictionary. If pledgedSrcSize was
configured for a Zstd compressor, it applies again to the next frame.
Resetting a gzip stream after it has emitted output for an incomplete member
causes the stream to error with ERR_ZLIB_INCOMPLETE_FRAME. Resetting at
that point would discard the member state while the bytes already written out
remain at the start of the output stream, leaving it undecodable. Call
.end(), or start over with a new gzip stream, instead.
zlib-wrapped deflate may still reset() after a flush; callers that reuse
the compressor discard the first output. Raw deflate has no wrapper header,
so reset() after a flush still concatenates.
Calling reset() while a write is in progress throws an Error.
Resetting an incomplete Zstd compression frame after it has emitted output
causes the stream to error with ERR_ZLIB_INCOMPLETE_FRAME. Resetting at
that point would discard the frame state while the bytes already written
out remain at the start of the output stream, leaving it undecodable. Call
.end(), or start over with a new stream, instead.
ZstdOptions#| Version | Changes |
|---|---|
| v26.7.0 | The |
| v26.5.0 | The |
Stability: 1 - Experimental
Each Zstd-based class takes an options object. All options are optional.
flush <integer> Default: zlib.constants.ZSTD_e_continuefinishFlush <integer> Default: zlib.constants.ZSTD_e_endchunkSize <integer> Default: 16 * 1024params <Object> Key-value object containing indexed Zstd parameters.pledgedSrcSize <number> Expected total size of the uncompressed input. It
must be a non-negative safe integer and must match the input size when
compression finishes. Only applicable to Zstd compressors.maxOutputLength <integer> Limits output size when using convenience methods. Default: buffer.kMaxLengthinfo <boolean> If true, returns an object with buffer and engine. Default: falsedictionary <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> Optional dictionary used
to improve compression efficiency when compressing or decompressing data that
shares common patterns with the dictionary.rejectGarbageAfterEnd <boolean> If true, decompression fails when
input remains after a complete sequence of Zstd frames. Default: falseFor example:
const stream = zlib.createZstdCompress({ chunkSize: 32 * 1024, params: { [zlib.constants.ZSTD_c_compressionLevel]: 10, [zlib.constants.ZSTD_c_checksumFlag]: 1, }, });js
zlib.ZstdCompress#Stability: 1 - Experimental
Compress data using the Zstd algorithm.
zlib.ZstdDecompress#Stability: 1 - Experimental
Decompress data using the Zstd algorithm. Concatenated Zstd and skippable frames are decoded as a single stream.
zlib.constants#Provides an object enumerating Zlib-related constants.
zlib.crc32(data[, value])#data <string> | <Buffer> | <TypedArray> | <DataView> When data is a string,
it will be encoded as UTF-8 before being used for computation.value <integer> An optional starting value. It must be a 32-bit unsigned
integer. Default: 0<integer> A 32-bit unsigned integer containing the checksum.Computes a 32-bit Cyclic Redundancy Check checksum of data. If
value is specified, it is used as the starting value of the checksum,
otherwise, 0 is used as the starting value.
The CRC algorithm is designed to compute checksums and to detect error in data transmission. It's not suitable for cryptographic authentication.
To be consistent with other APIs, if the data is a string, it will
be encoded with UTF-8 before being used for computation. If users only
use Node.js to compute and match the checksums, this works well with
other APIs that uses the UTF-8 encoding by default.
Some third-party JavaScript libraries compute the checksum on a
string based on str.charCodeAt() so that it can be run in browsers.
If users want to match the checksum computed with this kind of library
in the browser, it's better to use the same library in Node.js
if it also runs in Node.js. If users have to use zlib.crc32() to
match the checksum produced by such a third-party library:
Uint8Array as input, use TextEncoder
in the browser to encode the string into a Uint8Array with UTF-8
encoding, and compute the checksum based on the UTF-8 encoded string
in the browser.str.charCodeAt(), on the Node.js side, convert the string into
a buffer using Buffer.from(str, 'utf16le').import zlib from 'node:zlib'; import { Buffer } from 'node:buffer'; let crc = zlib.crc32('hello'); // 907060870 crc = zlib.crc32('world', crc); // 4192936109 crc = zlib.crc32(Buffer.from('hello', 'utf16le')); // 1427272415 crc = zlib.crc32(Buffer.from('world', 'utf16le'), crc); // 4150509955const zlib = require('node:zlib'); const { Buffer } = require('node:buffer'); let crc = zlib.crc32('hello'); // 907060870 crc = zlib.crc32('world', crc); // 4192936109 crc = zlib.crc32(Buffer.from('hello', 'utf16le')); // 1427272415 crc = zlib.crc32(Buffer.from('world', 'utf16le'), crc); // 4150509955javascript
zlib.createBrotliCompress([options])#options <brotli options>Creates and returns a new BrotliCompress object.
zlib.createBrotliDecompress([options])#options <brotli options>Creates and returns a new BrotliDecompress object.
zlib.createDeflate([options])#options <zlib options>Creates and returns a new Deflate object.
zlib.createDeflateRaw([options])#options <zlib options>Creates and returns a new DeflateRaw object.
An upgrade of zlib from 1.2.8 to 1.2.11 changed behavior when windowBits
is set to 8 for raw deflate streams. zlib would automatically set windowBits
to 9 if was initially set to 8. Newer versions of zlib will throw an exception,
so Node.js restored the original behavior of upgrading a value of 8 to 9,
since passing windowBits = 9 to zlib actually results in a compressed stream
that effectively uses an 8-bit window only.
zlib.createGunzip([options])#options <zlib options>Creates and returns a new Gunzip object.
zlib.createGzip([options])#options <zlib options>zlib.createInflate([options])#options <zlib options>Creates and returns a new Inflate object.
zlib.createInflateRaw([options])#options <zlib options>Creates and returns a new InflateRaw object.
zlib.createUnzip([options])#options <zlib options>Creates and returns a new Unzip object.
zlib.createZipArchive(entries[, options])#Stability: 1.0 - Early development
The ZIP archive API is experimental. Using any part of it (this function among
them) emits an experimental warning the first time; merely importing
node:zlib does not.
entries <Iterable> | <AsyncIterable> of ZipEntry.options <string> | <Object> An archive comment, as a shorthand for { comment: options }.
comment <string> An archive comment.baseOffset <number> Shifts every local/central header offset the
archive records by this many bytes, so the emitted stream is
self-describing even when something else is written before it - for
example, appending the archive after baseOffset bytes already written to
the same file, rather than at its start. Default: 0.<stream.Readable> A byte stream of the serialized archive.Serializes entries into a ZIP archive, switching to Zip64 structures
automatically once the entry count, or any offset or size, exceeds what the
classic 32-/16-bit ZIP fields can hold. The returned Readable is also an
AsyncIterable of the same <Buffer> chunks it streams.
Entries are written in iteration order and nothing deduplicates names: an
iterable that yields two entries with the same name produces an archive
containing both, and most extraction tools keep the one that appears later.
ZipBuffer and ZipFile add() methods replace entries by name
instead.
The entries are owned by the returned stream: each is consumed as the archive
is produced and must not be reused afterwards. This matters for streaming
entries (from zlib.ZipEntry.createStream()), which hold an underlying
source such as a file read stream. If the returned stream is destroyed before
it is fully consumed - for example, the destination of a pipeline()
fails - it disposes the entry it was serializing and every entry still queued
behind it, destroying their sources so no descriptor leaks. Consume the stream
to the end, or destroy it (directly, through a failed pipeline(), or with
await using), to guarantee this cleanup; a stream that is neither consumed
nor destroyed cannot release anything. A ZipEntry that is never handed to
an archive can be released directly with Symbol.dispose / Symbol.asyncDispose.
Throws an ERR_ZIP_ARCHIVE_TOO_LARGE error if the archive comment
exceeds 65,535 bytes when encoded as UTF-8.
import { createWriteStream } from 'node:fs'; import { pipeline } from 'node:stream/promises'; import { Buffer } from 'node:buffer'; import { ZipEntry, createZipArchive } from 'node:zlib'; const entries = [ await ZipEntry.create('hello.txt', Buffer.from('Hello, world!')), await ZipEntry.create('data/', Buffer.alloc(0)), ]; await pipeline( createZipArchive(entries, 'created by node:zlib'), createWriteStream('archive.zip'), );const { createWriteStream } = require('node:fs'); const { pipeline } = require('node:stream/promises'); const { ZipEntry, createZipArchive } = require('node:zlib'); async function main() { const entries = [ await ZipEntry.create('hello.txt', Buffer.from('Hello, world!')), await ZipEntry.create('data/', Buffer.alloc(0)), ]; await pipeline( createZipArchive(entries, 'created by node:zlib'), createWriteStream('archive.zip'), ); } main();javascript
Passing options.baseOffset produces an archive that is valid immediately
when placed after other content in the same file, without relying on a
reader's self-extracting-archive detection to compensate for the shift:
import { createWriteStream } from 'node:fs'; import { Buffer } from 'node:buffer'; import { ZipEntry, createZipArchive } from 'node:zlib'; const prefix = Buffer.from('#!/bin/sh\nexit 0\n'); const entries = [await ZipEntry.create('hello.txt', Buffer.from('Hello, world!'))]; const out = createWriteStream('self-extracting.zip'); out.write(prefix); createZipArchive(entries, { baseOffset: prefix.byteLength }).pipe(out);mjs
zlib.createZipArchiveSync(entries[, options])#Stability: 1.0 - Early development
The ZIP archive API is experimental. Using any part of it (this function among
them) emits an experimental warning the first time; merely importing
node:zlib does not.
entries <Iterable> of ZipEntry.options <string> | <Object> See zlib.createZipArchive().<Iterator> of <Buffer> chunks making up the serialized archive.The synchronous version of zlib.createZipArchive(). Blocks the
Node.js event loop and further JavaScript execution until the whole
archive (including any deflate passes) has been produced; use only where
synchronous execution is appropriate (for example, short-lived scripts or
startup code), not in code that must stay responsive. entries must be a
plain (synchronous) Iterable - a streaming entry created with
zlib.ZipEntry.createStream() throws when its turn to serialize comes
up, since draining its asynchronous source has no synchronous equivalent.
As with zlib.createZipArchive(), the entries are owned by the returned
iterator and must not be reused. If iteration stops early - including the
throw on a streaming entry - the entry that stopped it and every entry still
queued behind it are disposed, releasing any sources they hold.
zlib.zipFiles(files[, options])#Stability: 1.0 - Early development
The ZIP archive API is experimental. Using any part of it (this function among
them) emits an experimental warning the first time; merely importing
node:zlib does not.
files <Iterable> of [sourcePath, entryName] string pairs. Any iterable
works — an array, a Map, the result of Object.entries(), a generator.options <string> | <Object>
followSymlinks <boolean> Resolve a symbolic link and archive the file it
points to, rather than storing the link itself. Default: true.comment <string> An archive comment; a string options is shorthand for
{ comment: options }.baseOffset <number> See zlib.createZipArchive().<stream.Readable> of <Buffer> chunks making up the serialized
archive.Builds an archive from files on disk. For each [sourcePath, entryName] pair
it reads sourcePath and adds an entry named entryName, capturing the file's
Unix mode and modification time. A directory becomes a directory entry; a
regular file's contents are streamed in (as a zlib.ZipEntry.createStream()
entry) without being buffered in memory. Directory contents are not walked
recursively — list each path you want included.
When followSymlinks is true (the default) a symbolic link is resolved and
archived as its target file; when it is false the link itself is stored as a
symbolic-link entry whose content is the target path (see
zlib.ZipEntry.createSymlink()).
import { zipFiles } from 'node:zlib'; import { createWriteStream } from 'node:fs'; import { pipeline } from 'node:stream/promises'; await pipeline( zipFiles([ ['/data/report.pdf', 'report.pdf'], ['/data/notes.txt', 'docs/notes.txt'], ]), createWriteStream('archive.zip'), );mjs
zlib.createZstdCompress([options])#Stability: 1 - Experimental
options <zstd options>Creates and returns a new ZstdCompress object.
zlib.createZstdDecompress([options])#Stability: 1 - Experimental
options <zstd options>Creates and returns a new ZstdDecompress object.
zlib.getMaxZipContentSize()#Stability: 1.0 - Early development
The ZIP archive API is experimental. Using any part of it (this function among
them) emits an experimental warning the first time; merely importing
node:zlib does not.
<number>The current default ceiling, in bytes, applied by zipEntry.content()
when no explicit maxSize is given. Default: 268435456 (256 MiB).
zlib.setMaxZipContentSize(size)#Stability: 1.0 - Early development
The ZIP archive API is experimental. Using any part of it (this function among
them) emits an experimental warning the first time; merely importing
node:zlib does not.
size <number>Sets the default ceiling used by zipEntry.content() when no explicit
maxSize option is given. This is a guard against zip bombs: an archive
whose central directory declares a member larger than this is rejected
before allocating memory for it. Streaming reads
(zipEntry.contentIterator(), zipFile.stream()) are bounded-memory
by design and are not affected by this setting.
All of these take a <Buffer>, <TypedArray>, <DataView>, <ArrayBuffer>, or string
as the first argument, an optional second argument
to supply options to the zlib classes and will call the supplied callback
with callback(error, result).
Every method has a *Sync counterpart, which accept the same arguments, but
without a callback.
zlib.brotliCompress(buffer[, options], callback)#buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <brotli options>callback <Function>zlib.brotliCompressSync(buffer[, options])#buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <brotli options>Compress a chunk of data with BrotliCompress.
zlib.brotliDecompress(buffer[, options], callback)#buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <brotli options>callback <Function>zlib.brotliDecompressSync(buffer[, options])#buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <brotli options>Decompress a chunk of data with BrotliDecompress.
zlib.deflate(buffer[, options], callback)#| Version | Changes |
|---|---|
| v9.4.0 | The |
| v8.0.0 | The |
| v8.0.0 | The |
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zlib options>callback <Function>zlib.deflateSync(buffer[, options])#| Version | Changes |
|---|---|
| v9.4.0 | The |
| v8.0.0 | The |
| v8.0.0 | The |
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zlib options>Compress a chunk of data with Deflate.
zlib.deflateRaw(buffer[, options], callback)#| Version | Changes |
|---|---|
| v8.0.0 | The |
| v8.0.0 | The |
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zlib options>callback <Function>zlib.deflateRawSync(buffer[, options])#| Version | Changes |
|---|---|
| v9.4.0 | The |
| v8.0.0 | The |
| v8.0.0 | The |
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zlib options>Compress a chunk of data with DeflateRaw.
zlib.gunzip(buffer[, options], callback)#| Version | Changes |
|---|---|
| v9.4.0 | The |
| v8.0.0 | The |
| v8.0.0 | The |
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zlib options>callback <Function>zlib.gunzipSync(buffer[, options])#| Version | Changes |
|---|---|
| v9.4.0 | The |
| v8.0.0 | The |
| v8.0.0 | The |
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zlib options>Decompress a chunk of data with Gunzip.
zlib.gzip(buffer[, options], callback)#| Version | Changes |
|---|---|
| v9.4.0 | The |
| v8.0.0 | The |
| v8.0.0 | The |
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zlib options>callback <Function>zlib.gzipSync(buffer[, options])#| Version | Changes |
|---|---|
| v9.4.0 | The |
| v8.0.0 | The |
| v8.0.0 | The |
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zlib options>Compress a chunk of data with Gzip.
zlib.inflate(buffer[, options], callback)#| Version | Changes |
|---|---|
| v9.4.0 | The |
| v8.0.0 | The |
| v8.0.0 | The |
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zlib options>callback <Function>zlib.inflateSync(buffer[, options])#| Version | Changes |
|---|---|
| v9.4.0 | The |
| v8.0.0 | The |
| v8.0.0 | The |
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zlib options>Decompress a chunk of data with Inflate.
zlib.inflateRaw(buffer[, options], callback)#| Version | Changes |
|---|---|
| v9.4.0 | The |
| v8.0.0 | The |
| v8.0.0 | The |
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zlib options>callback <Function>zlib.inflateRawSync(buffer[, options])#| Version | Changes |
|---|---|
| v9.4.0 | The |
| v8.0.0 | The |
| v8.0.0 | The |
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zlib options>Decompress a chunk of data with InflateRaw.
zlib.unzip(buffer[, options], callback)#| Version | Changes |
|---|---|
| v9.4.0 | The |
| v8.0.0 | The |
| v8.0.0 | The |
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zlib options>callback <Function>zlib.unzipSync(buffer[, options])#| Version | Changes |
|---|---|
| v9.4.0 | The |
| v8.0.0 | The |
| v8.0.0 | The |
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zlib options>Decompress a chunk of data with Unzip.
zlib.zstdCompress(buffer[, options], callback)#| Version | Changes |
|---|---|
| v26.11.0 | The |
Stability: 1 - Experimental
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zstd options>callback <Function>zlib.zstdCompressSync(buffer[, options])#Stability: 1 - Experimental
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zstd options>Compress a chunk of data with ZstdCompress.
zlib.zstdDecompress(buffer[, options], callback)#Stability: 1 - Experimental
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zstd options>callback <Function>zlib.zstdDecompressSync(buffer[, options])#Stability: 1 - Experimental
buffer <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string>options <zstd options>Decompress a chunk of data with ZstdDecompress.
Stability: 1 - Experimental
The node:zlib/iter module provides compression and decompression transforms
for use with the node:stream/iter iterable streams API.
This module is available only when the --experimental-stream-iter CLI flag
is enabled.
Each algorithm has both an async variant (stateful async generator, for use
with pull() and pipeTo()) and a sync variant (stateful sync
generator, for use with pullSync() and pipeToSync()).
The async transforms run compression on the libuv threadpool, overlapping I/O with JavaScript execution. The sync transforms run compression directly on the main thread.
Note: The defaults for these transforms are tuned for streaming throughput, and differ from the defaults in
node:zlib. In particular, gzip/deflate default to level 4 (not 6) and memLevel 9 (not 8), and Brotli defaults to quality 6 (not 11). These choices match common HTTP server configurations and provide significantly faster compression with only a small reduction in compression ratio. All defaults can be overridden via options.
import { from, pull, bytes, text } from 'node:stream/iter'; import { compressGzip, decompressGzip } from 'node:zlib/iter'; // Async round-trip const compressed = await bytes(pull(from('hello'), compressGzip())); const original = await text(pull(from(compressed), decompressGzip())); console.log(original); // 'hello'const { from, pull, bytes, text } = require('node:stream/iter'); const { compressGzip, decompressGzip } = require('node:zlib/iter'); async function run() { const compressed = await bytes(pull(from('hello'), compressGzip())); const original = await text(pull(from(compressed), decompressGzip())); console.log(original); // 'hello' } run().catch(console.error);javascript
import { fromSync, pullSync, textSync } from 'node:stream/iter'; import { compressGzipSync, decompressGzipSync } from 'node:zlib/iter'; // Sync round-trip const compressed = pullSync(fromSync('hello'), compressGzipSync()); const original = textSync(pullSync(compressed, decompressGzipSync())); console.log(original); // 'hello'const { fromSync, pullSync, textSync } = require('node:stream/iter'); const { compressGzipSync, decompressGzipSync } = require('node:zlib/iter'); const compressed = pullSync(fromSync('hello'), compressGzipSync()); const original = textSync(pullSync(compressed, decompressGzipSync())); console.log(original); // 'hello'javascript
compressBrotli([options])#compressBrotliSync([options])#options <Object>
chunkSize <number> Output buffer size. Default: 65536 (64 KB).params <Object> Key-value object where keys and values are zlib.constants entries. The most important compressor parameters are:
BROTLI_PARAM_MODE -- BROTLI_MODE_GENERIC (default),
BROTLI_MODE_TEXT, or BROTLI_MODE_FONT.BROTLI_PARAM_QUALITY -- ranges from BROTLI_MIN_QUALITY to
BROTLI_MAX_QUALITY. Default: 6 (not BROTLI_DEFAULT_QUALITY
which is 11). Quality 6 is appropriate for streaming; quality 11 is
intended for offline/build-time compression.BROTLI_PARAM_SIZE_HINT -- expected input size. Default: 0
(unknown).BROTLI_PARAM_LGWIN -- window size (log2). Default: 20 (1 MB).
The Brotli library default is 22 (4 MB); the reduced default saves
memory without significant compression impact for streaming workloads.BROTLI_PARAM_LGBLOCK -- input block size (log2).
See the Brotli compressor options in the zlib documentation for the
full list.dictionary <Buffer> | <TypedArray> | <DataView><Object> A stateful transform.Create a Brotli compression transform. Output is compatible with
zlib.brotliDecompress() and decompressBrotli()/decompressBrotliSync().
compressDeflate([options])#compressDeflateSync([options])#options <Object>
chunkSize <number> Output buffer size. Default: 65536 (64 KB).level <number> Compression level (0-9). Default: 4.windowBits <number> Default: Z_DEFAULT_WINDOWBITS (15).memLevel <number> Default: 9.strategy <number> Default: Z_DEFAULT_STRATEGY.dictionary <Buffer> | <TypedArray> | <DataView><Object> A stateful transform.Create a deflate compression transform. Output is compatible with
zlib.inflate() and decompressDeflate()/decompressDeflateSync().
compressGzip([options])#compressGzipSync([options])#options <Object>
chunkSize <number> Output buffer size. Default: 65536 (64 KB).level <number> Compression level (0-9). Default: 4.windowBits <number> Default: Z_DEFAULT_WINDOWBITS (15).memLevel <number> Default: 9.strategy <number> Default: Z_DEFAULT_STRATEGY.dictionary <Buffer> | <TypedArray> | <DataView><Object> A stateful transform.Create a gzip compression transform. Output is compatible with zlib.gunzip()
and decompressGzip()/decompressGzipSync().
compressZstd([options])#compressZstdSync([options])#options <Object>
chunkSize <number> Output buffer size. Default: 65536 (64 KB).params <Object> Key-value object where keys and values are zlib.constants entries. The most important compressor parameters are:
ZSTD_c_compressionLevel -- Default: ZSTD_CLEVEL_DEFAULT (3).ZSTD_c_checksumFlag -- generate a checksum. Default: 0.ZSTD_c_strategy -- compression strategy. Values include
ZSTD_fast, ZSTD_dfast, ZSTD_greedy, ZSTD_lazy,
ZSTD_lazy2, ZSTD_btlazy2, ZSTD_btopt, ZSTD_btultra,
ZSTD_btultra2.
See the Zstd compressor options in the zlib documentation for the
full list.pledgedSrcSize <number> Expected uncompressed size as a non-negative safe
integer (optional hint).dictionary <Buffer> | <TypedArray> | <DataView><Object> A stateful transform.Create a Zstandard compression transform. Output is compatible with
zlib.zstdDecompress() and decompressZstd()/decompressZstdSync().
decompressBrotli([options])#decompressBrotliSync([options])#options <Object>
chunkSize <number> Output buffer size. Default: 65536 (64 KB).params <Object> Key-value object where keys and values are zlib.constants entries. Available decompressor parameters:
BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION -- boolean
flag affecting internal memory allocation.BROTLI_DECODER_PARAM_LARGE_WINDOW -- boolean flag enabling "Large
Window Brotli" mode (not compatible with RFC 7932).
See the Brotli decompressor options in the zlib documentation for
details.dictionary <Buffer> | <TypedArray> | <DataView><Object> A stateful transform.Create a Brotli decompression transform.
decompressDeflate([options])#decompressDeflateSync([options])#options <Object>
chunkSize <number> Output buffer size. Default: 65536 (64 KB).windowBits <number> Default: Z_DEFAULT_WINDOWBITS (15).dictionary <Buffer> | <TypedArray> | <DataView><Object> A stateful transform.Create a deflate decompression transform.
decompressGzip([options])#decompressGzipSync([options])#options <Object>
chunkSize <number> Output buffer size. Default: 65536 (64 KB).windowBits <number> Default: Z_DEFAULT_WINDOWBITS (15).dictionary <Buffer> | <TypedArray> | <DataView><Object> A stateful transform.Create a gzip decompression transform.
decompressZstd([options])#decompressZstdSync([options])#options <Object>
chunkSize <number> Output buffer size. Default: 65536 (64 KB).params <Object> Key-value object where keys and values are zlib.constants entries. Available decompressor parameters:
ZSTD_d_windowLogMax -- maximum window size (log2) the decompressor
will allocate. Limits memory usage against malicious input.
See the Zstd decompressor options in the zlib documentation for
details.dictionary <Buffer> | <TypedArray> | <DataView><Object> A stateful transform.Create a Zstandard decompression transform.