EQUOTEMO OPEN CHATROOM

const WebSocket = require(‘ws’);
const http = require(‘http’);
const fs = require(‘fs’);
const path = require(‘path’);

// Create HTTP server to serve the HTML page
const server = http.createServer((req, res) => {
if (req.url === ‘/’) {
fs.readFile(path.join(__dirname, ‘index.html’), (err, data) => {
if (err) {
res.writeHead(500);
return res.end(‘Error loading page’);
}
res.writeHead(200, { ‘Content-Type’: ‘text/html’ });
res.end(data);
});
}
});

// Attach WebSocket server
const wss = new WebSocket.Server({ server });

// Store connected clients
const clients = new Set();

wss.on(‘connection’, (ws) => {
clients.add(ws);
console.log(‘New client connected. Total:’, clients.size);

// Notify everyone about new user
broadcast(JSON.stringify({
type: ‘system’,
message: ‘A new user joined the chat’,
timestamp: new Date().toISOString()
}), ws);

ws.on(‘message’, (data) => {
try {
const parsed = JSON.parse(data);
const message = JSON.stringify({
type: ‘message’,
username: parsed.username || ‘Anonymous’,
message: parsed.message,
timestamp: new Date().toISOString()
});
broadcast(message);
} catch (err) {
console.error(‘Invalid message:’, err);
}
});

ws.on(‘close’, () => {
clients.delete(ws);
console.log(‘Client disconnected. Total:’, clients.size);
broadcast(JSON.stringify({
type: ‘system’,
message: ‘A user left the chat’,
timestamp: new Date().toISOString()
}));
});
});

function broadcast(message, exclude = null) {
clients.forEach((client) => {
if (client !== exclude && client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
}

const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
console.log(`Chat server running at http://localhost:${PORT}`);
});