diff --git a/packages/server/src/utilities/scriptRunner.ts b/packages/server/src/utilities/scriptRunner.ts index 72042a5791..fee0215d2e 100644 --- a/packages/server/src/utilities/scriptRunner.ts +++ b/packages/server/src/utilities/scriptRunner.ts @@ -1,40 +1,28 @@ -import tracer, { Span } from "dd-trace" -import env from "../environment" -import { IsolatedVM } from "../jsRunner/vm" +import fetch from "node-fetch" +import { VM, VMScript } from "vm2" const JS_TIMEOUT_MS = 1000 class ScriptRunner { - private code: string - private vm: IsolatedVM + vm: VM + results: { out: string } + script: VMScript - private tracerSpan: Span - - constructor(script: string, context: any, { parseBson = false } = {}) { - this.tracerSpan = tracer.startSpan("scriptRunner", { tags: { parseBson } }) - - this.code = `(() => {${script}})();` - this.vm = new IsolatedVM({ - memoryLimit: env.JS_RUNNER_MEMORY_LIMIT, - invocationTimeout: JS_TIMEOUT_MS, - }).withContext(context) - - if (parseBson && context.data) { - this.vm = this.vm.withParsingBson(context.data) - } + constructor(script: string, context: any) { + const code = `let fn = () => {\n${script}\n}; results.out = fn();` + this.vm = new VM({ + timeout: JS_TIMEOUT_MS, + }) + this.results = { out: "" } + this.vm.setGlobals(context) + this.vm.setGlobal("fetch", fetch) + this.vm.setGlobal("results", this.results) + this.script = new VMScript(code) } execute() { - const result = tracer.trace( - "scriptRunner.execute", - { childOf: this.tracerSpan }, - () => { - const result = this.vm.execute(this.code) - return result - } - ) - this.tracerSpan.finish() - return result + this.vm.run(this.script) + return this.results.out } }