import { MetadataObject } from "../types/meta";
import { INamespacedResourceClient } from "../resource";
export interface Store<TResource extends MetadataObject> {
    store(obj: TResource): Promise<void> | void;
    get(namespace: string, name: string): Promise<TResource | undefined> | TResource | undefined;
    pull(obj: TResource): Promise<void> | void;
    sync(objs: TResource[]): Promise<void> | void;
}
export interface ObservableStore<TResource extends MetadataObject> extends Store<TResource> {
    onStoredOrUpdated(fn: (obj: TResource) => any): void;
    onRemoved(fn: (obj: TResource) => any): void;
    onSynced(fn: (objs: TResource[]) => any): void;
}
export declare class ObservableStoreDecorator<TResource extends MetadataObject> implements ObservableStore<TResource> {
    private readonly inner;
    private readonly onStoreHandlers;
    private readonly onRemoveHandlers;
    private readonly onSyncedHandlers;
    constructor(inner: Store<TResource>);
    onStoredOrUpdated(fn: (obj: TResource) => any): void;
    onRemoved(fn: (obj: TResource) => any): void;
    onSynced(fn: (objs: TResource[]) => any): void;
    get(namespace: string, name: string): Promise<TResource | undefined> | TResource | undefined;
    pull(obj: TResource): Promise<void>;
    store(obj: TResource): Promise<void>;
    sync(objs: TResource[]): Promise<void>;
}
export declare class InMemoryStore<TResource extends MetadataObject> implements Store<TResource> {
    private objects;
    store(obj: TResource): void;
    pull(obj: TResource): void;
    sync(objs: TResource[]): Promise<void>;
    get(namespace: string, name: string): TResource | undefined;
}
export declare class CachingLookupStore<TResource extends MetadataObject> implements Store<TResource> {
    private readonly api;
    private readonly expirationSeconds;
    private cache;
    constructor(api: INamespacedResourceClient<any, any, any, TResource>, expirationSeconds?: number);
    private storeInMap;
    store(obj: TResource): void;
    sync(objs: TResource[]): void;
    get(namespace: string, name: string): Promise<TResource | undefined>;
    pull(obj: TResource): void;
}
