sqmicro-connection
Version:
Connection abstraction for SQ Micro.
65 lines (58 loc) • 2.06 kB
JavaScript
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);
}