Backend Go: - Remplacement complet des anciennes migrations par la base V1 alignée sur ORIGIN. - Durcissement global du parsing JSON (BindAndValidateJSON + RespondWithAppError). - Sécurisation de config.go, CORS, statuts de santé et monitoring. - Implémentation des transactions P0 (RBAC, duplication de playlists, social toggles). - Ajout d’un job worker structuré (emails, analytics, thumbnails) + tests associés. - Nouvelle doc backend : AUDIT_CONFIG, BACKEND_CONFIG, AUTH_PASSWORD_RESET, JOB_WORKER_*. Chat server (Rust): - Refonte du pipeline JWT + sécurité, audit et rate limiting avancé. - Implémentation complète du cycle de message (read receipts, delivered, edit/delete, typing). - Nettoyage des panics, gestion d’erreurs robuste, logs structurés. - Migrations chat alignées sur le schéma UUID et nouvelles features. Stream server (Rust): - Refonte du moteur de streaming (encoding pipeline + HLS) et des modules core. - Transactions P0 pour les jobs et segments, garanties d’atomicité. - Documentation détaillée de la pipeline (AUDIT_STREAM_*, DESIGN_STREAM_PIPELINE, TRANSACTIONS_P0_IMPLEMENTATION). Documentation & audits: - TRIAGE.md et AUDIT_STABILITY.md à jour avec l’état réel des 3 services. - Cartographie complète des migrations et des transactions (DB_MIGRATIONS_*, DB_TRANSACTION_PLAN, AUDIT_DB_TRANSACTIONS, TRANSACTION_TESTS_PHASE3). - Scripts de reset et de cleanup pour la lab DB et la V1. Ce commit fige l’ensemble du travail de stabilisation P0 (UUID, backend, chat et stream) avant les phases suivantes (Coherence Guardian, WS hardening, etc.).
8.8 KiB
8.8 KiB
🔍 AUDIT STRUCTURÉ - Moteur d'encodage audio veza-stream-server
Date: 2025-01-27
Mission: P0 - Rendre le stream-server fonctionnel (encodage audio & pipeline FFmpeg)
1. FONCTIONNALITÉS ACTUELLES
1.1 Ce qui est réellement implémenté
✅ src/transcoding/pipeline/queue.rs
- File d'attente prioritaire avec 3 niveaux (Urgent, Normal, Background)
- Utilise
tokio::sync::mpscavec capacité configurable (défaut: 100) - Méthode
submit()avec backpressure (retourneQueueFullsi saturée) - Méthode
next_job()avec stratégie de priorité stricte (Urgent > Normal > Background) - État: ✅ Fonctionnel
✅ src/transcoding/pipeline/job.rs
- Structure
TranscodingJobcomplète avec:- ID, track_id, input_path, output_dir
- QualityProfile, priority, status
- Timestamps (created_at, started_at, completed_at)
- Retry logic (retry_count, can_retry)
- Progress tracking (progress_percent)
- États:
Pending,Processing,Completed,Failed(String),Cancelled - Méthodes:
mark_started(),mark_completed(),mark_failed() - État: ✅ Fonctionnel
✅ src/transcoding/pipeline/worker.rs
- Structure
TranscodingWorkeravec ID - Méthode
process()qui:- Construit la commande FFmpeg via
FfmpegCommandBuilder - Exécute avec timeout (5 minutes)
- Gère les erreurs et retry
- Construit la commande FFmpeg via
- État: ⚠️ Partiellement fonctionnel (TODOs présents)
✅ src/transcoding/ffmpeg/command_builder.rs
- Builder pattern pour commandes FFmpeg
- Support: input, output, codec, bitrate, sample_rate, channels, container
- Support HLS basique:
-f hls,-hls_time,-hls_playlist_type vod - Génération de noms de segments:
segment_%05d.ts - État: ⚠️ Partiellement fonctionnel (HLS incomplet)
✅ src/transcoding/engine.rs
TranscodingEngineavec:- Queue prioritaire (capacité 1000)
- Worker pool (configurable)
- Méthode
start()qui lance les workers en arrière-plan - Méthode
submit()pour enqueue un job
- État: ⚠️ Partiellement fonctionnel (pas de notification de résultats)
✅ src/transcoding/codecs/profiles.rs
QualityProfileavec profils prédéfinis:hi_res(): 320kbps, 48kHz, Stereo, AAChigh(): 192kbps, 44.1kHz, Stereo, AACmedium(): 128kbps, 44.1kHz, Stereo, AAClow(): 64kbps, 22.05kHz, Mono, AAC
- Tous configurés pour HLS avec
hls_segment_time: Some(6) - État: ✅ Fonctionnel
✅ src/transcoding/codecs/mod.rs
- Enum
AudioCodec: MP3, AAC, OPUS, FLAC, WAV - Enum
ContainerFormat: MP3, MP4, OGG, FLAC, WAV, HLS - Implémentation
Displaypour conversion en noms FFmpeg - État: ✅ Fonctionnel
1.2 Ce qui est déclaré comme TODO
❌ src/core/encoder.rs (ligne 253)
// TODO: Implémentation réelle des encodeurs
- Pool d'encodeurs initialisé mais vide
- Aucun encodeur réel (Opus, AAC, MP3, FLAC) n'est instancié
❌ src/core/encoder.rs (ligne 459)
// TODO: Implémenter le thread de traitement en temps réel
EncoderPipeline::start_processing()ne fait rien- Aucun traitement audio réel
⚠️ src/transcoding/pipeline/worker.rs (ligne 74)
// TODO: Kill process ? Command::status() wait for completion.
- En cas de timeout, le processus FFmpeg n'est pas tué
- Risque de fuite de processus
⚠️ src/transcoding/engine.rs (ligne 38)
// TODO: Notifier le résultat via EventBus ou Callback
- Les résultats des jobs ne sont pas notifiés
- Pas de callback pour mettre à jour l'état
1.3 Ce qui est incorrect ou incohérent
🔴 Problème majeur: Routes API manquantes
- Aucune route
/v1/stream/transcodedansmain.rs - Aucune route
/v1/stream/job/{id}pour récupérer l'état - Aucune route
/v1/stream/hls/{job_id}/index.m3u8pour servir HLS - La route
/internal/jobs/transcodeexiste mais utilisecompression_engineau lieu detranscoding_engine
🔴 Problème: TranscodingEngine non intégré dans AppState
AppStatene contient pas deTranscodingEngine- Impossible d'accéder au moteur depuis les routes
🔴 Problème: Command Builder HLS incomplet
- Le builder génère
segment_%05d.tsmais ne configure pas correctement:- Le pattern de nommage des segments
- La structure du répertoire de sortie
- Le manifest HLS (
index.m3u8) n'est pas correctement configuré
⚠️ Problème: Pas de stockage d'état des jobs
- Les jobs sont traités mais leur état n'est pas persisté
- Impossible de récupérer l'état d'un job après soumission
- Pas de base de données ou de cache pour stocker les jobs
⚠️ Problème: Worker ne met pas à jour le job correctement
- Le worker retourne un
TranscodingJobmodifié mais:- Il n'est pas stocké nulle part
- L'appelant ne peut pas récupérer le résultat
2. MANQUES FONCTIONNELS CRITIQUES (P0)
2.1 FFmpeg non utilisé correctement
- ❌ Le command builder génère des commandes mais:
- Le format HLS n'est pas complet (manque
-hls_list_size 0pour VOD) - Pas de gestion des segments existants
- Pas de validation que FFmpeg est installé
- Le format HLS n'est pas complet (manque
2.2 Pipeline inactif
- ❌ Le
TranscodingEnginen'est jamais démarré dansmain.rs - ❌ Aucun job n'est jamais soumis
- ❌ Les workers tournent mais ne traitent rien
2.3 Absence de retour asynchrone
- ❌ Pas de mécanisme pour:
- Récupérer l'état d'un job après soumission
- Recevoir une notification quand un job est terminé
- Gérer les erreurs de manière centralisée
2.4 Absence d'événements d'état
- ❌ Pas de transitions d'état visibles:
Queued → Processing → DoneQueued → Processing → Error
- ❌ Pas de logs structurés pour suivre les jobs
2.5 Dossier d'output HLS non structuré
- ❌ Pas de structure claire pour les outputs:
- Où sont stockés les segments
.ts? - Où est le manifest
index.m3u8? - Comment servir les fichiers via HTTP?
- Où sont stockés les segments
3. CONTRAT MANQUANT
3.1 API REST incomplète
❌ POST /v1/stream/transcode
Manquant: Route pour upload + paramètres de transcodage
- Input:
file(multipart),codec,bitrate,quality_profile - Output:
{ "job_id": "uuid", "status": "queued" }
❌ GET /v1/stream/job/{id}
Manquant: Route pour récupérer l'état d'un job
- Output:
{ "id": "uuid", "status": "processing", "progress": 45.5, ... }
❌ GET /v1/stream/hls/{job_id}/index.m3u8
Manquant: Route pour servir le manifest HLS
- Output: Contenu du fichier
index.m3u8
❌ GET /v1/stream/hls/{job_id}/{segment}
Manquant: Route pour servir les segments .ts
- Output: Contenu binaire du segment
3.2 Absence d'API pour récupérer l'état du transcodage
- Pas de mécanisme pour:
- Lister tous les jobs
- Filtrer par statut
- Récupérer l'historique
3.3 Manque de dossier d'output structuré HLS
- Structure attendue:
output_dir/
{job_id}/
index.m3u8 # Master playlist
segment_00001.ts
segment_00002.ts
...
- Actuellement: Non défini
4. RÉSUMÉ DES BLOQUANTS P0
| Bloquant | Fichier | Description | Impact |
|---|---|---|---|
| 🔴 P0 | main.rs |
TranscodingEngine non initialisé dans AppState | Aucun transcodage possible |
| 🔴 P0 | main.rs |
Routes API /v1/stream/transcode et /v1/stream/job/{id} manquantes |
Impossible de soumettre/récupérer des jobs |
| 🔴 P0 | src/transcoding/engine.rs |
Pas de stockage d'état des jobs | Impossible de suivre l'état |
| 🔴 P0 | src/transcoding/pipeline/worker.rs |
FFmpeg timeout ne tue pas le processus | Fuite de ressources |
| 🔴 P0 | src/transcoding/ffmpeg/command_builder.rs |
Configuration HLS incomplète | Segments mal générés |
| 🟠 P1 | src/core/encoder.rs |
Pool d'encodeurs vide | Pas d'encodage natif (mais FFmpeg fonctionne) |
| 🟠 P1 | src/transcoding/engine.rs |
Pas de notification de résultats | Pas de callback/EventBus |
5. RECOMMANDATIONS
5.1 Actions immédiates (P0)
- ✅ Intégrer
TranscodingEnginedansAppState - ✅ Créer routes API
/v1/stream/transcodeet/v1/stream/job/{id} - ✅ Implémenter stockage d'état des jobs (HashMap en mémoire pour P0)
- ✅ Compléter command builder HLS
- ✅ Fixer timeout FFmpeg (kill process)
5.2 Actions secondaires (P1)
- Implémenter notification de résultats (EventBus ou callback)
- Ajouter validation FFmpeg installé
- Structurer dossier output HLS
- Ajouter logs structurés
5.3 Actions futures (P2)
- Implémenter encodeurs natifs (Opus, AAC) dans
encoder.rs - Ajouter support multi-bitrate adaptatif
- Persister jobs en base de données
- Ajouter métriques Prometheus pour jobs
Prochaine étape: Phase 2 - Design du pipeline minimal mais robuste