Files
evening_detective_frontend/src/api/auth_client.ts
T
2026-09-09 18:54:57 +07:00

46 lines
1.5 KiB
TypeScript

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<boolean>,
getToken: () => string | null,
): EveningDetectiveServer {
return createEveningDetectiveServerClient(
createAuthHttpHandler(refreshTokens, createHttpHandler(getToken)),
)
}
function createAuthHttpHandler(
refreshTokens: () => Promise<boolean>,
handler: (request: { path: string; method: string; body: string | null }) => Promise<unknown>,
): (request: { path: string; method: string; body: string | null }) => Promise<unknown> {
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
}
}