feat(videochat): implement LiveKit integration for video chat functionality

- Add LiveKit client setup and token generation for room access.
- Implement room management functions including CreateRoom, OpenRoom, ListRooms, and DeleteRoom.
- Introduce participant management with ListParticipants and RemoveParticipant functions.
- Create tests for room and participant management, ensuring proper authentication and authorization.
- Add error handling for LiveKit API interactions.
- Define data structures for room metadata and token responses.
- Implement status endpoint for service availability check.
This commit is contained in:
fabio
2026-09-29 18:45:21 +02:00
parent a051eef991
commit 0fe1bc2292
21 changed files with 1904 additions and 12 deletions

61
videochat/README.md Normal file
View File

@@ -0,0 +1,61 @@
# Broadcast LiveKit (uno a molti)
Configurare i secret Encore `LiveKitURL`, `LiveKitAPIKey` e `LiveKitAPISecret` sul server.
Il frontend usa solo il token partecipante, mai la API secret.
## Accesso
- Solo gli amministratori possono creare stanze (`POST /videochat/rooms`).
- Il creatore è l'unico proprietario; anche un altro amministratore entra come spettatore.
- Tutti gli utenti autenticati possono elencare i broadcast e richiedere un token.
- Il proprietario pubblica audio, videocamera e schermo. Gli spettatori hanno
`canPublish=false`, `canPublishData=false`, `canSubscribe=true` nel JWT firmato.
- Nessun token frontend ha permessi amministrativi o modifica metadati.
- Elenco partecipanti, disconnessione partecipanti e chiusura richiedono il proprietario.
## API
| Metodo | Percorso | Accesso |
| --- | --- | --- |
| GET | `/videochat/status` | Pubblico |
| POST | `/videochat/rooms` | Admin (diventa proprietario) |
| GET | `/videochat/rooms` | Autenticato |
| POST | `/videochat/token` | Autenticato |
| DELETE | `/videochat/rooms/:roomName` | Proprietario |
| GET | `/videochat/rooms/:roomName/participants` | Proprietario |
| DELETE | `/videochat/rooms/:roomName/participants/:identity` | Proprietario |
La lista include i broadcast presenti su LiveKit (`active: true`) e le stanze
di `personal_setup` con `can_broadcast: true` non ancora presenti (`active: false`).
Il confronto usa il nome tecnico oppure proprietario e nome visualizzato.
Le stanze inattive riportano il nome configurato, il proprietario e `mode: "broadcast"`;
SID, partecipanti e data di creazione restano vuoti o zero. Non vengono create
su LiveKit e non possono ricevere un token finché non sono avviate.
Le richieste usano `Authorization: Bearer <session-token>` o il cookie `session`.
Creazione: `{"name":"Titolo della diretta","max_participants":0,"empty_timeout":300}`.
Zero nei campi numerici usa i valori predefiniti di LiveKit; il massimo comprende
anche il proprietario. Il timeout è in secondi.
La risposta stanza aggiunge `display_name`, `owner_id`, `mode: "broadcast"`.
`name` è un identificativo univoco generato dal server: usarlo nei percorsi API e
in `POST /videochat/token` con `{"room_name":"<name restituito>"}`.
La risposta token include `role: "owner" | "viewer"`, `owner_id`, `server_url`,
`participant_token`, `identity`, `room_name`, `expires_in`.
## Ciclo di vita
Le stanze sono effimere. Titolo e proprietario sono conservati nei metadati
LiveKit per la durata della stanza, anche se Encore viene riavviato. Quando
LiveKit elimina una stanza vuota, occorre crearne una nuova; non è un archivio
persistente delle trasmissioni. I nomi interni non vengono riutilizzati.
Le vecchie stanze senza metadati broadcast non compaiono nella lista e non
ricevono nuovi token tramite questa API; non vengono eliminate automaticamente.
I vecchi token meeting già emessi mantengono i permessi fino alla loro scadenza.
La disconnessione di uno spettatore non è un ban: può rientrare. La chiusura
elimina la stanza e disconnette tutti. Su LiveKit self-hosted i JWT già emessi
non sono revocabili da queste API: fino alla scadenza (10 minuti) possono ancora
consentire accesso o ricreazione della vecchia stanza interna. Tale stanza non
avrà metadati broadcast, non apparirà nella lista e non riceverà nuovi token.
Per un blocco irrevocabile servono controllo dell'ammissione/revoca aggiuntivi.