@libp2p/interface
Version:
The interface implemented by a libp2p node
56 lines • 1.82 kB
JavaScript
import { setMaxListeners } from './events.js';
/**
* An implementation of a typed event target
* etc
*/
export class TypedEventEmitter extends EventTarget {
#listeners = new Map();
constructor() {
super();
// silence MaxListenersExceededWarning warning on Node.js, this is a red
// herring almost all of the time
setMaxListeners(Infinity, this);
}
listenerCount(type) {
const listeners = this.#listeners.get(type);
if (listeners == null) {
return 0;
}
return listeners.length;
}
addEventListener(type, listener, options) {
super.addEventListener(type, listener, options);
let list = this.#listeners.get(type);
if (list == null) {
list = [];
this.#listeners.set(type, list);
}
list.push({
callback: listener,
once: (options !== true && options !== false && options?.once) ?? false
});
}
removeEventListener(type, listener, options) {
super.removeEventListener(type.toString(), listener ?? null, options);
let list = this.#listeners.get(type);
if (list == null) {
return;
}
list = list.filter(({ callback }) => callback !== listener);
this.#listeners.set(type, list);
}
dispatchEvent(event) {
const result = super.dispatchEvent(event);
let list = this.#listeners.get(event.type);
if (list == null) {
return result;
}
list = list.filter(({ once }) => !once);
this.#listeners.set(event.type, list);
return result;
}
safeDispatchEvent(type, detail = {}) {
return this.dispatchEvent(new CustomEvent(type, detail));
}
}
//# sourceMappingURL=event-target.js.map