class-event
Version:
`class-event` is a `JavaScript` `npm` module that makes it easy to use events on your classes. You can also take advantage of event typing, which ensures precise arguments when you emit an event or when you listen to it.
82 lines (80 loc) • 2.72 kB
JavaScript
var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => {
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
return value;
};
class ClassEvent {
constructor() {
__publicField(this, "_maxEventBeforeWarn", 10);
__publicField(this, "_maxEventListeners", 0);
__publicField(this, "listenerList", {});
__publicField(this, "warnIssuedFor", {});
}
on(eventName, listener) {
if (!this.listenerList[eventName])
this.listenerList[eventName] = [];
const isMaxListenner = this.maxEventListeners > 0 && (this.listenerList[eventName]?.length ?? 0) >= this.maxEventListeners;
if (isMaxListenner) {
console.warn(
`The maximum number (${this.maxEventListeners}) of event listeners for "${String(
eventName
)}" has been reached. The event listener therefore did not add.`
);
}
if (this.listenerList[eventName] && !isMaxListenner) {
this.listenerList[eventName]?.push(listener);
this.checkEventList(eventName);
}
return this;
}
off(eventName, listener) {
const eventListenerList = this.listenerList[eventName];
if (eventListenerList) {
const even = (l) => l === listener;
const index = eventListenerList.findIndex(even);
eventListenerList.splice(index, 1);
}
return this;
}
emit(eventName, e) {
const eventListenerList = this.listenerList[eventName];
if (eventListenerList) {
eventListenerList.forEach((listener) => {
listener(e);
});
}
return this;
}
checkEventList(eventName) {
const eventListenerList = this.listenerList[eventName];
if (eventListenerList && eventListenerList.length >= this.maxEventBeforeWarn && !this.warnIssuedFor[eventName]) {
this.warnIssuedFor[eventName] = true;
console.warn(
`Warning: Possible memory leak, event "${String(eventName)}" contains ${eventListenerList.length} listeners.`
);
}
}
get maxEventBeforeWarn() {
return this._maxEventBeforeWarn;
}
set maxEventBeforeWarn(v) {
if (!isPositiveInteger(v)) {
throw new Error("Value is not a valid number");
}
this._maxEventBeforeWarn = v;
}
get maxEventListeners() {
return this._maxEventListeners;
}
set maxEventListeners(v) {
if (!isPositiveInteger(v)) {
throw new Error("Value is not a valid number");
}
this._maxEventListeners = v;
}
}
function isPositiveInteger(n) {
return typeof n === "number" && isFinite(n) && !isNaN(n) && n >= 0;
}
export { ClassEvent };