Llamadas via LiveKit SFU (ya activo en organic-machine.com:7880-7882). Backend Go genera JWT con livekit-server-sdk-go. Frontend React usa livekit-client JS para join room, manejar tracks (mic/cam/screen), UI con tiles participantes, controles. Soporta 1:1 + grupales hasta 16 (limite config actual).
e2e/test_call_screen_share.sh — compartir pantalla, otro cliente ve el track.
e2e/test_call_4_participants.sh — 4 clientes simultaneos, no crash.
Funciones del registry a crear
livekit_token_gen_go_infra — JWT generator con livekit-server-sdk-go.
matrix_call_member_go_infra — wrapper para publicar/leer m.call.member state events.
useLiveKitCall_ts_ui — hook React.
CallPanel_ts_ui — componente UI completo de call.
CallTile_ts_ui — tile individual con video + nombre + speaker indicator.
Acceptance
Boton "Start call" en room DM con otro user.
Otro cliente (Element Web) ve ring + acepta -> 2 tiles con video+audio.
Mute mic + apagar cam funciona y se refleja en el otro lado.
Screen share: tile separado aparece para todos los participantes.
4 participantes simultaneos sin crash ni audio cortado.
Hangup limpia recursos (no tracks fantasma, no peer connections abiertas).
Notas
LiveKit room name: sha256(matrix_room_id + secret) truncado a 32 chars. Asi cualquier cliente que conozca el matrix_room_id puede computar el room name (no es secret).
Token TTL 30min, refresh proactivo a los 25min.
Codecs: H.264 + VP8 fallback para compatibilidad navegadores. Audio: Opus 32kbps.
E2EE en calls: LiveKit soporta E2EE simetrico (insertable streams API). TBD para version posterior — flow inicial usa SRTP only (cifrado SFU<->client, no e2e).
Sygnal push para incoming calls: enviar VoIP push con TTL bajo para wake-up moviles (relevante para issue 0158 Android).