UNPKG

als-event-emitter

Version:

A powerful, asynchronous, promise-based event emitter with support for chaining and advanced event handling.

68 lines (59 loc) 2.71 kB
const SmartPromise = require('als-smart-promise') class EventEmitter { static once(listener) { SmartPromise.use(listener, { once: true, last:false }) } static onLast(listener) { SmartPromise.use(listener, { once: false, last:true }) } static onceLast(listener) { SmartPromise.use(listener, { once: true, last:true }) } static on(listener, options = {}) { SmartPromise.use(listener,options) } static removeAllListeners() {SmartPromise.chain.clear()} constructor(chain = true,timeout = null) { this.chain = chain this.timeout = timeout this.removeAllListeners() } removeAllListeners() { this.listeners = {} this.anyChain = new SmartPromise() return this } getChain(eventName, group) { if (!this.listeners[eventName]) { this.listeners[eventName] = new SmartPromise(this.timeout,eventName) this.listeners[eventName].link(this.anyChain) if(this.listeners[group]) this.listeners[eventName].link(this.listeners[group]) } return this.listeners[eventName] } has(eventName) { return !!this.listeners[eventName] && this.listeners[eventName].chain.size > 0 } off(eventName) { delete this.listeners[eventName]; return this } on(eventName, listener, options = {}) { const { once = false, last = false, group } = options const chain = this.getChain(eventName, group) chain.use(listener, { once, last }) return this } removeListener(listener) { this.anyChain.delete(listener) for (let eventName in this.listeners) { this.listeners[eventName].chain.delete(listener) } return this; } onAny(listener, options = {}) { const { once = false, last = false } = options this.anyChain.use(listener, { once, last }) return this; } emit(eventName, ...args) { const chain = this.listeners[eventName] || this.anyChain; if (this.chain) return chain.execute(...args) const fns = chain.getFns() fns.forEach(fn => fn(...args)); } once(eventName, listener, group) { return this.on(eventName, listener, { once: true, group }) } onLast(eventName, listener, group) { return this.on(eventName, listener, { once: false, last: true, group }) } onceLast(eventName, listener, group) { return this.on(eventName, listener, { once: true, last: true, group }) } onceAnyLast(listener) { return this.onAny(listener, { once: true, last: true }) } onAnyLast(listener) { return this.onAny(listener, { once: false, last: true }) } onceAny(listener) { return this.onAny(listener, { once: true }) } } module.exports = EventEmitter