UNPKG

synapse-storage

Version:

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

85 lines (84 loc) 4.67 kB
import { BaseStorageConfig, IEventEmitter, ILogger, IStorageBase, StorageEvent, StorageInitStatus, StorageType } from '../storage.interface'; import { StorageKeyType } from '../utils/storage-key'; export type PathSelector<T, R> = (state: T) => R; /** * Общая константа для глобальной подписки. * Используется в StorageCore и наследниках. */ export declare const GLOBAL_SUBSCRIPTION_KEY = "*"; /** * Абстрактный базовый класс с общей инфраструктурой хранилища. * * Содержит: status management, subscriptions, lifecycle wrappers, * state cache, event emission, singleton cleanup. * * Не содержит: middleware, plugin executor, do* методы, публичные CRUD-операции. */ export declare abstract class StorageCore<T extends Record<string, any>> implements IStorageBase<T> { protected readonly coreConfig: BaseStorageConfig<T>; protected readonly eventEmitter?: IEventEmitter | undefined; protected readonly logger?: ILogger | undefined; name: string; abstract readonly type: StorageType; /** * Синхронное ли хранилище — задаётся в SyncBaseStorage/AsyncBaseStorage. * Опциональный (не abstract): внешние кастомные адаптеры, наследующие StorageCore * и скомпилированные против прежней minor-версии, не обязаны его объявлять (R4). */ readonly isSync?: boolean; private _initStatus; private _isDestroyed; private statusSubscribers; protected subscribers: Map<StorageKeyType, Set<(value: any) => void>>; protected _stateCache: T; constructor(coreConfig: BaseStorageConfig<T>, eventEmitter?: IEventEmitter | undefined, logger?: ILogger | undefined); get initStatus(): StorageInitStatus; waitForReady(): Promise<this>; onStatusChange(callback: (status: StorageInitStatus) => void): VoidFunction; protected updateInitStatus(update: Partial<StorageInitStatus>): void; protected ensureReady(): void; getStateSync(): T; subscribeToAll(callback: (event: { type: string; key?: StorageKeyType[] | StorageKeyType; value?: any; changedPaths?: string[]; }) => void): VoidFunction; subscribe(key: string, callback: (value: any) => void): VoidFunction; subscribe<R>(pathSelector: PathSelector<T, R>, callback: (value: R) => void): VoidFunction; protected abstract subscribeByKey(key: string, callback: (value: any) => void): VoidFunction; protected abstract subscribeBySelector<R>(pathSelector: PathSelector<T, R>, callback: (value: R) => void): VoidFunction; /** * Хук изменения ключа. По умолчанию no-op. * Async-хранилища переопределяют для защиты от race condition в subscribeByKey * (см. AsyncBaseStorage). Sync версии не нужен — get() синхронный. */ protected trackKeyVersion(_keyStr: string): void; protected notifySubscribers(key: StorageKeyType, value: any): void; initialize(): Promise<this>; /** * Subclass-specific initialization. * Called inside initialize() wrapper after status is set to LOADING. */ protected abstract performInitialize(): Promise<void>; /** * Синхронный аналог {@link performInitialize} — реализуется только синхронными * хранилищами (Memory/LocalStorage, см. {@link SyncBaseStorage}). Async-хранилища * (IndexedDB/worker) его НЕ объявляют → {@link initializeSync} у них бросит. */ protected performInitializeSync?(): void; /** * Синхронная инициализация: доводит хранилище до `READY` в пределах одного тика, без * `await`. Нужна для SSR — синхронного построения «пустого» стора из `initialState` * (см. `createSynapse` → `buildSyncShell`). Доступна только на sync-хранилищах; * у async-хранилищ бросает понятную ошибку. */ initializeSync(): this; destroy(): Promise<void>; /** * Subclass-specific cleanup during destroy. * Should clear storage data, call doDestroy, cleanup middlewares. */ protected abstract performCleanup(): Promise<void>; protected emitEvent(event: StorageEvent): Promise<void>; }