RobustToolbox Connection Sequence

This is a complete sequence of what steps get taken when a client connects in RobustToolbox (and to some extent, Space Station 14). This is an incredibly involved and messy system that evolved over multiple years, and has many moving parts and sets of state. Oof.

Basic overview

sequenceDiagram
    participant C as Client
    participant S as Server
    
    C->>S: Lidgren Connection Attempt
    S->>C: Lidgren Connection Approval
    
    rect
        Note over C,S: Initial handshake
        
        C->>S: MsgLoginStart
        Note left of S: Server decides to auth or not
        opt Authentication
            S->>C: MsgEncryptionRequest
            create participant A as Auth Server
            C->>A: POST /api/session/join
            C->>S: MsgEncryptionResponse
            %% I'd use <<->> but my Trilium doesn't have Mermaid v11.0.0 yet.
            destroy A
            S->A: GET /api/session/hasJoined
        end
        Note over S: Connecting event is raised,<br/>content can deny connection if desired
        S->>C: MsgLoginSuccess
        Note over C,S: Both sides enable encryption if necessary
        Note over C,S: Both sides create NetChannel
    end
    S->>C: MsgStringTableEntries
    rect
        Note over C,S: Serializer handshake
        S->>C: MsgMapStrServerHandshake
        C->>S: MsgMapStrClientHandshake
        opt Client needs strings
            S->>C: MsgMapStrStrings
            C->>S: MsgMapStrClientHandshake
        end
    end
    Note over S,C: NetManager.Connected event<br/>Non-handshake messages are now allowed
    C-->>S: MsgConVars
    C-->>S: MsgConCmdReg
    par PlayerManager.NewSession
        Note over S: Server-side player session gets created,<br/>PlayerStatusChanged gets ran for first time
        S->>C: MsgSyncTimeBase
        Note over S: NetConfigurationManager.SyncConnectingClient
        S->>C: MsgConVars
        Note over C: Client-side player session gets created
        C->>S: MsgPlayerListReq
    and UploadedContentManager
        loop Send uploaded resources
            S->>C: NetworkResourceUploadMessage
        end
        loop Send uploaded prototypes
            S->>C: GamePrototypeLoadMessage
        end
    end
    Note over S: Player session is set to Connected
    S->>C: MsgPlayerList<br/>Contains Connected Status
    Note over C: Player session is set to Connected
    Note over S: Content sets client session to InGame
    S->>C: Starts sending game states
    Note over C: Player session is set to InGame

Subpages