Skip to content

Commit 504605c

Browse files
chore: Remove AsyncClient and refactor extensions
Signed-off-by: Fabrizio Demaria <[email protected]>
1 parent 2f83367 commit 504605c

File tree

6 files changed

+28
-168
lines changed

6 files changed

+28
-168
lines changed

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

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

3+
import dev.openfeature.sdk.events.OpenFeatureEvents
4+
import dev.openfeature.sdk.events.awaitReadyOrError
5+
import dev.openfeature.sdk.events.observe
6+
import kotlinx.coroutines.CoroutineDispatcher
7+
import kotlinx.coroutines.ExperimentalCoroutinesApi
8+
import kotlinx.coroutines.flow.Flow
39
import kotlinx.coroutines.flow.MutableSharedFlow
410
import kotlinx.coroutines.flow.SharedFlow
11+
import kotlinx.coroutines.flow.flatMapLatest
512

613
@Suppress("TooManyFunctions")
714
object OpenFeatureAPI {
@@ -24,6 +31,15 @@ object OpenFeatureAPI {
2431
}
2532
}
2633

34+
suspend fun setProviderAndWait(
35+
provider: FeatureProvider,
36+
dispatcher: CoroutineDispatcher,
37+
initialContext: EvaluationContext? = null
38+
) {
39+
setProvider(provider, initialContext)
40+
provider.awaitReadyOrError(dispatcher)
41+
}
42+
2743
fun getProvider(): FeatureProvider? {
2844
return provider
2945
}
@@ -61,4 +77,14 @@ object OpenFeatureAPI {
6177
fun shutdown() {
6278
provider?.shutdown()
6379
}
80+
81+
/*
82+
Observe events from currently configured Provider.
83+
*/
84+
@OptIn(ExperimentalCoroutinesApi::class)
85+
internal inline fun <reified T : OpenFeatureEvents> observe(): Flow<T> {
86+
return sharedProvidersFlow.flatMapLatest { provider ->
87+
provider.observe<T>()
88+
}
89+
}
6490
}

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

Lines changed: 0 additions & 46 deletions
This file was deleted.

android/src/main/java/dev/openfeature/sdk/async/Extensions.kt renamed to android/src/main/java/dev/openfeature/sdk/events/FeatureProviderExtensions.kt

Lines changed: 1 addition & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,22 @@
1-
package dev.openfeature.sdk.async
1+
package dev.openfeature.sdk.events
22

3-
import dev.openfeature.sdk.EvaluationContext
43
import dev.openfeature.sdk.FeatureProvider
5-
import dev.openfeature.sdk.OpenFeatureAPI
6-
import dev.openfeature.sdk.OpenFeatureClient
7-
import dev.openfeature.sdk.events.OpenFeatureEvents
8-
import dev.openfeature.sdk.events.observe
94
import kotlinx.coroutines.CoroutineDispatcher
105
import kotlinx.coroutines.CoroutineScope
116
import kotlinx.coroutines.Dispatchers
12-
import kotlinx.coroutines.ExperimentalCoroutinesApi
137
import kotlinx.coroutines.cancel
14-
import kotlinx.coroutines.flow.Flow
15-
import kotlinx.coroutines.flow.flatMapLatest
168
import kotlinx.coroutines.flow.onStart
179
import kotlinx.coroutines.flow.take
1810
import kotlinx.coroutines.launch
1911
import kotlinx.coroutines.suspendCancellableCoroutine
2012

21-
fun OpenFeatureClient.toAsync(): AsyncClient? {
22-
val provider = OpenFeatureAPI.getProvider()
23-
return provider?.let {
24-
AsyncClientImpl(
25-
this,
26-
it
27-
)
28-
}
29-
}
30-
31-
suspend fun OpenFeatureAPI.setProviderAndWait(
32-
provider: FeatureProvider,
33-
dispatcher: CoroutineDispatcher,
34-
initialContext: EvaluationContext? = null
35-
) {
36-
setProvider(provider, initialContext)
37-
provider.awaitReadyOrError(dispatcher)
38-
}
39-
4013
internal fun FeatureProvider.observeProviderReady() = observe<OpenFeatureEvents.ProviderReady>()
4114
.onStart {
4215
if (getProviderStatus() == OpenFeatureEvents.ProviderReady) {
4316
this.emit(OpenFeatureEvents.ProviderReady)
4417
}
4518
}
4619

