const { WebSocketServer } = require('ws') const http = require('http') const url = require('url') // WebSocket-Server starten const wss = new WebSocketServer({ noServer: true }) // HTTP-Server zum Empfangen von POST-Anfragen zum Versenden von Nachrichten const server = http.createServer((req, res) => { // CORS Header setzen res.setHeader('Access-Control-Allow-Origin', '*') res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS') res.setHeader('Access-Control-Allow-Headers', 'Content-Type') // Preflight-Request if (req.method === 'OPTIONS') { res.writeHead(204) res.end() return } // Nachricht per POST empfangen if (req.method === 'POST' && req.url === '/send') { let body = '' req.on('data', chunk => { body += chunk }) req.on('end', () => { const message = JSON.parse(body) const isBroadcast = !Array.isArray(message.targetUserIds) const type = message.type || 'notification' let sentCount = 0 wss.clients.forEach((client) => { const shouldSend = client.readyState === 1 && (isBroadcast || ( Array.isArray(message.targetUserIds) && client.steamId && message.targetUserIds.includes(client.steamId) )) if (shouldSend) { client.send(JSON.stringify({ type, ...message })) sentCount++ } }) console.log(`[WS] Nachricht vom Typ "${type}" an ${sentCount} Client(s) gesendet.`) res.writeHead(200) res.end('Nachricht gesendet.') }) } else { res.writeHead(404) res.end() } }) wss.on('connection', (ws, req) => { const parsedUrl = url.parse(req.url, true) const steamId = parsedUrl.query.steamId if (!steamId) { console.warn('[WS] Verbindung ohne steamId - wird geschlossen') ws.close() return } ws.steamId = steamId console.log(`[WS] Verbunden: steamId=${steamId}`) ws.on('close', () => { console.log(`[WS] Verbindung geschlossen für ${steamId}`) }) }) // WebSocket Upgrade akzeptieren server.on('upgrade', (req, socket, head) => { wss.handleUpgrade(req, socket, head, (ws) => { wss.emit('connection', ws, req) }) }) // Server starten server.listen(3001, () => { console.log('✅ WebSocket Server läuft auf Port 3001') })