[fix](trx-frontend-http): show decode SSE connection status

The decode EventSource silently retried on 404 leaving the status
stuck on "Waiting for server decode". Probe /decode first to
distinguish 404 (audio disabled) from real SSE errors and update
the APRS/CW status text accordingly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Stanislaw Grams <stanislawgrams@gmail.com>
This commit is contained in:
2026-02-08 22:44:21 +01:00
parent 04706151b1
commit 10c4b735cf
@@ -1125,24 +1125,45 @@ document.getElementById("copyright-year").textContent = new Date().getFullYear()
// --- Server-side decode SSE ---
let decodeSource = null;
let decodeConnected = false;
function updateDecodeStatus(text) {
const aprs = document.getElementById("aprs-status");
const cw = document.getElementById("cw-status");
if (aprs && aprs.textContent !== "Receiving") aprs.textContent = text;
if (cw && cw.textContent !== "Receiving") cw.textContent = text;
}
function connectDecode() {
if (decodeSource) { decodeSource.close(); }
decodeSource = new EventSource("/decode");
decodeSource.onopen = () => { decodeConnected = true; };
decodeSource.onmessage = (evt) => {
try {
const msg = JSON.parse(evt.data);
if (msg.type === "aprs" && window.onServerAprs) window.onServerAprs(msg);
if (msg.type === "cw" && window.onServerCw) window.onServerCw(msg);
} catch (e) {
// ignore parse errors
// Probe first to distinguish 404 from real SSE errors
fetch("/decode", { method: "HEAD" }).then((r) => {
if (r.status === 404) {
updateDecodeStatus("Decode not available (audio disabled?)");
setTimeout(connectDecode, 10000);
return;
}
};
decodeSource.onerror = () => {
decodeSource.close();
decodeConnected = false;
decodeSource = new EventSource("/decode");
decodeSource.onopen = () => {
decodeConnected = true;
updateDecodeStatus("Connected, listening for packets");
};
decodeSource.onmessage = (evt) => {
try {
const msg = JSON.parse(evt.data);
if (msg.type === "aprs" && window.onServerAprs) window.onServerAprs(msg);
if (msg.type === "cw" && window.onServerCw) window.onServerCw(msg);
} catch (e) {
// ignore parse errors
}
};
decodeSource.onerror = () => {
decodeSource.close();
decodeConnected = false;
updateDecodeStatus("Decode disconnected, retrying…");
setTimeout(connectDecode, 5000);
};
}).catch(() => {
updateDecodeStatus("Decode endpoint unreachable");
setTimeout(connectDecode, 5000);
};
});
}
connectDecode();