UNPKG

@haandev/core

Version:

Core library for @haandev packages

94 lines (93 loc) 2.41 kB
// 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 };