Jason Tudisco 6ebe02ad56 Initial commit: local-first browser sync library experiment
Four variants of the same sync library (IndexedDB, NeDB, SQLite WASM, sql.js)
plus a paste-bin demo app for testing multi-browser sync via shared folders.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 22:04:08 -06:00

34 lines
778 B
TypeScript

import type { SyncDBEventName, SyncDBEventHandler } from './types.js';
export class Emitter {
private listeners = new Map<SyncDBEventName, Set<SyncDBEventHandler>>();
on(event: SyncDBEventName, handler: SyncDBEventHandler): () => void {
let set = this.listeners.get(event);
if (!set) {
set = new Set();
this.listeners.set(event, set);
}
set.add(handler);
return () => {
set!.delete(handler);
};
}
emit(event: SyncDBEventName, ...args: unknown[]): void {
const set = this.listeners.get(event);
if (!set) return;
for (const fn of set) {
try {
fn(...args);
} catch {
// listener errors must not break the library
}
}
}
removeAll(): void {
this.listeners.clear();
}
}