import { Http } from "./Http.js"; class ServiceMonitor { constructor() { this.pollInterval = 5000; } start() { this.pollServices(); setInterval(() => this.pollServices(), this.pollInterval); } formatDate(isoStr, includeTime) { if (!isoStr) return "-"; try { const d = new Date(isoStr); if (isNaN(d.getTime())) return isoStr.slice(0, 19); const dd = String(d.getDate()).padStart(2, "0"); const mm = String(d.getMonth() + 1).padStart(2, "0"); const yyyy = d.getFullYear(); if (includeTime) { const hh = String(d.getHours()).padStart(2, "0"); const mi = String(d.getMinutes()).padStart(2, "0"); return `${dd}/${mm}/${yyyy} ${hh}:${mi}`; } return `${dd}/${mm}/${yyyy}`; } catch { return isoStr.slice(0, 19); } } async pollServices() { try { const data = await Http.getJson("/admin/services/data"); const container = document.getElementById("services-list"); if (!container) return; for (const svc of data.services) { const card = container.querySelector(`.service-card[data-service="${svc.name}"]`); if (!card) continue; const statusEl = card.querySelector(".service-status"); if (statusEl) { statusEl.textContent = svc.status; statusEl.className = "service-status " + svc.status; } const metaItems = card.querySelectorAll(".meta-item"); if (metaItems.length >= 3) { metaItems[0].textContent = "Uptime: " + (svc.uptime || "-"); metaItems[1].textContent = "Last run: " + this.formatDate(svc.last_run, true); metaItems[2].textContent = "Next run: " + this.formatDate(svc.next_run, true); } const logPre = card.querySelector(".log-output"); if (logPre) { logPre.textContent = (svc.log_buffer || []).map((l) => l + "\n").join("") || "No log entries yet.\n"; } } } catch { // silently ignore poll errors } } } window.ServiceMonitor = ServiceMonitor;