import { EventEmitter } from './helpers/event.js';
import { Module } from './module/index.js';

/**
 * Returned when a circuit has no function defined.
 * @param message Circuit has no function set
 */
export declare class NoFuncError extends Error {
    constructor();
}
export type CircuitFunction = (...params: any[]) => Promise<any>;
export interface Logger {
    debug(message?: any, ...optionalParams: any[]): void;
    info(message?: any, ...optionalParams: any[]): void;
    warn(message?: any, ...optionalParams: any[]): void;
}
/**
 * Properties that customizes the circuit behavior.
 */
export declare abstract class CircuitOptions {
    /**
     * Module list, by order of execution.
     */
    modules?: Module[];
}
/**
 * Properties that defines the circuit.
 */
export declare abstract class CircuitFactory {
    /**
     * The Circuit name.
     */
    name?: string;
    /**
     * The Circuit function.
     */
    func?: CircuitFunction;
    /**
     * The Circuit options.
     */
    options?: CircuitOptions;
}
/**
 * Array containing every circuit.
 */
export declare const circuits: Circuit[];
/**
 * The Circuit Class, that may contain Modules to add resilience patterns.
 */
export declare class Circuit extends EventEmitter {
    /**
     * The Circuit name.
     */
    name: string;
    /**
     * The Circuit function.
     */
    func: CircuitFunction;
    /**
     * Module list, by order of execution.
     */
    modules: Module[];
    constructor(factory?: CircuitFactory);
    get activeModules(): Module[];
    /**
     * Modifies the Circuit function.
     * @param {CircuitFunction} func The Circuit function.
     */
    fn(func: CircuitFunction): Circuit;
    /**
     * Executes the Circuit function.
     * @param params Eventual parameters to pass to the Circuit function.
     */
    execute<T>(...params: any[]): Promise<T>;
    /**
     * Disposes the Circuit, to cleanup every interval and timeouts.
     */
    dispose(): void;
}
