Fix bson
This commit is contained in:
parent
d1d005dbbc
commit
abe09509f0
|
@ -131,13 +131,16 @@ export class IsolatedVM implements VM {
|
||||||
|
|
||||||
withContext(context: Record<string, any>) {
|
withContext(context: Record<string, any>) {
|
||||||
this.#addToContext(context)
|
this.#addToContext(context)
|
||||||
this.#handleBsonData()
|
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
withParsingBson() {
|
withParsingBson(data: any) {
|
||||||
this.#parseBson = true
|
this.#parseBson = true
|
||||||
this.#handleBsonData()
|
|
||||||
|
this.#addToContext({
|
||||||
|
bsonData: bson.BSON.serialize(data),
|
||||||
|
})
|
||||||
|
|
||||||
const bsonSource = loadBundle(BundleType.BSON)
|
const bsonSource = loadBundle(BundleType.BSON)
|
||||||
const bsonModule = this.#isolate.compileModuleSync(bsonSource)
|
const bsonModule = this.#isolate.compileModuleSync(bsonSource)
|
||||||
|
@ -149,21 +152,6 @@ export class IsolatedVM implements VM {
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
#handleBsonData() {
|
|
||||||
if (!this.#parseBson) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = this.#getFromContext("data")
|
|
||||||
if (!data) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
this.#addToContext({
|
|
||||||
data: bson.BSON.serialize({ data }),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
execute(code: string): string {
|
execute(code: string): string {
|
||||||
const perRequestLimit = this.#perRequestLimit
|
const perRequestLimit = this.#perRequestLimit
|
||||||
|
|
||||||
|
@ -182,12 +170,11 @@ export class IsolatedVM implements VM {
|
||||||
// 2. Deserialise the data within the isolate, to get the original data
|
// 2. Deserialise the data within the isolate, to get the original data
|
||||||
// 3. Process script
|
// 3. Process script
|
||||||
// 4. Stringify the result in order to convert the result from BSON to json
|
// 4. Stringify the result in order to convert the result from BSON to json
|
||||||
code = `toJson(
|
code = `(function(){
|
||||||
(function(){
|
const data= deserialize(bsonData);
|
||||||
data= deserialize(data).data;
|
const result = ${code}
|
||||||
return ${code};
|
return toJson(result);
|
||||||
})()
|
})();`
|
||||||
);`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
code = `${this.#moduleHandler.generateImports()};results.out=${code};`
|
code = `${this.#moduleHandler.generateImports()};results.out=${code};`
|
||||||
|
|
|
@ -13,8 +13,8 @@ class ScriptRunner {
|
||||||
timeout: JS_TIMEOUT_MS,
|
timeout: JS_TIMEOUT_MS,
|
||||||
}).withContext(context)
|
}).withContext(context)
|
||||||
|
|
||||||
if (parseBson) {
|
if (parseBson && context.data) {
|
||||||
this.#vm = this.#vm.withParsingBson()
|
this.#vm = this.#vm.withParsingBson(context.data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,114 +24,4 @@ class ScriptRunner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// <<<<<<< HEAD
|
|
||||||
// constructor(script: string, context: any, { parseBson = false } = {}) {
|
|
||||||
// this.vm = new IsolatedVM({
|
|
||||||
// memoryLimit: env.JS_RUNNER_MEMORY_LIMIT,
|
|
||||||
// parseBson,
|
|
||||||
// context: {
|
|
||||||
// ...context,
|
|
||||||
// data: parseBson
|
|
||||||
// ? bson.BSON.serialize({ data: context.data })
|
|
||||||
// : context.data,
|
|
||||||
// },
|
|
||||||
// })
|
|
||||||
|
|
||||||
// if (parseBson) {
|
|
||||||
// // If we need to parse bson, we follow the next steps:
|
|
||||||
// // 1. Serialise the data from potential BSON to buffer before passing it to the isolate
|
|
||||||
// // 2. Deserialise the data within the isolate, to get the original data
|
|
||||||
// // 3. Process script
|
|
||||||
// // 4. Stringify the result in order to convert the result from BSON to json
|
|
||||||
// script = `return toJson((function(){data=deserialize(data, { validation: { utf8: true } }).data;${script}})());`
|
|
||||||
// }
|
|
||||||
|
|
||||||
// this.vm.code = script
|
|
||||||
// }
|
|
||||||
|
|
||||||
// execute() {
|
|
||||||
// this.vm.runScript()
|
|
||||||
// const result = this.vm.getResult()
|
|
||||||
// return result
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// class IsolatedVM {
|
|
||||||
// #isolate: ivm.Isolate
|
|
||||||
// #vm: ivm.Context
|
|
||||||
// #jail: ivm.Reference
|
|
||||||
// #script: ivm.Module = undefined!
|
|
||||||
// #bsonModule?: ivm.Module
|
|
||||||
|
|
||||||
// readonly #resultKey = "results"
|
|
||||||
|
|
||||||
// constructor({
|
|
||||||
// memoryLimit,
|
|
||||||
// parseBson,
|
|
||||||
// context,
|
|
||||||
// }: {
|
|
||||||
// memoryLimit: number
|
|
||||||
// parseBson: boolean
|
|
||||||
// context: Record<string, any>
|
|
||||||
// }) {
|
|
||||||
// this.#isolate = new ivm.Isolate({ memoryLimit })
|
|
||||||
// this.#vm = this.#isolate.createContextSync()
|
|
||||||
// this.#jail = this.#vm.global
|
|
||||||
// this.#jail.setSync("global", this.#jail.derefInto())
|
|
||||||
|
|
||||||
// this.#addToContext(context)
|
|
||||||
// this.#addToContext({
|
|
||||||
// [this.#resultKey]: { out: "" },
|
|
||||||
// })
|
|
||||||
|
|
||||||
// if (parseBson) {
|
|
||||||
// const bsonSource = loadBundle(BundleType.BSON)
|
|
||||||
// this.#bsonModule = this.#isolate.compileModuleSync(bsonSource)
|
|
||||||
// this.#bsonModule.instantiateSync(this.#vm, specifier => {
|
|
||||||
// throw new Error(`No imports allowed. Required: ${specifier}`)
|
|
||||||
// })
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// getResult() {
|
|
||||||
// const ref = this.#vm.global.getSync(this.#resultKey, { reference: true })
|
|
||||||
// const result = ref.copySync()
|
|
||||||
// ref.release()
|
|
||||||
// return result.out
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #addToContext(context: Record<string, any>) {
|
|
||||||
// for (let key in context) {
|
|
||||||
// this.#jail.setSync(key, this.#copyRefToVm(context[key]))
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// set code(code: string) {
|
|
||||||
// code = `const fn=function(){${code}};results.out=fn();`
|
|
||||||
// if (this.#bsonModule) {
|
|
||||||
// code = `import {deserialize, toJson} from "compiled_module";${code}`
|
|
||||||
// }
|
|
||||||
// this.#script = this.#isolate.compileModuleSync(code)
|
|
||||||
// }
|
|
||||||
|
|
||||||
// runScript(): void {
|
|
||||||
// this.#script.instantiateSync(this.#vm, specifier => {
|
|
||||||
// if (specifier === "compiled_module" && this.#bsonModule) {
|
|
||||||
// return this.#bsonModule!
|
|
||||||
// }
|
|
||||||
|
|
||||||
// throw new Error(`"${specifier}" import not allowed`)
|
|
||||||
// })
|
|
||||||
|
|
||||||
// this.#script.evaluateSync({ timeout: JS_TIMEOUT_MS })
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #copyRefToVm(value: Object): ivm.Copy<Object> {
|
|
||||||
// return new ivm.ExternalCopy(value).copyInto({ release: true })
|
|
||||||
// }
|
|
||||||
// =======
|
|
||||||
|
|
||||||
// >>>>>>> isolated-vm-wrapper
|
|
||||||
// }
|
|
||||||
|
|
||||||
export default ScriptRunner
|
export default ScriptRunner
|
||||||
|
|
Loading…
Reference in New Issue