sqmicro-streams
Version:
SQ micro streams.
90 lines (80 loc) • 2.84 kB
JavaScript
/**
* Оболочка над объектом подключения, превращающая его в поток. При поступлении
* на вход события применяется метод 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(' '));
}
}