| 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<unknown>, |
| ): (args: GatewayServiceInstallArgs) => Promise<void> { |
| return async (args) => { |
| await install(args); |
| }; |
| } |
|
|
| export type GatewayService = { |
| label: string; |
| loadedText: string; |
| notLoadedText: string; |
| install: (args: GatewayServiceInstallArgs) => Promise<void>; |
| uninstall: (args: GatewayServiceManageArgs) => Promise<void>; |
| stop: (args: GatewayServiceControlArgs) => Promise<void>; |
| restart: (args: GatewayServiceControlArgs) => Promise<GatewayServiceRestartResult>; |
| isLoaded: (args: GatewayServiceEnvArgs) => Promise<boolean>; |
| readCommand: (env: GatewayServiceEnv) => Promise<GatewayServiceCommandConfig | null>; |
| readRuntime: (env: GatewayServiceEnv) => Promise<GatewayServiceRuntime>; |
| }; |
|
|
| 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<SupportedGatewayServicePlatform, GatewayService> = { |
| 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}`); |
| } |
|
|