import { installLaunchAgent, isLaunchAgentLoaded, readLaunchAgentProgramArguments, readLaunchAgentRuntime, restartLaunchAgent, stopLaunchAgent, uninstallLaunchAgent, } from "./launchd.js"; import { installScheduledTask, isScheduledTaskInstalled, readScheduledTaskCommand, readScheduledTaskRuntime, restartScheduledTask, stopScheduledTask, uninstallScheduledTask, } from "./schtasks.js"; import type { GatewayServiceRuntime } from "./service-runtime.js"; import type { GatewayServiceCommandConfig, GatewayServiceControlArgs, GatewayServiceEnv, GatewayServiceEnvArgs, GatewayServiceInstallArgs, GatewayServiceManageArgs, GatewayServiceRestartResult, } from "./service-types.js"; import { installSystemdService, isSystemdServiceEnabled, readSystemdServiceExecStart, readSystemdServiceRuntime, restartSystemdService, stopSystemdService, uninstallSystemdService, } from "./systemd.js"; export type { GatewayServiceCommandConfig, GatewayServiceControlArgs, GatewayServiceEnv, GatewayServiceEnvArgs, GatewayServiceInstallArgs, GatewayServiceManageArgs, GatewayServiceRestartResult, } from "./service-types.js"; function ignoreInstallResult( install: (args: GatewayServiceInstallArgs) => Promise, ): (args: GatewayServiceInstallArgs) => Promise { return async (args) => { await install(args); }; } export type GatewayService = { label: string; loadedText: string; notLoadedText: string; install: (args: GatewayServiceInstallArgs) => Promise; uninstall: (args: GatewayServiceManageArgs) => Promise; stop: (args: GatewayServiceControlArgs) => Promise; restart: (args: GatewayServiceControlArgs) => Promise; isLoaded: (args: GatewayServiceEnvArgs) => Promise; readCommand: (env: GatewayServiceEnv) => Promise; readRuntime: (env: GatewayServiceEnv) => Promise; }; export function describeGatewayServiceRestart( serviceNoun: string, result: GatewayServiceRestartResult, ): { scheduled: boolean; daemonActionResult: "restarted" | "scheduled"; message: string; progressMessage: string; } { if (result.outcome === "scheduled") { return { scheduled: true, daemonActionResult: "scheduled", message: `restart scheduled, ${serviceNoun.toLowerCase()} will restart momentarily`, progressMessage: `${serviceNoun} service restart scheduled.`, }; } return { scheduled: false, daemonActionResult: "restarted", message: `${serviceNoun} service restarted.`, progressMessage: `${serviceNoun} service restarted.`, }; } type SupportedGatewayServicePlatform = "darwin" | "linux" | "win32"; const GATEWAY_SERVICE_REGISTRY: Record = { darwin: { label: "LaunchAgent", loadedText: "loaded", notLoadedText: "not loaded", install: ignoreInstallResult(installLaunchAgent), uninstall: uninstallLaunchAgent, stop: stopLaunchAgent, restart: restartLaunchAgent, isLoaded: isLaunchAgentLoaded, readCommand: readLaunchAgentProgramArguments, readRuntime: readLaunchAgentRuntime, }, linux: { label: "systemd", loadedText: "enabled", notLoadedText: "disabled", install: ignoreInstallResult(installSystemdService), uninstall: uninstallSystemdService, stop: stopSystemdService, restart: restartSystemdService, isLoaded: isSystemdServiceEnabled, readCommand: readSystemdServiceExecStart, readRuntime: readSystemdServiceRuntime, }, win32: { label: "Scheduled Task", loadedText: "registered", notLoadedText: "missing", install: ignoreInstallResult(installScheduledTask), uninstall: uninstallScheduledTask, stop: stopScheduledTask, restart: restartScheduledTask, isLoaded: isScheduledTaskInstalled, readCommand: readScheduledTaskCommand, readRuntime: readScheduledTaskRuntime, }, }; function isSupportedGatewayServicePlatform( platform: NodeJS.Platform, ): platform is SupportedGatewayServicePlatform { return Object.hasOwn(GATEWAY_SERVICE_REGISTRY, platform); } export function resolveGatewayService(): GatewayService { if (isSupportedGatewayServicePlatform(process.platform)) { return GATEWAY_SERVICE_REGISTRY[process.platform]; } throw new Error(`Gateway service install not supported on ${process.platform}`); }