Fix: Debounce token refresh to prevent PocketBase auto-cancellation on rapid calls
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user