feat: add daemon server skeleton with health check endpoint

This commit is contained in:
2026-08-12 20:45:25 +08:00
parent 3810661098
commit 19d67cfda9
3 changed files with 59 additions and 0 deletions
@@ -0,0 +1,23 @@
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
import http from 'node:http';
import { startServer } from '../server.js';
describe('daemon health endpoint', () => {
let server: http.Server;
const port = 19528;
beforeAll(async () => {
server = await startServer(port);
});
afterAll(async () => {
await new Promise<void>((resolve) => server.close(() => resolve()));
});
it('GET /health returns 200 with status ok', async () => {
const response = await fetch(`http://127.0.0.1:${port}/health`);
expect(response.status).toBe(200);
const json = await response.json();
expect(json).toEqual({ status: 'ok' });
});
});
+11
View File
@@ -0,0 +1,11 @@
import type { IncomingMessage, ServerResponse } from 'node:http';
export function healthRoute(req: IncomingMessage, res: ServerResponse): boolean {
const url = new URL(req.url || '/', 'http://localhost');
if (req.method === 'GET' && url.pathname === '/health') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ status: 'ok' }));
return true;
}
return false;
}
+25
View File
@@ -0,0 +1,25 @@
import http from 'node:http';
import { healthRoute } from './routes/health.js';
const routes = [healthRoute];
export function startServer(port: number): Promise<http.Server> {
return new Promise((resolve) => {
const server = http.createServer((req, res) => {
for (const route of routes) {
if (route(req, res)) return;
}
res.writeHead(404, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ ok: false, error: { code: 'INTERNAL', message: 'not found' } }));
});
server.listen(port, '127.0.0.1', () => {
console.log(`[daemon] VisionL daemon started on http://127.0.0.1:${port}`);
resolve(server);
});
});
}
// Direct start when running as script
const port = parseInt(process.env.VISIONL_PORT || '9527', 10);
startServer(port);