@nent/core
Version:
77 lines (76 loc) • 1.93 kB
JavaScript
/*!
* NENT 2022
*/
/* istanbul ignore file */
export class EventEmitter {
constructor() {
this.events = {};
this.wildcardEvents = [];
}
recalcWildcardEvents() {
const newWildCardEvents = [];
for (const i in this.events) {
if (i.endsWith('*') &&
this.events[i] &&
this.events[i].length > 0) {
newWildCardEvents.push(i);
}
}
this.wildcardEvents = newWildCardEvents;
}
on(event, listener) {
if (typeof this.events[event] !== 'object') {
this.events[event] = [];
}
this.events[event].push(listener);
this.recalcWildcardEvents();
return () => {
this.removeListener(event, listener);
};
}
removeListener(event, listener) {
if (typeof this.events[event] !== 'object') {
return;
}
const idx = this.events[event].indexOf(listener);
if (idx > -1) {
this.events[event].splice(idx, 1);
}
this.recalcWildcardEvents();
}
removeAllListeners() {
Object.keys(this.events).forEach((event) => this.events[event].splice(0, this.events[event].length));
this.recalcWildcardEvents();
}
emit(event, ...args) {
if (typeof this.events[event] === 'object') {
;
[...this.events[event]].forEach(listener => {
listener.apply(this, args);
});
}
if (event !== '*') {
this.emit('*', event, ...args);
return;
}
for (const rawWcEvent of this.wildcardEvents) {
const wcEvent = rawWcEvent.slice(0, rawWcEvent.endsWith('.*') ? -2 : -1);
if (!event.endsWith('*') &&
event !== wcEvent &&
event.startsWith(wcEvent)) {
this.emit(rawWcEvent, event, ...args);
}
}
}
once(event, listener) {
const remove = this.on(event, (...args) => {
remove();
listener.apply(this, args);
this.recalcWildcardEvents();
});
return remove;
}
destroy() {
this.removeAllListeners();
}
}