@startuml Authentication loop [*] --> Unauthenticated : Application start Unauthenticated : Reset state, nothing is cached Unauthenticated --> AuthBegin : Start() is called state Disconnected { AuthBegin : Start aquiring WS URL AuthBegin --> Websocket_Neutral : Got WS URL Websocket_Neutral : Websocket is waiting for connection Resume_Fail : Clear all cached session data Resume_Fail : Disconnect websocket Resume_Fail --> AuthBegin Reconnect : Disconnect websocket Reconnect --> AuthBegin } Websocket_Connected --> Reconnect : Reconnect event recieved Websocket_Connected --> Reconnect : Websocket closes with a reconnectable close code (or no close code at all) Websocket_Connected --> Reconnect : Invalid session with d set to true Websocket_Connected --> Reconnect : Heartbeat timeout state Websocket_Connected { Websocket_Resume --> Resume_Fail : Invalid session recieved Websocket_Neutral --> Websocket_Ready : Hello packet recieved Websocket_Ready : Start heartbeating Websocket_Ready : Decide to either start new session or resume a previous one Websocket_Ready --> Websocket_Identify : No session to resume Websocket_Identify : Start new session Websocket_Ready --> Websocket_Resume : Previous session is available Websocket_Resume : Try resuming old session Websocket_Resume : This should be transparent, as this is fairly common Websocket_Identify --> Websocket_Running : Ready event recieved Websocket_Resume --> Websocket_Running : Resumed event recieved Websocket_Running : Save session details for resume Websocket_Running : Recieve events and forward them } Websocket_Identify -> Websocket_Disabled : Invalid session recieved Websocket_Connected -> Websocket_Disabled : Rate limit Websocket_Disabled : Wrong credentials or something is really broken @enduml