fix: corriger conflit upgrade WebSocket entre proxy LiveKit et audio-levels

AudioLevelsServer s'auto-attachait à l'événement 'upgrade' du serveur HTTP
via la lib ws (server + path), en plus du listener manuel du proxy LiveKit.
Pour toute connexion /livekit, les deux listeners s'exécutaient : le proxy
LiveKit aboutissait bien côté upstream, mais le listener ws (path
/audio-levels ne matchant pas) appelait abortHandshake(socket, 400) sur le
même socket juste après, cassant la connexion côté client en HTTPS prod.

AudioLevelsServer passe maintenant en noServer: true et expose
handleUpgrade(), appelée par un dispatcher 'upgrade' unique dans
server/index.js qui route explicitement par chemin (/livekit vs
/audio-levels).

Ajout de certs/ au .gitignore (clés privées SSL locales mkcert).
This commit is contained in:
2026-06-30 13:29:09 +02:00
parent dfe5db979a
commit b7911badb2
3 changed files with 25 additions and 12 deletions
+9 -11
View File
@@ -520,28 +520,26 @@ async function start() {
});
}
// 2.5 Activer upgrade WebSocket pour proxy LiveKit
// Important : gérer AVANT AudioLevelsServer
server.on('upgrade', (req, socket, head) => {
log('info', `📡 WebSocket upgrade: ${req.url}`);
// 2.5 Démarrer WebSocket Audio Levels (même port que l'API)
// noServer: true en interne, l'upgrade est dispatché ci-dessous
const audioLevelsServer = new AudioLevelsServer({ server });
audioLevelsServer.start();
// 2.6 Dispatcher unique pour les upgrades WebSocket du port HTTP/HTTPS
// (proxy LiveKit et audio-levels partagent le même serveur, donc le même
// événement 'upgrade' : un seul listener doit trancher par chemin)
server.on('upgrade', (req, socket, head) => {
if (req.url.startsWith('/livekit')) {
log('info', '🔀 Proxying to LiveKit on ws://localhost:7880');
// Réécrire l'URL pour enlever /livekit
req.url = req.url.replace(/^\/livekit/, '');
livekitProxy.ws(req, socket, head);
} else if (req.url.startsWith('/audio-levels')) {
log('debug', '📊 Audio levels WebSocket - handled by AudioLevelsServer');
// AudioLevelsServer will handle this
audioLevelsServer.handleUpgrade(req, socket, head);
} else {
log('warn', `⚠️ Unknown WebSocket path: ${req.url}`);
socket.destroy();
}
});
// 2.6 Démarrer WebSocket Audio Levels (même port que l'API)
const audioLevelsServer = new AudioLevelsServer({ server });
audioLevelsServer.start();
const wsProtocol = ENABLE_HTTPS ? 'wss' : 'ws';
log('info', `✓ WebSocket Audio Levels démarré sur ${wsProtocol}://${SERVER_HOST}:${SERVER_PORT}`);