const WebSocket = require('ws'); const Player = require('./player'); const Room = require('./room'); const EventEmitter = require("events"); let lobby = null; function createNewLobby() { if (lobby) { console.log("Removing lobby"); lobby.remove(); lobby = null; } console.log("Creating lobby"); lobby = new Room("Lobby"); lobby.on('lost_last_player', createNewLobby); } let playersBySocket = new Map(); createNewLobby(); const ws = new WebSocket.Server({port: 9997}); ws.on('listening', function() { console.log('Listening!'); }); const interval = setInterval(() => { ws.clients.forEach(i => { if (i.failedPong > 8) { i.terminate(); } else { if (i.failedPong > 0) { console.log("Client failed pong " + i.failedPong + " " + (playersBySocket.has(i) ? playersBySocket.get(i).id : "noplayer")); } i.failedPong++; i.ping(); } } ); }, 15000 ); ws.on('connection', function(conn) { console.log('Connection!'); conn.failedPong = 0; conn.on('pong', () => { conn.failedPong = 0; }); conn.on('message', function(message) { if (playersBySocket.has(conn)) { const p = playersBySocket.get(conn); if (p.room != null) { p.room.playerMessage(p, message); } } //console.log('Message: ' + message); } ); conn.on('close', function(code, reason) { console.log('Socket closed: ' + reason); if (playersBySocket.has(conn)) { const p = playersBySocket.get(conn); console.log("Deleting player " + p.id); playersBySocket.delete(conn); p.room.removePlayer(p); p.remove(); } } ); const p = new Player(conn); playersBySocket.set(conn, p); p.sendMessage("connected", {player_id:p.id}); console.log("New player (size " + playersBySocket.size + ")"); lobby.addPlayer(p); } ); ws.on('error', function(err) { console.log('Error: ' + err); } );