UNPKG

sqmicro-connection

Version:

Connection abstraction for SQ Micro.

65 lines (58 loc) 2.06 kB
const zlib = require('zlib'); const { Transform } = require('stream'); const { promisifyEventEmitter } = require('sqmicro-commons'); const Private = Symbol['Private']; /** * Обертка для серии потоков. Наследует от stream.Transform. Поскольку сливает * сам себя в трубу (Readable), его нужно использовать как Writable. * @param {Array<Transform|Writable>} список потоков в порядке соединения. * Последний может быть `Writable`, остальные - только Transform. * @param {object} options опции базового потока Transform. * */ module.exports = class WritePipeline extends Transform { constructor(streams, options) { super(options); const pvt = this[Private] = { streams }; streams.reduce(pipeStreams.bind(null, this), this); } /** * Добавить поток в хвост серии. * @param {Transform|Writable} stream. */ appendStream(stream) { const pvt = this[Private]; const last = pvt.streams[pvt.streams.length - 1]; pvt.streams.push(stream); pipeStreams(this, last, stream); } /** Интерфейс stream.Transform. */ _transform(obj, _, cb) { this.push(obj); cb(); } /** * Завершить работу серии. * @returns {Promise}. */ async end() { const pvt = this[Private]; const last = pvt.streams[pvt.streams.length - 1]; const promise = promisifyEventEmitter(last); super.end(); await promise; return; } }; /** * Слить поток src в поток dst. Перенаправить события ошибок на line. * @inner * @param {WritePipeline} line * @param {Readable} src * @param {Writable} dest * @returns dest. */ function pipeStreams(line, src, dest) { dest.on('error', e => line.emit('error', e)); return src.pipe(dest); }