toes start/stop/restart feedback

This commit is contained in:
Chris Wanstrath 2026-02-12 12:36:42 -08:00
parent ecac19a07f
commit 75af5f3d31

View File

@ -16,6 +16,24 @@ export const STATE_ICONS: Record<string, string> = {
invalid: color.red('◌'), invalid: color.red('◌'),
} }
const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms))
async function waitForState(name: string, target: string, timeout: number): Promise<string | undefined> {
const start = Date.now()
while (Date.now() - start < timeout) {
await sleep(500)
const app: App | undefined = await get(`/api/apps/${name}`)
if (!app) return undefined
if (app.state === target) return target
// Terminal failure states — stop polling
if (target === 'running' && (app.state === 'stopped' || app.state === 'invalid')) return app.state
if (target === 'stopped' && app.state === 'invalid') return app.state
}
// Timed out — return last known state
const app: App | undefined = await get(`/api/apps/${name}`)
return app?.state
}
export async function configShow() { export async function configShow() {
console.log(`Host: ${color.bold(HOST)}`) console.log(`Host: ${color.bold(HOST)}`)
@ -232,7 +250,15 @@ export async function renameApp(arg: string | undefined, newName: string) {
export async function restartApp(arg?: string) { export async function restartApp(arg?: string) {
const name = resolveAppName(arg) const name = resolveAppName(arg)
if (!name) return if (!name) return
await post(`/api/apps/${name}/restart`) const result = await post(`/api/apps/${name}/restart`)
if (!result) return
process.stdout.write(`${color.yellow('↻')} Restarting ${color.bold(name)}...`)
const state = await waitForState(name, 'running', 15000)
if (state === 'running') {
console.log(` ${color.green('running')}`)
} else {
console.log(` ${color.red(state ?? 'unknown')}`)
}
} }
export async function rmApp(arg?: string) { export async function rmApp(arg?: string) {
@ -264,11 +290,28 @@ export async function rmApp(arg?: string) {
export async function startApp(arg?: string) { export async function startApp(arg?: string) {
const name = resolveAppName(arg) const name = resolveAppName(arg)
if (!name) return if (!name) return
await post(`/api/apps/${name}/start`) const result = await post(`/api/apps/${name}/start`)
if (!result) return
process.stdout.write(`${color.green('▶')} Starting ${color.bold(name)}...`)
const state = await waitForState(name, 'running', 15000)
if (state === 'running') {
console.log(` ${color.green('running')}`)
} else {
console.log(` ${color.red(state ?? 'unknown')}`)
}
} }
export async function stopApp(arg?: string) { export async function stopApp(arg?: string) {
const name = resolveAppName(arg) const name = resolveAppName(arg)
if (!name) return if (!name) return
await post(`/api/apps/${name}/stop`) const result = await post(`/api/apps/${name}/stop`)
if (!result) return
process.stdout.write(`${color.red('■')} Stopping ${color.bold(name)}...`)
const state = await waitForState(name, 'stopped', 10000)
if (state === 'stopped') {
console.log(` ${color.gray('stopped')}`)
} else {
console.log(` ${color.yellow(state ?? 'unknown')}`)
}
} }