From 3d201981e238429b75fa03ebb8e0f57d5e3153b8 Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Sat, 2 Aug 2014 21:40:49 +0300 Subject: [PATCH] Use Node.js domains to gracefully handle exceptions. --- lib/server.coffee | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/lib/server.coffee b/lib/server.coffee index b80acd2..6ec1477 100644 --- a/lib/server.coffee +++ b/lib/server.coffee @@ -15,6 +15,9 @@ # along with GenieACS. If not, see . ### +domain = require 'domain' +util = require 'util' +cluster = require 'cluster' config = require './config' db = require './db' @@ -26,7 +29,40 @@ networkInterface = config["#{service.toUpperCase()}_INTERFACE"] port = config["#{service.toUpperCase()}_PORT"] useHttps = config["#{service.toUpperCase()}_SSL"] -listener = require("./#{service}").listener +serviceListener = require("./#{service}").listener + +server = null + +listener = (httpRequest, httpResponse) -> + d = domain.create() + + d.on('error', (err) -> + util.error("#{new Date().toISOString()} - #{err.stack}\n") + try + killTimer = setTimeout(() -> + process.exit(1) + , 30000) + + killTimer.unref() + + cluster.worker?.disconnect() + server.close(() -> + db.disconnect() + ) + + httpResponse.writeHead(500, {'Connection' : 'close'}) + httpResponse.end() + catch err2 + util.error("#{new Date().toISOString()} - #{err2.stack}\n") + ) + + d.add(httpRequest) + d.add(httpResponse) + + d.run(() -> + serviceListener(httpRequest, httpResponse) + ) + if useHttps path = require 'path'