import type { OutboxMessageId } from "@awp/contracts";
import type { Clock } from "./ports/runtime.js";
import { type ApplicationTransaction, type OutboxMessage, type UnitOfWork } from "./ports/repositories.js";
export interface OutboxPublisher {
    publish(message: OutboxMessage): Promise<void>;
}
export interface OutboxDispatchResult {
    readonly attempted: number;
    readonly published: number;
    readonly failed: number;
}
export declare class OutboxDispatcher {
    private readonly uow;
    private readonly publisher;
    private readonly clock;
    constructor(uow: UnitOfWork, publisher: OutboxPublisher, clock: Clock);
    dispatchPending(limit?: number): Promise<OutboxDispatchResult>;
}
export interface OutboxConsumeResult<T> {
    readonly processed: boolean;
    readonly result?: T;
}
export declare class IdempotentOutboxConsumer {
    private readonly uow;
    private readonly clock;
    constructor(uow: UnitOfWork, clock: Clock);
    consume<T>(consumerId: string, messageId: OutboxMessageId, effect: (tx: ApplicationTransaction) => Promise<T>): Promise<OutboxConsumeResult<T>>;
}
//# sourceMappingURL=outbox.d.ts.map