@zodash/event
Version:
event emitter
77 lines (76 loc) • 2.1 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventEmitter = exports.Event = void 0;
const once_1 = require("@zodash/once");
const LISTENERS = Symbol('listeners');
class Event {
constructor() {
this[_a] = {};
}
get listeners() {
return this[LISTENERS];
}
on(event, listener) {
if (!this.listeners[event]) {
this.listeners[event] = [];
}
this.listeners[event].push(listener);
return this;
}
off(event, listener) {
if (this.listeners[event]) {
const all = this.listeners[event];
all.splice(all.indexOf(listener), 1);
}
return this;
}
once(event, listener) {
if (!this.listeners[event]) {
this.listeners[event] = [];
}
this.listeners[event].push(once_1.once(listener));
return this;
}
emit(event, ...args) {
if (this.listeners[event]) {
const partListeners = this.listeners[event];
partListeners.forEach((listener) => {
if (event === 'error') {
return listener.apply(this, args);
}
try {
listener.apply(this, args);
}
catch (error) {
this.emit('error', error);
}
});
return this;
}
// if no error listener, just throw
if (event === 'error') {
if (args[0] instanceof Error) {
throw args[0];
}
throw new Error(String(args[0]));
}
return this;
}
addListener(event, listener) {
return this.on(event, listener);
}
removeListener(event, listener) {
return this.off(event, listener);
}
removeAllListeners(event) {
if (this.listeners[event]) {
delete this.listeners[event];
}
return this;
}
}
exports.Event = Event;
_a = LISTENERS;
// alias of Event
exports.EventEmitter = Event;