Skip to content

Diagram: Join & Rejoin

Canonical doc: ../join-rejoin.md

sequenceDiagram
    autonumber
    participant U as User (Device)
    participant App as iOS App
    participant API as Backend API
    participant STOMP as STOMP
    participant P as Active Participant

    Note over U: User wants to join/rejoin an active call
    U->>API: POST /app/api/call/{callId}/request-rejoin
    API-->>U: Request accepted

    API->>STOMP: participant_rejoining_requested
    STOMP->>P: participant_rejoining_requested

    Note over P: Encrypt current AES key for requester (P-256 preferred / RSA fallback)
    P->>STOMP: participant_rejoining_accepted (encryptedAESKey)
    STOMP->>U: participant_rejoining_accepted (encryptedAESKey)

    Note over U: Decrypt AES key and rejoin
    U->>API: POST /app/api/call/{callId}/rejoin/{participantId}
    API-->>U: Rejoin OK

    Note over U,P: Encrypted media resumes (AES-256-GCM)

LiveKit Reconnect Validation

sequenceDiagram
    autonumber
    participant LK as Media Session
    participant ENG as Call Coordinator
    participant API as Backend API
    participant Media as LiveKit Media

    LK->>ENG: Reconnect completed
    ENG->>API: GET /app/api/call/{callId}/participants

    alt Local participant is still joined
        ENG->>ENG: Sync participant state
    else Local participant not joined / missing
        ENG->>Media: disconnect()
        ENG->>Media: Reactivate audio engine
        ENG->>Media: Reconnect with stored room token and current E2EE key
        ENG->>API: GET /app/api/call/{callId}/participants
    end