UNPKG

@glandjs/events

Version:

A fast, zero‑dependency event broker and message bus for building scalable, event‑driven applications.

61 lines (60 loc) 2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EventWatcher = void 0; class EventWatcher { constructor(timeout) { this.timeout = timeout; this.waitingEvents = new Map(); } watch(event, timeoutMs) { const timeout = timeoutMs ?? this.timeout; return new Promise((resolve, reject) => { if (!this.waitingEvents.has(event)) { this.waitingEvents.set(event, []); } const timer = setTimeout(() => { this.cleanupEvent(event, timer); console.warn(`Event '${event}' timed out after ${timeout}ms`); reject(new Error(`Event '${event}' timed out after ${timeout}ms`)); }, timeout); this.waitingEvents.get(event).push({ resolve, reject, timer, }); }); } onEmit(event, payload) { const waiters = this.waitingEvents.get(event); if (!waiters || waiters.length === 0) { return; } for (const waiter of waiters) { clearTimeout(waiter.timer); waiter.resolve(payload); } this.waitingEvents.delete(event); } cleanupEvent(event, timer) { const waiters = this.waitingEvents.get(event); if (!waiters) return; const index = waiters.findIndex((w) => w.timer === timer); if (index !== -1) { waiters.splice(index, 1); } if (waiters.length === 0) { this.waitingEvents.delete(event); } } shutdown() { for (const [event, waiters] of this.waitingEvents.entries()) { for (const waiter of waiters) { clearTimeout(waiter.timer); waiter.reject(new Error(`Watcher shutdown before '${event}' was emitted`)); } } this.waitingEvents.clear(); } } exports.EventWatcher = EventWatcher;