-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
107 lines (85 loc) · 3.57 KB
/
index.js
File metadata and controls
107 lines (85 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
var http = require('http');
var compressionHandler = require('./Utilities/compressionHandler');
var parseRoutes = require('./RouteParser');
var RouteFinder = require('./RouteFinder');
var ClassLoader = require('./classLoader');
var BaseController = require('./baseController');
var SetupGlobals = require('./setup.js');
module.exports = (function() {
return function TachiHandler(settings, routes) {
SetupGlobals(settings);
Logger.log('Setup Complete.');
var parsedRoutes = parseRoutes(routes);
var findRoute = new RouteFinder(parsedRoutes);
var baseController = new BaseController(findRoute);
var classLoader = new ClassLoader(baseController);
Html = require('tachi/Utilities/html')(baseController);
var Router = require('./Router');
var routeRequest = new Router(parsedRoutes, classLoader);
var failedRequest = function(res) {
res.writeHead(404, {
'Content-Type': 'text/html; charset=UTF-8'
});
res.write('There was an error processing the request.');
};
var getClientIp = function(req) {
var ip = req.headers['x-forwarded-for'];
if (!ip) {
ip = req.connection.remoteAddress;
}
return ip;
};
var server = http.createServer(function(req, res) {
var ip = getClientIp(req);
var start = new Date();
Logger.log('Incoming request from ' + ip + '. (' + req.url + ')');
try {
var routerDeferred = routeRequest(req, res);
routerDeferred.onComplete(function(output) {
if (!output) {
Logger.log('Routing failed. (' + req.url + ')');
failedRequest(res);
} else if (output !== true && !(output._unmodified || output._redirect)) {
compressionHandler(req, res, output)
.onComplete(function() {
Logger.log('Response ended');
Logger.log('Transaction Timing: ' + req.url + ' :: ' + (new Date() - start) + 'ms');
res.end();
});
return;
}
Logger.log('Response ended');
Logger.log('Transaction Timing: ' + req.url + ' :: ' + (new Date() - start) + 'ms');
res.end();
});
} catch (err) {
Logger.log('Response failed');
Logger.log(err);
Logger.log(err.stack);
failedRequest(res);
}
});
var port = settings.port || 80;
var stopFunc = this.stop = function() {
Logger.log('Closing Tachi server');
server.close();
Logger.log('Teardown complete.');
};
this.start = function() {
server.listen(port);
// Needs replacing with something a little more robust.
process.on('uncaughtException', function(err) {
Logger.log('Unhandled exception occured: ');
if (err.message) {
Logger.log('\nMessage: ' + err.message)
}
if (err.stack) {
Logger.log('\nStacktrace:')
Logger.log('====================')
Logger.log(err.stack);
}
Logger.log('Exception handled, resuming');
});
};
};
})();