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