From 13d7a069580590c278e5b7fe9f2ee9d84f3481de Mon Sep 17 00:00:00 2001 From: accius Date: Tue, 10 Mar 2026 17:13:56 -0700 Subject: [PATCH] reapplying alans commit --- .env.example | 3 +++ server.js | 29 +++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index cd2d8b8e..b25f191f 100644 --- a/.env.example +++ b/.env.example @@ -176,6 +176,9 @@ CLASSIC_ANALOG_CLOCK=false WSJTX_ENABLED=true WSJTX_UDP_PORT=2237 +# Multicast address group for WSJTX. Leave commented if not being used +# WSJTX_MULTICAST_ADDRESS=224.0.0.1 + # Relay key for remote WSJT-X relay agent (cloud deployments) # WSJTX_RELAY_KEY=your-secret-relay-key-here diff --git a/server.js b/server.js index 065da79d..70c05855 100644 --- a/server.js +++ b/server.js @@ -11158,6 +11158,7 @@ app.get('/api/aprs/stations', (req, res) => { const WSJTX_UDP_PORT = parseInt(process.env.WSJTX_UDP_PORT || '2237'); const WSJTX_ENABLED = process.env.WSJTX_ENABLED !== 'false'; // enabled by default +const WSJTX_MULTICAST_ADDRESS = process.env.WSJTX_MULTICAST_ADDRESS; const WSJTX_RELAY_KEY = process.env.WSJTX_RELAY_KEY || ''; // auth key for remote relay agent const WSJTX_MAX_DECODES = 500; // max decodes to keep in memory const WSJTX_MAX_AGE = 60 * 60 * 1000; // 60 minutes (configurable via client) @@ -12015,7 +12016,7 @@ app.get('/api/n3fjp/qsos', (req, res) => { let wsjtxSocket = null; if (WSJTX_ENABLED) { try { - wsjtxSocket = dgram.createSocket('udp4'); + wsjtxSocket = dgram.createSocket({ type: 'udp4', reuseAddr: true }); wsjtxSocket.on('message', (buf, rinfo) => { const msg = parseWSJTXMessage(buf); @@ -12029,9 +12030,33 @@ if (WSJTX_ENABLED) { wsjtxSocket.on('listening', () => { const addr = wsjtxSocket.address(); console.log(`[WSJT-X] UDP listener on ${addr.address}:${addr.port}`); + + if (WSJTX_MULTICAST_ADDRESS) { + try { + wsjtxSocket.addMembership(WSJTX_MULTICAST_ADDRESS); + console.log(`[WSJT-X] Joined multicast group ${WSJTX_MULTICAST_ADDRESS}`); + } catch (e) { + console.error(`[WSJT-X] Failed to join multicast group ${WSJTX_MULTICAST_ADDRESS}: ${e.message}`); + } + } }); - wsjtxSocket.bind(WSJTX_UDP_PORT, '0.0.0.0'); + if (WSJTX_MULTICAST_ADDRESS) { + wsjtxSocket.bind( + { + port: WSJTX_UDP_PORT, + exclusive: false, + }, + () => { + wsjtxSocket.setMulticastLoopback(true); + }, + ); + } else { + wsjtxSocket.bind({ + port: WSJTX_UDP_PORT, + address: '0.0.0.0', + }); + } } catch (e) { console.error(`[WSJT-X] Failed to start UDP listener: ${e.message}`); }