| { 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 |