Files
Sheep-Service/ws/ws.js
Rozenrod 6ec6523d71 Переработаны роутеры приложения
Переписано APi WebSocket для работы с новыми роутерами
2025-10-03 17:11:31 +03:00

50 lines
1.6 KiB
JavaScript

const WebSocket = require("ws");
const { URL } = require('url');
const { routeMessage } = require("./routes");
const { auth } = require("./middleware/auth");
const { setupPing } = require("./utils/ping");
require("dotenv").config();
const api_version = '1.1.0';
const wss = new WebSocket.Server({ port: 4004 });
console.log("WebSocket сервер запущен на порту 4004");
wss.on("connection", async (ws, request) => {
const url = new URL(request.url, `http://${request.headers.host}`);
const params = Object.fromEntries(url.searchParams.entries());
const uuid = params.uuid ?? ws.protocol;
if (!uuid) return ws.close();
const user = await auth(uuid);
if (!user) return ws.close();
try {
const user = await auth(uuid);
if (!user) return ws.close();
ws.user = user;
ws.send(JSON.stringify({ connection: "success", api_version, user: {name: ws.user.name, id: ws.user.id } }));
// Periodic ping to maintain a connection
setupPing(ws);
ws.on("message", (raw) => {
try {
const message = JSON.parse(raw);
routeMessage(wss, ws, message);
} catch (e) {
console.error("❌ Invalid message:", raw);
ws.send(JSON.stringify({ error: "Invalid message format" }));
}
});
ws.on("close", () => console.log("🔌 Client disconnected"));
ws.on("error", (err) => console.error("❌ WS error:", err));
} catch (err) {
console.error("❌ Auth error:", err);
ws.close();
}
});