Refactor useAuth composable: implement refreshSessionToken logic with promise handling for improved session management
This commit is contained in:
1 parent
d68048fb04
commit
66f334f563
1 file changed
+50
-1
@@ -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,
|
||||||
|
|||||||
Reference in new issue
Block a user