From 63304699f1b8394caace64173457308de858b9ff Mon Sep 17 00:00:00 2001 From: BoD Date: Wed, 30 Oct 2024 18:18:38 +0100 Subject: [PATCH] Allow to specify a delegate resolver when using CacheControlCacheResolver --- .../api/normalized-cache-incubating.api | 6 ++++-- .../api/normalized-cache-incubating.klib.api | 4 ++-- .../cache/normalized/api/CacheResolver.kt | 13 +++++++++++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/normalized-cache-incubating/api/normalized-cache-incubating.api b/normalized-cache-incubating/api/normalized-cache-incubating.api index f8f7bd7e..b82bd953 100644 --- a/normalized-cache-incubating/api/normalized-cache-incubating.api +++ b/normalized-cache-incubating/api/normalized-cache-incubating.api @@ -146,8 +146,10 @@ public final class com/apollographql/cache/normalized/api/ApolloCacheHeaders { } public final class com/apollographql/cache/normalized/api/CacheControlCacheResolver : com/apollographql/cache/normalized/api/CacheResolver { - public fun ()V - public fun (Lcom/apollographql/cache/normalized/api/MaxAgeProvider;)V + public fun (Lcom/apollographql/cache/normalized/api/CacheResolver;)V + public synthetic fun (Lcom/apollographql/cache/normalized/api/CacheResolver;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lcom/apollographql/cache/normalized/api/MaxAgeProvider;Lcom/apollographql/cache/normalized/api/CacheResolver;)V + public synthetic fun (Lcom/apollographql/cache/normalized/api/MaxAgeProvider;Lcom/apollographql/cache/normalized/api/CacheResolver;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun resolveField (Lcom/apollographql/cache/normalized/api/ResolverContext;)Ljava/lang/Object; } diff --git a/normalized-cache-incubating/api/normalized-cache-incubating.klib.api b/normalized-cache-incubating/api/normalized-cache-incubating.klib.api index dbbe3b47..747f46b3 100644 --- a/normalized-cache-incubating/api/normalized-cache-incubating.klib.api +++ b/normalized-cache-incubating/api/normalized-cache-incubating.klib.api @@ -85,8 +85,8 @@ abstract interface com.apollographql.cache.normalized/ApolloStore { // com.apoll } } final class com.apollographql.cache.normalized.api/CacheControlCacheResolver : com.apollographql.cache.normalized.api/CacheResolver { // com.apollographql.cache.normalized.api/CacheControlCacheResolver|null[0] - constructor () // com.apollographql.cache.normalized.api/CacheControlCacheResolver.|(){}[0] - constructor (com.apollographql.cache.normalized.api/MaxAgeProvider) // com.apollographql.cache.normalized.api/CacheControlCacheResolver.|(com.apollographql.cache.normalized.api.MaxAgeProvider){}[0] + constructor (com.apollographql.cache.normalized.api/CacheResolver = ...) // com.apollographql.cache.normalized.api/CacheControlCacheResolver.|(com.apollographql.cache.normalized.api.CacheResolver){}[0] + constructor (com.apollographql.cache.normalized.api/MaxAgeProvider, com.apollographql.cache.normalized.api/CacheResolver = ...) // com.apollographql.cache.normalized.api/CacheControlCacheResolver.|(com.apollographql.cache.normalized.api.MaxAgeProvider;com.apollographql.cache.normalized.api.CacheResolver){}[0] final fun resolveField(com.apollographql.cache.normalized.api/ResolverContext): kotlin/Any? // com.apollographql.cache.normalized.api/CacheControlCacheResolver.resolveField|resolveField(com.apollographql.cache.normalized.api.ResolverContext){}[0] } final class com.apollographql.cache.normalized.api/CacheHeaders { // com.apollographql.cache.normalized.api/CacheHeaders|null[0] diff --git a/normalized-cache-incubating/src/commonMain/kotlin/com/apollographql/cache/normalized/api/CacheResolver.kt b/normalized-cache-incubating/src/commonMain/kotlin/com/apollographql/cache/normalized/api/CacheResolver.kt index 3b676d05..38df1ef2 100644 --- a/normalized-cache-incubating/src/commonMain/kotlin/com/apollographql/cache/normalized/api/CacheResolver.kt +++ b/normalized-cache-incubating/src/commonMain/kotlin/com/apollographql/cache/normalized/api/CacheResolver.kt @@ -147,17 +147,26 @@ object DefaultCacheResolver : CacheResolver { * * A maximum staleness can be configured via the [ApolloCacheHeaders.MAX_STALE] cache header. * + * @param maxAgeProvider the provider for the max age of fields + * @param delegateResolver the resolver to delegate to for non-stale fields, by default [FieldPolicyCacheResolver] + * * @see MutableExecutionOptions.storeReceiveDate * @see MutableExecutionOptions.storeExpirationDate * @see MutableExecutionOptions.maxStale */ class CacheControlCacheResolver( private val maxAgeProvider: MaxAgeProvider, + private val delegateResolver: CacheResolver = FieldPolicyCacheResolver, ) : CacheResolver { /** * Creates a new [CacheControlCacheResolver] with no max ages. Use this constructor if you want to consider only the expiration dates. */ - constructor() : this(maxAgeProvider = GlobalMaxAgeProvider(Duration.INFINITE)) + constructor( + delegateResolver: CacheResolver = FieldPolicyCacheResolver, + ) : this( + maxAgeProvider = GlobalMaxAgeProvider(Duration.INFINITE), + delegateResolver = delegateResolver, + ) override fun resolveField(context: ResolverContext): Any? { var isStale = false @@ -198,7 +207,7 @@ class CacheControlCacheResolver( } } - val value = FieldPolicyCacheResolver.resolveField(context) + val value = delegateResolver.resolveField(context) return if (isStale) { ResolvedValue( value = value,