feat: système hot-reload bridge audio avec ConfigManager (Phase 2.5)

- ConfigManager: gestionnaire centralisé config avec EventEmitter
- AudioBridgeManager: gestion bridge avec auto-reload sur changement config
- Intégration dans serveur principal (index.js)
- Événements 'audio-device-updated' et 'config-updated'
- Reload automatique du bridge sans redémarrer serveur
- Mode placeholder pour développement (vrai bridge Phase 3)
This commit is contained in:
2026-05-25 09:45:59 +02:00
parent 7fd60315dd
commit 9350c9410c
4 changed files with 332 additions and 59 deletions
+18 -36
View File
@@ -10,45 +10,15 @@ import { networkInterfaces } from 'os';
import YAML from 'yaml';
import { AccessToken } from 'livekit-server-sdk';
import adminRouter, { registerUser, addLog } from './api/admin.js';
import configManager from './config/ConfigManager.js';
import audioBridgeManager from './bridge/AudioBridgeManager.js';
const __dirname = dirname(fileURLToPath(import.meta.url));
// Chargement configuration
const configPath = join(__dirname, 'config', 'config.yaml');
const configFile = readFileSync(configPath, 'utf8');
const config = YAML.parse(configFile);
// Chargement configuration via ConfigManager
const config = configManager.get();
/**
* Génère un ID slug à partir d'un nom
* Ex: "Équipe Production" -> "equipe-production"
*/
function slugify(text) {
return text
.toString()
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '') // Retire les accents
.toLowerCase()
.trim()
.replace(/\s+/g, '-')
.replace(/[^\w-]+/g, '')
.replace(/--+/g, '-');
}
// Générer les IDs pour les groupes et canaux s'ils n'existent pas
config.groups = config.groups.map(group => {
if (!group.id) {
group.id = slugify(group.name);
}
if (group.channels) {
group.channels = group.channels.map(channel => {
if (!channel.id) {
channel.id = `${group.id}-${slugify(channel.name)}`;
}
return channel;
});
}
return group;
});
// Note: Les IDs sont maintenant générés automatiquement par le ConfigManager
/**
* Détecte l'IP réseau locale (WiFi/Ethernet)
@@ -388,6 +358,12 @@ async function start() {
log('info', `Groupes configurés: ${config.groups.map(g => g.name).join(', ')}`);
});
// 3. Démarrer Audio Bridge Manager (Phase 2.5)
log('info', '');
log('info', '🎵 Démarrage Audio Bridge Manager...');
await audioBridgeManager.start();
log('info', '✓ Audio Bridge Manager prêt (mode placeholder)');
// Gérer erreur port déjà utilisé
server.on('error', (error) => {
if (error.code === 'EADDRINUSE') {
@@ -407,9 +383,15 @@ async function start() {
// ========== Cleanup ==========
function cleanup() {
async function cleanup() {
log('info', 'Arrêt du serveur...');
// Arrêter l'audio bridge
if (audioBridgeManager) {
log('info', 'Arrêt Audio Bridge Manager...');
await audioBridgeManager.stop();
}
if (livekitProcess) {
log('info', 'Arrêt LiveKit Server...');
livekitProcess.kill('SIGTERM');