blob: 0ad7ca4768e868a3683238b2fc6a820683186783 [file]
# Copyright 2026 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from __future__ import annotations
from typing import TYPE_CHECKING
import package_server
from daemon.constants import DEFAULT_DAP_PORT, UDS_PATH
from shared.protocol import Response
from shared.protocol.start import StartRequest
if TYPE_CHECKING:
from daemon.daemon import Daemon
COMMAND_NAME = "start"
async def handle(daemon: Daemon, req: StartRequest) -> Response:
async with daemon._start_lock:
if resp := daemon._check_already_running(req):
return resp
if req.port is not None:
daemon.port = req.port
elif daemon.port is None:
daemon.port = DEFAULT_DAP_PORT
daemon.connect_to_existing = req.connect
startup_success = False
try:
if not daemon.connect_to_existing:
if err_resp := await daemon._start_dap_server():
return err_resp
# Now connect to the DAP server
connected = await daemon._connect_to_dap()
if not connected:
return Response(
success=False, message="Failed to connect to DAP server"
)
startup_success = True
return Response(success=True, body={"uds_path": str(UDS_PATH)})
finally:
if not startup_success:
for task in daemon.background_tasks:
task.cancel()
daemon.background_tasks.clear()
if daemon.zxdb_writer:
daemon.zxdb_writer.close()
try:
await daemon.zxdb_writer.wait_closed()
except Exception:
pass
daemon.zxdb_writer = None
if daemon.dap_proc:
daemon.dap_proc.terminate()
daemon.dap_proc = None
if daemon.package_server_proc:
daemon.package_server_proc.terminate()
await daemon.package_server_proc.wait()
daemon.package_server_proc = None
if daemon.repo_name:
await package_server.stop(daemon.repo_name)
daemon.repo_name = None