| const node = {}, | |
| modules = 'child_process|fs|os|process|timers|util' | |
| for (let m of modules.split`|`) node[m] = require(`node:${m}`) | |
| const prettyBytes = require('bytes'), | |
| express = require('express'), | |
| morgan = require('morgan'), | |
| { default: prettyMs } = require('pretty-ms'), | |
| serveIndex = require('serve-index') | |
| const limitSize = '69mb', | |
| tmpDir = node.os.tmpdir(), | |
| { env } = node.process, | |
| PORT = env.SERVER_PORT || env.PORT || 7860, | |
| timeZone = env.TZ || 'Asia/Jakarta' | |
| const execPromise = node.util.promisify( | |
| node.child_process.exec | |
| ), | |
| formatBytes = (val) => prettyBytes(val, { unitSeparator: ' ' }), | |
| isNumber = (val) => typeof val === 'number', | |
| logger = (...args) => console.log( | |
| new Date().toLocaleTimeString('fr', { timeZone }), | |
| ...args | |
| ), | |
| transformObj = (obj, cb) => JSON.parse( | |
| JSON.stringify( | |
| obj, | |
| (key, val) => cb(key, val) ? formatBytes(val) : val | |
| ).replace(/_(\w)/g, (_, g) => g.toUpperCase()) | |
| ), | |
| getServerStats = () => { | |
| const proc = node.process | |
| const stats = {} | |
| stats.uptime = prettyMs(proc.uptime() * 1e3) | |
| stats.osUptime = prettyMs(node.os.uptime() * 1e3) | |
| const report = proc.report?.getReport?.() | |
| if (report) Object.assign(stats, { | |
| getReport: report.header, | |
| javascriptHeap: transformObj( | |
| report.javascriptHeap, | |
| (k, v) => !/(ContextCount|Garbage)/i.test(k) && isNumber(v) | |
| ), | |
| resourceUsage: transformObj( | |
| report.resourceUsage, | |
| (k, v) => !/(Percent|IO|reads|write)/i.test(k) && isNumber(v) | |
| ), | |
| uvthreadResourceUsage: report.uvthreadResourceUsage | |
| }) | |
| const memUsage = proc.memoryUsage() | |
| stats.memoryUsage = {} | |
| for (let [k, v] of Object.entries(memUsage)) | |
| stats.memoryUsage[k] = formatBytes(v) | |
| return stats | |
| } | |
| express() | |
| .enable('trust proxy') | |
| .set('etag', false) | |
| .set('json spaces', 2) | |
| .use(express.json({ limit: limitSize })) | |
| .use(express.urlencoded({ extended: true, limit: limitSize })) | |
| .use(morgan('dev')) | |
| .use( | |
| tmpDir, | |
| express.static(tmpDir), | |
| serveIndex(tmpDir, { hidden: true, icons: true }) | |
| ) | |
| .all('/', (_, res) => { | |
| res.set('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate') | |
| res.set('Pragma', 'no-cache') | |
| res.set('Expires', '0') | |
| res.json(getServerStats()) | |
| }) | |
| .post('/eval', async (req, res) => { | |
| let code = req.body.code, o | |
| code = `(async function MengEval() { ${code} })()` | |
| try { o = await eval(code) } | |
| catch (e) { o = e } | |
| finally { res.send(node.util.format(o)) } | |
| }) | |
| .listen(PORT, () => logger('Running at port', PORT)) |