43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
import { createServer, type Server } from 'node:http';
|
|
|
|
import { log } from './logger';
|
|
|
|
export interface HealthState {
|
|
modelBossReachable: boolean;
|
|
lastJobAt: Date | null;
|
|
lastCompletedAt: Date | null;
|
|
}
|
|
|
|
export function startHealthServer(port: number, getState: () => HealthState): Server {
|
|
const server = createServer((req, res) => {
|
|
if (req.url === '/health/live') {
|
|
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
res.end(JSON.stringify({ status: 'live' }));
|
|
return;
|
|
}
|
|
|
|
if (req.url === '/health' || req.url === '/health/ready') {
|
|
const state = getState();
|
|
const status = state.modelBossReachable ? 200 : 503;
|
|
res.writeHead(status, { 'Content-Type': 'application/json' });
|
|
res.end(
|
|
JSON.stringify({
|
|
status: state.modelBossReachable ? 'ok' : 'degraded',
|
|
modelBossReachable: state.modelBossReachable,
|
|
lastJobAt: state.lastJobAt?.toISOString() ?? null,
|
|
lastCompletedAt: state.lastCompletedAt?.toISOString() ?? null,
|
|
}),
|
|
);
|
|
return;
|
|
}
|
|
|
|
res.writeHead(404);
|
|
res.end();
|
|
});
|
|
|
|
server.listen(port, () => {
|
|
log.info('Health server listening', { port });
|
|
});
|
|
|
|
return server;
|
|
}
|