From 6919a819b67edcbccae6ee5dff5c27520ca3798a Mon Sep 17 00:00:00 2001 From: Pablo Baleztena Date: Sat, 12 Oct 2024 15:39:51 -0300 Subject: [PATCH] [fabric/domain] Refactor event store and event stream interfaces --- .../fabric/domain/src/events/event-store.ts | 42 +++++++------------ .../fabric/domain/src/events/event-stream.ts | 16 +++++++ packages/fabric/domain/src/events/event.ts | 18 +++----- packages/fabric/domain/src/events/index.ts | 2 + .../fabric/domain/src/events/stored-event.ts | 10 +++++ 5 files changed, 49 insertions(+), 39 deletions(-) create mode 100644 packages/fabric/domain/src/events/event-stream.ts create mode 100644 packages/fabric/domain/src/events/stored-event.ts diff --git a/packages/fabric/domain/src/events/event-store.ts b/packages/fabric/domain/src/events/event-store.ts index c58102b..0e31fc1 100644 --- a/packages/fabric/domain/src/events/event-store.ts +++ b/packages/fabric/domain/src/events/event-store.ts @@ -1,36 +1,26 @@ -import { AsyncResult, MaybePromise, PosixDate } from "@fabric/core"; +import { AsyncResult, PosixDate } from "@fabric/core"; import { StoreQueryError } from "../errors/query-error.js"; -import { UUID } from "../types/uuid.js"; -import { Event, StoredEvent } from "./event.js"; +import { EventsFromStream, EventStream } from "./event-stream.js"; +import { StoredEvent } from "./stored-event.js"; -export interface EventStore { - getStream( - streamId: UUID, - ): AsyncResult, StoreQueryError>; - - appendToStream( - streamId: UUID, - events: TEvent, - ): AsyncResult; -} - -export interface EventStream { - getCurrentVersion(): bigint; - - append(events: TEvent): AsyncResult, StoreQueryError>; - - subscribe(callback: (event: StoredEvent) => MaybePromise): void; - - getEvents( - opts?: EventFilterOptions, - ): AsyncResult[], StoreQueryError>; +export interface EventStore { + /** + * Store a new event in the event store. + */ + append< + TStreamKey extends TEventStream["name"], + T extends EventsFromStream, + >( + streamName: TStreamKey, + event: T, + ): AsyncResult, StoreQueryError>; } export interface EventFilterOptions { fromDate?: PosixDate; toDate?: PosixDate; - fromVersion?: number; - toVersion?: number; + fromVersion?: bigint; + toVersion?: bigint; limit?: number; offset?: number; } diff --git a/packages/fabric/domain/src/events/event-stream.ts b/packages/fabric/domain/src/events/event-stream.ts new file mode 100644 index 0000000..9b70954 --- /dev/null +++ b/packages/fabric/domain/src/events/event-stream.ts @@ -0,0 +1,16 @@ +import { AsyncResult } from "@fabric/core"; +import { UUID } from "../types/uuid.js"; +import { Event } from "./event.js"; +import { StoredEvent } from "./stored-event.js"; + +export interface EventStream< + TName extends string = string, + TEvent extends Event = Event, +> { + id: UUID; + name: TName; + append(event: Event): AsyncResult>; +} + +export type EventsFromStream = + T extends EventStream ? TEvent : never; diff --git a/packages/fabric/domain/src/events/event.ts b/packages/fabric/domain/src/events/event.ts index be843d1..e314103 100644 --- a/packages/fabric/domain/src/events/event.ts +++ b/packages/fabric/domain/src/events/event.ts @@ -1,20 +1,12 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { PosixDate, TaggedVariant } from "@fabric/core"; import { UUID } from "../types/uuid.js"; /** * An event is a tagged variant with a payload and a timestamp. */ -export interface Event - extends TaggedVariant { - streamId: UUID; - payload: TPayload; +export interface Event { + readonly type: TTag; + readonly id: UUID; + readonly streamId: UUID; + readonly payload: TPayload; } - -/** - * A stored event is an inmutable event, already stored, with it's version in the stream and timestamp. - */ -export type StoredEvent = Readonly & { - readonly version: number; - readonly timestamp: PosixDate; -}; diff --git a/packages/fabric/domain/src/events/index.ts b/packages/fabric/domain/src/events/index.ts index a28ecf2..7b181cc 100644 --- a/packages/fabric/domain/src/events/index.ts +++ b/packages/fabric/domain/src/events/index.ts @@ -1,2 +1,4 @@ export * from "./event-store.js"; +export * from "./event-stream.js"; export * from "./event.js"; +export * from "./stored-event.js"; diff --git a/packages/fabric/domain/src/events/stored-event.ts b/packages/fabric/domain/src/events/stored-event.ts new file mode 100644 index 0000000..e0a33eb --- /dev/null +++ b/packages/fabric/domain/src/events/stored-event.ts @@ -0,0 +1,10 @@ +import { PosixDate } from "@fabric/core"; +import { Event } from "./event.js"; + +/** + * A stored event is an inmutable event, already stored, with it's version in the stream and timestamp. + */ +export type StoredEvent = TEvent & { + readonly version: bigint; + readonly timestamp: PosixDate; +};