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