Fix: Debounce token refresh to prevent PocketBase auto-cancellation on rapid calls

This commit is contained in:
2026-01-18 04:03:35 +00:00
parent 9e28d86610
commit 00b944c388
+32 -6
View File
@@ -276,16 +276,42 @@
);
};
// Queue to prevent concurrent refresh calls (PocketBase auto-cancels duplicates)
let refreshPromise = null;
let lastRefreshTime = 0;
const REFRESH_COOLDOWN = 2000; // 2 second cooldown between refreshes
const refreshGraphToken = async () => {
try {
const authData = await pb.collection('users').authRefresh();
const meta = authData?.meta || pb?.authStore?.model?.meta || {};
const token = extractGraphToken(meta);
if (token) localStorage.setItem(GRAPH_TOKEN_KEY, token);
return token || '';
// If already refreshing, return that promise
if (refreshPromise) {
return await refreshPromise;
}
// If refreshed recently, return cached token
if (Date.now() - lastRefreshTime < REFRESH_COOLDOWN) {
return getGraphToken();
}
// Start new refresh
refreshPromise = (async () => {
try {
const authData = await pb.collection('users').authRefresh();
const meta = authData?.meta || pb?.authStore?.model?.meta || {};
const token = extractGraphToken(meta);
if (token) localStorage.setItem(GRAPH_TOKEN_KEY, token);
lastRefreshTime = Date.now();
return token || '';
} finally {
refreshPromise = null;
}
})();
return await refreshPromise;
} catch(err){
refreshPromise = null;
console.warn('Graph token refresh failed:', err?.message||err);
return '';
return getGraphToken(); // Return cached token if refresh fails
}
}