From b29dec7d30583131ee14ac8a2ab5b69a8c1f4243 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Valverd=C3=A9?= Date: Wed, 14 Jan 2026 22:36:40 +0100 Subject: [PATCH] Fix --- packages/effect-fc/src/Query.ts | 21 +++++++++++++-------- packages/effect-fc/src/QueryClient.ts | 2 +- packages/example/src/routes/query.tsx | 1 + 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/effect-fc/src/Query.ts b/packages/effect-fc/src/Query.ts index b7c8ae6..2bdfac7 100644 --- a/packages/effect-fc/src/Query.ts +++ b/packages/effect-fc/src/Query.ts @@ -1,4 +1,4 @@ -import { type Cause, type Context, DateTime, type Duration, Effect, Exit, Fiber, HashMap, identity, Option, Pipeable, Predicate, type Scope, Stream, Subscribable, SubscriptionRef } from "effect" +import { type Cause, Console, type Context, DateTime, type Duration, Effect, Exit, Fiber, HashMap, identity, Option, Pipeable, Predicate, type Scope, Stream, Subscribable, SubscriptionRef } from "effect" import * as QueryClient from "./QueryClient.js" import * as Result from "./Result.js" @@ -195,13 +195,18 @@ extends Pipeable.Class() implements Query { Scope.Scope | QueryClient.QueryClient | R > { return Effect.andThen(this.getCacheEntry(key), Option.match({ - onSome: entry => QueryClient.isQueryClientCacheEntryStale(entry, this.staleTime) - ? Effect.succeed(Subscribable.make({ - get: Effect.succeed(entry.result as Result.Result), - get changes() { return Stream.make(entry.result as Result.Result) }, - })) - : this.start(key, Result.willRefresh(entry.result) as Result.Final), - onNone: () => this.start(key, initial), + onSome: entry => Effect.andThen( + QueryClient.isQueryClientCacheEntryStale(entry, this.staleTime), + isStale => isStale + ? this.start(key, Result.willRefresh(entry.result) as Result.Final) + : Effect.succeed(Subscribable.make({ + get: Effect.succeed(entry.result as Result.Result), + get changes() { return Stream.make(entry.result as Result.Result) }, + })), + ), + onNone: () => this.start(key, initial).pipe( + Effect.tap(Console.log("Cache missed")) + ), })) } diff --git a/packages/effect-fc/src/QueryClient.ts b/packages/effect-fc/src/QueryClient.ts index 4e931cb..3cc95b8 100644 --- a/packages/effect-fc/src/QueryClient.ts +++ b/packages/effect-fc/src/QueryClient.ts @@ -111,5 +111,5 @@ export const isQueryClientCacheEntryStale = ( staleTime: Duration.DurationInput, ): Effect.Effect => Effect.andThen( DateTime.now, - now => Duration.lessThan(DateTime.distanceDuration(self.createdAt, now), staleTime), + now => Duration.greaterThanOrEqualTo(DateTime.distanceDuration(self.createdAt, now), staleTime), ) diff --git a/packages/example/src/routes/query.tsx b/packages/example/src/routes/query.tsx index c229aa6..b579bd2 100644 --- a/packages/example/src/routes/query.tsx +++ b/packages/example/src/routes/query.tsx @@ -28,6 +28,7 @@ const ResultView = Component.makeUntraced("Result")(function*() { Effect.andThen(response => response.json), Effect.andThen(Schema.decodeUnknown(Post)), ), + staleTime: "10 seconds", }) const mutation = yield* Mutation.make({