90 lines
2.3 KiB
JavaScript
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')
|
|
})
|