Skip to content

Commit a35acb6

Browse files
feat: Improved event observation API
Signed-off-by: Fabrizio Demaria <[email protected]>
1 parent 1d4c24f commit a35acb6

File tree

2 files changed

+20
-4
lines changed

2 files changed

+20
-4
lines changed

android/src/main/java/dev/openfeature/sdk/OpenFeatureAPI.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
package dev.openfeature.sdk
22

3+
import kotlinx.coroutines.flow.MutableSharedFlow
4+
import kotlinx.coroutines.flow.SharedFlow
5+
36
@Suppress("TooManyFunctions")
47
object OpenFeatureAPI {
58
private var provider: FeatureProvider? = null
69
private var context: EvaluationContext? = null
10+
private val providersFlow: MutableSharedFlow<FeatureProvider> = MutableSharedFlow(replay = 1)
11+
internal val sharedProvidersFlow: SharedFlow<FeatureProvider> get() = providersFlow
712

813
var hooks: List<Hook<*>> = listOf()
914
private set
1015

1116
fun setProvider(provider: FeatureProvider, initialContext: EvaluationContext? = null) {
1217
this@OpenFeatureAPI.provider = provider
18+
providersFlow.tryEmit(provider)
1319
if (initialContext != null) context = initialContext
1420
try {
1521
provider.initialize(context)

android/src/main/java/dev/openfeature/sdk/async/Extensions.kt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ import dev.openfeature.sdk.events.observe
99
import kotlinx.coroutines.CoroutineDispatcher
1010
import kotlinx.coroutines.CoroutineScope
1111
import kotlinx.coroutines.Dispatchers
12+
import kotlinx.coroutines.ExperimentalCoroutinesApi
1213
import kotlinx.coroutines.cancel
1314
import kotlinx.coroutines.flow.Flow
15+
import kotlinx.coroutines.flow.distinctUntilChanged
16+
import kotlinx.coroutines.flow.flatMapLatest
1417
import kotlinx.coroutines.flow.onStart
1518
import kotlinx.coroutines.flow.take
1619
import kotlinx.coroutines.launch
@@ -42,6 +45,17 @@ internal fun FeatureProvider.observeProviderReady() = observe<OpenFeatureEvents.
4245
}
4346
}
4447

48+
/*
49+
Observe events from currently configured Provider.
50+
The most recent event prior to starting the observation is collected on start.
51+
*/
52+
@OptIn(ExperimentalCoroutinesApi::class)
53+
fun OpenFeatureAPI.observeEvents(): Flow<OpenFeatureEvents> {
54+
return sharedProvidersFlow.flatMapLatest { provider ->
55+
provider.observe().distinctUntilChanged()
56+
}
57+
}
58+
4559
internal fun FeatureProvider.observeProviderError() = observe<OpenFeatureEvents.ProviderError>()
4660
.onStart {
4761
val status = getProviderStatus()
@@ -50,10 +64,6 @@ internal fun FeatureProvider.observeProviderError() = observe<OpenFeatureEvents.
5064
}
5165
}
5266

53-
inline fun <reified T : OpenFeatureEvents> OpenFeatureAPI.observeEvents(): Flow<T>? {
54-
return getProvider()?.observe<T>()
55-
}
56-
5767
suspend fun FeatureProvider.awaitReadyOrError(
5868
dispatcher: CoroutineDispatcher = Dispatchers.IO
5969
) = suspendCancellableCoroutine { continuation ->

0 commit comments

Comments
 (0)