import { IndexedDatabase, MemoryDatabase } from "@valkyr/db"; import { EventRecord } from "../../libraries/event.ts"; export function getEventStoreDatabase(name: string, adapter: Adapter): EventStoreDB { switch (adapter) { case "indexeddb": { return new IndexedDatabase({ name, version: 1, registrars: [ { name: "events", indexes: [ ["stream", { unique: false }], ["created", { unique: false }], ["recorded", { unique: false }], ], }, { name: "relations", indexes: [ ["key", { unique: false }], ["stream", { unique: false }], ], }, { name: "snapshots", indexes: [ ["name", { unique: false }], ["stream", { unique: false }], ["cursor", { unique: false }], ], }, ], }); } case "memorydb": { return new MemoryDatabase({ name, registrars: [{ name: "events" }, { name: "relations" }, { name: "snapshots" }], }); } } } /* |-------------------------------------------------------------------------------- | Types |-------------------------------------------------------------------------------- */ export type EventStoreDB = IndexedDatabase | MemoryDatabase; export type Adapter = "indexeddb" | "memorydb"; export type Collections = { events: EventRecord; relations: Relation; snapshots: Snapshot; }; export type Relation = { key: string; stream: string; }; export type Snapshot = { name: string; stream: string; cursor: string; state: Record; };