UNPKG

sqmicro-streams

Version:

SQ micro streams.

90 lines (80 loc) 2.84 kB
/** * Оболочка над объектом подключения, превращающая его в поток. При поступлении * на вход события применяется метод mapEvent, в котором должна быть определена * логика записи события в соединение. */ const { Writable } = require('stream'); const Private = Symbol('Private'); /** @abstract */ module.exports = class ConnectionStream extends Writable { /** * Объект соединения, связанный с потоком. */ get connection() { return this[Private].connection; } /** * Создать экземпляр потока. * @param {object} conf Конфигурация. * @param {IConnection} conf.connection экземпляр объекта соединения. */ constructor(conf) { const options = Object.assign({}, conf, { objectMode: true }); super(options); validateConfig(this, conf); const pvt = this[Private] = {}; pvt.connection = conf.connection; } /** * Логика записи события в соединение. * @abstract * @param {*} event Событие. */ async mapEvent(event) { throw Error(`async #map(event) should be implemented in the daughter class`); } /** * Проверить валидность объекта соединения. * @virtual * @param {IConnection} connection Объект соединения. * @returns {Array.<string>} Список найденных проблем. Если пустой - значит * объект соединения валиден. */ validateConnection(connection) { return []; } /** * Хэлпер stream.Writable. * @param {*} event * @param {*} encoding * @param {function} callback */ _write(event, encoding, callback) { this.mapEvent(event).then( () => callback(), (e) => callback(e) ); } }; /** * Проверить валидность конфигурации потока. * @inner * @param {ConnectionStream} self * @param {object} conf * @throws {Error} */ function validateConfig(self, conf) { validateConnection(self, conf.connection); } /** * Проверить валидность объекта соединения, используя метод * ConnectionStream#validateConnection(). * @inner * @param {ConnectionStream} self * @param {IConnection} connection * @throws {Error} */ function validateConnection(self, connection) { let errors = self.validateConnection(connection); if (errors && errors.length > 0) { throw Error(errors.join(' ')); } }