From 126c648d7dee5767e1de6b65b7d37e302ed8e95d Mon Sep 17 00:00:00 2001 From: lohit Date: Mon, 19 Aug 2024 10:30:19 +0530 Subject: [PATCH 1/2] wip: code cleanup, added axios shim to quick js vm (#2851) * wip: code cleanup, added axios, nanoid shims for quickjs vm * wip: test fn fix * wip: scrip exec fix * wip: added node-fetch & uuid shims --- packages/bruno-js/package.json | 2 +- .../bruno-js/src/runtime/script-runtime.js | 14 +-- .../bruno-js/src/sandbox/quickjs/index.js | 91 +++---------------- .../src/sandbox/quickjs/shims/lib/axios.js | 72 +++++++++++++++ .../src/sandbox/quickjs/shims/lib/index.js | 10 +- .../src/sandbox/quickjs/shims/lib/nanoid.js | 21 ++++- .../sandbox/quickjs/shims/lib/node-fetch.js | 41 +++++++++ .../src/sandbox/quickjs/shims/lib/uuid.js | 30 ++++++ .../src/sandbox/quickjs/shims/sleep.js | 14 +++ .../src/sandbox/quickjs/shims/test.js | 86 +++++++++--------- .../inbuilt modules/nanoid/nanoid.bru | 17 ++++ .../node-fetch/node-fetch-pre-req-script.bru | 36 ++++++++ .../scripting/inbuilt modules/uuid/uuid.bru | 17 ++++ 13 files changed, 316 insertions(+), 135 deletions(-) create mode 100644 packages/bruno-js/src/sandbox/quickjs/shims/lib/axios.js create mode 100644 packages/bruno-js/src/sandbox/quickjs/shims/lib/node-fetch.js create mode 100644 packages/bruno-js/src/sandbox/quickjs/shims/lib/uuid.js create mode 100644 packages/bruno-js/src/sandbox/quickjs/shims/sleep.js create mode 100644 packages/bruno-tests/collection/scripting/inbuilt modules/nanoid/nanoid.bru create mode 100644 packages/bruno-tests/collection/scripting/inbuilt modules/node-fetch/node-fetch-pre-req-script.bru create mode 100644 packages/bruno-tests/collection/scripting/inbuilt modules/uuid/uuid.bru diff --git a/packages/bruno-js/package.json b/packages/bruno-js/package.json index a0dd1546d..b368cfe19 100644 --- a/packages/bruno-js/package.json +++ b/packages/bruno-js/package.json @@ -33,7 +33,7 @@ "lodash": "^4.17.21", "moment": "^2.29.4", "nanoid": "3.3.4", - "node-fetch": "2.*", + "node-fetch": "^2.7.0", "node-vault": "^0.10.2", "quickjs-emscripten": "^0.29.2", "uuid": "^9.0.0" diff --git a/packages/bruno-js/src/runtime/script-runtime.js b/packages/bruno-js/src/runtime/script-runtime.js index 2584cecf1..d6a6c6771 100644 --- a/packages/bruno-js/src/runtime/script-runtime.js +++ b/packages/bruno-js/src/runtime/script-runtime.js @@ -96,14 +96,14 @@ class ScriptRuntime { modules: {}, scriptType: 'jsScript' }); - } - return { - request, - envVariables: cleanJson(envVariables), - runtimeVariables: cleanJson(runtimeVariables), - nextRequestName: bru.nextRequest - }; + return { + request, + envVariables: cleanJson(envVariables), + runtimeVariables: cleanJson(runtimeVariables), + nextRequestName: bru.nextRequest + }; + } // default runtime is vm2 const vm = new NodeVM({ diff --git a/packages/bruno-js/src/sandbox/quickjs/index.js b/packages/bruno-js/src/sandbox/quickjs/index.js index 5f09ffe99..6aa3b5df8 100644 --- a/packages/bruno-js/src/sandbox/quickjs/index.js +++ b/packages/bruno-js/src/sandbox/quickjs/index.js @@ -8,6 +8,7 @@ const { newQuickJSWASMModule, memoizePromiseFactory } = require('quickjs-emscrip // execute `npm run build:isolated-vm:inbuilt-modules` if the below file doesn't exist const getBundledCode = require('../../bundle-browser-rollup'); +const addSleepShimToContext = require('./shims/sleep'); let QuickJSSyncContext; const loader = memoizePromiseFactory(() => newQuickJSWASMModule()); @@ -33,17 +34,6 @@ const executeQuickJsVm = ({ script: externalScript, context: externalContext, sc req && addBrunoRequestShimToContext(vm, req); res && addBrunoResponseShimToContext(vm, res); - //////////////////////////////////////////////////////////////////////////////// - - const logHandle = vm.newFunction('log', (...args) => { - const nativeArgs = args.map(vm.dump); - console.log(...nativeArgs); - }); - vm.setProp(vm.global, 'log', logHandle); - logHandle.dispose(); - - //////////////////////////////////////////////////////////////////////////////// - const templateLiteralText = `\`${externalScript}\`;`; const jsExpressionText = `${externalScript};`; @@ -81,15 +71,15 @@ const executeQuickJsVmAsync = async ({ const vm = module.newContext(); const bundledCode = getBundledCode?.toString() || ''; - let bundledScript = ` - (${bundledCode})() - `; - bundledScript += ` - globalThis.require = (module) => { - return globalThis.requireObject[module]; - } - `; + vm.evalCode( + ` + (${bundledCode})() + globalThis.require = (module) => { + return globalThis.requireObject[module]; + } + ` + ); const { bru, req, res, test, __brunoTestResults, console: consoleFn } = externalContext; @@ -97,72 +87,13 @@ const executeQuickJsVmAsync = async ({ req && addBrunoRequestShimToContext(vm, req); res && addBrunoResponseShimToContext(vm, res); consoleFn && addConsoleShimToContext(vm, consoleFn); + addSleepShimToContext(vm); - // await addLibraryShimsToContext(context); + await addLibraryShimsToContext(vm); test && __brunoTestResults && addTestShimToContext(vm, __brunoTestResults); - bundledScript += ` - globalThis.expect = require('chai').expect; - globalThis.assert = require('chai').assert; - - globalThis.__brunoTestResults = { - addResult: globalThis.__bruno__addResult, - getResults: globalThis.__bruno__getResults, - } - - globalThis.DummyChaiAssertionError = class DummyChaiAssertionError extends Error { - constructor(message, props, ssf) { - super(message); - this.name = "AssertionError"; - Object.assign(this, props); - } - } - - globalThis.Test = (__brunoTestResults) => async (description, callback) => { - try { - await callback(); - __brunoTestResults.addResult({ description, status: "pass" }); - } catch (error) { - if (error instanceof DummyChaiAssertionError) { - const { message, actual, expected } = error; - __brunoTestResults.addResult({ - description, - status: "fail", - error: message, - actual, - expected, - }); - } else { - globalThis.__bruno__addResult({ - description, - status: "fail", - error: error.message || "An unexpected error occurred.", - }); - } - } - }; - - globalThis.test = Test(__brunoTestResults); - `; - - //////////////////////////////////////////////////////////////////////////////// - - const sleep = vm.newFunction('sleep', (timer) => { - const t = vm.getString(timer); - const promise = vm.newPromise(); - setTimeout(() => { - promise.resolve(vm.newString('slept')); - }, t); - promise.settled.then(vm.runtime.executePendingJobs); - return promise.handle; - }); - sleep.consume((handle) => vm.setProp(vm.global, 'sleep', handle)); - - //////////////////////////////////////////////////////////////////////////////// - const script = ` - ${bundledScript} (async () => { const setTimeout = async(fn, timer) => { v = await sleep(timer); diff --git a/packages/bruno-js/src/sandbox/quickjs/shims/lib/axios.js b/packages/bruno-js/src/sandbox/quickjs/shims/lib/axios.js new file mode 100644 index 000000000..2f0fc0789 --- /dev/null +++ b/packages/bruno-js/src/sandbox/quickjs/shims/lib/axios.js @@ -0,0 +1,72 @@ +const axios = require('axios'); +const { cleanJson } = require('../../../../utils'); +const { marshallToVm } = require('../../utils'); + +const methods = ['get', 'post', 'put', 'patch', 'delete']; + +const addAxiosShimToContext = async (vm) => { + methods?.forEach((method) => { + const axiosHandle = vm.newFunction(method, (...args) => { + const nativeArgs = args.map(vm.dump); + const promise = vm.newPromise(); + axios[method](...nativeArgs) + .then((response) => { + const { status, headers, data } = response || {}; + promise.resolve(marshallToVm(cleanJson({ status, headers, data }), vm)); + }) + .catch((err) => { + promise.resolve( + marshallToVm( + cleanJson({ + message: err.message + }), + vm + ) + ); + }); + promise.settled.then(vm.runtime.executePendingJobs); + return promise.handle; + }); + axiosHandle.consume((handle) => vm.setProp(vm.global, `__bruno__axios__${method}`, handle)); + }); + + const axiosHandle = vm.newFunction('axios', (...args) => { + const nativeArgs = args.map(vm.dump); + const promise = vm.newPromise(); + axios(...nativeArgs) + .then((response) => { + const { status, headers, data } = response || {}; + promise.resolve(marshallToVm(cleanJson({ status, headers, data }), vm)); + }) + .catch((err) => { + promise.resolve( + marshallToVm( + cleanJson({ + message: err.message + }), + vm + ) + ); + }); + promise.settled.then(vm.runtime.executePendingJobs); + return promise.handle; + }); + axiosHandle.consume((handle) => vm.setProp(vm.global, `__bruno__axios`, handle)); + + vm.evalCode( + ` + globalThis.axios = __bruno__axios; + ${methods + ?.map((method) => { + return `globalThis.axios.${method} = __bruno__axios__${method};`; + }) + ?.join('\n')} + globalThis.requireObject = { + ...globalThis.requireObject, + axios: globalThis.axios, + } + ` + ); +}; + +module.exports = addAxiosShimToContext; diff --git a/packages/bruno-js/src/sandbox/quickjs/shims/lib/index.js b/packages/bruno-js/src/sandbox/quickjs/shims/lib/index.js index f15d1ef6e..1744e3570 100644 --- a/packages/bruno-js/src/sandbox/quickjs/shims/lib/index.js +++ b/packages/bruno-js/src/sandbox/quickjs/shims/lib/index.js @@ -1,7 +1,13 @@ +const addAxiosShimToContext = require('./axios'); const addNanoidShimToContext = require('./nanoid'); +const addNodeFetchShimToContext = require('./node-fetch'); +const addUuidShimToContext = require('./uuid'); -const addLibraryShimsToContext = async (context) => { - await addNanoidShimToContext(context); +const addLibraryShimsToContext = async (vm) => { + await addNanoidShimToContext(vm); + await addAxiosShimToContext(vm); + await addNodeFetchShimToContext(vm); + await addUuidShimToContext(vm); }; module.exports = addLibraryShimsToContext; diff --git a/packages/bruno-js/src/sandbox/quickjs/shims/lib/nanoid.js b/packages/bruno-js/src/sandbox/quickjs/shims/lib/nanoid.js index 04107bb75..7a83d37fe 100644 --- a/packages/bruno-js/src/sandbox/quickjs/shims/lib/nanoid.js +++ b/packages/bruno-js/src/sandbox/quickjs/shims/lib/nanoid.js @@ -1,5 +1,24 @@ const { nanoid } = require('nanoid'); +const { marshallToVm } = require('../../utils'); -const addNanoidShimToContext = async (context) => {}; +const addNanoidShimToContext = async (vm) => { + let _nanoid = vm.newFunction('nanoid', function () { + let v = nanoid(); + return marshallToVm(v, vm); + }); + vm.setProp(vm.global, '__bruno__nanoid', _nanoid); + _nanoid.dispose(); + + vm.evalCode( + ` + globalThis.nanoid = {}; + globalThis.nanoid.nanoid = globalThis.__bruno__nanoid; + globalThis.requireObject = { + ...globalThis.requireObject, + 'nanoid': globalThis.nanoid + } + ` + ); +}; module.exports = addNanoidShimToContext; diff --git a/packages/bruno-js/src/sandbox/quickjs/shims/lib/node-fetch.js b/packages/bruno-js/src/sandbox/quickjs/shims/lib/node-fetch.js new file mode 100644 index 000000000..073b1e3c9 --- /dev/null +++ b/packages/bruno-js/src/sandbox/quickjs/shims/lib/node-fetch.js @@ -0,0 +1,41 @@ +const fetch = require('node-fetch'); +const { cleanJson } = require('../../../../utils'); +const { marshallToVm } = require('../../utils'); + +const addNodeFetchShimToContext = async (vm) => { + const nodeFetchHandle = vm.newFunction('node_fetch', (...args) => { + const nativeArgs = args.map(vm.dump); + const promise = vm.newPromise(); + fetch(...nativeArgs) + .then(async (response) => { + const { status, headers } = response || {}; + const data = await response.json(); + promise.resolve(marshallToVm(cleanJson({ status, headers, data }), vm)); + }) + .catch((err) => { + promise.resolve( + marshallToVm( + cleanJson({ + message: err.message + }), + vm + ) + ); + }); + promise.settled.then(vm.runtime.executePendingJobs); + return promise.handle; + }); + + nodeFetchHandle.consume((handle) => vm.setProp(vm.global, `__bruno__node_fetch`, handle)); + vm.evalCode( + ` + globalThis.nodeFetch = __bruno__node_fetch; + globalThis.requireObject = { + ...globalThis.requireObject, + 'node-fetch': globalThis.nodeFetch, + } + ` + ); +}; + +module.exports = addNodeFetchShimToContext; diff --git a/packages/bruno-js/src/sandbox/quickjs/shims/lib/uuid.js b/packages/bruno-js/src/sandbox/quickjs/shims/lib/uuid.js new file mode 100644 index 000000000..23f830311 --- /dev/null +++ b/packages/bruno-js/src/sandbox/quickjs/shims/lib/uuid.js @@ -0,0 +1,30 @@ +const uuid = require('uuid'); +const { marshallToVm } = require('../../utils'); + +const fns = ['version', 'parse', 'stringify', 'v1', 'v1ToV6', 'v3', 'v4', 'v5', 'v6', 'v6ToV1', 'v7', 'validate']; + +const addUuidShimToContext = async (vm) => { + fns.forEach((fn) => { + let fnHandle = vm.newFunction(fn, function (...args) { + const nativeArgs = args.map(vm.dump); + return marshallToVm(uuid[fn](...nativeArgs), vm); + }); + vm.setProp(vm.global, `__bruno__uuid__${fn}`, fnHandle); + fnHandle.dispose(); + }); + + vm.evalCode( + ` + globalThis.uuid = {}; + ${['version', 'parse', 'stringify', 'v1', 'v1ToV6', 'v3', 'v4', 'v5', 'v6', 'v6ToV1', 'v7', 'validate'] + ?.map((fn, idx) => `globalThis.uuid.${fn} = __bruno__uuid__${fn}`) + .join('\n')} + globalThis.requireObject = { + ...globalThis.requireObject, + uuid: globalThis.uuid, + } + ` + ); +}; + +module.exports = addUuidShimToContext; diff --git a/packages/bruno-js/src/sandbox/quickjs/shims/sleep.js b/packages/bruno-js/src/sandbox/quickjs/shims/sleep.js new file mode 100644 index 000000000..79fd146f9 --- /dev/null +++ b/packages/bruno-js/src/sandbox/quickjs/shims/sleep.js @@ -0,0 +1,14 @@ +const addSleepShimToContext = (vm) => { + const sleepHandle = vm.newFunction('sleep', (timer) => { + const t = vm.getString(timer); + const promise = vm.newPromise(); + setTimeout(() => { + promise.resolve(vm.newString('slept')); + }, t); + promise.settled.then(vm.runtime.executePendingJobs); + return promise.handle; + }); + sleepHandle.consume((handle) => vm.setProp(vm.global, 'sleep', handle)); +}; + +module.exports = addSleepShimToContext; diff --git a/packages/bruno-js/src/sandbox/quickjs/shims/test.js b/packages/bruno-js/src/sandbox/quickjs/shims/test.js index f7a928101..9da224a39 100644 --- a/packages/bruno-js/src/sandbox/quickjs/shims/test.js +++ b/packages/bruno-js/src/sandbox/quickjs/shims/test.js @@ -13,53 +13,51 @@ const addBruShimToContext = (vm, __brunoTestResults) => { vm.setProp(vm.global, '__bruno__getResults', getResults); getResults.dispose(); - // vm.evalCode( - // ` - // globalThis.expect = require('chai').expect; - // globalThis.assert = require('chai').assert; + vm.evalCode( + ` + globalThis.expect = require('chai').expect; + globalThis.assert = require('chai').assert; - // globalThis.__brunoTestResults = { - // addResult: globalThis.addResult, - // getResults: globalThis.getResults, - // } + globalThis.__brunoTestResults = { + addResult: globalThis.__bruno__addResult, + getResults: globalThis.__bruno__getResults, + } - // globalThis.DummyChaiAssertionError = class DummyChaiAssertionError extends Error { - // constructor(message, props, ssf) { - // super(message); - // this.name = "AssertionError"; - // Object.assign(this, props); - // } - // } + globalThis.DummyChaiAssertionError = class DummyChaiAssertionError extends Error { + constructor(message, props, ssf) { + super(message); + this.name = "AssertionError"; + Object.assign(this, props); + } + } - // globalThis.Test = (__brunoTestResults) => async (description, callback) => { - // try { - // await callback(); - // __brunoTestResults.addResult({ description, status: "pass" }); - // } catch (error) { - // if (error instanceof DummyChaiAssertionError) { - // const { message, actual, expected } = error; - // __brunoTestResults.addResult({ - // description, - // status: "fail", - // error: message, - // actual, - // expected, - // }); - // } else { - // __brunoTestResults.addResult({ - // description, - // status: "fail", - // error: error.message || "An unexpected error occurred.", - // }); - // } - // console.log(error); - // } - // }; - // let foobar = 'foobar3000'; - // log("from test shim"); - // globalThis.test = Test(__brunoTestResults); - // ` - // ); + globalThis.Test = (__brunoTestResults) => async (description, callback) => { + try { + await callback(); + __brunoTestResults.addResult({ description, status: "pass" }); + } catch (error) { + if (error instanceof DummyChaiAssertionError) { + const { message, actual, expected } = error; + __brunoTestResults.addResult({ + description, + status: "fail", + error: message, + actual, + expected, + }); + } else { + globalThis.__bruno__addResult({ + description, + status: "fail", + error: error.message || "An unexpected error occurred.", + }); + } + } + }; + + globalThis.test = Test(__brunoTestResults); + ` + ); }; module.exports = addBruShimToContext; diff --git a/packages/bruno-tests/collection/scripting/inbuilt modules/nanoid/nanoid.bru b/packages/bruno-tests/collection/scripting/inbuilt modules/nanoid/nanoid.bru new file mode 100644 index 000000000..47f08dc67 --- /dev/null +++ b/packages/bruno-tests/collection/scripting/inbuilt modules/nanoid/nanoid.bru @@ -0,0 +1,17 @@ +meta { + name: nanoid + type: http + seq: 1 +} + +get { + url: {{host}}/ping + body: none + auth: none +} + +script:pre-request { + const { nanoid } = require("nanoid"); + + req.setHeader("transaction-id", nanoid()); +} diff --git a/packages/bruno-tests/collection/scripting/inbuilt modules/node-fetch/node-fetch-pre-req-script.bru b/packages/bruno-tests/collection/scripting/inbuilt modules/node-fetch/node-fetch-pre-req-script.bru new file mode 100644 index 000000000..9821a055c --- /dev/null +++ b/packages/bruno-tests/collection/scripting/inbuilt modules/node-fetch/node-fetch-pre-req-script.bru @@ -0,0 +1,36 @@ +meta { + name: node-fetch-pre-req-script + type: http + seq: 1 +} + +get { + url: {{host}}/ping + body: none + auth: none +} + +script:pre-request { + const fetch = require("node-fetch"); + + const url = "https://testbench-sanity.usebruno.com/api/echo/json"; + const response = await fetch(url, { + method: 'post', + body: JSON.stringify({hello:'bruno'}), + headers: {'Content-Type': 'application/json'} + }); + + req.setBody(response.data); + req.setMethod("POST"); + req.setUrl(url); +} + +tests { + test("req.getBody()", function() { + const data = res.getBody(); + expect(data).to.eql({ + "hello": "bruno" + }); + }); + +} diff --git a/packages/bruno-tests/collection/scripting/inbuilt modules/uuid/uuid.bru b/packages/bruno-tests/collection/scripting/inbuilt modules/uuid/uuid.bru new file mode 100644 index 000000000..0a7c622a5 --- /dev/null +++ b/packages/bruno-tests/collection/scripting/inbuilt modules/uuid/uuid.bru @@ -0,0 +1,17 @@ +meta { + name: uuid + type: http + seq: 1 +} + +get { + url: {{host}}/ping + body: none + auth: none +} + +script:pre-request { + const { v4 } = require("uuid"); + + req.setHeader("transaction-id", v4()); +} From 1bf3a15784b3c9fc33689f303c676c7bef2e022a Mon Sep 17 00:00:00 2001 From: Anoop M D Date: Mon, 19 Aug 2024 11:00:27 +0530 Subject: [PATCH 2/2] feat: removed isolated-vm sandbox --- package-lock.json | 77 ++++++-- packages/bruno-js/package.json | 6 +- .../scripts/prebuild-isolated-vm-for-dev.js | 11 -- .../prebuild-isolated-vm-for-prod-builds.js | 21 --- .../bruno-js/src/runtime/script-runtime.js | 8 +- packages/bruno-js/src/runtime/test-runtime.js | 4 +- .../bruno-js/src/sandbox/isolatedvm/index.js | 167 ------------------ .../src/sandbox/isolatedvm/shims/bru.js | 59 ------- .../sandbox/isolatedvm/shims/bruno-request.js | 79 --------- .../isolatedvm/shims/bruno-response.js | 46 ----- .../src/sandbox/isolatedvm/shims/console.js | 39 ---- .../sandbox/isolatedvm/shims/lib/axios-min.js | 57 ------ .../src/sandbox/isolatedvm/shims/lib/axios.js | 121 ------------- .../src/sandbox/isolatedvm/shims/lib/index.js | 11 -- .../sandbox/isolatedvm/shims/lib/nanoid.js | 23 --- .../sandbox/isolatedvm/shims/lib/uuid-min.js | 39 ---- .../src/sandbox/isolatedvm/shims/lib/uuid.js | 83 --------- .../src/sandbox/isolatedvm/shims/sleep.js | 32 ---- .../src/sandbox/isolatedvm/shims/test.js | 56 ------ .../bruno-js/src/sandbox/quickjs/index.js | 14 +- .../scripting/local modules/sum.bru | 2 +- 21 files changed, 71 insertions(+), 884 deletions(-) delete mode 100644 packages/bruno-js/scripts/prebuild-isolated-vm-for-dev.js delete mode 100644 packages/bruno-js/scripts/prebuild-isolated-vm-for-prod-builds.js delete mode 100644 packages/bruno-js/src/sandbox/isolatedvm/index.js delete mode 100644 packages/bruno-js/src/sandbox/isolatedvm/shims/bru.js delete mode 100644 packages/bruno-js/src/sandbox/isolatedvm/shims/bruno-request.js delete mode 100644 packages/bruno-js/src/sandbox/isolatedvm/shims/bruno-response.js delete mode 100644 packages/bruno-js/src/sandbox/isolatedvm/shims/console.js delete mode 100644 packages/bruno-js/src/sandbox/isolatedvm/shims/lib/axios-min.js delete mode 100644 packages/bruno-js/src/sandbox/isolatedvm/shims/lib/axios.js delete mode 100644 packages/bruno-js/src/sandbox/isolatedvm/shims/lib/index.js delete mode 100644 packages/bruno-js/src/sandbox/isolatedvm/shims/lib/nanoid.js delete mode 100644 packages/bruno-js/src/sandbox/isolatedvm/shims/lib/uuid-min.js delete mode 100644 packages/bruno-js/src/sandbox/isolatedvm/shims/lib/uuid.js delete mode 100644 packages/bruno-js/src/sandbox/isolatedvm/shims/sleep.js delete mode 100644 packages/bruno-js/src/sandbox/isolatedvm/shims/test.js diff --git a/package-lock.json b/package-lock.json index 395ccb5c0..0f8465199 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4303,6 +4303,43 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, + "node_modules/@jitl/quickjs-ffi-types": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-ffi-types/-/quickjs-ffi-types-0.29.2.tgz", + "integrity": "sha512-069uQTiEla2PphXg6UpyyJ4QXHkTj3S9TeXgaMCd8NDYz3ODBw5U/rkg6fhuU8SMpoDrWjEzybmV5Mi2Pafb5w==" + }, + "node_modules/@jitl/quickjs-wasmfile-debug-asyncify": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-wasmfile-debug-asyncify/-/quickjs-wasmfile-debug-asyncify-0.29.2.tgz", + "integrity": "sha512-YdRw2414pFkxzyyoJGv81Grbo9THp/5athDMKipaSBNNQvFE9FGRrgE9tt2DT2mhNnBx1kamtOGj0dX84Yy9bg==", + "dependencies": { + "@jitl/quickjs-ffi-types": "0.29.2" + } + }, + "node_modules/@jitl/quickjs-wasmfile-debug-sync": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-wasmfile-debug-sync/-/quickjs-wasmfile-debug-sync-0.29.2.tgz", + "integrity": "sha512-VgisubjyPMWEr44g+OU0QWGyIxu7VkApkLHMxdORX351cw22aLTJ+Z79DJ8IVrTWc7jh4CBPsaK71RBQDuVB7w==", + "dependencies": { + "@jitl/quickjs-ffi-types": "0.29.2" + } + }, + "node_modules/@jitl/quickjs-wasmfile-release-asyncify": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-wasmfile-release-asyncify/-/quickjs-wasmfile-release-asyncify-0.29.2.tgz", + "integrity": "sha512-sf3luCPr8wBVmGV6UV8Set+ie8wcO6mz5wMvDVO0b90UVCKfgnx65A1JfeA+zaSGoaFyTZ3sEpXSGJU+6qJmLw==", + "dependencies": { + "@jitl/quickjs-ffi-types": "0.29.2" + } + }, + "node_modules/@jitl/quickjs-wasmfile-release-sync": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/@jitl/quickjs-wasmfile-release-sync/-/quickjs-wasmfile-release-sync-0.29.2.tgz", + "integrity": "sha512-UFIcbY3LxBRUjEqCHq3Oa6bgX5znt51V5NQck8L2US4u989ErasiMLUjmhq6UPC837Sjqu37letEK/ZpqlJ7aA==", + "dependencies": { + "@jitl/quickjs-ffi-types": "0.29.2" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -18110,6 +18147,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/quickjs-emscripten": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/quickjs-emscripten/-/quickjs-emscripten-0.29.2.tgz", + "integrity": "sha512-SlvkvyZgarReu2nr4rkf+xz1vN0YDUz7sx4WHz8LFtK6RNg4/vzAGcFjE7nfHYBEbKrzfIWvKnMnxZkctQ898w==", + "dependencies": { + "@jitl/quickjs-wasmfile-debug-asyncify": "0.29.2", + "@jitl/quickjs-wasmfile-debug-sync": "0.29.2", + "@jitl/quickjs-wasmfile-release-asyncify": "0.29.2", + "@jitl/quickjs-wasmfile-release-sync": "0.29.2", + "quickjs-emscripten-core": "0.29.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/quickjs-emscripten-core": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/quickjs-emscripten-core/-/quickjs-emscripten-core-0.29.2.tgz", + "integrity": "sha512-jEAiURW4jGqwO/fW01VwlWqa2G0AJxnN5FBy1xnVu8VIVhVhiaxUfCe+bHqS6zWzfjFm86HoO40lzpteusvyJA==", + "dependencies": { + "@jitl/quickjs-ffi-types": "0.29.2" + } + }, "node_modules/randombytes": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", @@ -22568,7 +22628,6 @@ "packages/bruno-js": { "name": "@usebruno/js", "version": "0.12.0", - "hasInstallScript": true, "license": "MIT", "dependencies": { "@usebruno/common": "0.1.0", @@ -22581,13 +22640,13 @@ "chai": "^4.3.7", "chai-string": "^1.5.0", "crypto-js": "^4.1.1", - "isolated-vm": "4.6.0", "json-query": "^2.2.2", "lodash": "^4.17.21", "moment": "^2.29.4", "nanoid": "3.3.4", - "node-fetch": "2.*", + "node-fetch": "^2.7.0", "node-vault": "^0.10.2", + "quickjs-emscripten": "^0.29.2", "uuid": "^9.0.0" }, "devDependencies": { @@ -22608,18 +22667,6 @@ "@n8n/vm2": "^3.9.23" } }, - "packages/bruno-js/node_modules/isolated-vm": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/isolated-vm/-/isolated-vm-4.6.0.tgz", - "integrity": "sha512-MEnfC/54q5PED3VJ9UJYJPOlU6mYFHS3ivR9E8yeNNBEFRFUNBnY0xO4Rj3D/SOtFKPNmsQp9NWUYSKZqAoZiA==", - "hasInstallScript": true, - "dependencies": { - "prebuild-install": "^7.1.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, "packages/bruno-lang": { "name": "@usebruno/lang", "version": "0.12.0", diff --git a/packages/bruno-js/package.json b/packages/bruno-js/package.json index b368cfe19..99e028be8 100644 --- a/packages/bruno-js/package.json +++ b/packages/bruno-js/package.json @@ -12,10 +12,7 @@ }, "scripts": { "test": "jest --testPathIgnorePatterns test.js", - "sandbox:bundle-libraries": "node ./src/sandbox/bundle-libraries.js", - "isolated-vm:install": "cd ./node_modules/isolated-vm && npm install", - "isolated-vm:prebuild:dev": "node ./scripts/prebuild-isolated-vm-for-dev.js", - "isolated-vm:prebuild:prod": "node ./scripts/prebuild-isolated-vm-for-prod-builds.js" + "sandbox:bundle-libraries": "node ./src/sandbox/bundle-libraries.js" }, "dependencies": { "@usebruno/common": "0.1.0", @@ -28,7 +25,6 @@ "chai": "^4.3.7", "chai-string": "^1.5.0", "crypto-js": "^4.1.1", - "isolated-vm": "4.6.0", "json-query": "^2.2.2", "lodash": "^4.17.21", "moment": "^2.29.4", diff --git a/packages/bruno-js/scripts/prebuild-isolated-vm-for-dev.js b/packages/bruno-js/scripts/prebuild-isolated-vm-for-dev.js deleted file mode 100644 index f11833422..000000000 --- a/packages/bruno-js/scripts/prebuild-isolated-vm-for-dev.js +++ /dev/null @@ -1,11 +0,0 @@ -const { execSync } = require('child_process'); -const os = require('os'); - -const platform = os.platform(); -const arch = os.arch(); -const target = '23.3.3'; - -const command = `cd ./node_modules/isolated-vm && rm -rf prebuilds && mkdir prebuilds && npm run prebuild -- --platform=${platform} --arch=${arch} --target=${target} --runtime=electron`; - -console.log(`Running command: ${command}`); -execSync(command, { stdio: 'inherit' }); diff --git a/packages/bruno-js/scripts/prebuild-isolated-vm-for-prod-builds.js b/packages/bruno-js/scripts/prebuild-isolated-vm-for-prod-builds.js deleted file mode 100644 index d1a6b0947..000000000 --- a/packages/bruno-js/scripts/prebuild-isolated-vm-for-prod-builds.js +++ /dev/null @@ -1,21 +0,0 @@ -const { execSync } = require('child_process'); - -const darwin_x64 = `cd ./node_modules/isolated-vm && npm run prebuild -- --platform=darwin --arch=x64 --target=21.1.1 --runtime=electron`; -const darwin_arm64 = `cd ./node_modules/isolated-vm && npm run prebuild -- --platform=darwin --arch=arm64 --target=21.1.1 --runtime=electron`; -const linux_x64 = `cd ./node_modules/isolated-vm && npm run prebuild -- --platform=linux --arch=x64 --target=21.1.1 --runtime=electron`; -const linux_arm64 = `cd ./node_modules/isolated-vm && npm run prebuild -- --platform=linux --arch=arm64 --target=21.1.1 --runtime=electron`; -const win32_x64 = `cd ./node_modules/isolated-vm && npm run prebuild -- --platform=win32 --arch=x64 --target=21.1.1 --runtime=electron`; -const win32_arm64 = `cd ./node_modules/isolated-vm && npm run prebuild -- --platform=win32 --arch=arm64 --target=21.1.1 --runtime=electron`; - -console.log(`Running command: ${darwin_x64}`); -execSync(darwin_x64, { stdio: 'inherit' }); -console.log(`Running command: ${darwin_arm64}`); -execSync(darwin_arm64, { stdio: 'inherit' }); -console.log(`Running command: ${linux_x64}`); -execSync(linux_x64, { stdio: 'inherit' }); -console.log(`Running command: ${linux_arm64}`); -execSync(linux_arm64, { stdio: 'inherit' }); -console.log(`Running command: ${win32_x64}`); -execSync(win32_x64, { stdio: 'inherit' }); -console.log(`Running command: ${win32_arm64}`); -execSync(win32_arm64, { stdio: 'inherit' }); diff --git a/packages/bruno-js/src/runtime/script-runtime.js b/packages/bruno-js/src/runtime/script-runtime.js index d6a6c6771..6377c8598 100644 --- a/packages/bruno-js/src/runtime/script-runtime.js +++ b/packages/bruno-js/src/runtime/script-runtime.js @@ -92,9 +92,7 @@ class ScriptRuntime { if (this.runtime === 'quickjs') { await executeQuickJsVmAsync({ script: script, - context: context, - modules: {}, - scriptType: 'jsScript' + context: context }); return { @@ -205,9 +203,7 @@ class ScriptRuntime { if (this.runtime === 'quickjs') { await executeQuickJsVmAsync({ script: script, - context: context, - modules: {}, - scriptType: 'jsScript' + context: context }); return { diff --git a/packages/bruno-js/src/runtime/test-runtime.js b/packages/bruno-js/src/runtime/test-runtime.js index a7aa6d2c5..b9a14b7fa 100644 --- a/packages/bruno-js/src/runtime/test-runtime.js +++ b/packages/bruno-js/src/runtime/test-runtime.js @@ -111,9 +111,7 @@ class TestRuntime { if (this.runtime === 'quickjs') { await executeQuickJsVmAsync({ script: testsFile, - context: context, - modules: {}, - scriptType: 'jsScript' + context: context }); } else { // default runtime is vm2 diff --git a/packages/bruno-js/src/sandbox/isolatedvm/index.js b/packages/bruno-js/src/sandbox/isolatedvm/index.js deleted file mode 100644 index db410d5d1..000000000 --- a/packages/bruno-js/src/sandbox/isolatedvm/index.js +++ /dev/null @@ -1,167 +0,0 @@ -const ivm = require('isolated-vm'); -const addBruShimToContext = require('./shims/bru'); -const addBrunoRequestShimToContext = require('./shims/bruno-request'); -const addConsoleShimToContext = require('./shims/console'); -const addBrunoResponseShimToContext = require('./shims/bruno-response'); -const addTestShimToContext = require('./shims/test'); -const addLibraryShimsToContext = require('./shims/lib'); - -// execute `npm run build:isolated-vm:inbuilt-modules` if the below file doesn't exist -const getBundledCode = require('../bundle-browser-rollup'); -const addSleepShimToContext = require('./shims/sleep'); - -const toNumber = (value) => { - const num = Number(value); - return Number.isInteger(num) ? parseInt(value, 10) : parseFloat(value); -}; - -const executeInIsolatedVMStrict = ({ script: externalScript, context: externalContext, scriptType = 'script' }) => { - if (!isNaN(Number(externalScript))) { - return Number(externalScript); - } - let result; - const isolate = new ivm.Isolate(); - try { - const context = isolate.createContextSync(); - context.global.setSync('global', context.global.derefInto()); - - const { bru, req, res } = externalContext; - - context.evalSync(` - let bru = {}; - let req = {}; - let res = {}; - `); - - bru && addBruShimToContext(context, bru); - req && addBrunoRequestShimToContext(context, req); - res && addBrunoResponseShimToContext(context, res); - - context.global.setSync('setResult', function (arg) { - result = arg; - }); - - const templateLiteralText = ` - let value = \`${externalScript}\`; - setResult(value); - `; - - const jsExpressionText = ` - let value = ${externalScript}; - setResult(value); - `; - - let scriptText = scriptType === 'template-literal' ? templateLiteralText : jsExpressionText; - - const script = isolate.compileScriptSync(scriptText); - script.runSync(context); - return result; - } catch (error) { - console.error('Error executing the script!', error); - } - isolate.dispose(); -}; - -const executeInIsolatedVMAsync = async ({ - script: externalScript, - context: externalContext, - modules = {}, - scriptType = 'script' -}) => { - if (!isNaN(Number(externalScript))) { - return toNumber(externalScript); - } - let result; - const isolate = new ivm.Isolate(); - try { - const context = await isolate.createContext(); - await context.global.set('global', context.global.derefInto()); - - context.evalSync(` - let bru = {}; - let req = {}; - let res = {}; - let console = {}; - global.requireObject = {}; - `); - - context.global.setSync('log', function (...args) { - console.debug(...args); - }); - - try { - const bundledCode = getBundledCode?.toString() || ''; - await context.eval(`(${bundledCode})()`); - } catch (err) { - console.debug('Error bundling libraries', err); - } - - const { bru, req, res, test, __brunoTestResults, console: consoleFn } = externalContext; - - bru && addBruShimToContext(context, bru); - req && addBrunoRequestShimToContext(context, req); - res && addBrunoResponseShimToContext(context, res); - consoleFn && addConsoleShimToContext(context, consoleFn); - addSleepShimToContext(context); - - await context.eval( - ` - global.require = (module) => { - return global.requireObject[module]; - } - ` - ); - - await addLibraryShimsToContext(context); - - test && __brunoTestResults && (await addTestShimToContext(context, __brunoTestResults)); - - context.global.setSync('setResult', function (arg) { - result = arg; - }); - - const jsScriptText = ` - new Promise(async (resolve, reject) => { - // modify the setTimeout function with the shim to work-around the callback-function clone issues - setTimeout = global.setTimeout; - console?.debug && console.debug('isolated-vm:execution-start:'); - try { - ${externalScript} - } catch (error) { - console?.debug && console.debug('isolated-vm:execution-end:with-error', error?.message); - } - console?.debug && console.debug('isolated-vm:execution-end:'); - resolve(); - }); - `; - - const templateLiteralText = ` - let value = \`${externalScript}\`; - setResult(value); - `; - - const jsExpressionText = ` - let value = ${externalScript}; - setResult(value); - `; - - let scriptText = - scriptType === 'template-literal' - ? templateLiteralText - : scriptType === 'expression' - ? jsExpressionText - : jsScriptText; - - const script = await isolate.compileScript(scriptText); - await script.run(context); - return result; - } catch (error) { - console.error('Error executing the script!', error); - } - isolate.dispose(); -}; - -module.exports = { - executeInIsolatedVMStrict, - executeInIsolatedVMAsync -}; diff --git a/packages/bruno-js/src/sandbox/isolatedvm/shims/bru.js b/packages/bruno-js/src/sandbox/isolatedvm/shims/bru.js deleted file mode 100644 index 17bae399e..000000000 --- a/packages/bruno-js/src/sandbox/isolatedvm/shims/bru.js +++ /dev/null @@ -1,59 +0,0 @@ -const addBruShimToContext = (context, bru) => { - context.global.setSync('cwd', function () { - return bru.cwd(); - }); - - context.global.setSync('getEnvName', function () { - return bru.getEnvName(); - }); - - context.global.setSync('getProcessEnv', function (key) { - return bru.getProcessEnv(key); - }); - - context.global.setSync('getEnvVar', function (key) { - return bru.getEnvVar(key); - }); - - context.global.setSync('setEnvVar', function (key, value) { - bru.setEnvVar(key, value); - }); - - context.global.setSync('setVar', function (key, value) { - bru.setVar(key, value); - }); - - context.global.setSync('getVar', function (key) { - return bru.getVar(key); - }); - - context.global.setSync('setNextRequest', function (nextRequest) { - bru.setNextRequest(nextRequest); - }); - - context.global.setSync('visualize', function (htmlString) { - bru.visualize(htmlString); - }); - - context.global.setSync('getSecretVar', function (key) { - return bru.getSecretVar(key); - }); - - context.evalSync(` - bru = { - ...bru || {}, - cwd: global.cwd, - getEnvName: global.getEnvName, - getProcessEnv: global.getProcessEnv, - getEnvVar: global.getEnvVar, - setEnvVar: global.setEnvVar, - setVar: global.setVar, - getVar: global.getVar, - setNextRequest: global.setNextRequest, - visualize: global.visualize, - getSecretVar: global.getSecretVar - } - `); -}; - -module.exports = addBruShimToContext; diff --git a/packages/bruno-js/src/sandbox/isolatedvm/shims/bruno-request.js b/packages/bruno-js/src/sandbox/isolatedvm/shims/bruno-request.js deleted file mode 100644 index f8a1f9b9e..000000000 --- a/packages/bruno-js/src/sandbox/isolatedvm/shims/bruno-request.js +++ /dev/null @@ -1,79 +0,0 @@ -const addBrunoRequestShimToContext = (context, req) => { - context.global.setSync('getUrl', function () { - return req.getUrl(); - }); - - context.global.setSync('setUrl', function (url) { - req.setUrl(url); - }); - - context.global.setSync('getMethod', function () { - return req.getMethod(); - }); - - context.global.setSync('getAuthMode', function () { - return req.getAuthMode(); - }); - - context.global.setSync('setMethod', function (method) { - req.setMethod(method); - }); - - context.global.setSync('getHeaders', function () { - return req.getHeaders(); - }); - - context.global.setSync('setHeaders', function (headers) { - req.setHeaders(headers); - }); - - context.global.setSync('getHeader', function (name) { - return req.getHeader(name); - }); - - context.global.setSync('setHeader', function (name, value) { - req.setHeader(name, value); - }); - - context.global.setSync('getBody', function () { - return req.getBody(); - }); - - context.global.setSync('setBody', function (data) { - req.setBody(data); - }); - - context.global.setSync('setMaxRedirects', function (maxRedirects) { - req.setMaxRedirects(maxRedirects); - }); - - context.global.setSync('getTimeout', function () { - return req.getTimeout(); - }); - - context.global.setSync('setTimeout', function (timeout) { - req.setTimeout(timeout); - }); - - context.evalSync(` - req = { - ...req || {}, - getUrl: global.getUrl, - setUrl: global.setUrl, - getMethod: global.getMethod, - getAuthMode: global.getAuthMode, - setMethod: global.setMethod, - getHeaders: global.getHeaders, - setHeaders: global.setHeaders, - getHeader: global.getHeader, - setHeader: global.setHeader, - getBody: global.getBody, - setBody: global.setBody, - setMaxRedirects: global.setMaxRedirects, - getTimeout: global.getTimeout, - setTimeout: global.setTimeout - } -`); -}; - -module.exports = addBrunoRequestShimToContext; diff --git a/packages/bruno-js/src/sandbox/isolatedvm/shims/bruno-response.js b/packages/bruno-js/src/sandbox/isolatedvm/shims/bruno-response.js deleted file mode 100644 index 7ac8d5901..000000000 --- a/packages/bruno-js/src/sandbox/isolatedvm/shims/bruno-response.js +++ /dev/null @@ -1,46 +0,0 @@ -const ivm = require('isolated-vm'); - -const addBrunoResponseShimToContext = (context, res) => { - context.global.setSync('status', new ivm.ExternalCopy(res?.status).copyInto()); - context.global.setSync('headers', new ivm.ExternalCopy(res?.headers).copyInto()); - context.global.setSync('body', new ivm.ExternalCopy(res?.body).copyInto()); - context.global.setSync('responseTime', new ivm.ExternalCopy(res?.responseTime).copyInto()); - - context.global.setSync('getStatus', function () { - return res?.getStatus(); - }); - - context.global.setSync('getHeader', function (name) { - return res?.getHeader(name); - }); - - context.global.setSync('getHeaders', function () { - return res?.getHeaders(); - }); - - context.global.setSync('getBody', function () { - return res?.getBody(); - }); - - context.global.setSync('getResponseTime', function () { - return res?.getResponseTime(); - }); - - context.evalSync(` - res = { - ...res || {}, - status: global.status, - statusText: global.statusText, - headers: global.headers, - body: global.body, - responseTime: global.responseTime, - getStatus: global.getStatus, - getHeader: global.getHeader, - getHeaders: global.getHeaders, - getBody: global.getBody, - getResponseTime: global.getResponseTime - } - `); -}; - -module.exports = addBrunoResponseShimToContext; diff --git a/packages/bruno-js/src/sandbox/isolatedvm/shims/console.js b/packages/bruno-js/src/sandbox/isolatedvm/shims/console.js deleted file mode 100644 index ead852992..000000000 --- a/packages/bruno-js/src/sandbox/isolatedvm/shims/console.js +++ /dev/null @@ -1,39 +0,0 @@ -const addConsoleShimToContext = (context, console) => { - context.global.setSync('log', function (...args) { - console?.log && console.log(...args); - return args; - }); - - context.global.setSync('debug', function (...args) { - console?.debug && console.debug(...args); - return args; - }); - - context.global.setSync('info', function (...args) { - console?.info && console.info(...args); - return args; - }); - - context.global.setSync('warn', function (...args) { - console?.warn && console.warn(...args); - return args; - }); - - context.global.setSync('error', function (...args) { - console?.error && console.error(...args); - return args; - }); - - context.evalSync(` - console = { - ...console || {}, - log: global.log, - debug: global.debug, - info: global.info, - warn: global.warn, - error: global.error - } - `); -}; - -module.exports = addConsoleShimToContext; diff --git a/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/axios-min.js b/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/axios-min.js deleted file mode 100644 index b3949b167..000000000 --- a/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/axios-min.js +++ /dev/null @@ -1,57 +0,0 @@ -const axios = require('axios'); -const ivm = require('isolated-vm'); -const { cleanJson } = require('../../../../utils'); - -const addAxiosShimToContext = async (context) => { - await context.evalClosure( - ` - globalThis.axios = (...args) => $0.applySyncPromise(undefined, args?.map(arg=>JSON.stringify(arg))); - ${['get', 'post', 'put', 'patch', 'delete'] - ?.map( - (method, idx) => - `globalThis.axios.${method} = (...args) => $${ - idx + 1 - }.applySyncPromise(undefined, args?.map(arg=>JSON.stringify(arg)))` - ) - .join('\n')} - globalThis.requireObject = { - ...globalThis.requireObject, - axios: globalThis.axios, - } - `, - [ - async (...argStrings) => { - console.log(argStrings); - let args = argStrings?.map((arg) => JSON.parse(arg)); - const res = await axios(...args) - .then((response) => { - return cleanJson(response?.data); - }) - .catch((err) => { - return { - message: err.message - // response: cleanJson(err.response) - }; - }); - return new ivm.ExternalCopy(res).copyInto({ release: true }); - }, - ...['get', 'post', 'put', 'patch', 'delete']?.map((method) => async (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - const res = await axios[method](...args) - .then((response) => { - return cleanJson(response?.data); - }) - .catch((err) => { - return { - message: err.message - // response: cleanJson(err.response) - }; - }); - return new ivm.ExternalCopy(res).copyInto({ release: true }); - }) - ], - { arguments: { reference: true } } - ); -}; - -module.exports = addAxiosShimToContext; diff --git a/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/axios.js b/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/axios.js deleted file mode 100644 index b6e9d1888..000000000 --- a/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/axios.js +++ /dev/null @@ -1,121 +0,0 @@ -const axios = require('axios'); -const ivm = require('isolated-vm'); -const { cleanJson } = require('../../../../utils'); - -const addAxiosShimToContext = async (context) => { - await context.evalClosure( - ` - globalThis.axios = (...args) => $0.applySyncPromise(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.axios.get = (...args) => $1.applySyncPromise(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.axios.post = (...args) => $2.applySyncPromise(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.axios.put = (...args) => $3.applySyncPromise(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.axios.delete = (...args) => $4.applySyncPromise(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.axios.patch = (...args) => $5.applySyncPromise(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.requireObject = { - ...globalThis.requireObject, - axios: globalThis.axios, - } - `, - [ - async (...argStrings) => { - console.log(argStrings); - let args = argStrings?.map((arg) => JSON.parse(arg)); - const res = await axios(...args) - .then((response) => { - const { status, headers, data } = response || {}; - return cleanJson({ status, headers, data }); - }) - .catch((err) => { - return { - message: err.message - // response: cleanJson(err.response) - }; - }); - return new ivm.ExternalCopy(res).copyInto({ release: true }); - }, - async (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - const res = await axios - .get(...args) - .then((response) => { - const { status, headers, data } = response || {}; - return cleanJson({ status, headers, data }); - }) - .catch((err) => { - return { - message: err.message - // response: cleanJson(err.response) - }; - }); - return new ivm.ExternalCopy(res).copyInto({ release: true }); - }, - async (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - const res = await axios - .post(...args) - .then((response) => { - const { status, headers, data } = response || {}; - return cleanJson({ status, headers, data }); - }) - .catch((err) => { - return { - message: err.message - // response: cleanJson(err.response) - }; - }); - return new ivm.ExternalCopy(res).copyInto({ release: true }); - }, - async (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - const res = await axios - .put(...args) - .then((response) => { - const { status, headers, data } = response || {}; - return cleanJson({ status, headers, data }); - }) - .catch((err) => { - return { - message: err.message - // response: cleanJson(err.response) - }; - }); - return new ivm.ExternalCopy(res).copyInto({ release: true }); - }, - async (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - const res = await axios - .delete(...args) - .then((response) => { - const { status, headers, data } = response || {}; - return cleanJson({ status, headers, data }); - }) - .catch((err) => { - return { - message: err.message - // response: cleanJson(err.response) - }; - }); - return new ivm.ExternalCopy(res).copyInto({ release: true }); - }, - async (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - const res = await axios - .patch(...args) - .then((response) => { - const { status, headers, data } = response || {}; - return cleanJson({ status, headers, data }); - }) - .catch((err) => { - return { - message: err.message - // response: cleanJson(err.response) - }; - }); - return new ivm.ExternalCopy(res).copyInto({ release: true }); - } - ], - { arguments: { reference: true } } - ); -}; - -module.exports = addAxiosShimToContext; diff --git a/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/index.js b/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/index.js deleted file mode 100644 index 341b4860d..000000000 --- a/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/index.js +++ /dev/null @@ -1,11 +0,0 @@ -const addAxiosShimToContext = require('./axios'); -const addNanoidShimToContext = require('./nanoid'); -const addUuidShimToContext = require('./uuid'); - -const addLibraryShimsToContext = async (context) => { - await addAxiosShimToContext(context); - await addNanoidShimToContext(context); - await addUuidShimToContext(context); -}; - -module.exports = addLibraryShimsToContext; diff --git a/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/nanoid.js b/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/nanoid.js deleted file mode 100644 index 3481c816d..000000000 --- a/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/nanoid.js +++ /dev/null @@ -1,23 +0,0 @@ -const ivm = require('isolated-vm'); -const { nanoid } = require('nanoid'); - -const addNanoidShimToContext = async (context) => { - await context.evalClosure( - ` - globalThis.nanoid = {}; - globalThis.nanoid.nanoid = () => $0.applySync(undefined); - globalThis.requireObject = { - ...globalThis.requireObject, - nanoid: globalThis.nanoid - } - `, - [ - () => { - return new ivm.ExternalCopy(nanoid()).copyInto({ release: true }); - } - ], - { arguments: { reference: true } } - ); -}; - -module.exports = addNanoidShimToContext; diff --git a/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/uuid-min.js b/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/uuid-min.js deleted file mode 100644 index 2e1c010e5..000000000 --- a/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/uuid-min.js +++ /dev/null @@ -1,39 +0,0 @@ -const ivm = require('isolated-vm'); -const uuid = require('uuid'); -const { MAX, NIL } = uuid; - -const addUuidShimToContext = async (context) => { - await context.evalClosure( - ` - globalThis.uuid = {}; - globalThis.uuid.MAX = $0; - globalThis.uuid.NIL = $1; - ${['version', 'parse', 'stringify', 'v1', 'v1ToV6', 'v3', 'v4', 'v5', 'v6', 'v6ToV1', 'v7', 'validate'] - ?.map( - (fn, idx) => - `globalThis.uuid.${fn} = (...args) => $${ - idx + 2 - }.applySync(undefined, args?.map(arg=>JSON.stringify(arg)));` - ) - .join('\n')} - globalThis.requireObject = { - ...globalThis.requireObject, - uuid: globalThis.uuid, - } - `, - [ - new ivm.ExternalCopy(MAX).copyInto({ release: true }), - new ivm.ExternalCopy(NIL).copyInto({ release: true }), - ...['version', 'parse', 'stringify', 'v1', 'v1ToV6', 'v3', 'v4', 'v5', 'v6', 'v6ToV1', 'v7', 'validate']?.map( - (fn) => - (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - return new ivm.ExternalCopy(uuid[fn](...args)).copyInto({ release: true }); - } - ) - ], - { arguments: { reference: true } } - ); -}; - -module.exports = addUuidShimToContext; diff --git a/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/uuid.js b/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/uuid.js deleted file mode 100644 index 151498bb5..000000000 --- a/packages/bruno-js/src/sandbox/isolatedvm/shims/lib/uuid.js +++ /dev/null @@ -1,83 +0,0 @@ -const ivm = require('isolated-vm'); -const { MAX, NIL, parse, stringify, v1, v1ToV6, v3, v4, v5, v6, v6ToV1, v7, validate, version } = require('uuid'); - -const addUuidShimToContext = async (context) => { - await context.evalClosure( - ` - globalThis.uuid = {}; - globalThis.uuid.MAX = $0; - globalThis.uuid.NIL = $1; - globalThis.uuid.version = (...args) => $2.applySync(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.uuid.parse = (...args) => $3.applySync(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.uuid.stringify = (...args) => $4.applySync(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.uuid.v1 = (...args) => $5.applySync(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.uuid.v1ToV6 = (...args) => $6.applySync(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.uuid.v3 = (...args) => $7.applySync(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.uuid.v4 = (...args) => $8.applySync(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.uuid.v5 = (...args) => $9.applySync(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.uuid.v6 = (...args) => $10.applySync(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.uuid.v6ToV1 = (...args) => $11.applySync(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.uuid.v7 = (...args) => $12.applySync(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.uuid.validate = (...args) => $13.applySync(undefined, args?.map(arg=>JSON.stringify(arg))); - globalThis.requireObject = { - ...globalThis.requireObject, - uuid: globalThis.uuid, - } - `, - [ - new ivm.ExternalCopy(MAX).copyInto({ release: true }), - new ivm.ExternalCopy(NIL).copyInto({ release: true }), - (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - return new ivm.ExternalCopy(version(...args)).copyInto({ release: true }); - }, - (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - return new ivm.ExternalCopy(parse(...args)).copyInto({ release: true }); - }, - (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - return new ivm.ExternalCopy(stringify(...args)).copyInto({ release: true }); - }, - (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - return new ivm.ExternalCopy(v1(...args)).copyInto({ release: true }); - }, - (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - return new ivm.ExternalCopy(v1ToV6(...args)).copyInto({ release: true }); - }, - (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - return new ivm.ExternalCopy(v3(...args)).copyInto({ release: true }); - }, - (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - return new ivm.ExternalCopy(v4(...args)).copyInto({ release: true }); - }, - (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - return new ivm.ExternalCopy(v5(...args)).copyInto({ release: true }); - }, - (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - return new ivm.ExternalCopy(v6(...args)).copyInto({ release: true }); - }, - (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - return new ivm.ExternalCopy(v6ToV1(...args)).copyInto({ release: true }); - }, - (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - return new ivm.ExternalCopy(v7(...args)).copyInto({ release: true }); - }, - (...argStrings) => { - let args = argStrings?.map((arg) => JSON.parse(arg)); - return new ivm.ExternalCopy(validate(...args)).copyInto({ release: true }); - } - ], - { arguments: { reference: true } } - ); -}; - -module.exports = addUuidShimToContext; diff --git a/packages/bruno-js/src/sandbox/isolatedvm/shims/sleep.js b/packages/bruno-js/src/sandbox/isolatedvm/shims/sleep.js deleted file mode 100644 index 14ce92e30..000000000 --- a/packages/bruno-js/src/sandbox/isolatedvm/shims/sleep.js +++ /dev/null @@ -1,32 +0,0 @@ -const ivm = require('isolated-vm'); -const addSleepShimToContext = (context, console) => { - context.evalClosureSync( - ` - global.sleep = (...args) => $0.applySyncPromise(undefined, args?.map(arg=>JSON.stringify(arg))); - `, - [ - async (...argStrings) => { - await new Promise((resolve) => { - const timer = Number(argStrings?.[0]); - if (!Number.isInteger(timer) || timer < 0) { - resolve(); - } - setTimeout(() => { - resolve(); - }, timer); - }); - return new ivm.ExternalCopy('done').copyInto({ release: true }); - } - ], - { arguments: { reference: true } } - ); - - context.evalSync(` - global.setTimeout = async (fn, timer) => { - await sleep(timer); - await fn.apply(); - } - `); -}; - -module.exports = addSleepShimToContext; diff --git a/packages/bruno-js/src/sandbox/isolatedvm/shims/test.js b/packages/bruno-js/src/sandbox/isolatedvm/shims/test.js deleted file mode 100644 index 20547a7b5..000000000 --- a/packages/bruno-js/src/sandbox/isolatedvm/shims/test.js +++ /dev/null @@ -1,56 +0,0 @@ -const addTestShimToContext = async (context, __brunoTestResults) => { - context.global.setSync('addResult', function (v) { - __brunoTestResults.addResult(v); - }); - - context.global.setSync('getResults', function () { - return __brunoTestResults.getResults(); - }); - - context.evalSync(` - globalThis.expect = require('chai').expect; - globalThis.assert = require('chai').assert; - - globalThis.__brunoTestResults = { - addResult: globalThis.__bruno__addResult, - getResults: globalThis.__bruno__getResults, - } - - globalThis.DummyChaiAssertionError = class DummyChaiAssertionError extends Error { - constructor(message, props, ssf) { - super(message); - this.name = "AssertionError"; - Object.assign(this, props); - } - } - - globalThis.Test = (__brunoTestResults) => async (description, callback) => { - try { - await callback(); - __brunoTestResults.addResult({ description, status: "pass" }); - } catch (error) { - if (error instanceof DummyChaiAssertionError) { - const { message, actual, expected } = error; - __brunoTestResults.addResult({ - description, - status: "fail", - error: message, - actual, - expected, - }); - } else { - globalThis.__bruno__addResult({ - description, - status: "fail", - error: error.message || "An unexpected error occurred.", - }); - } - // console.log(error); - } - }; - - globalThis.test = Test(__brunoTestResults); - `); -}; - -module.exports = addTestShimToContext; diff --git a/packages/bruno-js/src/sandbox/quickjs/index.js b/packages/bruno-js/src/sandbox/quickjs/index.js index 6aa3b5df8..906c37daf 100644 --- a/packages/bruno-js/src/sandbox/quickjs/index.js +++ b/packages/bruno-js/src/sandbox/quickjs/index.js @@ -6,7 +6,7 @@ const addTestShimToContext = require('./shims/test'); const addLibraryShimsToContext = require('./shims/lib'); const { newQuickJSWASMModule, memoizePromiseFactory } = require('quickjs-emscripten'); -// execute `npm run build:isolated-vm:inbuilt-modules` if the below file doesn't exist +// execute `npm run sandbox:bundle-libraries` if the below file doesn't exist const getBundledCode = require('../../bundle-browser-rollup'); const addSleepShimToContext = require('./shims/sleep'); @@ -20,7 +20,7 @@ const toNumber = (value) => { return Number.isInteger(num) ? parseInt(value, 10) : parseFloat(value); }; -const executeQuickJsVm = ({ script: externalScript, context: externalContext, scriptType = 'script' }) => { +const executeQuickJsVm = ({ script: externalScript, context: externalContext, scriptType = 'template-literal' }) => { if (!isNaN(Number(externalScript))) { return Number(externalScript); } @@ -35,7 +35,6 @@ const executeQuickJsVm = ({ script: externalScript, context: externalContext, sc res && addBrunoResponseShimToContext(vm, res); const templateLiteralText = `\`${externalScript}\`;`; - const jsExpressionText = `${externalScript};`; let scriptText = scriptType === 'template-literal' ? templateLiteralText : jsExpressionText; @@ -54,14 +53,11 @@ const executeQuickJsVm = ({ script: externalScript, context: externalContext, sc } catch (error) { console.error('Error executing the script!', error); } - // }); }; const executeQuickJsVmAsync = async ({ script: externalScript, - context: externalContext, - modules = {}, - scriptType = 'script' + context: externalContext }) => { if (!isNaN(Number(externalScript))) { return toNumber(externalScript); @@ -100,14 +96,12 @@ const executeQuickJsVmAsync = async ({ fn.apply(); } await sleep(0); - console?.debug && console.debug('quick-js:execution-start:'); try { ${externalScript} } catch(error) { console?.debug && console.debug('quick-js:execution-end:with-error', error?.message); } - console?.debug && console.debug('quick-js:execution-end:'); return 'done'; })() `; @@ -119,7 +113,7 @@ const executeQuickJsVmAsync = async ({ const resolvedHandle = vm.unwrapResult(resolvedResult); resolvedHandle.dispose(); // vm.dispose(); - return 'foo'; + return; } catch (error) { console.error('Error executing the script!', error); } diff --git a/packages/bruno-tests/collection/scripting/local modules/sum.bru b/packages/bruno-tests/collection/scripting/local modules/sum.bru index c0c9a1aeb..f6a4193ed 100644 --- a/packages/bruno-tests/collection/scripting/local modules/sum.bru +++ b/packages/bruno-tests/collection/scripting/local modules/sum.bru @@ -25,7 +25,7 @@ script:pre-request { const math = require("./lib/math"); const body = req.getBody(); - body.sum = body.a + body.b; + body.sum = math.sum(body.a, body.b); req.setBody(body); }