import { AxiosInstance, AxiosPromise, AxiosRequestConfig } from 'axios'; /** * Контекст ошибки, который передаётся в `clientOptions.onError`. * Сделан плоским и сериализуемым — host-приложение само решит, * что отправлять в Sentry/Datadog/etc. * * Важно: тело запроса (`params`) сюда НЕ кладётся — там может быть PII * (email, телефон, имя клиента). Если конкретному endpoint'у нужны * sanitized-параметры — пусть host-апп прокидывает их через свой * api-wrapper. */ export type ApiErrorContext = { method: string; url: string; status?: number; /** Сетевой код axios: ECONNABORTED/ERR_CANCELED/... — для 0-status кейсов. */ code?: string; /** * Сообщение axios-ошибки (`error.message`), например «timeout of 0ms * exceeded». Нужно классификатору, чтобы отличить фантомный обрыв * запроса от реального сконфигурированного таймаута. */ message?: string; /** имя ApiMethodDeclaration, например `users.me` */ apiKey: string; /** * Бизнес-код ошибки от бэка (`errorCode` из ErrorData). Лежит в теле * 4xx-ответа. Используем для классификации (см. `classifyApiError`): * generic коды → debug-уровень, конкретные (`SLOT_TAKEN`, `PROMO_INVALID`) * → business-уровень. */ errorCode?: string; /** Изначальный бизнес-код, до маппинга бэком на generic (`originalErrorCode`). */ originalErrorCode?: string; /** Человекочитаемое сообщение от бэка (`ErrorData.message`). */ backendMessage?: string; /** * Сериализуемое тело ответа сервера (только структурированные поля * `ErrorData`, без всего payload'а — чтобы случайно не утащить PII). */ responseData?: { errorId?: string; application?: string; errorCode?: string; originalErrorCode?: string; message?: string; }; }; export type InitApiClientOptions = { /** Кастомный клиент (например React Native с interceptors и без редиректа в браузере). */ axiosInstance?: AxiosInstance; /** Вызывается при 401 вместо очистки cookie и редиректа на веб-авторизацию. */ onUnauthorized?: () => void; /** * Опциональный единый «sink» для всех ошибок API: 4xx и 5xx, network-fail. * Используется host-приложением, чтобы прокинуть ошибки в Sentry/Datadog. * Чтобы не залить аналитику 401/422 — фильтр на стороне host'а * (см. `appyApiOptions` в каждом фронте). */ onError?: (error: unknown, ctx: ApiErrorContext) => void; /** * Слать ли credentials (cookies) с каждым запросом. Default — `true` * для обратной совместимости (admin/auth/app полагаются на * session-cookie). Виджет, наоборот, явно передаёт `false`: cookies * на gateway-домене больше не нужны (auth — через * `Authorization: Bearer`), и их отправка из embed-виджета на * чужом домене провоцировала cross-profile collision (см. * `WidgetGuard` / `SlotDetailsService`). */ withCredentials?: boolean; }; export type ErrorData = { errorId: string; application: string; errorCode: string; message: string; originalErrorCode?: string; }; export declare function initApi(apiDeclaration: ApiDeclaration, baseURL: string, clientOptions?: InitApiClientOptions): Api; export type ApiMethodDeclaration = { (params: ParamsData): AxiosRequestConfig; displayName?: DisplayName; }; export type ApiDeclaration = { [P in keyof T]: T[P]; }; export type Api = { [P in keyof T]: MakeServiceFromServiceDeclaration; }; export type MakeServiceFromServiceDeclaration = { (params: ExtractApiMethodParamsType): AxiosPromise>; displayName: DisplayName; }; type ExtractApiMethodResponseDataType = T extends ApiMethodDeclaration ? D : any; type ExtractApiMethodParamsType = T extends ApiMethodDeclaration ? P : any; export type ExtendServiceParams = ApiMethodDeclaration, ExtractApiMethodResponseDataType>; export {};