diff options
| author | RblSb <msrblsb@gmail.com> | 2020-02-24 13:57:09 +0300 |
|---|---|---|
| committer | RblSb <msrblsb@gmail.com> | 2020-02-24 13:57:09 +0300 |
| commit | 2849df4f2c5e7f289a7cf4c2db9daf68f5653545 (patch) | |
| tree | 4e5a94d576d2ab2624d3005cadbc8dc9861cdd7e /src/server | |
| parent | 9c6cd2c2310d2e3ce3d1a6e3350a97e7ba0ca657 (diff) | |
Save state and error logs
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/Main.hx | 49 | ||||
| -rw-r--r-- | src/server/ServerState.hx | 13 |
2 files changed, 59 insertions, 3 deletions
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<VideoItem>, + messages:Array<Message>, + timer:{ + time:Float, + paused:Bool + } +} |
