From bf61d94083ab4b63de05927e2903c19cd23b9bc8 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 15 Feb 2026 16:49:38 +0000 Subject: [PATCH] refactor(cli): dedupe daemon install finalize --- src/cli/daemon-cli/install.ts | 45 +++++++++++++++----------------- src/cli/daemon-cli/response.ts | 29 +++++++++++++++++++++ src/cli/node-cli/daemon.ts | 47 +++++++++++++++------------------- 3 files changed, 70 insertions(+), 51 deletions(-) diff --git a/src/cli/daemon-cli/install.ts b/src/cli/daemon-cli/install.ts index 112b4fa274..c29462d4ec 100644 --- a/src/cli/daemon-cli/install.ts +++ b/src/cli/daemon-cli/install.ts @@ -16,7 +16,11 @@ import { resolveGatewayService } from "../../daemon/service.js"; import { resolveGatewayAuth } from "../../gateway/auth.js"; import { defaultRuntime } from "../../runtime.js"; import { formatCliCommand } from "../command-format.js"; -import { buildDaemonServiceSnapshot, createDaemonActionContext } from "./response.js"; +import { + buildDaemonServiceSnapshot, + createDaemonActionContext, + installDaemonServiceAndEmit, +} from "./response.js"; import { parsePort } from "./shared.js"; export async function runDaemonInstall(opts: DaemonInstallOptions) { @@ -154,29 +158,20 @@ export async function runDaemonInstall(opts: DaemonInstallOptions) { config: cfg, }); - try { - await service.install({ - env: process.env, - stdout, - programArguments, - workingDirectory, - environment, - }); - } catch (err) { - fail(`Gateway install failed: ${String(err)}`); - return; - } - - let installed = true; - try { - installed = await service.isLoaded({ env: process.env }); - } catch { - installed = true; - } - emit({ - ok: true, - result: "installed", - service: buildDaemonServiceSnapshot(service, installed), - warnings: warnings.length ? warnings : undefined, + await installDaemonServiceAndEmit({ + serviceNoun: "Gateway", + service, + warnings, + emit, + fail, + install: async () => { + await service.install({ + env: process.env, + stdout, + programArguments, + workingDirectory, + environment, + }); + }, }); } diff --git a/src/cli/daemon-cli/response.ts b/src/cli/daemon-cli/response.ts index 13dd4f2606..7b6f6d2a07 100644 --- a/src/cli/daemon-cli/response.ts +++ b/src/cli/daemon-cli/response.ts @@ -79,3 +79,32 @@ export function createDaemonActionContext(params: { action: DaemonAction; json: return { stdout, warnings, emit, fail }; } + +export async function installDaemonServiceAndEmit(params: { + serviceNoun: string; + service: GatewayService; + warnings: string[]; + emit: (payload: Omit) => void; + fail: (message: string, hints?: string[]) => void; + install: () => Promise; +}) { + try { + await params.install(); + } catch (err) { + params.fail(`${params.serviceNoun} install failed: ${String(err)}`); + return; + } + + let installed = true; + try { + installed = await params.service.isLoaded({ env: process.env }); + } catch { + installed = true; + } + params.emit({ + ok: true, + result: "installed", + service: buildDaemonServiceSnapshot(params.service, installed), + warnings: params.warnings.length ? params.warnings : undefined, + }); +} diff --git a/src/cli/node-cli/daemon.ts b/src/cli/node-cli/daemon.ts index 2c2418fb24..35d579ca9e 100644 --- a/src/cli/node-cli/daemon.ts +++ b/src/cli/node-cli/daemon.ts @@ -22,7 +22,11 @@ import { runServiceStop, runServiceUninstall, } from "../daemon-cli/lifecycle-core.js"; -import { buildDaemonServiceSnapshot, createDaemonActionContext } from "../daemon-cli/response.js"; +import { + buildDaemonServiceSnapshot, + createDaemonActionContext, + installDaemonServiceAndEmit, +} from "../daemon-cli/response.js"; import { formatRuntimeStatus, parsePort } from "../daemon-cli/shared.js"; type NodeDaemonInstallOptions = { @@ -160,31 +164,22 @@ export async function runNodeDaemonInstall(opts: NodeDaemonInstallOptions) { }, }); - try { - await service.install({ - env: process.env, - stdout, - programArguments, - workingDirectory, - environment, - description, - }); - } catch (err) { - fail(`Node install failed: ${String(err)}`); - return; - } - - let installed = true; - try { - installed = await service.isLoaded({ env: process.env }); - } catch { - installed = true; - } - emit({ - ok: true, - result: "installed", - service: buildDaemonServiceSnapshot(service, installed), - warnings: warnings.length ? warnings : undefined, + await installDaemonServiceAndEmit({ + serviceNoun: "Node", + service, + warnings, + emit, + fail, + install: async () => { + await service.install({ + env: process.env, + stdout, + programArguments, + workingDirectory, + environment, + description, + }); + }, }); }