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.
127 lines
3.0 KiB
127 lines
3.0 KiB
'use strict'; |
|
|
|
Object.defineProperty(exports, '__esModule', { |
|
value: true |
|
}); |
|
exports.default = queueRunner; |
|
|
|
var _jestUtil = require('jest-util'); |
|
|
|
var _PCancelable = _interopRequireDefault(require('./PCancelable')); |
|
|
|
var _pTimeout = _interopRequireDefault(require('./pTimeout')); |
|
|
|
function _interopRequireDefault(obj) { |
|
return obj && obj.__esModule ? obj : {default: obj}; |
|
} |
|
|
|
var global = (function () { |
|
if (typeof globalThis !== 'undefined') { |
|
return globalThis; |
|
} else if (typeof global !== 'undefined') { |
|
return global; |
|
} else if (typeof self !== 'undefined') { |
|
return self; |
|
} else if (typeof window !== 'undefined') { |
|
return window; |
|
} else { |
|
return Function('return this')(); |
|
} |
|
})(); |
|
|
|
var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol; |
|
|
|
var global = (function () { |
|
if (typeof globalThis !== 'undefined') { |
|
return globalThis; |
|
} else if (typeof global !== 'undefined') { |
|
return global; |
|
} else if (typeof self !== 'undefined') { |
|
return self; |
|
} else if (typeof window !== 'undefined') { |
|
return window; |
|
} else { |
|
return Function('return this')(); |
|
} |
|
})(); |
|
|
|
var Symbol = global['jest-symbol-do-not-touch'] || global.Symbol; |
|
|
|
var global = (function () { |
|
if (typeof globalThis !== 'undefined') { |
|
return globalThis; |
|
} else if (typeof global !== 'undefined') { |
|
return global; |
|
} else if (typeof self !== 'undefined') { |
|
return self; |
|
} else if (typeof window !== 'undefined') { |
|
return window; |
|
} else { |
|
return Function('return this')(); |
|
} |
|
})(); |
|
|
|
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 (...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 ' + |
|
(0, _jestUtil.formatTime)(timeoutMs) + |
|
' 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) |
|
}; |
|
}
|
|
|