36 lines
947 B
JavaScript
36 lines
947 B
JavaScript
import { WebSocketServer } from "ws";
|
|
import url from "url";
|
|
|
|
function parseTokenFromRequest(req) {
|
|
try {
|
|
const parsed = url.parse(req.url, true);
|
|
return parsed.query?.token || null;
|
|
} catch (err) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function createWebsocketServer(server, { verifyToken, onMessage }) {
|
|
const wss = new WebSocketServer({ server });
|
|
|
|
wss.on("connection", (ws, req) => {
|
|
const token = parseTokenFromRequest(req);
|
|
const decoded = token && verifyToken ? verifyToken(token, "access") : null;
|
|
if (!decoded) {
|
|
ws.close();
|
|
return;
|
|
}
|
|
ws.user = decoded;
|
|
ws.on("message", (msg) => onMessage && onMessage(msg, ws));
|
|
ws.on("error", (err) => console.warn("🔌 WebSocket error:", err.message));
|
|
});
|
|
|
|
return wss;
|
|
}
|
|
|
|
export function broadcastJson(wss, payload) {
|
|
if (!wss) return;
|
|
const data = JSON.stringify(payload);
|
|
wss.clients.forEach((c) => c.readyState === 1 && c.send(data));
|
|
}
|