feat: migration Socket.IO natif — login, terminaux REST, health check (closes #3)

Remplace toute la couche SignalR par une connexion Socket.IO directe
au serveur Python (port 8004). Auth au handshake, reconnexion native
illimitée, terminaux via REST GET /terminals.

- socketio-adapter.js : connect/logoff/disconnect, events login_ok/login_error
- main.js : initializeSocketIO, health check net.request, terminaux REST
- renderer.js : IPC signalr-status → server-status
- config.json : clé socketio (plus signalR)
- Version 2.0.0
This commit is contained in:
Pierre Marx
2026-03-18 17:31:30 -04:00
parent 630f1fa8c3
commit 77a310976b
5 changed files with 414 additions and 447 deletions

View File

@@ -29,18 +29,18 @@ document.addEventListener('DOMContentLoaded', async () => {
versionLoginElement.textContent = `v${appVersion}`;
}
// Initialiser l'indicateur SignalR
// Initialiser l'indicateur de statut serveur
// Écouter les changements de statut SignalR
ipcRenderer.on('signalr-status', (event, status) => {
updateSignalRIndicator(status);
// Recharger les terminaux à chaque changement de statut
// Ecouter les changements de statut serveur
ipcRenderer.on('server-status', (event, status) => {
updateServerIndicator(status);
// Recharger les terminaux a chaque changement de statut
loadTerminals();
});
// Obtenir le statut initial SignalR
const initialStatus = await ipcRenderer.invoke('get-signalr-status');
updateSignalRIndicator(initialStatus);
// Obtenir le statut initial
const initialStatus = await ipcRenderer.invoke('get-server-status');
updateServerIndicator(initialStatus);
// Charger immédiatement les terminaux pour la page de login
await loadTerminals();
@@ -129,7 +129,7 @@ document.addEventListener('DOMContentLoaded', async () => {
handleIncomingCall(callData);
});
// Écouter les événements SignalR de basculement de centre
// Ecouter les evenements de basculement de centre
ipcRenderer.on('switch-to-center', (event, data) => {
console.log('Basculement vers le centre:', data.centreName);
@@ -162,7 +162,7 @@ document.addEventListener('DOMContentLoaded', async () => {
});
});
// Connexion via SignalR
// Connexion agent
async function handleLogin(e) {
e.preventDefault();
@@ -221,7 +221,7 @@ async function handleLogin(e) {
await new Promise(resolve => setTimeout(resolve, 300));
try {
// Préparer les credentials pour SignalR
// Preparer les credentials
const credentials = {
email: accessCode, // Utiliser directement le code agent comme email
password: password,
@@ -229,7 +229,7 @@ async function handleLogin(e) {
forceDisconnect: forceDisconnect // Ajouter l'option de déconnexion forcée
};
// Appeler l'authentification SignalR
// Appeler l'authentification
const result = await ipcRenderer.invoke('login-agent', credentials);
if (result.success) {
@@ -835,7 +835,7 @@ async function loadTerminals() {
console.log('Chargement des terminaux...');
try {
// Récupérer les terminaux depuis le serveur SignalR
// Recuperer les terminaux depuis le serveur
const terminals = await ipcRenderer.invoke('get-terminal-list');
availableTerminals = terminals || [];
console.log(`${terminals.length} terminaux récupérés`);
@@ -1235,20 +1235,20 @@ function refreshCurrentWebview() {
}
}
// === GESTION INDICATEUR SIGNALR ===
function updateSignalRIndicator(status) {
// === GESTION INDICATEUR STATUT SERVEUR ===
function updateServerIndicator(status) {
const indicator = document.getElementById('signalrIndicator');
const text = document.getElementById('signalrText');
if (!indicator || !text) return;
// Réinitialiser les classes
// Reinitialiser les classes
indicator.className = 'signalr-indicator';
switch(status) {
case 'connected':
indicator.classList.add('connected');
text.textContent = 'Connecté au serveur';
text.textContent = 'Serveur connecte';
break;
case 'connecting':
indicator.classList.add('connecting');
@@ -1256,17 +1256,17 @@ function updateSignalRIndicator(status) {
break;
case 'disconnected':
indicator.classList.add('disconnected');
text.textContent = 'Serveur déconnecté';
text.textContent = 'Serveur deconnecte';
break;
case 'error':
indicator.classList.add('error');
text.textContent = 'Erreur de connexion';
text.textContent = 'Serveur injoignable';
break;
case 'disabled':
indicator.classList.add('disabled');
text.textContent = 'SignalR désactivé';
text.textContent = 'Non configure';
break;
default:
text.textContent = 'État inconnu';
text.textContent = 'Etat inconnu';
}
}