From e3fd13072925895797eadda9b2b41110e404a019 Mon Sep 17 00:00:00 2001 From: LuckyLaszlo Date: Wed, 30 Nov 2022 19:42:16 +0100 Subject: [PATCH] GameSession delete + log --- memo.txt | 2 +- src/server/class/GameSession.ts | 2 +- src/server/utils.ts | 8 +++++ src/server/wsServer.ts | 52 +++++++++++++++++++++++++-------- 4 files changed, 50 insertions(+), 14 deletions(-) create mode 100644 src/server/utils.ts diff --git a/memo.txt b/memo.txt index 4ce404f6..8a891dae 100644 --- a/memo.txt +++ b/memo.txt @@ -11,10 +11,10 @@ Done: - interpolation (mis à jour progressif des mouvements de l'adversaire) - traitement groupé des inputs clients toutes les x millisecondes (BUG désynchronisation: revenu à un traitement immédiat en attendant) + - Détruire les GameSession une fois finies. TODO: - mode multi-balles -- Détruire les GameSession une fois finies. - certaines utilisations de Math.floor() superflu ? Vérifier les appels. - (prediction de l'avancement de la balle basé sur la latence serveur ?) ----------- diff --git a/src/server/class/GameSession.ts b/src/server/class/GameSession.ts index dc72e507..dbec42bf 100644 --- a/src/server/class/GameSession.ts +++ b/src/server/class/GameSession.ts @@ -5,7 +5,7 @@ import * as c from "../constants.js" import { ClientPlayer } from "./Client"; import { GameComponentsServer } from "./GameComponentsServer.js"; import { clientInputListener } from "../wsServer.js"; -import { random } from "../../shared_js/utils.js"; +import { random } from "../utils.js"; /* Arg "s: GameSession" replace "this: GameSession" for use with setTimeout(), diff --git a/src/server/utils.ts b/src/server/utils.ts new file mode 100644 index 00000000..0c939b8c --- /dev/null +++ b/src/server/utils.ts @@ -0,0 +1,8 @@ + +export * from "../shared_js/utils.js" + +function shortId(id: string): string { + return id.substring(0, id.indexOf("-")); +} + +export {shortId} diff --git a/src/server/wsServer.ts b/src/server/wsServer.ts index 51c33c9b..f9162906 100644 --- a/src/server/wsServer.ts +++ b/src/server/wsServer.ts @@ -12,6 +12,7 @@ import * as en from "../shared_js/enums.js" import * as ev from "../shared_js/class/Event.js" import { Client, ClientPlayer } from "./class/Client.js" import { GameSession } from "./class/GameSession.js" +import { shortId } from "./utils.js"; // pas indispensable d'avoir un autre port si le WebSocket est relié à un serveur http préexistant ? const wsPort = 8042; @@ -35,7 +36,7 @@ function connectionListener(socket: WebSocket, request: IncomingMessage) socket.on("pong", function heartbeat() { client.isAlive = true; - console.log("%i: client %s is alive", Date.now(), client.id); + // console.log(`client ${shortId(client.id)} is alive`); }); socket.on("message", function log(data: string) { @@ -57,7 +58,8 @@ function clientAnnounceListener(this: WebSocket, data: string) { try { const msg : ev.ClientAnnounce = JSON.parse(data); - if (msg.type === en.EventTypes.clientAnnounce) { + if (msg.type === en.EventTypes.clientAnnounce) + { // TODO: reconnection with msg.clientId ? // TODO: spectator/player distinction with msg.role ? @@ -121,7 +123,8 @@ function playerReadyConfirmationListener(this: WebSocket, data: string) { try { const msg : ev.ClientEvent = JSON.parse(data); - if (msg.type === en.EventTypes.clientPlayerReady) { + if (msg.type === en.EventTypes.clientPlayerReady) + { const client = clientsMap.get(this.id); const gameSession = client.gameSession; gameSession.unreadyPlayersMap.delete(this.id); @@ -149,7 +152,8 @@ export function clientInputListener(this: WebSocket, data: string) try { // const input: ev.ClientEvent = JSON.parse(data); const input: ev.EventInput = JSON.parse(data); - if (input.type === en.EventTypes.clientInput) { + if (input.type === en.EventTypes.clientInput) + { const client = clientsMap.get(this.id) as ClientPlayer; client.inputBuffer = input; client.gameSession.instantInputDebug(client); // wip @@ -167,22 +171,46 @@ export function clientInputListener(this: WebSocket, data: string) //////////// const pingInterval = setInterval( () => { + let deleteLog = ""; clientsMap.forEach( (client, key, map) => { - if (client.isAlive === false) { - client.socket.terminate(); - map.delete(key); - if (matchmakingPlayersMap.has(key)) { - matchmakingPlayersMap.delete(key); - } - console.log("%i: client %s is no more :'(", Date.now(), key); - return; + if (!client.isAlive) { + clientTerminate(client, key, map); + deleteLog += ` ${shortId(key)} |`; } client.isAlive = false; client.socket.ping(); }); + + if (deleteLog) { + console.log(`Disconnected:${deleteLog}`); + } + console.log("gameSessionMap size: " + gameSessionsMap.size); + console.log("clientsMap size: " + clientsMap.size); + console.log("matchmakingPlayersMap size: " + matchmakingPlayersMap.size); + console.log(""); }, 5000); +function clientTerminate(client: Client, key: string, map: Map) +{ + client.socket.terminate(); + if (client.gameSession) + { + client.gameSession.playersMap.delete(key); + if (client.gameSession.playersMap.size === 0) + { + clearInterval(client.gameSession.clientsUpdateInterval); + clearInterval(client.gameSession.gameLoopInterval); + gameSessionsMap.delete(client.gameSession.id); + } + } + map.delete(key); + if (matchmakingPlayersMap.has(key)) { + matchmakingPlayersMap.delete(key); + } +} + + function closeListener() { clearInterval(pingInterval);