diff --git a/src/lib/helpers/http.js b/src/lib/helpers/http.js index 32975b78..43405900 100644 --- a/src/lib/helpers/http.js +++ b/src/lib/helpers/http.js @@ -1,5 +1,5 @@ import axios from 'axios'; -import { getUserStore, globalErrorStore, loaderStore } from '$lib/helpers/store.js'; +import { getUserStore, globalErrorStore, loaderStore, userStore } from '$lib/helpers/store.js'; import { renewToken } from '$lib/services/auth-service'; import { delay } from './utils/common'; @@ -14,6 +14,9 @@ const retryQueue = { /** @type {number} */ timeout: 20, + /** @type {number} */ + maxRenewTokenCount: 30, + /** * refresh access token * @param {string} token @@ -35,6 +38,9 @@ const retryQueue = { this.dequeue(user.token); } else { this.isRefreshingToken = true; + user.renew_token_count = (user.renew_token_count || 0) + 1; + // @ts-ignore + userStore.set(user); this.refreshAccessToken(user?.token || '') .then((newToken) => { this.isRefreshingToken = false; @@ -102,6 +108,9 @@ axios.interceptors.request.use( // Attach an authentication token to the request headers if (user.token) { config.headers.Authorization = `Bearer ${user.token}`; + } else { + retryQueue.queue = []; + redirectToLogin(); } return config; }, @@ -115,17 +124,15 @@ axios.interceptors.request.use( axios.interceptors.response.use( (response) => { loaderStore.set(false); - const user = getUserStore(); - if (!user?.token) { - redirectToLogin(); - } return response; }, (error) => { loaderStore.set(false); const originalRequest = error?.config || {}; const user = getUserStore(); - if (!user?.token) { + console.log("renew token count.", user.renew_token_count); + if (!user?.token || user.renew_token_count >= retryQueue.maxRenewTokenCount) { + retryQueue.queue = []; redirectToLogin(); return Promise.reject(error); } @@ -180,7 +187,8 @@ function skipLoader(config) { new RegExp('http(s*)://(.*?)/users', 'g'), new RegExp('http(s*)://(.*?)/instruct/chat-completion', 'g'), new RegExp('http(s*)://(.*?)/agent/(.*?)/code-scripts', 'g'), - new RegExp('http(s*)://(.*?)/agent/(.*?)/code-script/generate', 'g') + new RegExp('http(s*)://(.*?)/agent/(.*?)/code-script/generate', 'g'), + new RegExp('http(s*)://(.*?)/renew-token', 'g') ]; /** @type {RegExp[]} */ diff --git a/src/lib/helpers/store.js b/src/lib/helpers/store.js index dd3f3fd1..19c7608b 100644 --- a/src/lib/helpers/store.js +++ b/src/lib/helpers/store.js @@ -42,10 +42,11 @@ export function getUserStore() { if (browser) { // Access localStorage only if in the browser context let json = sessionStorage.getItem(userKey); - if (json) + if (json) { return JSON.parse(json); - else + } else { return userStore; + } } else { // Return a default value for SSR return userStore; diff --git a/src/lib/helpers/types/userTypes.js b/src/lib/helpers/types/userTypes.js index 73624623..ef899bf4 100644 --- a/src/lib/helpers/types/userTypes.js +++ b/src/lib/helpers/types/userTypes.js @@ -18,6 +18,7 @@ * @property {string} [color] * @property {string} [token] * @property {boolean} [open_detail] + * @property {number?} [renew_token_count] */ /** diff --git a/src/lib/services/auth-service.js b/src/lib/services/auth-service.js index bc7543de..7bbe3fee 100644 --- a/src/lib/services/auth-service.js +++ b/src/lib/services/auth-service.js @@ -32,6 +32,7 @@ export async function getToken(email, password, onSucceed, onError) { const user = getUserStore(); user.token = result.access_token; user.expires = result.expires; + user.renew_token_count = 0; userStore.set(user); onSucceed(); })