homey-api
Version:
100 lines (82 loc) • 1.88 kB
JavaScript
'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;