From 262dbc7c2b705e37fb67c6c9d8707334f1893d8c Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Thu, 18 Jan 2024 13:49:47 +0100 Subject: [PATCH] Inject url --- packages/server/src/jsRunner.ts | 44 ++++++++++++++----- .../string-templates/src/index-helpers.js | 4 +- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/packages/server/src/jsRunner.ts b/packages/server/src/jsRunner.ts index baf4a19d11..c0738d2b7d 100644 --- a/packages/server/src/jsRunner.ts +++ b/packages/server/src/jsRunner.ts @@ -4,26 +4,50 @@ import { setJSRunner } from "@budibase/string-templates" import { context } from "@budibase/backend-core" import tracer from "dd-trace" import fs from "fs" +import url from "url" export function init() { const helpersSource = fs.readFileSync( `${require.resolve("@budibase/string-templates/index-helpers")}`, "utf8" ) - setJSRunner((js: string, ctx: Record) => { return tracer.trace("runJS", {}, span => { - const bbCtx = context.getCurrentContext()! - let { jsContext, jsIsolate } = bbCtx - // if (!jsIsolate) { - jsIsolate = new ivm.Isolate({ memoryLimit: 64 }) - jsContext = jsIsolate.createContextSync() - const helpersModule = jsIsolate.compileModuleSync(helpersSource) + const bbCtx = context.getCurrentContext() || {} + let { jsIsolate = new ivm.Isolate({ memoryLimit: 64 }) } = bbCtx + let { jsContext = jsIsolate.createContextSync() } = bbCtx + const injectedRequire = `const require = function(val){ + switch (val) { + case "url": + return { + resolve: (...params) => urlResolveCb(...params), + parse: (...params) => urlParseCb(...params), + } + } + };` + + const global = jsContext.global + global.setSync( + "urlResolveCb", + new ivm.Callback((...params: Parameters) => + url.resolve(...params) + ) + ) + + global.setSync( + "urlParseCb", + new ivm.Callback((...params: Parameters) => + url.parse(...params) + ) + ) + + const helpersModule = jsIsolate.compileModuleSync( + `${injectedRequire};${helpersSource}` + ) helpersModule.instantiateSync(jsContext, specifier => { throw new Error(`No imports allowed. Required: ${specifier}`) }) - // } const perRequestLimit = env.JS_PER_REQUEST_TIME_LIMIT_MS if (perRequestLimit) { @@ -35,8 +59,6 @@ export function init() { } } - const global = jsContext!.global - for (const [key, value] of Object.entries(ctx)) { if (key === "helpers") { // Can't copy the native helpers into the isolate. We just ignore them as they are handled properly from the helpersSource @@ -50,7 +72,7 @@ export function init() { {} ) - script.instantiateSync(jsContext!, specifier => { + script.instantiateSync(jsContext, specifier => { if (specifier === "compiled_module") { return helpersModule } diff --git a/packages/string-templates/src/index-helpers.js b/packages/string-templates/src/index-helpers.js index 7493c5ffdd..3d4a8f1741 100644 --- a/packages/string-templates/src/index-helpers.js +++ b/packages/string-templates/src/index-helpers.js @@ -5,7 +5,7 @@ const externalCollections = { math: require("@budibase/handlebars-helpers/lib/math"), array: require("@budibase/handlebars-helpers/lib/array"), number: require("@budibase/handlebars-helpers/lib/number"), - // url: require("@budibase/handlebars-helpers/lib/url"), + url: require("@budibase/handlebars-helpers/lib/url"), string: require("@budibase/handlebars-helpers/lib/string"), comparison: require("@budibase/handlebars-helpers/lib/comparison"), object: require("@budibase/handlebars-helpers/lib/object"), @@ -37,4 +37,4 @@ const getHelperList = () => { return helpers } -export default getHelperList() +module.exports = getHelperList()