import { ConfigureAsyncMiddlewares, IEventEmitter, ILogger, IndexedDBStorageConfig, StorageType } from '../storage.interface';
import { StorageKey, StorageKeyType } from '../utils/storage-key';
import { AsyncBaseStorage } from './async-base-storage.service';
export interface IndexedDBConfig {
    dbName?: string;
}
export declare class IndexedDBManager {
    private readonly dbName;
    private readonly logger?;
    private static instances;
    private db;
    private initPromise;
    private storeNames;
    private dbVersion;
    private opQueue;
    private constructor();
    static getInstance(dbName: string, dbVersion?: number, logger?: ILogger): IndexedDBManager;
    initialize(): Promise<IDBDatabase>;
    private autoDetectAndOpen;
    private detectCurrentVersion;
    ensureStoreExists(storeName: string): Promise<IDBDatabase>;
    /**
     * Ставит операцию изменения схемы в последовательную очередь, чтобы создания
     * сторов на одной БД не перекрывались между await-точками. Очередь не должна
     * "застревать" из-за упавшей операции — ошибку прокидываем вызывающему, но
     * следующий элемент очереди стартует независимо от результата предыдущего.
     */
    private enqueue;
    /**
     * Идемпотентно гарантирует наличие переданных сторов. Никогда не обращается к
     * this.db после await — работает с локальной ссылкой, возвращённой initialize()
     * / openDatabase(), поэтому параллельное обнуление this.db (другим клиентом
     * или onversionchange) не приводит к чтению свойств у null.
     */
    private ensureStoresInternal;
    private openDatabase;
    closeDatabase(): void;
    deleteDatabase(): Promise<void>;
    ensureStoresExist(storeNames: string[]): Promise<IDBDatabase>;
    getCurrentVersion(): number;
}
export declare class IndexedDBStorage<T extends Record<string, any>> extends AsyncBaseStorage<T> {
    protected static readonly STORAGE_TYPE: StorageType;
    readonly type: StorageType;
    private readonly DB_NAME;
    private readonly STORE_NAME;
    private dbManager;
    constructor(config: IndexedDBStorageConfig<T>, eventEmitter?: IEventEmitter, logger?: ILogger);
    static create<T extends Record<string, any>>(config: IndexedDBStorageConfig, eventEmitter?: IEventEmitter, logger?: ILogger): IndexedDBStorage<T>;
    protected doInitialize(): Promise<this>;
    static createStorages<S extends Record<string, any>>(dbName: string, configs: {
        [K in keyof S]: {
            name: string;
            initialState?: S[K];
            middlewares?: ConfigureAsyncMiddlewares;
            eventEmitter?: IEventEmitter;
        };
    }, logger?: ILogger): Promise<{
        [K in keyof S]: IndexedDBStorage<S[K]>;
    }>;
    /**
     * Выполняет операцию в рамках IDB-транзакции.
     * Обёртка для низкоуровневого IDB transaction API.
     *
     * @param mode - Режим транзакции ('readonly' | 'readwrite')
     * @param fn - Callback, получающий IDBObjectStore. Возвращает результат операции.
     * @returns Promise с результатом callback-а
     */
    transaction<R>(mode: IDBTransactionMode, fn: (store: IDBObjectStore) => IDBRequest<R> | R): Promise<R>;
    /**
     * Текущая версия базы данных.
     */
    get dbVersion(): number;
    /**
     * Имя базы данных.
     */
    get dbName(): string;
    /**
     * Имя object store в IndexedDB.
     */
    get storeName(): string;
    private getTransaction;
    private getObjectStore;
    protected doGet(key: StorageKeyType): Promise<any>;
    protected doSet(key: StorageKeyType, value: any): Promise<void>;
    private putValueInStore;
    protected doUpdate(updates: Array<{
        key: string | StorageKey;
        value: any;
    }>): Promise<void>;
    protected doDelete(key: StorageKeyType): Promise<boolean>;
    protected doClear(): Promise<void>;
    protected doKeys(): Promise<string[]>;
    protected readPersistedVersion(): Promise<number | undefined>;
    protected writePersistedVersion(version: number): Promise<void>;
    protected doHas(key: StorageKeyType): Promise<boolean>;
    /**
     * Override performCleanup: persistent storage should NOT clear data on destroy.
     * Only clean up middleware and runtime resources, not persisted data.
     * Прогоняем cleanup мидлвар (иначе их каналы/таймеры текут после destroy — R8),
     * но сознательно пропускаем doClear() — данные переживают lifecycle компонента.
     */
    protected performCleanup(): Promise<void>;
    protected doDestroy(): Promise<void>;
}
