import Fastify from "fastify"; import cors from "@fastify/cors"; import helmet from "@fastify/helmet"; import sensible from "@fastify/sensible"; import { extractOrGenerateRequestId } from "@shieldai/types"; import { darkwatchRoutes, voiceprintRoutes, correlationRoutes } from "./routes"; const app = Fastify({ logger: { level: process.env.LOG_LEVEL || "info", }, }); async function bootstrap() { await app.register(cors, { origin: true }); await app.register(helmet); await app.register(sensible); app.addHook("onRequest", async (request, _reply) => { const requestId = extractOrGenerateRequestId(request.headers); request.id = requestId; const pinoLog = request.log as typeof request.log & { bindings?: Record; bindActive?: () => void }; pinoLog.bindings = { requestId }; pinoLog.bindActive?.(); request.headers["x-request-id"] = requestId; }); await app.register(darkwatchRoutes); await app.register(voiceprintRoutes); await app.register(correlationRoutes); app.get("/health", async () => ({ status: "ok", timestamp: new Date().toISOString() })); try { await app.listen({ port: parseInt(process.env.PORT || "3000", 10), host: "0.0.0.0" }); app.log.info(`Server listening on port ${process.env.PORT || 3000}`); } catch (err) { app.log.error(err); process.exit(1); } } bootstrap();