diff --git a/.gitignore b/.gitignore index 97e4f61..cbb1fd9 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,6 @@ server.log # Runtime files /tmp/ptt-live.pid + +# Certificats SSL locaux (mkcert) - contiennent des clés privées +certs/ diff --git a/server/index.js b/server/index.js index c7a4de9..63eafe2 100644 --- a/server/index.js +++ b/server/index.js @@ -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}`); diff --git a/server/websocket/AudioLevelsServer.js b/server/websocket/AudioLevelsServer.js index 8442289..761677d 100644 --- a/server/websocket/AudioLevelsServer.js +++ b/server/websocket/AudioLevelsServer.js @@ -91,9 +91,11 @@ export class AudioLevelsServer extends EventEmitter { return new Promise((resolve, reject) => { try { // Si un serveur HTTP est fourni, utiliser le même port (upgrade HTTP → WebSocket) + // noServer: true car l'upgrade est dispatché manuellement par server/index.js + // (un seul listener 'upgrade' partagé avec le proxy LiveKit, voir handleUpgrade()) // Sinon, créer un serveur WebSocket standalone sur son propre port const wsOptions = this.options.server - ? { server: this.options.server, path: '/audio-levels' } + ? { noServer: true } : { port: this.options.port }; this.wss = new WebSocketServer(wsOptions); @@ -125,6 +127,16 @@ export class AudioLevelsServer extends EventEmitter { }); } + /** + * Complète l'upgrade WebSocket pour une requête déjà identifiée comme + * ciblant ce serveur (voir le dispatcher 'upgrade' dans server/index.js) + */ + handleUpgrade(req, socket, head) { + this.wss.handleUpgrade(req, socket, head, (ws) => { + this.wss.emit('connection', ws, req); + }); + } + /** * Gère une nouvelle connexion client */