whatsapp_bridge/server.js aktualisiert

1.3.2
This commit is contained in:
2026-06-15 08:35:47 +00:00
parent 294bfc5297
commit 3fe96cb015

View File

@@ -14,20 +14,33 @@ let isInitializing = true;
const SESSION_DATA = '/data/auth'; 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) { async function handleCrash(errorContext) {
console.error(`💥 CRITICAL ERROR CAUGHT: ${errorContext}`); console.error(`💥 CRITICAL ERROR CAUGHT: ${errorContext}`);
isReady = false; isReady = false;
try { 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) { if (client && client.pupBrowser) {
await client.pupBrowser.close().catch(() => {}); await client.pupBrowser.close().catch(() => {});
} }
} catch (e) { } 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); process.exit(1);
} }
@@ -62,9 +75,8 @@ const client = new Client({
'--disable-setuid-sandbox', '--disable-setuid-sandbox',
'--disable-dev-shm-usage', '--disable-dev-shm-usage',
'--disable-gpu', '--disable-gpu',
'--no-zygote',
'--single-process',
'--disable-extensions' '--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) => { 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'); 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) => { app.post('/auth/logout', async (req, res) => {
try { try {
console.log("Manueller Logout über Web-UI..."); console.log("Logout erzwungen über Web-UI...");
if (client) {
await client.logout().catch(() => {}); await client.logout().catch(() => {});
await fs.remove(path.join(SESSION_DATA, 'session-ha_bridge_session')).catch(() => {}); await client.destroy().catch(() => {});
res.json({ success: true, message: "Erfolgreich abgemeldet. Ordner gelöscht. Addon startet neu..." }); }
setTimeout(() => process.exit(0), 2000); 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) { } catch (err) {
res.status(500).json({ error: err.message }); res.status(500).json({ error: err.message });
} }
}); });
// NOTFALL-RESET: Putzt das komplette Verzeichnis leer
app.delete('/system/reset', async (req, res) => { app.delete('/system/reset', async (req, res) => {
try { try {
await client.destroy().catch(() => {}); console.log("Factory Reset erzwungen...");
if (client) await client.destroy().catch(() => {});
await fs.emptyDir('/data').catch(() => {}); await fs.emptyDir('/data').catch(() => {});
res.json({ success: true, message: "Werkseinstellungen aktiv. Alles gelöscht. Neustart..." }); res.json({ success: true, message: "Werkseinstellungen erzwungen. Alles gelöscht. Neustart..." });
setTimeout(() => process.exit(0), 2000); setTimeout(() => process.exit(0), 1500);
} catch (err) { } catch (err) {
res.status(500).json({ error: err.message }); res.status(500).json({ error: err.message });
} }