diff --git a/.gitignore b/.gitignore index 4afb8ba..36c4c4b 100644 --- a/.gitignore +++ b/.gitignore @@ -38,4 +38,6 @@ Thumbs.db dist/**/* # ignore yarn.lock -yarn.lock \ No newline at end of file +yarn.lock + +crashes \ No newline at end of file diff --git a/src/GameCrashManager.ts b/src/GameCrashManager.ts new file mode 100644 index 0000000..c513228 --- /dev/null +++ b/src/GameCrashManager.ts @@ -0,0 +1,37 @@ +import { MancalaGame } from "mancala.js"; +import fs from "fs"; +const crashFolder = "./crashes"; +export class GameCrashManager { + constructor() {} + + static createCrashFolderIfNotExist(): void { + if (!fs.existsSync(crashFolder)) { + fs.mkdirSync(crashFolder); + } + } + + static getTime(): string { + let date_ob = new Date(); + let date = ("0" + date_ob.getDate()).slice(-2); + let month = ("0" + (date_ob.getMonth() + 1)).slice(-2); + let year = date_ob.getFullYear(); + let hours = date_ob.getHours(); + let minutes = date_ob.getMinutes(); + let seconds = date_ob.getSeconds(); + let miliSeconds = date_ob.getMilliseconds(); + return `${year}-${month}-${date}-${hours}:${minutes}:${seconds}:${miliSeconds}`; + } + + public static logGameCrash(error: Error, game: MancalaGame): string { + this.createCrashFolderIfNotExist(); + const crash = { + message: error.message, + stack: error.stack, + game, + }; + const crashStr = JSON.stringify(crash); + const crashFileName = `${game.id}::${this.getTime()}`; + fs.writeFile(`${crashFolder}/${crashFileName}`, crashStr, () => {}); + return crashFileName; + } +} diff --git a/src/index.ts b/src/index.ts index 5f15861..7b3ed0d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,6 +17,7 @@ import { } from "./channel_names"; import morgan from "morgan"; import { GameMove } from "./models/GameMove"; +import { GameCrashManager } from "./GameCrashManager"; const app = express(); @@ -77,13 +78,14 @@ rtmt.listenMessage(channel_game_move, (userKey: string, message: Object) => { game.moveByPlayerPit(userKey, gameMove.index); rtmt.sendMessage(game.player1Id, channel_on_game_update, game); rtmt.sendMessage(game.player2Id, channel_on_game_update, game); - if (game.state == "ended") { gameStore.delete(game.player1Id); gameStore.delete(game.player2Id); } } catch (err: any) { console.error(err); + const crashFileName = GameCrashManager.logGameCrash(err, game); + console.info(`Game crash saved to file : ${crashFileName}`); rtmt.sendMessage(game.player1Id, channel_on_game_crashed, err); rtmt.sendMessage(game.player2Id, channel_on_game_crashed, err); }