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