Перейти к содержимому
Разделы
ЯзыкRUEN

v2.1API

parser.stream() и Transform

Асинхронный итератор и object-mode Transform для встраивания разборщика в конвейер потоков Node.js.

Есть два способа подключить разборщик к потоку: итератор для обычного кода и Transform для конвейеров pipeline.

Асинхронный итератор#

ts
parser.stream(source: Readable, opts?: { signal?: AbortSignal }): AsyncIterable<Record>

Источник читается лениво, порция за порцией. Подробности про память и остановку — в разделе потоки.

Transform#

js
import { pipeline } from 'node:stream/promises';
import { createTransform } from 'sverlo';

await pipeline(
  createReadStream('app.log'),
  createTransform({ format: 'json-lines', query: 'level>=error' }),
  async function* (records) {
    for await (const rec of records) yield JSON.stringify(rec) + '\n';
  },
  createWriteStream('errors.ndjson')
);

createTransform принимает те же параметры, что и createParser, плюс необязательный query. На вход идут байты или строки, на выходе объекты Record, поток работает в object mode.

События и статистика#

СобытиеКогда
'skip'Строка не разобрана и пропущена; аргумент — ParseError
'stats'Раз в statsEvery строк (по умолчанию 10000); аргумент — копия parser.stats
js
transform.on('skip', (e) => metrics.inc('skipped', { code: e.code }));

Ошибки в конвейере#

В режиме onError: 'throw' исключение уничтожает поток обычным способом, и pipeline завершится с ошибкой. В остальных режимах ошибки разбора до pipeline не доходят, их нужно собирать через 'skip' или parser.errors.

Один Transform на файл

Состояние многострочной записи хранится в потоке. Если переиспользовать один экземпляр для двух файлов подряд, хвост первого файла приклеится к началу второго. Создавайте новый Transform на каждый источник.

Обновлено: