import { useAuthStore } from '@/stores/auth' import { createEveningDetectiveServerClient, type EveningDetectiveServer, } from './generated/crabs/evening_detective_server' import { createHttpHandler } from './generated/crabs/evening_detective_server/client' export function getAuthClient() { const authStore = useAuthStore() return buildAuthClient(authStore.refreshTokenAction, authStore.getToken) } function buildAuthClient( refreshTokens: () => Promise, getToken: () => string | null, ): EveningDetectiveServer { return createEveningDetectiveServerClient( createAuthHttpHandler(refreshTokens, createHttpHandler(getToken)), ) } function createAuthHttpHandler( refreshTokens: () => Promise, handler: (request: { path: string; method: string; body: string | null }) => Promise, ): (request: { path: string; method: string; body: string | null }) => Promise { return async (request: { path: string; method: string; body: string | null }) => { let response: unknown try { response = await handler(request) } catch { await refreshTokens() response = await handler(request) } // Gateway возвращает gRPC-ошибки как JSON даже при HTTP 403/400/500. if (response && typeof response === 'object' && 'code' in response && response.code !== 0) { throw new Error( 'message' in response && typeof response.message === 'string' ? response.message : 'Ошибка запроса', ) } return response } }