import process from 'node:process' import os from 'node:os' import env from '../../env.ts' import { Type, type FastifyPluginCallbackTypebox } from '@fastify/type-provider-typebox' const ProcessSchema = Type.Object({ env: Type.String(), version: Type.String(), uptime: Type.Number(), memoryUsage: Type.Object({ rss: Type.Number(), heapTotal: Type.Number(), heapUsed: Type.Number(), external: Type.Number(), arrayBuffers: Type.Number(), }), resourceUsage: Type.Object({ userCPUTime: Type.Number(), systemCPUTime: Type.Number(), maxRSS: Type.Number(), sharedMemorySize: Type.Number(), unsharedDataSize: Type.Number(), unsharedStackSize: Type.Number(), minorPageFault: Type.Number(), majorPageFault: Type.Number(), swappedOut: Type.Number(), fsRead: Type.Number(), fsWrite: Type.Number(), ipcSent: Type.Number(), ipcReceived: Type.Number(), signalsCount: Type.Number(), voluntaryContextSwitches: Type.Number(), involuntaryContextSwitches: Type.Number(), }), }) const OSSchema = Type.Object({ freemem: Type.Number(), totalmem: Type.Number(), arch: Type.String(), homedir: Type.String(), hostname: Type.String(), loadavg: Type.Array(Type.Number()), machine: Type.String(), platform: Type.String(), release: Type.String(), type: Type.String(), uptime: Type.Number(), version: Type.String(), }) const processPlugin: FastifyPluginCallbackTypebox = (fastify, _options, done) => { fastify.addHook('onRequest', fastify.auth) fastify.route({ method: 'GET', url: '/', schema: { response: { 200: Type.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