import { Result } from "../common/result"; import { DomainEvent } from "../domain/domain-event"; import { ReadModel } from "./read-model"; export interface Projection { project(event: DomainEvent, readModel?: TReadModel): Promise>; getReadModelType(): new (...args: any[]) => TReadModel; getEventTypes(): string[]; initialize(id: string): Promise>; } export interface ProjectionManager { register(projection: Projection): void; processEvent(event: DomainEvent): Promise>; processEvents(events: DomainEvent[]): Promise>; getProjections(): Projection[]; getProjectionsForEventType(eventType: string): Projection[]; } export declare abstract class BaseProjection implements Projection { abstract project(event: DomainEvent, readModel?: TReadModel): Promise>; abstract getReadModelType(): new (...args: any[]) => TReadModel; abstract getEventTypes(): string[]; initialize(id: string): Promise>; handlesEventType(eventType: string): boolean; }