import { Module, ModuleOptions } from './index.js';
import { Circuit, CircuitFunction } from '../circuit.js';

type RetryCallback = (err: any, attempt: number) => boolean | number;
export declare enum RetryMode {
    CONSTANT = "constant",
    LINEAR = "linear",
    EXPONENTIAL = "exponential",
    JITTER = "jitter"
}
/**
 * Properties that customizes the retry behavior.
 */
export declare abstract class RetryOptions extends ModuleOptions {
    /**
     * The number of retry attempts (the function will be called attempts + 1 times).
     */
    attempts?: number;
    /**
     * The amount of time to wait before retrying.
     */
    interval?: number;
    /**
     * The mode for the retry (constant, linear, exponential or jitter)
     */
    mode?: RetryMode;
    /**
     * The factor to be applied for the retry mode
     */
    factor?: number;
    /**
     * The maximum amount of time to wait before retrying another time
     */
    maxInterval?: number;
    /**
     * Should the first retry be done directly after a failure occurred
     */
    fastFirst?: boolean;
    /**
     * The value (between 0 and 1) to adjust delay randomly based on jitter retry duration
     */
    jitterAdjustment?: number;
    /**
     * A filtering callback, to modify the retry behavior.
     * @returns true (retries), false (rejects), number (retries after some delay)
     */
    onRejection?: RetryCallback;
}
/**
 * The Retry Module, that allows to retry a function after it fails.
 */
export declare class Retry extends Module {
    /**
     * The number of retry attempts (the function will be called attempts + 1 times).
     */
    attempts: number;
    /**
     * The amount of time to wait before retrying.
     */
    interval: number;
    /**
   * The mode for the retry (constant, linear, exponential or jitter)
   */
    mode: RetryMode;
    /**
     * The factor to be applied for the retry mode
     */
    factor: number;
    /**
     * The maximum amount of time to wait before retrying another time
     */
    maxInterval: number;
    /**
     * Should the first retry be done directly after a failure occurred
     */
    fastFirst: boolean;
    /**
     * The value to adjust delay randomly based on jitter retry duration
     */
    private _jitterAdjustment;
    /**
     * A filtering callback, to modify the retry behavior.
     * @returns true (retries), false (rejects), number (retries after some delay)
     */
    onRejection: RetryCallback;
    /**
     * The value (between 0 and 1) to adjust delay randomly based on jitter retry duration
    */
    get jitterAdjustment(): number;
    /**
     * Set the value (between 0 and 1) for jitter adjustment (to adjust delay randomly).
    */
    set jitterAdjustment(val: number);
    private adjustJitterValue;
    constructor(options?: RetryOptions);
    execute<T>(circuit: Circuit, promise: CircuitFunction, ...params: any[]): Promise<T>;
    private waitBeforeNextTry;
    private _promiseRetry;
}
export {};
