import type DomainMessage from "../../Domain/Event/DomainMessage"; import type IIdempotencyStore from "./IIdempotencyStore"; import type IEventListener from "../EventBus/IEventListener"; /** * Options for configuring idempotent handling behavior. */ export interface IdempotentHandlerOptions { /** * Time-to-live for idempotency keys in milliseconds. * After this time, the same event can be processed again. * Default: undefined (keys persist indefinitely) */ ttl?: number; /** * Callback invoked when a duplicate event is detected. * Useful for logging or metrics. */ onDuplicate?: (message: DomainMessage) => void; /** * Callback invoked when an error occurs during handling. * If not provided, errors are re-thrown. */ onError?: (error: Error, message: DomainMessage) => void; } /** * Wraps an event listener/subscriber to provide idempotent event handling. * Prevents duplicate processing of events based on their idempotency key. */ export default class IdempotentHandler implements IEventListener { private readonly innerHandler; private readonly idempotencyStore; private readonly options; constructor(innerHandler: IEventListener, idempotencyStore: IIdempotencyStore, options?: IdempotentHandlerOptions); on(message: DomainMessage): Promise; } /** * Factory function to create an idempotent wrapper for any event listener. * * @param handler The event listener to wrap * @param store The idempotency store to use * @param options Optional configuration * @returns An idempotent event listener * * @example * ```typescript * const store = new InMemoryIdempotencyStore(); * const myListener = new MyEventListener(); * const idempotentListener = makeIdempotent(myListener, store, { ttl: 3600000 }); * eventBus.addListener(idempotentListener); * ``` */ export declare function makeIdempotent(handler: IEventListener, store: IIdempotencyStore, options?: IdempotentHandlerOptions): IdempotentHandler;