import type { ServiceWidget } from "@/lib/config/schema"; import type { ServiceStat, ServiceWidgetResult } from "@/lib/types/service-result"; import { collectDockerContainer, dockerLimit } from "./docker"; import { collectGitea } from "./services/gitea"; import { collectCoolify } from "./services/coolify"; import { collectImmich } from "./services/immich"; import { collectN8n } from "./services/n8n"; import { collectUmami } from "./services/umami"; import { collectHeadscale } from "./services/headscale"; function collectServiceStat(widget: ServiceWidget): Promise<{ stats: ServiceStat[]; detail?: string[] }> { switch (widget.service) { case "gitea": return collectGitea(widget); case "coolify": return collectCoolify(widget); case "immich": return collectImmich(widget); case "n8n": return collectN8n(widget); case "umami": return collectUmami(widget); case "headscale": return collectHeadscale(widget); } } export async function collectService(widget: ServiceWidget): Promise { const dockerPromise = dockerLimit(() => collectDockerContainer(widget.containerName, widget.showStats)); // A failed service-API call (bad token, service down) must not take out the // docker health readout too - the two are independent failure modes and // merging them into one card should not let one mask the other. const statPromise = collectServiceStat(widget).catch((err) => ({ stats: [] as ServiceStat[], statError: (err as Error).message, })); const [docker, statResult] = await Promise.all([dockerPromise, statPromise]); return { docker, ...statResult }; }