diff --git a/.changeset/few-wombats-design.md b/.changeset/few-wombats-design.md new file mode 100644 index 000000000..fc5d13365 --- /dev/null +++ b/.changeset/few-wombats-design.md @@ -0,0 +1,5 @@ +--- +"@opennextjs/aws": patch +--- + +add(dev-overrides): In memory tagCache with nextMode \ No newline at end of file diff --git a/examples/app-router/open-next.config.local.ts b/examples/app-router/open-next.config.local.ts index b651dde59..63d80481e 100644 --- a/examples/app-router/open-next.config.local.ts +++ b/examples/app-router/open-next.config.local.ts @@ -7,7 +7,7 @@ export default { converter: "node", incrementalCache: "fs-dev", queue: "direct", - tagCache: "dummy", + tagCache: "fs-dev-nextMode", }, }, diff --git a/packages/open-next/src/overrides/tagCache/fs-dev-nextMode.ts b/packages/open-next/src/overrides/tagCache/fs-dev-nextMode.ts new file mode 100644 index 000000000..20dc7bd42 --- /dev/null +++ b/packages/open-next/src/overrides/tagCache/fs-dev-nextMode.ts @@ -0,0 +1,55 @@ +import type { NextModeTagCache } from "types/overrides"; +import { debug } from "../../adapters/logger"; + +const tagsMap = new Map(); + +export default { + name: "fs-dev-nextMode", + mode: "nextMode", + getLastRevalidated: async (tags: string[]) => { + if (globalThis.openNextConfig.dangerous?.disableTagCache) { + return 0; + } + + let lastRevalidated = 0; + + tags.forEach((tag) => { + const tagTime = tagsMap.get(tag); + if (tagTime && tagTime > lastRevalidated) { + lastRevalidated = tagTime; + } + }); + + debug("getLastRevalidated result:", lastRevalidated); + return lastRevalidated; + }, + hasBeenRevalidated: async (tags: string[], lastModified?: number) => { + if (globalThis.openNextConfig.dangerous?.disableTagCache) { + return false; + } + + const hasRevalidatedTag = tags.some((tag) => { + const tagRevalidatedAt = tagsMap.get(tag); + return tagRevalidatedAt ? tagRevalidatedAt > (lastModified ?? 0) : false; + }); + + debug("hasBeenRevalidated result:", hasRevalidatedTag); + return hasRevalidatedTag; + }, + writeTags: async (tags: string[]) => { + if ( + globalThis.openNextConfig.dangerous?.disableTagCache || + tags.length === 0 + ) { + return; + } + + debug("writeTags", { tags: tags }); + + tags.forEach((tag) => { + tagsMap.set(tag, Date.now()); + }); + + debug("writeTags completed, written", tags.length, "tags"); + }, +} satisfies NextModeTagCache; diff --git a/packages/open-next/src/types/open-next.ts b/packages/open-next/src/types/open-next.ts index d619dfadf..53023d5ae 100644 --- a/packages/open-next/src/types/open-next.ts +++ b/packages/open-next/src/types/open-next.ts @@ -175,6 +175,7 @@ export type IncludedTagCache = | "dynamodb-lite" | "dynamodb-nextMode" | "fs-dev" + | "fs-dev-nextMode" | "dummy"; export type IncludedImageLoader =