import type { Metadata } from "next"; import Link from "next/link"; import { RelativeTime } from "@/components/ui/freshness"; import { Page, PageHeader } from "@/components/ui/section"; import { RightsBadge, StatusBadge } from "@/components/ui/status-badge"; import { api } from "@/lib/api"; import { formatDuration } from "@/lib/format"; import type { ConnectorPublic } from "@/lib/types"; export const metadata: Metadata = { title: "Connectors", description: "Operational status of every Market Atlas connector: type, rights, message rate, latency, coverage and reliability.", alternates: { canonical: "/connectors" } }; export const dynamic = "force-dynamic"; export default async function ConnectorsPage() { const rows = await api("/v1/connectors"); const healthy = rows.filter((r) => r.status === "HEALTHY").length; return ( r.source_type)).size} transport types.`} actions={Data health →} />
{rows.map((r) => ( ))}
Connector Status Type Rights Real time Msg / min Total p50 / p95 latency Parse Instruments Score Last message Next poll
{r.name}
{r.id} · v{r.version} ·{" "} {r.source_id}
{r.description}
{r.source_type} {r.realtime_status.replace(/_/g, " ").toLowerCase()} {r.messages_1m} {r.messages_total.toLocaleString("en-US")} {r.median_latency_ms == null ? "—" : formatDuration(r.median_latency_ms)} / {r.p95_latency_ms == null ? "—" : formatDuration(r.p95_latency_ms)} {r.parse_success_rate == null ? "—" : `${Math.round(r.parse_success_rate * 100)}%`} {r.instruments_covered} {r.reliability_score ?? "—"} {r.last_message_at ? : "—"} {r.next_poll_at ? : r.supports_streaming ? "streaming" : "—"}
); }