civet / main.civet
aripbae's picture
Update main.civet
7a0083a verified
{ cpus, loadavg, networkInterfaces, platform, release, tmpdir, type, uptime: osUptime, userInfo } := require 'node:os'
{ env, memoryUsage, report, uptime: procUptime, versions } := require 'node:process'
{ format } := require 'node:util'
bytes := require 'bytes'
express := require 'express'
morgan := require 'morgan'
{ default: prettyMs } := require 'pretty-ms'
serveIndex := require 'serve-index'
limitSize := '69mb'
PORT := env.SERVER_PORT or env.PORT or 7860
timeZone := env.TZ or 'Asia/Jakarta'
tmpDir := tmpdir()
formatBytes := (val: number) -> bytes val, unitSeparator: ' '
isNumber := (val: unknown): val is number -> typeof val is 'number'
snakeRgx := /_(\w)/g
snakeToCamel := (str: string) -> str.replace snakeRgx, (_, g) -> g.toUpperCase()
logger := (...args: any[]) ->
console.log new Date().toLocaleTimeString('fr', { timeZone }), ...args
prettifyMetrics := (obj: any, condition?: (k: string, v: any) -> boolean) ->
condition ?= (_, v) -> isNumber v
jsonStr := JSON.stringify obj, (key, val) ->
if condition key, val then formatBytes val else val
cleanJson := jsonStr.replace /_(\w)/g, (_, g) -> g.toUpperCase()
JSON.parse cleanJson
getServerStats := ->
stats := {}
stats.uptime = prettyMs procUptime() * 1e3
stats.osUptime = prettyMs osUptime() * 1e3
if rep := report?.getReport?()
Object.assign stats,
getReport: rep.header
javascriptHeap: prettifyMetrics rep.javascriptHeap, (k, v) ->
isNumber v and not /(ContextCount|Garbage)/i.test k
resourceUsage: prettifyMetrics rep.resourceUsage, (k, v) ->
isNumber v and not /(Percent|IO|reads|write)/i.test k
uvthreadResourceUsage: rep.uvthreadResourceUsage
stats.memoryUsage = prettifyMetrics memoryUsage()
stats
app := 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 '/tmp', express.static(tmpDir), serveIndex tmpDir, hidden: true, icons: true
app.all '/', (_, res) ->
res.set 'Cache-Control', 'no-store, no-cache, must-revalidate'
res.json getServerStats()
app.get '/sys/cpu', (_, res) ->
res.json
loadAvg: loadavg()
cpus: cpus().map ({ model, speed }) -> { model, speed }
app.get '/sys/net', (_, res) ->
res.json networkInterfaces()
app.get '/sys/node', (_, res) ->
res.json versions
app.get '/sys/os', (_, res) ->
res.json
platform: platform()
release: release()
type: type()
user: userInfo().username
app.listen PORT, ->
logger 'Server running on port', PORT