_ / index.js
aripbae's picture
Update index.js
d4cdfcf verified
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))