Skip to content

fix: sitemap aggregate timeout + CDN caching - #2090

Merged
Flotapponnier merged 3 commits into
devfrom
fix/sitemap-aggregate-timeout
Aug 26, 2026
Merged

fix: sitemap aggregate timeout + CDN caching#2090
Flotapponnier merged 3 commits into
devfrom
fix/sitemap-aggregate-timeout

Conversation

@Flotapponnier

Copy link
Copy Markdown
Collaborator

Summary

  • /api/aggregate route had cache: \"no-store\" on its internal fetch, which caused Next.js to treat the route as dynamic and strip s-maxage from the response header — so Vercel CDN always returned x-vercel-cache: MISS, fetching 7.6 MB from the Paris VPS on every request
  • FETCH_TIMEOUT_MS in aggregate-blob.ts was 20 s, but the Paris VPS takes 37–49 s uncompressed (18 s compressed). The aggregate blob fetch always timed out → loadAggregateFromBlob() always returned null → sitemap fell back to 192-URL static fallback → Google Search Console dropped from 650 to 18 indexed pages around Aug 8
  • Sitemap internal timeout was 45 s, not enough when the aggregate cold-fetch can take 50+ s

Changes

  • api/aggregate/route.ts: remove cache: \"no-store\" (lets Next.js keep s-maxage=60 in the response → Vercel CDN can cache it), add export const revalidate = 60 for ISR-style caching, raise UPSTREAM_TIMEOUT_MS 25 s → 70 s
  • aggregate-blob.ts: raise FETCH_TIMEOUT_MS 20 s → 65 s (above measured VPS response time)
  • sitemap-builder.ts: raise sitemap build timeout 45 s → 120 s

Expected result

After one cold-cache request (first hit after deployment, ~18 s compressed), /api/aggregate is ISR-cached for 60 s. All subsequent sitemap builds within that window use cached data and complete in < 10 s, returning 750+ URLs instead of 192.

Test plan

  • Deploy to staging, check curl -sI https://<preview>/api/aggregate | grep cache — should show s-maxage=60
  • Check x-vercel-cache: HIT on second request to /api/aggregate
  • Check curl -s https://<preview>/sitemap.xml | grep -o '<url>' | wc -l returns 750+

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown
@Flotapponnier
Flotapponnier merged commit 07719f0 into dev Aug 26, 2026
1 check failed
Flotapponnier added a commit that referenced this pull request Aug 26, 2026
* feat: shareable wallet URLs + HL fee/funding breakdown

- /fee-compare/[venueA]/[venueB]/[wallet] dynamic route auto-submits on load
- pushState updates URL after analyze so any comparison is shareable
- FeeCompareClient accepts initialVenueA/B/Wallet/Days props
- HL wallet side: replace 2-cell grid with inline fee/funding/net breakdown

* fix: remove 'No activity found' text from crossSim projection side

* fix: sitemap aggregate timeout + CDN caching (s-maxage stripped by dynamic route)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant