From 8a4414e8d5ba629c4643f39df49ca46be3c19851 Mon Sep 17 00:00:00 2001 From: vahid torkaman <vahidlazio@gmail.com> Date: Fri, 15 Dec 2023 09:28:10 -0500 Subject: [PATCH] make the setting provider awaiting --- .../dev/openfeature/sdk/async/Extensions.kt | 22 +++++++++---------- README.md | 19 +++++----------- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/OpenFeature/src/main/java/dev/openfeature/sdk/async/Extensions.kt b/OpenFeature/src/main/java/dev/openfeature/sdk/async/Extensions.kt index b7792ed..6d0a249 100644 --- a/OpenFeature/src/main/java/dev/openfeature/sdk/async/Extensions.kt +++ b/OpenFeature/src/main/java/dev/openfeature/sdk/async/Extensions.kt @@ -25,6 +25,14 @@ fun OpenFeatureClient.toAsync(): AsyncClient? { } } +suspend fun OpenFeatureAPI.setProviderAndAwaitReady( + provider: FeatureProvider, + dispatcher: CoroutineDispatcher +) { + OpenFeatureAPI.setProvider(provider) + provider.awaitReady(dispatcher) +} + internal fun FeatureProvider.observeProviderReady() = observe<OpenFeatureEvents.ProviderReady>() .onStart { if (isProviderReady()) { @@ -32,19 +40,11 @@ internal fun FeatureProvider.observeProviderReady() = observe<OpenFeatureEvents. } } -suspend fun OpenFeatureAPI.awaitProviderReady( - dispatcher: CoroutineDispatcher = Dispatchers.IO -) { - val provider = getProvider() - requireNotNull(provider) - return provider.awaitProviderReady(dispatcher) -} - -fun OpenFeatureAPI.observeEvents(): Flow<OpenFeatureEvents>? { - return getProvider()?.observe() +inline fun <reified T : OpenFeatureEvents> OpenFeatureAPI.observeEvents(): Flow<T>? { + return getProvider()?.observe<T>() } -suspend fun FeatureProvider.awaitProviderReady( +suspend fun FeatureProvider.awaitReady( dispatcher: CoroutineDispatcher = Dispatchers.IO ) = suspendCancellableCoroutine { continuation -> val coroutineScope = CoroutineScope(dispatcher) diff --git a/README.md b/README.md index 951708c..9695ec0 100644 --- a/README.md +++ b/README.md @@ -75,18 +75,12 @@ This will get a build from the head of the mentioned branch. ```kotlin // configure a provider and get client -OpenFeatureAPI.setProvider(customProvider) -val client = OpenFeatureAPI.getClient() +coroutineScope.launch(Dispatchers.IO) { + OpenFeatureAPI.setProviderAndAwaitReady(customProvider) + val client = OpenFeatureAPI.getClient() // get a bool flag value -client.getBooleanValue("boolFlag", default = false) - -// get a bool flag after "ready" signal from provider -coroutineScope.launch { - WithContext(Dispatchers.IO) { - client.awaitProviderReady() - } - client.getBooleanValue("boolFlag", default = false) + client.getBooleanValue("boolFlag", default = false) } ``` @@ -163,9 +157,8 @@ Some providers support additional events, such as `PROVIDER_CONFIGURATION_CHANGE Please refer to the documentation of the provider you're using to see what events are supported. ```kotlin -OpenFeatureAPI.eventsObserver() - .observe<OpenFeatureEvents.ProviderReady>() - .collect { +OpenFeatureAPI.observeEvents<OpenFeatureEvents.ProviderReady>() + ?.collect { // do something once the provider is ready } ```