import { DVCFeatureSet, DevCycleOptions, DVCVariableSet, DVCVariableValue, DVCCustomDataJSON, DevCycleEvent, DevCycleUser, ErrorCallback, DVCFeature } from './types';
import { DVCVariable } from './Variable';
import { DVCPopulatedUser } from './User';
import { EventEmitter } from './EventEmitter';
import { BucketedUserConfig, VariableDefinitions, VariableTypeAlias } from '@devcycle/types';
import { DVCLogger } from '@devcycle/types';
type variableUpdatedHandler = (key: string, variable: DVCVariable<DVCVariableValue> | null) => void;
type featureUpdatedHandler = (key: string, feature: DVCFeature | null) => void;
type newVariablesHandler = () => void;
type errorHandler = (error: unknown) => void;
type initializedHandler = (success: boolean) => void;
type configUpdatedHandler = (newVars: DVCVariableSet) => void;
type variableEvaluatedHandler = (key: string, variable: DVCVariable<DVCVariableValue>) => void;
export type DevCycleOptionsWithDeferredInitialization = DevCycleOptions & {
    deferInitialization: true;
    bootstrapConfig?: never;
};
export declare const isDeferredOptions: (arg: DevCycleUser | DevCycleOptionsWithDeferredInitialization) => arg is DevCycleOptionsWithDeferredInitialization;
export declare class DevCycleClient<Variables extends VariableDefinitions = VariableDefinitions, CustomData extends DVCCustomDataJSON = DVCCustomDataJSON> {
    logger: DVCLogger;
    config?: BucketedUserConfig;
    user?: DVCPopulatedUser;
    _isInitialized: boolean;
    readonly isInitialized: boolean;
    private sdkKey;
    private readonly options;
    private onInitialized;
    private settleOnInitialized;
    private userSaved;
    private _closing;
    private isConfigCached;
    private initializeTriggered;
    private variableDefaultMap;
    private store;
    private eventQueue?;
    private requestConsolidator;
    eventEmitter: EventEmitter;
    private streamingConnection?;
    private pageVisibilityHandler?;
    private inactivityHandlerId?;
    private windowMessageHandler?;
    private windowPageHideHandler?;
    private configRefetchHandler;
    constructor(sdkKey: string, user: undefined, options: DevCycleOptionsWithDeferredInitialization);
    constructor(sdkKey: string, user: DevCycleUser<CustomData>, options?: DevCycleOptions);
    /**
     * Logic to initialize the client with the appropriate user and configuration data by making requests to DevCycle
     * and loading from local storage. This either happens immediately on client initialization, or when the user is
     * first identified (in deferred mode)
     * @param initialUser
     */
    private clientInitialization;
    /**
     * Complete initialization process without config so that we can return default values
     */
    private initializeOnConfigFailure;
    /**
     * Notify the user when configuration data has been loaded from the server.
     * An optional callback can be passed in, and will return
     * a promise if no callback has been passed in.
     */
    onClientInitialized(): Promise<DevCycleClient<Variables, CustomData>>;
    onClientInitialized(onInitialized: ErrorCallback<DevCycleClient<Variables, CustomData>>): void;
    /**
     * Get variable object associated with Features. Use the variable's key to fetch the DVCVariable object.
     * If the user does not receive the feature, the default value is used in the returned DVCVariable object.
     * DVCVariable is returned, which has a `value` property that is used to grab the variable value,
     * and a convenience method to pass in a callback to notify the user when the value has changed from the server.
     *
     * @param key
     * @param defaultValue
     */
    variable<K extends string & keyof Variables, T extends DVCVariableValue & Variables[K]>(key: K, defaultValue: T): DVCVariable<T>;
    private trackVariableEvaluated;
    /**
     * Get a variable's value associated with a Feature. Use the variable's key to fetch the variable's value.
     * If the user is not segmented into the feature, the default value is returned.
     *
     * @param key
     * @param defaultValue
     */
    variableValue<K extends string & keyof Variables, T extends DVCVariableValue & Variables[K]>(key: K, defaultValue: T): VariableTypeAlias<T>;
    /**
     * Update user data after SDK initialization, this will trigger updates to variable values.
     * The `callback` parameter or returned `promise` can be used to return the set of variables
     * for the new user.
     *
     * @param user
     * @param callback
     */
    identifyUser(user: DevCycleUser<CustomData>): Promise<DVCVariableSet>;
    identifyUser(user: DevCycleUser<CustomData>, callback?: ErrorCallback<DVCVariableSet>): void;
    private _identifyUser;
    /**
     * Resets the user to an Anonymous user. `callback` or `Promise` can be used to return
     * the set of variables for the new user.
     *
     * @param callback
     */
    resetUser(): Promise<DVCVariableSet>;
    resetUser(callback: ErrorCallback<DVCVariableSet>): void;
    /**
     * Retrieve data on all Features, Object mapped by feature `key`.
     * Use the `DVCFeature.segmented` value to determine if the user was segmented into a
     * feature's audience.
     */
    allFeatures(): DVCFeatureSet;
    /**
     * Retrieve data on all Variables, Object mapped by variable `key`.
     */
    allVariables(): DVCVariableSet;
    /**
     * Subscribe to events emitted by the SDK, `onUpdate` will be called everytime an
     * event is emitted by the SDK.
     *
     * Events:
     *  - `initialized` -> (initialized: boolean)
     *  - `error` -> (error: Error)
     *  - `variableUpdated:*` -> (key: string, variable: DVCVariable)
     *  - `variableUpdated:<variable.key>` -> (key: string, variable: DVCVariable)
     *  - `featureUpdated:*` -> (key: string, feature: DVCFeature)
     *  - `featureUpdated:<feature.key>` -> (key: string, feature: DVCFeature)
     *  - `variableEvaluated:*` -> (key: string, variable: DVCVariable)
     *  - `variableEvaluated:<variable.key>` -> (key: string, variable: DVCVariable)
     *
     * @param key
     * @param handler
     */
    subscribe(key: string, handler: variableUpdatedHandler): void;
    subscribe(key: string, handler: newVariablesHandler): void;
    subscribe(key: string, handler: featureUpdatedHandler): void;
    subscribe(key: string, handler: variableEvaluatedHandler): void;
    subscribe(key: 'error', handler: errorHandler): void;
    subscribe(key: 'initialized', handler: initializedHandler): void;
    subscribe(key: 'configUpdated', handler: configUpdatedHandler): void;
    /**
     * Unsubscribe to remove existing event emitter subscription.
     *
     * @param key
     * @param handler
     */
    unsubscribe(key: string, handler?: (...args: any[]) => void): void;
    /**
     * Track Event to DevCycle
     *
     * @param event
     */
    track(event: DevCycleEvent): void;
    /**
     * Flush all queued events to DevCycle
     *
     * @param callback
     */
    flushEvents(callback?: () => void): Promise<void>;
    /**
     * Close all open connections to DevCycle, flush any pending events and
     * stop any running timers and event handlers. Use to clean up a client instance
     * that is no longer needed.
     */
    close(): Promise<void>;
    /*
    * Reflects whether `close()` has been called on the client instance.
    */
    readonly closing: boolean;
    /**
     * Method to be called by the Isomorphic SDKs to update the bootstrapped config and user data when the server's
     * representation has changed.
     * NOTE: It is not recommended to call this yourself.
     * @param config
     * @param user
     * @param userAgent
     */
    synchronizeBootstrapData(config: BucketedUserConfig | null, user: DevCycleUser<CustomData>, userAgent?: string): void;
    private refetchConfig;
    private handleConfigReceived;
    private setUser;
    private onSSEMessage;
    private registerVisibilityChangeHandler;
    private getConfigCache;
}
export {};
