import { EventEmitter } from 'events';
import { CustomHeaders, CustomHeadersFunction } from './headers';
import { HttpOptions } from './http-options';
export interface MetricsOptions {
    appName: string;
    instanceId: string;
    connectionId: string;
    strategies: string[];
    metricsInterval: number;
    metricsJitter?: number;
    disableMetrics?: boolean;
    url: string;
    headers?: CustomHeaders;
    customHeadersFunction?: CustomHeadersFunction;
    timeout?: number;
    httpOptions?: HttpOptions;
}
interface VariantBucket {
    [s: string]: number;
}
interface Bucket {
    start: Date;
    stop?: Date;
    toggles: {
        [s: string]: {
            yes: number;
            no: number;
            variants: VariantBucket;
        };
    };
}
type PlatformName = 'bun' | 'deno' | 'node' | 'unknown';
interface BaseMetricsData {
    appName: string;
    instanceId: string;
    connectionId: string;
    platformName: PlatformName;
    platformVersion: string;
    yggdrasilVersion: null;
    specVersion: string;
}
interface MetricsData extends BaseMetricsData {
    bucket: Bucket;
}
interface RegistrationData extends BaseMetricsData {
    sdkVersion: string;
    strategies: string[];
    started: Date;
    interval: number;
}
export default class Metrics extends EventEmitter {
    private bucket;
    private appName;
    private instanceId;
    private connectionId;
    private sdkVersion;
    private strategies;
    private metricsInterval;
    private metricsJitter;
    private failures;
    private disabled;
    private url;
    private timer;
    private started;
    private headers?;
    private customHeadersFunction?;
    private timeout?;
    private httpOptions?;
    private platformData;
    constructor({ appName, instanceId, connectionId, strategies, metricsInterval, metricsJitter, disableMetrics, url, headers, customHeadersFunction, timeout, httpOptions, }: MetricsOptions);
    private getAppliedJitter;
    getFailures(): number;
    getInterval(): number;
    private startTimer;
    start(): void;
    stop(): void;
    registerInstance(): Promise<boolean>;
    configurationError(url: string, statusCode: number): void;
    backoff(url: string, statusCode: number): void;
    sendMetrics(): Promise<void>;
    reduceBackoff(): void;
    assertBucket(name: string): void;
    count(name: string, enabled: boolean): void;
    countVariant(name: string, variantName: string): void;
    private increaseCounter;
    private increaseVariantCounter;
    private bucketIsEmpty;
    private createBucket;
    private resetBucket;
    createMetricsData(): MetricsData;
    private restoreBucket;
    getClientData(): RegistrationData;
    private getPlatformData;
}
export {};
//# sourceMappingURL=metrics.d.ts.map