ironie-nextjs/websocket-server.js
2025-05-28 00:41:38 +02:00

90 lines
2.3 KiB
JavaScript

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')
})