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
|
||
|
}));
|
||
|
};
|
||
|
}
|