-
Notifications
You must be signed in to change notification settings - Fork 0
/
debug-middleware.js
53 lines (46 loc) · 1.53 KB
/
debug-middleware.js
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
exports.debug = function(app, msTimeout){
msTimeout = msTimeout || 5000;
exports.shimRoutes(app, msTimeout);
exports.shimMiddleware(app, msTimeout);
};
exports.shimRoutes = function(app, timeoutMilliseconds) {
var app_routes = app.routes.routes || app.routes;
for(var method in app_routes){
var routes = app_routes[method];
routes.forEach(function(route){
for(var i = 0; i < route.callbacks.length; i++){
var middleware = route.callbacks[i];
route.callbacks[i] = exports.timeoutFn(middleware, timeoutMilliseconds);
}
});
}
};
exports.shimMiddleware = function(app, timeoutMilliseconds) {
for(var i in app.stack) {
var middleware = app.stack[i];
if(app.router === middleware.handle) continue;
if(middleware.handle.length != 3) continue;
middleware.handle = exports.timeoutFn(middleware.handle, timeoutMilliseconds);
}
};
exports.timeoutFn = function(middleware, timeoutMilliseconds){
return function(req, res, next) {
var timeoutId = setTimeout(function() {
if (!res.finished) exports.callLogger(middleware, req, res);
}, timeoutMilliseconds);
var nextFn = function(err){
clearTimeout(timeoutId);
next(err);
};
middleware(req, res, nextFn);
}
};
exports.callLogger = function(middleware, req, res) {
var logString = [
"A route middleware took too long to execute:",
req.method,
req.headers.host + req.url,
middleware.toString().split(/\n/).join('\\n') // avoid interleaved log lines
].join(' ');
console.warn(logString);
};