Skip to content

Durable storage on SQLite, through any effect/sql SQLite driver.

The schema relies on SQLite’s single writer for positions to follow commit order, so it is not portable to other databases.

An append is one statement, which checks the stream’s version and inserts the events only if it still matches. Appends that arrive while others are being written go together into one transaction, so they share the cost of a commit.

Defined in: src/SqliteEventStore.ts:18

readonly optional checkpointsTable?: string

Defined in: src/SqliteEventStore.ts:20

readonly optional eventsTable?: string

Defined in: src/SqliteEventStore.ts:19

readonly optional migrate?: boolean

Defined in: src/SqliteEventStore.ts:26

Creates the tables, or brings tables of an earlier version up to date, on startup. Defaults to true. Set it to false where the application may not change the schema, and apply migrations with your own tooling.

readonly optional pollInterval?: Input

Defined in: src/SqliteEventStore.ts:31

Reads the head this often, so subscribers notice appends that other processes make to the same file. Off by default. See EventStore.MakeOptions.

Migration = Migration

Defined in: src/SqliteEventStore.ts:35

A schema change, see EventStore.Migration. Migrations are listed in the order to apply them.

const make: (…args) => Effect<{ afterCommit?: <R>(effect) => Effect<void, never, R>; changes: Stream<number>; head: Effect<number, EventStoreError>; append(input): Effect<readonly object[], EventStoreError | ConcurrencyConflict>; read(filter?): Stream<{ aggregateId: string; aggregateName: string; causationId: string | null; correlationId: string | null; metadata: {[key: string]: Json; }; payload: Json; position: number; schemaVersion: number; timestamp: Utc; type: string; version: number; }, EventStoreError>; subscribe(filter?): Stream<{ aggregateId: string; aggregateName: string; causationId: string | null; correlationId: string | null; metadata: {[key: string]: Json; }; payload: Json; position: number; schemaVersion: number; timestamp: Utc; type: string; version: number; }, EventStoreError>; }, EventStoreError, Scope | SqlClient>

Defined in: src/SqliteEventStore.ts:173

…[options?: Options]

Effect<{ afterCommit?: <R>(effect) => Effect<void, never, R>; changes: Stream<number>; head: Effect<number, EventStoreError>; append(input): Effect<readonly object[], EventStoreError | ConcurrencyConflict>; read(filter?): Stream<{ aggregateId: string; aggregateName: string; causationId: string | null; correlationId: string | null; metadata: {[key: string]: Json; }; payload: Json; position: number; schemaVersion: number; timestamp: Utc; type: string; version: number; }, EventStoreError>; subscribe(filter?): Stream<{ aggregateId: string; aggregateName: string; causationId: string | null; correlationId: string | null; metadata: {[key: string]: Json; }; payload: Json; position: number; schemaVersion: number; timestamp: Utc; type: string; version: number; }, EventStoreError>; }, EventStoreError, Scope | SqlClient>

layer(options?): Layer<EventStore, EventStoreError, SqlClient>

Defined in: src/SqliteEventStore.ts:310

Options

Layer<EventStore, EventStoreError, SqlClient>


layerCheckpoints(options?): Layer<Checkpoints, EventStoreError, SqlClient>

Defined in: src/SqliteEventStore.ts:316

Keeps checkpoints in the same database, for view models that are durable too.

Options

Layer<Checkpoints, EventStoreError, SqlClient>


migrations(options?): readonly Migration[]

Defined in: src/SqliteEventStore.ts:123

The schema of the events and checkpoints tables, for tools that apply migrations themselves. layer and layerCheckpoints run the same statements on startup unless migrate is false. SQLite can’t add a column only if it is missing, so the ALTER TABLE statements must run exactly once.

Options

readonly Migration[]