UNPKG

synapse-storage

Version:

Набор инструментов для управления состоянием и апи-запросами

106 lines (105 loc) 5.17 kB
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>; }