veza/docs/archive/V0_303_RELEASE_SCOPE.md

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 :

  1. 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 appel
  • CallAnswer { conversation_id, caller_user_id, sdp } — accepter l'appel
  • ICECandidate { conversation_id, target_user_id, candidate } — échange ICE
  • CallHangup { conversation_id, target_user_id } — raccrocher
  • CallReject { conversation_id, caller_user_id } — refuser l'appel

OutgoingMessage (à ajouter) :

  • CallOffer { ... } — relayé au destinataire
  • CallAnswer { ... } — relayé à l'appelant
  • ICECandidate { ... } — relayé au pair
  • CallHangup { ... } — notifier la fin d'appel
  • CallRejected { 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 — types
  • veza-chat-server/src/websocket/handler.rs — handlers
  • veza-chat-server/src/websocket/broadcast.rs ou équivalent — send_to_user
  • veza-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.ts
  • apps/web/src/features/chat/components/CallButton.tsx
  • apps/web/src/features/chat/components/IncomingCallModal.tsx
  • apps/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