js-executor-cg-lib
Version:
Library to execute javascript code
91 lines (80 loc) • 2.08 kB
JavaScript
const vm = require('vm');
const co = require('co');
const convert = require('xml-js');
const Cryptr = require('cryptr');
const lodash = require('lodash');
const { api, objectApiOpt, objectApiReq } = require('api-cg-lib');
const { utils, log } = require('utils-limited');
/**
*
* @param properties
* @returns {Promise<Object>}
*/
let finalResult;
function wait(timeout) {
return new Promise((ok) => {
setTimeout(() => {
console.log('Done wait');
ok();
}, timeout);
console.log('Start wait sec=%s', timeout);
});
}
const transformJsExecutor = async (properties, data) => {
let arguments = data;
const vmExports = {};
const ctx = vm.createContext({
// Node Globals
Buffer,
clearInterval,
clearTimeout,
console,
exports: vmExports,
global: {},
module: { exports: vmExports },
process,
require,
setInterval,
setTimeout,
URL,
URLSearchParams,
arguments,
// Other Libraries
convert,
Cryptr,
lodash,
utils,
log,
api,
objectApiOpt,
objectApiReq,
wait: wait.bind(this),
});
//console.log('my properties '+properties);
let code = `async function run(arguments){${properties.code}}`;
vm.runInContext(code, ctx, {
displayErrors: true,
});
if (ctx.run && typeof ctx.run.apply === 'function') {
let result;
if (ctx.run.constructor.name === 'GeneratorFunction') {
const fn = co.wrap(ctx.run);
result = fn.apply(this, [arguments]);
} else {
result = ctx.run.apply(this, [arguments]);
}
if (typeof result === 'object' && typeof result.then === 'function') {
let returnResult;
try {
returnResult = await result;
// console.log('aqui imprimiendo el result ed ale '+returnResult);
return returnResult;
} catch (e) {
throw Error(e);
}
}
} else {
return ("Run function was not found, it's over now");
}
};
module.exports = { transformJsExecutor };