diff --git a/docs/reference/technologies/client/kotlin.mdx b/docs/reference/technologies/client/kotlin.mdx index b57e6a0c3..296ab0f41 100644 --- a/docs/reference/technologies/client/kotlin.mdx +++ b/docs/reference/technologies/client/kotlin.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from kotlin-sdk. Edits should be made here: https://github.com/open-feature/kotlin-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:29 GMT+0000 (Coordinated Universal Time) -->

diff --git a/docs/reference/technologies/client/swift.mdx b/docs/reference/technologies/client/swift.mdx index b209a9f36..69533318e 100644 --- a/docs/reference/technologies/client/swift.mdx +++ b/docs/reference/technologies/client/swift.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from swift-sdk. Edits should be made here: https://github.com/open-feature/swift-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:29 GMT+0000 (Coordinated Universal Time) -->

diff --git a/docs/reference/technologies/client/web/angular.mdx b/docs/reference/technologies/client/web/angular.mdx index 0c17144a6..9f58c47e0 100644 --- a/docs/reference/technologies/client/web/angular.mdx +++ b/docs/reference/technologies/client/web/angular.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from js-sdk. Edits should be made here: https://github.com/open-feature/js-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:29 GMT+0000 (Coordinated Universal Time) -->

@@ -18,8 +18,8 @@ Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) Specification - - Release + + Release
diff --git a/docs/reference/technologies/client/web/index.mdx b/docs/reference/technologies/client/web/index.mdx index dc868d7f4..6bdb50707 100644 --- a/docs/reference/technologies/client/web/index.mdx +++ b/docs/reference/technologies/client/web/index.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from js-sdk. Edits should be made here: https://github.com/open-feature/js-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:28 GMT+0000 (Coordinated Universal Time) -->

