一旦フロントエンドまで接続
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user