import type { CloudRegionSummary } from "@dci/core"; import type { Metadata } from "next"; import Link from "next/link"; import { Breadcrumbs } from "@/components/entity/breadcrumbs"; import { SectionNav } from "@/components/entity/section-nav"; import { SourcesFooter } from "@/components/entity/sources-footer"; import { Bars } from "@/components/intelligence/client-charts"; import { ApiNote, CoverageBar, HonestEmpty, PillLink } from "@/components/intelligence/shared"; import { Page, PageHeader, Section } from "@/components/ui/card"; import { CountryFlag } from "@/components/ui/country-flag"; import { Metric, MetricCell, MetricRow } from "@/components/ui/metric"; import { ErrorState, OfflineNotice } from "@/components/ui/states"; import { RowLink, TBody, THead, Table, Td, Th, Tr } from "@/components/ui/table"; import { api } from "@/lib/api"; import { fmtInt, placeLine } from "@/lib/format"; import { routes } from "@/lib/routes"; import { pageMetadata } from "@/lib/seo"; export const revalidate = 120; export const metadata: Metadata = pageMetadata({ title: "Connectivity", description: "Internet exchanges, cloud regions by provider, carrier hotels and connectivity density by market — from published IXP↔facility links and provider region lists. Submarine cable landing stations are listed only once a licensed source exists.", path: routes.connectivity(), }); const IXP_LIMIT = 50; export default async function ConnectivityPage() { const r = await api.connectivity(); if (!r.ok) { return ( ); } const d = r.data; const ixps = [...d.ixps].sort((a, b) => b.facilityCount - a.facilityCount).slice(0, IXP_LIMIT); // cloud regions grouped by provider const byProvider = new Map(); for (const cr of d.cloudRegions) { const g = byProvider.get(cr.provider.id) ?? { provider: cr.provider, regions: [] }; g.regions.push(cr); byProvider.set(cr.provider.id, g); } const providers = Array.from(byProvider.values()).sort((a, b) => b.regions.length - a.regions.length); const statusSplit = (regions: CloudRegionSummary[]) => { const c: Record = {}; for (const x of regions) c[x.status] = (c[x.status] ?? 0) + 1; return Object.entries(c) .sort((a, b) => b[1] - a[1]) .map(([k, v]) => `${v} ${k}`) .join(" · "); }; const metrosCovered = d.byMetro.filter((m) => m.ixps > 0 || m.cloudRegions > 0 || m.facilitiesWithCarriers > 0).length; const sections = [ { id: "ixps", label: "Internet exchanges", count: ixps.length }, { id: "cloud", label: "Cloud regions", count: providers.length }, { id: "carrier-hotels", label: "Carrier hotels", count: d.carrierHotels.length }, { id: "metros", label: "By market", count: d.byMetro.length }, { id: "landing", label: "Landing stations" }, ]; return ( Connectivity layer on the map →} />
All exchanges →}> {ixps.length === 0 ? ( ) : ( {ixps.map((x) => ( ))}
Exchange Country Market Networks Facilities Operators
{x.name} {x.nameLong && x.nameLong !== x.name &&
{x.nameLong}
}
{x.metro ? ( {x.metro.name} ) : ( (x.city ?? "—") )} {x.networkCount === null ? — : fmtInt(x.networkCount)} {fmtInt(x.facilityCount)} {fmtInt(x.operatorCount)}
)}
All cloud regions →}> {providers.length === 0 ? ( ) : ( ({ label: p.provider.name, value: p.regions.length, href: `${routes.cloudRegions()}?provider=${encodeURIComponent(p.provider.slug)}`, secondary: statusSplit(p.regions), display: `${fmtInt(p.regions.length)} ${p.regions.length === 1 ? "region" : "regions"}`, }))} /> )}
{d.carrierHotels.length === 0 ? ( ) : ( {d.carrierHotels.map((f) => ( ))}
Facility Operator Location Carriers IXPs
{f.name}
{f.operator?.name ?? "Operator unknown"}
{f.operator ? ( {f.operator.name} ) : ( — )} {placeLine(f)} {f.carriersCount === null || f.carriersCount === undefined ? — : fmtInt(f.carriersCount)} {f.ixpCount === null || f.ixpCount === undefined ? — : fmtInt(f.ixpCount)}
)}
{d.byMetro.length === 0 ? ( ) : ( {d.byMetro.map((m) => ( ))}
Market IXPs Cloud regions Facilities with carriers Facilities
{m.name} {fmtInt(m.ixps)} {fmtInt(m.cloudRegions)} {fmtInt(m.facilitiesWithCarriers)}/{fmtInt(m.facilities)} {fmtInt(m.facilities)}
)}
{d.landingStations.length === 0 ? ( ) : (
    {d.landingStations.map((l) => (
  • {l.name} {l.sourceName}
  • ))}
)}
); }