import type { local } from 'webdriver';
export type Phase = 'beforeRequestSent' | 'responseStarted';
export type NetworkEvent = local.NetworkBeforeRequestSentParameters | local.NetworkResponseStartedParameters;
/**
 * What one mock wants to do with a blocked request in one phase.
 */
export interface Decision {
    /**
     * `defer` lets the request through now and answers the response later
     */
    kind: 'answer' | 'defer' | 'pass';
    /**
     * a tab or parallel-test mock
     */
    scoped: boolean;
    /**
     * registration order, older = smaller
     */
    age: number;
    /**
     * the BiDi call of this mock, which takes its once entry and calls `answeredEarly` before an early answer
     */
    run(answeredEarly: () => void): Promise<unknown>;
    /**
     * emits `continue`, or keeps an abort for the response, and can log the Firefox warning; sends no BiDi call
     */
    lose(winner: Decision): void;
}
export interface Candidate {
    readonly age: number;
    readonly interceptId: string;
    observe(phase: Phase, event: NetworkEvent): void;
    complete(event: local.NetworkResponseCompletedParameters): Promise<void>;
    decide(phase: Phase, event: NetworkEvent): Decision | undefined | Promise<Decision | undefined>;
}
export declare function rank(a: Decision, b: Decision): number;
export declare function arbiterOf(browser: WebdriverIO.Browser): RequestArbiter;
export declare class RequestArbiter {
    #private;
    constructor(browser: WebdriverIO.Browser);
    add(candidate: Candidate): void;
    remove(candidate: Candidate): void;
}
//# sourceMappingURL=arbiter.d.ts.map