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