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
Lot CH1
Lot CL1
Lot QA1
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