diff --git a/Confidence/api/Confidence.api b/Confidence/api/Confidence.api index 8d208e88..8812604b 100644 --- a/Confidence/api/Confidence.api +++ b/Confidence/api/Confidence.api @@ -33,7 +33,8 @@ public final class com/spotify/confidence/Confidence : com/spotify/confidence/Co public final fun activate ()V public final fun apply (Ljava/lang/String;Ljava/lang/String;)V public final fun asyncFetch ()V - public final fun awaitReconciliation (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; + public final fun awaitReconciliation (JLkotlin/coroutines/Continuation;)Ljava/lang/Object; + public static synthetic fun awaitReconciliation$default (Lcom/spotify/confidence/Confidence;JLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; public final fun fetchAndActivate (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; public fun flush ()V public fun getContext ()Ljava/util/Map; @@ -102,8 +103,8 @@ public final class com/spotify/confidence/ConfidenceError$ParseError : java/lang public final class com/spotify/confidence/ConfidenceFactory { public static final field INSTANCE Lcom/spotify/confidence/ConfidenceFactory; - public final fun create (Landroid/content/Context;Ljava/lang/String;Ljava/util/Map;Lcom/spotify/confidence/ConfidenceRegion;Lkotlinx/coroutines/CoroutineDispatcher;Lcom/spotify/confidence/LoggingLevel;)Lcom/spotify/confidence/Confidence; - public static synthetic fun create$default (Lcom/spotify/confidence/ConfidenceFactory;Landroid/content/Context;Ljava/lang/String;Ljava/util/Map;Lcom/spotify/confidence/ConfidenceRegion;Lkotlinx/coroutines/CoroutineDispatcher;Lcom/spotify/confidence/LoggingLevel;ILjava/lang/Object;)Lcom/spotify/confidence/Confidence; + public final fun create (Landroid/content/Context;Ljava/lang/String;Ljava/util/Map;Lcom/spotify/confidence/ConfidenceRegion;Lkotlinx/coroutines/CoroutineDispatcher;Lcom/spotify/confidence/LoggingLevel;J)Lcom/spotify/confidence/Confidence; + public static synthetic fun create$default (Lcom/spotify/confidence/ConfidenceFactory;Landroid/content/Context;Ljava/lang/String;Ljava/util/Map;Lcom/spotify/confidence/ConfidenceRegion;Lkotlinx/coroutines/CoroutineDispatcher;Lcom/spotify/confidence/LoggingLevel;JILjava/lang/Object;)Lcom/spotify/confidence/Confidence; } public final class com/spotify/confidence/ConfidenceFlagEvaluationKt { diff --git a/Confidence/src/main/java/com/spotify/confidence/Confidence.kt b/Confidence/src/main/java/com/spotify/confidence/Confidence.kt index 33e5603e..e95ca34a 100644 --- a/Confidence/src/main/java/com/spotify/confidence/Confidence.kt +++ b/Confidence/src/main/java/com/spotify/confidence/Confidence.kt @@ -14,12 +14,15 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.cancel +import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.drop import kotlinx.coroutines.launch +import kotlinx.coroutines.withTimeout import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import kotlinx.serialization.json.encodeToJsonElement @@ -77,10 +80,23 @@ class Confidence internal constructor( return flagResolver.resolve(flags, getContext()) } - suspend fun awaitReconciliation() { - if (currentFetchJob != null) { - currentFetchJob?.join() - activate() + suspend fun awaitReconciliation(timeoutMillis: Long = 5000) { + try { + withTimeout(timeoutMillis) { + while (currentFetchJob == null || + currentFetchJob?.isCompleted == true || + currentFetchJob?.isCancelled == true + ) { + // If this function is called just after a putContext it will likely just delay once. + delay(1) + } + if (currentFetchJob != null) { + currentFetchJob?.join() + activate() + } + } + } catch (e: TimeoutCancellationException) { + debugLogger?.logMessage("awaitReconciliation() timed out after $timeoutMillis") } }