fix: activer HTTPS par défaut dans l'app Electron et fiabiliser les appels au serveur local

ENABLE_HTTPS était lu depuis l'environnement sans jamais être positionné par le
flow Electron (start-desktop.sh → electron .), donc le serveur enfant tournait
toujours en HTTP malgré le setup mkcert automatique au premier lancement.
ENABLE_HTTPS est désormais activé par défaut (ENABLE_HTTPS=false pour revenir
en HTTP explicitement).

Corrections induites par ce changement de protocole par défaut :
- pingServer() utilisait le module http en dur même en HTTPS ; bascule sur
  https avec rejectUnauthorized: false (ping local vers notre propre process
  enfant, le module https de Node ne lisant pas le trousseau macOS où mkcert
  installe sa CA, contrairement à Safari/Chrome/Electron renderer).
- Le dashboard (electron/ui/app.js) avait l'URL de l'API et celle du
  WebSocket VU-mètres codées en dur en http/ws ; elles utilisent maintenant
  l'URL réelle exposée par preload.js (serverUrl), cohérente avec le
  protocole effectif du serveur.
This commit is contained in:
2026-06-30 13:45:33 +02:00
parent b7911badb2
commit 144caac183
3 changed files with 23 additions and 4 deletions
+14 -2
View File
@@ -7,6 +7,7 @@ const { app, BrowserWindow, ipcMain, Menu, Tray, dialog } = require('electron');
const path = require('path'); const path = require('path');
const { spawn } = require('child_process'); const { spawn } = require('child_process');
const http = require('http'); const http = require('http');
const https = require('https');
const setupHelper = require('./setup-helper'); const setupHelper = require('./setup-helper');
// État de l'application // État de l'application
@@ -17,7 +18,11 @@ let serverStarted = false;
let rendererReady = false; let rendererReady = false;
const SERVER_PORT = process.env.PORT || 3000; const SERVER_PORT = process.env.PORT || 3000;
const SERVER_URL = `http://localhost:${SERVER_PORT}`; // HTTPS activé par défaut (cohérent avec le setup mkcert automatique au premier
// lancement) ; ENABLE_HTTPS=false permet de revenir explicitement en HTTP
const ENABLE_HTTPS = process.env.ENABLE_HTTPS !== 'false';
const SERVER_PROTOCOL = ENABLE_HTTPS ? 'https' : 'http';
const SERVER_URL = `${SERVER_PROTOCOL}://localhost:${SERVER_PORT}`;
const isDev = process.argv.includes('--dev'); const isDev = process.argv.includes('--dev');
/** /**
@@ -133,6 +138,7 @@ async function startServer() {
...process.env, ...process.env,
PORT: SERVER_PORT, PORT: SERVER_PORT,
USE_LOCAL_LIVEKIT: 'true', USE_LOCAL_LIVEKIT: 'true',
ENABLE_HTTPS: ENABLE_HTTPS ? 'true' : 'false',
NODE_ENV: isDev ? 'development' : 'production' NODE_ENV: isDev ? 'development' : 'production'
} }
}); });
@@ -289,7 +295,13 @@ async function stopServer() {
*/ */
async function pingServer() { async function pingServer() {
return new Promise((resolve) => { return new Promise((resolve) => {
http.get(`${SERVER_URL}/health`, (res) => { const client = ENABLE_HTTPS ? https : http;
// rejectUnauthorized: false : le cert mkcert est approuvé par le Keychain
// macOS (Safari/Chrome/Electron renderer), mais le module https de Node
// ne lit pas ce trust store et rejetterait sinon ce ping vers notre
// propre serveur local.
const options = ENABLE_HTTPS ? { rejectUnauthorized: false } : {};
client.get(`${SERVER_URL}/health`, options, (res) => {
let data = ''; let data = '';
res.on('data', (chunk) => { data += chunk; }); res.on('data', (chunk) => { data += chunk; });
res.on('end', () => { res.on('end', () => {
+7
View File
@@ -5,8 +5,15 @@
const { contextBridge, ipcRenderer } = require('electron'); const { contextBridge, ipcRenderer } = require('electron');
// Même logique que dans main.js : doit rester synchronisé avec SERVER_URL
const SERVER_PORT = process.env.PORT || 3000;
const ENABLE_HTTPS = process.env.ENABLE_HTTPS !== 'false';
const SERVER_URL = `${ENABLE_HTTPS ? 'https' : 'http'}://localhost:${SERVER_PORT}`;
// Exposer l'API au renderer de manière sécurisée // Exposer l'API au renderer de manière sécurisée
contextBridge.exposeInMainWorld('electronAPI', { contextBridge.exposeInMainWorld('electronAPI', {
serverUrl: SERVER_URL,
// Contrôle serveur // Contrôle serveur
server: { server: {
start: () => ipcRenderer.invoke('server:start'), start: () => ipcRenderer.invoke('server:start'),
+2 -2
View File
@@ -2,7 +2,7 @@
* PTT Live Desktop - Renderer Process Logic * PTT Live Desktop - Renderer Process Logic
*/ */
const API_BASE = 'http://localhost:3000'; const API_BASE = window.electronAPI?.serverUrl || 'http://localhost:3000';
// État global // État global
let serverRunning = false; let serverRunning = false;
@@ -604,7 +604,7 @@ function connectAudioLevelsWS() {
return; return;
} }
const wsUrl = 'ws://localhost:3000/audio-levels'; const wsUrl = API_BASE.replace(/^http/, 'ws') + '/audio-levels';
console.log('Connexion WebSocket audio-levels...', wsUrl); console.log('Connexion WebSocket audio-levels...', wsUrl);
try { try {