Skip to content
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

import grpc
from google.protobuf.json_format import MessageToDict
from google.protobuf.struct_pb2 import Struct

from openfeature.evaluation_context import EvaluationContext
from openfeature.event import ProviderEventDetails
Expand Down Expand Up @@ -210,6 +209,21 @@ def _create_request_args(self) -> dict:

return request_args

def _fetch_metadata(self) -> typing.Optional[sync_pb2.GetMetadataResponse]:
if self.config.sync_metadata_disabled:
return None

context_values_request = sync_pb2.GetMetadataRequest()
context_values_response: sync_pb2.GetMetadataResponse
try:
context_values_response = self.stub.GetMetadata(
context_values_request, wait_for_ready=True
)
return context_values_response
except grpc.RpcError as e:
logger.debug(f"Error getting sync metadata: {e}")
return None

def listen(self) -> None:
call_args = (
{"timeout": self.streamline_deadline_seconds}
Expand All @@ -220,18 +234,7 @@ def listen(self) -> None:

while self.active:
try:
context_values_response: sync_pb2.GetMetadataResponse
if self.config.sync_metadata_disabled:
context_values_response = sync_pb2.GetMetadataResponse(
metadata=Struct()
)
else:
context_values_request = sync_pb2.GetMetadataRequest()
context_values_response = self.stub.GetMetadata(
context_values_request, wait_for_ready=True
)

context_values = MessageToDict(context_values_response)
context_values_response = self._fetch_metadata()

request = sync_pb2.SyncFlagsRequest(**request_args)

Expand All @@ -245,12 +248,20 @@ def listen(self) -> None:
)
self.flag_store.update(json.loads(flag_str))

context_values = {}
if flag_rsp.sync_context:
context_values = MessageToDict(flag_rsp.sync_context)
elif context_values_response:
context_values = MessageToDict(context_values_response)[
"metadata"
]

if not self.connected:
self.emit_provider_ready(
ProviderEventDetails(
message="gRPC sync connection established"
),
context_values["metadata"],
context_values,
)
self.connected = True

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class TestProviderType(Enum):
SSL = "ssl"
SOCKET = "socket"
METADATA = "metadata"
SYNCPAYLOAD = "syncpayload"


@given("a provider is registered", target_fixture="client")
Expand Down Expand Up @@ -71,6 +72,8 @@ def get_default_options_for_provider(
return options, True
elif t == TestProviderType.METADATA:
launchpad = "metadata"
elif t == TestProviderType.SYNCPAYLOAD:
launchpad = "sync-payload"

if resolver_type == ResolverType.FILE:
if "selector" in option_values:
Expand Down