chore: stale-while-revalidate headers for changelog

This commit is contained in:
adamelmore
2026-01-26 09:33:38 -06:00
parent 7c34319b19
commit fcea7e18a5

View File

@@ -20,6 +20,9 @@ type HighlightGroup = {
items: HighlightItem[] items: HighlightItem[]
} }
const ok = "public, max-age=1, s-maxage=300, stale-while-revalidate=86400, stale-if-error=86400"
const error = "public, max-age=1, s-maxage=60, stale-while-revalidate=600, stale-if-error=86400"
function parseHighlights(body: string): HighlightGroup[] { function parseHighlights(body: string): HighlightGroup[] {
const groups = new Map<string, HighlightItem[]>() const groups = new Map<string, HighlightItem[]>()
const regex = /<highlight\s+source="([^"]+)">([\s\S]*?)<\/highlight>/g const regex = /<highlight\s+source="([^"]+)">([\s\S]*?)<\/highlight>/g
@@ -90,25 +93,44 @@ export async function GET() {
Accept: "application/vnd.github.v3+json", Accept: "application/vnd.github.v3+json",
"User-Agent": "OpenCode-Console", "User-Agent": "OpenCode-Console",
}, },
}) cf: {
// best-effort edge caching (ignored outside Cloudflare)
cacheTtl: 60 * 5,
cacheEverything: true,
},
} as any)
if (!response.ok) { if (!response.ok) {
return { releases: [] } return new Response(JSON.stringify({ releases: [] }), {
status: 503,
headers: {
"Content-Type": "application/json",
"Cache-Control": error,
},
})
} }
const releases = (await response.json()) as Release[] const releases = (await response.json()) as Release[]
return { return new Response(
releases: releases.map((release) => { JSON.stringify({
const parsed = parseMarkdown(release.body || "") releases: releases.map((release) => {
return { const parsed = parseMarkdown(release.body || "")
tag: release.tag_name, return {
name: release.name, tag: release.tag_name,
date: release.published_at, name: release.name,
url: release.html_url, date: release.published_at,
highlights: parsed.highlights, url: release.html_url,
sections: parsed.sections, highlights: parsed.highlights,
} sections: parsed.sections,
}
}),
}), }),
} {
headers: {
"Content-Type": "application/json",
"Cache-Control": ok,
},
},
)
} }