Feature: Basic Events, Models and Projections #2

Merged
piarrot merged 37 commits from feat-base-projections into main 2024-10-15 15:20:25 -03:00
4 changed files with 23 additions and 25 deletions
Showing only changes of commit a6a303f256 - Show all commits

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 { EventsFromStream, EventStream } from "./event-stream.js";
import { UUID } from "../types/uuid.js";
import { Event, EventFromKey } from "./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.
*/
append<
TStreamKey extends TEventStream["name"],
T extends EventsFromStream<TEventStream, TStreamKey>,
>(
streamName: TStreamKey,
append<T extends TEvents>(
event: T,
): 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 {
fromDate?: 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 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-stream.js";
export * from "./event.js";
export * from "./stored-event.js";