eval-server/vm.js
2023-08-26 13:35:05 +07:00

76 lines
2.2 KiB
JavaScript

const { parentPort } = require('worker_threads')
const { VM } = require('vm2')
const randomstring = require('randomstring')
const ChatMessage = require('prismarine-chat')('1.20.1')
const mc = require('minecraft-protocol')
const moment = require('moment-timezone')
const crypto = require('crypto')
const nbt = require('prismarine-nbt')
const util = require('util')
const { stylize } = require('./colors')
const BRIDGE_PREFIX = 'function:'
let proxy
let vm
const handler = {
get (target, prop) {
if (!target[prop]) throw new Error(`Function "${prop}" not available`)
return (...args) => target[prop](...args)
}
}
let functions
parentPort.on('message', (msg) => {
switch (msg.type) {
case 'setFunctions':
const parsed = JSON.parse(msg.jsonArray)
functions = {}
for (const eachFuntion of parsed) {
functions[eachFuntion] = (...args) => {
parentPort.postMessage({ type: 'socketEmit', data: [BRIDGE_PREFIX + eachFuntion, ...args] })
// how do i make thjis work
// return new Promise((resolve) => {
// parentPort.postMessage({ type: 'socketOnce', data: [`functionOutput:${eachFuntion}`, (message, parseJSON) => {
// if (parseJSON) resolve(JSON.parse(message))
// else resolve(message)
// }]})
// })
}
}
proxy = new Proxy(functions, handler)
vm = new VM({
timeout: 500,
sandbox: {
get bridge () { return proxy },
randomstring,
ChatMessage,
mc,
moment,
crypto,
nbt
}
})
break
case 'runCode':
try {
const output = vm.run(msg.code)
parentPort.postMessage({ type: 'codeOutput', output: util.inspect(output, { stylize }), error: false })
} catch (e) {
parentPort.postMessage({ type: 'codeOutput', output: e.toString(), error: true })
}
break
}
})