synapse-storage
Version:
Набор инструментов для управления состоянием и апи-запросами
106 lines (105 loc) • 5.17 kB
TypeScript
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>;
}