import { DerivedInstanceState, DerivedServiceState, DerivedState, CrannOptions, AnyConfig, StateChangeListener, MergeStateTypes } from "./model/crann.model";
import { AgentInfo, Agent, BrowserLocation } from "./transport";
export declare class Crann<TConfig extends AnyConfig> {
    private config;
    private static instance;
    private instances;
    private defaultServiceState;
    private defaultInstanceState;
    private serviceState;
    private stateChangeListeners;
    private instanceReadyListeners;
    private storagePrefix;
    private porter;
    private rpcEndpoint;
    private logger;
    constructor(config: TConfig, options?: CrannOptions);
    static getInstance<TConfig extends AnyConfig>(config: TConfig, options?: CrannOptions): Crann<TConfig>;
    /**
     * Add an instance to the Crann instance.
     * @param key The key of the instance to add.
     * @param agentTag The tag of the agent that is adding the instance, for logging.
     */
    private addInstance;
    private removeInstance;
    setServiceState(state: Partial<DerivedServiceState<TConfig>>): Promise<void>;
    setInstanceState(key: string, state: Partial<DerivedInstanceState<TConfig>>): Promise<void>;
    private persist;
    clear(): Promise<void>;
    subscribe(listener: StateChangeListener<TConfig>): void;
    private notify;
    get(): DerivedState<TConfig>;
    get(key: string): DerivedInstanceState<TConfig> & DerivedServiceState<TConfig>;
    findInstance(location: BrowserLocation): string | null;
    queryAgents(query: Partial<BrowserLocation>): Agent[];
    set(state: Partial<DerivedServiceState<TConfig>>): Promise<void>;
    set(state: Partial<MergeStateTypes<DerivedInstanceState<TConfig>, DerivedServiceState<TConfig>>>, key: string): Promise<void>;
    private hydrate;
    private removePrefix;
    private initializeInstanceDefault;
    private initializeServiceDefault;
    subscribeToInstanceReady(listener: (instanceId: string, agent: AgentInfo) => void): () => void;
    private notifyInstanceReady;
    private extractActions;
}
export interface CrannAPI<TConfig extends AnyConfig> {
    get: {
        (): DerivedState<TConfig>;
        (key: string): DerivedInstanceState<TConfig> & DerivedServiceState<TConfig>;
    };
    set: {
        (state: Partial<DerivedServiceState<TConfig>>): Promise<void>;
        (state: Partial<MergeStateTypes<DerivedInstanceState<TConfig>, DerivedServiceState<TConfig>>>, key: string): Promise<void>;
    };
    subscribe: (listener: StateChangeListener<TConfig>) => void;
    onInstanceReady: (listener: (instanceId: string, agent: AgentInfo) => void) => () => void;
    findInstance: (location: BrowserLocation) => string | null;
    queryAgents: (query: Partial<BrowserLocation>) => Agent[];
    clear: () => Promise<void>;
}
export declare function create<TConfig extends AnyConfig>(config: TConfig, options?: CrannOptions): CrannAPI<TConfig>;
