// websocket-talkie.js // Sercrod WebSocket Talkie: a simple IP-based talkie demo const fs = require("fs"); const https = require("https"); const WebSocket = require("ws"); const port = 8443; const host = "0.0.0.0"; const ws_path = "/"; // const ws_path = "/ws"; const domain = "example.com"; const server = https.createServer({ key: fs.readFileSync(`/etc/letsencrypt/live/${domain}/privkey.pem`), cert: fs.readFileSync(`/etc/letsencrypt/live/${domain}/fullchain.pem`) }); server.listen(port, host, () => { console.log(`Sercrod WebSocket Talkie on wss://${domain}:${port}${ws_path}`); }); // ip -> Set const ip_rooms = new Map(); function get_client_ip(req){ const forwarded_for = req.headers["x-forwarded-for"]; if(forwarded_for){ return String(forwarded_for).split(",")[0].trim(); } return String(req.socket.remoteAddress || "unknown").replace(/^::ffff:/, ""); } const wss = new WebSocket.Server({ server: server, path: ws_path }); wss.on("connection", (ws, req) => { const ip = get_client_ip(req); if(!ip_rooms.has(ip)){ ip_rooms.set(ip, new Set()); } const set = ip_rooms.get(ip); set.add(ws); ws.send(`[system] connected (room = ${ip})`); ws.on("message", raw => { const text = raw.toString(); const payload = `[${ip}] ${text}`; for(const client of set){ if(client.readyState === WebSocket.OPEN){ client.send(payload); } } }); ws.on("close", () => { set.delete(ws); if(set.size === 0){ ip_rooms.delete(ip); } }); });