import { createServer } from "node:http"; import { toNodeHandler } from "better-auth/node"; import { auth, pool } from "./auth.js"; const port = parseInt(process.env.PORT ?? "3001", 10); const handler = toNodeHandler(auth); const server = createServer(async (req, res) => { // Health check if ((req.url === "/health" || req.url === "/auth/health") && req.method === "GET") { try { const client = await pool.connect(); try { await Promise.race([ client.query("SELECT 1"), new Promise((_, reject) => setTimeout(() => reject(new Error("DB timeout")), 2000)), ]); } finally { client.release(); } res.writeHead(200, { "Content-Type": "application/json" }); res.end(JSON.stringify({ status: "ok", db: "reachable" })); } catch (err) { // Log the actual error so /health 503s are diagnosable from pod logs // (CAR-1276: UAT auth was crashlooping with no log output beyond the // initial "listening on port 3001" line because this catch was empty). console.error( "[auth /health] DB probe failed:", err instanceof Error ? `${err.name}: ${err.message}` : err, ); const detail = err instanceof Error ? err.message : "unknown error"; res.writeHead(503, { "Content-Type": "application/json" }); res.end( JSON.stringify({ status: "error", db: "unreachable", error: detail }), ); } return; } // All other routes handled by Better-Auth (returns 404 for unknown paths) await handler(req, res); }); server.listen(port, "0.0.0.0", () => { console.log(`CartSnitch auth service listening on port ${port}`); });