Zlib
Исходный код: lib/zlib.js
Модуль node:zlib предоставляет функциональность сжатия, реализованную с использованием Gzip, Deflate/Inflate, Brotli и Zstd.
Чтобы получить к нему доступ:
Модули JavaScript
import zlib from 'node:zlib';
CommonJS
const zlib = require('node:zlib');Сжатие и распаковка реализованы на основе API потоков Node.js.
Сжатие или распаковку потока (например, файла) можно выполнить, передав исходный поток через поток zlib Transform в целевой поток:
Модули JavaScript
import {
createReadStream,
createWriteStream,
} from 'node:fs';
import process from 'node:process';
import { createGzip } from 'node:zlib';
import { pipeline } from 'node:stream';
const gzip = createGzip();
const source = createReadStream('input.txt');
const destination = createWriteStream('input.txt.gz');
pipeline(source, gzip, destination, (err) => {
if (err) {
console.error('An error occurred:', err);
process.exitCode = 1;
}
});CommonJS
const {
createReadStream,
createWriteStream,
} = require('node:fs');
const process = require('node:process');
const { createGzip } = require('node:zlib');
const { pipeline } = require('node:stream');
const gzip = createGzip();
const source = createReadStream('input.txt');
const destination = createWriteStream('input.txt.gz');
pipeline(source, gzip, destination, (err) => {
if (err) {
console.error('An error occurred:', err);
process.exitCode = 1;
}
});Или с помощью API промисов pipeline:
Модули JavaScript
import {
createReadStream,
createWriteStream,
} from 'node:fs';
import { createGzip } from 'node:zlib';
import { pipeline } from 'node:stream/promises';
async function do_gzip(input, output) {
const gzip = createGzip();
const source = createReadStream(input);
const destination = createWriteStream(output);
await pipeline(source, gzip, destination);
}
await do_gzip('input.txt', 'input.txt.gz');CommonJS
const {
createReadStream,
createWriteStream,
} = require('node:fs');
const process = require('node:process');
const { createGzip } = require('node:zlib');
const { pipeline } = require('node:stream/promises');
async function do_gzip(input, output) {
const gzip = createGzip();
const source = createReadStream(input);
const destination = createWriteStream(output);
await pipeline(source, gzip, destination);
}
do_gzip('input.txt', 'input.txt.gz')
.catch((err) => {
console.error('An error occurred:', err);
process.exitCode = 1;
});Также можно сжать или распаковать данные за один шаг:
Модули JavaScript
import process from 'node:process';
import { Buffer } from 'node:buffer';
import { deflate, unzip } from 'node:zlib';
const input = '.................................';
deflate(input, (err, buffer) => {
if (err) {
console.error('An error occurred:', err);
process.exitCode = 1;
}
console.log(buffer.toString('base64'));
});
const buffer = Buffer.from('eJzT0yMAAGTvBe8=', 'base64');
unzip(buffer, (err, buffer) => {
if (err) {
console.error('An error occurred:', err);
process.exitCode = 1;
}
console.log(buffer.toString());
});
// Or, Promisified
import { promisify } from 'node:util';
const do_unzip = promisify(unzip);
const unzippedBuffer = await do_unzip(buffer);
console.log(unzippedBuffer.toString());CommonJS
const { deflate, unzip } = require('node:zlib');
const input = '.................................';
deflate(input, (err, buffer) => {
if (err) {
console.error('An error occurred:', err);
process.exitCode = 1;
}
console.log(buffer.toString('base64'));
});
const buffer = Buffer.from('eJzT0yMAAGTvBe8=', 'base64');
unzip(buffer, (err, buffer) => {
if (err) {
console.error('An error occurred:', err);
process.exitCode = 1;
}
console.log(buffer.toString());
});
// Or, Promisified
const { promisify } = require('node:util');
const do_unzip = promisify(unzip);
do_unzip(buffer)
.then((buf) => console.log(buf.toString()))
.catch((err) => {
console.error('An error occurred:', err);
process.exitCode = 1;
});Использование пула потоков и соображения производительности
Все API zlib, кроме явно синхронных, используют внутренний пул потоков Node.js. Это может приводить к неожиданным эффектам и ограничениям производительности в некоторых приложениях.
Одновременное создание и использование большого количества объектов zlib может вызвать значительную фрагментацию памяти.
Модули JavaScript
import zlib from 'node:zlib';
import { Buffer } from 'node:buffer';
const payload = Buffer.from('This is some data');
// WARNING: DO NOT DO THIS!
for (let i = 0; i < 30000; ++i) {
zlib.deflate(payload, (err, buffer) => {});
}CommonJS
const zlib = require('node:zlib');
const payload = Buffer.from('This is some data');
// WARNING: DO NOT DO THIS!
for (let i = 0; i < 30000; ++i) {
zlib.deflate(payload, (err, buffer) => {});
}В предыдущем примере одновременно создаются 30 000 экземпляров deflate. Из-за особенностей выделения и освобождения памяти некоторыми операционными системами это может привести к значительной фрагментации памяти.
Настоятельно рекомендуется кэшировать результаты операций сжатия, чтобы избежать повторной работы.
Сжатие HTTP-запросов и ответов
Модуль node:zlib можно использовать для реализации поддержки механизмов кодирования содержимого gzip, deflate, br и zstd, определённых в HTTP.
Заголовок HTTP Accept-Encoding используется в HTTP-запросе, чтобы указать алгоритмы сжатия, поддерживаемые клиентом. Заголовок Content-Encoding используется для указания алгоритмов сжатия, фактически применённых к сообщению.
Приведённые ниже примеры значительно упрощены, чтобы показать основную концепцию. Кодирование zlib может требовать значительных затрат ресурсов, а результаты следует кэшировать. Дополнительную информацию о компромиссах между скоростью, памятью и сжатием при использовании zlib см. в разделе Настройка использования памяти.
Модули JavaScript
// Client request example
import fs from 'node:fs';
import zlib from 'node:zlib';
import http from 'node:http';
import process from 'node:process';
import { pipeline } from 'node:stream';
const request = http.get({ host: 'example.com',
path: '/',
port: 80,
headers: { 'Accept-Encoding': 'br,gzip,deflate' } });
request.on('response', (response) => {
const output = fs.createWriteStream('example.com_index.html');
const onError = (err) => {
if (err) {
console.error('An error occurred:', err);
process.exitCode = 1;
}
};
switch (response.headers['content-encoding']) {
case 'br':
pipeline(response, zlib.createBrotliDecompress(), output, onError);
break;
// Or, just use zlib.createUnzip() to handle both of the following cases:
case 'gzip':
pipeline(response, zlib.createGunzip(), output, onError);
break;
case 'deflate':
pipeline(response, zlib.createInflate(), output, onError);
break;
default:
pipeline(response, output, onError);
break;
}
});CommonJS
// Client request example
const zlib = require('node:zlib');
const http = require('node:http');
const fs = require('node:fs');
const { pipeline } = require('node:stream');
const request = http.get({ host: 'example.com',
path: '/',
port: 80,
headers: { 'Accept-Encoding': 'br,gzip,deflate,zstd' } });
request.on('response', (response) => {
const output = fs.createWriteStream('example.com_index.html');
const onError = (err) => {
if (err) {
console.error('An error occurred:', err);
process.exitCode = 1;
}
};
switch (response.headers['content-encoding']) {
case 'br':
pipeline(response, zlib.createBrotliDecompress(), output, onError);
break;
// Or, just use zlib.createUnzip() to handle both of the following cases:
case 'gzip':
pipeline(response, zlib.createGunzip(), output, onError);
break;
case 'deflate':
pipeline(response, zlib.createInflate(), output, onError);
break;
case 'zstd':
pipeline(response, zlib.createZstdDecompress(), output, onError);
break;
default:
pipeline(response, output, onError);
break;
}
});Модули JavaScript
// server example
// Running a gzip operation on every request is quite expensive.
// It would be much more efficient to cache the compressed buffer.
import zlib from 'node:zlib';
import http from 'node:http';
import fs from 'node:fs';
import { pipeline } from 'node:stream';
http.createServer((request, response) => {
const raw = fs.createReadStream('index.html');
// Store both a compressed and an uncompressed version of the resource.
response.setHeader('Vary', 'Accept-Encoding');
const acceptEncoding = request.headers['accept-encoding'] || '';
const onError = (err) => {
if (err) {
// If an error occurs, there's not much we can do because
// the server has already sent the 200 response code and
// some amount of data has already been sent to the client.
// The best we can do is terminate the response immediately
// and log the error.
response.end();
console.error('An error occurred:', err);
}
};
// Note: This is not a conformant accept-encoding parser.
// See https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
if (/\bdeflate\b/.test(acceptEncoding)) {
response.writeHead(200, { 'Content-Encoding': 'deflate' });
pipeline(raw, zlib.createDeflate(), response, onError);
} else if (/\bgzip\b/.test(acceptEncoding)) {
response.writeHead(200, { 'Content-Encoding': 'gzip' });
pipeline(raw, zlib.createGzip(), response, onError);
} else if (/\bbr\b/.test(acceptEncoding)) {
response.writeHead(200, { 'Content-Encoding': 'br' });
pipeline(raw, zlib.createBrotliCompress(), response, onError);
} else {
response.writeHead(200, {});
pipeline(raw, response, onError);
}
}).listen(1337);CommonJS
// server example
// Running a gzip operation on every request is quite expensive.
// It would be much more efficient to cache the compressed buffer.
const zlib = require('node:zlib');
const http = require('node:http');
const fs = require('node:fs');
const { pipeline } = require('node:stream');
http.createServer((request, response) => {
const raw = fs.createReadStream('index.html');
// Store both a compressed and an uncompressed version of the resource.
response.setHeader('Vary', 'Accept-Encoding');
const acceptEncoding = request.headers['accept-encoding'] || '';
const onError = (err) => {
if (err) {
// If an error occurs, there's not much we can do because
// the server has already sent the 200 response code and
// some amount of data has already been sent to the client.
// The best we can do is terminate the response immediately
// and log the error.
response.end();
console.error('An error occurred:', err);
}
};
// Note: This is not a conformant accept-encoding parser.
// See https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
if (/\bdeflate\b/.test(acceptEncoding)) {
response.writeHead(200, { 'Content-Encoding': 'deflate' });
pipeline(raw, zlib.createDeflate(), response, onError);
} else if (/\bgzip\b/.test(acceptEncoding)) {
response.writeHead(200, { 'Content-Encoding': 'gzip' });
pipeline(raw, zlib.createGzip(), response, onError);
} else if (/\bbr\b/.test(acceptEncoding)) {
response.writeHead(200, { 'Content-Encoding': 'br' });
pipeline(raw, zlib.createBrotliCompress(), response, onError);
} else if (/\bzstd\b/.test(acceptEncoding)) {
response.writeHead(200, { 'Content-Encoding': 'zstd' });
pipeline(raw, zlib.createZstdCompress(), response, onError);
} else {
response.writeHead(200, {});
pipeline(raw, response, onError);
}
}).listen(1337);По умолчанию методы zlib при распаковке усечённых данных выбрасывают ошибку. Однако, если известно, что данные неполны, или требуется просмотреть только начало сжатого файла, стандартную обработку ошибок можно отключить, изменив метод сброса, используемый при распаковке последнего фрагмента входных данных:
// This is a truncated version of the buffer from the above examples
const buffer = Buffer.from('eJzT0yMA', 'base64');
zlib.unzip(
buffer,
// For Brotli, the equivalent is zlib.constants.BROTLI_OPERATION_FLUSH.
// For Zstd, the equivalent is zlib.constants.ZSTD_e_flush.
{ finishFlush: zlib.constants.Z_SYNC_FLUSH },
(err, buffer) => {
if (err) {
console.error('An error occurred:', err);
process.exitCode = 1;
}
console.log(buffer.toString());
}); copy Это не изменит поведение в других ситуациях, приводящих к ошибкам, например, если входные данные имеют неверный формат. При использовании этого метода определить, завершились ли входные данные преждевременно или в них отсутствуют проверки целостности, будет невозможно, поэтому необходимо вручную проверить корректность результата распаковки.
Настройка использования памяти
Для потоков на основе zlib
Из zlib/zconf.h, с изменениями для использования в Node.js:
Требования deflate к памяти (в байтах):
(1 << (windowBits + 2)) + (1 << (memLevel + 9)) copy
То есть 128 КБ для windowBits = 15 + 128 КБ для memLevel = 8 (значения по умолчанию), а также несколько килобайт для небольших объектов.
Например, чтобы уменьшить требования по умолчанию к памяти с 256 КБ до 128 КБ, следует задать параметры:
const options = { windowBits: 14, memLevel: 7 }; copy Однако это, как правило, ухудшит сжатие.
Требования inflate к памяти (в байтах) 1 << windowBits. То есть 32 КБ для windowBits = 15 (значение по умолчанию), а также несколько килобайт для небольших объектов.
Кроме того, используется один внутренний выходной буфер slab размером chunkSize; по умолчанию его размер составляет 16 КБ.
На скорость сжатия zlib сильнее всего влияет параметр level. Более высокий уровень обеспечивает лучшее сжатие, но требует больше времени. Более низкий уровень обеспечивает меньшее сжатие, но работает значительно быстрее.
В целом при выборе параметров с большим расходом памяти Node.js реже обращается к zlib, поскольку за одну операцию write сможет обработать больше данных. Это ещё один фактор, влияющий на скорость за счёт увеличения использования памяти.
Для потоков на основе Brotli
Для потоков на основе Brotli существуют аналоги параметров zlib, хотя допустимые диапазоны этих параметров отличаются от диапазонов параметров zlib:
- Параметру
BROTLI_PARAM_QUALITYBrotli соответствует параметрlevelzlib. - Параметру
BROTLI_PARAM_LGWINBrotli соответствует параметрwindowBitszlib.
Дополнительные сведения о параметрах, специфичных для Brotli, см. ниже.
Для потоков на основе Zstd
Для потоков на основе Zstd существуют аналоги параметров zlib, хотя допустимые диапазоны этих параметров отличаются от диапазонов параметров zlib:
- Параметру
ZSTD_c_compressionLevelZstd соответствует параметрlevelzlib. - Параметру
ZSTD_c_windowLogZstd соответствует параметрwindowBitszlib.
Дополнительные сведения о параметрах, специфичных для Zstd, см. ниже.
Сброс
Вызов .flush() для потока сжатия заставит zlib вернуть максимально возможное на данный момент количество выходных данных. Это может ухудшить качество сжатия, но бывает полезно, когда данные должны стать доступными как можно скорее.
В следующем примере flush() используется для отправки клиенту частичного сжатого HTTP-ответа:
Модули JavaScript
import zlib from 'node:zlib';
import http from 'node:http';
import { pipeline } from 'node:stream';
http.createServer((request, response) => {
// For the sake of simplicity, the Accept-Encoding checks are omitted.
response.writeHead(200, { 'content-encoding': 'gzip' });
const output = zlib.createGzip();
let i;
pipeline(output, response, (err) => {
if (err) {
// If an error occurs, there's not much we can do because
// the server has already sent the 200 response code and
// some amount of data has already been sent to the client.
// The best we can do is terminate the response immediately
// and log the error.
clearInterval(i);
response.end();
console.error('An error occurred:', err);
}
});
i = setInterval(() => {
output.write(`The current time is ${Date()}\n`, () => {
// The data has been passed to zlib, but the compression algorithm may
// have decided to buffer the data for more efficient compression.
// Calling .flush() will make the data available as soon as the client
// is ready to receive it.
output.flush();
});
}, 1000);
}).listen(1337);CommonJS
const zlib = require('node:zlib');
const http = require('node:http');
const { pipeline } = require('node:stream');
http.createServer((request, response) => {
// For the sake of simplicity, the Accept-Encoding checks are omitted.
response.writeHead(200, { 'content-encoding': 'gzip' });
const output = zlib.createGzip();
let i;
pipeline(output, response, (err) => {
if (err) {
// If an error occurs, there's not much we can do because
// the server has already sent the 200 response code and
// some amount of data has already been sent to the client.
// The best we can do is terminate the response immediately
// and log the error.
clearInterval(i);
response.end();
console.error('An error occurred:', err);
}
});
i = setInterval(() => {
output.write(`The current time is ${Date()}\n`, () => {
// The data has been passed to zlib, but the compression algorithm may
// have decided to buffer the data for more efficient compression.
// Calling .flush() will make the data available as soon as the client
// is ready to receive it.
output.flush();
});
}, 1000);
}).listen(1337);Константы
Константы zlib
Все константы, определённые в zlib.h, также определены в require('node:zlib').constants. В обычной работе использовать эти константы не требуется. Они задокументированы, чтобы их наличие не стало неожиданностью. Этот раздел почти полностью основан на документации zlib.
Ранее константы были доступны непосредственно из require('node:zlib'), например zlib.Z_NO_FLUSH. Прямой доступ к константам из модуля пока ещё возможен, но считается устаревшим.
Допустимые значения сброса.
zlib.constants.Z_NO_FLUSHzlib.constants.Z_PARTIAL_FLUSHzlib.constants.Z_SYNC_FLUSHzlib.constants.Z_FULL_FLUSHzlib.constants.Z_FINISHzlib.constants.Z_BLOCK
Коды возврата функций сжатия и распаковки. Отрицательные значения обозначают ошибки, положительные — особые, но нормальные события.
zlib.constants.Z_OKzlib.constants.Z_STREAM_ENDzlib.constants.Z_NEED_DICTzlib.constants.Z_ERRNOzlib.constants.Z_STREAM_ERRORzlib.constants.Z_DATA_ERRORzlib.constants.Z_MEM_ERRORzlib.constants.Z_BUF_ERRORzlib.constants.Z_VERSION_ERROR
Уровни сжатия.
zlib.constants.Z_NO_COMPRESSIONzlib.constants.Z_BEST_SPEEDzlib.constants.Z_BEST_COMPRESSIONzlib.constants.Z_DEFAULT_COMPRESSION
Стратегия сжатия.
zlib.constants.Z_FILTEREDzlib.constants.Z_HUFFMAN_ONLYzlib.constants.Z_RLEzlib.constants.Z_FIXEDzlib.constants.Z_DEFAULT_STRATEGY
Константы Brotli
Для потоков на основе Brotli доступны различные параметры и другие константы:
Операции сброса
Для потоков на основе Brotli допустимы следующие значения операций сброса:
-
zlib.constants.BROTLI_OPERATION_PROCESS(по умолчанию для всех операций) -
zlib.constants.BROTLI_OPERATION_FLUSH(по умолчанию при вызове.flush()) -
zlib.constants.BROTLI_OPERATION_FINISH(по умолчанию для последнего фрагмента) -
zlib.constants.BROTLI_OPERATION_EMIT_METADATA- Эту операцию может быть сложно использовать в контексте Node.js, поскольку уровень потоков затрудняет определение того, какие данные попадут в этот кадр. Кроме того, в настоящее время через API Node.js нельзя использовать эти данные.
Параметры компрессора
Для кодировщиков Brotli можно задать различные параметры, влияющие на эффективность и скорость сжатия. И ключи, и значения доступны как свойства объекта zlib.constants.
Наиболее важные параметры:
-
BROTLI_PARAM_MODE-
BROTLI_MODE_GENERIC(по умолчанию) -
BROTLI_MODE_TEXT, настроен для текста UTF-8 -
BROTLI_MODE_FONT, настроен для шрифтов WOFF 2.0
-
-
BROTLI_PARAM_QUALITY- Диапазон от
BROTLI_MIN_QUALITYдоBROTLI_MAX_QUALITY, значение по умолчанию —BROTLI_DEFAULT_QUALITY.
- Диапазон от
-
BROTLI_PARAM_SIZE_HINT- Целочисленное значение, представляющее ожидаемый размер входных данных; по умолчанию для неизвестного размера входных данных используется
0.
- Целочисленное значение, представляющее ожидаемый размер входных данных; по умолчанию для неизвестного размера входных данных используется
Для расширенного управления алгоритмом сжатия и настройки использования памяти можно задать следующие флаги:
-
BROTLI_PARAM_LGWIN- Диапазон от
BROTLI_MIN_WINDOW_BITSдоBROTLI_MAX_WINDOW_BITS, значение по умолчанию —BROTLI_DEFAULT_WINDOWили доBROTLI_LARGE_MAX_WINDOW_BITS, если установлен флагBROTLI_PARAM_LARGE_WINDOW.
- Диапазон от
-
BROTLI_PARAM_LGBLOCK- Диапазон от
BROTLI_MIN_INPUT_BLOCK_BITSдоBROTLI_MAX_INPUT_BLOCK_BITS.
- Диапазон от
-
BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING- Логический флаг, снижающий степень сжатия в пользу скорости распаковки.
-
BROTLI_PARAM_LARGE_WINDOW- Логический флаг, включающий режим «Large Window Brotli» (несовместим с форматом Brotli, стандартизированным в RFC 7932).
-
BROTLI_PARAM_NPOSTFIX- Диапазон от
0доBROTLI_MAX_NPOSTFIX.
- Диапазон от
-
BROTLI_PARAM_NDIRECT- Диапазон от
0до15 << NPOSTFIXс шагом1 << NPOSTFIX.
- Диапазон от
Параметры распаковщика
Для управления распаковкой доступны следующие расширенные параметры:
-
BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION- Логический флаг, влияющий на внутренние схемы выделения памяти.
-
BROTLI_DECODER_PARAM_LARGE_WINDOW- Логический флаг, включающий режим «Large Window Brotli» (несовместим с форматом Brotli, стандартизированным в RFC 7932).
Константы Zstd
Для потоков на основе Zstd доступны различные параметры и другие константы:
Операции сброса
Для потоков на основе Zstd допустимы следующие значения операций сброса:
-
zlib.constants.ZSTD_e_continue(по умолчанию для всех операций) -
zlib.constants.ZSTD_e_flush(по умолчанию при вызове.flush()) -
zlib.constants.ZSTD_e_end(по умолчанию для последнего фрагмента)
Параметры компрессора
Для кодировщиков Zstd можно задать различные параметры, влияющие на эффективность и скорость сжатия. И ключи, и значения доступны как свойства объекта zlib.constants.
Наиболее важные параметры:
-
ZSTD_c_compressionLevel- Задаёт параметры сжатия согласно предопределённой таблице cLevel. Уровень по умолчанию — ZSTD_CLEVEL_DEFAULT==3.
-
ZSTD_c_strategy- Выбирает стратегию сжатия.
- Возможные значения перечислены ниже в разделе параметров стратегии.
Параметры стратегии
Для параметра ZSTD_c_strategy можно использовать следующие константы:
zlib.constants.ZSTD_fastzlib.constants.ZSTD_dfastzlib.constants.ZSTD_greedyzlib.constants.ZSTD_lazyzlib.constants.ZSTD_lazy2zlib.constants.ZSTD_btlazy2zlib.constants.ZSTD_btoptzlib.constants.ZSTD_btultrazlib.constants.ZSTD_btultra2
Пример:
const stream = zlib.createZstdCompress({
params: {
[zlib.constants.ZSTD_c_strategy]: zlib.constants.ZSTD_btultra,
},
}); copy Заявленный размер исходных данных
Ожидаемый общий размер несжатых входных данных можно указать с помощью opts.pledgedSrcSize. Если в конце обработки входных данных размер не совпадает, сжатие завершится ошибкой с кодом ZSTD_error_srcSize_wrong.
Параметры распаковщика
Для управления распаковкой доступны следующие расширенные параметры:
-
ZSTD_d_windowLogMax- Задаёт ограничение размера (степень 2), превышение которого заставит API потоков отказаться от выделения буфера памяти, чтобы защитить хост от чрезмерных требований к памяти.
Класс: Options
Каждый класс на основе zlib принимает объект options. Ни один из параметров не является обязательным.
Некоторые параметры имеют значение только при сжатии и игнорируются классами распаковки.
-
flush<integer> По умолчанию:zlib.constants.Z_NO_FLUSH -
finishFlush<integer> По умолчанию:zlib.constants.Z_FINISH -
chunkSize<integer> По умолчанию:16 * 1024 -
windowBits<integer> -
level<integer> (только сжатие) -
memLevel<integer> (только сжатие) -
strategy<integer> (только сжатие) -
dictionary<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> (только deflate/inflate, по умолчанию пустой словарь) -
info<boolean> (Еслиtrue, возвращает объект сbufferиengine.) -
maxOutputLength<integer> Ограничивает размер выходных данных при использовании вспомогательных методов. По умолчанию:buffer.kMaxLength
Дополнительную информацию см. в документации deflateInit2 и inflateInit2.
Класс: BrotliOptions
Каждый класс на основе Brotli принимает объект options. Все параметры необязательны.
-
flush<integer> По умолчанию:zlib.constants.BROTLI_OPERATION_PROCESS -
finishFlush<integer> По умолчанию:zlib.constants.BROTLI_OPERATION_FINISH -
chunkSize<integer> По умолчанию:16 * 1024 -
params<Object> Объект «ключ — значение», содержащий индексированные параметры Brotli. -
maxOutputLength<integer> Ограничивает размер выходных данных при использовании вспомогательных методов. По умолчанию:buffer.kMaxLength -
info<boolean> Еслиtrue, возвращает объект сbufferиengine. По умолчанию:false
Например:
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,
},
}); copy Класс: zlib.BrotliCompress
- Наследует:
ZlibBase
Сжимает данные с помощью алгоритма Brotli.
Класс: zlib.BrotliDecompress
- Наследует:
ZlibBase
Распаковывает данные с помощью алгоритма Brotli.
Класс: zlib.Deflate
- Наследует:
ZlibBase
Сжимает данные с помощью deflate.
Класс: zlib.DeflateRaw
- Наследует:
ZlibBase
Сжимает данные с помощью deflate без добавления заголовка zlib.
Класс: zlib.Gunzip
- Наследует:
ZlibBase
Распаковывает поток gzip.
Класс: zlib.Gzip
- Наследует:
ZlibBase
Сжимает данные с помощью gzip.
Класс: zlib.Inflate
- Наследует:
ZlibBase
Распаковывает поток deflate.
Класс: zlib.InflateRaw
- Наследует:
ZlibBase
Распаковывает сырой поток deflate.
Класс: zlib.Unzip
- Наследует:
ZlibBase
Распаковывает поток, сжатый с помощью Gzip или Deflate, автоматически определяя заголовок.
Класс: zlib.ZlibBase
- Наследует:
stream.Transform
Не экспортируется модулем node:zlib. Этот класс описан здесь, поскольку он является базовым для классов сжатия и распаковки.
Этот класс наследуется от stream.Transform, что позволяет использовать объекты node:zlib в конвейерах и подобных операциях с потоками.
zlib.bytesRead
zlib.bytesWritten.Устаревший псевдоним для zlib.bytesWritten. Это исходное имя было выбрано потому, что значение можно было интерпретировать как количество байтов, прочитанных обработчиком, но оно не согласуется с другими потоками Node.js, которые используют эти имена для своих значений.
zlib.bytesWritten
- Тип: <number>
Свойство zlib.bytesWritten задаёт количество байтов, записанных в обработчик до их обработки (сжатия или распаковки, в зависимости от производного класса).
zlib.flush([kind, ]callback)
-
kindПо умолчанию:zlib.constants.Z_FULL_FLUSHдля потоков на основе zlib,zlib.constants.BROTLI_OPERATION_FLUSHдля потоков на основе Brotli. -
callback<Function>
Сбрасывает ожидающие обработки данные. Не вызывайте этот метод без необходимости: преждевременный сброс отрицательно влияет на эффективность алгоритма сжатия.
Этот вызов сбрасывает данные только из внутреннего состояния zlib и не выполняет сброс на уровне потоков. Он ведёт себя как обычный вызов .write(): вызов ставится в очередь за другими ожидающими записями и выдаёт результат только при чтении данных из потока.
zlib.params(level, strategy, callback)
-
level<integer> -
strategy<integer> -
callback<Function>
Эта функция доступна только для потоков на основе zlib, то есть не для Brotli.
Динамически обновляет уровень и стратегию сжатия. Применяется только к алгоритму deflate.
zlib.reset()
Сбрасывает компрессор или распаковщик к заводским настройкам. Применяется только к алгоритмам inflate и deflate.
Класс: ZstdOptions
Каждый класс на основе Zstd принимает объект options. Все параметры необязательны.
-
flush<integer> По умолчанию:zlib.constants.ZSTD_e_continue -
finishFlush<integer> По умолчанию:zlib.constants.ZSTD_e_end -
chunkSize<integer> По умолчанию:16 * 1024 -
params<Object> Объект «ключ — значение», содержащий индексированные параметры Zstd. -
maxOutputLength<integer> Ограничивает размер выходных данных при использовании вспомогательных методов. По умолчанию:buffer.kMaxLength -
info<boolean> Еслиtrue, возвращает объект сbufferиengine. По умолчанию:false -
dictionary<Buffer> Необязательный словарь, используемый для повышения эффективности сжатия при сжатии или распаковке данных, содержащих общие с ним шаблоны.
Например:
const stream = zlib.createZstdCompress({
chunkSize: 32 * 1024,
params: {
[zlib.constants.ZSTD_c_compressionLevel]: 10,
[zlib.constants.ZSTD_c_checksumFlag]: 1,
},
}); copy Класс: zlib.ZstdCompress
Сжимает данные с помощью алгоритма Zstd.
Класс: zlib.ZstdDecompress
Распаковывает данные с помощью алгоритма Zstd.
zlib.constants
Предоставляет объект с перечислением констант, связанных с Zlib.
zlib.crc32(data[, value])
-
data<string> | <Buffer> | <TypedArray> | <DataView> Еслиdata— строка, перед вычислением она будет закодирована в UTF-8. -
value<integer> Необязательное начальное значение. Оно должно быть 32-битным беззнаковым целым числом. По умолчанию:0 - Возвращает: <integer> 32-битное беззнаковое целое число, содержащее контрольную сумму.
Вычисляет 32-битную контрольную сумму циклического избыточного кода для data. Если указано value, оно используется в качестве начального значения контрольной суммы; в противном случае начальным значением будет 0.
Алгоритм CRC предназначен для вычисления контрольных сумм и обнаружения ошибок при передаче данных. Он не подходит для криптографической аутентификации.
Для совместимости с другими API, если data — строка, перед вычислением она будет закодирована в UTF-8. Если пользователи используют Node.js только для вычисления и сравнения контрольных сумм, это обеспечивает совместимость с другими API, которые по умолчанию используют кодировку UTF-8.
Некоторые сторонние библиотеки JavaScript вычисляют контрольную сумму строки на основе str.charCodeAt(), чтобы их можно было использовать в браузерах. Если пользователям нужно сравнить результат с контрольной суммой, вычисленной такой библиотекой в браузере, лучше использовать ту же библиотеку в Node.js, если она также там работает. Если для сравнения с контрольной суммой, полученной такой сторонней библиотекой, необходимо использовать zlib.crc32():
- Если библиотека принимает
Uint8Arrayв качестве входных данных, используйте в браузереTextEncoder, чтобы закодировать строку вUint8Arrayс кодировкой UTF-8, а затем вычислите контрольную сумму на основе строки, закодированной в UTF-8. - Если библиотека принимает только строку и вычисляет контрольную сумму на основе
str.charCodeAt(), на стороне Node.js преобразуйте строку в буфер с помощьюBuffer.from(str, 'utf16le').
Модули JavaScript
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); // 4150509955CommonJS
const 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); // 4150509955
zlib.createBrotliCompress([options])
-
options<параметры brotli>
Создает и возвращает новый объект BrotliCompress.
zlib.createBrotliDecompress([options])
-
options<параметры brotli>
Создает и возвращает новый объект BrotliDecompress.
zlib.createDeflate([options])
-
options<параметры zlib>
Создает и возвращает новый объект Deflate.
zlib.createDeflateRaw([options])
-
options<параметры zlib>
Создает и возвращает новый объект DeflateRaw.
При обновлении zlib с версии 1.2.8 до 1.2.11 изменилось поведение в случаях, когда для потоков raw deflate значение windowBits равно 8. zlib автоматически устанавливал windowBits в значение 9, если изначально оно было равно 8. Более новые версии zlib вызывают исключение, поэтому Node.js восстановил исходное поведение, при котором значение 8 преобразуется в 9, поскольку передача windowBits = 9 в zlib фактически приводит к сжатому потоку, использующему только 8-битное окно.
zlib.createGunzip([options])
-
options<параметры zlib>
Создает и возвращает новый объект Gunzip.
zlib.createGzip([options])
-
options<параметры zlib>
zlib.createInflate([options])
-
options<параметры zlib>
Создает и возвращает новый объект Inflate.
zlib.createInflateRaw([options])
-
options<параметры zlib>
Создает и возвращает новый объект InflateRaw.
zlib.createUnzip([options])
-
options<параметры zlib>
Создает и возвращает новый объект Unzip.
zlib.createZstdCompress([options])
-
options<параметры zstd>
Создает и возвращает новый объект ZstdCompress.
zlib.createZstdDecompress([options])
-
options<параметры zstd>
Создает и возвращает новый объект ZstdDecompress.
Вспомогательные методы
Все эти методы принимают в качестве первого аргумента <Buffer>, <TypedArray>, <DataView>, <ArrayBuffer> или строку, а также необязательный второй аргумент для передачи параметров классам zlib и вызывают переданную функцию обратного вызова с callback(error, result).
У каждого метода есть вариант *Sync, который принимает те же аргументы, но без функции обратного вызова.
zlib.brotliCompress(buffer[, options], callback)
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры Brotli> -
callback<Function>
zlib.brotliCompressSync(buffer[, options])
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры Brotli>
Сжимает фрагмент данных с помощью BrotliCompress.
zlib.brotliDecompress(buffer[, options], callback)
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры Brotli> -
callback<Function>
zlib.brotliDecompressSync(buffer[, options])
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры Brotli>
Распаковывает фрагмент данных с помощью BrotliDecompress.
zlib.deflate(buffer[, options], callback)
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры zlib> -
callback<Function>
zlib.deflateSync(buffer[, options])
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры zlib>
Сжимает фрагмент данных с помощью Deflate.
zlib.deflateRaw(buffer[, options], callback)
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры zlib> -
callback<Function>
zlib.deflateRawSync(buffer[, options])
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры zlib>
Сжимает фрагмент данных с помощью DeflateRaw.
zlib.gunzip(buffer[, options], callback)
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры zlib> -
callback<Function>
zlib.gunzipSync(buffer[, options])
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры zlib>
Распаковывает фрагмент данных с помощью Gunzip.
zlib.gzip(buffer[, options], callback)
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры zlib> -
callback<Function>
zlib.gzipSync(buffer[, options])
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры zlib>
Сжимает фрагмент данных с помощью Gzip.
zlib.inflate(buffer[, options], callback)
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры zlib> -
callback<Function>
zlib.inflateSync(buffer[, options])
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры zlib>
Распаковывает фрагмент данных с помощью Inflate.
zlib.inflateRaw(buffer[, options], callback)
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры zlib> -
callback<Function>
zlib.inflateRawSync(buffer[, options])
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры zlib>
Распаковывает фрагмент данных с помощью InflateRaw.
zlib.unzip(buffer[, options], callback)
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры zlib> -
callback<Function>
zlib.unzipSync(buffer[, options])
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры zlib>
Распаковывает фрагмент данных с помощью Unzip.
zlib.zstdCompress(buffer[, options], callback)
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры Zstandard> -
callback<Function>
zlib.zstdCompressSync(buffer[, options])
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры Zstandard>
Сжимает фрагмент данных с помощью ZstdCompress.
zlib.zstdDecompress(buffer[, options], callback)
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<параметры Zstandard> -
callback<Function>
zlib.zstdDecompressSync(buffer[, options])
-
buffer<Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> | <string> -
options<zstd options>
Распаковывает фрагмент данных с помощью ZstdDecompress.
© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/dist/latest-v22.x/docs/api/zlib.html