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:
commit
cc8525f53c
|
@ -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 {
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue