import { InitData, Expression, Query, Value, ObjectValueWithVariables, UpdateListener, DehydratedState, DeepPartial, InitDataProvider, ObjectValue, InitQuery, FieldQuery, Logs } from "../shared";
import Logger from "./Logger";
import LRUCache from "../shared/helpers/LRUCache";
/** @internal: Not part of the Hypertune public API */
export default class Context {
    protected readonly initDataProvider: InitDataProvider | null;
    protected readonly initDataRefreshIntervalMs: number;
    protected readonly shouldSkipInitDataUpdateOnRefresh: boolean;
    protected readonly query: Query<ObjectValueWithVariables> | null;
    protected readonly initQuery: InitQuery;
    protected variableValues: ObjectValue;
    protected readonly updateListeners: Map<UpdateListener, boolean>;
    protected shouldClose: boolean;
    protected updateTimeout: NodeJS.Timeout | null;
    readonly logger: Logger;
    initData: InitData | null;
    lastInitDataRefreshTime: number | null;
    readonly getFieldCache: LRUCache<Expression> | null;
    readonly getItemsCache: LRUCache<Expression[]> | null;
    readonly evaluateCache: LRUCache<{
        value: Value;
        logs: Logs;
        path: string;
        args: {
            [path: string]: ObjectValue;
        };
        shouldLogEvaluation: boolean;
    }> | null;
    override: DeepPartial<ObjectValue> | null;
    constructor({ traceId, initData, lastInitDataRefreshTime, initDataProvider, initDataRefreshIntervalMs, shouldRefreshInitData, shouldRefreshInitDataOnCreate, shouldSkipInitDataUpdateOnRefresh, query, initQuery, variableValues, logger, cacheSize, override, }: {
        traceId: string;
        initData: InitData | null;
        lastInitDataRefreshTime: number | null;
        initDataProvider: InitDataProvider | null;
        initDataRefreshIntervalMs: number;
        shouldRefreshInitData: boolean;
        shouldRefreshInitDataOnCreate: boolean;
        shouldSkipInitDataUpdateOnRefresh: boolean;
        query: Query<ObjectValueWithVariables> | null;
        initQuery: InitQuery;
        variableValues: ObjectValue;
        logger: Logger;
        cacheSize: number;
        override: object | null;
    });
    private updateInitData;
    initIfNeeded(traceId: string, retries: number): Promise<void>;
    private initFromDataProvider;
    private getHashData;
    private getInitData;
    private initAndStartIntervals;
    isReady(): boolean;
    close(traceId: string): Promise<void>;
    getStateHash(): string;
    addUpdateListener(listener: UpdateListener): void;
    removeUpdateListener(listener: UpdateListener): void;
    setOverride<TOverride extends ObjectValue>(traceId: string, override: DeepPartial<TOverride> | null): void;
    private updateOverride;
    dehydrate<TOverride extends ObjectValue, TVariableValues extends ObjectValue>(query?: Query<ObjectValueWithVariables>, variableValues?: TVariableValues): DehydratedState<TOverride, TVariableValues> | null;
    hydrate<TOverride extends ObjectValue, TVariableValues extends ObjectValue>(traceId: string, dehydratedState: DehydratedState<TOverride, TVariableValues>): void;
    private updateLastInitDataRefreshTime;
    private withUpdateNotification;
    private withUpdateNotificationAsync;
    private notifyUpdateListenersIfNeeded;
    reduce(fieldQuery: FieldQuery<ObjectValueWithVariables> | null, expression: Expression): Expression;
    private log;
}
//# sourceMappingURL=Context.d.ts.map