[feat](trx-frontend-http): consume server-side APRS/CW decode via SSE

Add /decode SSE endpoint streaming decoded messages from the server.
Add decode channel OnceLock with set/subscribe pattern.

In the browser, connect to /decode EventSource and dispatch to
onServerAprs/onServerCw handlers.  APRS and CW plugins now receive
server-decoded data automatically while keeping browser-side decoding
as a fallback.

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:28:56 +01:00
parent 50e1c44722
commit 998f454a3e
6 changed files with 149 additions and 3 deletions
@@ -1122,6 +1122,30 @@ volWheel(txVolSlider, txVolPct, () => txGainNode, "txVol");
document.getElementById("copyright-year").textContent = new Date().getFullYear();
// --- Server-side decode SSE ---
let decodeSource = null;
let decodeConnected = false;
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
}
};
decodeSource.onerror = () => {
decodeSource.close();
decodeConnected = false;
setTimeout(connectDecode, 5000);
};
}
connectDecode();
// Release PTT on page unload to prevent stuck transmit
window.addEventListener("beforeunload", () => {
if (txActive) {