Promise resolving to true if refresh was successful, false otherwise
// Manually refresh token when needed
try {
const success = await refreshAccessToken();
if (success) {
console.log("Successfully refreshed access token");
performApiRequest();
} else {
console.error("Failed to refresh token");
showLoginPrompt();
}
} catch (error) {
handleError(error);
}
export async function refreshAccessToken(): Promise<boolean> {
try {
const refreshToken = getRefreshTokenState();
if (!refreshToken) {
saveLog("Cannot refresh token: No refresh token available", "WARNING");
return false;
}
saveLog("Refreshing access token", "DEBUG");
// Ensure the token refresh setTokens function is initialized
if (!setTokensFunction) {
saveLog(
"Token refresh system not initialized, initializing now",
"WARNING",
);
// Add a fallback to the main token refresh function if not initialized
initTokenRefresh((tokens) => {
try {
import("./token-operations")
.then(({ setTokens: setTokensOp }) => {
if (setTokensOp) {
setTokensOp(tokens);
} else {
saveLog(
"Failed to initialize fallback token refresh mechanism",
"ERROR",
);
}
})
.catch(() => {
saveLog(`Error initializing fallback token refresh`, "ERROR");
});
} catch {
saveLog(`Error initializing fallback token refresh`, "ERROR");
}
});
}
// Perform token refresh using the spotify-api module
const response = await spotifyApi.refreshAccessToken();
// Store new tokens (refreshed tokens don't include a new refresh token)
const tokens: AuthTokens = {
accessToken: response.access_token,
refreshToken: refreshToken, // Use existing refresh token
expiresIn: response.expires_in,
};
// Update stored tokens
if (setTokensFunction) {
setTokensFunction(tokens);
} else {
saveLog(
"Cannot save refreshed tokens: setTokens function not initialized",
"ERROR",
);
return false;
}
saveLog("Successfully refreshed access token", "DEBUG");
return true;
} catch (error) {
saveLog(`Failed to refresh access token: ${error}`, "ERROR");
return false;
}
}
Refreshes the access token using the refresh token
Performs the complete token refresh operation by:
This function handles error conditions gracefully and includes fallback initialization if called before the token system is fully initialized, making it robust against various calling patterns.