Перейти к содержанию

Итерируемое сжатие

latest

Стабильность: 1 – Экспериментальная

Эта возможность не подпадает под правила семантического версионирования. Несовместимые назад изменения или удаление могут произойти в любом будущем релизе. Использовать такую возможность в production-окружении не рекомендуется.

Модуль node:zlib/iter предоставляет преобразования сжатия и распаковки для API итерируемых потоков [node:stream/iter][].

Модуль доступен только при включённом флаге CLI --experimental-stream-iter.

У каждого алгоритма есть асинхронный вариант (сохраняющий состояние async generator — для [pull()][] и [pipeTo()][]) и синхронный вариант (сохраняющий состояние sync generator — для pullSync() и pipeToSync()).

Асинхронные преобразования выполняют сжатие в пуле потоков libuv, перекрывая ввод-вывод с выполнением JavaScript. Синхронные выполняют сжатие прямо в основном потоке.

Примечание: значения по умолчанию для этих преобразований настроены на пропускную способность потоковой передачи и отличаются от значений по умолчанию в node:zlib. В частности, для gzip/deflate по умолчанию уровень 4 (не 6) и memLevel 9 (не 8), для Brotli — качество 6 (не 11). Это соответствует типичным настройкам HTTP-серверов и даёт заметно более быстрое сжатие при небольшом снижении степени сжатия. Все значения по умолчанию можно переопределить через опции.

1
2
3
4
5
6
7
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'
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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);
1
2
3
4
5
6
7
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'
1
2
3
4
5
6
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'

compressBrotli([options])

compressBrotliSync([options])

Комментарии