Skip to content

Diagram: Token Refresh & Session Management

Canonical doc: ../token-refresh.md

This document contains simplified diagrams for the token refresh and session management flows.


1. Overview: Token Refresh Flow (on 401 Error)

This is the main flow, triggered when an API call returns a 401 Unauthorized error because the access token has expired.

flowchart TD
    REQ[API Request with Bearer Token] --> SERVER[Server Response]

    SERVER --> OK{Status Code?}

    OK -->|2xx| SUCCESS[Return Data]
    OK -->|401| PARSE[Parse Error Code]
    OK -->|Other| ERR[Return Error]

    PARSE --> CODE{Error Code?}

    CODE -->|ErrAccessTokenExpired| REFRESH[Call TokenRefreshManager]
    CODE -->|ErrRefreshTokenExpired or ErrDeviceNotRegistered| LOGOUT[Force Logout]

    REFRESH --> RESULT{Refresh Result?}

    RESULT -->|Success| RETRY["Retry Original Request (once)"]
    RESULT -->|Failure| LOGOUT

    RETRY --> SUCCESS

2. Proactive Refresh Flow (on App Foreground)

To improve user experience, the app automatically refreshes the token when it returns to the foreground.

flowchart TD
    subgraph App Lifecycle
        FG[App Enters Foreground]
    end

    FG --> CHECK{Is User Logged In?}

    CHECK -->|No| SKIP[Do Nothing]
    CHECK -->|Yes| TRIGGER[Trigger Proactive Refresh]

    TRIGGER --> TRM[TokenRefreshManager.refreshAccessToken]

    TRM --> RESULT{Result?}

    RESULT -->|Success| CONTINUE[Session Validated]
    RESULT -->|Failure| LOGOUT[Force Logout]

3. Thread-Safe Refresh Queue

TokenRefreshManager ensures only one refresh request is active at a time, even if multiple API calls fail simultaneously.

sequenceDiagram
    autonumber
    participant A as Request A
    participant B as Request B
    participant TRM as TokenRefreshManager
    participant API as Refresh Token API

    Note over A, B: Multiple requests hit 401 at once

    A->>TRM: refreshAccessToken()
    TRM->>TRM: Start refreshing...

    B->>TRM: refreshAccessToken()
    TRM->>TRM: Add to wait queue

    TRM->>API: POST /app/api/refresh-token
    API-->>TRM: New Tokens

    TRM->>TRM: Finish refreshing

    par Notify all waiting requests
        TRM-->>A: Success
        TRM-->>B: Success
    end

    Note over A, B: Both requests will now retry