interface DrainPipelineOptions<T = unknown> {
    batch?: {
        /** Maximum events per batch. @default 50 */
        size?: number;
        /** Max time an event can stay buffered before flush. @default 5000 */
        intervalMs?: number;
    };
    retry?: {
        /** Total attempts including first try. @default 3 */
        maxAttempts?: number;
        /** Delay strategy between attempts. @default 'exponential' */
        backoff?: 'exponential' | 'linear' | 'fixed';
        /** Base delay for first retry. @default 1000 */
        initialDelayMs?: number;
        /** Max delay cap. @default 30000 */
        maxDelayMs?: number;
        /** Add random jitter to delays. @default true */
        jitter?: boolean;
    };
    /** Max buffered events before dropping. @default 1000 */
    maxBufferSize?: number;
    /** Overflow policy. @default 'oldest' */
    dropPolicy?: 'oldest' | 'newest';
    /** Called when events are dropped from overflow or exhausted retries. */
    onDropped?: (events: T[], error?: Error) => void;
}
interface PipelineDrainFn<T> {
    (ctx: T): void;
    /** Flush all buffered events. */
    flush: () => Promise<void>;
    /** Flush and stop scheduling future timer work. */
    shutdown: () => Promise<void>;
    readonly pending: number;
}
declare function createDrainPipeline<T = unknown>(options?: DrainPipelineOptions<T>): (drain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>;

export { type DrainPipelineOptions, type PipelineDrainFn, createDrainPipeline };
