timeout-request
Version:
http timeout request middleware
117 lines (97 loc) • 2.38 kB
JavaScript
;
/**
* @file timeout-request main
* @module timeout-request
* @version 1.7.0
* @author hex7c0 <hex7c0@gmail.com>
* @copyright hex7c0 2014
* @license GPLv3
*/
/*
* functions
*/
/**
* function wrapper for multiple require
*
* @function wrapper
* @param {Object} my - parsed options
* @param {Boolear} flag - flag for custom callback
* @return {Function}
*/
function wrapper(my, flag) {
var callback;
if (flag) {
if (my.header) {
callback = function(req, res) {
var t = res._headerSent === false || res.finished === false;
return t === true ? my.callback(req, res, my.data) : null;
};
} else {
callback = function(req, res) {
my.callback(req, res, my.data);
};
}
} else {
var finale = function(req, res) {
res.end();
req.socket.destroy();
};
if (my.header) {
callback = function(req, res) {
var t = res._headerSent === false || res.finished === false;
return t === true ? finale(req, res) : null;
};
} else {
callback = function(req, res) {
finale(req, res);
};
}
}
/**
* set timeout as middleware with callback
*
* @function timer
* @param {Object} req - client request
* @param {Object} res - response to client
* @param {next} next - continue routes
* @return {next}
*/
return function timer(req, res, next) {
req.timeout = setTimeout(callback.bind(this, req, res), my.milliseconds);
// buff
var destroy = req.socket.destroy;
var end = res.end;
// override
req.socket.destroy = function() {
clearTimeout(req.timeout);
destroy.call(this);
};
res.end = function(chunk, encoding) {
clearTimeout(req.timeout);
end.call(this, chunk, encoding);
};
next();
};
}
/**
* option setting
*
* @exports timeout
* @function timeout
* @param {Object} opt - various options. Check README.md
* @return {Function}
*/
function timeout(opt) {
var options = opt || Object.create(null);
var my = {
milliseconds: Number(options.milliseconds) || 5000,
header: Boolean(options.header),
};
if (typeof options.callback == 'function') {
my.callback = options.callback;
my.data = options.data;
return wrapper(my, true);
}
return wrapper(my, false);
}
module.exports = timeout;