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