resig.js
Version:
Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.
72 lines (71 loc) • 2.85 kB
TypeScript
/**
* Event Sourcing with CRDTs
* Complete state reconstruction with event replay, snapshots, and compaction
*/
import { CRDT } from '../crdt';
import { StreamingSignal } from './coalgebra';
export interface Event {
id: string;
type: string;
timestamp: number;
nodeId: string;
data: any;
version: number;
}
export interface CRDTSnapshot<T> {
timestamp: number;
version: number;
state: T;
eventCount: number;
checksum: string;
}
export interface EventStore {
append(events: Event[]): Promise<void>;
getEvents(fromVersion?: number, toVersion?: number): Promise<Event[]>;
getSnapshot(beforeVersion?: number): Promise<CRDTSnapshot<any> | null>;
saveSnapshot(snapshot: CRDTSnapshot<any>): Promise<void>;
compact(beforeVersion: number): Promise<void>;
}
export type CompactionStrategy = 'sliding-window' | 'time-based' | 'event-count' | 'manual';
export interface EventSourcedConfig {
eventStore: EventStore;
snapshotInterval: number;
compactionStrategy: CompactionStrategy;
maxEvents?: number;
maxAge?: number;
}
export interface EventSourcedCRDT<T, E extends Event> extends CRDT<T> {
events(): StreamingSignal<E>;
replayFrom(timestamp: number): Promise<T>;
snapshot(): Promise<CRDTSnapshot<T>>;
compact(): Promise<void>;
getEventCount(): number;
getVersion(): number;
clone(): EventSourcedCRDT<T, E>;
toJSON(): any;
fromJSON(data: any): EventSourcedCRDT<T, E>;
}
export declare class MemoryEventStore implements EventStore {
private events;
private snapshots;
append(events: Event[]): Promise<void>;
getEvents(fromVersion?: number, toVersion?: number): Promise<Event[]>;
getSnapshot(beforeVersion?: number): Promise<CRDTSnapshot<any> | null>;
saveSnapshot(snapshot: CRDTSnapshot<any>): Promise<void>;
compact(beforeVersion: number): Promise<void>;
}
export declare class IndexedDBEventStore implements EventStore {
private db;
private dbName;
constructor(dbName: string);
private getDB;
append(events: Event[]): Promise<void>;
getEvents(fromVersion?: number, toVersion?: number): Promise<Event[]>;
getSnapshot(beforeVersion?: number): Promise<CRDTSnapshot<any> | null>;
saveSnapshot(snapshot: CRDTSnapshot<any>): Promise<void>;
compact(beforeVersion: number): Promise<void>;
}
export declare const createEventSourcedCRDT: <T, E extends Event>(baseCRDT: CRDT<T>, config: EventSourcedConfig, nodeId?: string) => EventSourcedCRDT<T, E>;
export declare const eventSourcedORSet: (nodeId: string, config: EventSourcedConfig) => EventSourcedCRDT<Set<unknown>, Event>;
export declare const eventSourcedGCounter: (nodeId: string, config: EventSourcedConfig) => EventSourcedCRDT<number, Event>;
export declare const indexedDBEventStore: (dbName: string) => IndexedDBEventStore;