feat: enhance refreshAuthToken to prevent duplicate requests

This commit is contained in:
2026-01-28 21:37:20 -05:00
parent 2d93d44a93
commit 5e39b53a44

View File

@@ -40,15 +40,35 @@ 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 inFlight = refreshTokenPromises.get(refreshToken);
if (inFlight) {
return inFlight;
}
const refreshPromise = (async () => {
const { wpUrl } = useRuntimeConfig();
const endpoint = `${wpUrl}/graphql`; const endpoint = `${wpUrl}/graphql`;
const { data } = await executeGraphQLHTTP<ResultOf<"AuthRefreshToken">>({ const { data } = await executeGraphQLHTTP<ResultOf<"AuthRefreshToken">>({
query: AuthRefreshTokenDocument, query: AuthRefreshTokenDocument,
variables: { refreshToken }, variables: { refreshToken },
}, { endpoint }); }, { endpoint });
return data?.refreshToken?.authToken || undefined; 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)