sveltekit-sync
Version:
Local-first sync engine for SvelteKit
74 lines (73 loc) • 1.89 kB
JavaScript
/**
* Simple event emitter for realtime events.
* Used as a foundation for both client and server-side event handling.
*/
export class EventEmitter {
listeners = new Map();
/**
* Subscribe to an event
* @returns Unsubscribe function
*/
on(event, handler) {
if (!this.listeners.has(event)) {
this.listeners.set(event, new Set());
}
this.listeners.get(event).add(handler);
return () => this.off(event, handler);
}
/**
* Unsubscribe from an event
*/
off(event, handler) {
const handlers = this.listeners.get(event);
if (handlers) {
handlers.delete(handler);
if (handlers.size === 0) {
this.listeners.delete(event);
}
}
}
/**
* Emit an event to all subscribers
*/
emit(event, data) {
const handlers = this.listeners.get(event);
if (handlers) {
handlers.forEach(handler => {
try {
handler(data);
}
catch (error) {
console.error(`Error in event handler for "${event}":`, error);
}
});
}
}
/**
* Subscribe to an event for one-time execution
*/
once(event, handler) {
const wrappedHandler = (data) => {
this.off(event, wrappedHandler);
handler(data);
};
return this.on(event, wrappedHandler);
}
/**
* Remove all listeners for an event or all events
*/
removeAllListeners(event) {
if (event) {
this.listeners.delete(event);
}
else {
this.listeners.clear();
}
}
/**
* Get listener count for an event
*/
listenerCount(event) {
return this.listeners.get(event)?.size ?? 0;
}
}