const serviceMap = new Map(); async function getServices() { const url = "api/services"; try { const response = await fetch(url); if (!response.ok) { throw new Error(`Response status: ${response.status}`); } const json = await response.json(); return json; } catch (error) { console.error(error.message); } } function updateStatus() { const statusElm = document.getElementById("status"); const issuesElm = document.getElementById("issues"); const issues = [...serviceMap.values()].filter((s) => !s).length; issuesElm.textContent = `${issues} issue(s) detected`; if (issues) { statusElm.setAttribute("class", "error"); } else { statusElm.setAttribute("class", "ok"); } } function updateService(name, node, status) { switch (status.status) { case "ok": node.textContent = "Ok"; node.setAttribute("class", "ok"); serviceMap.set(name, true); break; case "error": node.textContent = "Error"; node.title = status.output; node.setAttribute("class", "error"); serviceMap.set(name, false); break; } updateStatus(); } getServices().then((services) => { const evtSource = new EventSource("sse"); evtSource.onmessage = (event) => { console.log(event) }; for (const [service, status] of Object.entries(services)) { const table = document.getElementById("services"); const row = table.insertRow(); const nameNode = row.insertCell(); nameNode.textContent = service; const node = row.insertCell(); updateService(service, node, status); const evtSource = new EventSource(`sse/${service}`); evtSource.addEventListener("ok", (event) => { node.textContent = "Ok"; node.setAttribute("class", "ok"); serviceMap.set(name, true); }); evtSource.addEventListener("error", (event) => { node.textContent = "Error"; node.title = event.data; node.setAttribute("class", "error"); serviceMap.set(name, false); }); } });