• Refreshes the access token using the refresh token

    Performs the complete token refresh operation by:

    1. Retrieving the current refresh token
    2. Exchanging it with Spotify for a new access token
    3. Storing the updated tokens
    4. Scheduling the next refresh based on the new expiry

    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.

    Returns Promise<boolean>

    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;
    }
    }