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>
34 lines
778 B
TypeScript
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();
|
|
}
|
|
}
|