callback/index.js

66 lines
1.7 KiB
JavaScript

const express = require('express');
const { createServer } = require('http');
const WebSocket = require('ws');
const path = require('path');
const MessageRouter = require('./lib/messageRouter');
const ConnectionManager = require('./lib/connectionManager');
const app = express();
app.use(express.static(path.join(__dirname, 'public')));
const server = createServer(app);
const wss = new WebSocket.Server({ server });
const connectionManager = new ConnectionManager();
const messageRouter = new MessageRouter(connectionManager);
wss.on('connection', (ws, req) => {
const query = req.url?.split('?')[1];
const urlParams = new URLSearchParams(query);
const username = urlParams.get('u');
if (!username) {
ws.send(JSON.stringify({
error: true,
message: "Use /?u=... to set a username"
}));
ws.close();
return;
}
if (!connectionManager.addUser(username, ws)) {
ws.send(JSON.stringify({
error: true,
message: "This user is currently online, pick another username"
}));
ws.close();
return;
}
console.log(`[Connection] User connected: ${username}`);
ws.on('message', (data) => {
try {
const parsedData = JSON.parse(data.toString());
messageRouter.routeMessage(username, parsedData);
} catch (err) {
const errorMsg = {
error: true,
message: `Invalid JSON format: ${err.message}`
};
ws.send(JSON.stringify(errorMsg));
}
});
ws.on('close', () => {
connectionManager.removeUser(username);
console.log(`[Connection] User disconnected: ${username}`);
});
ws.send(JSON.stringify({ error: false, message: `Connected as ${username}` }));
});
server.listen(65010, 'localhost', () => {
console.log(`[callback] started`);
});