66 lines
1.7 KiB
JavaScript
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`);
|
|
});
|