UNPKG

homey-api

Version:
100 lines (82 loc) 1.88 kB
'use strict'; /** * @class * @private */ class EventEmitter { constructor() { // Set Listeners Object.defineProperty(this, '__listeners', { value: {}, enumerable: false, writable: false, }); } /** * @param {string} event * @param {...any} data */ emit(event, ...data) { const listeners = this.__listeners[event]; if (Array.isArray(listeners)) { listeners.forEach(listener => { listener(...data); }); } return this; } /** * @param {string} event * @param {function} callback */ addListener(event, callback) { return this.on(event, callback); } /** * @param {string} event * @param {function} callback */ on(event, callback) { this.__listeners[event] = this.__listeners[event] || []; this.__listeners[event].push(callback); return this; } /** * @param {string} event * @param {function} callback */ once(event, callback) { const callback_ = (...args) => { this.__listeners[event] = this.__listeners[event].filter(cb => cb !== callback_); callback(...args); }; this.__listeners[event] = this.__listeners[event] || []; this.__listeners[event].push(callback_); return this; } /** * @param {string} event * @param {function} callback */ off(event, callback) { this.__listeners[event] = this.__listeners[event] || []; this.__listeners[event] = this.__listeners[event].filter(cb => cb !== callback); return this; } /** * Shortcut to {@link EventEmitter#off} * @param {string} event * @param {function} callback */ removeListener(event, callback) { return this.off(event, callback); } /** * @param {string} event */ removeAllListeners(event) { this.__listeners[event] = []; return this; } } module.exports = EventEmitter;