From dd31090d3ff7cfd4957850be41f8b9fad410fe98 Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Fri, 12 Jun 2026 16:27:34 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20gestion=20des=20contextes=20non=20s?= =?UTF-8?q?=C3=A9curis=C3=A9s,=20erreurs=20websocket=20et=20rechargement?= =?UTF-8?q?=20liste=20des=20r=C3=A9unions?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/static/app.js | 25 ++++++++++++++++++++++++- task.md | 2 ++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/app/static/app.js b/app/static/app.js index 3aef600..e52fc45 100644 --- a/app/static/app.js +++ b/app/static/app.js @@ -1,5 +1,13 @@ const $ = (id) => document.getElementById(id); +// Vérification du contexte sécurisé (requis pour le micro et les périphériques) +if (window.isSecureContext === false) { + const warning = document.createElement('div'); + warning.style.cssText = 'background: #3a181a; color: #ff8589; padding: 12px; text-align: center; font-weight: bold; border-bottom: 1px solid #e5484d; font-size: 0.9rem; z-index: 9999; position: relative;'; + warning.innerHTML = '⚠️ Contexte non sécurisé (HTTP) détecté. Le navigateur bloquera l\'accès au micro. Veuillez utiliser HTTPS (https://...) ou localhost.'; + document.body.insertBefore(warning, document.body.firstChild); +} + const state = { recording: false, ws: null, @@ -84,7 +92,19 @@ async function startRecording() { diarization: $('diarization-cb').checked, })); state.ws.onmessage = onServerMessage; - state.ws.onclose = () => { if (state.recording) stopRecording(true); }; + state.ws.onerror = (err) => { + console.error('Erreur WebSocket :', err); + setStatus('error', 'Erreur Connexion'); + }; + state.ws.onclose = (e) => { + console.log(`WebSocket fermé : code=${e.code}, raison=${e.reason}`); + if (state.recording) { + stopRecording(true); + if (e.code !== 1000 && e.code !== 1001) { + setStatus('error', `Déconnexion (${e.code})`); + } + } + }; state.audioContext = new AudioContext(); await state.audioContext.audioWorklet.addModule('worklet.js'); @@ -138,6 +158,9 @@ function stopRecording(abrupt = false) { $('record-btn').textContent = '● Démarrer'; $('record-btn').classList.remove('recording'); $('title').disabled = false; + + // Toujours recharger les réunions pour synchroniser la liste (cas d'arrêt abrupt ou échec) + loadMeetings(); } function onServerMessage(event) { diff --git a/task.md b/task.md index 77d5ec8..82974c8 100644 --- a/task.md +++ b/task.md @@ -31,3 +31,5 @@ Vérification de la cohérence de tous les fichiers (backend et frontend) et tes - Amélioration du frontend pour rafraîchir les noms des micros après autorisation d'accès, commit et push sur main. - Correction de l'affichage de la liste des micros : demande initiale d'autorisation au chargement de la page et filtrage des périphériques sans identifiant. - Ajout de la variable d'environnement DIARIZATION_MAX_SPEAKERS (défaut 8) et intégration dans l'instanciation de SpeakerDiarizer. +- Résolution des problèmes de synchronisation de la liste des réunions (rechargement systématique dans stopRecording), détection des contextes non sécurisés (affichage d'un bandeau d'erreur si HTTP) et gestion des erreurs de connexion WebSocket. +