"""SonicForge DAW — Desktop engine launcher (PyInstaller entry point). Chay FastAPI backend duoi dang tien trinh nen (sidecar) cho ban cai Standalone Windows (Tauri v2 shell). Tu chon port 8000-8010 (fallback neu bi chiem), tu thoat khi tien trinh cha (Tauri) ket thuc — Graceful Shutdown. """ import logging import os import socket import sys import threading import time PORT_RANGE = (8000, 8010) APP_DATA_DIR_NAME = "SonicForgeDAW" def _pick_port(): for port in range(PORT_RANGE[0], PORT_RANGE[1] + 1): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: s.bind(("127.0.0.1", port)) return port except OSError: continue return PORT_RANGE[0] def _parent_alive(pid): try: os.kill(pid, 0) return True except OSError: return False def main(): os.environ.setdefault("SF_DESKTOP", "1") port = _pick_port() os.environ["SF_PORT"] = str(port) # Log ra file — khi dong goi console=False, stdout khong nhin thay duoc. try: log_dir = os.path.join( os.environ.get("APPDATA") or os.path.expanduser("~"), APP_DATA_DIR_NAME, "logs", ) os.makedirs(log_dir, exist_ok=True) logging.basicConfig( level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s: %(message)s", handlers=[ logging.FileHandler(os.path.join(log_dir, "engine.log"), encoding="utf-8"), logging.StreamHandler(), ], ) except Exception: logging.basicConfig(level=logging.INFO) import uvicorn import app.main # noqa: F401 — import tuong minh de PyInstaller bundle du package app config = uvicorn.Config(app.main.app, host="127.0.0.1", port=port, log_level="info", access_log=False) server = uvicorn.Server(config) parent_pid = os.environ.get("SF_PARENT_PID") if parent_pid: def _watchdog(): pid = int(parent_pid) while True: time.sleep(1.0) if not _parent_alive(pid): logging.getLogger("desktop_engine").info( "Parent process exited — shutting down engine") server.should_exit = True return threading.Thread(target=_watchdog, daemon=True).start() logging.getLogger("desktop_engine").info( "SonicForge engine listening on 127.0.0.1:%d", port) server.run() if __name__ == "__main__": main()