UNPKG

sqmicro-streams

Version:

SQ micro streams.

82 lines (71 loc) 2.34 kB
/** * Поток событий с буфером. События накапливаются в буфере. При вызове метода * `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(); } };