From ae603d440c3fd641ba98562b45a944cff89a0fbb Mon Sep 17 00:00:00 2001 From: Dottere Date: Tue, 6 Oct 2026 17:30:25 +0200 Subject: [PATCH] testing web integration --- internal/http_internal/ssehandler.go | 2 +- web/index.html | 6 +++ web/js/script.js | 76 ++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 web/js/script.js diff --git a/internal/http_internal/ssehandler.go b/internal/http_internal/ssehandler.go index 0cb6a88..ef99950 100644 --- a/internal/http_internal/ssehandler.go +++ b/internal/http_internal/ssehandler.go @@ -24,7 +24,7 @@ func SSEHandler(w http.ResponseWriter, r *http.Request) { clientGone := r.Context().Done() // Channel to signal client disconnection rc := http.NewResponseController(w) - t := time.NewTicker(time.Second * 5) + t := time.NewTicker(time.Millisecond * 1000) defer t.Stop() for { select { diff --git a/web/index.html b/web/index.html index fe810b2..17fabec 100644 --- a/web/index.html +++ b/web/index.html @@ -4,8 +4,14 @@ Document +

Hello world!

+

Waiting for load data...

+

Waiting for usage data...

+

Waiting for memory data...

+

Waiting for temperature data...

+

Waiting for uptime data...

diff --git a/web/js/script.js b/web/js/script.js new file mode 100644 index 0000000..93cc4f2 --- /dev/null +++ b/web/js/script.js @@ -0,0 +1,76 @@ +const baseUrl = window.location + +const eventSource = new EventSource(baseUrl + "/api/events") + +let prevCPUIdle = 0 +let prevCPUKernel = 0 +let prevCPUUser = 0 + +eventSource.onmessage = function (event) { + const data = JSON.parse(event.data) + + const GB = 1024 * 1024 * 1024 + + let currentCPUIdle = data.processor_info.IdleTimeSinceBoot + let currentCPUKernel = data.processor_info.KernelTimeSinceBoot + let currentCPUUser = data.processor_info.UserTimeSinceBoot + + document.getElementById("cpu-load").innerText = data.load_average.Load1.toFixed(2) + " " + data.load_average.Load5.toFixed(2) + " " + data.load_average.Load15.toFixed(2) + document.getElementById("cpu-usage").innerText = calculateCPUUsage(currentCPUIdle, currentCPUKernel, currentCPUUser).toFixed(2) + "%" + document.getElementById("memory").innerText = ((data.memory_info.SystemMemory - data.memory_info.AvailableMemory) / GB).toFixed(2) + "/" + (data.memory_info.SystemMemory / GB).toFixed(2) + document.getElementById("temperature").innerText = checkTemperatureAvailability(data.temperature_info) + document.getElementById("uptime").innerText = formatUptime(data.uptime_info) +} + +function calculateCPUUsage(currentIdle, currentKernel, currentUser) { + if (prevCPUIdle === 0 || prevCPUKernel === 0 || prevCPUUser === 0) { + prevCPUIdle = currentIdle + prevCPUKernel = currentKernel + prevCPUUser = currentUser + + return 0 + } + + deltaIdle = currentIdle - prevCPUIdle + deltaKernel = currentKernel - prevCPUKernel + deltaUser = currentUser - prevCPUUser + + deltaTotal = deltaIdle + deltaKernel + deltaUser + + totalCPUUsage = ((deltaKernel + deltaUser) / deltaTotal) * 100 + + prevCPUIdle = currentIdle + prevCPUKernel = currentKernel + prevCPUUser = currentUser + + return totalCPUUsage +} + +function checkTemperatureAvailability(temperatureStruct) { + if (temperatureStruct.Supported) { + return temperatureStruct.Celsius + "C°" + } else { + return "Unsupported" + } +} + +function formatUptime(uptimeStruct) { + total = Math.round(uptimeStruct.Uptime) + if (total < 60) { + return Math.floor(total) + } + s = total % 60 + m = (total / 60) % 60 + + if (total < 3000) { + return Math.floor(m)+":"+String(Math.floor(s)).padStart(2, '0') + } + + h = (total / 3600) % 24 + if (total < 86400) { + return Math.floor(h)+":"+String(Math.floor(m)).padStart(2, '0')+":"+String(Math.floor(s)).padStart(2, '0') + } + + d = total / 86400 + return Math.floor(d)+":"+String(Math.floor(h)).padStart(2, '0')+":"+String(Math.floor(m)).padStart(2, '0')+":"+String(Math.floor(s)).padStart(2, '0') +}