synapse-storage
Version:
Набор инструментов для управления состоянием и апи-запросами
82 lines (81 loc) • 4.73 kB
TypeScript
import { IEventEmitter, ILogger, ISyncStorage, StorageType, SyncDefaultMiddlewares, SyncStorageConfig } from '../storage.interface';
import { StorageKeyType } from '../utils/storage-key';
import { PathSelector, StorageCore } from './storage-core';
/**
* Базовый класс для синхронных хранилищ (Memory, LocalStorage).
*
* Все CRUD-операции выполняются синхронно.
* Lifecycle (initialize, destroy) остаётся async.
* subscribeByKey упрощён — нет race condition без async get.
*/
export declare abstract class SyncBaseStorage<T extends Record<string, any>> extends StorageCore<T> implements ISyncStorage<T> {
protected readonly config: SyncStorageConfig<T>;
abstract readonly type: StorageType;
/** Sync-хранилище: доступно синхронное чтение кэша (getStateSync). */
readonly isSync = true;
private middlewareModule;
private initializedMiddlewares;
private selectorPathCache;
constructor(config: SyncStorageConfig<T>, eventEmitter?: IEventEmitter, logger?: ILogger);
protected abstract doGet(key: StorageKeyType): any;
protected abstract doSet(key: StorageKeyType, value: any): void;
protected abstract doUpdate(updates: Array<{
key: StorageKeyType;
value: any;
}>): void;
protected abstract doRemove(key: StorageKeyType): boolean;
protected abstract doClear(): void;
protected abstract doKeys(): string[];
protected abstract doHas(key: StorageKeyType): boolean;
/** Lifecycle — всегда async */
protected abstract doInitialize(): Promise<this>;
/** Lifecycle — всегда async */
protected abstract doDestroy(): Promise<void>;
protected performInitialize(): Promise<void>;
/**
* Синхронная инициализация sync-хранилища. Вся работа Memory/LocalStorage
* (`initializeMiddlewares` + `initializeWithMiddlewares`) синхронна — здесь она
* выполняется без `await`, чтобы {@link StorageCore.initializeSync} мог довести
* хранилище до `READY` в пределах одного тика (SSR sync-shell).
*/
protected performInitializeSync(): void;
/**
* Дефолт для `config.clearOnDestroy`, если он не задан.
* Memory: `true` (эфемерное). LocalStorage переопределяет на `false` (персистентное).
*/
protected get clearOnDestroyDefault(): boolean;
protected performCleanup(): Promise<void>;
protected initializeMiddlewares(): void;
protected getDefaultMiddleware(): SyncDefaultMiddlewares;
protected initializeWithMiddlewares(): void;
/** Читает сохранённую версию схемы. По умолчанию `undefined` (эфемерные хранилища). */
protected readPersistedVersion(): number | undefined;
/** Сохраняет версию схемы рядом с данными. По умолчанию no-op (эфемерные хранилища). */
protected writePersistedVersion(_version: number): void;
/** Удаляет сохранённую версию схемы (вызывается при destroy с `clearOnDestroy`). */
protected clearPersistedVersion(): void;
private getRawState;
get<R>(key: StorageKeyType): R | undefined;
set<R>(key: StorageKeyType, value: R): void;
update(updater: (state: T) => void): void;
remove(key: StorageKeyType): void;
clear(): void;
reset(): void;
/**
* SSR-гидрация: заменяет всё состояние переданным снапшотом. Намеренно НЕ требует
* `ready()` — типичный сценарий вызвать её до `initialize()`, чтобы инициализация
* не перезатёрла серверное состояние `initialState`-ом (см. `initializeWithMiddlewares`).
*/
hydrate(state: T): void;
/** Уведомляет подписчиков о замене состояния гидрацией (no-op до initialize/без подписок). */
private notifyHydration;
keys(): string[];
has(key: StorageKeyType): boolean;
getState(): T;
/**
* Sync-версия subscribeByKey.
* Нет race condition (get() синхронный) → не нужен keyVersions tracking.
*/
protected subscribeByKey(key: string, callback: (value: any) => void): VoidFunction;
protected subscribeBySelector<R>(pathSelector: PathSelector<T, R>, callback: (value: R) => void): VoidFunction;
}