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
}
}