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.).
240 lines
8.8 KiB
Markdown
240 lines
8.8 KiB
Markdown
# 🔍 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::mpsc` avec capacité configurable (défaut: 100)
|
|
- Méthode `submit()` avec backpressure (retourne `QueueFull` si saturée)
|
|
- Méthode `next_job()` avec stratégie de priorité stricte (Urgent > Normal > Background)
|
|
- **État**: ✅ **Fonctionnel**
|
|
|
|
#### ✅ `src/transcoding/pipeline/job.rs`
|
|
- Structure `TranscodingJob` complè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 `TranscodingWorker` avec ID
|
|
- Méthode `process()` qui:
|
|
- Construit la commande FFmpeg via `FfmpegCommandBuilder`
|
|
- Exécute avec timeout (5 minutes)
|
|
- Gère les erreurs et retry
|
|
- **É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`
|
|
- `TranscodingEngine` avec:
|
|
- 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`
|
|
- `QualityProfile` avec profils prédéfinis:
|
|
- `hi_res()`: 320kbps, 48kHz, Stereo, AAC
|
|
- `high()`: 192kbps, 44.1kHz, Stereo, AAC
|
|
- `medium()`: 128kbps, 44.1kHz, Stereo, AAC
|
|
- `low()`: 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 `Display` pour conversion en noms FFmpeg
|
|
- **État**: ✅ **Fonctionnel**
|
|
|
|
### 1.2 Ce qui est déclaré comme TODO
|
|
|
|
#### ❌ `src/core/encoder.rs` (ligne 253)
|
|
```rust
|
|
// 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)
|
|
```rust
|
|
// 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)
|
|
```rust
|
|
// 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)
|
|
```rust
|
|
// 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/transcode` dans `main.rs`
|
|
- **Aucune route** `/v1/stream/job/{id}` pour récupérer l'état
|
|
- **Aucune route** `/v1/stream/hls/{job_id}/index.m3u8` pour servir HLS
|
|
- La route `/internal/jobs/transcode` existe mais utilise `compression_engine` au lieu de `transcoding_engine`
|
|
|
|
#### 🔴 Problème: TranscodingEngine non intégré dans AppState
|
|
- `AppState` ne contient **pas** de `TranscodingEngine`
|
|
- Impossible d'accéder au moteur depuis les routes
|
|
|
|
#### 🔴 Problème: Command Builder HLS incomplet
|
|
- Le builder génère `segment_%05d.ts` mais 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 `TranscodingJob` modifié 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 0` pour VOD)
|
|
- Pas de gestion des segments existants
|
|
- Pas de validation que FFmpeg est installé
|
|
|
|
### 2.2 Pipeline inactif
|
|
- ❌ Le `TranscodingEngine` n'est **jamais démarré** dans `main.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 → Done`
|
|
- `Queued → 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?
|
|
|
|
---
|
|
|
|
## 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)
|
|
1. ✅ Intégrer `TranscodingEngine` dans `AppState`
|
|
2. ✅ Créer routes API `/v1/stream/transcode` et `/v1/stream/job/{id}`
|
|
3. ✅ Implémenter stockage d'état des jobs (HashMap en mémoire pour P0)
|
|
4. ✅ Compléter command builder HLS
|
|
5. ✅ Fixer timeout FFmpeg (kill process)
|
|
|
|
### 5.2 Actions secondaires (P1)
|
|
1. Implémenter notification de résultats (EventBus ou callback)
|
|
2. Ajouter validation FFmpeg installé
|
|
3. Structurer dossier output HLS
|
|
4. Ajouter logs structurés
|
|
|
|
### 5.3 Actions futures (P2)
|
|
1. Implémenter encodeurs natifs (Opus, AAC) dans `encoder.rs`
|
|
2. Ajouter support multi-bitrate adaptatif
|
|
3. Persister jobs en base de données
|
|
4. Ajouter métriques Prometheus pour jobs
|
|
|
|
---
|
|
|
|
**Prochaine étape**: Phase 2 - Design du pipeline minimal mais robuste
|
|
|