Better support for await

This commit is contained in:
Anthony Laibe 2018-09-17 09:57:51 +01:00
parent a43627de5b
commit 3a210f602b
1 changed files with 21 additions and 11 deletions

View File

@ -1,4 +1,5 @@
const RunCode = require('./runCode.js');
const Utils = require('../../../utils/utils');
class CodeRunner {
constructor(options) {
@ -59,19 +60,23 @@ class CodeRunner {
this.runCode.registerVar(varName, code);
}
evalCode(code, cb, forConsoleOnly = false) {
async evalCode(code, cb, forConsoleOnly = false) {
cb = cb || function() {};
const awaitIdx = code.indexOf('await');
let awaiting = false;
if (awaitIdx > -1) {
if (awaitIdx < 2) {
let end = code.length;
if (code[end - 1] === ';') {
end--; // Remove the `;` because we add function calls
}
code = code.substring(5, end); // remove await keyword
awaiting = true;
const instructions = Utils.compact(code.split(';'));
const last = instructions.pop();
if (!last.trim().startsWith('return')) {
instructions.push(`return ${last}`);
} else {
code = `(async function() {${code}})();`;
instructions.push(last);
}
code = `(async function() {${instructions.join(';')}})();`;
}
let result = this.runCode.doEval(code);
@ -80,11 +85,16 @@ class CodeRunner {
this.ipc.broadcast("runcode:newCommand", {code});
}
if (result instanceof Promise && !result.on) {
return result.then((value) => { cb(null, value); }).catch(cb);
if (!awaiting) {
return cb(null, result);
}
cb(null, result);
try {
const value = await result;
cb(null, value);
} catch (error) {
cb(error);
}
}
}