82 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			82 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, '__esModule', { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.default = queueRunner; | ||
|  | 
 | ||
|  | var _PCancelable = _interopRequireDefault(require('./PCancelable')); | ||
|  | 
 | ||
|  | var _pTimeout = _interopRequireDefault(require('./pTimeout')); | ||
|  | 
 | ||
|  | function _interopRequireDefault(obj) { | ||
|  |   return obj && obj.__esModule ? obj : {default: obj}; | ||
|  | } | ||
|  | 
 | ||
|  | var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol; | ||
|  | var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol; | ||
|  | var Promise = global[Symbol.for('jest-native-promise')] || global.Promise; | ||
|  | 
 | ||
|  | function queueRunner(options) { | ||
|  |   const token = new _PCancelable.default((onCancel, resolve) => { | ||
|  |     onCancel(resolve); | ||
|  |   }); | ||
|  | 
 | ||
|  |   const mapper = ({fn, timeout, initError = new Error()}) => { | ||
|  |     let promise = new Promise(resolve => { | ||
|  |       const next = function next(...args) { | ||
|  |         const err = args[0]; | ||
|  | 
 | ||
|  |         if (err) { | ||
|  |           options.fail.apply(null, args); | ||
|  |         } | ||
|  | 
 | ||
|  |         resolve(); | ||
|  |       }; | ||
|  | 
 | ||
|  |       next.fail = function(...args) { | ||
|  |         options.fail.apply(null, args); | ||
|  |         resolve(); | ||
|  |       }; | ||
|  | 
 | ||
|  |       try { | ||
|  |         fn.call(options.userContext, next); | ||
|  |       } catch (e) { | ||
|  |         options.onException(e); | ||
|  |         resolve(); | ||
|  |       } | ||
|  |     }); | ||
|  |     promise = Promise.race([promise, token]); | ||
|  | 
 | ||
|  |     if (!timeout) { | ||
|  |       return promise; | ||
|  |     } | ||
|  | 
 | ||
|  |     const timeoutMs = timeout(); | ||
|  |     return (0, _pTimeout.default)( | ||
|  |       promise, | ||
|  |       timeoutMs, | ||
|  |       options.clearTimeout, | ||
|  |       options.setTimeout, | ||
|  |       () => { | ||
|  |         initError.message = | ||
|  |           'Timeout - Async callback was not invoked within the ' + | ||
|  |           timeoutMs + | ||
|  |           'ms timeout specified by jest.setTimeout.'; | ||
|  |         initError.stack = initError.message + initError.stack; | ||
|  |         options.onException(initError); | ||
|  |       } | ||
|  |     ); | ||
|  |   }; | ||
|  | 
 | ||
|  |   const result = options.queueableFns.reduce( | ||
|  |     (promise, fn) => promise.then(() => mapper(fn)), | ||
|  |     Promise.resolve() | ||
|  |   ); | ||
|  |   return { | ||
|  |     cancel: token.cancel.bind(token), | ||
|  |     catch: result.catch.bind(result), | ||
|  |     then: result.then.bind(result) | ||
|  |   }; | ||
|  | } |