UNPKG

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
/** * 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;