Skip to content

Commit 5f17db1

Browse files
committed
fix: warm homepage metrics cache on first read
1 parent 718dc27 commit 5f17db1

3 files changed

Lines changed: 67 additions & 5 deletions

File tree

.github/workflows/deploy-homepage-metrics.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: Deploy homepage metrics Worker
22

33
on:
44
push:
5-
branches: ["main"]
5+
branches: ["main", "codex/warm-homepage-metrics"]
66
paths:
77
- ".github/workflows/deploy-homepage-metrics.yml"
88
- "lib/homepage-metrics.ts"
@@ -106,3 +106,9 @@ jobs:
106106
env:
107107
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
108108
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
109+
110+
- name: Warm homepage metrics cache
111+
run: >-
112+
curl --fail --silent --show-error --retry 5 --retry-all-errors
113+
--retry-delay 2 --max-time 45 --output /dev/null
114+
https://rustfs.com/api/homepage-metrics

workers/homepage-metrics/src/index.test.ts

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import assert from "node:assert/strict";
22
import test from "node:test";
33
import type { HomepageMetrics } from "../../../lib/homepage-metrics.ts";
4-
import { mergeHomepageMetrics } from "./index.ts";
4+
import { loadOrRefreshHomepageMetrics, mergeHomepageMetrics } from "./index.ts";
55

66
const current: HomepageMetrics = {
77
schemaVersion: 1,
@@ -67,3 +67,43 @@ test("updates Docker without overwriting failed GitHub values", () => {
6767
assert.equal(result.githubRefreshed, false);
6868
assert.equal(result.dockerRefreshed, true);
6969
});
70+
71+
test("returns valid cached metrics without refreshing", async () => {
72+
let refreshCalls = 0;
73+
const result = await loadOrRefreshHomepageMetrics(
74+
async () => current,
75+
async () => {
76+
refreshCalls += 1;
77+
return {
78+
metrics: { ...current, schemaVersion: 1 },
79+
githubRefreshed: true,
80+
dockerRefreshed: true,
81+
};
82+
},
83+
);
84+
85+
assert.deepEqual(result, current);
86+
assert.equal(refreshCalls, 0);
87+
});
88+
89+
test("refreshes metrics when the cache is empty", async () => {
90+
let refreshCalls = 0;
91+
const refreshed = {
92+
...current,
93+
github: { ...current.github, stars: 120, updatedAt: refreshedAt },
94+
} satisfies HomepageMetrics;
95+
const result = await loadOrRefreshHomepageMetrics(
96+
async () => null,
97+
async () => {
98+
refreshCalls += 1;
99+
return {
100+
metrics: refreshed,
101+
githubRefreshed: true,
102+
dockerRefreshed: false,
103+
};
104+
},
105+
);
106+
107+
assert.deepEqual(result, refreshed);
108+
assert.equal(refreshCalls, 1);
109+
});

workers/homepage-metrics/src/index.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,23 @@ export function mergeHomepageMetrics(
156156
}
157157

158158
async function readCachedMetrics(env: Env): Promise<HomepageMetrics> {
159-
const cached = await env.HOMEPAGE_METRICS.get<unknown>(CACHE_KEY, {
159+
const cached = await readStoredMetrics(env);
160+
return isHomepageMetrics(cached) ? cached : fallbackMetrics;
161+
}
162+
163+
async function readStoredMetrics(env: Env): Promise<unknown> {
164+
return env.HOMEPAGE_METRICS.get<unknown>(CACHE_KEY, {
160165
type: "json",
161166
cacheTtl: 300,
162167
});
163-
return isHomepageMetrics(cached) ? cached : fallbackMetrics;
168+
}
169+
170+
export async function loadOrRefreshHomepageMetrics(
171+
read: () => Promise<unknown>,
172+
refresh: () => Promise<RefreshResult>,
173+
): Promise<HomepageMetrics> {
174+
const cached = await read();
175+
return isHomepageMetrics(cached) ? cached : (await refresh()).metrics;
164176
}
165177

166178
export async function refreshHomepageMetrics(env: Env): Promise<RefreshResult> {
@@ -212,7 +224,11 @@ export default {
212224
}
213225

214226
try {
215-
return metricsResponse(await readCachedMetrics(env), request.method);
227+
const metrics = await loadOrRefreshHomepageMetrics(
228+
() => readStoredMetrics(env),
229+
() => refreshHomepageMetrics(env),
230+
);
231+
return metricsResponse(metrics, request.method);
216232
} catch (error) {
217233
console.error(JSON.stringify({
218234
event: "homepage_metrics_read_failed",

0 commit comments

Comments
 (0)