/*!
|
|
* Connect - timeout
|
|
* Ported from https://github.com/LearnBoost/connect-timeout
|
|
* MIT Licensed
|
|
*/
|
|
|
|
/**
|
|
* Module dependencies.
|
|
*/
|
|
|
|
var debug = require('debug')('connect:timeout');
|
|
|
|
/**
|
|
* Timeout:
|
|
*
|
|
* Times out the request in `ms`, defaulting to `5000`. The
|
|
* method `req.clearTimeout()` is added to revert this behaviour
|
|
* programmatically within your application's middleware, routes, etc.
|
|
*
|
|
* The timeout error is passed to `next()` so that you may customize
|
|
* the response behaviour. This error has the `.timeout` property as
|
|
* well as `.status == 408`.
|
|
*
|
|
* @param {Number} ms
|
|
* @return {Function}
|
|
* @api public
|
|
*/
|
|
|
|
module.exports = function timeout(ms) {
|
|
ms = ms || 5000;
|
|
|
|
return function(req, res, next) {
|
|
var id = setTimeout(function(){
|
|
req.emit('timeout', ms);
|
|
}, ms);
|
|
|
|
req.on('timeout', function(){
|
|
if (res.headerSent) return debug('response started, cannot timeout');
|
|
var err = new Error('Response timeout');
|
|
err.timeout = ms;
|
|
err.status = 503;
|
|
next(err);
|
|
});
|
|
|
|
req.clearTimeout = function(){
|
|
clearTimeout(id);
|
|
};
|
|
|
|
res.on('header', function(){
|
|
clearTimeout(id);
|
|
});
|
|
|
|
next();
|
|
};
|
|
};
|