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 { authMiddleware } from "./middleware/auth.middleware"; import { darkwatchRoutes } from "./routes/darkwatch.routes"; import { voiceprintRoutes } from "./routes/voiceprint.routes"; import { correlationRoutes } from "./routes/correlation.routes"; const app = Fastify({ logger: { level: process.env.LOG_LEVEL || "info", }, }); async function bootstrap() { await app.register(cors, { origin: process.env.CORS_ORIGIN || "http://localhost:5173" }); await app.register(helmet); await app.register(sensible); // Register auth middleware to populate request.user await app.register(authMiddleware); 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();