diff --git a/internal/idlewatcher/html/loading.js b/internal/idlewatcher/html/loading.js index 4a5cbd88..42ec7a15 100644 --- a/internal/idlewatcher/html/loading.js +++ b/internal/idlewatcher/html/loading.js @@ -1,6 +1,26 @@ +/** + * @typedef {"debug"|"info"|"warn"|"error"} EventLevel + * @see goutils/events/level.go + */ + +/** + * @typedef {{ message?: string, error?: string }} WakeEvent + * @see internal/idlewatcher/events.go WakeEvent + */ + +/** + * @typedef {"starting"|"waking_dep"|"dep_ready"|"container_woke"|"waiting_ready"|"ready"|"error"} WakeEventType + * @see internal/idlewatcher/events.go WakeEventType + */ + +/** + * @typedef {{ timestamp: string, level: EventLevel, category: string, action: WakeEventType, data: WakeEvent }} WakeSSEEvent + * @see goutils/events/event.go Event + */ + let ready = false; -window.onload = async function () { +window.onload = async () => { const consoleEl = document.getElementById("console"); const loadingDotsEl = document.getElementById("loading-dots"); @@ -9,6 +29,10 @@ window.onload = async function () { return; } + /** + * @param {string} timestamp - ISO timestamp string + * @returns {string} + */ function formatTimestamp(timestamp) { const date = new Date(timestamp); return date.toLocaleTimeString("en-US", { @@ -20,6 +44,11 @@ window.onload = async function () { }); } + /** + * @param {string} type - Console line type (e.g. ready, error, or WakeEventType) + * @param {string} message + * @param {string} timestamp - ISO timestamp string + */ function addConsoleLine(type, message, timestamp) { const line = document.createElement("div"); line.className = `console-line ${type}`; @@ -62,14 +91,15 @@ window.onload = async function () { // Connect to SSE endpoint const eventSource = new EventSource(wakeEventsPath); - eventSource.onmessage = function (event) { + eventSource.onmessage = (event) => { + /** @type {WakeSSEEvent} */ let evt; try { evt = JSON.parse(event.data); - } catch (error) { + } catch { addConsoleLine( "error", - "Invalid event data: " + event.data, + `Invalid event data: ${event.data}`, new Date().toISOString(), ); return; @@ -95,13 +125,12 @@ window.onload = async function () { eventSource.close(); } else { // Show other message types - const message = - payload.message || `${evt.category || "idlewatcher"}: ${type}`; + const message = payload.message; addConsoleLine(type, message, timestamp); } }; - eventSource.onerror = function (event) { + eventSource.onerror = () => { if (ready) { // event will be closed by the server return;