veza/docs/archive/V0_303_RELEASE_SCOPE.md

196 lines
8.6 KiB
Markdown

# 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](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](veza-chat-server/src/websocket/handler.rs) pour chaque type ; vérifier que la conversation est un DM (2 participants) ; `RateLimitAction::CallSignaling` dans [rate_limiter.rs](veza-chat-server/src/security/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
- [V0_302_RELEASE_SCOPE.md](V0_302_RELEASE_SCOPE.md) — Version précédente
- [SCOPE_CONTROL.md](SCOPE_CONTROL.md) — Processus anti-scope-creep
- [FEATURE_STATUS.md](FEATURE_STATUS.md) — Statut des features
- [PROJECT_STATE.md](PROJECT_STATE.md) — État actuel du projet
- [veza-chat-server/src/websocket/mod.rs](../veza-chat-server/src/websocket/mod.rs) — Types IncomingMessage, OutgoingMessage
- [STORYBOOK_CONTRACT.md](../apps/web/docs/STORYBOOK_CONTRACT.md) — Contrat Storybook