8.6 KiB
Scope v0.303 — Phase 3 Social (suite)
Version cible : v0.303 (X=3, Y=3)
Prérequis : v0.302 taguée et mergée dans main
Objectif : Chat appels WebRTC 1-to-1 (Lot C2 reporté depuis v0.302)
Dernière mise à jour : février 2026
Effort estimé : 1-2 semaines de développement
1. Principe directeur
v0.303 = Lot C2 (Chat appels WebRTC).
Un axe principal :
- Chat appels (Lot C2) : Appels audio/vidéo 1-to-1 via WebRTC, signalisation via WebSocket
Objectif : appel audio 1-to-1 fonctionnel entre deux utilisateurs dans une conversation DM.
2. Contexte — État post v0.302
2.1 Livré en v0.302
| Lot | Feature | Statut |
|---|---|---|
| S2 | Groupes avancés (request join, invite, rôles, feed groupes, mes groupes) | ✅ |
| N1 | Notifications push Web (subscription, envoi, préférences, badge) | ✅ |
| P2 | Présence enrichie (rich presence, mode invisible) | ✅ |
2.2 Fondation existante (à enrichir)
| Domaine | Existant | À ajouter v0.303 |
|---|---|---|
| Chat | WebSocket (veza-chat-server), DM, rooms, typing, read receipts, delivered | Signalisation WebRTC (CallOffer, CallAnswer, ICECandidate, CallHangup) |
| Frontend Chat | ChatPage, ConversationView, messages, typing indicators | CallButton, IncomingCallModal, ActiveCallBar, useWebRTC |
2.3 Composants techniques
| Composant | État | Action v0.303 |
|---|---|---|
| veza-backend-api | ✅ | Aucune modification (signalisation via Chat Server) |
| veza-chat-server | ✅ | Ajouter types et handlers CallOffer, CallAnswer, ICECandidate, CallHangup |
| apps/web | ✅ | useWebRTC, CallButton, IncomingCallModal, ActiveCallBar |
| Stream Server | ⚠️ | Hors scope (pas nécessaire pour appels) |
2.4 Types WebSocket existants
Les types IncomingMessage et OutgoingMessage sont définis dans veza-chat-server/src/websocket/mod.rs. Ils incluent déjà SendMessage, Typing, MarkAsRead, Delivered, etc. Il faut y ajouter les variants pour la signalisation WebRTC.
3. Features IN SCOPE v0.303
3.1 Lot C2 — Chat appels (WebRTC)
Objectif : Appels audio/vidéo 1-to-1 via WebRTC.
Effort : L (5-7 jours)
Référence : Module 5, Video chat intégré (full_features 487)
| # | Feature | Tâche détaillée | Chat Server | Frontend | Critère de sortie |
|---|---|---|---|---|---|
| C2.1 | Signalisation | SDP/ICE via WebSocket | Messages CallOffer, CallAnswer, ICECandidate, CallHangup, CallReject | Échange WebRTC via WS | Connexion peer-to-peer établie |
| C2.2 | UI appel | Bouton appeler, modal appel entrant/sortant | — | CallButton, IncomingCallModal, ActiveCallBar | Appel initié, accepté, refusé |
| C2.3 | Audio uniquement (MVP) | Appel audio 1-to-1 | — | getUserMedia audio, RTCPeerConnection | Appel audio fonctionnel |
| C2.4 | Vidéo (optionnel) | Activer caméra | — | getUserMedia video | Appel vidéo si temps |
C2.1 Détail technique — Chat Server
IncomingMessage (à ajouter dans websocket/mod.rs) :
CallOffer { conversation_id, target_user_id, sdp, call_type }— initier un appelCallAnswer { conversation_id, caller_user_id, sdp }— accepter l'appelICECandidate { conversation_id, target_user_id, candidate }— échange ICECallHangup { conversation_id, target_user_id }— raccrocherCallReject { conversation_id, caller_user_id }— refuser l'appel
OutgoingMessage (à ajouter) :
CallOffer { ... }— relayé au destinataireCallAnswer { ... }— relayé à l'appelantICECandidate { ... }— relayé au pairCallHangup { ... }— notifier la fin d'appelCallRejected { conversation_id, user_id }— notifier le refus
WebSocketManager : ajouter send_to_user(user_id, message, exclude_client_id) pour livraison 1-to-1 (les messages d'appel ne doivent pas être broadcast à toute la room).
Handler : match arms dans handler.rs pour chaque type ; vérifier que la conversation est un DM (2 participants) ; RateLimitAction::CallSignaling dans rate_limiter.rs.
Fichiers clés :
veza-chat-server/src/websocket/mod.rs— typesveza-chat-server/src/websocket/handler.rs— handlersveza-chat-server/src/websocket/broadcast.rsou équivalent — send_to_userveza-chat-server/src/security/rate_limiter.rs— CallSignaling
C2.2-C2.4 Détail technique — Frontend
useWebRTC (apps/web/src/features/chat/hooks/useWebRTC.ts) :
- Gestion RTCPeerConnection (création, setRemoteDescription, addIceCandidate)
- Échange SDP/ICE via WebSocket (envoi CallOffer, réception CallAnswer, échange ICECandidate)
- getUserMedia pour audio (et optionnellement vidéo)
- États : idle, calling, ringing, connected, ended, error
CallButton (apps/web/src/features/chat/components/CallButton.tsx) :
- Bouton à côté du header de conversation (DM uniquement)
- Clic → envoi CallOffer via WebSocket
IncomingCallModal (apps/web/src/features/chat/components/IncomingCallModal.tsx) :
- Modal affichée quand CallOffer reçu
- Boutons Accepter / Refuser
- Accepter → création RTCPeerConnection, CallAnswer, échange ICE
ActiveCallBar (apps/web/src/features/chat/components/ActiveCallBar.tsx) :
- Barre pendant l'appel (mute, hangup)
- Mute → mute local stream
- Hangup → envoi CallHangup, fermeture RTCPeerConnection
chatStore (Zustand) : états incomingCall, activeCall, callState pour orchestrer l'UI.
Fichiers clés :
apps/web/src/features/chat/hooks/useWebRTC.tsapps/web/src/features/chat/components/CallButton.tsxapps/web/src/features/chat/components/IncomingCallModal.tsxapps/web/src/features/chat/components/ActiveCallBar.tsx- Store chat (Zustand ou existant)
Flow : Clic CallButton → envoi CallOffer → callee reçoit → IncomingCallModal → accept → CallAnswer → ICE exchange → ActiveCallBar. Refus → CallReject → CallRejected.
4. Récapitulatif par lot
| Lot | Priorité | Effort | Dépendances |
|---|---|---|---|
| C2 | Haute | L (5-7 j) | Chat Server stable, conversation DM |
Ordre recommandé : C2.1 (signalisation) → C2.2-C2.4 (UI + audio + vidéo optionnel).
5. Features HORS SCOPE v0.303
| Feature | Raison | Version cible |
|---|---|---|
| Appels de groupe (3+ participants) | Complexité WebRTC (SFU/MCU) | v0.304+ |
| Chiffrement E2E messages | Effort majeur | v0.304+ |
| FCM / APNs (mobile) | Infra externe, apps natives | v0.304+ |
| Forum de discussion par groupe | Scope S2 suffit, priorité moindre | v0.304 |
| Événements de groupe | Priorité moindre | v0.304 |
6. Migrations et schémas
Aucune migration backend prévue pour v0.303. La signalisation WebRTC transite uniquement via le WebSocket du Chat Server. Aucune table supplémentaire requise.
7. Critères de livraison v0.303
- Lot C2.1 : Signalisation CallOffer, CallAnswer, ICECandidate, CallHangup, CallReject dans Chat Server
- Lot C2.2 : CallButton, IncomingCallModal, ActiveCallBar
- Lot C2.3 : Appel audio 1-to-1 fonctionnel (getUserMedia, RTCPeerConnection)
- Lot C2.4 : Appel vidéo (optionnel, si temps)
- Tests :
cargo build --release(Chat Server),npm run build(Frontend) - Documentation : FEATURE_STATUS, PROJECT_STATE, CHANGELOG mis à jour
8. Checklist pré-merge
- Lot C2 terminé ou reporté (avec ticket)
- Pas de régression sur v0.302
- SCOPE_CONTROL.md référence V0_303_RELEASE_SCOPE.md
- FEATURE_STATUS.md mis à jour
- CHANGELOG v0.303
- Stories Storybook pour CallButton, IncomingCallModal, ActiveCallBar (Loading, Error, Empty selon STORYBOOK_CONTRACT)
9. Transition vers v0.304
À l'issue de v0.303 :
- Chat appels 1-to-1 opérationnel
- Prochaine version : v0.304 — à définir (appels groupe, E2E, FCM, forum groupes, etc.)
- Document de scope :
V0_304_RELEASE_SCOPE.md(à créer après tag v0.303)
Références
- V0_302_RELEASE_SCOPE.md — Version précédente
- SCOPE_CONTROL.md — Processus anti-scope-creep
- FEATURE_STATUS.md — Statut des features
- PROJECT_STATE.md — État actuel du projet
- veza-chat-server/src/websocket/mod.rs — Types IncomingMessage, OutgoingMessage
- STORYBOOK_CONTRACT.md — Contrat Storybook