Files
MikrotikManager/backend/src/services/container-runtime-status.ts
T

27 lines
1.3 KiB
TypeScript

type Status = "running" | "stopped" | "error" | "unknown"
const flags = ["running", "stopped", "error", "failed", "extracting", "downloading", "starting", "stopping"] as const
/** RouterOS REST can expose active flags instead of the legacy status field. */
export function containerRuntimeStatus(row: Record<string, unknown>): Status {
const active = new Set<string>()
for (const flag of flags) {
const value = row[flag]
if (value === undefined) continue
if (value === true || value === "true" || value === "yes") active.add(flag)
else if (value !== false && value !== "false" && value !== "no") return "unknown"
}
if (["extracting", "downloading", "starting", "stopping"].some(flag => active.has(flag))) return "unknown"
const states: Status[] = []
if (active.has("running")) states.push("running")
if (active.has("stopped")) states.push("stopped")
if (active.has("error") || active.has("failed")) states.push("error")
if (states.length > 1) return "unknown"
if (row.status !== undefined) {
if (typeof row.status !== "string") return "unknown"
const value = row.status.toLowerCase()
const legacy = value === "running" || value === "stopped" ? value : value === "error" || value === "failed" ? "error" : "unknown"
if (legacy === "unknown" || (states.length && states[0] !== legacy)) return "unknown"
return legacy
}
return states[0] ?? "unknown"
}