/** * The lifecycle/engagement event types that converge onto a single {@link EmailEvent} shape. * * The first group (`queued` → `failed`) is emitted by the send pipeline; the rest typically originate * from provider webhooks (delivery/engagement signals). */ type EmailEventType = "attempt" | "bounced" | "clicked" | "complained" | "deferred" | "delivered" | "failed" | "opened" | "queued" | "sent" | "unsubscribed"; /** * A single, provider-agnostic email event. Both internal send-lifecycle signals and normalized * webhook events use this shape so a timeline can be reconstructed from one stream. */ interface EmailEvent { /** * Arbitrary structured payload (provider response, bounce sub-type, click URL, …). */ data?: Record; /** * A unique id for this event. */ id: string; /** * The message this event concerns. */ messageId?: string; /** * The provider that produced (or will produce) the message. */ provider?: string; /** * The recipient address this event concerns, when applicable. */ recipient?: string; /** * When the event occurred. */ timestamp: Date; /** * The kind of event. */ type: EmailEventType; } /** * A listener invoked for matching {@link EmailEvent}s. */ type EmailEventListener = (event: EmailEvent) => void; /** * A persistence backend for {@link EmailEvent}s. */ interface EventStore { /** * Appends an event. * @param event The event to store. */ append: (event: EmailEvent) => Promise | void; /** * Returns the full, time-ordered timeline for a message. * @param messageId The message to reconstruct. */ timeline: (messageId: string) => EmailEvent[] | Promise; } type Selector = "*" | EmailEventType; /** * The wildcard selector that subscribes to every event type. */ declare const ALL_EVENTS: "*"; /** * A tiny synchronous pub/sub bus for {@link EmailEvent}s. * * Subscribe to a specific {@link EmailEventType} or to {@link ALL_EVENTS} (`"*"`) for every event. */ declare class EventBus { private readonly listeners; /** * Subscribes a listener to an event type (or all events). * @param type The event type, or `"*"` for all events. * @param listener The listener to invoke. * @returns An unsubscribe function. */ on(type: Selector, listener: EmailEventListener): () => void; /** * Subscribes a listener that is removed after its first invocation. * @param type The event type, or `"*"` for all events. * @param listener The listener to invoke once. * @returns An unsubscribe function. */ once(type: Selector, listener: EmailEventListener): () => void; /** * Removes a previously-added listener. * @param type The event type the listener was registered under. * @param listener The listener to remove. */ off(type: Selector, listener: EmailEventListener): void; /** * Emits an event to all matching listeners (type-specific first, then wildcard). * @param event The event to dispatch. */ emit(event: EmailEvent): void; /** * Removes all listeners (optionally for a single type). * @param type When provided, only listeners for this type are removed. */ clear(type?: Selector): void; } export { ALL_EVENTS as A, EmailEvent as E, EventStore as a, EmailEventListener as b, EmailEventType as c, EventBus as d };