Feature: Basic Events, Models and Projections #2
@ -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;
|
||||
|
||||
@ -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;
|
||||
@ -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 }>;
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
export * from "./event-store.js";
|
||||
export * from "./event-stream.js";
|
||||
export * from "./event.js";
|
||||
export * from "./stored-event.js";
|
||||
|
||||
Loading…
Reference in New Issue
Block a user