@@ -18,8 +18,8 @@ Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) Specification - - Release + + Release
@@ -106,6 +106,7 @@ See [here](https://open-feature.github.io/js-sdk/modules/_openfeature_web_sdk.ht | ✅ | [Tracking](#tracking) | Associate user actions with feature flag evaluations, particularly for A/B testing. | | ✅ | [Shutdown](#shutdown) | Gracefully clean up a provider during application shutdown. | | ✅ | [Extending](#extending) | Extend OpenFeature with custom providers and hooks. | +| ✅ | [Multi-Provider](#multi-provider) | Combine multiple providers with configurable evaluation strategies. | Implemented: ✅ | In-progress: ⚠️ | Not implemented yet: ❌ @@ -142,6 +143,63 @@ Once the provider has been registered, the status can be tracked using [events]( In some situations, it may be beneficial to register multiple providers in the same application. This is possible using [domains](#domains), which is covered in more detail below. +#### Multi-Provider + +The Multi-Provider allows you to use multiple underlying providers as sources of flag data for the OpenFeature web SDK. When a flag is being evaluated, the Multi-Provider will consult each underlying provider it is managing in order to determine the final result. Different evaluation strategies can be defined to control which providers get evaluated and which result is used. + +The Multi-Provider is a powerful tool for performing migrations between flag providers, or combining multiple providers into a single feature flagging interface. For example: + +- **Migration**: When migrating between two providers, you can run both in parallel under a unified flagging interface. As flags are added to the new provider, the Multi-Provider will automatically find and return them, falling back to the old provider if the new provider does not have the flag. +- **Multiple Data Sources**: The Multi-Provider allows you to seamlessly combine many sources of flagging data, such as environment variables, local files, database values and SaaS hosted feature management systems. + +```ts +import { MultiProvider } from '@openfeature/web-sdk'; + +const multiProvider = new MultiProvider([ + { provider: new ProviderA() }, + { provider: new ProviderB() } +]); + +await OpenFeature.setProviderAndWait(multiProvider); + +const client = OpenFeature.getClient(); +console.log(client.getBooleanDetails("my-flag", false)); +``` + +By default, the Multi-Provider will evaluate all underlying providers in order and return the first successful result. If a provider indicates it does not have a flag (FLAG_NOT_FOUND error code), then it will be skipped and the next provider will be evaluated. + +##### Evaluation Strategies + +The Multi-Provider comes with three strategies out of the box: + +- **FirstMatchStrategy** (default): Evaluates all providers in order and returns the first successful result. Providers that indicate FLAG_NOT_FOUND error will be skipped and the next provider will be evaluated. +- **FirstSuccessfulStrategy**: Evaluates all providers in order and returns the first successful result. Any error will cause that provider to be skipped. +- **ComparisonStrategy**: Evaluates all providers sequentially. If every provider returns a successful result with the same value, then that result is returned. Otherwise, the result returned by the configured "fallback provider" will be used. + +```ts +import { MultiProvider, FirstSuccessfulStrategy } from '@openfeature/web-sdk'; + +const multiProvider = new MultiProvider( + [ + { provider: new ProviderA() }, + { provider: new ProviderB() } + ], + new FirstSuccessfulStrategy() +); +``` + +##### Tracking Support + +The Multi-Provider supports tracking events across multiple providers, allowing you to send analytics events to all configured providers simultaneously: + +```ts +// Tracked events will be sent to all providers by default +client.track('user-conversion', { + value: 99.99, + currency: 'USD' +}); +``` + ### Flag evaluation flow When a new provider is added to OpenFeature client the following process happens: diff --git a/docs/reference/technologies/client/web/react.mdx b/docs/reference/technologies/client/web/react.mdx index 09a753ccb..a10bdf5b8 100644 --- a/docs/reference/technologies/client/web/react.mdx +++ b/docs/reference/technologies/client/web/react.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from js-sdk. Edits should be made here: https://github.com/open-feature/js-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:28 GMT+0000 (Coordinated Universal Time) -->

diff --git a/docs/reference/technologies/server/dart.mdx b/docs/reference/technologies/server/dart.mdx index 4734b37e3..b1b2d5b2e 100644 --- a/docs/reference/technologies/server/dart.mdx +++ b/docs/reference/technologies/server/dart.mdx @@ -9,7 +9,7 @@ This content has been automatically generated from dart-server-sdk. Edits should be made here: https://github.com/open-feature/dart-server-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:29 GMT+0000 (Coordinated Universal Time) -->

diff --git a/docs/reference/technologies/server/dotnet.mdx b/docs/reference/technologies/server/dotnet.mdx index 225d25dd4..1d465ef73 100644 --- a/docs/reference/technologies/server/dotnet.mdx +++ b/docs/reference/technologies/server/dotnet.mdx @@ -10,13 +10,13 @@ This content has been automatically generated from dotnet-sdk. Edits should be made here: https://github.com/open-feature/dotnet-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:28 GMT+0000 (Coordinated Universal Time) --> [![Specification](https://img.shields.io/static/v1?label=specification&message=v0.8.0&color=yellow&style=for-the-badge)](https://github.com/open-feature/spec/releases/tag/v0.8.0) [ -![Release](https://img.shields.io/static/v1?label=release&message=v2.8.1&color=blue&style=for-the-badge) -](https://github.com/open-feature/dotnet-sdk/releases/tag/v2.8.1) +![Release](https://img.shields.io/static/v1?label=release&message=v2.9.0&color=blue&style=for-the-badge) +](https://github.com/open-feature/dotnet-sdk/releases/tag/v2.9.0) [![Slack](https://img.shields.io/badge/slack-%40cncf%2Fopenfeature-brightgreen?style=flat&logo=slack)](https://cloud-native.slack.com/archives/C0344AANLA1) [![Codecov](https://codecov.io/gh/open-feature/dotnet-sdk/branch/main/graph/badge.svg?token=MONAVJBXUJ)](https://codecov.io/gh/open-feature/dotnet-sdk) @@ -442,10 +442,12 @@ Built a new hook? [Let us know](https://github.com/open-feature/openfeature.dev/ ### Multi-Provider > [!NOTE] -> The Multi-Provider feature is currently experimental. Hooks and events are not supported at the moment. +> The Multi-Provider feature is currently experimental. The Multi-Provider enables the use of multiple underlying feature flag providers simultaneously, allowing different providers to be used for different flag keys or based on specific evaluation strategies. +The Multi-Provider supports provider hooks and executes them in accordance with the OpenFeature specification. Each provider's hooks are executed with context isolation, ensuring that context modifications by one provider's hooks do not affect other providers. + #### Basic Usage ```csharp @@ -523,23 +525,20 @@ The Multi-Provider supports two evaluation modes: #### Limitations -- **Hooks are not supported**: Multi-Provider does not currently support hook registration or execution -- **Events are not supported**: Provider events are not propagated from underlying providers -- **Experimental status**: The API may change in future releases +- **Experimental status**: The API may change in future releases For a complete example, see the [AspNetCore sample](https://github.com/open-feature/dotnet-sdk/blob/main/samples/AspNetCore/README.md) which demonstrates Multi-Provider usage. ### Dependency Injection > [!NOTE] -> The OpenFeature.DependencyInjection and OpenFeature.Hosting packages are currently experimental. They streamline the integration of OpenFeature within .NET applications, allowing for seamless configuration and lifecycle management of feature flag providers using dependency injection and hosting services. +> The OpenFeature.Hosting package is currently experimental. The Hosting package streamlines the integration of OpenFeature within .NET applications, allowing for seamless configuration and lifecycle management of feature flag providers using dependency injection and hosting services. #### Installation -To set up dependency injection and hosting capabilities for OpenFeature, install the following packages: +To set up dependency injection and hosting capabilities for OpenFeature, install the following package: ```sh -dotnet add package OpenFeature.DependencyInjection dotnet add package OpenFeature.Hosting ``` @@ -552,7 +551,6 @@ For a basic configuration, you can use the InMemoryProvider. This provider is si ```csharp builder.Services.AddOpenFeature(featureBuilder => { featureBuilder - .AddHostedFeatureLifecycle() // From Hosting package .AddInMemoryProvider(); }); ``` @@ -574,7 +572,6 @@ builder.Services.AddOpenFeature(featureBuilder => { ```csharp builder.Services.AddOpenFeature(featureBuilder => { featureBuilder - .AddHostedFeatureLifecycle() .AddContext((contextBuilder, serviceProvider) => { /* Custom context configuration */ }) .AddHook((serviceProvider) => new LoggingHook( /* Custom configuration */ )) .AddHook(new MetricsHook()) diff --git a/docs/reference/technologies/server/go.mdx b/docs/reference/technologies/server/go.mdx index dcedcaf92..3c7805231 100644 --- a/docs/reference/technologies/server/go.mdx +++ b/docs/reference/technologies/server/go.mdx @@ -9,7 +9,7 @@ This content has been automatically generated from go-sdk. Edits should be made here: https://github.com/open-feature/go-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:28 GMT+0000 (Coordinated Universal Time) -->

@@ -114,7 +114,8 @@ openfeature.SetProviderAndWait(MyProvider{}) ``` In some situations, it may be beneficial to register multiple providers in the same application. -This is possible using [domains](#domains), which is covered in more details below. +This is possible using [domains](#domains), which is covered in more details below, or the included [multiprovider](#multi-provider-implementation) +implementation. ### Targeting @@ -326,6 +327,11 @@ tCtx := openfeature.MergeTransactionContext(ctx, openfeature.EvaluationContext{} client.BooleanValue(tCtx, ....) ``` +### Multi-Provider Implementation + +Included with this SDK is an _experimental_ multi-provider that can be used to query multiple feature flag providers simultaneously. +More information can be found in the [multi package's README](https://github.com/open-feature/go-sdk/blob/main/openfeature/multi/README.md). + ## Extending ### Develop a provider diff --git a/docs/reference/technologies/server/java.mdx b/docs/reference/technologies/server/java.mdx index f73a345a5..c5e78d25a 100644 --- a/docs/reference/technologies/server/java.mdx +++ b/docs/reference/technologies/server/java.mdx @@ -9,7 +9,7 @@ This content has been automatically generated from java-sdk. Edits should be made here: https://github.com/open-feature/java-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:44 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:27 GMT+0000 (Coordinated Universal Time) -->

@@ -18,8 +18,8 @@ Last updated at Mon Oct 06 2025 08:10:44 GMT+0000 (Coordinated Universal Time) - - Release + + Release @@ -54,7 +54,7 @@ Note that this library is intended to be used in server-side contexts and has no dev.openfeature sdk - 1.18.1 + 1.18.2 ``` @@ -77,7 +77,7 @@ If you would like snapshot builds, this is the relevant repository information: ```groovy dependencies { - implementation 'dev.openfeature:sdk:1.18.1' + implementation 'dev.openfeature:sdk:1.18.2' } ``` diff --git a/docs/reference/technologies/server/javascript/index.mdx b/docs/reference/technologies/server/javascript/index.mdx index 6f3cd47f3..cd101286e 100644 --- a/docs/reference/technologies/server/javascript/index.mdx +++ b/docs/reference/technologies/server/javascript/index.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from js-sdk. Edits should be made here: https://github.com/open-feature/js-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:44 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:27 GMT+0000 (Coordinated Universal Time) -->

@@ -18,8 +18,8 @@ Last updated at Mon Oct 06 2025 08:10:44 GMT+0000 (Coordinated Universal Time) Specification - - Release + + Release
@@ -107,6 +107,7 @@ See [here](https://open-feature.github.io/js-sdk/modules/_openfeature_server_sdk | ✅ | [Tracking](#tracking) | Associate user actions with feature flag evaluations, particularly for A/B testing. | | ✅ | [Shutdown](#shutdown) | Gracefully clean up a provider during application shutdown. | | ✅ | [Extending](#extending) | Extend OpenFeature with custom providers and hooks. | +| ✅ | [Multi-Provider](#multi-provider) | Combine multiple providers with configurable evaluation strategies. | Implemented: ✅ | In-progress: ⚠️ | Not implemented yet: ❌ @@ -137,7 +138,83 @@ OpenFeature.setProvider(new MyProvider()); Once the provider has been registered, the status can be tracked using [events](#eventing). In some situations, it may be beneficial to register multiple providers in the same application. -This is possible using [domains](#domains), which is covered in more details below. +This is possible using [domains](#domains), which is covered in more detail below. + +#### Multi-Provider + +The Multi-Provider allows you to use multiple underlying providers as sources of flag data for the OpenFeature server SDK. When a flag is being evaluated, the Multi-Provider will consult each underlying provider it is managing in order to determine the final result. Different evaluation strategies can be defined to control which providers get evaluated and which result is used. + +The Multi-Provider is a powerful tool for performing migrations between flag providers, or combining multiple providers into a single feature flagging interface. For example: + +- **Migration**: Gradually migrate from one provider to another by serving some flags from your old provider and some from your new provider +- **Backup**: Use one provider as a backup for another in case of failures +- **Comparison**: Compare results from multiple providers to validate consistency +- **Hybrid**: Combine multiple providers to leverage different strengths (e.g., one for simple flags, another for complex targeting) + +```ts +import { OpenFeature, MultiProvider, FirstMatchStrategy } from '@openfeature/server-sdk'; + +// Create providers +const primaryProvider = new YourPrimaryProvider(); +const backupProvider = new YourBackupProvider(); + +// Create multi-provider with a strategy +const multiProvider = new MultiProvider( + [primaryProvider, backupProvider], + new FirstMatchStrategy() +); + +// Register the multi-provider +await OpenFeature.setProviderAndWait(multiProvider); + +// Use as normal +const client = OpenFeature.getClient(); +const value = await client.getBooleanValue('my-flag', false); +``` + +**Available Strategies:** + +- `FirstMatchStrategy`: Returns the first successful result from the list of providers +- `ComparisonStrategy`: Compares results from multiple providers and can handle discrepancies + +**Migration Example:** + +```ts +import { OpenFeature, MultiProvider, FirstMatchStrategy } from '@openfeature/server-sdk'; + +// During migration, serve some flags from the new provider and fallback to the old one +const newProvider = new NewFlagProvider(); +const oldProvider = new OldFlagProvider(); + +const multiProvider = new MultiProvider( + [newProvider, oldProvider], // New provider is consulted first + new FirstMatchStrategy() +); + +await OpenFeature.setProviderAndWait(multiProvider); +``` + +**Comparison Example:** + +```ts +import { OpenFeature, MultiProvider, ComparisonStrategy } from '@openfeature/server-sdk'; + +// Compare results from two providers for validation +const providerA = new ProviderA(); +const providerB = new ProviderB(); + +const multiProvider = new MultiProvider( + [ + { provider: providerA }, + { provider: providerB } + ], + new ComparisonStrategy(providerA, (resolutions) => { + console.warn('Mismatch detected', resolutions); + }) +); + +await OpenFeature.setProviderAndWait(multiProvider); +``` ### Targeting diff --git a/docs/reference/technologies/server/javascript/nestjs.mdx b/docs/reference/technologies/server/javascript/nestjs.mdx index e93b603d3..df48b8859 100644 --- a/docs/reference/technologies/server/javascript/nestjs.mdx +++ b/docs/reference/technologies/server/javascript/nestjs.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from js-sdk. Edits should be made here: https://github.com/open-feature/js-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:28 GMT+0000 (Coordinated Universal Time) -->

diff --git a/docs/reference/technologies/server/php.mdx b/docs/reference/technologies/server/php.mdx index 45e72ea7b..673d63d68 100644 --- a/docs/reference/technologies/server/php.mdx +++ b/docs/reference/technologies/server/php.mdx @@ -9,7 +9,7 @@ This content has been automatically generated from php-sdk. Edits should be made here: https://github.com/open-feature/php-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:28 GMT+0000 (Coordinated Universal Time) -->

diff --git a/docs/reference/technologies/server/python.mdx b/docs/reference/technologies/server/python.mdx index f39a79d5f..0fcc20ddb 100644 --- a/docs/reference/technologies/server/python.mdx +++ b/docs/reference/technologies/server/python.mdx @@ -9,7 +9,7 @@ This content has been automatically generated from python-sdk. Edits should be made here: https://github.com/open-feature/python-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:28 GMT+0000 (Coordinated Universal Time) -->

diff --git a/docs/reference/technologies/server/ruby.mdx b/docs/reference/technologies/server/ruby.mdx index 8ea111140..21b2f7f5c 100644 --- a/docs/reference/technologies/server/ruby.mdx +++ b/docs/reference/technologies/server/ruby.mdx @@ -10,7 +10,7 @@ This content has been automatically generated from ruby-sdk. Edits should be made here: https://github.com/open-feature/ruby-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:29 GMT+0000 (Coordinated Universal Time) -->

diff --git a/docs/reference/technologies/server/rust.mdx b/docs/reference/technologies/server/rust.mdx index 78a2e85a1..c888134bc 100644 --- a/docs/reference/technologies/server/rust.mdx +++ b/docs/reference/technologies/server/rust.mdx @@ -9,7 +9,7 @@ This content has been automatically generated from rust-sdk. Edits should be made here: https://github.com/open-feature/rust-sdk Once a repo has been updated, docs can be generated by running: yarn update:sdk-docs -Last updated at Mon Oct 06 2025 08:10:45 GMT+0000 (Coordinated Universal Time) +Last updated at Mon Oct 27 2025 08:11:29 GMT+0000 (Coordinated Universal Time) -->

diff --git a/src/datasets/sdks/sdk-compatibility.json b/src/datasets/sdks/sdk-compatibility.json index 024011438..b2f3f74e1 100644 --- a/src/datasets/sdks/sdk-compatibility.json +++ b/src/datasets/sdks/sdk-compatibility.json @@ -4,8 +4,8 @@ "path": "/docs/reference/technologies/server/java", "category": "Server", "release": { - "href": "https://github.com/open-feature/java-sdk/releases/tag/v1.18.1", - "version": "1.18.1", + "href": "https://github.com/open-feature/java-sdk/releases/tag/v1.18.2", + "version": "1.18.2", "stable": true }, "spec": { @@ -60,8 +60,8 @@ "path": "/docs/reference/technologies/server/javascript", "category": "Server", "release": { - "href": "https://github.com/open-feature/js-sdk/releases/tag/server-sdk-v1.19.0", - "version": "1.19.0", + "href": "https://github.com/open-feature/js-sdk/releases/tag/server-sdk-v1.20.0", + "version": "1.20.0", "stable": true }, "spec": { @@ -116,8 +116,8 @@ "path": "/docs/reference/technologies/server/dotnet", "category": "Server", "release": { - "href": "https://github.com/open-feature/dotnet-sdk/releases/tag/v2.8.1", - "version": "2.8.1", + "href": "https://github.com/open-feature/dotnet-sdk/releases/tag/v2.9.0", + "version": "2.9.0", "stable": true }, "spec": { @@ -340,8 +340,8 @@ "path": "/docs/reference/technologies/client/web", "category": "Client", "release": { - "href": "https://github.com/open-feature/js-sdk/releases/tag/web-sdk-v1.6.2", - "version": "1.6.2", + "href": "https://github.com/open-feature/js-sdk/releases/tag/web-sdk-v1.7.0", + "version": "1.7.0", "stable": true }, "spec": {