Refactor useAuth composable: implement refreshSessionToken logic with promise handling for improved session management

This commit is contained in:
lucast committed 2025-12-10 20:09:05 +01:00
1 parent d68048fb04
commit 66f334f563
1 file changed
+50 -1
+50 -1
View File
@@ -1,5 +1,8 @@
import axios, { AxiosError } from "axios" import axios, { AxiosError } from "axios"
let refreshPromise: Promise<any> | null = null
let waitForPromise: boolean = false
export const useAuth = () => { export const useAuth = () => {
const refreshToken = useCookie<string | null>("refreshToken", { const refreshToken = useCookie<string | null>("refreshToken", {
sameSite: "lax", sameSite: "lax",
@@ -28,6 +31,7 @@ export const useAuth = () => {
) )
refreshToken.value = res.data.refreshToken refreshToken.value = res.data.refreshToken
await refreshSessionToken()
await navigateTo("/") await navigateTo("/")
} catch (e) { } catch (e) {
@@ -43,7 +47,52 @@ export const useAuth = () => {
const signout = () => {} 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 { return {
refreshToken, refreshToken,