一旦フロントエンドまで接続

This commit is contained in:
misyaguziya
2026-01-09 10:00:33 +09:00
parent d157dc8b7b
commit d4a5a1ca6f
3 changed files with 24 additions and 11 deletions

View File

@@ -49,12 +49,18 @@ class Controller:
def setRun(self, run:Callable[[int, str, Any], None]) -> None: def setRun(self, run:Callable[[int, str, Any], None]) -> None:
self.run = run self.run = run
def shutdown(self) -> None: def shutdown(self, *args, **kwargs) -> dict:
"""Shutdown controller and model (including telemetry).""" """Shutdown controller and model (including telemetry).
Returns:
dict with status 200 and result True on success.
"""
try: try:
model.shutdown() model.shutdown()
return {"status": 200, "result": True}
except Exception: except Exception:
errorLogging() errorLogging()
return {"status": 500, "result": False}
# response functions # response functions
def connectedNetwork(self) -> None: def connectedNetwork(self) -> None:

View File

@@ -129,6 +129,8 @@ mapping = {
"/run/send_text_overlay": {"status": True, "variable":controller.sendTextOverlay}, "/run/send_text_overlay": {"status": True, "variable":controller.sendTextOverlay},
"/run/shutdown": {"status": True, "variable":controller.shutdown},
"/run/swap_your_language_and_target_language": {"status": True, "variable":controller.swapYourLanguageAndTargetLanguage}, "/run/swap_your_language_and_target_language": {"status": True, "variable":controller.swapYourLanguageAndTargetLanguage},
"/run/update_software": {"status": True, "variable":controller.updateSoftware}, "/run/update_software": {"status": True, "variable":controller.updateSoftware},
@@ -460,20 +462,14 @@ class Main:
"""Read lines from stdin, parse JSON and enqueue requests. """Read lines from stdin, parse JSON and enqueue requests.
Uses blocking readline but honors stop via _stop_event checked between reads. Uses blocking readline but honors stop via _stop_event checked between reads.
EOF on stdin indicates the frontend has closed; trigger app_closed event.
""" """
while not self._stop_event.is_set(): while not self._stop_event.is_set():
try: try:
line = sys.stdin.readline() line = sys.stdin.readline()
if not line: if not line:
# EOF reached - frontend has closed connection # EOF reached; sleep briefly and re-check stop event
# Trigger telemetry shutdown to send app_closed event time.sleep(0.1)
printLog("Frontend disconnected (stdin EOF)", {"event": "frontend_closed"}) continue
try:
self.controller.shutdown()
except Exception:
errorLogging()
break
received_data = json.loads(line.strip()) received_data = json.loads(line.strip())
if received_data: if received_data:

View File

@@ -152,7 +152,18 @@ export const useWindow = () => {
const asyncMinimizeApp = async () => { const asyncMinimizeApp = async () => {
await appWindow.minimize(); await appWindow.minimize();
}; };
const asyncCloseApp = async () => { const asyncCloseApp = async () => {
// Send shutdown signal to backend before closing the app
// This ensures telemetry app_closed event is sent and flushed
// Note: Don't await this call, let it run in background (fire-and-forget)
asyncStdoutToPython("/run/shutdown");
// Give backend time to process shutdown and flush telemetry
// Tauri sidecar will be terminated when UI closes, so timing is critical
await new Promise(resolve => setTimeout(resolve, 2000));
// Now close the UI window (this will also terminate the backend sidecar)
await appWindow.close(); await appWindow.close();
}; };