import type { NitroFetchOptions } from "nitropack/types"; /** Клиентский хелпер для запросов через BFF (/bff prefix). Автоматически добавляет x-domain заголовок. */ export class ApiHelper { /** * @param path - путь без /bff префикса, например `/videos/list` * @param fetchOptions - стандартные опции $fetch * @param runtimeConfig - useRuntimeConfig() для получения xDomain */ static async fetch( path: string, fetchOptions: NitroFetchOptions, runtimeConfig: { public: { xDomain: string } }, ): Promise { const headers: Record = { ...(fetchOptions.headers as Record || {}), 'x-domain': runtimeConfig.public.xDomain, }; const method = String(fetchOptions.method || 'GET').toUpperCase(); // Повторяем только идемпотентные методы; POST/PUT/DELETE не ретраим — риск дубля действия const isIdempotent = method === 'GET' || method === 'HEAD'; const res = await $fetch(`/bff${path}`, { ...fetchOptions, retry: isIdempotent ? 2 : 0, retryDelay: 300, retryStatusCodes: [408, 425, 429, 500, 502, 503, 504], headers, } as any); return res as T; } }