From 961d06eb6c18fc489e9db537c952ab09d52a8958 Mon Sep 17 00:00:00 2001 From: Alexandr Garbuzov Date: Tue, 19 Sep 2023 12:54:27 +0300 Subject: [PATCH] feature: extend default card cache time to 6 hours (#3242) * feature: extend default card cache time to 8 hours * reduce to six hours --- api/gist.js | 6 +++--- api/index.js | 2 +- api/pin.js | 4 ++-- api/top-langs.js | 2 +- api/wakatime.js | 2 +- readme.md | 4 ++-- src/common/utils.js | 35 ++++++++++++++++++++++------------- tests/api.test.js | 19 +++++++++++-------- tests/gist.test.js | 4 ++-- 9 files changed, 45 insertions(+), 33 deletions(-) diff --git a/api/gist.js b/api/gist.js index 3e7dca040ff02..1dbc5aeeddd53 100644 --- a/api/gist.js +++ b/api/gist.js @@ -34,8 +34,8 @@ export default async (req, res) => { const gistData = await fetchGist(id); let cacheSeconds = clampValue( - parseInt(cache_seconds || CONSTANTS.FOUR_HOURS, 10), - CONSTANTS.FOUR_HOURS, + parseInt(cache_seconds || CONSTANTS.SIX_HOURS, 10), + CONSTANTS.SIX_HOURS, CONSTANTS.ONE_DAY, ); cacheSeconds = process.env.CACHE_SECONDS @@ -52,7 +52,7 @@ export default async (req, res) => { const isBothOver1K = stars > 1000 && forks > 1000; const isBothUnder1 = stars < 1 && forks < 1; if (!cache_seconds && (isBothOver1K || isBothUnder1)) { - cacheSeconds = CONSTANTS.FOUR_HOURS; + cacheSeconds = CONSTANTS.SIX_HOURS; } res.setHeader( diff --git a/api/index.js b/api/index.js index c513f7cea89a9..25e4151fab1c0 100644 --- a/api/index.js +++ b/api/index.js @@ -58,7 +58,7 @@ export default async (req, res) => { let cacheSeconds = clampValue( parseInt(cache_seconds || CONSTANTS.CARD_CACHE_SECONDS, 10), - CONSTANTS.FOUR_HOURS, + CONSTANTS.SIX_HOURS, CONSTANTS.ONE_DAY, ); cacheSeconds = process.env.CACHE_SECONDS diff --git a/api/pin.js b/api/pin.js index d505746a4a084..21ecf966b3ff4 100644 --- a/api/pin.js +++ b/api/pin.js @@ -41,7 +41,7 @@ export default async (req, res) => { let cacheSeconds = clampValue( parseInt(cache_seconds || CONSTANTS.CARD_CACHE_SECONDS, 10), - CONSTANTS.FOUR_HOURS, + CONSTANTS.SIX_HOURS, CONSTANTS.ONE_DAY, ); cacheSeconds = process.env.CACHE_SECONDS @@ -58,7 +58,7 @@ export default async (req, res) => { const isBothOver1K = stars > 1000 && forks > 1000; const isBothUnder1 = stars < 1 && forks < 1; if (!cache_seconds && (isBothOver1K || isBothUnder1)) { - cacheSeconds = CONSTANTS.FOUR_HOURS; + cacheSeconds = CONSTANTS.SIX_HOURS; } res.setHeader( diff --git a/api/top-langs.js b/api/top-langs.js index 55967519aa644..d9bf6b09da01a 100644 --- a/api/top-langs.js +++ b/api/top-langs.js @@ -64,7 +64,7 @@ export default async (req, res) => { let cacheSeconds = clampValue( parseInt(cache_seconds || CONSTANTS.CARD_CACHE_SECONDS, 10), - CONSTANTS.FOUR_HOURS, + CONSTANTS.SIX_HOURS, CONSTANTS.ONE_DAY, ); cacheSeconds = process.env.CACHE_SECONDS diff --git a/api/wakatime.js b/api/wakatime.js index 65f026e374728..b2582caa5bd31 100644 --- a/api/wakatime.js +++ b/api/wakatime.js @@ -43,7 +43,7 @@ export default async (req, res) => { let cacheSeconds = clampValue( parseInt(cache_seconds || CONSTANTS.CARD_CACHE_SECONDS, 10), - CONSTANTS.FOUR_HOURS, + CONSTANTS.SIX_HOURS, CONSTANTS.ONE_DAY, ); cacheSeconds = process.env.CACHE_SECONDS diff --git a/readme.md b/readme.md index f0f5fce3edf3e..f42f79e84d0b2 100644 --- a/readme.md +++ b/readme.md @@ -293,12 +293,12 @@ You can customize the appearance of all your cards however you wish with URL par * `bg_color` - Card's background color *(hex color)* **or** a gradient in the form of *angle,start,end*. Default: `fffefe` * `hide_border` - Hides the card's border *(boolean)*. Default: `false` * `theme` - Name of the theme, choose from [all available themes](./themes/README.md). Default: `default` theme. -* `cache_seconds` - Sets the cache header manually *(min: 14400, max: 86400)*. Default: `14400 seconds (4 hours)`. +* `cache_seconds` - Sets the cache header manually *(min: 21600, max: 86400)*. Default: `21600 seconds (6 hours)`. * `locale` - Sets the language in the card *(e.g. cn, de, es, etc.)*. Default: `en`. * `border_radius` - Corner rounding on the card. Default: `4.5`. > [!WARNING]\ -> We use caching to decrease the load on our servers (see ). Our cards have a default cache of 4 hours (14400 seconds). Also, note that the cache is clamped to a minimum of 4 hours and a maximum of 24 hours. +> We use caching to decrease the load on our servers (see ). Our cards have a default cache of 6 hours (21600 seconds). Also, note that the cache is clamped to a minimum of 6 hours and a maximum of 24 hours. If you want the data on your statistics card to be updated more often you can [deploy your own instance](#deploy-on-your-own) and set [environment variable](#disable-rate-limit-protections) `CACHE_SECONDS` to a value of your choosing. ##### Gradient in bg\_color diff --git a/src/common/utils.js b/src/common/utils.js index f1f74b69464af..2be72678b22d2 100644 --- a/src/common/utils.js +++ b/src/common/utils.js @@ -373,21 +373,30 @@ const noop = () => {}; const logger = process.env.NODE_ENV !== "test" ? console : { log: noop, error: noop }; -// Cache settings. -const CARD_CACHE_SECONDS = 14400; -const ERROR_CACHE_SECONDS = 600; +const ONE_MINUTE = 60; +const FIVE_MINUTES = 300; +const TEN_MINUTES = 600; +const FIFTEEN_MINUTES = 900; +const THIRTY_MINUTES = 1800; +const TWO_HOURS = 7200; +const FOUR_HOURS = 14400; +const SIX_HOURS = 21600; +const EIGHT_HOURS = 28800; +const ONE_DAY = 86400; const CONSTANTS = { - ONE_MINUTE: 60, - FIVE_MINUTES: 300, - TEN_MINUTES: 600, - FIFTEEN_MINUTES: 900, - THIRTY_MINUTES: 1800, - TWO_HOURS: 7200, - FOUR_HOURS: 14400, - ONE_DAY: 86400, - CARD_CACHE_SECONDS, - ERROR_CACHE_SECONDS, + ONE_MINUTE, + FIVE_MINUTES, + TEN_MINUTES, + FIFTEEN_MINUTES, + THIRTY_MINUTES, + TWO_HOURS, + FOUR_HOURS, + SIX_HOURS, + EIGHT_HOURS, + ONE_DAY, + CARD_CACHE_SECONDS: SIX_HOURS, + ERROR_CACHE_SECONDS: TEN_MINUTES, }; const SECONDARY_ERROR_MESSAGES = { diff --git a/tests/api.test.js b/tests/api.test.js index 1353f1ffdcce9..8d2a1a0b76863 100644 --- a/tests/api.test.js +++ b/tests/api.test.js @@ -162,22 +162,25 @@ describe("Test /api/", () => { ["Content-Type", "image/svg+xml"], [ "Cache-Control", - `max-age=${CONSTANTS.FOUR_HOURS / 2}, s-maxage=${ - CONSTANTS.FOUR_HOURS + `max-age=${CONSTANTS.SIX_HOURS / 2}, s-maxage=${ + CONSTANTS.SIX_HOURS }, stale-while-revalidate=${CONSTANTS.ONE_DAY}`, ], ]); }); it("should set proper cache", async () => { - const { req, res } = faker({ cache_seconds: 15000 }, data_stats); + const cache_seconds = 35000; + const { req, res } = faker({ cache_seconds }, data_stats); await api(req, res); expect(res.setHeader.mock.calls).toEqual([ ["Content-Type", "image/svg+xml"], [ "Cache-Control", - `max-age=7500, s-maxage=${15000}, stale-while-revalidate=${ + `max-age=${ + cache_seconds / 2 + }, s-maxage=${cache_seconds}, stale-while-revalidate=${ CONSTANTS.ONE_DAY }`, ], @@ -224,8 +227,8 @@ describe("Test /api/", () => { ["Content-Type", "image/svg+xml"], [ "Cache-Control", - `max-age=${CONSTANTS.FOUR_HOURS / 2}, s-maxage=${ - CONSTANTS.FOUR_HOURS + `max-age=${CONSTANTS.SIX_HOURS / 2}, s-maxage=${ + CONSTANTS.SIX_HOURS }, stale-while-revalidate=${CONSTANTS.ONE_DAY}`, ], ]); @@ -239,8 +242,8 @@ describe("Test /api/", () => { ["Content-Type", "image/svg+xml"], [ "Cache-Control", - `max-age=${CONSTANTS.FOUR_HOURS / 2}, s-maxage=${ - CONSTANTS.FOUR_HOURS + `max-age=${CONSTANTS.SIX_HOURS / 2}, s-maxage=${ + CONSTANTS.SIX_HOURS }, stale-while-revalidate=${CONSTANTS.ONE_DAY}`, ], ]); diff --git a/tests/gist.test.js b/tests/gist.test.js index 7327b91ea21de..8654e3da37d0f 100644 --- a/tests/gist.test.js +++ b/tests/gist.test.js @@ -188,8 +188,8 @@ describe("Test /api/gist", () => { expect(res.setHeader).toBeCalledWith("Content-Type", "image/svg+xml"); expect(res.setHeader).toBeCalledWith( "Cache-Control", - `max-age=${CONSTANTS.FOUR_HOURS / 2}, s-maxage=${ - CONSTANTS.FOUR_HOURS + `max-age=${CONSTANTS.SIX_HOURS / 2}, s-maxage=${ + CONSTANTS.SIX_HOURS }, stale-while-revalidate=${CONSTANTS.ONE_DAY}`, ); });