From 8dfcc3aeb194ce35f9c667e72134957b7d24f334 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 2 Feb 2024 12:02:09 +0100 Subject: [PATCH] Revert "Revert "Migrate from `vm` to `isolated-vm`"" --- hosting/single/Dockerfile | 2 + packages/backend-core/package.json | 2 +- packages/backend-core/src/context/types.ts | 8 +- packages/backend-core/src/timers/timers.ts | 38 ---- .../bbui/src/Form/Core/EnvDropdown.svelte | 4 +- packages/server/Dockerfile | 2 + packages/server/nodemon.json | 4 +- packages/server/package.json | 22 ++- packages/server/scripts/test.sh | 4 +- packages/server/src/api/controllers/script.ts | 6 +- .../src/api/controllers/static/index.ts | 2 +- .../server/src/api/routes/tests/table.spec.ts | 2 +- .../automations/tests/executeScript.spec.js | 40 +++-- packages/server/src/db/newid.ts | 2 +- packages/server/src/environment.ts | 2 + packages/server/src/jsRunner.ts | 61 ------- packages/server/src/jsRunner/index.ts | 167 ++++++++++++++++++ .../src/jsRunner/tests/jsRunner.spec.ts | 75 ++++++++ .../src/utilities/fileSystem/filesystem.ts | 2 +- packages/server/src/utilities/scriptRunner.ts | 64 +++++-- packages/string-templates/package.json | 10 +- packages/string-templates/src/errors.js | 11 ++ .../src/helpers/javascript.js | 2 +- packages/string-templates/src/helpers/list.js | 33 ++-- .../string-templates/src/index-helpers.js | 9 + packages/string-templates/src/index.cjs | 5 + packages/string-templates/src/index.js | 5 + packages/string-templates/src/index.mjs | 2 + .../string-templates/test/manifest.spec.js | 103 +---------- packages/string-templates/test/utils.js | 111 ++++++++++++ packages/worker/Dockerfile | 2 + packages/worker/nodemon.json | 4 +- yarn.lock | 137 ++++++++++++-- 33 files changed, 663 insertions(+), 280 deletions(-) delete mode 100644 packages/server/src/jsRunner.ts create mode 100644 packages/server/src/jsRunner/index.ts create mode 100644 packages/server/src/jsRunner/tests/jsRunner.spec.ts create mode 100644 packages/string-templates/src/errors.js create mode 100644 packages/string-templates/src/index-helpers.js create mode 100644 packages/string-templates/test/utils.js diff --git a/hosting/single/Dockerfile b/hosting/single/Dockerfile index 67ac677984..f9044cd124 100644 --- a/hosting/single/Dockerfile +++ b/hosting/single/Dockerfile @@ -124,6 +124,8 @@ HEALTHCHECK --interval=15s --timeout=15s --start-period=45s CMD "/healthcheck.sh # must set this just before running ENV NODE_ENV=production +# this is required for isolated-vm to work on Node 20+ +ENV NODE_OPTIONS="--no-node-snapshot" WORKDIR / CMD ["./runner.sh"] diff --git a/packages/backend-core/package.json b/packages/backend-core/package.json index 85644488f5..13bc7011b5 100644 --- a/packages/backend-core/package.json +++ b/packages/backend-core/package.json @@ -54,7 +54,7 @@ "sanitize-s3-objectkey": "0.0.1", "semver": "7.3.7", "tar-fs": "2.1.1", - "uuid": "8.3.2" + "uuid": "^8.3.2" }, "devDependencies": { "@shopify/jest-koa-mocks": "5.1.1", diff --git a/packages/backend-core/src/context/types.ts b/packages/backend-core/src/context/types.ts index f73dc9f5c7..cc052ca505 100644 --- a/packages/backend-core/src/context/types.ts +++ b/packages/backend-core/src/context/types.ts @@ -1,5 +1,5 @@ import { IdentityContext } from "@budibase/types" -import { ExecutionTimeTracker } from "../timers" +import { Isolate, Context, Module } from "isolated-vm" // keep this out of Budibase types, don't want to expose context info export type ContextMap = { @@ -10,5 +10,9 @@ export type ContextMap = { isScim?: boolean automationId?: string isMigrating?: boolean - jsExecutionTracker?: ExecutionTimeTracker + isolateRefs?: { + jsIsolate: Isolate + jsContext: Context + helpersModule: Module + } } diff --git a/packages/backend-core/src/timers/timers.ts b/packages/backend-core/src/timers/timers.ts index 9121c576cd..000be74821 100644 --- a/packages/backend-core/src/timers/timers.ts +++ b/packages/backend-core/src/timers/timers.ts @@ -20,41 +20,3 @@ export function cleanup() { } intervals = [] } - -export class ExecutionTimeoutError extends Error { - public readonly name = "ExecutionTimeoutError" -} - -export class ExecutionTimeTracker { - static withLimit(limitMs: number) { - return new ExecutionTimeTracker(limitMs) - } - - constructor(readonly limitMs: number) {} - - private totalTimeMs = 0 - - track(f: () => T): T { - this.checkLimit() - const start = process.hrtime.bigint() - try { - return f() - } finally { - const end = process.hrtime.bigint() - this.totalTimeMs += Number(end - start) / 1e6 - this.checkLimit() - } - } - - get elapsedMS() { - return this.totalTimeMs - } - - checkLimit() { - if (this.totalTimeMs > this.limitMs) { - throw new ExecutionTimeoutError( - `Execution time limit of ${this.limitMs}ms exceeded: ${this.totalTimeMs}ms` - ) - } - } -} diff --git a/packages/bbui/src/Form/Core/EnvDropdown.svelte b/packages/bbui/src/Form/Core/EnvDropdown.svelte index 2edf8a5f9d..c690ffbc6b 100644 --- a/packages/bbui/src/Form/Core/EnvDropdown.svelte +++ b/packages/bbui/src/Form/Core/EnvDropdown.svelte @@ -184,7 +184,7 @@ {#if environmentVariablesEnabled}
showModal()} class="add-variable">
handleUpgradePanel()} class="add-variable">