diff options
| author | RblSb <msrblsb@gmail.com> | 2020-02-25 16:16:39 +0300 |
|---|---|---|
| committer | RblSb <msrblsb@gmail.com> | 2020-02-26 08:30:03 +0300 |
| commit | aadb867a613c44d14cad27189c20b8fc0ef49a2d (patch) | |
| tree | d177ba86fd9082e75d6bb669be5af5f5e75fe8fc | |
| parent | 1cc391ceb0cf5db62e0422390780e79de2597202 (diff) | |
Handle SIGTERM
| -rw-r--r-- | build/server.js | 32 | ||||
| -rw-r--r-- | res/client.js | 6 | ||||
| -rw-r--r-- | src/server/Main.hx | 26 |
3 files changed, 47 insertions, 17 deletions
diff --git a/build/server.js b/build/server.js index 52d878d..a6edc55 100644 --- a/build/server.js +++ b/build/server.js @@ -650,28 +650,27 @@ var server_Main = function(port,wsPort) { port = envPort; } this.statePath = "" + this.rootDir + "/user/state.json"; - this.config = this.getUserConfig(); - this.loadState(); var exit = function() { _gthis.saveState(); process.exit(); }; - process.on("exit",exit); process.on("SIGINT",exit); process.on("SIGUSR1",exit); process.on("SIGUSR2",exit); + process.on("SIGTERM",exit); process.on("uncaughtException",function(err) { - haxe_Log.trace(err,{ fileName : "src/server/Main.hx", lineNumber : 52, className : "server.Main", methodName : "new"}); _gthis.logError("uncaughtException",{ message : err.message, stack : err.stack}); exit(); return; }); process.on("unhandledRejection",function(reason,promise) { - haxe_Log.trace("Unhandled Rejection at:",{ fileName : "src/server/Main.hx", lineNumber : 60, className : "server.Main", methodName : "new", customParams : [reason]}); _gthis.logError("unhandledRejection",reason); exit(); return; }); + this.initIntergationHandlers(); + this.loadState(); + this.config = this.getUserConfig(); this.localIp = server_Utils.getLocalIp(); this.globalIp = this.localIp; this.port = port; @@ -717,6 +716,7 @@ server_Main.prototype = { return config; } ,saveState: function() { + haxe_Log.trace("Saving state...",{ fileName : "src/server/Main.hx", lineNumber : 99, className : "server.Main", methodName : "saveState"}); var json = JSON.stringify({ videoList : this.videoList, messages : this.messages, timer : { time : this.videoTimer.getTime(), paused : this.videoTimer.isPaused()}},null,"\t"); js_node_Fs.writeFileSync(this.statePath,json); } @@ -724,6 +724,7 @@ server_Main.prototype = { if(!sys_FileSystem.exists(this.statePath)) { return; } + haxe_Log.trace("Loading state...",{ fileName : "src/server/Main.hx", lineNumber : 114, className : "server.Main", methodName : "loadState"}); var data = JSON.parse(js_node_Fs.readFileSync(this.statePath,{ encoding : "utf8"})); this.videoList.length = 0; this.messages.length = 0; @@ -738,6 +739,7 @@ server_Main.prototype = { this.videoTimer.pause(); } ,logError: function(type,data) { + haxe_Log.trace(type,{ fileName : "src/server/Main.hx", lineNumber : 126, className : "server.Main", methodName : "logError", customParams : [data]}); var crashesFolder = "" + this.rootDir + "/user/crashes"; var name = new Date().toISOString() + "-" + type; if(!sys_FileSystem.exists(crashesFolder)) { @@ -745,12 +747,27 @@ server_Main.prototype = { } js_node_Fs.writeFileSync("" + crashesFolder + "/" + name + ".json",JSON.stringify(data,null,"\t")); } + ,initIntergationHandlers: function() { + var _gthis = this; + if(process.env["_"] != null && process.env["_"].indexOf("heroku") != -1 && process.env["APP_URL"] != null) { + new haxe_Timer(600000).run = function() { + if(_gthis.clients.length == 0) { + return; + } + var url = "http://" + process.env["APP_URL"]; + haxe_Log.trace("Ping " + url,{ fileName : "src/server/Main.hx", lineNumber : 140, className : "server.Main", methodName : "initIntergationHandlers"}); + js_node_Http.get(url,function(r) { + return; + }); + }; + } + } ,onConnect: function(ws,req) { var _gthis = this; var ip = req.connection.remoteAddress; var id = this.freeIds.length > 0 ? this.freeIds.shift() : this.clients.length; var name = "Guest " + (id + 1); - haxe_Log.trace("" + name + " connected (" + ip + ")",{ fileName : "src/server/Main.hx", lineNumber : 134, className : "server.Main", methodName : "onConnect"}); + haxe_Log.trace("" + name + " connected (" + ip + ")",{ fileName : "src/server/Main.hx", lineNumber : 150, className : "server.Main", methodName : "onConnect"}); var client = new Client(ws,req,id,name,0); if(req.connection.localAddress == ip) { client.group |= 4; @@ -776,7 +793,7 @@ server_Main.prototype = { return; }); ws.on("close",function(err) { - haxe_Log.trace("Client " + client.name + " disconnected",{ fileName : "src/server/Main.hx", lineNumber : 162, className : "server.Main", methodName : "onConnect"}); + haxe_Log.trace("Client " + client.name + " disconnected",{ fileName : "src/server/Main.hx", lineNumber : 178, className : "server.Main", methodName : "onConnect"}); server_Utils.sortedPush(_gthis.freeIds,client.id); HxOverrides.remove(_gthis.clients,client); _gthis.sendClientList(); @@ -1165,7 +1182,6 @@ function $getIterator(o) { if( o instanceof Array ) return HxOverrides.iter(o); function $bind(o,m) { if( m == null ) return null; if( m.__id__ == null ) m.__id__ = $global.$haxeUID++; var f; if( o.hx__closures__ == null ) o.hx__closures__ = {}; else f = o.hx__closures__[m.__id__]; if( f == null ) { f = m.bind(o); o.hx__closures__[m.__id__] = f; } return f; } $global.$haxeUID |= 0; var __map_reserved = {}; -if( String.fromCodePoint == null ) String.fromCodePoint = function(c) { return c < 0x10000 ? String.fromCharCode(c) : String.fromCharCode((c>>10)+0xD7C0)+String.fromCharCode((c&0x3FF)+0xDC00); } String.__name__ = true; Array.__name__ = true; Object.defineProperty(js__$Boot_HaxeError.prototype,"message",{ get : function() { diff --git a/res/client.js b/res/client.js index ebe12b8..0f003eb 100644 --- a/res/client.js +++ b/res/client.js @@ -722,8 +722,7 @@ client_Main.prototype = { if(!StringTools.startsWith(url,"http")) { url = "" + protocol + "//" + url; } - var pos = url.lastIndexOf("/") + 1; - var name = HxOverrides.substr(url,pos,null); + var name = HxOverrides.substr(url,url.lastIndexOf("/") + 1,null); var matchName = new EReg("^(.+)\\.",""); if(matchName.match(name)) { name = matchName.matched(1); @@ -947,9 +946,8 @@ client_Main.prototype = { } var smilesWrap = window.document.querySelector("#smileswrap"); smilesWrap.onclick = function(e) { - var el = e.target; var form = window.document.querySelector("#chatline"); - form.value += " " + el.title; + form.value += " " + e.target.title; form.focus(); return; }; diff --git a/src/server/Main.hx b/src/server/Main.hx index 9f7534c..5d82ef1 100644 --- a/src/server/Main.hx +++ b/src/server/Main.hx @@ -38,18 +38,16 @@ class Main { final envPort = (process.env : Dynamic).PORT; if (envPort != null) port = envPort; statePath = '$rootDir/user/state.json'; - config = getUserConfig(); - loadState(); function exit() { saveState(); process.exit(); } - process.on("exit", exit); + // process.on("exit", exit); process.on("SIGINT", exit); // ctrl+c process.on("SIGUSR1", exit); // kill pid process.on("SIGUSR2", exit); + process.on("SIGTERM", exit); process.on("uncaughtException", err -> { - trace(err); logError("uncaughtException", { message: err.message, stack: err.stack @@ -57,10 +55,12 @@ class Main { exit(); }); process.on("unhandledRejection", (reason, promise) -> { - trace("Unhandled Rejection at:", reason); logError("unhandledRejection", reason); exit(); }); + initIntergationHandlers(); + loadState(); + config = getUserConfig(); localIp = Utils.getLocalIp(); globalIp = localIp; this.port = port; @@ -96,6 +96,7 @@ class Main { } function saveState():Void { + trace("Saving state..."); final data:ServerState = { videoList: videoList, messages: messages, @@ -110,6 +111,7 @@ class Main { function loadState():Void { if (!FileSystem.exists(statePath)) return; + trace("Loading state..."); final data:ServerState = Json.parse(File.getContent(statePath)); videoList.resize(0); messages.resize(0); @@ -121,12 +123,26 @@ class Main { } function logError(type:String, data:Dynamic):Void { + trace(type, data); 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 initIntergationHandlers():Void { + // Prevent heroku idle when clients online (needs APP_URL env var) + if (process.env["_"] != null && process.env["_"].contains("heroku") + && process.env["APP_URL"] != null) { + new Timer(10 * 60 * 1000).run = function() { + if (clients.length == 0) return; + final url = 'http://${process.env["APP_URL"]}'; + trace('Ping $url'); + Http.get(url, r -> {}); + } + } + } + function onConnect(ws:WebSocket, req:IncomingMessage):Void { final ip = req.connection.remoteAddress; final id = freeIds.length > 0 ? freeIds.shift() : clients.length; |
