diff --git a/api/index.js b/api/index.js index 8fbe2bc2..b449d43b 100644 --- a/api/index.js +++ b/api/index.js @@ -61,7 +61,12 @@ export default async (req, res) => { CONSTANTS.ONE_DAY, ); - res.setHeader("Cache-Control", `public, max-age=${cacheSeconds}`); + res.setHeader( + "Cache-Control", + `max-age=${ + cacheSeconds / 2 + }, s-maxage=${cacheSeconds}, stale-while-revalidate=${CONSTANTS.ONE_DAY}`, + ); return res.send( renderStatsCard(stats, { diff --git a/api/pin.js b/api/pin.js index ef149948..4838b0f0 100644 --- a/api/pin.js +++ b/api/pin.js @@ -58,7 +58,12 @@ export default async (req, res) => { cacheSeconds = CONSTANTS.FOUR_HOURS; } - res.setHeader("Cache-Control", `public, max-age=${cacheSeconds}`); + res.setHeader( + "Cache-Control", + `max-age=${ + cacheSeconds / 2 + }, s-maxage=${cacheSeconds}, stale-while-revalidate=${CONSTANTS.ONE_DAY}`, + ); return res.send( renderRepoCard(repoData, { diff --git a/api/top-langs.js b/api/top-langs.js index 1b6b980d..d183d3b4 100644 --- a/api/top-langs.js +++ b/api/top-langs.js @@ -52,7 +52,12 @@ export default async (req, res) => { CONSTANTS.ONE_DAY, ); - res.setHeader("Cache-Control", `public, max-age=${cacheSeconds}`); + res.setHeader( + "Cache-Control", + `max-age=${ + cacheSeconds / 2 + }, s-maxage=${cacheSeconds}, stale-while-revalidate=${CONSTANTS.ONE_DAY}`, + ); return res.send( renderTopLanguages(topLangs, { diff --git a/api/wakatime.js b/api/wakatime.js index 7680b76e..d439c5b7 100644 --- a/api/wakatime.js +++ b/api/wakatime.js @@ -52,7 +52,12 @@ export default async (req, res) => { cacheSeconds = CONSTANTS.FOUR_HOURS; } - res.setHeader("Cache-Control", `public, max-age=${cacheSeconds}`); + res.setHeader( + "Cache-Control", + `max-age=${ + cacheSeconds / 2 + }, s-maxage=${cacheSeconds}, stale-while-revalidate=${CONSTANTS.ONE_DAY}`, + ); return res.send( renderWakatimeCard(stats, { diff --git a/tests/api.test.js b/tests/api.test.js index e1830858..0037bcdb 100644 --- a/tests/api.test.js +++ b/tests/api.test.js @@ -160,7 +160,12 @@ describe("Test /api/", () => { expect(res.setHeader.mock.calls).toEqual([ ["Content-Type", "image/svg+xml"], - ["Cache-Control", `public, max-age=${CONSTANTS.FOUR_HOURS}`], + [ + "Cache-Control", + `max-age=${CONSTANTS.FOUR_HOURS / 2}, s-maxage=${ + CONSTANTS.FOUR_HOURS + }, stale-while-revalidate=${CONSTANTS.ONE_DAY}`, + ], ]); }); @@ -170,7 +175,12 @@ describe("Test /api/", () => { expect(res.setHeader.mock.calls).toEqual([ ["Content-Type", "image/svg+xml"], - ["Cache-Control", `public, max-age=${15000}`], + [ + "Cache-Control", + `max-age=7500, s-maxage=${15000}, stale-while-revalidate=${ + CONSTANTS.ONE_DAY + }`, + ], ]); }); @@ -191,7 +201,12 @@ describe("Test /api/", () => { expect(res.setHeader.mock.calls).toEqual([ ["Content-Type", "image/svg+xml"], - ["Cache-Control", `public, max-age=${CONSTANTS.ONE_DAY}`], + [ + "Cache-Control", + `max-age=${CONSTANTS.ONE_DAY / 2}, s-maxage=${ + CONSTANTS.ONE_DAY + }, stale-while-revalidate=${CONSTANTS.ONE_DAY}`, + ], ]); } @@ -202,7 +217,12 @@ describe("Test /api/", () => { expect(res.setHeader.mock.calls).toEqual([ ["Content-Type", "image/svg+xml"], - ["Cache-Control", `public, max-age=${CONSTANTS.FOUR_HOURS}`], + [ + "Cache-Control", + `max-age=${CONSTANTS.FOUR_HOURS / 2}, s-maxage=${ + CONSTANTS.FOUR_HOURS + }, stale-while-revalidate=${CONSTANTS.ONE_DAY}`, + ], ]); } @@ -212,7 +232,12 @@ describe("Test /api/", () => { expect(res.setHeader.mock.calls).toEqual([ ["Content-Type", "image/svg+xml"], - ["Cache-Control", `public, max-age=${CONSTANTS.FOUR_HOURS}`], + [ + "Cache-Control", + `max-age=${CONSTANTS.FOUR_HOURS / 2}, s-maxage=${ + CONSTANTS.FOUR_HOURS + }, stale-while-revalidate=${CONSTANTS.ONE_DAY}`, + ], ]); } });