co-timeout
Version:
Error on timeout.
54 lines (44 loc) • 964 B
JavaScript
/**
* Module dependencies.
*/
var parse = require('ms');
var co = require('co');
/**
* Timeout with an error after `ms`.
*
* @param {Number|String} ms
* @param {Generator} fn
* @return {Function}
* @api public
*/
module.exports = function(ms, fn){
var fn = isGenerator(fn) ? co(fn) : fn;
if ('string' == typeof ms) ms = parse(ms);
return function(done){
var ended;
var id;
id = setTimeout(function(){
ended = true;
var err = new Error('timeout of "' + ms + '" reached');
err.timeout = ms;
done(err);
}, ms);
fn(function(err){
if (ended) return;
clearTimeout(id);
if (err) return done(err);
var args = [].slice.call(arguments, 1);
done.apply(null, [null].concat(args));
});
};
};
/**
* Is generator.
*
* @param {Function} fn
* @return {Boolean}
* @api private
*/
function isGenerator(fn){
return 0 == fn.constructor.name.indexOf('GeneratorFunction');
}