UNPKG

synapse-storage

Version:

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

52 lines (51 loc) 2.93 kB
import type { ILogger, IStorage } from '../storage'; import type { ISelectorModule, Selector, SelectorAPI, SelectorOptions } from './selector.interface'; /** * Глубокое сравнение объектов по структуре с защитой от циклических ссылок и лимитом глубины. * Используется только при явной передаче через options.equals. */ export declare function deepEquals<T>(a: T, b: T, depth?: number, visited?: WeakSet<object>): boolean; export declare class SelectorModule<S extends Record<string, any>> implements ISelectorModule<S> { private readonly source; private readonly logger?; storageName: string; private selectorIdCounter; private subscriptions; private localSelectorCache; private batchUpdateInProgress; private pendingUpdates; private readonly disposeStatusListener; constructor(source: IStorage<S>, logger?: ILogger | undefined); /** * Собирает публичный `SelectorAPI` поверх подписки. `$` — Observable-вид с той же * семантикой, что у `subscribe`: синхронный снапшот при подписке + emit на изменение. * * `sourceReadiness` переопределяет дефолтную (локальную) готовность источника: для * combined-селекторов туда передаётся агрегированная готовность по всем источникам * зависимостей (см. {@link createCombinedSelector}). */ private buildSelectorApi; private isSourceReady; private onSourceStatusChange; /** * Генерирует уникальное имя для селектора через автоинкрементный счётчик */ private generateName; /** * Обрабатывает отложенные обновления синхронно */ private processPendingUpdates; createSelector<T>(selector: Selector<S, T>, options?: SelectorOptions<T>): SelectorAPI<T>; createSelector<Deps extends unknown[], T>(dependencies: { [K in keyof Deps]: SelectorAPI<Deps[K]>; }, resultFn: (...args: Deps) => T, options?: SelectorOptions<T>): SelectorAPI<T>; private createSimpleSelector; private createCombinedSelector; /** * Точечно удаляет селектор по id: снимает его подписки на хранилище, чистит подписку * и кэш. Остальные селекторы модуля не затрагиваются. Имя кэша совпадает с id подписки * (`generateName()`/`options.name`), поэтому достаточно одного ключа. */ removeSelector(id: string): void; destroy(): void; }