# V0.503 Release Scope — Stream Server E2E + Chat Hardening + Cleanup **Status** : En préparation **Phase** : 5 — Streaming & Communication **Prérequis** : v0.502 (taguée) **Estimation** : ~5 sprints (25 jours ouvrés) --- ## Objectif Rendre le streaming HLS fonctionnel de bout en bout (upload → transcode → HLS → player), durcir le chat Go (rate limiter Redis, présence persistante, full-text search), et nettoyer les vestiges du chat server Rust supprimé en v0.502. --- ## État actuel (pré-v0.503) | Composant | État | Détail | |-----------|------|--------| | **Stream Server Rust** | ✅ Compile, ✅ Docker | HLS endpoints existent mais pipeline E2E non connecté | | **Go Backend HLS** | ⚠️ Partiel | Appelle `/internal/jobs/transcode` mais pas les endpoints HLS | | **Frontend HLS** | ⚠️ Partiel | `useHLSPlayer` hook existe mais non branché, player utilise URL directe | | **hls.js** | ✅ Installé | `^1.6.14` dans package.json | | **Chat Go** | ✅ Opérationnel | Rate limiter in-memory, présence éphémère, recherche ILIKE basique | | **Chat Rust (veza-chat-server)** | ❌ Obsolète | Retiré de docker-compose mais dossier et refs CI/CD encore présents | --- ## Lots ### Lot SS1 — Stream Server HLS Integration (E2E) **Objectif** : Un track uploadé est jouable en HLS adaptatif dans le player. | # | Tâche | Fichiers impactés | Effort | |---|-------|--------------------|--------| | SS1-01 | Ajouter endpoints Go proxy HLS (`GET /api/v1/tracks/:id/hls/master.m3u8`, `/hls/status`) | `internal/handlers/stream_handler.go` | M | | SS1-02 | Étendre `stream_service.go` : appeler transcoding HLS (pas juste compress), vérifier statut HLS via stream server | `internal/services/stream_service.go` | M | | SS1-03 | Ajouter config Go `HLSEnabled` (flag activable), `StreamServerHLSURL` | `internal/config/config.go` | S | | SS1-04 | Mettre à jour le callback `/api/v1/internal/tracks/:id/stream-ready` pour inclure info HLS | `internal/handlers/stream_handler.go` | S | | SS1-05 | Frontend : intégrer `useHLSPlayer` dans le player principal | `apps/web/src/features/player/` | M | | SS1-06 | Frontend : ABR quality selector (utiliser données `useHLSPlayer`) | `apps/web/src/features/player/components/` | M | | SS1-07 | Mettre à jour Caddy staging/prod pour proxyer `/hls/*` → stream-server | `config/caddy/Caddyfile.staging`, docker-compose files | S | | SS1-08 | Story Storybook player HLS (Loading, Error, Quality switch) | `apps/web/src/features/player/` | S | | SS1-09 | MSW handler pour HLS endpoints | `apps/web/src/mocks/handlers-streaming.ts` | S | | SS1-10 | Test E2E : upload → transcode → HLS playback | `veza-backend-api/internal/integration/` | L | ### Lot CH1 — Chat Server Hardening **Objectif** : Améliorer la robustesse et les performances du chat Go. | # | Tâche | Fichiers impactés | Effort | |---|-------|--------------------|--------| | CH1-01 | Migrer rate limiter vers Redis (sliding window, clé `chat:ratelimit:{user}:{action}`) | `internal/websocket/chat/rate_limiter.go` | M | | CH1-02 | Présence tracking avec persistence Redis (HASH `chat:presence:{user}`, TTL heartbeat) | `internal/websocket/chat/hub.go`, nouveau `presence_service.go` | M | | CH1-03 | Migration SQL : ajouter `tsvector` + index GIN sur `messages.content` | Nouvelle migration `113_messages_fts.sql` | S | | CH1-04 | Remplacer ILIKE par `ts_query` dans `SearchMessages` | `internal/websocket/chat/handler_history.go`, `chat_message_repository.go` | M | | CH1-05 | Ajouter `GET /api/v1/users/:id/presence` REST endpoint (en plus du WS) | `internal/handlers/presence_handler.go` | S | | CH1-06 | Tests unitaires rate limiter Redis (mock Redis) | `internal/websocket/chat/rate_limiter_test.go` | S | | CH1-07 | Tests unitaires presence service | `internal/websocket/chat/presence_service_test.go` | S | | CH1-08 | Benchmark : 100+ connexions WebSocket simultanées (Go bench) | `internal/websocket/chat/benchmark_test.go` | M | ### Lot CL1 — Cleanup & Archivage Chat Rust **Objectif** : Supprimer toute trace opérationnelle du chat server Rust. | # | Tâche | Fichiers impactés | Effort | |---|-------|--------------------|--------| | CL1-01 | Archiver `veza-chat-server/` → `archive/veza-chat-server/` (ou supprimer) | Dossier `veza-chat-server/` | S | | CL1-02 | Supprimer chat-server de CI workflow `ci.yml` (build, audit, lint, test) | `.github/workflows/ci.yml` (lignes ~84-101) | S | | CL1-03 | Supprimer chat-server de CD workflow `cd.yml` (build, scan, SBOM, sign, deploy) | `.github/workflows/cd.yml` (lignes 41, 60-66, 79, 92, 110, 120, 137) | S | | CL1-04 | Supprimer scrape `chat-server:8081` de Prometheus config | `config/prometheus.yml` (lignes 18-21) | S | | CL1-05 | Supprimer proxy `/ws → chat-server:8081` de Caddyfile staging | `config/caddy/Caddyfile.staging` (ligne 3) | S | | CL1-06 | Retirer `veza-chat-server` des npm workspaces si référencé | `package.json` (root) | S | | CL1-07 | Nettoyer `go.work` si le chat-server y est référencé | `go.work` | S | | CL1-08 | Vérifier et nettoyer les références Turborepo (`turbo.json`) | `turbo.json` | S | ### Lot QA1 — Tests & Documentation finale **Objectif** : Valider l'ensemble, mettre à jour la documentation. | # | Tâche | Fichiers impactés | Effort | |---|-------|--------------------|--------| | QA1-01 | Mettre à jour `FEATURE_STATUS.md` : HLS opérationnel, chat Go complet | `docs/FEATURE_STATUS.md` | S | | QA1-02 | Mettre à jour `PROJECT_STATE.md` pour v0.503 | `docs/PROJECT_STATE.md` | S | | QA1-03 | Créer `SMOKE_TEST_V0503.md` — checklist validation | `docs/SMOKE_TEST_V0503.md` | S | | QA1-04 | Mettre à jour `CHANGELOG.md` | `CHANGELOG.md` | S | | QA1-05 | Archiver `V0_503_RELEASE_SCOPE.md` → `docs/archive/` | `docs/archive/` | S | | QA1-06 | Créer placeholder `V0_601_RELEASE_SCOPE.md` | `docs/V0_601_RELEASE_SCOPE.md` | S | | QA1-07 | Rétrospective v0.503 | `docs/RETROSPECTIVE_V0503.md` | S | | QA1-08 | Tag `v0.503` | Git | S | --- ## Fichiers impactés (récapitulatif) ### Backend Go (nouveau/modifié) | Fichier | Action | |---------|--------| | `internal/handlers/stream_handler.go` | Modifier — ajouter endpoints HLS proxy | | `internal/services/stream_service.go` | Modifier — HLS transcoding + status | | `internal/config/config.go` | Modifier — flag `HLSEnabled` | | `internal/websocket/chat/rate_limiter.go` | Modifier — Redis backend | | `internal/websocket/chat/hub.go` | Modifier — presence persistence | | `internal/websocket/chat/handler_history.go` | Modifier — FTS ts_query | | `internal/repositories/chat_message_repository.go` | Modifier — FTS query | | `internal/websocket/chat/presence_service.go` | Nouveau | | `internal/handlers/presence_handler.go` | Nouveau ou modifier | | `migrations/113_messages_fts.sql` | Nouveau | ### Frontend (nouveau/modifié) | Fichier | Action | |---------|--------| | `apps/web/src/features/player/` | Modifier — intégrer useHLSPlayer | | `apps/web/src/features/player/components/` | Modifier — quality selector | | `apps/web/src/mocks/handlers-streaming.ts` | Nouveau | ### Infra & CI/CD | Fichier | Action | |---------|--------| | `.github/workflows/ci.yml` | Modifier — retirer chat-server | | `.github/workflows/cd.yml` | Modifier — retirer chat-server | | `config/prometheus.yml` | Modifier — retirer chat-server scrape | | `config/caddy/Caddyfile.staging` | Modifier — retirer /ws, ajouter /hls | | `docker-compose.yml` | Vérifier — HLS config | | `docker-compose.staging.yml` | Vérifier — HLS config | | `docker-compose.prod.yml` | Vérifier — HLS config | ### Archivage / Suppression | Fichier | Action | |---------|--------| | `veza-chat-server/` | Archiver ou supprimer | --- ## Critères d'acceptation ### Lot SS1 - [ ] Un track uploadé déclenche un transcoding HLS (3 tiers : 128k, 256k, 320k) - [ ] Le player charge automatiquement la playlist HLS quand disponible - [ ] L'ABR fonctionne (switch qualité automatique selon bande passante) - [ ] Le quality selector permet de forcer une qualité - [ ] Le streaming HLS est authentifié (stream token éphémère) - [ ] La story Storybook du player affiche les 3 états (Loading, Error, Quality) - [ ] Le test E2E upload → HLS passe ### Lot CH1 - [ ] Le rate limiter utilise Redis (vérifié par test avec 2 goroutines) - [ ] La présence est persistée dans Redis et récupérable via REST - [ ] La recherche de messages utilise full-text search PostgreSQL - [ ] Le benchmark atteint 100+ connexions simultanées sans erreur ### Lot CL1 - [ ] Le dossier `veza-chat-server/` est archivé ou supprimé - [ ] `git grep chat-server` ne retourne aucun résultat dans CI/CD/config (hors docs historiques) - [ ] `cargo build` n'est plus exécuté pour le chat-server en CI ### Lot QA1 - [ ] FEATURE_STATUS.md reflète l'état réel du code - [ ] CHANGELOG.md est à jour - [ ] Tag `v0.503` créé --- ## Hors scope v0.503 | Élément | Version cible | |---------|---------------| | Go Live (streaming vidéo) | v0.703 | | 2FA SMS / Passkeys | v0.104 | | Migration React 19 | v0.602 | | Blue-green deployment | v0.601 | | IaC (Terraform/Pulumi) | v0.801 | | OAuth Discord/Spotify implémentation | v0.601 | | Payout vendeurs (Stripe Connect) | v0.601 | | Reviews produits | v0.601 | | Factures PDF | v0.601 | | Remboursements | v0.601 | | Hyperswitch mode production | v0.601 | | Consolidation des migrations (squash) | v0.601 | | Découpage fichiers > 1000 LOC | v0.601 | --- ## Risques | Risque | Mitigation | |--------|-----------| | Stream server HLS non fonctionnel en pratique | Tester l'upload → transcode manuellement avant d'intégrer le frontend | | FFmpeg non disponible dans le container stream-server | Vérifier le Dockerfile stream-server (FFmpeg doit être installé) | | Redis indisponible en dev (rate limiter + presence) | Conserver le fallback in-memory existant | | Performance search FTS sur gros volume | L'index GIN et `ts_vector` sont conçus pour ça, benchmarker | --- ## Diagramme de flux HLS (cible v0.503) ``` Upload Track → Go Backend → POST /internal/jobs/transcode → Stream Server (Rust) │ ▼ FFmpeg transcode ├── 128k.m3u8 + segments ├── 256k.m3u8 + segments └── 320k.m3u8 + segments │ ▼ Callback → Go Backend POST /api/v1/internal/tracks/:id/stream-ready │ ▼ Track.stream_manifest_url = HLS URL │ Player ← hls.js ← GET /hls/:track_id/master.m3u8 ← Stream Server (auth JWT) └── ABR quality switching automatique ```