Skip to content
English

MariaDbJournal

Defined in: src/persistence/journals/MariaDbJournal.ts:14

Journal backed by MariaDB / MySQL via the mariadb connector (which speaks both).

The behaviour lives in RelationalJournal; this class supplies the MariaDB dialect (? placeholders, INSERT IGNORE tag dedup, ER_DUP_ENTRY as the concurrency backstop, LONGTEXT/BIGINT columns) and the pool.

  • RelationalJournal

new MariaDbJournal(options?): MariaDbJournal

Defined in: src/persistence/journals/MariaDbJournal.ts:15

MariaDbJournalOptions = {}

MariaDbJournal

RelationalJournal.constructor

append<E>(persistenceId, events, expectedSeq, tags?): Promise<PersistentEvent<E>[]>

Defined in: src/persistence/relational/RelationalJournal.ts:102

Append events to the stream of persistenceId, enforcing optimistic concurrency: the current highest sequence number MUST equal expectedSeq or the call throws JournalConcurrencyError. Returns the written events with their assigned sequence numbers.

E

string

readonly E[]

number

readonly string[]

Promise<PersistentEvent<E>[]>

RelationalJournal.append


close(): Promise<void>

Defined in: src/persistence/LazyStore.ts:66

Promise<void>

RelationalJournal.close


delete(persistenceId, toSeq): Promise<void>

Defined in: src/persistence/relational/RelationalJournal.ts:195

Delete events up to and including toSeq — used when compacting past a snapshot. Only ever a prefix, so what survives is a suffix that read still returns contiguously, and sequence numbers never rewind: highestSeq keeps reporting the high-water mark afterwards.

string

number

Promise<void>

RelationalJournal.delete


highestSeq(persistenceId): Promise<number>

Defined in: src/persistence/relational/RelationalJournal.ts:186

Current highest sequence number for persistenceId — 0 if no events exist.

string

Promise<number>

RelationalJournal.highestSeq


persistenceIds(): Promise<string[]>

Defined in: src/persistence/relational/RelationalJournal.ts:211

Persistence IDs currently known to the journal (useful for projections).

Promise<string[]>

RelationalJournal.persistenceIds


persistenceIdsPaginated(afterPersistenceId, limit): Promise<string[]>

Defined in: src/persistence/relational/RelationalJournal.ts:221

One ascending page of persistence ids: those strictly greater than afterPersistenceId — all of them when it is undefined — capped at limit. Returning fewer than limit means the journal is exhausted.

Optional on purpose. Not every store can enumerate ids in order: DynamoDB reaches partition keys only through a full table scan, and MongoDB’s distinct has no cursor. A journal without a sorted index over its ids omits this, and the query layer falls back to persistenceIds() plus an in-process slice — correct, just not cheaper than the full list. Implement it wherever a sorted key exists; that is what keeps currentPersistenceIdsPaginated from materialising a million rows to hand back the first 256.

Which ascending order is the backend’s business. afterPersistenceId is compared in the same order the page is sorted by, so Postgres’ collated ORDER BY and SQLite’s byte-wise one are both fine — a paginated walk only needs the order to be total and stable within one journal. What a journal must not do is mix two orders across calls, which would make the cursor skip ids.

string | undefined

number

Promise<string[]>

RelationalJournal.persistenceIdsPaginated


read<E>(persistenceId, fromSeq, toSeq?): Promise<PersistentEvent<E>[]>

Defined in: src/persistence/relational/RelationalJournal.ts:168

Return the events in [fromSeq, …, toSeq], ascending by sequence number. toSeq defaults to the current highest sequence number. Both bounds are inclusive — fromSeq is the first event returned, not an “after” cursor.

Ordering and contiguity are part of the contract, and replay enforces them (#122). Consecutive entries must differ by exactly one, every sequenceNr must be a safe integer ≥ 1, and nothing may fall outside the requested window. delete compacts a prefix, never a hole in the middle, so a gap inside the returned slice can only mean a defect — a missing ORDER BY, a half-written append, a store someone else can write. replayState raises JournalIntegrityError instead of folding it, because an actor that recovers from a shuffled or holed stream reaches a state that never existed and then fails every later persist with a JournalConcurrencyError that has no visible cause.

E

string

number

number

Promise<PersistentEvent<E>[]>

RelationalJournal.read