FEAT: Streaming WebRTC P2P — SIPSorcery + StreamingHub + coturn + liveView.js #3

Closed
opened 2026-08-10 21:02:17 +02:00 by nonobis · 0 comments
Owner

🎯 Contexte

Aucun streaming vidéo : il n'y a pas de StreamingHub (remplacé par un ConfigHub), pas de SIPSorcery, pas de coturn dans le compose, pas de liveView.js ni de page Live. La spec fait du streaming WebRTC une fonctionnalité centrale (Partie 6).

📚 Référence spec (MASTER_SPECIFICATION.md v2.0)

D3 : TURN/Coturn obligatoire (pas optionnel) — CGNAT, pare-feu, Starlink
D6 : P2P uniquement en v1 (1 viewer/caméra max), SFU (MediaMTX) repoussé à v2
Phase 14 — StreamingHub : RequestStream(cameraId) avec vérification site-scope (permission Camera.Live), groupes camera-{id} / viewer-{id}, relay SDP/ICE
Phase 15 : WebRTC P2P (SIPSorcery 10.0.12+, pas de decode→re-encode, H264 passthrough), coturn HMAC auth secret, credential lifetime 24h, latence < 500ms LAN
6.3 : module JS autonome wwwroot/js/liveView.js — survit aux reconnexions Blazor, RTCPeerConnection côté browser
Tableau 5.1 : StreamingHub route /hubs/streaming, auth JWT + API Key (+ Camera.Live)

🔍 État actuel (vérifié dans le code)

Hubs actuels : ConfigHub, EventsHub, MonitoringHub, NotificationsHub, AdminHub. wwwroot/js/ contient seulement auth.js. docker-compose.prod.yml : aucun service coturn. Aucune page /cameras/{id}/live.

🧩 À faire

  • Ajouter SIPSorcery + SIPSorceryMedia.FFmpeg à l'agent
  • Créer StreamingHub (/hubs/streaming) : RequestStream avec vérification site-scope, RegisterSource, relay SDP/ICE, groupes viewer-/camera-
  • Côté agent : PeerConnection par caméra, envoi du flux H264 passthrough, refus 2e viewer
  • Service coturn dans docker-compose (prod + local) avec --use-auth-secret
  • Générer les iceServers TURN (HMAC, 24h) et les retourner au register/live
  • Créer wwwroot/js/liveView.js (module autonome, automatic reconnect)
  • Créer la page Live /cameras/{id}/live (élément <video> natif, qualité, snapshot, timeline 30 min)
  • Tests hubs SignalR + scénario streaming

🧪 Critères d'acceptation

  • Flux vidéo navigateur < 500ms LAN
  • 2e viewer refusé avec message « Flux déjà visualisé »
  • Viewer déconnecté → agent libère la ressource
  • Coturn fonctionne derrière NAT (relay TURN)

📁 Fichiers concernés

src/Heimdall.Web/Hubs/StreamingHub.cs (nouveau), src/Heimdall.Web/wwwroot/js/liveView.js (nouveau), src/Heimdall.Agent/Services/WebRtcStreamingService.cs (nouveau), docker/docker-compose*.yml, src/Heimdall.Web/Components/Pages/CameraLive.razor (nouveau)

## 🎯 Contexte Aucun streaming vidéo : il n'y a **pas de StreamingHub** (remplacé par un ConfigHub), pas de SIPSorcery, pas de coturn dans le compose, pas de `liveView.js` ni de page Live. La spec fait du streaming WebRTC une fonctionnalité centrale (Partie 6). ## 📚 Référence spec (MASTER_SPECIFICATION.md v2.0) **D3** : TURN/Coturn **obligatoire** (pas optionnel) — CGNAT, pare-feu, Starlink **D6** : P2P uniquement en v1 (1 viewer/caméra max), SFU (MediaMTX) repoussé à v2 **Phase 14 — StreamingHub** : `RequestStream(cameraId)` avec vérification site-scope (permission `Camera.Live`), groupes `camera-{id}` / `viewer-{id}`, relay SDP/ICE **Phase 15** : WebRTC P2P (SIPSorcery 10.0.12+, pas de decode→re-encode, H264 passthrough), coturn HMAC auth secret, credential lifetime 24h, latence < 500ms LAN **6.3** : module JS autonome `wwwroot/js/liveView.js` — survit aux reconnexions Blazor, `RTCPeerConnection` côté browser **Tableau 5.1** : StreamingHub route `/hubs/streaming`, auth JWT + API Key (+ Camera.Live) ## 🔍 État actuel (vérifié dans le code) Hubs actuels : ConfigHub, EventsHub, MonitoringHub, NotificationsHub, AdminHub. `wwwroot/js/` contient seulement `auth.js`. docker-compose.prod.yml : aucun service coturn. Aucune page `/cameras/{id}/live`. ## 🧩 À faire - [ ] Ajouter SIPSorcery + SIPSorceryMedia.FFmpeg à l'agent - [ ] Créer `StreamingHub` (`/hubs/streaming`) : RequestStream avec vérification site-scope, RegisterSource, relay SDP/ICE, groupes viewer-/camera- - [ ] Côté agent : PeerConnection par caméra, envoi du flux H264 passthrough, refus 2e viewer - [ ] Service coturn dans docker-compose (prod + local) avec `--use-auth-secret` - [ ] Générer les iceServers TURN (HMAC, 24h) et les retourner au register/live - [ ] Créer `wwwroot/js/liveView.js` (module autonome, automatic reconnect) - [ ] Créer la page Live `/cameras/{id}/live` (élément `<video>` natif, qualité, snapshot, timeline 30 min) - [ ] Tests hubs SignalR + scénario streaming ## 🧪 Critères d'acceptation - [ ] Flux vidéo navigateur < 500ms LAN - [ ] 2e viewer refusé avec message « Flux déjà visualisé » - [ ] Viewer déconnecté → agent libère la ressource - [ ] Coturn fonctionne derrière NAT (relay TURN) ## 📁 Fichiers concernés src/Heimdall.Web/Hubs/StreamingHub.cs (nouveau), src/Heimdall.Web/wwwroot/js/liveView.js (nouveau), src/Heimdall.Agent/Services/WebRtcStreamingService.cs (nouveau), docker/docker-compose*.yml, src/Heimdall.Web/Components/Pages/CameraLive.razor (nouveau)
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
nonobis/Heimdall#3
No description provided.