UNPKG

synapse-storage

Version:

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

74 lines (73 loc) 4.4 kB
import { IStorage } from '../core'; import { CreateApiClientOptions, ExtractParamsType, ExtractResultType } from './types/api.interface'; import { CreateEndpoint, Endpoint as EndpointType, EndpointConfig } from './types/endpoint.interface'; import { QueryOptions, QueryResult } from './types/query.interface'; type EndpointsResult<F> = F extends (create: any) => Promise<infer R> ? R : never; type EndpointsMap<EndpointsFn> = { [K in keyof EndpointsResult<EndpointsFn>]: EndpointType<ExtractParamsType<EndpointsResult<EndpointsFn>[K]>, ExtractResultType<EndpointsResult<EndpointsFn>[K]>>; }; export declare class ApiClient<EndpointsFn extends (create: CreateEndpoint) => Promise<Record<string, EndpointConfig<any, any>>>> { /** Хранилище запросов */ private queryStorage; /** Флаг завершённой инициализации */ private _initialized; /** Промис текущей инициализации (для дедупликации параллельных вызовов) */ private _initPromise; /** Снапшот для гидрации, отложенный до завершения init (если hydrate вызван раньше) */ private _pendingHydration; private readonly cacheableHeaderKeys; private readonly globalCacheConfig; private readonly baseQueryConfig; private readonly storageExternal; private readonly globalRetryConfig; private readonly createEndpoints; /** Реестр эндпоинтов */ private endpoints; constructor(options: Omit<CreateApiClientOptions, 'endpoints'> & { endpoints: EndpointsFn; }); init(): Promise<this>; private _doInit; private initializeEndpoints; private ensureInitialized; /** * Получает все эндпоинты с улучшенной типизацией * @returns Типизированный объект эндпоинтов */ getEndpoints(): EndpointsMap<EndpointsFn>; /** * Выполняет запрос к API с типизацией и обработкой ошибок * @param endpointName Имя эндпоинта (с подсказками TypeScript) * @param params Параметры запроса (с типизацией) * @param options Опции запроса * @returns Promise с типизированным результатом запроса */ request<K extends keyof EndpointsResult<EndpointsFn> & string>(endpointName: K, params: ExtractParamsType<EndpointsResult<EndpointsFn>[K]>, options?: QueryOptions): Promise<QueryResult<ExtractResultType<EndpointsResult<EndpointsFn>[K]>, Error>>; /** * Снимок кэша для дегидрации (SSR: сервер → HTML → клиент). * * Возвращает всё состояние кэш-хранилища (записи API с абсолютными `expiresAt`, * поэтому TTL переживает перенос на клиент). Симметрично `dehydrateModule` для * synapse-модулей. Типичный серверный рецепт: `await api.request(...)` для * прогрева → `await api.dehydrate()` → сериализовать в HTML. */ dehydrate(): Promise<Record<string, any>>; /** * Гидрация кэша снапшотом с сервера. * * - Вызванная ДО `init()` — снапшот запоминается и применяется сразу после * создания хранилища (init не перезатрёт серверное состояние). * - Вызванная ПОСЛЕ `init()` — немедленно заменяет состояние кэша и * перестраивает индекс тегов. * * После гидрации первый `request()`/`getCachedSync()` с теми же параметрами * попадёт в кэш — на клиенте не будет повторного сетевого запроса. */ hydrate(state: Record<string, any>): Promise<this>; /** * Доступ к экземпляру хранилища кэша (для ручных сценариев SSR/отладки). */ getStorage(): IStorage | null; destroy(): Promise<void>; } export {};