From 03697b2f671ae96ee0c78c184109c6cb7de106e9 Mon Sep 17 00:00:00 2001 From: LandaMm Date: Fri, 30 May 2025 21:25:39 +0200 Subject: [PATCH] fix: window scoped state for token refresh --- web/globals.d.ts | 6 ++++++ web/src/api/index.ts | 10 ++++++---- web/src/main.tsx | 7 +++++++ web/tsconfig.app.json | 2 +- 4 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 web/globals.d.ts diff --git a/web/globals.d.ts b/web/globals.d.ts new file mode 100644 index 0000000..d7b9843 --- /dev/null +++ b/web/globals.d.ts @@ -0,0 +1,6 @@ +interface Window { + guard: { + refreshing: boolean; + refreshQueue: ((token: string | null) => void)[]; + }; +} diff --git a/web/src/api/index.ts b/web/src/api/index.ts index 28834b8..df8ed10 100644 --- a/web/src/api/index.ts +++ b/web/src/api/index.ts @@ -12,7 +12,6 @@ export const axios = Axios.create({ }, }); -let isRefreshing = false; let refreshQueue: ((token: string | null) => void)[] = []; const waitForTokenRefresh = () => { @@ -60,7 +59,7 @@ const refreshToken = async ( } finally { localStorage.removeItem("refreshing"); loadAccounts?.(); - isRefreshing = false; + window.guard.refreshing = false; } }; @@ -74,8 +73,9 @@ axios.interceptors.request.use( return request; } - if (!isRefreshing) { - isRefreshing = true; + if (!window.guard.refreshing) { + console.log(`request to ${request.url} is refreshing token`); + window.guard.refreshing = true; try { const { access } = await refreshToken( account!.accountId, @@ -87,7 +87,9 @@ axios.interceptors.request.use( throw err; } } else { + console.log(`request to ${request.url} is waiting for token`); token = await waitForTokenRefresh(); + console.log(`request to ${request.url} waited for token:`, token); } if (!token) { diff --git a/web/src/main.tsx b/web/src/main.tsx index 51c2c1a..4561149 100644 --- a/web/src/main.tsx +++ b/web/src/main.tsx @@ -4,6 +4,13 @@ import App from "./App"; import "./index.css"; import { OAuthProvider } from "./context/oauth/provider"; +if (typeof window.guard !== "object") { + window.guard = { + refreshing: false, + refreshQueue: [], + }; +} + const root = document.getElementById("root")!; createRoot(root).render( diff --git a/web/tsconfig.app.json b/web/tsconfig.app.json index fb448da..8406dee 100644 --- a/web/tsconfig.app.json +++ b/web/tsconfig.app.json @@ -25,5 +25,5 @@ "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true }, - "include": ["src"] + "include": ["src", "globals.d.ts"] }