47-
/*
48-
Observe events from currently configured Provider.
49-
*/
50-
@OptIn(ExperimentalCoroutinesApi::class)
51-
internal inline fun <reified T : OpenFeatureEvents> OpenFeatureAPI.observe(): Flow<T> {
52-
return sharedProvidersFlow.flatMapLatest { provider ->
53-
provider.observe<T>()
54-
}
55-
}
56-
5720
internal fun FeatureProvider.observeProviderError() = observe<OpenFeatureEvents.ProviderError>()
5821
.onStart {
5922
val status = getProviderStatus()

android/src/test/java/dev/openfeature/sdk/DeveloperExperienceTests.kt

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

3-
import dev.openfeature.sdk.async.observe
4-
import dev.openfeature.sdk.async.setProviderAndWait
53
import dev.openfeature.sdk.events.OpenFeatureEvents
64
import dev.openfeature.sdk.exceptions.ErrorCode
75
import dev.openfeature.sdk.helpers.AlwaysBrokenProvider

android/src/test/java/dev/openfeature/sdk/EventsHandlerTest.kt

Lines changed: 1 addition & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package dev.openfeature.sdk
22

3-
import dev.openfeature.sdk.async.observeProviderReady
4-
import dev.openfeature.sdk.async.toAsync
53
import dev.openfeature.sdk.events.EventHandler
64
import dev.openfeature.sdk.events.OpenFeatureEvents
75
import dev.openfeature.sdk.events.observe
6+
import dev.openfeature.sdk.events.observeProviderReady
87
import kotlinx.coroutines.CoroutineScope
98
import kotlinx.coroutines.ExperimentalCoroutinesApi
109
import kotlinx.coroutines.Job
@@ -15,9 +14,6 @@ import kotlinx.coroutines.test.UnconfinedTestDispatcher
1514
import kotlinx.coroutines.test.runTest
1615
import org.junit.Assert
1716
import org.junit.Test
18-
import org.mockito.Mockito.`when`
19-
import org.mockito.kotlin.doReturn
20-
import org.mockito.kotlin.mock
2117
import kotlin.time.Duration.Companion.milliseconds
2218

2319
@OptIn(ExperimentalCoroutinesApi::class)
@@ -179,81 +175,6 @@ class EventsHandlerTest {
179175
Assert.assertTrue(isProviderStale)
180176
}
181177

182-
@Test
183-
fun observe_string_value_from_client_works() = runTest {
184-
val dispatcher = UnconfinedTestDispatcher(testScheduler)
185-
val eventHandler = EventHandler(dispatcher)
186-
val provider = TestFeatureProvider(dispatcher, eventHandler)
187-
188-
provider.emitReady()
189-
val key = "mykey"
190-
val default = "default"
191-
val resultTexts = mutableListOf<String>()
192-
193-
OpenFeatureAPI.setProvider(
194-
mock {
195-
on { getProviderStatus() } doReturn provider.getProviderStatus()
196-
on { observeProviderReady() } doReturn provider.observeProviderReady()
197-
}
198-
)
199-
200-
val mockOpenFeatureClient = mock<OpenFeatureClient> {
201-
on { getStringValue(key, default) } doReturn "text1"
202-
}
203-
204-
// observing the provider status after the provider ready event is published
205-
val job = backgroundScope.launch(dispatcher) {
206-
mockOpenFeatureClient.toAsync()!!
207-
.observeStringValue(key, default)
208-
.take(2)
209-
.collect {
210-
resultTexts.add(it)
211-
}
212-
}
213-
214-
`when`(mockOpenFeatureClient.getStringValue(key, default))
215-
.thenReturn("text2")
216-
217-
provider.emitReady()
218-
job.join()
219-
Assert.assertEquals(listOf("text1", "text2"), resultTexts)
220-
}
221-
222-
@Test
223-
fun observe_string_value_from_client_waits_until_provider_ready() = runTest {
224-
val dispatcher = UnconfinedTestDispatcher(testScheduler)
225-
val eventHandler = EventHandler(dispatcher)
226-
val provider = TestFeatureProvider(dispatcher, eventHandler)
227-
val key = "mykey"
228-
val default = "default"
229-
val resultTexts = mutableListOf<String>()
230-
231-
val mockOpenFeatureClient = mock<OpenFeatureClient> {
232-
on { getStringValue(key, default) } doReturn "text1"
233-
}
234-
235-
OpenFeatureAPI.setProvider(
236-
mock {
237-
on { getProviderStatus() } doReturn provider.getProviderStatus()
238-
on { observeProviderReady() } doReturn provider.observeProviderReady()
239-
}
240-
)
241-
242-
// observing the provider status after the provider ready event is published
243-
val job = backgroundScope.launch(dispatcher) {
244-
mockOpenFeatureClient.toAsync()!!
245-
.observeStringValue(key, default)
246-
.take(1)
247-
.collect {
248-
resultTexts.add(it)
249-
}
250-
}
251-
252-
provider.emitReady()
253-
job.join()
254-
Assert.assertEquals(listOf("text1"), resultTexts)
255-
}
256-
257178
@Test
258179
fun accessing_status_from_provider_works() = runTest {
259180
val dispatcher = UnconfinedTestDispatcher(testScheduler)

settings.gradle.kts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import org.gradle.api.initialization.resolve.RepositoriesMode
2-
31
pluginManagement {
42
repositories {
53
google()

0 commit comments

Comments
 (0)