synapse-storage
Version:
Набор инструментов для управления состоянием и апи-запросами
79 lines (78 loc) • 4.57 kB
TypeScript
import { CreateApiClientOptions } from '../types/api.interface';
import { Endpoint as EndpointType, EndpointConfig, EndpointState, RequestResponseModify } from '../types/endpoint.interface';
import { QueryOptions, QueryResult, Unsubscribe } from '../types/query.interface';
import { QueryStorage } from './query-storage';
export interface EndpointClassOptions<RequestParams extends Record<string, any>, RequestResponse> {
name: string;
queryStorage: QueryStorage;
config: EndpointConfig<RequestParams, RequestResponse>;
cacheableHeaderKeys: CreateApiClientOptions['cacheableHeaderKeys'];
globalCacheConfig: CreateApiClientOptions['cache'];
globalRetryConfig: CreateApiClientOptions['retry'];
baseQueryConfig: CreateApiClientOptions['baseQuery'];
}
export declare class EndpointClass<RequestParams extends Record<string, any>, RequestResponse> implements EndpointType<RequestParams, RequestResponse> {
private endpointSubscribers;
/** Сколько раз был вызван метод request */
fetchCounts: number;
meta: EndpointType['meta'];
private name;
private queryStorage;
private configCurrentEndpoint;
private cacheableHeaderKeys;
private globalRetryConfig;
private baseQueryConfig;
private queryFunction;
/** Массив заголовков, которые нужно включить в ключ кэширования */
private cacheableHeaders;
private prepareHeaders;
/** Карта in-flight запросов для дедупликации (cacheKey → Promise) */
private inflightRequests;
constructor(options: EndpointClassOptions<RequestParams, RequestResponse>);
request(params: RequestParams, options?: QueryOptions): RequestResponseModify<RequestResponse>;
/**
* Определяет итоговую конфигурацию retry: вызов → эндпоинт → глобальная
*/
private resolveRetryConfig;
/**
* Выполняет сетевой запрос с кэшированием, дедупликацией и retry
*/
private executeRequest;
/**
* Выполняет HTTP-запрос с retry, инвалидацией тегов и кэшированием результата
*/
private executeFetch;
/**
* Выполняет HTTP-запрос с повторными попытками
*/
private fetchWithRetry;
/**
* Уведомляет подписчиков эндпоинта об изменении состояния
*/
private notifyEndpointSubscribers;
/**
* Синхронное чтение результата из кэша (fast-path для SSR-гидрации).
*
* Возвращает закэшированный результат БЕЗ сетевого запроса и без async-тика,
* поэтому хук может отдать серверные данные уже на первом рендере (без вспышки
* loading после гидрации). Работает только когда:
* - хранилище синхронное (Memory/LocalStorage);
* - у эндпоинта нет заголовков, влияющих на ключ кэша (`cacheableHeaders`) —
* иначе ключ нельзя воспроизвести синхронно (заголовки готовятся async);
* - кэширование для эндпоинта включено и запись не протухла.
*
* Во всех остальных случаях возвращает `undefined` — вызывающий откатывается
* на обычный async-`request()`.
*/
getCachedSync(params: RequestParams): QueryResult<RequestResponse, Error> | undefined;
/**
* Подписка на инвалидацию кэша, затрагивающую этот эндпоинт. Колбэк вызывается,
* когда инвалидируется любой из тегов эндпоинта (`meta.tags`) — например, после
* мутации соседнего эндпоинта с `invalidatesTags`. Используется хуком `useApiQuery`
* для авто-рефетча (паритет с поведением React Query).
*/
onCacheInvalidate(listener: VoidFunction): Unsubscribe;
subscribe(cb: (state: EndpointState) => void): Unsubscribe;
reset(): Promise<void>;
destroy(): void;
}