From 2849df4f2c5e7f289a7cf4c2db9daf68f5653545 Mon Sep 17 00:00:00 2001 From: RblSb Date: Mon, 24 Feb 2020 13:57:09 +0300 Subject: Save state and error logs --- src/server/Main.hx | 49 ++++++++++++++++++++++++++++++++++++++++++++--- src/server/ServerState.hx | 13 +++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 src/server/ServerState.hx (limited to 'src/server') diff --git a/src/server/Main.hx b/src/server/Main.hx index 442abc8..9a245fe 100644 --- a/src/server/Main.hx +++ b/src/server/Main.hx @@ -20,6 +20,7 @@ using Lambda; class Main { final rootDir = '$__dirname/..'; + final statePath:String; final wss:WSServer; final localIp:String; var globalIp:String; @@ -34,22 +35,31 @@ class Main { static function main():Void new Main(); public function new(port = 4200, wsPort = 4201) { + statePath = '$rootDir/user/state.json'; config = getUserConfig(); + loadState(); wss = new WSServer({port: wsPort}); wss.on("connection", onConnect); function exit() { - // TODO save state + saveState(); process.exit(); } process.on("exit", exit); process.on("SIGINT", exit); // ctrl+c process.on("SIGUSR1", exit); // kill pid process.on("SIGUSR2", exit); - process.on("uncaughtException", (log) -> { - trace(log); + process.on("uncaughtException", err -> { + trace(err); + logError("uncaughtException", { + message: err.message, + stack: err.stack + }); + exit(); }); process.on("unhandledRejection", (reason, promise) -> { trace("Unhandled Rejection at:", reason); + logError("unhandledRejection", reason); + exit(); }); localIp = Utils.getLocalIp(); globalIp = localIp; @@ -82,6 +92,38 @@ class Main { return config; } + function saveState():Void { + final data:ServerState = { + videoList: videoList, + messages: messages, + timer: { + time: videoTimer.getTime(), + paused: videoTimer.isPaused() + } + } + final json = Json.stringify(data, "\t"); + File.saveContent(statePath, json); + } + + function loadState():Void { + if (!FileSystem.exists(statePath)) return; + final data:ServerState = Json.parse(File.getContent(statePath)); + videoList.resize(0); + messages.resize(0); + for (item in data.videoList) videoList.push(item); + for (message in data.messages) messages.push(message); + videoTimer.start(); + videoTimer.setTime(data.timer.time); + videoTimer.pause(); + } + + function logError(type:String, data:Dynamic):Void { + final crashesFolder = '$rootDir/user/crashes'; + final name = new Date().toISOString() + "-" + type; + if (!FileSystem.exists(crashesFolder)) FileSystem.createDirectory(crashesFolder); + File.saveContent('$crashesFolder/$name.json', Json.stringify(data, "\t")); + } + function onConnect(ws:WebSocket, req:IncomingMessage):Void { final ip = req.connection.remoteAddress; final id = freeIds.length > 0 ? freeIds.shift() : clients.length; @@ -267,6 +309,7 @@ class Main { } case ClearChat: + messages.resize(0); if (client.isAdmin) broadcast(data); case ClearPlaylist: diff --git a/src/server/ServerState.hx b/src/server/ServerState.hx new file mode 100644 index 0000000..06240e5 --- /dev/null +++ b/src/server/ServerState.hx @@ -0,0 +1,13 @@ +package server; + +import Types.Message; +import Types.VideoItem; + +typedef ServerState = { + videoList:Array, + messages:Array, + timer:{ + time:Float, + paused:Bool + } +} -- cgit v1.2.3