Merge pull request #15032 from Budibase/mongodb-transformer-tweaks

Bypass transformers that are trivial, allow users to configure bson buffer size.
This commit is contained in:
Sam Rose 2024-11-19 12:00:15 +00:00 committed by GitHub
commit cc8525f53c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 33 additions and 10 deletions

View File

@ -19,6 +19,12 @@ function isDev() {
return process.env.NODE_ENV !== "production" return process.env.NODE_ENV !== "production"
} }
function parseIntSafe(number?: string) {
if (number) {
return parseInt(number)
}
}
let LOADED = false let LOADED = false
if (!LOADED && isDev() && !isTest()) { if (!LOADED && isDev() && !isTest()) {
require("dotenv").config() require("dotenv").config()
@ -231,6 +237,7 @@ const environment = {
MIN_VERSION_WITHOUT_POWER_ROLE: MIN_VERSION_WITHOUT_POWER_ROLE:
process.env.MIN_VERSION_WITHOUT_POWER_ROLE || "3.0.0", process.env.MIN_VERSION_WITHOUT_POWER_ROLE || "3.0.0",
DISABLE_CONTENT_SECURITY_POLICY: process.env.DISABLE_CONTENT_SECURITY_POLICY, DISABLE_CONTENT_SECURITY_POLICY: process.env.DISABLE_CONTENT_SECURITY_POLICY,
BSON_BUFFER_SIZE: parseIntSafe(process.env.BSON_BUFFER_SIZE),
} }
export function setEnv(newEnvVars: Partial<typeof environment>): () => void { export function setEnv(newEnvVars: Partial<typeof environment>): () => void {

View File

@ -23,6 +23,7 @@ import {
} from "@budibase/types" } from "@budibase/types"
import { ValidQueryNameRegex, utils as JsonUtils } from "@budibase/shared-core" import { ValidQueryNameRegex, utils as JsonUtils } from "@budibase/shared-core"
import { findHBSBlocks } from "@budibase/string-templates" import { findHBSBlocks } from "@budibase/string-templates"
import { ObjectId } from "mongodb"
const Runner = new Thread(ThreadType.QUERY, { const Runner = new Thread(ThreadType.QUERY, {
timeoutMs: env.QUERY_THREAD_TIMEOUT, timeoutMs: env.QUERY_THREAD_TIMEOUT,
@ -223,6 +224,8 @@ export async function preview(
} else { } else {
fieldMetadata = makeQuerySchema(FieldType.ARRAY, key) fieldMetadata = makeQuerySchema(FieldType.ARRAY, key)
} }
} else if (field instanceof ObjectId) {
fieldMetadata = makeQuerySchema(FieldType.STRING, key)
} else { } else {
fieldMetadata = makeQuerySchema(FieldType.JSON, key) fieldMetadata = makeQuerySchema(FieldType.JSON, key)
} }

View File

@ -28,6 +28,7 @@ import Koa from "koa"
import { Server } from "http" import { Server } from "http"
import { AddressInfo } from "net" import { AddressInfo } from "net"
import fs from "fs" import fs from "fs"
import bson from "bson"
let STARTUP_RAN = false let STARTUP_RAN = false
@ -193,6 +194,10 @@ export async function startup(
}) })
} }
if (coreEnv.BSON_BUFFER_SIZE) {
bson.setInternalBufferSize(coreEnv.BSON_BUFFER_SIZE)
}
console.log("Initialising JS runner") console.log("Initialising JS runner")
jsRunner.init() jsRunner.init()
} }

View File

@ -136,21 +136,23 @@ class QueryRunner {
pagination = output.pagination pagination = output.pagination
} }
// transform as required // We avoid invoking the transformer if it's trivial because there is a cost
if (transformer) { // to passing data in and out of the isolate, especially for MongoDB where
// we have to bson serialise/deserialise the data.
const hasTransformer =
transformer != null &&
transformer.length > 0 &&
transformer.trim() !== "return data" &&
transformer.trim() !== "return data;"
if (transformer && hasTransformer) {
transformer = iifeWrapper(transformer) transformer = iifeWrapper(transformer)
let vm = new IsolatedVM() let vm = new IsolatedVM()
if (datasource.source === SourceName.MONGODB) { if (datasource.source === SourceName.MONGODB) {
vm = vm.withParsingBson(rows) vm = vm.withParsingBson(rows)
} }
const ctx = { data: rows, params: enrichedParameters }
const ctx = { rows = vm.withContext(ctx, () => vm.execute(transformer!))
data: rows,
params: enrichedParameters,
}
if (transformer != null) {
rows = vm.withContext(ctx, () => vm.execute(transformer!))
}
} }
// if the request fails we retry once, invalidating the cached value // if the request fails we retry once, invalidating the cached value

View File

@ -24,6 +24,7 @@ import {
db.init() db.init()
import koaBody from "koa-body" import koaBody from "koa-body"
import http from "http" import http from "http"
import bson from "bson"
import api from "./api" import api from "./api"
const koaSession = require("koa-session") const koaSession = require("koa-session")
@ -99,6 +100,11 @@ export default server.listen(parseInt(env.PORT || "4002"), async () => {
startupLog = `${startupLog} - environment: "${env.BUDIBASE_ENVIRONMENT}"` startupLog = `${startupLog} - environment: "${env.BUDIBASE_ENVIRONMENT}"`
} }
console.log(startupLog) console.log(startupLog)
if (coreEnv.BSON_BUFFER_SIZE) {
bson.setInternalBufferSize(coreEnv.BSON_BUFFER_SIZE)
}
await initPro() await initPro()
await redis.clients.init() await redis.clients.init()
features.init() features.init()