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
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |     value: true | ||
|  | }); | ||
|  | exports.default = timeout; | ||
|  | 
 | ||
|  | var _initialParams = require('./internal/initialParams'); | ||
|  | 
 | ||
|  | var _initialParams2 = _interopRequireDefault(_initialParams); | ||
|  | 
 | ||
|  | var _wrapAsync = require('./internal/wrapAsync'); | ||
|  | 
 | ||
|  | 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)(function (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(function () { | ||
|  |             if (!timedOut) { | ||
|  |                 callback.apply(null, arguments); | ||
|  |                 clearTimeout(timer); | ||
|  |             } | ||
|  |         }); | ||
|  | 
 | ||
|  |         // setup timer and call original function
 | ||
|  |         timer = setTimeout(timeoutCallback, milliseconds); | ||
|  |         fn.apply(null, args); | ||
|  |     }); | ||
|  | } | ||
|  | module.exports = exports['default']; |