[fabric/domain] Refactor event store and event stream interfaces

This commit is contained in:
Pablo Baleztena 2024-10-12 15:39:51 -03:00
parent 4fff9f91f5
commit 6919a819b6
5 changed files with 49 additions and 39 deletions

View File

@ -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 { StoreQueryError } from "../errors/query-error.js";
import { UUID } from "../types/uuid.js"; import { EventsFromStream, EventStream } from "./event-stream.js";
import { Event, StoredEvent } from "./event.js"; import { StoredEvent } from "./stored-event.js";
export interface EventStore<TEvent extends Event = Event> { export interface EventStore<TEventStream extends EventStream> {
getStream<TEventStreamEvent extends TEvent>( /**
streamId: UUID, * Store a new event in the event store.
): AsyncResult<EventStream<TEventStreamEvent>, StoreQueryError>; */
append<
appendToStream<TEvent extends Event>( TStreamKey extends TEventStream["name"],
streamId: UUID, T extends EventsFromStream<TEventStream, TStreamKey>,
events: TEvent, >(
): AsyncResult<void, StoreQueryError>; streamName: TStreamKey,
} event: T,
): AsyncResult<StoredEvent<T>, StoreQueryError>;
export interface EventStream<TEvent extends Event = Event> {
getCurrentVersion(): bigint;
append(events: TEvent): AsyncResult<StoredEvent<TEvent>, StoreQueryError>;
subscribe(callback: (event: StoredEvent<TEvent>) => MaybePromise<void>): void;
getEvents(
opts?: EventFilterOptions,
): AsyncResult<StoredEvent<TEvent>[], StoreQueryError>;
} }
export interface EventFilterOptions { export interface EventFilterOptions {
fromDate?: PosixDate; fromDate?: PosixDate;
toDate?: PosixDate; toDate?: PosixDate;
fromVersion?: number; fromVersion?: bigint;
toVersion?: number; toVersion?: bigint;
limit?: number; limit?: number;
offset?: number; offset?: number;
} }

View File

@ -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<T extends TEvent>(event: Event): AsyncResult<StoredEvent<T>>;
}
export type EventsFromStream<T extends EventStream, TKey extends string> =
T extends EventStream<TKey, infer TEvent> ? TEvent : never;

View File

@ -1,20 +1,12 @@
/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/no-explicit-any */
import { PosixDate, TaggedVariant } from "@fabric/core";
import { UUID } from "../types/uuid.js"; import { UUID } from "../types/uuid.js";
/** /**
* An event is a tagged variant with a payload and a timestamp. * An event is a tagged variant with a payload and a timestamp.
*/ */
export interface Event<TTag extends string = string, TPayload = any> export interface Event<TTag extends string = string, TPayload = any> {
extends TaggedVariant<TTag> { readonly type: TTag;
streamId: UUID; readonly id: UUID;
payload: TPayload; 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<TEvent extends Event> = Readonly<TEvent> & {
readonly version: number;
readonly timestamp: PosixDate;
};

View File

@ -1,2 +1,4 @@
export * from "./event-store.js"; export * from "./event-store.js";
export * from "./event-stream.js";
export * from "./event.js"; export * from "./event.js";
export * from "./stored-event.js";

View File

@ -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 extends Event> = TEvent & {
readonly version: bigint;
readonly timestamp: PosixDate;
};