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; private autoDetectAndOpen; private detectCurrentVersion; ensureStoreExists(storeName: string): Promise; /** * Ставит операцию изменения схемы в последовательную очередь, чтобы создания * сторов на одной БД не перекрывались между await-точками. Очередь не должна * "застревать" из-за упавшей операции — ошибку прокидываем вызывающему, но * следующий элемент очереди стартует независимо от результата предыдущего. */ private enqueue; /** * Идемпотентно гарантирует наличие переданных сторов. Никогда не обращается к * this.db после await — работает с локальной ссылкой, возвращённой initialize() * / openDatabase(), поэтому параллельное обнуление this.db (другим клиентом * или onversionchange) не приводит к чтению свойств у null. */ private ensureStoresInternal; private openDatabase; closeDatabase(): void; deleteDatabase(): Promise; ensureStoresExist(storeNames: string[]): Promise; getCurrentVersion(): number; } export declare class IndexedDBStorage> extends AsyncBaseStorage { protected static readonly STORAGE_TYPE: StorageType; readonly type: StorageType; private readonly DB_NAME; private readonly STORE_NAME; private dbManager; constructor(config: IndexedDBStorageConfig, eventEmitter?: IEventEmitter, logger?: ILogger); static create>(config: IndexedDBStorageConfig, eventEmitter?: IEventEmitter, logger?: ILogger): IndexedDBStorage; protected doInitialize(): Promise; static createStorages>(dbName: string, configs: { [K in keyof S]: { name: string; initialState?: S[K]; middlewares?: ConfigureAsyncMiddlewares; eventEmitter?: IEventEmitter; }; }, logger?: ILogger): Promise<{ [K in keyof S]: IndexedDBStorage; }>; /** * Выполняет операцию в рамках IDB-транзакции. * Обёртка для низкоуровневого IDB transaction API. * * @param mode - Режим транзакции ('readonly' | 'readwrite') * @param fn - Callback, получающий IDBObjectStore. Возвращает результат операции. * @returns Promise с результатом callback-а */ transaction(mode: IDBTransactionMode, fn: (store: IDBObjectStore) => IDBRequest | R): Promise; /** * Текущая версия базы данных. */ get dbVersion(): number; /** * Имя базы данных. */ get dbName(): string; /** * Имя object store в IndexedDB. */ get storeName(): string; private getTransaction; private getObjectStore; protected doGet(key: StorageKeyType): Promise; protected doSet(key: StorageKeyType, value: any): Promise; private putValueInStore; protected doUpdate(updates: Array<{ key: string | StorageKey; value: any; }>): Promise; protected doDelete(key: StorageKeyType): Promise; protected doClear(): Promise; protected doKeys(): Promise; protected readPersistedVersion(): Promise; protected writePersistedVersion(version: number): Promise; protected doHas(key: StorageKeyType): Promise; /** * 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; protected doDestroy(): Promise; }