From 168cecf9fbd2c06f399ffd1834cf01861606e54e Mon Sep 17 00:00:00 2001 From: Iveta Date: Mon, 30 Oct 2023 13:24:15 -0400 Subject: [PATCH] Optimize refresh token for dispatch actions (#39) --- src/api/refreshToken.ts | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/api/refreshToken.ts b/src/api/refreshToken.ts index 62280e6..7a3028f 100644 --- a/src/api/refreshToken.ts +++ b/src/api/refreshToken.ts @@ -1,19 +1,32 @@ -import { API_URL } from "constants/settings"; +import { differenceInMinutes, fromUnixTime } from "date-fns"; +import { API_URL, SESSION_EXPIRED } from "constants/settings"; +import { parseJwt } from "helpers/parseJwt"; export const refreshToken = async (token: string): Promise => { - const response = await fetch(`${API_URL}/refresh-token`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${token}`, - }, - }); + const jwt = parseJwt(token); + // JWT session is 15 min + const minRemaining = differenceInMinutes(fromUnixTime(jwt.exp), Date.now()); - const responseJson = await response.json(); + if (minRemaining <= 0) { + throw SESSION_EXPIRED; + } else if (minRemaining < 5) { + const response = await fetch(`${API_URL}/refresh-token`, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${token}`, + }, + }); - if (responseJson.token) { - return responseJson.token; + const responseJson = await response.json(); + + if (responseJson.token) { + return responseJson.token; + } + + throw responseJson; } - throw responseJson; + // Return current token + return token; };