|
1 | | -import { getQuery } from 'h3' |
| 1 | +import { getQuery, setHeader } from 'h3' |
2 | 2 | import * as v from 'valibot' |
| 3 | +import { hash } from 'ohash' |
3 | 4 | import type { VersionDistributionResponse } from '#shared/types' |
4 | 5 | import { CACHE_MAX_AGE_ONE_HOUR } from '#shared/utils/constants' |
5 | 6 | import { groupVersionDownloads } from '#server/utils/version-downloads' |
@@ -96,6 +97,14 @@ export default defineCachedEventHandler( |
96 | 97 | timestamp: new Date().toISOString(), |
97 | 98 | } |
98 | 99 |
|
| 100 | + // Set cache headers for both client and CDN/edge caching |
| 101 | + // s-maxage controls shared cache (Vercel edge) behavior |
| 102 | + setHeader( |
| 103 | + event, |
| 104 | + 'Cache-Control', |
| 105 | + `public, max-age=${CACHE_MAX_AGE_ONE_HOUR}, s-maxage=${CACHE_MAX_AGE_ONE_HOUR}`, |
| 106 | + ) |
| 107 | + |
99 | 108 | if (filterOldVersionsBool) { |
100 | 109 | try { |
101 | 110 | const oneYearAgo = new Date() |
@@ -134,10 +143,9 @@ export default defineCachedEventHandler( |
134 | 143 | getKey: event => { |
135 | 144 | const slug = getRouterParam(event, 'slug') ?? '' |
136 | 145 | const query = getQuery(event) |
137 | | - const mode = query.mode || 'major' |
138 | | - const filterThreshold = query.filterThreshold || 1 |
139 | | - const filterOldVersions = query.filterOldVersions === 'true' |
140 | | - return `version-downloads:v3:${slug}:${mode}:${filterThreshold}:${filterOldVersions ? 'filtered' : 'all'}` |
| 146 | + // Use ohash to create deterministic cache key from query params |
| 147 | + // This ensures different param combinations = different cache entries |
| 148 | + return `version-downloads:v4:${slug}:${hash(query)}` |
141 | 149 | }, |
142 | 150 | }, |
143 | 151 | ) |
0 commit comments