From 7148ae76e9b10c7653e2564a4e76c365b4c82911 Mon Sep 17 00:00:00 2001 From: Victor Berchet Date: Thu, 25 Sep 2025 10:55:59 +0200 Subject: [PATCH] refactor: only try to purge the cache when invalidation is configured --- .changeset/cute-papayas-win.md | 5 +++++ .../overrides/incremental-cache/regional-cache.ts | 14 +++----------- packages/cloudflare/src/api/overrides/internal.ts | 7 +++++++ .../overrides/tag-cache/d1-next-tag-cache.spec.ts | 1 + .../api/overrides/tag-cache/d1-next-tag-cache.ts | 6 ++++-- .../overrides/tag-cache/do-sharded-tag-cache.ts | 6 ++++-- .../overrides/tag-cache/kv-next-tag-cache.spec.ts | 1 + .../api/overrides/tag-cache/kv-next-tag-cache.ts | 6 ++++-- 8 files changed, 29 insertions(+), 17 deletions(-) create mode 100644 .changeset/cute-papayas-win.md diff --git a/.changeset/cute-papayas-win.md b/.changeset/cute-papayas-win.md new file mode 100644 index 00000000..198dba4f --- /dev/null +++ b/.changeset/cute-papayas-win.md @@ -0,0 +1,5 @@ +--- +"@opennextjs/cloudflare": patch +--- + +refactor: only try to purge the cache when invalidation is configured diff --git a/packages/cloudflare/src/api/overrides/incremental-cache/regional-cache.ts b/packages/cloudflare/src/api/overrides/incremental-cache/regional-cache.ts index 060c9c42..aaab6282 100644 --- a/packages/cloudflare/src/api/overrides/incremental-cache/regional-cache.ts +++ b/packages/cloudflare/src/api/overrides/incremental-cache/regional-cache.ts @@ -7,7 +7,7 @@ import { } from "@opennextjs/aws/types/overrides.js"; import { getCloudflareContext } from "../../cloudflare-context.js"; -import { debugCache, FALLBACK_BUILD_ID, IncrementalCacheEntry } from "../internal.js"; +import { debugCache, FALLBACK_BUILD_ID, IncrementalCacheEntry, isPurgeCacheEnabled } from "../internal.js"; import { NAME as KV_CACHE_NAME } from "./kv-incremental-cache.js"; const ONE_MINUTE_IN_SECONDS = 60; @@ -82,8 +82,7 @@ class RegionalCache implements IncrementalCache { throw new Error("The KV incremental cache does not need a regional cache."); } this.name = this.store.name; - this.opts.shouldLazilyUpdateOnCacheHit ??= - this.opts.mode === "long-lived" && !this.#hasAutomaticCachePurging; + this.opts.shouldLazilyUpdateOnCacheHit ??= this.opts.mode === "long-lived" && !isPurgeCacheEnabled(); } get #bypassTagCacheOnCacheHit(): boolean { @@ -93,14 +92,7 @@ class RegionalCache implements IncrementalCache { } // Otherwise we default to whether the automatic cache purging is enabled or not - return this.#hasAutomaticCachePurging; - } - - get #hasAutomaticCachePurging() { - // The `?` is required at `openNextConfig?` or the Open Next build fails because of a type error - const cdnInvalidation = globalThis.openNextConfig?.default?.override?.cdnInvalidation; - - return cdnInvalidation !== undefined && cdnInvalidation !== "dummy"; + return isPurgeCacheEnabled(); } async get( diff --git a/packages/cloudflare/src/api/overrides/internal.ts b/packages/cloudflare/src/api/overrides/internal.ts index 5513f806..cc7c115d 100644 --- a/packages/cloudflare/src/api/overrides/internal.ts +++ b/packages/cloudflare/src/api/overrides/internal.ts @@ -32,6 +32,13 @@ export function computeCacheKey(key: string, options: KeyOptions) { return `${prefix}/${buildId}/${hash}.${cacheType}`.replace(/\/+/g, "/"); } +export function isPurgeCacheEnabled(): boolean { + // The `?` is required at `openNextConfig?` or the Open Next build fails because of a type error + const cdnInvalidation = globalThis.openNextConfig?.default?.override?.cdnInvalidation; + + return cdnInvalidation !== undefined && cdnInvalidation !== "dummy"; +} + export async function purgeCacheByTags(tags: string[]) { const { env } = getCloudflareContext(); // We have a durable object for purging cache diff --git a/packages/cloudflare/src/api/overrides/tag-cache/d1-next-tag-cache.spec.ts b/packages/cloudflare/src/api/overrides/tag-cache/d1-next-tag-cache.spec.ts index 7d73619a..dd1204e5 100644 --- a/packages/cloudflare/src/api/overrides/tag-cache/d1-next-tag-cache.spec.ts +++ b/packages/cloudflare/src/api/overrides/tag-cache/d1-next-tag-cache.spec.ts @@ -21,6 +21,7 @@ vi.mock("../internal.js", () => ({ debugCache: vi.fn(), FALLBACK_BUILD_ID: "fallback-build-id", purgeCacheByTags: vi.fn(), + isPurgeCacheEnabled: () => true, })); describe("D1NextModeTagCache", () => { diff --git a/packages/cloudflare/src/api/overrides/tag-cache/d1-next-tag-cache.ts b/packages/cloudflare/src/api/overrides/tag-cache/d1-next-tag-cache.ts index b554de78..40cb1e05 100644 --- a/packages/cloudflare/src/api/overrides/tag-cache/d1-next-tag-cache.ts +++ b/packages/cloudflare/src/api/overrides/tag-cache/d1-next-tag-cache.ts @@ -2,7 +2,7 @@ import { error } from "@opennextjs/aws/adapters/logger.js"; import type { NextModeTagCache } from "@opennextjs/aws/types/overrides.js"; import { getCloudflareContext } from "../../cloudflare-context.js"; -import { debugCache, FALLBACK_BUILD_ID, purgeCacheByTags } from "../internal.js"; +import { debugCache, FALLBACK_BUILD_ID, isPurgeCacheEnabled, purgeCacheByTags } from "../internal.js"; export const NAME = "d1-next-mode-tag-cache"; @@ -67,7 +67,9 @@ export class D1NextModeTagCache implements NextModeTagCache { ); // TODO: See https://github.com/opennextjs/opennextjs-aws/issues/986 - await purgeCacheByTags(tags); + if (isPurgeCacheEnabled()) { + await purgeCacheByTags(tags); + } } private getConfig() { diff --git a/packages/cloudflare/src/api/overrides/tag-cache/do-sharded-tag-cache.ts b/packages/cloudflare/src/api/overrides/tag-cache/do-sharded-tag-cache.ts index 30f9c9fb..80590f7b 100644 --- a/packages/cloudflare/src/api/overrides/tag-cache/do-sharded-tag-cache.ts +++ b/packages/cloudflare/src/api/overrides/tag-cache/do-sharded-tag-cache.ts @@ -6,7 +6,7 @@ import { IgnorableError } from "@opennextjs/aws/utils/error.js"; import { getCloudflareContext } from "../../cloudflare-context.js"; import type { OpenNextConfig } from "../../config.js"; import { DOShardedTagCache } from "../../durable-objects/sharded-tag-cache.js"; -import { debugCache, purgeCacheByTags } from "../internal.js"; +import { debugCache, isPurgeCacheEnabled, purgeCacheByTags } from "../internal.js"; export const DEFAULT_WRITE_RETRIES = 3; export const DEFAULT_NUM_SHARDS = 4; @@ -229,7 +229,9 @@ class ShardedDOTagCache implements NextModeTagCache { ); // TODO: See https://github.com/opennextjs/opennextjs-aws/issues/986 - await purgeCacheByTags(tags); + if (isPurgeCacheEnabled()) { + await purgeCacheByTags(tags); + } } /** diff --git a/packages/cloudflare/src/api/overrides/tag-cache/kv-next-tag-cache.spec.ts b/packages/cloudflare/src/api/overrides/tag-cache/kv-next-tag-cache.spec.ts index 0c7ae180..e076ce56 100644 --- a/packages/cloudflare/src/api/overrides/tag-cache/kv-next-tag-cache.spec.ts +++ b/packages/cloudflare/src/api/overrides/tag-cache/kv-next-tag-cache.spec.ts @@ -18,6 +18,7 @@ vi.mock("../internal.js", () => ({ debugCache: vi.fn(), FALLBACK_BUILD_ID: "fallback-build-id", purgeCacheByTags: vi.fn(), + isPurgeCacheEnabled: () => true, })); describe("KVNextModeTagCache", () => { diff --git a/packages/cloudflare/src/api/overrides/tag-cache/kv-next-tag-cache.ts b/packages/cloudflare/src/api/overrides/tag-cache/kv-next-tag-cache.ts index 5628e949..5dcf95ef 100644 --- a/packages/cloudflare/src/api/overrides/tag-cache/kv-next-tag-cache.ts +++ b/packages/cloudflare/src/api/overrides/tag-cache/kv-next-tag-cache.ts @@ -2,7 +2,7 @@ import { error } from "@opennextjs/aws/adapters/logger.js"; import type { NextModeTagCache } from "@opennextjs/aws/types/overrides.js"; import { getCloudflareContext } from "../../cloudflare-context.js"; -import { FALLBACK_BUILD_ID, purgeCacheByTags } from "../internal.js"; +import { FALLBACK_BUILD_ID, isPurgeCacheEnabled, purgeCacheByTags } from "../internal.js"; export const NAME = "kv-next-mode-tag-cache"; @@ -65,7 +65,9 @@ export class KVNextModeTagCache implements NextModeTagCache { ); // TODO: See https://github.com/opennextjs/opennextjs-aws/issues/986 - await purgeCacheByTags(tags); + if (isPurgeCacheEnabled()) { + await purgeCacheByTags(tags); + } } /**