import "dotenv/config"; import express from "express"; import cors from "cors"; import { providers } from "./providers/index.js"; const app = express(); const PORT = 3000; const POLL_INTERVAL = 2 * 60 * 1000; // 2 minutes const PROVIDER_TIMEOUT = 10 * 1000; // 10 seconds app.use(cors()); let cachedStatuses = []; function safeCheck(provider) { return Promise.race([ provider.checkStatus(), new Promise((_, reject) => setTimeout(() => reject(new Error("Timeout")), PROVIDER_TIMEOUT) ), ]).catch((err) => ({ name: provider.name, status: "unknown", message: `Check failed: ${err.message}`, lastUpdated: new Date().toISOString(), })).then((result) => ({ url: provider.url ?? null, ...result, })); } async function pollAll() { const results = await Promise.allSettled(providers.map(safeCheck)); cachedStatuses = results.map((r) => r.status === "fulfilled" ? r.value : { name: "Unknown", status: "unknown", message: "Provider check failed.", lastUpdated: new Date().toISOString(), } ); console.log( `[${new Date().toISOString()}] Polled ${cachedStatuses.length} providers` ); } app.get("/api/status", (_req, res) => { res.json(cachedStatuses); }); app.get("/api/health", (_req, res) => { res.json({ ok: true, providers: providers.length }); }); // Poll immediately, then on interval await pollAll(); setInterval(pollAll, POLL_INTERVAL); app.listen(PORT, () => { console.log(`Backend listening on http://localhost:${PORT}`); });