diff --git a/index.js b/index.js index 4fdb002..baafd06 100644 --- a/index.js +++ b/index.js @@ -1,10 +1 @@ -require('./server/index.js'); - -/** - * FM-DX Webserver - * - * Github repo: https://github.com/KubaPro010/fm-dx-webserver - * Server files: /server - * Client files (web): /web - * Plugin files: /plugins - */ \ No newline at end of file +require('./server/index.js'); \ No newline at end of file diff --git a/server/chat.js b/server/chat.js index 2b0cff2..4773e55 100644 --- a/server/chat.js +++ b/server/chat.js @@ -19,11 +19,6 @@ function createChatServer(storage) { const clientIp = helpers.getIpAddress(request); const userCommandHistory = {}; - if (serverConfig.webserver.banlist?.includes(clientIp)) { - ws.close(1008, 'Banned IP'); - return; - } - // Send chat history safely storage.chatHistory.forEach((message) => { const historyMessage = { ...message, history: true }; @@ -77,7 +72,10 @@ function createChatServer(storage) { const now = new Date(); messageData.time = String(now.getHours()).padStart(2, '0') + ":" + String(now.getMinutes()).padStart(2, '0'); - if (serverConfig.webserver.banlist?.includes(clientIp)) return; + if (serverConfig.webserver.banlist?.includes(clientIp)) { + ws.close(1008, 'Banned IP'); + return; + } if (request.session?.isAdminAuthenticated === true) messageData.admin = true; if (messageData.nickname?.length > 32) messageData.nickname = messageData.nickname.substring(0, 32); diff --git a/server/endpoints.js b/server/endpoints.js index 2c09df1..9bd3485 100644 --- a/server/endpoints.js +++ b/server/endpoints.js @@ -7,7 +7,7 @@ const path = require('path'); const https = require('https'); // File Imports -const { parseAudioDevice } = require('./stream/parser'); +const parseAudioDevice = require('./stream/parser'); const { configName, serverConfig, configUpdate, configSave, configExists, configPath } = require('./server_config'); const helpers = require('./helpers'); const storage = require('./storage'); diff --git a/server/index.js b/server/index.js index d6bcfb0..d95a99f 100644 --- a/server/index.js +++ b/server/index.js @@ -42,7 +42,7 @@ const plugins = findServerFiles(serverConfig.plugins); if (plugins.length > 0) { setTimeout(() => { startPluginsWithDelay(plugins, 3000); // Start plugins with 3 seconds interval - }, 3000); // Initial delay of 3 seconds for the first plugin + }, 4000); // Initial delay of 4 seconds for the first plugin } const terminalWidth = readline.createInterface({input: process.stdin, output: process.stdout}).output.columns; @@ -52,8 +52,7 @@ console.log('\x1b[32m\x1b[2mby Noobish @ \x1b[4mFMDX.org + KubaPro010\x1b[0m'); console.log("v" + pjson.version) console.log('\x1b[90m' + '─'.repeat(terminalWidth - 1) + '\x1b[0m'); -const audioWss = require('./stream/ws.js'); -storage.websocket_delegation.set("/audio", audioWss); +require('./stream/ws.js'); require('./stream/index'); require('./plugins'); @@ -97,16 +96,13 @@ setInterval(() => { function connectToSerial() { if (serverConfig.xdrd.wirelessConnection === true) return; - // Configure the SerialPort with DTR and RTS options serialport = new SerialPort({ path: serverConfig.xdrd.comPort, baudRate: 115200, - autoOpen: false, // Prevents automatic opening - dtr: false, // Disable DTR - rts: false // Disable RTS + autoOpen: false, + dtr: false, rts: false }); - // Open the port manually after configuring DTR and RTS serialport.open((err) => { if (err) { logError('Error opening port: ' + err.message); @@ -121,7 +117,7 @@ function connectToSerial() { pluginsApi.setOutput(serialport); setTimeout(() => { serialport.write('x\n'); - }, 3000); + }, 2500); setTimeout(() => { serialport.write('Q0\n'); @@ -141,13 +137,8 @@ function connectToSerial() { serialport.write('F-1\n'); serialport.write('W0\n'); serverConfig.webserver.rdsMode ? serialport.write('D1\n') : serialport.write('D0\n'); - // cEQ and iMS combinations - if (serverConfig.ceqStartup === "0" && serverConfig.imsStartup === "0") serialport.write("G00\n"); // Both Disabled - else if (serverConfig.ceqStartup === "1" && serverConfig.imsStartup === "0") serialport.write(`G10\n`); - else if (serverConfig.ceqStartup === "0" && serverConfig.imsStartup === "1") serialport.write(`G01\n`); - else if (serverConfig.ceqStartup === "1" && serverConfig.imsStartup === "1") serialport.write("G11\n"); // Both Enabled - // Handle stereo mode - if (serverConfig.stereoStartup === "1") serialport.write("B1\n"); // Mono + serialport.write(`G${serverConfig.ceqStartup}${serverConfig.imsStartup}\n`); + serialport.write(`B${serverConfig.stereoStartup}\n`); // Mono serverConfig.audio.startupVolume ? serialport.write('Y' + (serverConfig.audio.startupVolume * 100).toFixed(0) + '\n') : serialport.write('Y100\n'); @@ -223,11 +214,10 @@ client.on('data', (data) => { authFlags.authMsg = true; logInfo('Authentication with xdrd successful.'); } else if (line.startsWith('G')) { - const value = line.substring(1); - dataHandler.initialData.eq = value.charAt(0); - dataHandler.dataToSend.eq = value.charAt(0); - dataHandler.initialData.ims = value.charAt(1); - dataHandler.dataToSend.ims = value.charAt(1); + dataHandler.initialData.eq = line.charAt(1); + dataHandler.dataToSend.eq = line.charAt(1); + dataHandler.initialData.ims = line.charAt(2); + dataHandler.dataToSend.ims = line.charAt(2); } else if (line.startsWith('Z')) { let modifiedLine = line.slice(1); dataHandler.initialData.ant = modifiedLine; @@ -306,13 +296,6 @@ wss.on('connection', (ws, request) => { const output = serverConfig.xdrd.wirelessConnection ? client : serialport; let clientIp = helpers.getIpAddress(request); const userCommandHistory = {}; - - if (clientIp && serverConfig.webserver.banlist?.includes(clientIp)) { - ws.close(1008, 'Banned IP'); - return; - } - - if (clientIp && clientIp.includes(',')) clientIp = clientIp.split(',')[0].trim(); // Per-IP limit connection open if (clientIp) { @@ -336,8 +319,8 @@ wss.on('connection', (ws, request) => { } } - if (clientIp !== '::ffff:127.0.0.1' || - (request.socket && request.socket.remoteAddress && request.socket.remoteAddress !== '::ffff:127.0.0.1') || + if (clientIp !== '::ffff:127.0.0.1' || + (request.socket && request.socket.remoteAddress && request.socket.remoteAddress !== '::ffff:127.0.0.1') || (request.headers && request.headers['origin'] && request.headers['origin'].trim() !== '')) { currentUsers++; } @@ -420,8 +403,8 @@ wss.on('connection', (ws, request) => { } } - if (clientIp !== '::ffff:127.0.0.1' || - (request.socket && request.socket.remoteAddress && request.socket.remoteAddress !== '::ffff:127.0.0.1') || + if (clientIp !== '::ffff:127.0.0.1' || + (request.socket && request.socket.remoteAddress && request.socket.remoteAddress !== '::ffff:127.0.0.1') || (request.headers && request.headers['origin'] && request.headers['origin'].trim() !== '')) { currentUsers--; } @@ -490,10 +473,6 @@ wss.on('connection', (ws, request) => { pluginsWss.on('connection', (ws, request) => { const clientIp = helpers.getIpAddress(request); const userCommandHistory = {}; - if (serverConfig.webserver.banlist?.includes(clientIp)) { - ws.close(1008, 'Banned IP'); - return; - } // Anti-spam tracking for each client const userCommands = {}; let lastWarn = { time: 0 }; @@ -504,7 +483,7 @@ pluginsWss.on('connection', (ws, request) => { try { let messageData = JSON.parse(message); // Attempt to parse the JSON - + if (messageData.type === "GPS" && messageData.value) { const gpsData = messageData.value; const { status, time, lat, lon, alt, mode } = gpsData; @@ -515,7 +494,7 @@ pluginsWss.on('connection', (ws, request) => { } } } catch (error) {} - + // Broadcast the message to all other clients pluginsWss.clients.forEach(client => { if (client.readyState === WebSocket.OPEN) client.send(message); // Send the message to all clients @@ -527,14 +506,13 @@ pluginsWss.on('connection', (ws, request) => { }); }); -httpServer.on('upgrade', (request, socket, head) => { - const clientIp = helpers.getIpAddress(request); - if (serverConfig.webserver.banlist?.includes(clientIp)) { +httpServer.on('upgrade', (request, socket, head) => { + if (serverConfig.webserver.banlist?.includes(helpers.getIpAddress(request))) { socket.destroy(); return; } - const upgradeWss = storage.websocket_delegation.get(request.url); + const upgradeWss = storage.websocket_delegation.get(request.url); if(upgradeWss) { sessionMiddleware(request, {}, () => { upgradeWss.handleUpgrade(request, socket, head, (ws) => { @@ -564,5 +542,4 @@ const startServer = (address) => { startServer(ipv4Address); tunnel.connect(); -fmdxList.update(); -module.exports = { wss, pluginsWss, httpServer, serverConfig }; \ No newline at end of file +fmdxList.update(); \ No newline at end of file diff --git a/server/stream/index.js b/server/stream/index.js index 4baba10..e58abe9 100644 --- a/server/stream/index.js +++ b/server/stream/index.js @@ -3,6 +3,7 @@ const { serverConfig } = require('../server_config'); const { logDebug, logError, logInfo, logWarn, logFfmpeg } = require('../console'); const checkFFmpeg = require('./checkFFmpeg'); const { PassThrough } = require('stream'); +const storage = require('../storage'); const consoleLogTitle = '[Audio Stream]'; @@ -41,14 +42,14 @@ checkFFmpeg().then((ffmpegPath) => { else inputArgs = ["-f", "alsa", "-i", device]; return [ - "-fflags", "+nobuffer", + "-fflags", "+nobuffer+flush_packets", "-flags", "low_delay", - "-rtbufsize", "6144", - "-probesize", "256", + "-rtbufsize", "4096", + "-probesize", "128", ...inputArgs, - "-thread_queue_size", "2048", + "-thread_queue_size", "1024", "-ar", String(sampleRate), "-ac", String(channels), @@ -62,7 +63,7 @@ checkFFmpeg().then((ffmpegPath) => { "-id3v2_version", "0", "-fflags", "+nobuffer", - // "-flush_packets", "1", + "-flush_packets", "1", "pipe:1" ]; @@ -139,4 +140,4 @@ checkFFmpeg().then((ffmpegPath) => { logError(`${consoleLogTitle} Error: ${err.message}`); }); -module.exports = audio_pipe; \ No newline at end of file +storage.websocket_delegation.set("/audio", audioWss); \ No newline at end of file diff --git a/server/stream/parser.js b/server/stream/parser.js index 465cebb..df4750e 100644 --- a/server/stream/parser.js +++ b/server/stream/parser.js @@ -107,4 +107,4 @@ function parseAudioDevice(options, callback) { else return new Promise(execute); } -module.exports = { parseAudioDevice }; \ No newline at end of file +module.exports = parseAudioDevice; \ No newline at end of file diff --git a/server/stream/ws.js b/server/stream/ws.js index d68a156..d43ade9 100644 --- a/server/stream/ws.js +++ b/server/stream/ws.js @@ -5,15 +5,6 @@ const { getIpAddress } = require("../helpers.js") const audioWss = new WebSocket.Server({ noServer: true, skipUTF8Validation: true }); -audioWss.on('connection', (ws, request) => { - const clientIp = getIpAddress(request); - - if (serverConfig.webserver.banlist?.includes(clientIp)) { - ws.close(1008, 'Banned IP'); - return; - } -}); - audio_pipe.on('data', (chunk) => { audioWss.clients.forEach((client) => { if (client.readyState === WebSocket.OPEN) client.send(chunk, {binary: true, compress: false}); diff --git a/server/tx_search.js b/server/tx_search.js index 20063f9..b76094a 100644 --- a/server/tx_search.js +++ b/server/tx_search.js @@ -4,7 +4,7 @@ const consoleCmd = require('./console'); let localDb = {}; let nextLocalDbUpdate = 0; -const localDbUpdateInterval = 7 * 24 * 60 * 60 * 1000; // 7-day database update interval +const localDbUpdateInterval = 3 * 24 * 60 * 60 * 1000; // 3-day database update interval let awaitingTxInfo = true; let lastFetchTime = 0; let piFreqIndex = {}; // Indexing for speedier PI+Freq combinations @@ -18,11 +18,6 @@ let usStatesGeoJson = null; // To cache the GeoJSON data for US states let Latitude = serverConfig.identification.lat; let Longitude = serverConfig.identification.lon; -// Create WebSocket URL for GPS lat/lon update. -const webserverPort = serverConfig.webserver.webserverPort || 8080; // Fallback to port 8080 -const externalWsUrl = `ws://127.0.0.1:${webserverPort}/data_plugins`; -const WebSocket = require('ws'); - // Get weighting values based on algorithm setting. // Defaults = algorithm 1 let weightedErp = 10; diff --git a/views/403.ejs b/views/403.ejs index 0871df8..b727776 100644 --- a/views/403.ejs +++ b/views/403.ejs @@ -20,9 +20,7 @@

-

- Service refused..
- Please try again later.

+

Service refused, please try again later.

<% if (reason) { %>

Reason: <%= reason %>

diff --git a/views/index.ejs b/views/index.ejs index a459b2b..ad489bf 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -1,13 +1,11 @@ - <%= tunerName %> - FM-DX Webserver - @@ -26,7 +24,6 @@