diff --git a/src/cli/daemon-cli/shared.ts b/src/cli/daemon-cli/shared.ts index c5decd0dd..a2c587697 100644 --- a/src/cli/daemon-cli/shared.ts +++ b/src/cli/daemon-cli/shared.ts @@ -4,10 +4,13 @@ import { resolveGatewayWindowsTaskName, } from "../../daemon/constants.js"; import { resolveGatewayLogPaths } from "../../daemon/launchd.js"; +import { formatRuntimeStatus } from "../../daemon/runtime-format.js"; import { pickPrimaryLanIPv4 } from "../../gateway/net.js"; import { getResolvedLoggerSettings } from "../../logging.js"; import { formatCliCommand } from "../command-format.js"; +export { formatRuntimeStatus }; + export function parsePort(raw: unknown): number | null { if (raw === undefined || raw === null) { return null; @@ -106,53 +109,6 @@ export function normalizeListenerAddress(raw: string): string { return value.trim(); } -export function formatRuntimeStatus( - runtime: - | { - status?: string; - state?: string; - subState?: string; - pid?: number; - lastExitStatus?: number; - lastExitReason?: string; - lastRunResult?: string; - lastRunTime?: string; - detail?: string; - } - | undefined, -) { - if (!runtime) { - return null; - } - const status = runtime.status ?? "unknown"; - const details: string[] = []; - if (runtime.pid) { - details.push(`pid ${runtime.pid}`); - } - if (runtime.state && runtime.state.toLowerCase() !== status) { - details.push(`state ${runtime.state}`); - } - if (runtime.subState) { - details.push(`sub ${runtime.subState}`); - } - if (runtime.lastExitStatus !== undefined) { - details.push(`last exit ${runtime.lastExitStatus}`); - } - if (runtime.lastExitReason) { - details.push(`reason ${runtime.lastExitReason}`); - } - if (runtime.lastRunResult) { - details.push(`last run ${runtime.lastRunResult}`); - } - if (runtime.lastRunTime) { - details.push(`last run time ${runtime.lastRunTime}`); - } - if (runtime.detail) { - details.push(runtime.detail); - } - return details.length > 0 ? `${status} (${details.join(", ")})` : status; -} - export function renderRuntimeHints( runtime: { missingUnit?: boolean; status?: string } | undefined, env: NodeJS.ProcessEnv = process.env, diff --git a/src/commands/doctor-format.ts b/src/commands/doctor-format.ts index a99a155aa..25eee7d16 100644 --- a/src/commands/doctor-format.ts +++ b/src/commands/doctor-format.ts @@ -6,6 +6,7 @@ import { resolveGatewayWindowsTaskName, } from "../daemon/constants.js"; import { resolveGatewayLogPaths } from "../daemon/launchd.js"; +import { formatRuntimeStatus } from "../daemon/runtime-format.js"; import { isSystemdUnavailableDetail, renderSystemdUnavailableHints, @@ -21,36 +22,7 @@ type RuntimeHintOptions = { export function formatGatewayRuntimeSummary( runtime: GatewayServiceRuntime | undefined, ): string | null { - if (!runtime) { - return null; - } - const status = runtime.status ?? "unknown"; - const details: string[] = []; - if (runtime.pid) { - details.push(`pid ${runtime.pid}`); - } - if (runtime.state && runtime.state.toLowerCase() !== status) { - details.push(`state ${runtime.state}`); - } - if (runtime.subState) { - details.push(`sub ${runtime.subState}`); - } - if (runtime.lastExitStatus !== undefined) { - details.push(`last exit ${runtime.lastExitStatus}`); - } - if (runtime.lastExitReason) { - details.push(`reason ${runtime.lastExitReason}`); - } - if (runtime.lastRunResult) { - details.push(`last run ${runtime.lastRunResult}`); - } - if (runtime.lastRunTime) { - details.push(`last run time ${runtime.lastRunTime}`); - } - if (runtime.detail) { - details.push(runtime.detail); - } - return details.length > 0 ? `${status} (${details.join(", ")})` : status; + return formatRuntimeStatus(runtime); } export function buildGatewayRuntimeHints( diff --git a/src/daemon/runtime-format.ts b/src/daemon/runtime-format.ts new file mode 100644 index 000000000..043760b77 --- /dev/null +++ b/src/daemon/runtime-format.ts @@ -0,0 +1,44 @@ +export type ServiceRuntimeLike = { + status?: string; + state?: string; + subState?: string; + pid?: number; + lastExitStatus?: number; + lastExitReason?: string; + lastRunResult?: string; + lastRunTime?: string; + detail?: string; +}; + +export function formatRuntimeStatus(runtime: ServiceRuntimeLike | undefined): string | null { + if (!runtime) { + return null; + } + const status = runtime.status ?? "unknown"; + const details: string[] = []; + if (runtime.pid) { + details.push(`pid ${runtime.pid}`); + } + if (runtime.state && runtime.state.toLowerCase() !== status) { + details.push(`state ${runtime.state}`); + } + if (runtime.subState) { + details.push(`sub ${runtime.subState}`); + } + if (runtime.lastExitStatus !== undefined) { + details.push(`last exit ${runtime.lastExitStatus}`); + } + if (runtime.lastExitReason) { + details.push(`reason ${runtime.lastExitReason}`); + } + if (runtime.lastRunResult) { + details.push(`last run ${runtime.lastRunResult}`); + } + if (runtime.lastRunTime) { + details.push(`last run time ${runtime.lastRunTime}`); + } + if (runtime.detail) { + details.push(runtime.detail); + } + return details.length > 0 ? `${status} (${details.join(", ")})` : status; +}