aboutsummaryrefslogtreecommitdiff
path: root/src/webui_live.js
blob: 2096e4ed7a1276acc18dd3d0db7ce4d9104dd5f4 (plain)
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
/// <reference lib="dom" />

const ws = new WebSocket("/webui_ws")
ws.onopen = () => console.log("ws open");
ws.onerror = () => console.warn("ws error");
ws.onclose = () => {
    console.warn("ws close");
    document.body.innerHTML +=
        `<p style="position:absolute;top:10px;left:10px;font-size:larger;background-color:red;padding:1em;">Websocket connection lost.</p>`
    setTimeout(() => globalThis.location.reload(), 500)
}
ws.onmessage = ev => {
    const u = JSON.parse(ev.data)
    if (u.t == "update_worker") {
        const e = document.getElementById(`worker-${u.id}`)
        if (e) e.outerHTML = u.html
        else document.querySelector("#workers > ul").innerHTML += u.html
    } else if (u.t == "remove_worker") {
        document.getElementById(`worker-${u.id}`)?.remove()
    } else if (u.t == "update_task") {
        const e = document.getElementById(u.key)
        const parent_id = u.bin == "queue" ? "bin-queue" : u.bin == "loading" ? "bin-loading" : "bin-complete"
        const parent = document.querySelector(`#${parent_id} > ul`)
        if (e && e.parentElement == parent) e.outerHTML = u.html
        else {
            e?.remove()
            // prevent adding thousands of tasks
            // TODO maybe do this server-sided
            if (parent.children.length < 256)
                parent.innerHTML += u.html
        }
    } else if (u.t == "remove_task") {
        document.getElementById(u.key)?.remove()
    } else if (u.t == "counters") {
        document.querySelector("#bin-queue .count").textContent = `${u.queue} tasks`
        document.querySelector("#bin-loading .count").textContent = `${u.loading} tasks`
        document.querySelector("#bin-complete .count").textContent = `${u.complete} tasks`
    }
}