import axios from 'axios' import * as jwtDecode from 'jwt-decode' import { getTokens, setTokens } from './localStorage' interface IToken { readonly iat: number readonly exp: number } export interface IRefreshTokenOptions

{ onSuccess?: (principal: P) => void onFailure?: (err: any) => void } export function refreshTokensNeeded(): boolean { const tokens = getTokens() if (tokens.access && tokens.refresh) { const { iat, exp } = jwtDecode(tokens.access) // refresh tokens if access token has exceeded half of it's lifetime return (iat + exp) / 2 * 1000 < Date.now() } else { return false } } export async function refreshTokens(): Promise { const tokens = getTokens() if (tokens.access && tokens.refresh) { try { const response = await axios({ data: `grant_type=refresh_token&refresh_token=${encodeURIComponent(tokens.refresh)}`, headers: { 'content-type': 'application/x-www-form-urlencoded', }, method: 'post', url: '/api/auth/token/create', }) setTokens({ access: response.data.access_token, refresh: response.data.refresh_token, }) return true } catch (err) { if (err.response && err.response.status === 403) { return false } else { throw err } } } else { return false } }