diff --git a/packages/server/src/jsRunner/vm/index.ts b/packages/server/src/jsRunner/vm/index.ts index 1e3a47e93e..2bacf5f133 100644 --- a/packages/server/src/jsRunner/vm/index.ts +++ b/packages/server/src/jsRunner/vm/index.ts @@ -16,6 +16,35 @@ class ExecutionTimeoutError extends Error { } } +class ModuleHandler { + #modules: { + import: string + moduleKey: string + module: ivm.Module + }[] = [] + + #generateRandomKey = () => `i${crypto.randomUUID().replace(/-/g, "")}` + + registerModule(module: ivm.Module, imports: string) { + this.#modules.push({ + moduleKey: this.#generateRandomKey(), + import: imports, + module: module, + }) + } + + generateImports() { + return this.#modules + .map(m => `import ${m.import} from "${m.moduleKey}"`) + .join(";") + } + + getModule(key: string) { + const module = this.#modules.find(m => m.moduleKey === key) + return module?.module + } +} + export class IsolatedVM implements VM { #isolate: ivm.Isolate #vm: ivm.Context @@ -25,11 +54,7 @@ export class IsolatedVM implements VM { #parseBson?: boolean - #modules: { - import: string - moduleKey: string - module: ivm.Module - }[] = [] + #moduleHandler = new ModuleHandler() readonly #resultKey = "results" @@ -100,11 +125,7 @@ export class IsolatedVM implements VM { throw new Error(`No imports allowed. Required: ${specifier}`) }) - this.#modules.push({ - import: "helpers", - moduleKey: `i${crypto.randomUUID().replace(/-/g, "")}`, - module: helpersModule, - }) + this.#moduleHandler.registerModule(helpersModule, "helpers") return this } @@ -124,12 +145,7 @@ export class IsolatedVM implements VM { throw new Error(`No imports allowed. Required: ${specifier}`) }) - this.#modules.push({ - import: "{deserialize, toJson}", - moduleKey: `i${crypto.randomUUID().replace(/-/g, "")}`, - module: bsonModule, - }) - + this.#moduleHandler.registerModule(bsonModule, "{deserialize, toJson}") return this } @@ -174,17 +190,14 @@ export class IsolatedVM implements VM { );` } - code = [ - ...this.#modules.map(m => `import ${m.import} from "${m.moduleKey}"`), - `results.out=${code};`, - ].join(";") + code = `${this.#moduleHandler.generateImports()};results.out=${code};` const script = this.#isolate.compileModuleSync(code) script.instantiateSync(this.#vm, specifier => { - const module = this.#modules.find(m => m.moduleKey === specifier) + const module = this.#moduleHandler.getModule(specifier) if (module) { - return module.module + return module } throw new Error(`"${specifier}" import not allowed`) diff --git a/packages/server/src/utilities/scriptRunner.ts b/packages/server/src/utilities/scriptRunner.ts index 3111ec1dc6..ed69d35186 100644 --- a/packages/server/src/utilities/scriptRunner.ts +++ b/packages/server/src/utilities/scriptRunner.ts @@ -1,5 +1,3 @@ -import bson from "bson" - import env from "../environment" import { IsolatedVM } from "../jsRunner/vm"