@glandjs/events
Version:
A fast, zero‑dependency event broker and message bus for building scalable, event‑driven applications.
61 lines (60 loc) • 2 kB
JavaScript
;
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;