pup / index.js
aripbae's picture
Create index.js
15dceae 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')
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'))
.all('/stats', (_, 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))