open-feature / java-sdk

Java implementation of the OpenFeature SDK
https://openfeature.dev
Apache License 2.0
72 stars 34 forks source link

[FEATURE] Make provider interface "stateless", SDK maintains provider state #844

Open toddbaert opened 3 months ago

toddbaert commented 3 months ago

Stateless providers

Providers no longer maintain their own state: the state for each provider is maintained in the SDK automatically, and updated according to the success/failures of lifecycle methods (init/shutdown) or events emitted from providers spontaneously.

Similar work in C#: https://github.com/open-feature/dotnet-sdk/pull/276

### Tasks
- [ ] [Requirement 1.7.1](https://openfeature.dev/specification/sections/flag-evaluation#requirement-171): The client MUST define a provider status accessor which indicates the readiness of the associated provider, with possible values NOT_READY, READY, STALE, ERROR, or FATAL.
- [ ] [Requirement 1.7.3](https://openfeature.dev/specification/sections/flag-evaluation#requirement-173): The client's provider status accessor MUST indicate READY if the initialize function of the associated provider terminates normally.
- [ ] [Requirement 1.7.4](https://openfeature.dev/specification/sections/flag-evaluation#requirement-174): The client's provider status accessor MUST indicate ERROR if the initialize function of the associated provider terminates abnormally.
- [ ] [Requirement 1.7.5](https://openfeature.dev/specification/sections/flag-evaluation#requirement-175): The client's provider status accessor MUST indicate FATAL if the initialize function of the associated provider terminates abnormally and indicates error code PROVIDER_FATAL.
- [ ] [Requirement 1.7.6](https://openfeature.dev/specification/sections/flag-evaluation#requirement-176): The client MUST default, run error hooks, and indicate an error if flag resolution is attempted while the provider is in NOT_READY.
- [ ] [Requirement 1.7.7](https://openfeature.dev/specification/sections/flag-evaluation#requirement-177): The client MUST default, run error hooks, and indicate an error if flag resolution is attempted while the provider is in FATAL.
- [ ] [Requirement 1.7.8](https://openfeature.dev/specification/sections/flag-evaluation#requirement-178): Implementations SHOULD propagate the error code returned from any provider lifecycle methods.
- [ ] [Requirement 5.1.5](https://openfeature.dev/specification/sections/events#requirement-515): PROVIDER_ERROR events SHOULD populate the provider event details's error code field.
- [ ] [Requirement 5.3.5](https://openfeature.dev/specification/sections/events#requirement-535): If the provider emits an event, the value of the client's provider status MUST be updated accordingly.
gunishmatta commented 1 month ago

Hi @toddbaert I would like to work on this.

beeme1mr commented 1 month ago

Thanks, @gunishmatta, I've assigned you the issue. Please let us know if you have any questions!

toddbaert commented 1 month ago

@gunishmatta here's the implementation I did in the JS SDK: https://github.com/open-feature/js-sdk/pull/795.

You can disregard the RECONCILING stuff - that only applies to client-side SDKs, which Java is not. The relevant stuff is all around the ProviderState. I used an internal wrapper class for this: https://github.com/open-feature/js-sdk/pull/795/files#diff-918e59c039e8a552dd77bdf93d9759acc86f58f677bf52e7a0990ff92683ef11R25, but take whatever approach you want.

gunishmatta commented 1 month ago

@toddbaert Thanks a lot for the guidance, you can expect my PR by end of this week.

Thanks Gunish.