/**
 * @module CircuitBreaker
 */
import { type CircuitBreakerState, type CircuitBreakerTrigger, type ICircuitBreaker, type ICircuitBreakerAdapter, type CircuitBreakerEventMap } from "../../../../circuit-breaker/contracts/_module.js";
import { type IEventDispatcher } from "../../../../event-bus/contracts/_module.js";
import { type Key, type Namespace } from "../../../../namespace/_module.js";
import { type ITask } from "../../../../task/contracts/_module.js";
import { TimeSpan } from "../../../../time-span/implementations/_module.js";
import { type AsyncLazy, type ErrorPolicy } from "../../../../utilities/_module.js";
/**
 * @internal
 */
export type CircuitBreakerSettings = {
    enableAsyncTracking: boolean;
    eventDispatcher: IEventDispatcher<CircuitBreakerEventMap>;
    adapter: ICircuitBreakerAdapter;
    key: Key;
    slowCallTime: TimeSpan;
    errorPolicy: ErrorPolicy;
    trigger: CircuitBreakerTrigger;
    serdeTransformerName: string;
    namespace: Namespace;
};
/**
 * @internal
 */
export type ISerializedCircuitBreaker = {
    version: "1";
    key: string;
};
/**
 * @internal
 */
export declare class CircuitBreaker implements ICircuitBreaker {
    /**
     * @internal
     */
    static _internal_serialize(deserializedValue: CircuitBreaker): ISerializedCircuitBreaker;
    private readonly _key;
    private readonly errorPolicy;
    private readonly trigger;
    private readonly slowCallTime;
    private readonly adapter;
    private readonly eventDispatcher;
    private readonly serdeTransformerName;
    private readonly namespace;
    private readonly enableAsyncTracking;
    constructor(settings: CircuitBreakerSettings);
    _internal_getNamespace(): Namespace;
    _internal_getSerdeTransformerName(): string;
    _internal_getAdapter(): ICircuitBreakerAdapter;
    get key(): string;
    getState(): ITask<CircuitBreakerState>;
    private trackFailure;
    private trackSuccess;
    private trackErrorWrapper;
    private trackSlowCallWrapper;
    private guard;
    runOrFail<TValue = void>(asyncFn: AsyncLazy<TValue>): ITask<TValue>;
    reset(): ITask<void>;
    isolate(): ITask<void>;
}
