import { EventEmitter } from 'events' const LOG_CHANNELS = [ 'emergency', 'critical', 'error', 'warning', 'notice', 'info', 'debug' ]; /** * Ayetier EventSystem module * * @class EventSystem * @extends EventEmitter */ export class EventSystem extends EventEmitter { /** * @class EventSystem * @constructor * @param {{maxListeners?: number}} [options] */ constructor (options = { maxListeners: 50 }) { super(); // Set Max Listeners (@default - 50) let maxListeners = (options.maxListeners) ? options.maxListeners : 50; this.setMaxListeners(maxListeners); // default error listener to handle error exceptions this.on('error', (...args) => { let listeners = this.listeners('error'); if ( listeners.length < 2 ) console.error('NodeEventSystem Error: ', ...args); }); } /** * Links an Emitter objects log events to the primary event system * * @methodOf EventSystem * @param {EventEmitter} emitter */ public syncLogChannels (emitter) { try { LOG_CHANNELS.forEach(level => emitter.on(level, (...args) => this.emit(level, ...args))); } catch (e) { this.emit('error', `Error linking log events to emitter`, e); } } /** * Links an Emitter objects log events to the primary event system * * @alias EventSystem.syncLogChannels * @methodOf EventSystem * @param {EventEmitter} emitter */ public syncLogEvents (emitter) { this.syncLogChannels(emitter); } }