From 886daebfeac360781bdd7efe96e23f360c70435c Mon Sep 17 00:00:00 2001 From: kharhamel Date: Fri, 26 Mar 2021 14:12:22 +0100 Subject: [PATCH] improved the unloading process to not create a useless socket --- back/src/Services/SocketManager.ts | 4 ++-- docker-compose.yaml | 4 +--- front/src/Connexion/ConnectionManager.ts | 17 +++++++++++++---- front/src/Connexion/RoomConnection.ts | 12 +++++------- front/src/Phaser/Game/GameScene.ts | 5 ++--- pusher/src/Controller/BaseController.ts | 6 +++--- 6 files changed, 26 insertions(+), 22 deletions(-) diff --git a/back/src/Services/SocketManager.ts b/back/src/Services/SocketManager.ts index 40023833..75e683d3 100644 --- a/back/src/Services/SocketManager.ts +++ b/back/src/Services/SocketManager.ts @@ -77,10 +77,10 @@ export class SocketManager { } public async handleJoinRoom(socket: UserSocket, joinRoomMessage: JoinRoomMessage): Promise<{ room: GameRoom; user: User }> { - + //join new previous room const {room, user} = await this.joinRoom(socket, joinRoomMessage); - + const roomJoinedMessage = new RoomJoinedMessage(); roomJoinedMessage.setTagList(joinRoomMessage.getTagList()); diff --git a/docker-compose.yaml b/docker-compose.yaml index 98071437..fdb74d6a 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -53,10 +53,8 @@ services: pusher: image: thecodingmachine/nodejs:12 command: yarn dev - #command: yarn run prod - #command: yarn run profile environment: - DEBUG: "*" + DEBUG: "socket:*" STARTUP_COMMAND_1: yarn install SECRET_JITSI_KEY: "$SECRET_JITSI_KEY" SECRET_KEY: yourSecretKey diff --git a/front/src/Connexion/ConnectionManager.ts b/front/src/Connexion/ConnectionManager.ts index 522407e3..b2f1247c 100644 --- a/front/src/Connexion/ConnectionManager.ts +++ b/front/src/Connexion/ConnectionManager.ts @@ -6,16 +6,25 @@ import {GameConnexionTypes, urlManager} from "../Url/UrlManager"; import {localUserStore} from "./LocalUserStore"; import {LocalUser} from "./LocalUser"; import {Room} from "./Room"; -import {Subject} from "rxjs"; -import {ServerToClientMessage} from "../Messages/generated/messages_pb"; class ConnectionManager { private localUser!:LocalUser; private connexionType?: GameConnexionTypes + private reconnectingTimeout: NodeJS.Timeout|null = null; + private _unloading:boolean = false; - public _serverToClientMessageStream:Subject = new Subject(); + get unloading () { + return this._unloading; + } + + constructor() { + window.addEventListener('beforeunload', () => { + this._unloading = true; + if (this.reconnectingTimeout) clearTimeout(this.reconnectingTimeout) + }) + } /** * Tries to login to the node server and return the starting map url to be loaded */ @@ -99,7 +108,7 @@ class ConnectionManager { }).catch((err) => { // Let's retry in 4-6 seconds return new Promise((resolve, reject) => { - setTimeout(() => { + this.reconnectingTimeout = setTimeout(() => { //todo: allow a way to break recursion? //todo: find a way to avoid recursive function. Otherwise, the call stack will grow indefinitely. this.connectToRoomSocket(roomId, name, characterLayers, position, viewport).then((connection) => resolve(connection)); diff --git a/front/src/Connexion/RoomConnection.ts b/front/src/Connexion/RoomConnection.ts index debb99f4..584dae06 100644 --- a/front/src/Connexion/RoomConnection.ts +++ b/front/src/Connexion/RoomConnection.ts @@ -45,6 +45,7 @@ import {BodyResourceDescriptionInterface} from "../Phaser/Entity/PlayerTextures" import {adminMessagesService} from "./AdminMessagesService"; import {worldFullMessageStream} from "./WorldFullMessageStream"; import {worldFullWarningStream} from "./WorldFullWarningStream"; +import {connectionManager} from "./ConnectionManager"; const manualPingDelay = 20000; @@ -380,10 +381,7 @@ export class RoomConnection implements RoomConnection { public onConnectError(callback: (error: Event) => void): void { this.socket.addEventListener('error', callback) } - - /*public onConnect(callback: (e: Event) => void): void { - this.socket.addEventListener('open', callback) - }*/ + public onConnect(callback: (roomConnection: OnConnectInterface) => void): void { //this.socket.addEventListener('open', callback) this.onMessage(EventMessage.CONNECT, callback); @@ -452,9 +450,9 @@ export class RoomConnection implements RoomConnection { }); } - public onServerDisconnected(callback: (event: CloseEvent) => void): void { + public onServerDisconnected(callback: () => void): void { this.socket.addEventListener('close', (event) => { - if (this.closed === true) { + if (this.closed === true || connectionManager.unloading) { return; } console.log('Socket closed with code '+event.code+". Reason: "+event.reason); @@ -462,7 +460,7 @@ export class RoomConnection implements RoomConnection { // Normal closure case return; } - callback(event); + callback(); }); } diff --git a/front/src/Phaser/Game/GameScene.ts b/front/src/Phaser/Game/GameScene.ts index 15872658..6b50109b 100644 --- a/front/src/Phaser/Game/GameScene.ts +++ b/front/src/Phaser/Game/GameScene.ts @@ -471,9 +471,7 @@ export class GameScene extends ResizableScene implements CenterListener { this.connection.onServerDisconnected(() => { console.log('Player disconnected from server. Reloading scene.'); - - this.simplePeer.closeAllConnections(); - this.simplePeer.unregister(); + this.cleanupClosingScene(); const gameSceneKey = 'somekey' + Math.round(Math.random() * 10000); const game: Phaser.Scene = new GameScene(this.room, this.MapUrlFile, gameSceneKey); @@ -708,6 +706,7 @@ export class GameScene extends ResizableScene implements CenterListener { audioManager.unloadAudio(); // We are completely destroying the current scene to avoid using a half-backed instance when coming back to the same map. this.connection?.closeConnection(); + this.simplePeer.closeAllConnections(); this.simplePeer?.unregister(); this.messageSubscription?.unsubscribe(); } diff --git a/pusher/src/Controller/BaseController.ts b/pusher/src/Controller/BaseController.ts index 673ffd3c..bb500b57 100644 --- a/pusher/src/Controller/BaseController.ts +++ b/pusher/src/Controller/BaseController.ts @@ -1,5 +1,4 @@ -import {HttpRequest, HttpResponse} from "uWebSockets.js"; -import {ADMIN_API_TOKEN} from "../Enum/EnvironmentVariable"; +import {HttpResponse} from "uWebSockets.js"; export class BaseController { @@ -14,7 +13,8 @@ export class BaseController { */ // eslint-disable-next-line @typescript-eslint/no-explicit-any protected errorToResponse(e: any, res: HttpResponse): void { - console.error("An error happened", e); + console.error(e.message || "An error happened.", e?.config.url); + console.error(e.stack || 'no stack defined.'); if (e.response) { res.writeStatus(e.response.status+" "+e.response.statusText); this.addCorsHeaders(res);