sqmicro-streams
Version:
SQ micro streams.
82 lines (71 loc) • 2.34 kB
JavaScript
/**
* Поток событий с буфером. События накапливаются в буфере. При вызове метода
* `flush` поток выдает на выход буфер, и снова начинает накапливать события.
*/
const { Transform } = require('stream');
/**
* Буфер для потоков.
* @interface IStreamBuffer
*
* Количество элементов в буфере.
* @member {number} size
*
* Записать элемент в буфер.
* @method write
* @param {*} event
*/
/**
* Фабрика буферов - функция, которая возвращает экземпляр IStreamBuffer.
* @interface IStreamBufferFactory
* @type {function}
* @returns {IStreamBuffer}
*/
const ArrayStreamBuffer = require('./array-stream-buffer');
const Private = Symbol['Private'];
module.exports = class BufferedStream extends Transform {
/**
* Создать экземпляр потока.
* @param {object?} options
* @param {IStreamBufferFactory} [options.bufferFactory] Фабрика буферов. По
* умолчанию используется фабрика ArrayStreamBuffer.
*/
constructor(options) {
options = Object.assign({ objectMode: true }, options);
super(options);
const pvt = this[Private] = {};
pvt.bufferFactory = options.bufferFactory ||
(() => new ArrayStreamBuffer());
pvt.buffer = pvt.bufferFactory();
}
/**
* Если в буфере есть события отправить его на выход. Создать новый буфер.
*/
flush() {
const pvt = this[Private];
if (pvt.buffer.size > 0) {
this.push(pvt.buffer);
pvt.buffer = pvt.bufferFactory();
}
}
/**
* Хэлпер stream.Transform.
* @private
* @param {function} cb
*/
_flush(cb) {
this.flush();
cb();
}
/**
* Хэлпер stream.Transform.
* @private
* @param {*} event
* @param {*} encoding
* @param {function} cb
*/
_transform(event, encoding, cb) {
const { buffer } = this[Private];
buffer.write(event);
cb();
}
};