You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
1.2 KiB
TypeScript

import AppProjections from "../AppProjections";
import AppQueries from "../AppQueries";
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<any>[] = []) {
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<any>[] = [];
async append(event: DomainEvent<any>): Promise<void> {
this.events.push(event);
for (const handler of this.handlers) {
handler.handle(event);
}
}
subscribe(projection: DomainProjection): void {
this.handlers.push(projection);
}
async replay(): Promise<void> {
throw new Error(
"Replay is not relevant for InMemoryEventStore. Use append instead."
);
}
getAllEvents(): DomainEvent<any>[] {
return this.events;
}
}