/
romatur
/
rn-dev
Обзор
Документация
Войти
/
romatur
/
rn-dev
Код
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
rn-dev-project-api/src/interceptors/handleAuthError.ts
101 строка
3 KB
Roman.Turusov
init
08 апр 2026, 23:35
08 апр 2026, 23:35
c780c58
Код
Авторство
О чём код?
import axios, { type AxiosError, isAxiosError } from 'axios' import { AUTH_REFRESH_URL, WAITING_REFRESH_REQUEST_DELAY, WAITING_REFRESH_RESET_DELAY, } from '../constants' import ApiClient from '../services/ApiClient' import { delay } from '../utils' const handleAuthErrorInterceptor = async (error: AxiosError) => { if (error?.config?.withAuthorization !== true) { return Promise.reject(error) } if ( error?.response?.status === 401 && error?.config?.url !== AUTH_REFRESH_URL && error?.config?.headers?.Authorization ) { if (error?.config?.isRefreshingFailed === true) { return Promise.reject(error) } if (ApiClient.getIsRefreshing() !== true) { ApiClient.setIsRefreshing(true) const originalRequest = error.config return ApiClient.auth .refreshToken(ApiClient.getRefreshToken() as string) .catch((refreshError: unknown) => { ApiClient.setIsRefreshingFailed(true) setTimeout(() => { ApiClient.setIsRefreshing(false) ApiClient.setIsRefreshingFailed(false) }, WAITING_REFRESH_RESET_DELAY) return Promise.reject(refreshError) }) .then(async response => { ApiClient.setAccessToken(response.access_token) ApiClient.setRefreshToken(response.refresh_token) originalRequest.updateTokensCallback?.({ access: response.access_token, refresh: response.refresh_token, }) ApiClient.setIsRefreshing(false) originalRequest.headers.Authorization = `Bearer ${response.access_token}` return axios(originalRequest).then(responseOriginalRequest => { return Promise.resolve(responseOriginalRequest) }) }) .catch(async (originalRequestError: unknown) => { if (ApiClient.getIsRefreshingFailed()) { ApiClient.setIsRefreshingFailed(false) if ( isAxiosError(originalRequestError) && originalRequestError.status === 400 && originalRequestError.response?.data?.error_description === 'Maximum allowed refresh token reuse exceeded' ) { await delay(WAITING_REFRESH_REQUEST_DELAY) originalRequest.headers.Authorization = ApiClient.getHeaders().Authorization return axios(originalRequest).then(responseOriginalRequest => { return Promise.resolve(responseOriginalRequest) }) } else { error.config?.refreshCallback?.(originalRequestError) } } else { ApiClient.setIsRefreshingFailed(false) } return Promise.reject(originalRequestError) }) } else { await delay(WAITING_REFRESH_REQUEST_DELAY) error.config!.headers.Authorization = ApiClient.getHeaders().Authorization error.config!.isRefreshingFailed = ApiClient.getIsRefreshingFailed() return ApiClient.request(error.config!) .then(response => Promise.resolve(response)) .catch(error => Promise.reject(error)) } } return Promise.reject(error) } export default handleAuthErrorInterceptor