import type DomainEvent from "./DomainEvent"; /** * Metadata entry for domain events. * Key-value pairs for storing contextual information about events. */ export type EventMetadata = Record; /** * Wrapper for domain events that adds metadata for event sourcing. * * DomainMessage encapsulates a domain event along with: * - Aggregate ID (uuid) - derived from event.aggregateId * - Sequence number (playhead) * - Occurrence timestamp - derived from event.occurredAt * - Idempotency key * - Optional metadata * * The event property accepts both DomainEvent instances and plain objects * to support deserialization from event stores where events lose their * class prototypes after JSON serialization. * * Note: uuid and occurred are derived from the event's aggregateId and occurredAt. * This ensures consistency between the event and its metadata wrapper. * * @internal */ export default class DomainMessage { readonly uuid: string; readonly playhead: number; readonly event: DomainEvent; readonly metadata: EventMetadata[]; readonly occurred: Date; static create(uuid: string, playhead: number, event: DomainEvent, metadata?: EventMetadata[], occurred?: Date, idempotencyKey?: string): DomainMessage; readonly eventType: string; readonly idempotencyKey: string; private constructor(); private static extractEventType; }