summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authoradamelmore <[email protected]>2026-01-26 09:33:38 -0600
committeradamelmore <[email protected]>2026-01-26 09:33:43 -0600
commitfcea7e18a5b34e914da1b18d72e6a807e01dfd87 (patch)
treecfd9fe6ff47d6acf3cf687ae2fb9a25f012bfadb
parent7c34319b1952cd972f47cfd09542e057c5744852 (diff)
downloadopencode-fcea7e18a5b34e914da1b18d72e6a807e01dfd87.tar.gz
opencode-fcea7e18a5b34e914da1b18d72e6a807e01dfd87.zip
chore: stale-while-revalidate headers for changelog
-rw-r--r--packages/console/app/src/routes/changelog.json.ts50
1 files changed, 36 insertions, 14 deletions
diff --git a/packages/console/app/src/routes/changelog.json.ts b/packages/console/app/src/routes/changelog.json.ts
index a23f20503..a9667ac6d 100644
--- a/packages/console/app/src/routes/changelog.json.ts
+++ b/packages/console/app/src/routes/changelog.json.ts
@@ -20,6 +20,9 @@ type HighlightGroup = {
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[] {
const groups = new Map<string, HighlightItem[]>()
const regex = /<highlight\s+source="([^"]+)">([\s\S]*?)<\/highlight>/g
@@ -90,25 +93,44 @@ export async function GET() {
Accept: "application/vnd.github.v3+json",
"User-Agent": "OpenCode-Console",
},
- })
+ cf: {
+ // best-effort edge caching (ignored outside Cloudflare)
+ cacheTtl: 60 * 5,
+ cacheEverything: true,
+ },
+ } as any)
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[]
- return {
- releases: releases.map((release) => {
- const parsed = parseMarkdown(release.body || "")
- return {
- tag: release.tag_name,
- name: release.name,
- date: release.published_at,
- url: release.html_url,
- highlights: parsed.highlights,
- sections: parsed.sections,
- }
+ return new Response(
+ JSON.stringify({
+ releases: releases.map((release) => {
+ const parsed = parseMarkdown(release.body || "")
+ return {
+ tag: release.tag_name,
+ name: release.name,
+ date: release.published_at,
+ url: release.html_url,
+ highlights: parsed.highlights,
+ sections: parsed.sections,
+ }
+ }),
}),
- }
+ {
+ headers: {
+ "Content-Type": "application/json",
+ "Cache-Control": ok,
+ },
+ },
+ )
}