synapse-storage
Version:
Набор инструментов для управления состоянием и апи-запросами
133 lines (132 loc) • 7.38 kB
TypeScript
import { IStorage, StorageKeyType } from '../../core';
import { CacheConfig, CreateApiClientOptions, StorageOption } from '../types/api.interface';
import { EndpointConfig } from '../types/endpoint.interface';
import { QueryOptions, Unsubscribe } from '../types/query.interface';
/**
* Менеджер хранилища для API
* Объединяет в себе функционал хранилища и управления кэшем
*/
export declare class QueryStorage {
private readonly storageExternal;
private readonly globalCacheConfig;
/** Экземпляр хранилища */
private storage;
private cleanupInterval;
/** Индекс тегов: tag → Set<cacheKey> для быстрой инвалидации */
private tagIndex;
/** Подписчики на событие инвалидации кэша (шина для авто-рефетча хуков) */
private invalidateListeners;
/** Настройки кэша по умолчанию */
private defaultCacheOptions;
/** Флаг завершённой инициализации */
private _initialized;
/** Промис текущей инициализации */
private _initPromise;
constructor(storageExternal: StorageOption, globalCacheConfig: CreateApiClientOptions['cache']);
initialize(): Promise<this>;
private _doInitialize;
private createStorage;
private startCleanupInterval;
/**
* Получает экземпляр хранилища
*/
getStorage(): IStorage | null;
/**
* Является ли текущее хранилище синхронным (Memory/LocalStorage).
* Только для таких хранилищ доступно синхронное чтение кэша ({@link getCachedResultSync}).
*/
isSyncStorage(): boolean;
/**
* Подписка на событие инвалидации кэша. Колбэк получает список тегов, которые
* были инвалидированы (через мутацию с `invalidatesTags` или ручную инвалидацию).
* Используется хуками для авто-рефетча активных запросов после мутаций.
*/
onCacheInvalidate(listener: (tags: string[]) => void): Unsubscribe;
/** Уведомляет подписчиков шины об инвалидации указанных тегов */
private emitCacheInvalidate;
/**
* Синхронное чтение результата из кэша (fast-path для SSR-гидрации).
* Работает только на синхронных хранилищах (Memory/LocalStorage) — читает из
* снапшота `getStateSync()` без async-тика, поэтому данные доступны уже на
* первом рендере и не возникает «вспышки» loading. Для async-хранилищ
* (IndexedDB) и протухших записей возвращает `undefined`.
*
* В отличие от {@link getCachedResult}, НЕ мутирует метаданные и не удаляет
* протухшие записи (чистое чтение, безопасно вызывать во время рендера).
*/
getCachedResultSync<T>(cacheKey: StorageKeyType): T | undefined;
/**
* Создает ключ кэша для запроса с учетом заголовков
* @param endpoint Имя эндпоинта
* @param params Параметры запроса (все что посчитаем нужным)
*/
createCacheKey<CacheParams extends Record<string, any>>(endpoint: string, params: CacheParams): [StorageKeyType, Record<string, any> | undefined];
/**
* Получает результат запроса из кэша
*/
getCachedResult<T>(cacheKey: StorageKeyType): Promise<T | undefined>;
/**
* Сохраняет результат запроса в кэш
* @param cacheKey Ключ кэша
* @param data Данные для кэширования
* @param cacheOptions Метаданные
* @param cacheParams Параметры которые влияли на создание ключа
* @param tags Тэги эндпоинта
*/
setCachedResult<T, CacheParams extends Record<string, any>>(cacheKey: StorageKeyType, data: T, cacheOptions: Exclude<CacheConfig, boolean>, cacheParams: CacheParams, tags: string[]): Promise<void>;
/**
* Проверяет, должен ли запрос быть кэширован
* @param endpointConfig Конфигурация эндпоинта
* @param options Опции запроса
* @param method HTTP-метод запроса (только GET кэшируется по REST-стандарту)
* @returns true если запрос должен кэшироваться
*/
shouldCache(endpointConfig?: EndpointConfig, options?: QueryOptions, method?: string): boolean;
/**
* Создает итоговую конфигурацию кэширования для конкретного эндпоинта
* Объединяет глобальный конфиг с текущим
* @param endpointConfig Конфигурация эндпоинта
*/
createCacheConfig(endpointConfig?: EndpointConfig): {
ttl?: number;
cleanup?: {
enabled: boolean;
interval?: number;
};
invalidateOnError?: boolean;
};
/**
* Инвалидирует кэш по тегам (использует индекс для O(1) поиска по тегу)
* @param tags Теги для инвалидации
*/
invalidateCacheByTags(tags: string[]): Promise<void>;
/**
* Инвалидирует кэш по ключу
* @param cacheKey Ключ кэша
*/
invalidateCache(cacheKey: StorageKeyType): Promise<void>;
/**
* Выполняет очистку всех просроченных записей кэша
*/
cleanup(): Promise<void>;
/**
* Уничтожает хранилище и освобождает ресурсы
*/
destroy(): Promise<void>;
/**
* Гидрация кэша снапшотом (SSR/server-state). Заменяет состояние хранилища и
* перестраивает индекс тегов, чтобы инвалидация по тегам работала сразу после
* переноса с сервера. Абсолютные `expiresAt` в метаданных переживают перенос,
* поэтому TTL продолжает считаться корректно.
*/
hydrate(state: Record<string, any>): Promise<void>;
/**
* Перестраивает индекс тегов из существующих записей в storage
* Вызывается при инициализации для восстановления после перезагрузки
*/
private rebuildTagIndex;
/**
* Удаляет ключ из индекса тегов
*/
private removeKeyFromTagIndex;
}