_
File size: 2,619 Bytes
d4cdfcf
 
b0fa8c4
468fe66
d4cdfcf
468fe66
 
d4cdfcf
468fe66
 
 
 
 
d4cdfcf
 
468fe66
7b62422
 
d4cdfcf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7b62422
468fe66
 
d4cdfcf
468fe66
 
b0fa8c4
468fe66
 
 
 
b0fa8c4
468fe66
d4cdfcf
 
 
 
 
 
468fe66
 
 
 
 
 
 
d4cdfcf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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))