diff --git a/kotlin-sdk/api/android/kotlin-sdk.api b/kotlin-sdk/api/android/kotlin-sdk.api index cafdfce1..d1dea7be 100644 --- a/kotlin-sdk/api/android/kotlin-sdk.api +++ b/kotlin-sdk/api/android/kotlin-sdk.api @@ -19,6 +19,7 @@ public abstract interface class dev/openfeature/kotlin/sdk/Client : dev/openfeat public abstract fun addHooks (Ljava/util/List;)V public abstract fun getHooks ()Ljava/util/List; public abstract fun getMetadata ()Ldev/openfeature/kotlin/sdk/ClientMetadata; + public abstract fun getStatusFlow ()Lkotlinx/coroutines/flow/Flow; } public abstract interface class dev/openfeature/kotlin/sdk/ClientMetadata { @@ -312,6 +313,7 @@ public final class dev/openfeature/kotlin/sdk/OpenFeatureClient : dev/openfeatur public fun getObjectDetails (Ljava/lang/String;Ldev/openfeature/kotlin/sdk/Value;Ldev/openfeature/kotlin/sdk/FlagEvaluationOptions;)Ldev/openfeature/kotlin/sdk/FlagEvaluationDetails; public fun getObjectValue (Ljava/lang/String;Ldev/openfeature/kotlin/sdk/Value;)Ldev/openfeature/kotlin/sdk/Value; public fun getObjectValue (Ljava/lang/String;Ldev/openfeature/kotlin/sdk/Value;Ldev/openfeature/kotlin/sdk/FlagEvaluationOptions;)Ldev/openfeature/kotlin/sdk/Value; + public fun getStatusFlow ()Lkotlinx/coroutines/flow/Flow; public fun getStringDetails (Ljava/lang/String;Ljava/lang/String;)Ldev/openfeature/kotlin/sdk/FlagEvaluationDetails; public fun getStringDetails (Ljava/lang/String;Ljava/lang/String;Ldev/openfeature/kotlin/sdk/FlagEvaluationOptions;)Ldev/openfeature/kotlin/sdk/FlagEvaluationDetails; public fun getStringValue (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; @@ -639,34 +641,90 @@ public final class dev/openfeature/kotlin/sdk/Value$Structure$Companion { public final fun invoke (Ljava/util/Map;)Ldev/openfeature/kotlin/sdk/Value$Structure; } -public abstract interface class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents { +public abstract class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents { + public abstract fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; +} + +public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails { + public fun ()V + public fun (Ljava/util/Set;Ljava/lang/String;Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode;Ljava/util/Map;)V + public synthetic fun (Ljava/util/Set;Ljava/lang/String;Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/Set; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode; + public final fun component4 ()Ljava/util/Map; + public final fun copy (Ljava/util/Set;Ljava/lang/String;Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode;Ljava/util/Map;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public static synthetic fun copy$default (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ljava/util/Set;Ljava/lang/String;Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode;Ljava/util/Map;ILjava/lang/Object;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public fun equals (Ljava/lang/Object;)Z + public final fun getErrorCode ()Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode; + public final fun getEventMetadata ()Ljava/util/Map; + public final fun getFlagsChanged ()Ljava/util/Set; + public final fun getMessage ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; } public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderConfigurationChanged : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents { - public static final field INSTANCE Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderConfigurationChanged; + public fun ()V + public fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)V + public synthetic fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public final fun copy (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderConfigurationChanged; + public static synthetic fun copy$default (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderConfigurationChanged;Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILjava/lang/Object;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderConfigurationChanged; + public fun equals (Ljava/lang/Object;)Z + public fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; } public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents { - public fun (Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;)V - public final fun component1 ()Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError; - public final fun copy (Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError; - public static synthetic fun copy$default (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;ILjava/lang/Object;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError; + public fun ()V + public fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;)V + public synthetic fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public final fun component2 ()Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError; + public final fun copy (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError; + public static synthetic fun copy$default (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError;Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;ILjava/lang/Object;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError; public fun equals (Ljava/lang/Object;)Z public final fun getError ()Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError; + public fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; public fun hashCode ()I public fun toString ()Ljava/lang/String; } public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderNotReady : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents { public static final field INSTANCE Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderNotReady; + public fun equals (Ljava/lang/Object;)Z + public synthetic fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public fun getEventDetails ()Ljava/lang/Void; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; } public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderReady : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents { - public static final field INSTANCE Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderReady; + public fun ()V + public fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)V + public synthetic fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public final fun copy (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderReady; + public static synthetic fun copy$default (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderReady;Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILjava/lang/Object;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderReady; + public fun equals (Ljava/lang/Object;)Z + public fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; } public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderStale : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents { - public static final field INSTANCE Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderStale; + public fun ()V + public fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)V + public synthetic fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public final fun copy (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderStale; + public static synthetic fun copy$default (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderStale;Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILjava/lang/Object;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderStale; + public fun equals (Ljava/lang/Object;)Z + public fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; } public final class dev/openfeature/kotlin/sdk/exceptions/ErrorCode : java/lang/Enum { @@ -684,11 +742,16 @@ public final class dev/openfeature/kotlin/sdk/exceptions/ErrorCode : java/lang/E } public abstract class dev/openfeature/kotlin/sdk/exceptions/OpenFeatureError : java/lang/Exception { + public static final field Companion Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError$Companion; public abstract fun errorCode ()Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode; } +public final class dev/openfeature/kotlin/sdk/exceptions/OpenFeatureError$Companion { +} + public final class dev/openfeature/kotlin/sdk/exceptions/OpenFeatureError$FlagNotFoundError : dev/openfeature/kotlin/sdk/exceptions/OpenFeatureError { - public fun (Ljava/lang/String;)V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun errorCode ()Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode; public fun getMessage ()Ljava/lang/String; } diff --git a/kotlin-sdk/api/jvm/kotlin-sdk.api b/kotlin-sdk/api/jvm/kotlin-sdk.api index cafdfce1..d1dea7be 100644 --- a/kotlin-sdk/api/jvm/kotlin-sdk.api +++ b/kotlin-sdk/api/jvm/kotlin-sdk.api @@ -19,6 +19,7 @@ public abstract interface class dev/openfeature/kotlin/sdk/Client : dev/openfeat public abstract fun addHooks (Ljava/util/List;)V public abstract fun getHooks ()Ljava/util/List; public abstract fun getMetadata ()Ldev/openfeature/kotlin/sdk/ClientMetadata; + public abstract fun getStatusFlow ()Lkotlinx/coroutines/flow/Flow; } public abstract interface class dev/openfeature/kotlin/sdk/ClientMetadata { @@ -312,6 +313,7 @@ public final class dev/openfeature/kotlin/sdk/OpenFeatureClient : dev/openfeatur public fun getObjectDetails (Ljava/lang/String;Ldev/openfeature/kotlin/sdk/Value;Ldev/openfeature/kotlin/sdk/FlagEvaluationOptions;)Ldev/openfeature/kotlin/sdk/FlagEvaluationDetails; public fun getObjectValue (Ljava/lang/String;Ldev/openfeature/kotlin/sdk/Value;)Ldev/openfeature/kotlin/sdk/Value; public fun getObjectValue (Ljava/lang/String;Ldev/openfeature/kotlin/sdk/Value;Ldev/openfeature/kotlin/sdk/FlagEvaluationOptions;)Ldev/openfeature/kotlin/sdk/Value; + public fun getStatusFlow ()Lkotlinx/coroutines/flow/Flow; public fun getStringDetails (Ljava/lang/String;Ljava/lang/String;)Ldev/openfeature/kotlin/sdk/FlagEvaluationDetails; public fun getStringDetails (Ljava/lang/String;Ljava/lang/String;Ldev/openfeature/kotlin/sdk/FlagEvaluationOptions;)Ldev/openfeature/kotlin/sdk/FlagEvaluationDetails; public fun getStringValue (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; @@ -639,34 +641,90 @@ public final class dev/openfeature/kotlin/sdk/Value$Structure$Companion { public final fun invoke (Ljava/util/Map;)Ldev/openfeature/kotlin/sdk/Value$Structure; } -public abstract interface class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents { +public abstract class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents { + public abstract fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; +} + +public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails { + public fun ()V + public fun (Ljava/util/Set;Ljava/lang/String;Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode;Ljava/util/Map;)V + public synthetic fun (Ljava/util/Set;Ljava/lang/String;Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/util/Set; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode; + public final fun component4 ()Ljava/util/Map; + public final fun copy (Ljava/util/Set;Ljava/lang/String;Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode;Ljava/util/Map;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public static synthetic fun copy$default (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ljava/util/Set;Ljava/lang/String;Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode;Ljava/util/Map;ILjava/lang/Object;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public fun equals (Ljava/lang/Object;)Z + public final fun getErrorCode ()Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode; + public final fun getEventMetadata ()Ljava/util/Map; + public final fun getFlagsChanged ()Ljava/util/Set; + public final fun getMessage ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; } public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderConfigurationChanged : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents { - public static final field INSTANCE Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderConfigurationChanged; + public fun ()V + public fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)V + public synthetic fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public final fun copy (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderConfigurationChanged; + public static synthetic fun copy$default (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderConfigurationChanged;Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILjava/lang/Object;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderConfigurationChanged; + public fun equals (Ljava/lang/Object;)Z + public fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; } public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents { - public fun (Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;)V - public final fun component1 ()Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError; - public final fun copy (Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError; - public static synthetic fun copy$default (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;ILjava/lang/Object;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError; + public fun ()V + public fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;)V + public synthetic fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public final fun component2 ()Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError; + public final fun copy (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError; + public static synthetic fun copy$default (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError;Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;ILjava/lang/Object;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError; public fun equals (Ljava/lang/Object;)Z public final fun getError ()Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError; + public fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; public fun hashCode ()I public fun toString ()Ljava/lang/String; } public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderNotReady : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents { public static final field INSTANCE Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderNotReady; + public fun equals (Ljava/lang/Object;)Z + public synthetic fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public fun getEventDetails ()Ljava/lang/Void; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; } public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderReady : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents { - public static final field INSTANCE Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderReady; + public fun ()V + public fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)V + public synthetic fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public final fun copy (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderReady; + public static synthetic fun copy$default (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderReady;Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILjava/lang/Object;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderReady; + public fun equals (Ljava/lang/Object;)Z + public fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; } public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderStale : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents { - public static final field INSTANCE Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderStale; + public fun ()V + public fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)V + public synthetic fun (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public final fun copy (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderStale; + public static synthetic fun copy$default (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderStale;Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILjava/lang/Object;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderStale; + public fun equals (Ljava/lang/Object;)Z + public fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; } public final class dev/openfeature/kotlin/sdk/exceptions/ErrorCode : java/lang/Enum { @@ -684,11 +742,16 @@ public final class dev/openfeature/kotlin/sdk/exceptions/ErrorCode : java/lang/E } public abstract class dev/openfeature/kotlin/sdk/exceptions/OpenFeatureError : java/lang/Exception { + public static final field Companion Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError$Companion; public abstract fun errorCode ()Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode; } +public final class dev/openfeature/kotlin/sdk/exceptions/OpenFeatureError$Companion { +} + public final class dev/openfeature/kotlin/sdk/exceptions/OpenFeatureError$FlagNotFoundError : dev/openfeature/kotlin/sdk/exceptions/OpenFeatureError { - public fun (Ljava/lang/String;)V + public fun (Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun errorCode ()Ldev/openfeature/kotlin/sdk/exceptions/ErrorCode; public fun getMessage ()Ljava/lang/String; } diff --git a/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/Client.kt b/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/Client.kt index 4da16a58..13aefdf2 100644 --- a/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/Client.kt +++ b/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/Client.kt @@ -1,8 +1,11 @@ package dev.openfeature.kotlin.sdk +import kotlinx.coroutines.flow.Flow + interface Client : Features, Tracking { val metadata: ClientMetadata val hooks: List> + val statusFlow: Flow fun addHooks(hooks: List>) } \ No newline at end of file diff --git a/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/OpenFeatureAPI.kt b/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/OpenFeatureAPI.kt index d7f48cc9..36d7f583 100644 --- a/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/OpenFeatureAPI.kt +++ b/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/OpenFeatureAPI.kt @@ -1,6 +1,7 @@ package dev.openfeature.kotlin.sdk import dev.openfeature.kotlin.sdk.events.OpenFeatureProviderEvents +import dev.openfeature.kotlin.sdk.events.toOpenFeatureStatusError import dev.openfeature.kotlin.sdk.exceptions.OpenFeatureError import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineDispatcher @@ -38,9 +39,6 @@ object OpenFeatureAPI { tryEmit(OpenFeatureStatus.NotReady) } - /** - * A flow of [OpenFeatureStatus] that emits the current status of the SDK. - */ val statusFlow: Flow get() = _statusFlow.distinctUntilChanged() var hooks: List> = listOf() @@ -261,31 +259,25 @@ object OpenFeatureAPI { inline fun observe(): Flow = providersFlow .flatMapLatest { it.observe() }.filterIsInstance() - private val handleProviderEvents: FlowCollector = FlowCollector { - when (it) { - OpenFeatureProviderEvents.ProviderReady -> { + /** + * Aligning the state management to + * https://openfeature.dev/specification/sections/events#requirement-535 + */ + private val handleProviderEvents: FlowCollector = FlowCollector { providerEvent -> + when (providerEvent) { + is OpenFeatureProviderEvents.ProviderReady -> { _statusFlow.emit(OpenFeatureStatus.Ready) } - is OpenFeatureProviderEvents.ProviderError -> { - val status = if (it.error is OpenFeatureError.ProviderFatalError) { - OpenFeatureStatus.Fatal(it.error) - } else { - OpenFeatureStatus.Error(it.error) - } - _statusFlow.emit(status) - } - - OpenFeatureProviderEvents.ProviderNotReady -> { - _statusFlow.emit(OpenFeatureStatus.NotReady) + is OpenFeatureProviderEvents.ProviderStale -> { + _statusFlow.emit(OpenFeatureStatus.Stale) } - OpenFeatureProviderEvents.ProviderStale -> { - _statusFlow.emit(OpenFeatureStatus.Stale) + is OpenFeatureProviderEvents.ProviderError -> { + _statusFlow.emit(providerEvent.toOpenFeatureStatusError()) } - OpenFeatureProviderEvents.ProviderConfigurationChanged -> { - _statusFlow.emit(OpenFeatureStatus.Ready) + else -> { // All other states should not be emitted from here } } } diff --git a/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/OpenFeatureClient.kt b/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/OpenFeatureClient.kt index 071f0ef3..b6f5eb10 100644 --- a/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/OpenFeatureClient.kt +++ b/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/OpenFeatureClient.kt @@ -24,6 +24,8 @@ class OpenFeatureClient( this.hooks += hooks } + override val statusFlow = openFeatureAPI.statusFlow + override fun getBooleanValue(key: String, defaultValue: Boolean): Boolean { return getBooleanDetails(key, defaultValue).value } @@ -175,8 +177,7 @@ class OpenFeatureClient( val hints = options.hookHints var details = FlagEvaluationDetails(key, defaultValue) val provider = openFeatureAPI.getProvider() - val mergedHooks: List> = - provider.hooks + options.hooks + hooks + openFeatureAPI.hooks + val mergedHooks: List> = provider.hooks + options.hooks + hooks + openFeatureAPI.hooks val context = openFeatureAPI.getEvaluationContext() val hookCtx: HookContext = HookContext( key, diff --git a/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents.kt b/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents.kt index a52ac9ad..a121c9d2 100644 --- a/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents.kt +++ b/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents.kt @@ -1,13 +1,74 @@ package dev.openfeature.kotlin.sdk.events +import dev.openfeature.kotlin.sdk.OpenFeatureStatus +import dev.openfeature.kotlin.sdk.exceptions.ErrorCode import dev.openfeature.kotlin.sdk.exceptions.OpenFeatureError +import dev.openfeature.kotlin.sdk.exceptions.OpenFeatureError.ProviderFatalError -sealed interface OpenFeatureProviderEvents { - object ProviderReady : OpenFeatureProviderEvents +sealed class OpenFeatureProviderEvents { + data class EventDetails( + val flagsChanged: Set = emptySet(), + val message: String? = null, + val errorCode: ErrorCode? = null, + val eventMetadata: Map = emptyMap() + ) + + abstract val eventDetails: EventDetails? + + /** + * The provider is ready to perform flag evaluations. + */ + data class ProviderReady( + override val eventDetails: EventDetails? = null + ) : OpenFeatureProviderEvents() + + /** + * The provider signaled an error. + */ + data class ProviderError( + override val eventDetails: EventDetails? = null, + @Deprecated("Please use eventDetails instead.") val error: OpenFeatureError? = null + ) : OpenFeatureProviderEvents() + + data class ProviderConfigurationChanged( + override val eventDetails: EventDetails? = null + ) : OpenFeatureProviderEvents() + + /** + * The provider's cached state is no longer valid and may not be up-to-date with the source of truth. + */ + data class ProviderStale( + override val eventDetails: EventDetails? = null + ) : OpenFeatureProviderEvents() @Deprecated("Use ProviderError instead", ReplaceWith("ProviderError")) - object ProviderNotReady : OpenFeatureProviderEvents - object ProviderStale : OpenFeatureProviderEvents - data class ProviderError(val error: OpenFeatureError) : OpenFeatureProviderEvents - object ProviderConfigurationChanged : OpenFeatureProviderEvents + data object ProviderNotReady : OpenFeatureProviderEvents() { + override val eventDetails = null + } +} + +internal fun OpenFeatureProviderEvents.ProviderError.toOpenFeatureStatusError(): OpenFeatureStatus { + return when { + eventDetails?.errorCode != null -> { + val openFeatureError = OpenFeatureError.fromMessageAndErrorCode( + errorMessage = eventDetails.message ?: "Provider did not supply an error message", + errorCode = eventDetails.errorCode + ) + if (eventDetails.errorCode == ErrorCode.PROVIDER_FATAL) { + OpenFeatureStatus.Fatal(openFeatureError) + } else { + OpenFeatureStatus.Error(openFeatureError) + } + } + + error != null -> { // Deprecated implementation + if (error is ProviderFatalError) { + OpenFeatureStatus.Fatal(error) + } else { + OpenFeatureStatus.Error(error) + } + } + + else -> OpenFeatureStatus.Error(OpenFeatureError.GeneralError("Unspecified error")) + } } \ No newline at end of file diff --git a/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/exceptions/OpenFeatureError.kt b/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/exceptions/OpenFeatureError.kt index 2224ad37..9ecf7b47 100644 --- a/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/exceptions/OpenFeatureError.kt +++ b/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/exceptions/OpenFeatureError.kt @@ -9,8 +9,10 @@ sealed class OpenFeatureError : Exception() { } } - class FlagNotFoundError(flagKey: String) : OpenFeatureError() { + class FlagNotFoundError( + flagKey: String?, override val message: String = "Could not find flag named: $flagKey" + ) : OpenFeatureError() { override fun errorCode(): ErrorCode { return ErrorCode.FLAG_NOT_FOUND } @@ -57,4 +59,19 @@ sealed class OpenFeatureError : Exception() { return ErrorCode.PROVIDER_FATAL } } + + companion object { + internal fun fromMessageAndErrorCode(errorMessage: String, errorCode: ErrorCode): OpenFeatureError { + return when (errorCode) { + ErrorCode.PROVIDER_NOT_READY -> ProviderNotReadyError() + ErrorCode.FLAG_NOT_FOUND -> FlagNotFoundError(flagKey = null, errorMessage) + ErrorCode.PARSE_ERROR -> ParseError(errorMessage) + ErrorCode.TYPE_MISMATCH -> TypeMismatchError(errorMessage) + ErrorCode.TARGETING_KEY_MISSING -> TargetingKeyMissingError(errorMessage) + ErrorCode.INVALID_CONTEXT -> InvalidContextError(errorMessage) + ErrorCode.GENERAL -> GeneralError(errorMessage) + ErrorCode.PROVIDER_FATAL -> ProviderFatalError(errorMessage) + } + } + } } \ No newline at end of file diff --git a/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/multiprovider/MultiProvider.kt b/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/multiprovider/MultiProvider.kt index 30af01ca..b80de7bc 100644 --- a/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/multiprovider/MultiProvider.kt +++ b/kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/multiprovider/MultiProvider.kt @@ -8,6 +8,7 @@ import dev.openfeature.kotlin.sdk.ProviderEvaluation import dev.openfeature.kotlin.sdk.ProviderMetadata import dev.openfeature.kotlin.sdk.Value import dev.openfeature.kotlin.sdk.events.OpenFeatureProviderEvents +import dev.openfeature.kotlin.sdk.events.toOpenFeatureStatusError import dev.openfeature.kotlin.sdk.exceptions.OpenFeatureError import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -158,7 +159,6 @@ class MultiProvider( */ internal fun getProviderCount(): Int = childFeatureProviders.size - // TODO Add distinctUntilChanged operator once EventDetails have been added override fun observe(): Flow = eventFlow.asSharedFlow() /** @@ -197,12 +197,7 @@ class MultiProvider( is OpenFeatureProviderEvents.ProviderReady -> OpenFeatureStatus.Ready is OpenFeatureProviderEvents.ProviderNotReady -> OpenFeatureStatus.NotReady is OpenFeatureProviderEvents.ProviderStale -> OpenFeatureStatus.Stale - is OpenFeatureProviderEvents.ProviderError -> - if (event.error is OpenFeatureError.ProviderFatalError) { - OpenFeatureStatus.Fatal(event.error) - } else { - OpenFeatureStatus.Error(event.error) - } + is OpenFeatureProviderEvents.ProviderError -> event.toOpenFeatureStatusError() } val previousStatus = _statusFlow.value diff --git a/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/DeveloperExperienceTests.kt b/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/DeveloperExperienceTests.kt index 4e5036f9..d4de0194 100644 --- a/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/DeveloperExperienceTests.kt +++ b/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/DeveloperExperienceTests.kt @@ -211,6 +211,7 @@ class DeveloperExperienceTests { val emittedStatuses = mutableListOf() val job = launch { OpenFeatureAPI.statusFlow.collect { + println(it) emittedStatuses.add(it) } } @@ -350,10 +351,10 @@ class DeveloperExperienceTests { job.cancelAndJoin() assertEquals( listOf( - OpenFeatureProviderEvents.ProviderStale, - OpenFeatureProviderEvents.ProviderStale, - OpenFeatureProviderEvents.ProviderStale, - OpenFeatureProviderEvents.ProviderStale + OpenFeatureProviderEvents.ProviderStale(), + OpenFeatureProviderEvents.ProviderStale(), + OpenFeatureProviderEvents.ProviderStale(), + OpenFeatureProviderEvents.ProviderStale() ), staleEvents ) diff --git a/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/EventDetailsTests.kt b/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/EventDetailsTests.kt new file mode 100644 index 00000000..1db56c73 --- /dev/null +++ b/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/EventDetailsTests.kt @@ -0,0 +1,75 @@ +package dev.openfeature.kotlin.sdk + +import dev.openfeature.kotlin.sdk.events.OpenFeatureProviderEvents +import dev.openfeature.kotlin.sdk.events.toOpenFeatureStatusError +import dev.openfeature.kotlin.sdk.exceptions.ErrorCode +import dev.openfeature.kotlin.sdk.exceptions.OpenFeatureError +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertIs + +class EventDetailsTests { + + @Test + fun providerErrorEventDetailsMapToFatal() { + val evt = OpenFeatureProviderEvents.ProviderError( + OpenFeatureProviderEvents.EventDetails( + message = "message", + errorCode = ErrorCode.PROVIDER_FATAL + ) + ) + + val status = evt.toOpenFeatureStatusError() + val fatal = assertIs(status) + val err = assertIs(fatal.error) + assertEquals("message", err.message) + } + + @Test + fun providerErrorEventDetailsMapToError() { + val evt = OpenFeatureProviderEvents.ProviderError( + OpenFeatureProviderEvents.EventDetails( + message = "flag missing", + errorCode = ErrorCode.FLAG_NOT_FOUND + ) + ) + + val status = evt.toOpenFeatureStatusError() + val error = assertIs(status) + assertIs(error.error) + assertEquals("flag missing", error.error.message) + } + + @Test + fun providerErrorMapToFatal() { + val evt = OpenFeatureProviderEvents.ProviderError( + error = OpenFeatureError.ProviderFatalError("message") + ) + + val status = evt.toOpenFeatureStatusError() + val fatal = assertIs(status) + val err = assertIs(fatal.error) + assertEquals("message", err.message) + } + + @Test + fun providerErrorMapToError() { + val evt = OpenFeatureProviderEvents.ProviderError( + error = OpenFeatureError.InvalidContextError("message") + ) + + val status = evt.toOpenFeatureStatusError() + val fatal = assertIs(status) + val err = assertIs(fatal.error) + assertEquals("message", err.message) + } + + @Test + fun providerErrorMapToUnspecifiedError() { + val evt = OpenFeatureProviderEvents.ProviderError() + + val status = evt.toOpenFeatureStatusError() + val fatal = assertIs(status) + assertIs(fatal.error) + } +} \ No newline at end of file diff --git a/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/ProviderEventingTests.kt b/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/ProviderEventingTests.kt index ff852901..aedabaf4 100644 --- a/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/ProviderEventingTests.kt +++ b/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/ProviderEventingTests.kt @@ -41,13 +41,15 @@ class ProviderEventingTests { ) { flow.emit( OpenFeatureProviderEvents.ProviderError( - OpenFeatureError.ProviderNotReadyError( + error = OpenFeatureError.ProviderNotReadyError( "test error" ) ) ) delay(healDelayMillis) - flow.emit(OpenFeatureProviderEvents.ProviderConfigurationChanged) + flow.emit( + OpenFeatureProviderEvents.ProviderConfigurationChanged() + ) } override fun observe(): Flow = flow @@ -103,9 +105,9 @@ class ProviderEventingTests { testScheduler.advanceUntilIdle() assertEquals( listOf( - OpenFeatureProviderEvents.ProviderReady, - OpenFeatureProviderEvents.ProviderStale, - OpenFeatureProviderEvents.ProviderConfigurationChanged + OpenFeatureProviderEvents.ProviderReady(), + OpenFeatureProviderEvents.ProviderStale(), + OpenFeatureProviderEvents.ProviderConfigurationChanged() ), emittedEvents ) @@ -127,15 +129,15 @@ class ProviderEventingTests { job.cancelAndJoin() assertEquals( listOf( - OpenFeatureProviderEvents.ProviderReady, - OpenFeatureProviderEvents.ProviderStale, - OpenFeatureProviderEvents.ProviderConfigurationChanged, - OpenFeatureProviderEvents.ProviderReady, - OpenFeatureProviderEvents.ProviderStale, - OpenFeatureProviderEvents.ProviderStale, - OpenFeatureProviderEvents.ProviderStale, - OpenFeatureProviderEvents.ProviderStale, - OpenFeatureProviderEvents.ProviderConfigurationChanged + OpenFeatureProviderEvents.ProviderReady(), + OpenFeatureProviderEvents.ProviderStale(), + OpenFeatureProviderEvents.ProviderConfigurationChanged(), + OpenFeatureProviderEvents.ProviderReady(), + OpenFeatureProviderEvents.ProviderStale(), + OpenFeatureProviderEvents.ProviderStale(), + OpenFeatureProviderEvents.ProviderStale(), + OpenFeatureProviderEvents.ProviderStale(), + OpenFeatureProviderEvents.ProviderConfigurationChanged() ), emittedEvents ) diff --git a/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/helpers/AutoHealingProvider.kt b/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/helpers/AutoHealingProvider.kt index ee9f7e4a..daa7b9bc 100644 --- a/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/helpers/AutoHealingProvider.kt +++ b/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/helpers/AutoHealingProvider.kt @@ -25,13 +25,13 @@ class AutoHealingProvider( ready = false _events.emit( OpenFeatureProviderEvents.ProviderError( - OpenFeatureError.ProviderNotReadyError( + error = OpenFeatureError.ProviderNotReadyError( "AutoHealingProvider got an error. trying to heal" ) ) ) delay(healDelay) - _events.emit(OpenFeatureProviderEvents.ProviderReady) + _events.emit(OpenFeatureProviderEvents.ProviderReady()) ready = true } diff --git a/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/helpers/DoSomethingProvider.kt b/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/helpers/DoSomethingProvider.kt index 8a2b2a57..0f57b28b 100644 --- a/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/helpers/DoSomethingProvider.kt +++ b/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/helpers/DoSomethingProvider.kt @@ -27,7 +27,7 @@ open class DoSomethingProvider( override suspend fun initialize(initialContext: EvaluationContext?) { delay(1000) - events.emit(OpenFeatureProviderEvents.ProviderReady) + events.emit(OpenFeatureProviderEvents.ProviderReady()) } override fun shutdown() { @@ -39,7 +39,7 @@ open class DoSomethingProvider( newContext: EvaluationContext ) { delay(500) - events.emit(OpenFeatureProviderEvents.ProviderConfigurationChanged) + events.emit(OpenFeatureProviderEvents.ProviderConfigurationChanged()) } override fun getBooleanEvaluation( @@ -101,8 +101,8 @@ class OverlyEmittingProvider(name: String) : DoSomethingProvider( oldContext: EvaluationContext?, newContext: EvaluationContext ) { - events.emit(OpenFeatureProviderEvents.ProviderStale) - events.emit(OpenFeatureProviderEvents.ProviderConfigurationChanged) + events.emit(OpenFeatureProviderEvents.ProviderStale()) + events.emit(OpenFeatureProviderEvents.ProviderConfigurationChanged()) } override fun track( @@ -111,8 +111,8 @@ class OverlyEmittingProvider(name: String) : DoSomethingProvider( details: TrackingEventDetails? ) { super.track(trackingEventName, context, details) - events.tryEmit(OpenFeatureProviderEvents.ProviderStale) - events.tryEmit(OpenFeatureProviderEvents.ProviderStale) - events.tryEmit(OpenFeatureProviderEvents.ProviderStale) + events.tryEmit(OpenFeatureProviderEvents.ProviderStale()) + events.tryEmit(OpenFeatureProviderEvents.ProviderStale()) + events.tryEmit(OpenFeatureProviderEvents.ProviderStale()) } } \ No newline at end of file diff --git a/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/multiprovider/MultiProviderTests.kt b/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/multiprovider/MultiProviderTests.kt index 60eec8dd..e598f8b7 100644 --- a/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/multiprovider/MultiProviderTests.kt +++ b/kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/multiprovider/MultiProviderTests.kt @@ -106,9 +106,9 @@ class MultiProviderTests { val provider = FakeEventProvider( name = "p", eventsToEmitOnInit = listOf( - OpenFeatureProviderEvents.ProviderConfigurationChanged, - OpenFeatureProviderEvents.ProviderReady, - OpenFeatureProviderEvents.ProviderStale + OpenFeatureProviderEvents.ProviderConfigurationChanged(), + OpenFeatureProviderEvents.ProviderReady(), + OpenFeatureProviderEvents.ProviderStale() ) ) val multi = MultiProvider(listOf(provider)) @@ -118,7 +118,7 @@ class MultiProviderTests { // The last emitted event should be STALE given the sequence above val last = multi.observe().first() - assertEquals(OpenFeatureProviderEvents.ProviderStale, last) + assertEquals(OpenFeatureProviderEvents.ProviderStale(), last) initJob.cancelAndJoin() } @@ -143,24 +143,27 @@ class MultiProviderTests { val a = FakeEventProvider( name = "A", eventsToEmitOnInit = listOf( - OpenFeatureProviderEvents.ProviderConfigurationChanged, - OpenFeatureProviderEvents.ProviderReady + OpenFeatureProviderEvents.ProviderConfigurationChanged(), + OpenFeatureProviderEvents.ProviderReady() ) ) val b = FakeEventProvider( name = "B", eventsToEmitOnInit = listOf( - OpenFeatureProviderEvents.ProviderConfigurationChanged, - OpenFeatureProviderEvents.ProviderStale + OpenFeatureProviderEvents.ProviderConfigurationChanged(), + OpenFeatureProviderEvents.ProviderStale() ) ) val c = FakeEventProvider( name = "C", eventsToEmitOnInit = listOf( - OpenFeatureProviderEvents.ProviderConfigurationChanged, + OpenFeatureProviderEvents.ProviderConfigurationChanged(), OpenFeatureProviderEvents.ProviderNotReady, OpenFeatureProviderEvents.ProviderError( - OpenFeatureError.GeneralError("boom") + OpenFeatureProviderEvents.EventDetails( + message = "boom", + errorCode = dev.openfeature.kotlin.sdk.exceptions.ErrorCode.GENERAL + ) ) ) ) @@ -180,16 +183,19 @@ class MultiProviderTests { val a = FakeEventProvider( name = "A", eventsToEmitOnInit = listOf( - OpenFeatureProviderEvents.ProviderConfigurationChanged, - OpenFeatureProviderEvents.ProviderReady + OpenFeatureProviderEvents.ProviderConfigurationChanged(), + OpenFeatureProviderEvents.ProviderReady() ) ) val b = FakeEventProvider( name = "B", eventsToEmitOnInit = listOf( - OpenFeatureProviderEvents.ProviderConfigurationChanged, + OpenFeatureProviderEvents.ProviderConfigurationChanged(), OpenFeatureProviderEvents.ProviderError( - OpenFeatureError.ProviderFatalError("fatal") + OpenFeatureProviderEvents.EventDetails( + message = "fatal", + errorCode = dev.openfeature.kotlin.sdk.exceptions.ErrorCode.PROVIDER_FATAL + ) ) ) ) @@ -209,24 +215,27 @@ class MultiProviderTests { val a = FakeEventProvider( name = "A", eventsToEmitOnInit = listOf( - OpenFeatureProviderEvents.ProviderConfigurationChanged, - OpenFeatureProviderEvents.ProviderReady + OpenFeatureProviderEvents.ProviderConfigurationChanged(), + OpenFeatureProviderEvents.ProviderReady() ) ) val b = FakeEventProvider( name = "B", eventsToEmitOnInit = listOf( - OpenFeatureProviderEvents.ProviderConfigurationChanged, + OpenFeatureProviderEvents.ProviderConfigurationChanged(), OpenFeatureProviderEvents.ProviderError( - OpenFeatureError.GeneralError("oops") + OpenFeatureProviderEvents.EventDetails( + message = "oops", + errorCode = dev.openfeature.kotlin.sdk.exceptions.ErrorCode.GENERAL + ) ) ) ) val c = FakeEventProvider( name = "C", eventsToEmitOnInit = listOf( - OpenFeatureProviderEvents.ProviderConfigurationChanged, - OpenFeatureProviderEvents.ProviderStale + OpenFeatureProviderEvents.ProviderConfigurationChanged(), + OpenFeatureProviderEvents.ProviderStale() ) ) @@ -245,22 +254,27 @@ class MultiProviderTests { val a = FakeEventProvider( name = "A", eventsToEmitOnInit = listOf( - OpenFeatureProviderEvents.ProviderConfigurationChanged, + OpenFeatureProviderEvents.ProviderConfigurationChanged(), OpenFeatureProviderEvents.ProviderNotReady ) ) val b = FakeEventProvider( name = "B", eventsToEmitOnInit = listOf( - OpenFeatureProviderEvents.ProviderConfigurationChanged, - OpenFeatureProviderEvents.ProviderError(OpenFeatureError.GeneralError("e")) + OpenFeatureProviderEvents.ProviderConfigurationChanged(), + OpenFeatureProviderEvents.ProviderError( + OpenFeatureProviderEvents.EventDetails( + message = "e", + errorCode = dev.openfeature.kotlin.sdk.exceptions.ErrorCode.GENERAL + ) + ) ) ) val c = FakeEventProvider( name = "C", eventsToEmitOnInit = listOf( - OpenFeatureProviderEvents.ProviderConfigurationChanged, - OpenFeatureProviderEvents.ProviderStale + OpenFeatureProviderEvents.ProviderConfigurationChanged(), + OpenFeatureProviderEvents.ProviderStale() ) ) val multi = MultiProvider(listOf(a, b, c)) @@ -278,9 +292,9 @@ class MultiProviderTests { val provider = FakeEventProvider( name = "A", eventsToEmitOnInit = listOf( - OpenFeatureProviderEvents.ProviderReady, - OpenFeatureProviderEvents.ProviderReady, - OpenFeatureProviderEvents.ProviderStale + OpenFeatureProviderEvents.ProviderReady(), + OpenFeatureProviderEvents.ProviderReady(), + OpenFeatureProviderEvents.ProviderStale() ) ) val multi = MultiProvider(listOf(provider)) @@ -297,7 +311,10 @@ class MultiProviderTests { val nonConfig = collected.filter { it !is OpenFeatureProviderEvents.ProviderConfigurationChanged } // Should only emit Ready once (transition) and Stale once (transition) assertEquals( - listOf(OpenFeatureProviderEvents.ProviderReady, OpenFeatureProviderEvents.ProviderStale), + listOf( + OpenFeatureProviderEvents.ProviderReady(), + OpenFeatureProviderEvents.ProviderStale() + ), nonConfig ) } @@ -307,8 +324,8 @@ class MultiProviderTests { val provider = FakeEventProvider( name = "A", eventsToEmitOnInit = listOf( - OpenFeatureProviderEvents.ProviderConfigurationChanged, - OpenFeatureProviderEvents.ProviderConfigurationChanged + OpenFeatureProviderEvents.ProviderConfigurationChanged(), + OpenFeatureProviderEvents.ProviderConfigurationChanged() ) ) val multi = MultiProvider(listOf(provider))