Skip to content

Diagram: Group Call Flow (Audio/Video)

Canonical doc: ../group-call.md

sequenceDiagram
    autonumber
    participant Host as Host (Device)
    participant App as iOS App
    participant API as Backend API
    participant STOMP as STOMP
    participant P1 as Participant 1
    participant P2 as Participant 2

    Host->>App: Start group call
    App->>API: Fetch public keys via KT (P1, P2)
    API-->>App: Raw KT Response (Public Keys + Merkle Proofs)

    Note over App: Verify KT proofs + local trust cache
    Note over App: Warn if trusted key set changed

    Note over App: Prepare initial session key<br/>Encrypt per participant (P-256 preferred / RSA fallback)

    App->>API: POST /app/api/call/start-v2
    API-->>App: CallRecord(callId, livekitToken, ...)

    API->>P1: VoIP push signal: call_created
    API->>P2: VoIP push signal: call_created
    API->>STOMP: call_created fallback/sync signal

    P1->>P1: Decrypt session key
    P2->>P2: Decrypt session key

    P1->>P1: Answer CallKit and connect to LiveKit
    P2->>P2: Answer CallKit and connect to LiveKit
    P1->>API: GET /app/api/call/{callId}/participants
    P2->>API: GET /app/api/call/{callId}/participants

    Note over Host,P2: Encrypted media starts (AES-256-GCM)