import type CDP from 'chrome-remote-interface';
import { type MeasurePlugin, type OnSamplingMeasure, type OnStartMeasure, type OnStopMeasure, type ResultAccumulator } from './index.js';
/**
 * Supported hooks to run measurements on
 */
export declare const hooks: readonly ["onTest", "onTestStep"];
export type Hooks = typeof hooks[number];
export declare const hookOrder: readonly ["onStart", "onSampling", "onStop"];
export type HookOrder = typeof hookOrder[number];
/**
 * Common interface to define procedures to observe metrics
 */
export type MetricObserver<T> = {
    name: string;
    plugins: Array<MeasurePlugin<T>>;
    onStart: OnStartMeasure<T>;
    onSampling: OnSamplingMeasure<T>;
    onStop: OnStopMeasure<T>;
};
/**
 * Define which metric should regularly be requested
 */
export type MetricSampling<T> = {
    samplingTimeoutInMilliseconds: number;
    metric: MetricObserver<T>;
};
/**
 * Supported browser dev tool clients
 */
export type BrowserDeveloperToolsClient = {
    chromium: CDP.Client;
    webkit: Record<string, unknown>;
    firefox: Record<string, unknown>;
};
/**
 * Browsers that have been tested to work with performance metric extraction
 */
export declare const supportedBrowsers: readonly ["chromium", "webkit", "firefox"];
export type SupportedBrowsers = typeof supportedBrowsers[number];
/**
 * Chromium specific metric observer and measure plugin
 */
export type ChromiumMetricObserver = MetricObserver<BrowserDeveloperToolsClient['chromium']>;
export type ChromiumMeasurePlugin = MeasurePlugin<BrowserDeveloperToolsClient['chromium']>;
/**
 * Firefox specific metric observer and measure plugin.
 */
export type FirefoxMetricObserver = MetricObserver<BrowserDeveloperToolsClient['firefox']>;
export type FirefoxMeasurePlugin = MeasurePlugin<BrowserDeveloperToolsClient['firefox']>;
/**
 * Webkit specific metric observer and measure plugin.
 */
export type WebkitMetricObserver = MetricObserver<BrowserDeveloperToolsClient['webkit']>;
export type WebkitMeasurePlugin = MeasurePlugin<BrowserDeveloperToolsClient['webkit']>;
/**
 * Options to customize the reporter for a specific browser.
 */
type BrowserOptions = {
    [browser in SupportedBrowsers]?: Partial<Record<Hooks, {
        metrics: Array<MetricObserver<BrowserDeveloperToolsClient[browser]>>;
    }>> & {
        sampling?: {
            metrics: Array<MetricSampling<BrowserDeveloperToolsClient[browser]>>;
        };
    };
};
export type PresenterWriter = {
    /**
     * Create new entry of an object
     *
     * @param content
     */
    write(content: ResultAccumulator): Promise<boolean>;
    /**
     * Finish json stream
     */
    close(): Promise<boolean>;
    /**
     * Delete created target
     */
    delete(): Promise<boolean>;
};
/**
 * Customize the reporter with desired browser and (custom) metrics
 */
export type Options = {
    deleteOnFailure: boolean;
    presenters?: PresenterWriter[];
    browsers: BrowserOptions;
};
export declare const defaultOptions: Options;
export {};
