import { ConsumeOptions, IBatchEmitOptions, IEmitOptions, IFailedEmitBatchMessage } from "../types";
export interface OutboxConfig {
    /**
     * saving (insert or update) the events to the consumer service's outbox table
     */
    save: (outboxData: OutboxData<any>) => Promise<void>;
    /**
     * gets events usings ids from outbox table on consumer service
     * @param ids ulids of the events to get
     */
    getOutboxEvents: (ids: string[]) => Promise<OutboxEvent[]>;
    /**
     * An optional name of the queue that processes the outbox events
     */
    consumerName?: string;
    /**
     * Optional consume options for the outbox queue
     */
    consumeOptions?: {
        fifo?: ConsumeOptions;
        nonFifo?: ConsumeOptions;
    };
}
export interface OutboxData<T extends any> {
    events: OutboxEvent[];
    config: T;
}
export declare enum OutboxEventStatus {
    Error = "Error",
    Pending = "Pending",
    Processed = "Processed",
    Failed = "Failed",
    PartiallyProcessed = "PartiallyProcessed"
}
export interface OutboxEvent {
    /**
     * ulid
     */
    id: string;
    topicName: string;
    payload?: any;
    options: Omit<IEmitOptions, "outboxData">;
    isBatch: boolean;
    error?: unknown;
    failureResponse?: OutboxEventFailureResponse[];
    status: OutboxEventStatus;
    [key: string]: any;
}
export interface OutboxEventFailureResponse {
    id?: string;
    code?: string;
    message: any;
}
export interface OutboxEventPayload {
    /**
     * ulid array
     */
    ids: string[];
    isFifo: boolean;
    isBatch: boolean;
}
export interface IOutbox {
    updateEvents: (events: OutboxEvent[]) => Promise<void>;
    handleEvent: (event: OutboxEvent, errorReason?: unknown) => OutboxEvent;
    handleBatchEvent: (event: OutboxEvent, response: IFailedEmitBatchMessage[], errorReason?: unknown) => OutboxEvent;
    createEvent: (eventName: string, options: IEmitOptions | IBatchEmitOptions, payload?: any, isBatch?: boolean) => Promise<OutboxEvent>;
    /**
     * gets events usings ids from outbox table on consumer service
     * @param ids ulids of the events
     */
    getOutboxEvents: (ids: string[]) => Promise<OutboxEvent[]>;
}
