diff --git a/whatsapp_bridge/server.js b/whatsapp_bridge/server.js index e610294..c7f03a5 100644 --- a/whatsapp_bridge/server.js +++ b/whatsapp_bridge/server.js @@ -14,20 +14,33 @@ let isInitializing = true; const SESSION_DATA = '/data/auth'; +// --- AUTOMATISCHE SELBSTREINIGUNG BEIM START --- +// Löscht alte Chromium-Sperrdateien, die das "LADE CLIENT..."-Hängen verursachen +try { + const lockFolder = path.join(SESSION_DATA, 'session-ha_bridge_session'); + const lockFile = path.join(lockFolder, 'SingletonLock'); + if (fs.existsSync(lockFile)) { + fs.removeSync(lockFile); + console.log('🔒 Blockierendes Chromium-SingletonLock wurde automatisch entfernt!'); + } +} catch (e) { + console.log('Info: Keine blockierende Sperrdatei beim Start gefunden.'); +} + async function handleCrash(errorContext) { console.error(`💥 CRITICAL ERROR CAUGHT: ${errorContext}`); isReady = false; try { - console.log('Versuche Browser sauber zu schließen, um Session zu retten...'); + console.log('Versuche Browser sauber zu schließen...'); if (client && client.pupBrowser) { await client.pupBrowser.close().catch(() => {}); } } catch (e) { - console.error('Browser konnte nicht sauber geschlossen werden:', e); + console.error('Browser-Close fehlgeschlagen:', e); } - console.log('Add-on wird beendet. HA Watchdog startet es sauber neu...'); + console.log('Add-on wird beendet. HA Watchdog startet es neu...'); process.exit(1); } @@ -62,9 +75,8 @@ const client = new Client({ '--disable-setuid-sandbox', '--disable-dev-shm-usage', '--disable-gpu', - '--no-zygote', - '--single-process', '--disable-extensions' + // '--single-process' und '--no-zygote' wurden entfernt, da sie in Alpine 3.19 Hangs verursachen können! ] } }); @@ -84,7 +96,7 @@ client.on('ready', () => { }); client.on('disconnected', async (reason) => { - console.log(`WhatsApp Verbindung manuell oder extern getrennt (Grund: ${reason}).`); + console.log(`WhatsApp Verbindung getrennt (Grund: ${reason}).`); await handleCrash('Externer Disconnect'); }); @@ -118,24 +130,30 @@ app.get('/api/status', async (req, res) => { } }); +// NOTFALL-SICHER: Löscht die Session radikal, selbst wenn der Client eingefroren ist! app.post('/auth/logout', async (req, res) => { try { - console.log("Manueller Logout über Web-UI..."); - await client.logout().catch(() => {}); - await fs.remove(path.join(SESSION_DATA, 'session-ha_bridge_session')).catch(() => {}); - res.json({ success: true, message: "Erfolgreich abgemeldet. Ordner gelöscht. Addon startet neu..." }); - setTimeout(() => process.exit(0), 2000); + console.log("Logout erzwungen über Web-UI..."); + if (client) { + await client.logout().catch(() => {}); + await client.destroy().catch(() => {}); + } + await fs.remove(SESSION_DATA).catch(() => {}); + res.json({ success: true, message: "Session radikal gelöscht. Addon startet jetzt sauber neu..." }); + setTimeout(() => process.exit(0), 1500); } catch (err) { res.status(500).json({ error: err.message }); } }); +// NOTFALL-RESET: Putzt das komplette Verzeichnis leer app.delete('/system/reset', async (req, res) => { try { - await client.destroy().catch(() => {}); + console.log("Factory Reset erzwungen..."); + if (client) await client.destroy().catch(() => {}); await fs.emptyDir('/data').catch(() => {}); - res.json({ success: true, message: "Werkseinstellungen aktiv. Alles gelöscht. Neustart..." }); - setTimeout(() => process.exit(0), 2000); + res.json({ success: true, message: "Werkseinstellungen erzwungen. Alles gelöscht. Neustart..." }); + setTimeout(() => process.exit(0), 1500); } catch (err) { res.status(500).json({ error: err.message }); }