196 lines
8.6 KiB
Markdown
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
|