import type { LoaderFunction } from "@remix-run/node"; import db from "~/utils/db.server"; import logger from "~/utils/logger.server"; export const loader: LoaderFunction = async ({ request }) => { const host = request.headers.get("X-Forwarded-Host") ?? request.headers.get("host"); try { const queues = [...__registeredQueues!.entries()]; const url = new URL("/", `http://${host}`); // if our queues and cron jobs are healthy, // and can connect to the database and make a simple query, // and can make a HEAD request to ourselves, then we're good. await Promise.all([ ...queues.map(async ([queueName, { queue, worker, scheduler }]) => { if (await queue.isPaused()) { throw new Error(`Queue "${queueName}" is paused`); } if (!worker.isRunning()) { throw new Error(`Queue "${queueName}"'s worker is not running`); } if (!scheduler.isRunning()) { throw new Error(`Queue "${queueName}"'s scheduler is not running`); } }), db.user.count(), fetch(url.toString(), { method: "HEAD" }).then((r) => { if (!r.ok) return Promise.reject(r); }), ]); return new Response("OK"); } catch (error: unknown) { logger.error("healthcheck ❌", { error }); return new Response("ERROR", { status: 500 }); } };