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
JavaScript
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