export const name = "Amazon AWS"; export const url = "https://health.aws.amazon.com/health/status"; // Core services in both Pittsburgh-adjacent regions + global services. // Expand this list if you discover specific services your vendors rely on. const FEEDS = [ { url: "https://status.aws.amazon.com/rss/ec2-us-east-1.rss", label: "EC2 (N. Virginia)" }, { url: "https://status.aws.amazon.com/rss/ec2-us-east-2.rss", label: "EC2 (Ohio)" }, { url: "https://status.aws.amazon.com/rss/s3-us-east-1.rss", label: "S3 (N. Virginia)" }, { url: "https://status.aws.amazon.com/rss/cloudfront.rss", label: "CloudFront" }, { url: "https://status.aws.amazon.com/rss/route53.rss", label: "Route 53" }, ]; const SEVERITY_ORDER = ["operational", "degraded", "outage"]; function worstStatus(a, b) { return SEVERITY_ORDER.indexOf(a) >= SEVERITY_ORDER.indexOf(b) ? a : b; } // Extract the text of the first inside the first <item>. // Returns null if there are no items (clean feed = all clear). function parseFirstItemTitle(xml) { const itemMatch = xml.match(/<item[\s>][\s\S]*?<\/item>/i); if (!itemMatch) return null; const titleMatch = itemMatch[0].match(/<title>([\s\S]*?)<\/title>/i); return titleMatch ? titleMatch[1].trim() : null; } function titleToStatus(title) { if (!title) return "operational"; // no items = clean feed const t = title.toLowerCase(); if (t.includes("operating normally") || t.includes("informational")) return "operational"; if (t.includes("performance issues") || t.includes("degraded")) return "degraded"; if (t.includes("service disruption") || t.includes("disruption")) return "outage"; return "degraded"; // unknown incident title — assume degraded } async function checkFeed({ url, label }) { const res = await fetch(url); if (!res.ok) throw new Error(`${label}: HTTP ${res.status}`); const xml = await res.text(); const title = parseFirstItemTitle(xml); const status = titleToStatus(title); return { label, status, title }; } export async function checkStatus() { const results = await Promise.allSettled(FEEDS.map(checkFeed)); let overall = "operational"; const issues = []; for (const result of results) { if (result.status === "rejected") { overall = worstStatus(overall, "degraded"); issues.push(`Check failed: ${result.reason?.message ?? "unknown error"}`); continue; } const { label, status, title } = result.value; overall = worstStatus(overall, status); if (status !== "operational") { issues.push(`${label}: ${title ?? "unknown issue"}`); } } const message = issues.length > 0 ? issues.join(" | ") : "All monitored services operating normally."; return { name, status: overall, message, lastUpdated: new Date().toISOString(), }; }