import AppProjections from "../AppProjections"; import AppQueries from "../AppQueries"; import DomainEvent from "../DomainEvent"; import DomainProjection from "../DomainProjection"; import EventStore from "../EventStore"; export class TestApp { readonly eventStore: InMemoryEventStore = new InMemoryEventStore(); readonly projections: AppProjections = new AppProjections(); readonly queries: AppQueries = new AppQueries(this.projections); constructor(history: DomainEvent[] = []) { this.projections.getAll().forEach((projection) => { this.eventStore.subscribe(projection); }); for (const event of history) { this.eventStore.append(event); } } } class InMemoryEventStore implements EventStore { private handlers: DomainProjection[] = []; private readonly events: DomainEvent[] = []; async append(event: DomainEvent): Promise { this.events.push(event); for (const handler of this.handlers) { handler.handle(event); } } subscribe(projection: DomainProjection): void { this.handlers.push(projection); } async replay(): Promise { throw new Error( "Replay is not relevant for InMemoryEventStore. Use append instead." ); } getAllEvents(): DomainEvent[] { return this.events; } }