From 66f334f5634ec708c412a9232474a9defac641c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20T=C3=A4kker?= Date: Wed, 10 Dec 2025 20:09:05 +0100 Subject: [PATCH] Refactor useAuth composable: implement refreshSessionToken logic with promise handling for improved session management --- app/composables/useAuth.ts | 51 +++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/app/composables/useAuth.ts b/app/composables/useAuth.ts index 7c2f9b1..8e6d89c 100644 --- a/app/composables/useAuth.ts +++ b/app/composables/useAuth.ts @@ -1,5 +1,8 @@ import axios, { AxiosError } from "axios" +let refreshPromise: Promise | null = null +let waitForPromise: boolean = false + export const useAuth = () => { const refreshToken = useCookie("refreshToken", { sameSite: "lax", @@ -28,6 +31,7 @@ export const useAuth = () => { ) refreshToken.value = res.data.refreshToken + await refreshSessionToken() await navigateTo("/") } catch (e) { @@ -43,7 +47,52 @@ export const useAuth = () => { const signout = () => {} - const refreshSessionToken = async () => {} + const refreshSessionToken = async () => { + if (waitForPromise) { + // Force it to wait up to 50 ms for it to set refreshPromise, hopefully less + for (let i = 0; i < 10; i++) { + if (refreshPromise != null) { + break + } + + await new Promise((r) => setTimeout(r, 5)) + } + } + + waitForPromise = true + + if (refreshPromise != null) { + waitForPromise = false + return refreshPromise + } + + refreshPromise = cfetch( + "/auth/session", + { + data: { + refreshToken: refreshToken.value, + }, + method: "POST", + }, + false + ) + .then((res) => { + const token = res.data.sessionToken + sessionToken.value = token + + refreshPromise = null + + return token + }) + .catch((e) => { + refreshPromise = null + sessionToken.value = null + + return null + }) + + return refreshPromise + } return { refreshToken,