75 lines
1.4 KiB
JavaScript
75 lines
1.4 KiB
JavaScript
/*!
|
|
* connect-timeout
|
|
* Copyright(c) 2014 Jonathan Ong
|
|
* Copyright(c) 2014 Douglas Christopher Wilson
|
|
* MIT Licensed
|
|
*/
|
|
|
|
/**
|
|
* Module dependencies.
|
|
*/
|
|
|
|
var createError = require('http-errors');
|
|
var debug = require('debug')('connect:timeout');
|
|
var ms = require('ms');
|
|
var onHeaders = require('on-headers');
|
|
|
|
/**
|
|
* Timeout:
|
|
*
|
|
* See README.md for documentation.
|
|
*
|
|
* @param {Number} time
|
|
* @param {Object} options
|
|
* @return {Function} middleware
|
|
* @api public
|
|
*/
|
|
|
|
module.exports = function timeout(time, options) {
|
|
options = options || {};
|
|
|
|
time = typeof time === 'string'
|
|
? ms(time)
|
|
: Number(time || 5000);
|
|
|
|
var respond = !('respond' in options) || options.respond === true;
|
|
|
|
return function(req, res, next) {
|
|
var destroy = req.socket.destroy;
|
|
var id = setTimeout(function(){
|
|
req.timedout = true;
|
|
req.emit('timeout', time);
|
|
}, time);
|
|
|
|
if (respond) {
|
|
req.on('timeout', onTimeout(time, next));
|
|
}
|
|
|
|
req.clearTimeout = function(){
|
|
clearTimeout(id);
|
|
};
|
|
|
|
req.socket.destroy = function(){
|
|
clearTimeout(id);
|
|
destroy.call(this);
|
|
};
|
|
|
|
req.timedout = false;
|
|
|
|
onHeaders(res, function(){
|
|
clearTimeout(id);
|
|
});
|
|
|
|
next();
|
|
};
|
|
};
|
|
|
|
function onTimeout(time, cb){
|
|
return function(){
|
|
cb(createError(503, 'Response timeout', {
|
|
code: 'ETIMEDOUT',
|
|
timeout: time
|
|
}));
|
|
};
|
|
}
|