From b6c714164385e3a4d9be81fe926a30cabc744456 Mon Sep 17 00:00:00 2001 From: Fabrizio Demaria Date: Fri, 10 Oct 2025 16:48:55 +0200 Subject: [PATCH 1/2] feat: Local resolve uses new state url endpoint --- .../confidence/flags/admin/v1/resolver.proto | 38 ------------------- .../flags/resolver/v1/resolver.proto | 31 +++++++++++++++ .../confidence/FlagsAdminStateFetcher.java | 6 +-- .../LocalResolverServiceFactory.java | 4 +- 4 files changed, 36 insertions(+), 43 deletions(-) create mode 100644 confidence-proto/src/main/proto/confidence/flags/resolver/v1/resolver.proto diff --git a/confidence-proto/src/main/proto/confidence/flags/admin/v1/resolver.proto b/confidence-proto/src/main/proto/confidence/flags/admin/v1/resolver.proto index e4dba23f..e30de4fd 100644 --- a/confidence-proto/src/main/proto/confidence/flags/admin/v1/resolver.proto +++ b/confidence-proto/src/main/proto/confidence/flags/admin/v1/resolver.proto @@ -4,9 +4,7 @@ package confidence.flags.admin.v1; import "google/protobuf/timestamp.proto"; import "google/api/resource.proto"; -import "google/api/annotations.proto"; import "confidence/iam/iam.proto"; -import "google/api/field_behavior.proto"; import "confidence/flags/admin/v1/types.proto"; @@ -14,42 +12,6 @@ option java_package = "com.spotify.confidence.shaded.flags.admin.v1"; option java_multiple_files = true; option java_outer_classname = "ResolverProto"; -// Service for fetching the state for resolving flags -service ResolverStateService { - // Gets the full state for running a resolver - rpc FullResolverState(ResolverStateRequest) returns (stream ResolverState) { - option (google.api.http) = { - get: "/v1/resolverState:full" - }; - } - - // Gets a signed uri that can be used to download the current resolver state - rpc ResolverStateUri(ResolverStateUriRequest) returns (ResolverStateUriResponse){ - option (google.api.http) = { - get: "/v1/resolverState:resolverStateUri" - }; - } -} - -// Request to fetch resolver state uri -message ResolverStateUriRequest { - -} - -// Response of fetching resolver state uri -message ResolverStateUriResponse { - // The signed uri that can be used to fetch state - string signed_uri = 1; - // At what time the state uri expires - google.protobuf.Timestamp expire_time = 2; - string account = 3; - -} - -// Request to get the resolver state for the whole account -message ResolverStateRequest { -} - // The full state for operating a flags resolver message ResolverState { // All active flags diff --git a/confidence-proto/src/main/proto/confidence/flags/resolver/v1/resolver.proto b/confidence-proto/src/main/proto/confidence/flags/resolver/v1/resolver.proto new file mode 100644 index 00000000..f26e411e --- /dev/null +++ b/confidence-proto/src/main/proto/confidence/flags/resolver/v1/resolver.proto @@ -0,0 +1,31 @@ +syntax = "proto3"; + +package confidence.flags.resolver.v1; + +import "google/protobuf/timestamp.proto"; + +option java_package = "com.spotify.confidence.flags.resolver.v1"; +option java_multiple_files = true; +option java_outer_classname = "ResolverStateProto"; + +// Service for fetching resolver state metadata (e.g., a signed URI to the state file) +service ResolverStateService { + // Gets a signed uri that can be used to download the current resolver state + rpc ResolverStateUri(ResolverStateUriRequest) returns (ResolverStateUriResponse) { + } +} + +// Request to fetch resolver state uri +message ResolverStateUriRequest {} + +// Response of fetching resolver state uri +message ResolverStateUriResponse { + // The signed uri that can be used to fetch state + string signed_uri = 1; + // At what time the state uri expires + google.protobuf.Timestamp expire_time = 2; + // The account the referenced state belongs to + string account = 3; +} + + diff --git a/openfeature-provider-local/src/main/java/com/spotify/confidence/FlagsAdminStateFetcher.java b/openfeature-provider-local/src/main/java/com/spotify/confidence/FlagsAdminStateFetcher.java index b05263d9..e548f9c7 100644 --- a/openfeature-provider-local/src/main/java/com/spotify/confidence/FlagsAdminStateFetcher.java +++ b/openfeature-provider-local/src/main/java/com/spotify/confidence/FlagsAdminStateFetcher.java @@ -6,10 +6,10 @@ import com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream; import com.google.protobuf.ByteString; import com.google.protobuf.Timestamp; +import com.spotify.confidence.flags.resolver.v1.ResolverStateServiceGrpc; +import com.spotify.confidence.flags.resolver.v1.ResolverStateUriRequest; +import com.spotify.confidence.flags.resolver.v1.ResolverStateUriResponse; import com.spotify.confidence.shaded.flags.admin.v1.Flag; -import com.spotify.confidence.shaded.flags.admin.v1.ResolverStateServiceGrpc; -import com.spotify.confidence.shaded.flags.admin.v1.ResolverStateUriRequest; -import com.spotify.confidence.shaded.flags.admin.v1.ResolverStateUriResponse; import com.spotify.confidence.shaded.flags.admin.v1.Segment; import com.spotify.confidence.shaded.iam.v1.Client; import com.spotify.confidence.shaded.iam.v1.ClientCredential; diff --git a/openfeature-provider-local/src/main/java/com/spotify/confidence/LocalResolverServiceFactory.java b/openfeature-provider-local/src/main/java/com/spotify/confidence/LocalResolverServiceFactory.java index 802507ce..e6268dc5 100644 --- a/openfeature-provider-local/src/main/java/com/spotify/confidence/LocalResolverServiceFactory.java +++ b/openfeature-provider-local/src/main/java/com/spotify/confidence/LocalResolverServiceFactory.java @@ -5,9 +5,9 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.protobuf.Struct; import com.spotify.confidence.TokenHolder.Token; +import com.spotify.confidence.flags.resolver.v1.ResolverStateServiceGrpc; +import com.spotify.confidence.flags.resolver.v1.ResolverStateServiceGrpc.ResolverStateServiceBlockingStub; import com.spotify.confidence.shaded.flags.admin.v1.FlagAdminServiceGrpc; -import com.spotify.confidence.shaded.flags.admin.v1.ResolverStateServiceGrpc; -import com.spotify.confidence.shaded.flags.admin.v1.ResolverStateServiceGrpc.ResolverStateServiceBlockingStub; import com.spotify.confidence.shaded.flags.resolver.v1.InternalFlagLoggerServiceGrpc; import com.spotify.confidence.shaded.flags.resolver.v1.Sdk; import com.spotify.confidence.shaded.flags.resolver.v1.WriteFlagLogsResponse; From 0235b394e5e6326a8e6c38a38457f33d31c96b36 Mon Sep 17 00:00:00 2001 From: Fabrizio Demaria Date: Mon, 13 Oct 2025 12:23:47 +0200 Subject: [PATCH 2/2] feat: Shade the new proto --- .../main/proto/confidence/flags/resolver/v1/resolver.proto | 2 +- .../java/com/spotify/confidence/FlagsAdminStateFetcher.java | 6 +++--- .../com/spotify/confidence/LocalResolverServiceFactory.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/confidence-proto/src/main/proto/confidence/flags/resolver/v1/resolver.proto b/confidence-proto/src/main/proto/confidence/flags/resolver/v1/resolver.proto index f26e411e..92f19ed5 100644 --- a/confidence-proto/src/main/proto/confidence/flags/resolver/v1/resolver.proto +++ b/confidence-proto/src/main/proto/confidence/flags/resolver/v1/resolver.proto @@ -4,7 +4,7 @@ package confidence.flags.resolver.v1; import "google/protobuf/timestamp.proto"; -option java_package = "com.spotify.confidence.flags.resolver.v1"; +option java_package = "com.spotify.confidence.shaded.flags.resolver.v1"; option java_multiple_files = true; option java_outer_classname = "ResolverStateProto"; diff --git a/openfeature-provider-local/src/main/java/com/spotify/confidence/FlagsAdminStateFetcher.java b/openfeature-provider-local/src/main/java/com/spotify/confidence/FlagsAdminStateFetcher.java index e548f9c7..94b3604b 100644 --- a/openfeature-provider-local/src/main/java/com/spotify/confidence/FlagsAdminStateFetcher.java +++ b/openfeature-provider-local/src/main/java/com/spotify/confidence/FlagsAdminStateFetcher.java @@ -6,11 +6,11 @@ import com.fasterxml.jackson.databind.util.ByteBufferBackedInputStream; import com.google.protobuf.ByteString; import com.google.protobuf.Timestamp; -import com.spotify.confidence.flags.resolver.v1.ResolverStateServiceGrpc; -import com.spotify.confidence.flags.resolver.v1.ResolverStateUriRequest; -import com.spotify.confidence.flags.resolver.v1.ResolverStateUriResponse; import com.spotify.confidence.shaded.flags.admin.v1.Flag; import com.spotify.confidence.shaded.flags.admin.v1.Segment; +import com.spotify.confidence.shaded.flags.resolver.v1.ResolverStateServiceGrpc; +import com.spotify.confidence.shaded.flags.resolver.v1.ResolverStateUriRequest; +import com.spotify.confidence.shaded.flags.resolver.v1.ResolverStateUriResponse; import com.spotify.confidence.shaded.iam.v1.Client; import com.spotify.confidence.shaded.iam.v1.ClientCredential; import io.grpc.health.v1.HealthCheckResponse; diff --git a/openfeature-provider-local/src/main/java/com/spotify/confidence/LocalResolverServiceFactory.java b/openfeature-provider-local/src/main/java/com/spotify/confidence/LocalResolverServiceFactory.java index e6268dc5..f56a2131 100644 --- a/openfeature-provider-local/src/main/java/com/spotify/confidence/LocalResolverServiceFactory.java +++ b/openfeature-provider-local/src/main/java/com/spotify/confidence/LocalResolverServiceFactory.java @@ -5,10 +5,10 @@ import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.protobuf.Struct; import com.spotify.confidence.TokenHolder.Token; -import com.spotify.confidence.flags.resolver.v1.ResolverStateServiceGrpc; -import com.spotify.confidence.flags.resolver.v1.ResolverStateServiceGrpc.ResolverStateServiceBlockingStub; import com.spotify.confidence.shaded.flags.admin.v1.FlagAdminServiceGrpc; import com.spotify.confidence.shaded.flags.resolver.v1.InternalFlagLoggerServiceGrpc; +import com.spotify.confidence.shaded.flags.resolver.v1.ResolverStateServiceGrpc; +import com.spotify.confidence.shaded.flags.resolver.v1.ResolverStateServiceGrpc.ResolverStateServiceBlockingStub; import com.spotify.confidence.shaded.flags.resolver.v1.Sdk; import com.spotify.confidence.shaded.flags.resolver.v1.WriteFlagLogsResponse; import com.spotify.confidence.shaded.iam.v1.AuthServiceGrpc;