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 { 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;
|
||||||
|
|||||||
@ -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 streamId: UUID;
|
||||||
readonly payload: TPayload;
|
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-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";
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user