generated from VLADIMIR/template_frontend
46 lines
1.5 KiB
TypeScript
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
|
|
}
|
|
}
|