Skip to content

Commit bbab739

Browse files
authored
feat!: Remove deprecated ProviderNotReady event (#239)
Signed-off-by: Max Pinheiro <max.pinheiro@fluxon.com>
1 parent 134f97d commit bbab739

10 files changed

Lines changed: 76 additions & 90 deletions

File tree

docs/multiprovider/README.md

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
Combine multiple `FeatureProvider`s into a single provider with deterministic ordering, pluggable evaluation strategies, and unified status/event handling.
44

55
### Why use MultiProvider?
6+
67
- **Layer providers**: fall back from an in-memory or experiment provider to a remote provider.
78
- **Migrate safely**: put the new provider first, retain the old as fallback.
89
- **Handle errors predictably**: choose whether errors should short-circuit or be skipped.
910

1011
This implementation is adapted for Kotlin coroutines, flows, and OpenFeature error types.
1112

1213
### Quick start
14+
1315
```kotlin
1416
import dev.openfeature.kotlin.sdk.OpenFeatureAPI
1517
import dev.openfeature.kotlin.sdk.multiprovider.MultiProvider
@@ -35,6 +37,7 @@ val enabled = client.getBooleanValue("new-ui", defaultValue = false)
3537
```
3638

3739
### How it works (at a glance)
40+
3841
- The `MultiProvider` delegates each evaluation to its child providers in the order you supply.
3942
- A pluggable `Strategy` decides which child result to return.
4043
- Provider events are observed and converted into a single aggregate SDK status.
@@ -46,21 +49,23 @@ val enabled = client.getBooleanValue("new-ui", defaultValue = false)
4649
- Returns the first child result that is not "flag not found".
4750
- If a child returns an error other than `FLAG_NOT_FOUND`, that error is returned immediately.
4851
- If all children report `FLAG_NOT_FOUND`, the default value is returned with reason `DEFAULT`.
49-
5052
- **FirstSuccessfulStrategy**
5153
- Skips over errors from children and continues to the next provider.
5254
- Returns the first successful evaluation (no error code).
5355
- If no provider succeeds, the default value is returned with `FLAG_NOT_FOUND`.
5456

5557
Pick the strategy that best matches your failure-policy:
58+
5659
- Prefer early, explicit error surfacing: use `FirstMatchStrategy`.
5760
- Prefer resilience and best-effort success: use `FirstSuccessfulStrategy`.
5861

5962
### Evaluation order matters
63+
6064
Children are evaluated in the order provided. Put the most authoritative or fastest provider first. For example, place a small in-memory override provider before a remote provider to reduce latency.
6165

6266
### Events and status aggregation
63-
`MultiProvider` listens to child provider events and emits a single, aggregate status via `OpenFeatureAPI.statusFlow`. The highest-precedence status among children wins:
67+
68+
`MultiProvider` listens to child provider events and emits a single, aggregate status via `OpenFeatureAPI.statusFlow`. Per the OpenFeature specification: a child stays `NOT_READY` until it emits `PROVIDER_READY`, `PROVIDER_ERROR`, or `PROVIDER_STALE` (or only `PROVIDER_CONFIGURATION_CHANGED`, which does not change readiness). The highest-precedence status among children wins:
6469

6570
1. Fatal
6671
2. NotReady
@@ -71,27 +76,34 @@ Children are evaluated in the order provided. Put the most authoritative or fast
7176
`ProviderConfigurationChanged` is re-emitted as-is. When the aggregate status changes due to a child event, the original triggering event is also emitted.
7277

7378
### Context propagation
79+
7480
When the evaluation context changes, `MultiProvider` calls `onContextSet` on all child providers concurrently. Aggregate status transitions to Reconciling and then back to Ready (or Error) in line with SDK behavior.
7581

7682
### Provider metadata
83+
7784
`MultiProvider.metadata` exposes:
85+
7886
- `name = "multiprovider"`
7987
- `originalMetadata`: a map of child-name → child `ProviderMetadata`
8088

8189
Child names are derived from each provider’s `metadata.name`. If duplicates occur, stable suffixes are applied (e.g., `myProvider_1`, `myProvider_2`).
8290

8391
Example: inspect provider metadata
92+
8493
```kotlin
8594
val meta = OpenFeatureAPI.getProviderMetadata()
8695
println(meta?.name) // "multiprovider"
8796
println(meta?.originalMetadata) // map of child names to their metadata
8897
```
8998

9099
### Shutdown behavior
100+
91101
`shutdown()` is invoked on all children. If any child fails to shut down, an aggregated error is thrown that includes all individual failures. Resources should be released in child providers even if peers fail.
92102

93103
### Custom strategies
104+
94105
You can provide your own composition policy by implementing `MultiProvider.Strategy`:
106+
95107
```kotlin
96108
import dev.openfeature.kotlin.sdk.*
97109
import dev.openfeature.kotlin.sdk.multiprovider.MultiProvider
@@ -119,8 +131,7 @@ val multi = MultiProvider(listOf(experiments, remote), strategy = MyStrategy())
119131
```
120132

121133
### Notes and limitations
134+
122135
- Hooks on `MultiProvider` are currently not applied.
123136
- Ensure each child’s `metadata.name` is set for clearer diagnostics in `originalMetadata`.
124137

125-
126-

kotlin-sdk/api/android/kotlin-sdk.api

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -719,28 +719,17 @@ public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$P
719719

720720
public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents {
721721
public fun <init> ()V
722-
public fun <init> (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;)V
723-
public synthetic fun <init> (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
722+
public fun <init> (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)V
723+
public synthetic fun <init> (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
724724
public final fun component1 ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;
725-
public final fun component2 ()Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;
726-
public final fun copy (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError;
727-
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;
725+
public final fun copy (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError;
726+
public static synthetic fun copy$default (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError;Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILjava/lang/Object;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError;
728727
public fun equals (Ljava/lang/Object;)Z
729-
public final fun getError ()Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;
730728
public fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;
731729
public fun hashCode ()I
732730
public fun toString ()Ljava/lang/String;
733731
}
734732

735-
public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderNotReady : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents {
736-
public static final field INSTANCE Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderNotReady;
737-
public fun equals (Ljava/lang/Object;)Z
738-
public synthetic fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;
739-
public fun getEventDetails ()Ljava/lang/Void;
740-
public fun hashCode ()I
741-
public fun toString ()Ljava/lang/String;
742-
}
743-
744733
public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderReady : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents {
745734
public fun <init> ()V
746735
public fun <init> (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)V

kotlin-sdk/api/jvm/kotlin-sdk.api

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -719,28 +719,17 @@ public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$P
719719

720720
public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents {
721721
public fun <init> ()V
722-
public fun <init> (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;)V
723-
public synthetic fun <init> (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
722+
public fun <init> (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)V
723+
public synthetic fun <init> (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
724724
public final fun component1 ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;
725-
public final fun component2 ()Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;
726-
public final fun copy (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError;
727-
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;
725+
public final fun copy (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError;
726+
public static synthetic fun copy$default (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError;Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;ILjava/lang/Object;)Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderError;
728727
public fun equals (Ljava/lang/Object;)Z
729-
public final fun getError ()Ldev/openfeature/kotlin/sdk/exceptions/OpenFeatureError;
730728
public fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;
731729
public fun hashCode ()I
732730
public fun toString ()Ljava/lang/String;
733731
}
734732

735-
public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderNotReady : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents {
736-
public static final field INSTANCE Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderNotReady;
737-
public fun equals (Ljava/lang/Object;)Z
738-
public synthetic fun getEventDetails ()Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;
739-
public fun getEventDetails ()Ljava/lang/Void;
740-
public fun hashCode ()I
741-
public fun toString ()Ljava/lang/String;
742-
}
743-
744733
public final class dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$ProviderReady : dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents {
745734
public fun <init> ()V
746735
public fun <init> (Ldev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents$EventDetails;)V

kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/events/OpenFeatureProviderEvents.kt

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package dev.openfeature.kotlin.sdk.events
33
import dev.openfeature.kotlin.sdk.OpenFeatureStatus
44
import dev.openfeature.kotlin.sdk.exceptions.ErrorCode
55
import dev.openfeature.kotlin.sdk.exceptions.OpenFeatureError
6-
import dev.openfeature.kotlin.sdk.exceptions.OpenFeatureError.ProviderFatalError
76

87
sealed class OpenFeatureProviderEvents {
98
data class EventDetails(
@@ -17,58 +16,48 @@ sealed class OpenFeatureProviderEvents {
1716

1817
/**
1918
* The provider is ready to perform flag evaluations.
19+
* [eventDetails] may supply [EventDetails.flagsChanged], [EventDetails.message], [EventDetails.errorCode], and [EventDetails.eventMetadata] as applicable.
2020
*/
2121
data class ProviderReady(
2222
override val eventDetails: EventDetails? = null
2323
) : OpenFeatureProviderEvents()
2424

2525
/**
2626
* The provider signaled an error.
27+
* [eventDetails] may supply [EventDetails.flagsChanged], [EventDetails.message], [EventDetails.errorCode], and [EventDetails.eventMetadata] as applicable.
2728
*/
2829
data class ProviderError(
29-
override val eventDetails: EventDetails? = null,
30-
@Deprecated("Please use eventDetails instead.") val error: OpenFeatureError? = null
30+
override val eventDetails: EventDetails? = null
3131
) : OpenFeatureProviderEvents()
3232

33+
/**
34+
* Configuration or flag definitions changed.
35+
* [eventDetails] may supply [EventDetails.flagsChanged], [EventDetails.message], [EventDetails.errorCode], and [EventDetails.eventMetadata] as applicable.
36+
*/
3337
data class ProviderConfigurationChanged(
3438
override val eventDetails: EventDetails? = null
3539
) : OpenFeatureProviderEvents()
3640

3741
/**
3842
* The provider's cached state is no longer valid and may not be up-to-date with the source of truth.
43+
* [eventDetails] may supply [EventDetails.flagsChanged], [EventDetails.message], [EventDetails.errorCode], and [EventDetails.eventMetadata] as applicable.
3944
*/
4045
data class ProviderStale(
4146
override val eventDetails: EventDetails? = null
4247
) : OpenFeatureProviderEvents()
43-
44-
@Deprecated("Use ProviderError instead", ReplaceWith("ProviderError"))
45-
data object ProviderNotReady : OpenFeatureProviderEvents() {
46-
override val eventDetails = null
47-
}
4848
}
4949

5050
internal fun OpenFeatureProviderEvents.ProviderError.toOpenFeatureStatusError(): OpenFeatureStatus {
51-
return when {
52-
eventDetails?.errorCode != null -> {
53-
val openFeatureError = OpenFeatureError.fromMessageAndErrorCode(
54-
errorMessage = eventDetails.message ?: "Provider did not supply an error message",
55-
errorCode = eventDetails.errorCode
56-
)
57-
if (eventDetails.errorCode == ErrorCode.PROVIDER_FATAL) {
58-
OpenFeatureStatus.Fatal(openFeatureError)
59-
} else {
60-
OpenFeatureStatus.Error(openFeatureError)
61-
}
62-
}
63-
64-
error != null -> { // Deprecated implementation
65-
if (error is ProviderFatalError) {
66-
OpenFeatureStatus.Fatal(error)
67-
} else {
68-
OpenFeatureStatus.Error(error)
69-
}
70-
}
71-
72-
else -> OpenFeatureStatus.Error(OpenFeatureError.GeneralError("Unspecified error"))
51+
val code = eventDetails?.errorCode ?: return OpenFeatureStatus.Error(
52+
OpenFeatureError.GeneralError(eventDetails?.message ?: "Unspecified error")
53+
)
54+
val openFeatureError = OpenFeatureError.fromMessageAndErrorCode(
55+
errorMessage = eventDetails.message ?: "Provider did not supply an error message",
56+
errorCode = code
57+
)
58+
return if (code == ErrorCode.PROVIDER_FATAL) {
59+
OpenFeatureStatus.Fatal(openFeatureError)
60+
} else {
61+
OpenFeatureStatus.Error(openFeatureError)
7362
}
7463
}

kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/exceptions/OpenFeatureError.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ sealed class OpenFeatureError : Exception() {
6363
companion object {
6464
internal fun fromMessageAndErrorCode(errorMessage: String, errorCode: ErrorCode): OpenFeatureError {
6565
return when (errorCode) {
66-
ErrorCode.PROVIDER_NOT_READY -> ProviderNotReadyError()
66+
ErrorCode.PROVIDER_NOT_READY -> ProviderNotReadyError(errorMessage)
6767
ErrorCode.FLAG_NOT_FOUND -> FlagNotFoundError(flagKey = null, errorMessage)
6868
ErrorCode.PARSE_ERROR -> ParseError(errorMessage)
6969
ErrorCode.TYPE_MISMATCH -> TypeMismatchError(errorMessage)

kotlin-sdk/src/commonMain/kotlin/dev/openfeature/kotlin/sdk/multiprovider/MultiProvider.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,6 @@ class MultiProvider(
210210
}
211211

212212
is OpenFeatureProviderEvents.ProviderReady -> OpenFeatureStatus.Ready
213-
is OpenFeatureProviderEvents.ProviderNotReady -> OpenFeatureStatus.NotReady
214213
is OpenFeatureProviderEvents.ProviderStale -> OpenFeatureStatus.Stale
215214
is OpenFeatureProviderEvents.ProviderError -> event.toOpenFeatureStatusError()
216215
}

kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/EventDetailsTests.kt

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,35 +41,42 @@ class EventDetailsTests {
4141
}
4242

4343
@Test
44-
fun providerErrorMapToFatal() {
44+
fun providerErrorEventDetailsMapToInvalidContextError() {
4545
val evt = OpenFeatureProviderEvents.ProviderError(
46-
error = OpenFeatureError.ProviderFatalError("message")
46+
OpenFeatureProviderEvents.EventDetails(
47+
message = "message",
48+
errorCode = ErrorCode.INVALID_CONTEXT
49+
)
4750
)
4851

4952
val status = evt.toOpenFeatureStatusError()
50-
val fatal = assertIs<OpenFeatureStatus.Fatal>(status)
51-
val err = assertIs<OpenFeatureError.ProviderFatalError>(fatal.error)
53+
val errorStatus = assertIs<OpenFeatureStatus.Error>(status)
54+
val err = assertIs<OpenFeatureError.InvalidContextError>(errorStatus.error)
5255
assertEquals("message", err.message)
5356
}
5457

5558
@Test
56-
fun providerErrorMapToError() {
57-
val evt = OpenFeatureProviderEvents.ProviderError(
58-
error = OpenFeatureError.InvalidContextError("message")
59-
)
59+
fun providerErrorMapToUnspecifiedError() {
60+
val evt = OpenFeatureProviderEvents.ProviderError()
6061

6162
val status = evt.toOpenFeatureStatusError()
62-
val fatal = assertIs<OpenFeatureStatus.Error>(status)
63-
val err = assertIs<OpenFeatureError.InvalidContextError>(fatal.error)
64-
assertEquals("message", err.message)
63+
val errorStatus = assertIs<OpenFeatureStatus.Error>(status)
64+
val err = assertIs<OpenFeatureError.GeneralError>(errorStatus.error)
65+
assertEquals("Unspecified error", err.message)
6566
}
6667

6768
@Test
68-
fun providerErrorMapToUnspecifiedError() {
69-
val evt = OpenFeatureProviderEvents.ProviderError()
69+
fun providerErrorEventDetailsWithMessageAndNullErrorCodeMapToGeneralError() {
70+
val evt = OpenFeatureProviderEvents.ProviderError(
71+
OpenFeatureProviderEvents.EventDetails(
72+
message = "test",
73+
errorCode = null
74+
)
75+
)
7076

7177
val status = evt.toOpenFeatureStatusError()
72-
val fatal = assertIs<OpenFeatureStatus.Error>(status)
73-
assertIs<OpenFeatureError.GeneralError>(fatal.error)
78+
val errorStatus = assertIs<OpenFeatureStatus.Error>(status)
79+
val err = assertIs<OpenFeatureError.GeneralError>(errorStatus.error)
80+
assertEquals("test", err.message)
7481
}
7582
}

kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/ProviderEventingTests.kt

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

33
import dev.openfeature.kotlin.sdk.events.OpenFeatureProviderEvents
4-
import dev.openfeature.kotlin.sdk.exceptions.OpenFeatureError
4+
import dev.openfeature.kotlin.sdk.exceptions.ErrorCode
55
import dev.openfeature.kotlin.sdk.helpers.DoSomethingProvider
66
import dev.openfeature.kotlin.sdk.helpers.OverlyEmittingProvider
77
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -44,8 +44,9 @@ class ProviderEventingTests {
4444
) {
4545
flow.emit(
4646
OpenFeatureProviderEvents.ProviderError(
47-
error = OpenFeatureError.ProviderNotReadyError(
48-
"test error"
47+
OpenFeatureProviderEvents.EventDetails(
48+
message = "test error",
49+
errorCode = ErrorCode.PROVIDER_NOT_READY
4950
)
5051
)
5152
)

kotlin-sdk/src/commonTest/kotlin/dev/openfeature/kotlin/sdk/helpers/AutoHealingProvider.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import dev.openfeature.kotlin.sdk.ProviderEvaluation
77
import dev.openfeature.kotlin.sdk.ProviderMetadata
88
import dev.openfeature.kotlin.sdk.Value
99
import dev.openfeature.kotlin.sdk.events.OpenFeatureProviderEvents
10+
import dev.openfeature.kotlin.sdk.exceptions.ErrorCode
1011
import dev.openfeature.kotlin.sdk.exceptions.OpenFeatureError
1112
import kotlinx.coroutines.delay
1213
import kotlinx.coroutines.flow.Flow
@@ -25,8 +26,9 @@ class AutoHealingProvider(
2526
ready = false
2627
_events.emit(
2728
OpenFeatureProviderEvents.ProviderError(
28-
error = OpenFeatureError.ProviderNotReadyError(
29-
"AutoHealingProvider got an error. trying to heal"
29+
OpenFeatureProviderEvents.EventDetails(
30+
message = "AutoHealingProvider got an error. trying to heal",
31+
errorCode = ErrorCode.PROVIDER_NOT_READY
3032
)
3133
)
3234
)

0 commit comments

Comments
 (0)