Fix: Stream-close-warning via IPC statt async executeJavaScript

- Renderer meldet Streaming-Status synchron per IPC
- main.js prueft Status synchron im close-Handler
- Kein async Race mehr, Dialog erscheint zuverlaessig
This commit is contained in:
Daniel 2026-03-07 14:14:51 +01:00
parent e2ae624690
commit 7bebb7db9a
3 changed files with 20 additions and 17 deletions

View file

@ -106,15 +106,13 @@ function createWindow() {
} }
}); });
// Track streaming status from renderer (synchronous — no async race)
let isStreaming = false;
ipcMain.on('streaming-status', (_event, active) => { isStreaming = active; });
// Warn before closing if a stream is active // Warn before closing if a stream is active
let forceClose = false;
mainWindow.on('close', (event) => { mainWindow.on('close', (event) => {
if (forceClose) return; if (!isStreaming) return;
event.preventDefault();
mainWindow.webContents.executeJavaScript(
`Array.from(document.querySelectorAll('video')).some(v => v.srcObject?.active)`
).then((isStreaming) => {
if (!isStreaming) { forceClose = true; mainWindow.close(); return; }
const result = dialog.showMessageBoxSync(mainWindow, { const result = dialog.showMessageBoxSync(mainWindow, {
type: 'warning', type: 'warning',
buttons: ['Beenden', 'Abbrechen'], buttons: ['Beenden', 'Abbrechen'],
@ -123,8 +121,7 @@ function createWindow() {
title: 'Stream laeuft noch!', title: 'Stream laeuft noch!',
message: 'Ein Stream ist noch aktiv.\nBeim Beenden wird der Stream gestoppt.', message: 'Ein Stream ist noch aktiv.\nBeim Beenden wird der Stream gestoppt.',
}); });
if (result === 0) { forceClose = true; mainWindow.close(); } if (result !== 0) event.preventDefault();
}).catch(() => { forceClose = true; mainWindow.close(); });
}); });
} }

View file

@ -6,4 +6,5 @@ contextBridge.exposeInMainWorld('electronAPI', {
onUpdateAvailable: (callback) => ipcRenderer.on('update-available', callback), onUpdateAvailable: (callback) => ipcRenderer.on('update-available', callback),
onUpdateReady: (callback) => ipcRenderer.on('update-ready', callback), onUpdateReady: (callback) => ipcRenderer.on('update-ready', callback),
installUpdate: () => ipcRenderer.send('install-update'), installUpdate: () => ipcRenderer.send('install-update'),
setStreaming: (active) => ipcRenderer.send('streaming-status', active),
}); });

View file

@ -79,6 +79,11 @@ export default function StreamingTab({ data }: { data: any }) {
useEffect(() => { isBroadcastingRef.current = isBroadcasting; }, [isBroadcasting]); useEffect(() => { isBroadcastingRef.current = isBroadcasting; }, [isBroadcasting]);
useEffect(() => { viewingRef.current = viewing; }, [viewing]); useEffect(() => { viewingRef.current = viewing; }, [viewing]);
// Notify Electron about streaming status for close-warning
useEffect(() => {
(window as any).electronAPI?.setStreaming(isBroadcasting || viewing !== null);
}, [isBroadcasting, viewing]);
// ── Elapsed time ticker ── // ── Elapsed time ticker ──
useEffect(() => { useEffect(() => {
const hasActive = streams.length > 0 || isBroadcasting; const hasActive = streams.length > 0 || isBroadcasting;