From c05d2622f0161371278c0469e6232e28dec8c1ac Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 9 Sep 2026 17:40:28 +0000 Subject: [PATCH] fix(datasets): apply validator to cached text before serving it Co-Authored-By: Abhinav Pola --- src/datasets/cached-file.test.ts | 16 ++++++++++++++++ src/datasets/cached-file.ts | 5 ++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/datasets/cached-file.test.ts b/src/datasets/cached-file.test.ts index 74d2e2a..dfc35b8 100644 --- a/src/datasets/cached-file.test.ts +++ b/src/datasets/cached-file.test.ts @@ -110,6 +110,22 @@ describe("fetchCachedTextFile", () => { expect(requestCount).toBe(1); }); + it("refetches and overwrites a cached entry the validator rejects", async () => { + stubFetch([new Response('{"users":{}}', { status: 200 })]); + const { store, entries } = makeMemoryStore(); + entries.set(CACHE_KEY, { text: "rate limited" }); + + await expect( + run({ + ...REQUEST, + cacheStore: store, + validate: jsonTextValidator("object"), + }) + ).resolves.toBe('{"users":{}}'); + expect(requestCount).toBe(1); + expect(entries.get(CACHE_KEY)).toEqual({ text: '{"users":{}}' }); + }); + it("retries a rate-limited origin and caches the successful body", async () => { stubFetch([ new Response("slow down", { status: 429 }), diff --git a/src/datasets/cached-file.ts b/src/datasets/cached-file.ts index 2fc62c1..cbc6f51 100644 --- a/src/datasets/cached-file.ts +++ b/src/datasets/cached-file.ts @@ -138,7 +138,10 @@ export function fetchCachedTextFile( CachedTextSchema, yield* promise(() => store.readJson(key)) ); - if (Either.isRight(cached)) { + if ( + Either.isRight(cached) && + request.validate?.(cached.right.text) === undefined + ) { return cached.right.text; } }