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

Replace HEAD probe with EventSource readyState check to properly
detect 404 vs connection drop. HEAD requests to SSE endpoints may
not behave reliably across all setups.

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:57:19 +01:00
parent dba2f0a9fb
commit 2feecbfe4f
@@ -1133,37 +1133,33 @@ function updateDecodeStatus(text) {
}
function connectDecode() {
if (decodeSource) { decodeSource.close(); }
// 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 = 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 = 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;
};
decodeSource.onerror = () => {
// readyState CLOSED (2) = server rejected (404/error), CONNECTING (0) = temporary drop
const wasClosed = decodeSource.readyState === 2;
decodeSource.close();
decodeConnected = false;
if (wasClosed) {
updateDecodeStatus("Decode not available (check client audio config)");
setTimeout(connectDecode, 10000);
} else {
updateDecodeStatus("Decode disconnected, retrying…");
setTimeout(connectDecode, 5000);
};
}).catch(() => {
updateDecodeStatus("Decode endpoint unreachable");
setTimeout(connectDecode, 5000);
});
}
};
}
connectDecode();