import { Duration } from '@arturwojnar/hermes';
import { JSONValue, TransactionSql } from 'postgres';
import { AsyncOrSync } from 'ts-essentials';
import { HermesSql, MessageEnvelope, Stop } from '../common/types.js';
type HermesAsyncMessageEnvelope<Message> = {
    position: number;
    messageId: string;
    messageType: string;
    redeliveryCount: number;
    message: Message;
};
type PublishOptions = {
    tx?: TransactionSql;
};
type ConsumerCreationParams<Message> = {
    getSql: () => HermesSql;
    publish: (message: HermesAsyncMessageEnvelope<Message> | HermesAsyncMessageEnvelope<Message>[]) => AsyncOrSync<void> | never;
    consumerName: string;
    checkInterval?: Duration;
    waitAfterFailedPublish?: Duration;
    shouldDisposeOnSigterm?: boolean;
    onFailedPublish?: ErrorCallback;
    onDbError?: ErrorCallback;
};
interface IAsyncOutboxConsumer<Message extends JSONValue> {
    send(message: MessageEnvelope<Message> | MessageEnvelope<Message>[], options: PublishOptions): Promise<void>;
    start(): Stop;
    stop(): Promise<void>;
}
declare class AsyncOutboxConsumer<Message extends JSONValue> implements IAsyncOutboxConsumer<Message> {
    private readonly _params;
    private readonly _checkInterval;
    private readonly _getSql;
    private _started;
    private _isProcessing;
    private _intervalId;
    constructor(_params: ConsumerCreationParams<Message>);
    send(message: MessageEnvelope<Message> | MessageEnvelope<Message>[], options?: PublishOptions): Promise<void>;
    start(): Stop;
    stop(): Promise<void>;
    private _publishOne;
    private _startPolling;
    private _processUndeliveredMessages;
}
declare const createAsyncOutboxConsumer: <Message extends JSONValue>(params: ConsumerCreationParams<Message>) => AsyncOutboxConsumer<Message>;
export { AsyncOutboxConsumer, createAsyncOutboxConsumer, IAsyncOutboxConsumer, type ConsumerCreationParams, type HermesAsyncMessageEnvelope, };
