From 5fc32d035fee872dcac57505c2151e28f149ee44 Mon Sep 17 00:00:00 2001 From: Anoop M D Date: Tue, 28 Mar 2023 14:49:57 +0530 Subject: [PATCH] wip: working on async scripting support --- .../bruno-electron/src/ipc/network/index.js | 2 +- .../bruno-js/src/runtime/script-runtime.js | 30 +++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index de3d2d3b0..9161a28fa 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -113,7 +113,7 @@ const registerNetworkIpc = (mainWindow, watcher, lastOpenedCollections) => { const requestScript = get(request, 'script.req'); if(requestScript && requestScript.length) { const scriptRuntime = new ScriptRuntime(); - const result = scriptRuntime.runRequestScript(requestScript, request, envVars, collectionVariables, collectionPath); + const result = await scriptRuntime.runRequestScript(requestScript, request, envVars, collectionVariables, collectionPath); mainWindow.webContents.send('main:script-environment-update', { envVariables: result.envVariables, diff --git a/packages/bruno-js/src/runtime/script-runtime.js b/packages/bruno-js/src/runtime/script-runtime.js index 39ce6b1ba..045c80a03 100644 --- a/packages/bruno-js/src/runtime/script-runtime.js +++ b/packages/bruno-js/src/runtime/script-runtime.js @@ -1,5 +1,12 @@ const { NodeVM } = require('vm2'); const path = require('path'); +const http = require('http'); +const https = require('https'); +const stream = require('stream'); +const util = require('util'); +const zlib = require('zlib'); +const url = require('url'); +const punycode = require('punycode'); const Bru = require('../bru'); const BrunoRequest = require('../bruno-request'); const BrunoResponse = require('../bruno-response'); @@ -11,13 +18,14 @@ const lodash = require('lodash'); const moment = require('moment'); const uuid = require('uuid'); const nanoid = require('nanoid'); +const axios = require('axios'); const CryptoJS = require('crypto-js'); class ScriptRuntime { constructor() { } - runRequestScript(script, request, envVariables, collectionVariables, collectionPath) { + async runRequestScript(script, request, envVariables, collectionVariables, collectionPath) { const bru = new Bru(envVariables, collectionVariables); const req = new BrunoRequest(request); @@ -32,18 +40,36 @@ class ScriptRuntime { external: true, root: [collectionPath], mock: { + // node libs + path, + stream, + util, + url, + http, + https, + punycode, + zlib, + // 3rd party libs atob, btoa, lodash, moment, uuid, nanoid, + axios, 'crypto-js': CryptoJS } } }); - vm.run(script, path.join(collectionPath, 'vm.js')); + // wrap script inside a async function that gets called + script = `return (async () => { ${script} })()`; + + // bug that needs to be fixed + // vm.run is not awaiting the async function + // created an issue in vm2 repo: https://github.com/patriksimek/vm2/issues/513 + const result = await vm.run(script, path.join(collectionPath, 'vm.js')); + console.log(result); return { request,