brf/server/routes/api/process.ts

98 lines
2.3 KiB
TypeScript

import process from 'node:process'
import os from 'node:os'
import * as z from 'zod'
import type { FastifyPluginCallbackZod } from 'fastify-type-provider-zod'
import env from '../../env.ts'
const ProcessSchema = z.object({
env: z.string(),
version: z.string(),
uptime: z.number(),
memoryUsage: z.object({
rss: z.number(),
heapTotal: z.number(),
heapUsed: z.number(),
external: z.number(),
arrayBuffers: z.number(),
}),
resourceUsage: z.object({
userCPUTime: z.number(),
systemCPUTime: z.number(),
maxRSS: z.number(),
sharedMemorySize: z.number(),
unsharedDataSize: z.number(),
unsharedStackSize: z.number(),
minorPageFault: z.number(),
majorPageFault: z.number(),
swappedOut: z.number(),
fsRead: z.number(),
fsWrite: z.number(),
ipcSent: z.number(),
ipcReceived: z.number(),
signalsCount: z.number(),
voluntaryContextSwitches: z.number(),
involuntaryContextSwitches: z.number(),
}),
})
const OSSchema = z.object({
freemem: z.number(),
totalmem: z.number(),
arch: z.string(),
homedir: z.string(),
hostname: z.string(),
loadavg: z.array(z.number()),
machine: z.string(),
platform: z.string(),
release: z.string(),
type: z.string(),
uptime: z.number(),
version: z.string(),
})
const processPlugin: FastifyPluginCallbackZod = (fastify, _options, done) => {
fastify.addHook('onRequest', fastify.auth)
fastify.route({
method: 'GET',
url: '/',
schema: {
response: {
200: z.object({
process: ProcessSchema,
os: OSSchema,
}),
},
},
handler() {
return {
process: {
env: env.NODE_ENV,
version: process.version,
uptime: process.uptime(),
memoryUsage: process.memoryUsage(),
resourceUsage: process.resourceUsage(),
},
os: {
freemem: os.freemem(),
totalmem: os.totalmem(),
arch: os.arch(),
homedir: os.homedir(),
hostname: os.hostname(),
loadavg: os.loadavg(),
machine: os.machine(),
platform: os.platform(),
release: os.release(),
type: os.type(),
uptime: os.uptime(),
version: os.version(),
},
}
},
})
done()
}
export default processPlugin