Repository: anuraghazra/github-readme-stats
Pull request #3242 (2023-09-17 13:17:22)

feature: extend default card cache time to 6 hours
Related to https://github.com/anuraghazra/github-readme-stats/issues/1471#issuecomment-1714503380

vercel[bot]: [vc]: #QWMOYpejYH4HLcyFuktBoNB9fLwe3VKyhkr52YkF6GM=:eyJpc01vbm9yZXBvIjp0cnVlLCJ0eXBlIjoiZ2l0aHViIiwicHJvamVjdHMiOlt7Im5hbWUiOiJnaXRodWItcmVhZG1lLXN0YXRzIiwiaW5zcGVjdG9yVXJsIjoiaHR0cHM6Ly92ZXJjZWwuY29tL2dpdGh1Yi1yZWFkbWUtc3RhdHMtdGVhbS9naXRodWItcmVhZG1lLXN0YXRzL0JRWlQxMVh5UHh1bkY0eWhXM0dZenVTcllBcmUiLCJwcmV2aWV3VXJsIjoiZ2l0aHViLXJlYWRtZS1zdGF0cy1naXQtZmVhdHVyZS1jMWU3MDUtZ2l0aHViLXJlYWRtZS1zdGF0cy10ZWFtLnZlcmNlbC5hcHAiLCJuZXh0Q29tbWl0U3RhdHVzIjoiREVQTE9ZRUQifV19
**The latest updates on your projects**. Learn more about [Vercel for Git ↗︎](https://vercel.link/github-learn-more)

| Name | Status | Preview | Updated (UTC) |
| :--- | :----- | :------ | :------ |
| **github-readme-stats** | ✅ Ready ([Inspect](https://vercel.com/github-readme-stats-team/github-readme-stats/BQZT11XyPxunF4yhW3GYzuSrYAre)) | [Visit Preview](https://github-readme-stats-git-feature-c1e705-github-readme-stats-team.vercel.app) | Sep 17, 2023 1:17pm |


codecov[bot]: ## [Codecov](https://app.codecov.io/gh/anuraghazra/github-readme-stats/pull/3242?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra) Report
Patch coverage: **`81.81%`** and no project coverage change.
> Comparison is base [(`64f56e8`)](https://app.codecov.io/gh/anuraghazra/github-readme-stats/commit/64f56e88b406ff8c7b7fd267f356e64963b9c2fc?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra) 98.36% compared to head [(`afba0e4`)](https://app.codecov.io/gh/anuraghazra/github-readme-stats/pull/3242?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra) 98.36%.

<details><summary>Additional details and impacted files</summary>


```diff
@@           Coverage Diff           @@
##           master    #3242   +/-   ##
=======================================
  Coverage   98.36%   98.36%           
=======================================
  Files          27       27           
  Lines        5885     5886    +1     
  Branches      526      526           
=======================================
+ Hits         5789     5790    +1     
  Misses         93       93           
  Partials        3        3           
```


| [Files Changed](https://app.codecov.io/gh/anuraghazra/github-readme-stats/pull/3242?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra) | Coverage Δ | |
|---|---|---|
| [api/gist.js](https://app.codecov.io/gh/anuraghazra/github-readme-stats/pull/3242?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra#diff-YXBpL2dpc3QuanM=) | `97.59% <66.66%> (ø)` | |
| [api/pin.js](https://app.codecov.io/gh/anuraghazra/github-readme-stats/pull/3242?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra#diff-YXBpL3Bpbi5qcw==) | `97.75% <66.66%> (ø)` | |
| [api/index.js](https://app.codecov.io/gh/anuraghazra/github-readme-stats/pull/3242?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra#diff-YXBpL2luZGV4Lmpz) | `100.00% <100.00%> (ø)` | |
| [api/top-langs.js](https://app.codecov.io/gh/anuraghazra/github-readme-stats/pull/3242?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra#diff-YXBpL3RvcC1sYW5ncy5qcw==) | `100.00% <100.00%> (ø)` | |
| [src/common/utils.js](https://app.codecov.io/gh/anuraghazra/github-readme-stats/pull/3242?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra#diff-c3JjL2NvbW1vbi91dGlscy5qcw==) | `98.93% <100.00%> (+<0.01%)` | :arrow_up: |


</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/anuraghazra/github-readme-stats/pull/3242?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Anurag+Hazra).

rickstaa: @qwerty541 It Looks like pat 7 and 8 were suspended (see https://github-readme-stats.vercel.app/api/status/pat-info). I sent @anuraghazra two new pats to solve this 👍🏻. I think when those are added we will be good for a while.
anuraghazra: 8hs seems a bit excessive let's try 6h first. Otherwise we will again have issues like "Cards are not updating"
qwerty541: > @qwerty541 It Looks like pat 7 and 8 were suspended (see https://github-readme-stats.vercel.app/api/status/pat-info). I sent @anuraghazra two new pats to solve this 👍🏻. When those are added, we will be good for a while.

@rickstaa Nice, but anyway i think it will be better to reduce load from public instance for future. Sooner or later other PATs will be suspended too.

Patch:
diff --git a/.eslintrc.json b/.eslintrc.json
index 7b2160f..d8c31c7 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -156,7 +156,7 @@
         // "no-class-assign": "error",
         // "no-const-assign": "error",
         // "no-dupe-class-members": "error",
-        // "no-this-before-super": "error",
+        "no-this-before-super": "error",
         // "no-var": "warn",
         "object-shorthand": [ "warn" ],
         // "prefer-arrow-callback": "warn",
@@ -203,7 +203,7 @@
         // "no-ternary": "off",
         // "no-trailing-spaces": "warn",
         // "no-underscore-dangle": "warn",
-        // "no-unneeded-ternary": "warn",
+        "no-unneeded-ternary": "warn",
         // "object-curly-spacing": [ "warn", "always" ],
         // "one-var": "off",
         // "operator-assignment": [ "warn", "never" ],
diff --git a/api/gist.js b/api/gist.js
index 3e7dca0..1dbc5ae 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 c513f7c..25e4151 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 d505746..21ecf96 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 5596751..d9bf6b0 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 65f026e..b2582ca 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 f0f5fce..f42f79e 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 <https://github.com/anuraghazra/github-readme-stats/issues/1471#issuecomment-1271551425>). 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 <https://github.com/anuraghazra/github-readme-stats/issues/1471#issuecomment-1271551425>). 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 f1f74b6..2be7267 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 = {


Test patch:
diff --git a/tests/api.test.js b/tests/api.test.js
index 1353f1f..8d2a1a0 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 7327b91..8654e3d 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}`,
     );
   });