UNPKG

synapse-storage

Version:

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

79 lines (78 loc) 4.57 kB
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; }