[fabric/domain] Refactor EventStore interface and remove EventStream

This commit is contained in:
Pablo Baleztena 2024-10-14 09:55:39 -03:00
parent 9a63ba22f1
commit a6a303f256
4 changed files with 23 additions and 25 deletions

View File

@ -1,21 +1,31 @@
import { AsyncResult, PosixDate } from "@fabric/core"; import { AsyncResult, MaybePromise, PosixDate } from "@fabric/core";
import { StoreQueryError } from "../errors/query-error.js"; import { StoreQueryError } from "../errors/query-error.js";
import { EventsFromStream, EventStream } from "./event-stream.js"; import { UUID } from "../types/uuid.js";
import { Event, EventFromKey } from "./event.js";
import { StoredEvent } from "./stored-event.js"; import { StoredEvent } from "./stored-event.js";
export interface EventStore<TEventStream extends EventStream> { export interface EventStore<TEvents extends Event> {
/** /**
* Store a new event in the event store. * Store a new event in the event store.
*/ */
append< append<T extends TEvents>(
TStreamKey extends TEventStream["name"],
T extends EventsFromStream<TEventStream, TStreamKey>,
>(
streamName: TStreamKey,
event: T, event: T,
): AsyncResult<StoredEvent<T>, StoreQueryError>; ): AsyncResult<StoredEvent<T>, StoreQueryError>;
getEventsFromStream(
streamId: UUID,
): AsyncResult<StoredEvent<TEvents>[], StoreQueryError>;
subscribe<TEventKey extends TEvents["type"]>(
events: TEventKey[],
subscriber: EventSubscriber<EventFromKey<TEvents, TEventKey>>,
): void;
} }
export type EventSubscriber<TEvents extends Event = Event> = (
event: StoredEvent<TEvents>,
) => MaybePromise<void>;
export interface EventFilterOptions { export interface EventFilterOptions {
fromDate?: PosixDate; fromDate?: PosixDate;
toDate?: PosixDate; toDate?: PosixDate;

View File

@ -1,16 +0,0 @@
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

@ -10,3 +10,8 @@ export interface Event<TTag extends string = string, TPayload = any> {
readonly streamId: UUID; readonly streamId: UUID;
readonly payload: TPayload; readonly payload: TPayload;
} }
export type EventFromKey<
TEvents extends Event,
TKey extends TEvents["type"],
> = Extract<TEvents, { type: TKey }>;

View File

@ -1,4 +1,3 @@
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"; export * from "./stored-event.js";