1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
const serviceMap = new Map();
async function getServices() {
const url = "api/v1/status";
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`Response status: ${response.status}`);
}
const json = await response.json();
console.log(json);
return json;
} catch (error) {
console.error(error.message);
}
}
function updateStatus() {
const issuesElm = document.getElementById("issues");
const issues = [...serviceMap.values()].filter((s) => !s).length;
issuesElm.textContent = `${issues} issue(s) detected`;
if (issues) {
issuesElm.setAttribute("class", "error");
} else {
issuesElm.setAttribute("class", "ok");
}
}
function createStatusTbody(name, data) {
const tbody = document.createElement("tbody");
const trowService = document.createElement("tr");
const tdataName = document.createElement("td");
tdataName.textContent = name;
trowService.appendChild(tdataName);
const tdataStatus = document.createElement("td");
switch (data.status) {
case "ok": {
tdataStatus.textContent = "Ok";
tdataStatus.setAttribute("class", "ok");
serviceMap.set(name, true);
break;
}
case "error": {
tdataStatus.textContent = "Error";
tdataStatus.setAttribute("class", "error");
serviceMap.set(name, false);
break;
}
}
trowService.appendChild(tdataStatus);
tbody.appendChild(trowService);
if (data.output) {
const trowOutput = document.createElement("tr");
trowOutput.setAttribute("class", "details");
const tdataOutput = document.createElement("td");
tdataOutput.textContent = data.output;
tdataOutput.setAttribute("colspan", "2");
trowOutput.appendChild(tdataOutput);
tbody.appendChild(trowOutput);
}
return tbody;
}
getServices().then((services) => {
const table = document.getElementById("services");
const evtSource = new EventSource("/api/v1/sse");
for (const [name, status] of services) {
let tbody = createStatusTbody(name, status);
table.appendChild(tbody);
evtSource.addEventListener(name, (event) => {
data = JSON.parse(event.data);
tbodyNew = createStatusTbody(name, data);
tbody.replaceWith(tbodyNew);
tbody = tbodyNew;
updateStatus();
});
}
});
|