@haandev/core
Version:
Core library for @haandev packages
94 lines (93 loc) • 2.41 kB
JavaScript
// src/event/EventListener.ts
var EventListener = class {
listeners = {};
allListeners = /* @__PURE__ */ new Set();
on(event, callback) {
if (!this.listeners[event]) this.listeners[event] = /* @__PURE__ */ new Set();
this.listeners[event].add(callback);
return () => this.off(event, callback);
}
off(event, callback) {
this.listeners[event]?.delete(callback);
if (this.listeners[event]?.size === 0) {
delete this.listeners[event];
}
}
onAll(callback) {
this.allListeners.add(callback);
return () => this.offAll(callback);
}
offAll(callback) {
this.allListeners.delete(callback);
}
once(event, callback) {
const onceWrapper = (...args) => {
this.off(event, onceWrapper);
callback(...args);
};
this.on(event, onceWrapper);
}
async emit(event, ...args) {
const callbacks = this.listeners[event] ?? /* @__PURE__ */ new Set();
const results = [];
const errors = [];
let signal;
if (args.length && args[args.length - 1] instanceof AbortSignal) {
signal = args.pop();
}
for (const cb of callbacks) {
if (signal?.aborted) break;
try {
const result = signal ? await cb(...args, signal) : await cb(...args);
results.push(result);
} catch (err) {
errors.push(err);
}
}
return { results, errors };
}
emitSync(event, ...args) {
const callbacks = this.listeners[event] ?? /* @__PURE__ */ new Set();
const results = [];
const errors = [];
let signal;
if (args.length && args[args.length - 1] instanceof AbortSignal) {
signal = args.pop();
}
for (const cb of callbacks) {
if (signal?.aborted) break;
try {
const result = signal ? cb(...args, signal) : cb(...args);
results.push(result);
} catch (err) {
errors.push(err);
}
}
return { results, errors };
}
hasListeners(event) {
return !!this.listeners[event]?.size;
}
clear(event) {
if (event) {
delete this.listeners[event];
} else {
this.listeners = {};
}
}
listeningEvents() {
return Object.keys(this.listeners).filter(
(k) => this.listeners[k]?.size
);
}
// sugar methods
addListener(event, callback) {
this.on(event, callback);
}
removeListener(event, callback) {
this.off(event, callback);
}
};
export {
EventListener
};