From d6511d3921960bb4fef6c79b1ddbecd9f61a4eab Mon Sep 17 00:00:00 2001 From: Andrew Sharpe Date: Thu, 6 Aug 2026 14:35:36 +1000 Subject: [PATCH 1/6] update the age header when responding from cache --- packages/miniflare/src/workers/cache/cache.worker.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/miniflare/src/workers/cache/cache.worker.ts b/packages/miniflare/src/workers/cache/cache.worker.ts index 431d3ece295..b2868413137 100644 --- a/packages/miniflare/src/workers/cache/cache.worker.ts +++ b/packages/miniflare/src/workers/cache/cache.worker.ts @@ -302,6 +302,8 @@ export class CacheObject extends MiniflareDurableObject { // time we don't do this is when the entry isn't found, or expired, in which // case, we just threw a `CacheMiss`) assert(resHeaders !== undefined); + const now = this.timers.now(); + resHeaders.set("Age", Math.round(now - (cached.metadata.stored || now))); resHeaders.set("CF-Cache-Status", "HIT"); resRanges ??= []; @@ -356,6 +358,7 @@ export class CacheObject extends MiniflareDurableObject { headers: Object.entries(headers), status: res.status, size, + stored: this.timers.now(), })); await this.storage.put({ From 27891cd6dfe3babe3e5020b7fac62b2e2f899f3c Mon Sep 17 00:00:00 2001 From: asharpe Date: Thu, 6 Aug 2026 14:54:07 +1000 Subject: [PATCH 2/6] Age in seconds, not milliseconds Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- packages/miniflare/src/workers/cache/cache.worker.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/miniflare/src/workers/cache/cache.worker.ts b/packages/miniflare/src/workers/cache/cache.worker.ts index b2868413137..858f1cad204 100644 --- a/packages/miniflare/src/workers/cache/cache.worker.ts +++ b/packages/miniflare/src/workers/cache/cache.worker.ts @@ -303,7 +303,10 @@ export class CacheObject extends MiniflareDurableObject { // case, we just threw a `CacheMiss`) assert(resHeaders !== undefined); const now = this.timers.now(); - resHeaders.set("Age", Math.round(now - (cached.metadata.stored || now))); + resHeaders.set( + "Age", + String(Math.round((now - (cached.metadata.stored || now)) / 1000)) + ); resHeaders.set("CF-Cache-Status", "HIT"); resRanges ??= []; From 02e1337201d0072389efe265260daf3c76e6cf41 Mon Sep 17 00:00:00 2001 From: Andrew Sharpe Date: Thu, 6 Aug 2026 15:17:26 +1000 Subject: [PATCH 3/6] update type --- packages/miniflare/src/workers/cache/cache.worker.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/miniflare/src/workers/cache/cache.worker.ts b/packages/miniflare/src/workers/cache/cache.worker.ts index 858f1cad204..fc2dd21a681 100644 --- a/packages/miniflare/src/workers/cache/cache.worker.ts +++ b/packages/miniflare/src/workers/cache/cache.worker.ts @@ -30,6 +30,7 @@ interface CacheMetadata { headers: string[][]; status: number; size: number; + stored?: number; } type CacheRouteHandler = RouteHandler< From d71f861a2cf28c64309999e3ef32610b4af3b840 Mon Sep 17 00:00:00 2001 From: Andrew Sharpe Date: Thu, 6 Aug 2026 15:32:10 +1000 Subject: [PATCH 4/6] increment the age by the duration of time in cache --- packages/miniflare/src/workers/cache/cache.worker.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/miniflare/src/workers/cache/cache.worker.ts b/packages/miniflare/src/workers/cache/cache.worker.ts index fc2dd21a681..9a85712a33f 100644 --- a/packages/miniflare/src/workers/cache/cache.worker.ts +++ b/packages/miniflare/src/workers/cache/cache.worker.ts @@ -304,10 +304,9 @@ export class CacheObject extends MiniflareDurableObject { // case, we just threw a `CacheMiss`) assert(resHeaders !== undefined); const now = this.timers.now(); - resHeaders.set( - "Age", - String(Math.round((now - (cached.metadata.stored || now)) / 1000)) - ); + const age = parseInt(resHeaders.get("age") || "0", 10); + const cachedDuration = Math.round((now - (cached.metadata.stored || now)) / 1000) + resHeaders.set("Age", age + cachedDuration); resHeaders.set("CF-Cache-Status", "HIT"); resRanges ??= []; From ed0990205201f486ad9f7b07b8635109776b7a50 Mon Sep 17 00:00:00 2001 From: Andrew Sharpe Date: Thu, 6 Aug 2026 15:42:25 +1000 Subject: [PATCH 5/6] add changeset --- .changeset/increment-cache-response-age.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/increment-cache-response-age.md diff --git a/.changeset/increment-cache-response-age.md b/.changeset/increment-cache-response-age.md new file mode 100644 index 00000000000..3a9372cf44d --- /dev/null +++ b/.changeset/increment-cache-response-age.md @@ -0,0 +1,6 @@ +--- +"miniflare": patch +--- + +Increment the Age response header when responding from cache. + From 869414f1f97fdff9d7206fc309e7f13b71a8d1ba Mon Sep 17 00:00:00 2001 From: asharpe Date: Thu, 6 Aug 2026 15:59:06 +1000 Subject: [PATCH 6/6] auto-format Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- packages/miniflare/src/workers/cache/cache.worker.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/miniflare/src/workers/cache/cache.worker.ts b/packages/miniflare/src/workers/cache/cache.worker.ts index 9a85712a33f..a4bdf9126ad 100644 --- a/packages/miniflare/src/workers/cache/cache.worker.ts +++ b/packages/miniflare/src/workers/cache/cache.worker.ts @@ -305,8 +305,10 @@ export class CacheObject extends MiniflareDurableObject { assert(resHeaders !== undefined); const now = this.timers.now(); const age = parseInt(resHeaders.get("age") || "0", 10); - const cachedDuration = Math.round((now - (cached.metadata.stored || now)) / 1000) - resHeaders.set("Age", age + cachedDuration); + const cachedDuration = Math.round( + (now - (cached.metadata.stored || now)) / 1000 + ); + resHeaders.set("Age", String(age + cachedDuration)); resHeaders.set("CF-Cache-Status", "HIT"); resRanges ??= [];