@cucumber/cucumber
Version:
The official JavaScript implementation of Cucumber.
82 lines • 3.38 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const node_util_1 = __importDefault(require("node:util"));
const time_1 = require("./time");
const uncaught_exception_manager_1 = __importDefault(require("./uncaught_exception_manager"));
const value_checker_1 = require("./value_checker");
const UserCodeRunner = {
async run({ argsArray, thisArg, fn, timeoutInMilliseconds, }) {
const callbackPromise = new Promise((resolve, reject) => {
argsArray.push((error, result) => {
if ((0, value_checker_1.doesHaveValue)(error)) {
reject(error);
}
else {
resolve(result);
}
});
});
let fnReturn;
try {
fnReturn = fn.apply(thisArg, argsArray);
}
catch (e) {
const error = e instanceof Error ? e : node_util_1.default.format(e);
return { error };
}
const racingPromises = [];
const callbackInterface = fn.length === argsArray.length;
const promiseInterface = (0, value_checker_1.doesHaveValue)(fnReturn) && typeof fnReturn.then === 'function';
if (callbackInterface && promiseInterface) {
return {
error: new Error('function uses multiple asynchronous interfaces: callback and promise\n' +
'to use the callback interface: do not return a promise\n' +
'to use the promise interface: remove the last argument to the function'),
};
}
else if (callbackInterface) {
racingPromises.push(callbackPromise);
}
else if (promiseInterface) {
racingPromises.push(fnReturn);
}
else {
return { result: fnReturn };
}
let exceptionHandler;
const uncaughtExceptionPromise = new Promise((resolve, reject) => {
exceptionHandler = reject;
uncaught_exception_manager_1.default.registerHandler(exceptionHandler);
});
racingPromises.push(uncaughtExceptionPromise);
let finalPromise = Promise.race(racingPromises);
if (timeoutInMilliseconds >= 0) {
const timeoutMessage = 'function timed out, ensure the ' +
(callbackInterface ? 'callback is executed' : 'promise resolves') +
` within ${timeoutInMilliseconds.toString()} milliseconds`;
finalPromise = (0, time_1.wrapPromiseWithTimeout)(finalPromise, timeoutInMilliseconds, timeoutMessage);
}
let error, result;
try {
result = await finalPromise;
}
catch (e) {
if (e instanceof Error) {
error = e;
}
else if ((0, value_checker_1.doesHaveValue)(e)) {
error = node_util_1.default.format(e);
}
else {
error = new Error('Promise rejected without a reason');
}
}
uncaught_exception_manager_1.default.unregisterHandler(exceptionHandler);
return { error, result };
},
};
exports.default = UserCodeRunner;
//# sourceMappingURL=user_code_runner.js.map