/** * In-Memory Event Store * * Adapter: Implements EventStore using an array. * Purpose: Testing, development, CI/CD pipelines. * NOT for production. * * ADR-003: Event Sourcing for traceability * - Events are immutable facts * - State is a projection of event history * - Replay reconstructs any past state */ import { DomainEvent } from '@landvex/domain'; import { EventStore } from '../repositories/repository-interfaces'; export class InMemoryEventStore implements EventStore { private events: DomainEvent[] = []; async append(event: DomainEvent): Promise { this.events.push(event); } async getEvents(aggregateId: string): Promise { return this.events .filter(e => e.aggregateId === aggregateId) .sort((a, b) => a.occurredAt.getTime() - b.occurredAt.getTime()); } async getAllEvents(since?: Date): Promise { let filtered = this.events; if (since) { filtered = filtered.filter(e => e.occurredAt >= since); } return filtered.sort((a, b) => a.occurredAt.getTime() - b.occurredAt.getTime()); } clear(): void { this.events = []; } count(): number { return this.events.length; } }