feat: enhance refreshAuthToken to prevent duplicate requests
This commit is contained in:
@@ -40,15 +40,36 @@ function getAuthUser(user: AuthUserFragment): User {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Track in-flight refreshAuthToken calls to prevent duplicate requests
|
||||||
|
const refreshTokenPromises = new Map<string, Promise<string | undefined>>();
|
||||||
|
|
||||||
// Refresh auth token by calling remote GraphQL endpoint directly
|
// Refresh auth token by calling remote GraphQL endpoint directly
|
||||||
export async function refreshAuthToken(refreshToken: string): Promise<string | undefined> {
|
export async function refreshAuthToken(refreshToken: string): Promise<string | undefined> {
|
||||||
const { public: { wpUrl } } = useRuntimeConfig();
|
// Return existing in-flight promise if available
|
||||||
const endpoint = `${wpUrl}/graphql`;
|
const inFlight = refreshTokenPromises.get(refreshToken);
|
||||||
const { data } = await executeGraphQLHTTP<ResultOf<"AuthRefreshToken">>({
|
if (inFlight) {
|
||||||
query: AuthRefreshTokenDocument,
|
return inFlight;
|
||||||
variables: { refreshToken },
|
}
|
||||||
}, { endpoint });
|
|
||||||
return data?.refreshToken?.authToken || undefined;
|
const refreshPromise = (async () => {
|
||||||
|
console.log(`Refreshing auth token: ${refreshToken}`);
|
||||||
|
const { public: { wpUrl } } = useRuntimeConfig();
|
||||||
|
const endpoint = `${wpUrl}/graphql`;
|
||||||
|
const { data } = await executeGraphQLHTTP<ResultOf<"AuthRefreshToken">>({
|
||||||
|
query: AuthRefreshTokenDocument,
|
||||||
|
variables: { refreshToken },
|
||||||
|
}, { endpoint });
|
||||||
|
return data?.refreshToken?.authToken || undefined;
|
||||||
|
})();
|
||||||
|
|
||||||
|
refreshTokenPromises.set(refreshToken, refreshPromise);
|
||||||
|
|
||||||
|
return refreshPromise.finally(() => {
|
||||||
|
const current = refreshTokenPromises.get(refreshToken);
|
||||||
|
if (current === refreshPromise) {
|
||||||
|
refreshTokenPromises.delete(refreshToken);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get auth token from user session (refresh if needed)
|
// Get auth token from user session (refresh if needed)
|
||||||
|
|||||||
Reference in New Issue
Block a user