feat: ajouter les server audio users (participants LiveKit côté serveur avec I/O physique)

Chaque server audio user est un participant LiveKit indépendant géré par le serveur :
- publie un canal physique d'entrée comme track audio
- reçoit et mixe l'audio de tous les autres participants (mix-minus naturel)
- sort le mix vers un canal physique dédié

Nouvelle classe ServerAudioUser.js, intégration dans AudioBridge et AudioBridgeManager,
section server_audio_users dans config.yaml (vide par défaut, exemple commenté).
This commit is contained in:
2026-07-01 14:14:26 +02:00
parent 51245db256
commit 87a1370ad4
4 changed files with 320 additions and 1 deletions
+42
View File
@@ -89,6 +89,46 @@ class AudioBridgeManager extends EventEmitter {
return;
}
// Générer un token JWT par server audio user
const serverAudioUsers = [];
for (const user of config.server_audio_users || []) {
const groupId = slugify(user.group);
const token = new AccessToken(
config.server?.livekit?.apiKey || 'devkey',
config.server?.livekit?.apiSecret || 'secret',
{
identity: `server-${user.name}`,
name: `Server Audio - ${user.name}`,
metadata: JSON.stringify({
role: 'server-audio-user',
group: groupId
})
}
);
token.addGrant({
room: groupId,
roomJoin: true,
canPublish: true,
canSubscribe: true,
canPublishData: true
});
const jwt = await token.toJwt();
serverAudioUsers.push({
name: user.name,
groupId,
inputChannel: user.input_channel ?? user.inputChannel ?? 0,
outputChannel: user.output_channel ?? user.outputChannel ?? 0,
token: jwt
});
console.log(`✓ Token JWT généré pour server audio user "${user.name}" (room: ${groupId})`);
}
// Import dynamique du AudioBridge
const { AudioBridge } = await import('./AudioBridge.js');
@@ -123,6 +163,8 @@ class AudioBridgeManager extends EventEmitter {
// Options LiveKit (multi-rooms)
liveKitUrl,
liveKitTokens, // Tableau de { groupName, groupId, token }
// Server audio users
serverAudioUsers,
// Options de routing
routing: config.audio?.routing || {},
groups: config.groups || [],