export type DomainEvent = { name: EventType; version: number; body: EventBody; }; export interface MessageBus { initialize(): Promise; dispose(): Promise; publishEvent(event: DomainEvent): Promise; subscribeToEvent(eventHandler: EventHandler): void; unsubscribeFromEvent(eventHandler: EventHandler): void; } export interface EventHandler { eventName: EventType; eventVersion: number; handleEvent(event: DomainEvent): Promise; usingMessageBus(owner: MessageBus): void; }