You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.7 KiB
89 lines
2.7 KiB
'use strict'; |
|
|
|
Object.defineProperty(exports, "__esModule", { |
|
value: true |
|
}); |
|
exports.default = timeout; |
|
|
|
var _initialParams = require('./internal/initialParams.js'); |
|
|
|
var _initialParams2 = _interopRequireDefault(_initialParams); |
|
|
|
var _wrapAsync = require('./internal/wrapAsync.js'); |
|
|
|
var _wrapAsync2 = _interopRequireDefault(_wrapAsync); |
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
|
|
|
/** |
|
* Sets a time limit on an asynchronous function. If the function does not call |
|
* its callback within the specified milliseconds, it will be called with a |
|
* timeout error. The code property for the error object will be `'ETIMEDOUT'`. |
|
* |
|
* @name timeout |
|
* @static |
|
* @memberOf module:Utils |
|
* @method |
|
* @category Util |
|
* @param {AsyncFunction} asyncFn - The async function to limit in time. |
|
* @param {number} milliseconds - The specified time limit. |
|
* @param {*} [info] - Any variable you want attached (`string`, `object`, etc) |
|
* to timeout Error for more information.. |
|
* @returns {AsyncFunction} Returns a wrapped function that can be used with any |
|
* of the control flow functions. |
|
* Invoke this function with the same parameters as you would `asyncFunc`. |
|
* @example |
|
* |
|
* function myFunction(foo, callback) { |
|
* doAsyncTask(foo, function(err, data) { |
|
* // handle errors |
|
* if (err) return callback(err); |
|
* |
|
* // do some stuff ... |
|
* |
|
* // return processed data |
|
* return callback(null, data); |
|
* }); |
|
* } |
|
* |
|
* var wrapped = async.timeout(myFunction, 1000); |
|
* |
|
* // call `wrapped` as you would `myFunction` |
|
* wrapped({ bar: 'bar' }, function(err, data) { |
|
* // if `myFunction` takes < 1000 ms to execute, `err` |
|
* // and `data` will have their expected values |
|
* |
|
* // else `err` will be an Error with the code 'ETIMEDOUT' |
|
* }); |
|
*/ |
|
function timeout(asyncFn, milliseconds, info) { |
|
var fn = (0, _wrapAsync2.default)(asyncFn); |
|
|
|
return (0, _initialParams2.default)((args, callback) => { |
|
var timedOut = false; |
|
var timer; |
|
|
|
function timeoutCallback() { |
|
var name = asyncFn.name || 'anonymous'; |
|
var error = new Error('Callback function "' + name + '" timed out.'); |
|
error.code = 'ETIMEDOUT'; |
|
if (info) { |
|
error.info = info; |
|
} |
|
timedOut = true; |
|
callback(error); |
|
} |
|
|
|
args.push((...cbArgs) => { |
|
if (!timedOut) { |
|
callback(...cbArgs); |
|
clearTimeout(timer); |
|
} |
|
}); |
|
|
|
// setup timer and call original function |
|
timer = setTimeout(timeoutCallback, milliseconds); |
|
fn(...args); |
|
}); |
|
} |
|
module.exports = exports['default']; |