@@ -26,31 +26,38 @@ import {
2626import deepMerge from 'deepmerge' ;
2727import { filter , switchMap , startWith , Subject , BehaviorSubject , pairwise , takeUntil } from 'rxjs' ;
2828import { get } from 'lodash' ;
29+ import type { InitialFeatureFlagsGetter } from '@kbn/core-feature-flags-server/src/contracts' ;
2930import { createOpenFeatureLogger } from './create_open_feature_logger' ;
3031import { setProviderWithRetries } from './set_provider_with_retries' ;
3132import { type FeatureFlagsConfig , featureFlagsConfig } from './feature_flags_config' ;
3233
3334/**
3435 * Core-internal contract for the setup lifecycle step.
35- * @private
36+ * @internal
3637 */
3738export interface InternalFeatureFlagsSetup extends FeatureFlagsSetup {
3839 /**
3940 * Used by the rendering service to share the overrides with the service on the browser side.
4041 */
4142 getOverrides : ( ) => Record < string , unknown > ;
43+ /**
44+ * Required to bootstrap the browser-side OpenFeature client with a seed of the feature flags for faster load-times
45+ * and to work-around air-gapped environments.
46+ */
47+ getInitialFeatureFlags : ( ) => Promise < Record < string , unknown > > ;
4248}
4349
4450/**
4551 * The server-side Feature Flags Service
46- * @private
52+ * @internal
4753 */
4854export class FeatureFlagsService {
4955 private readonly featureFlagsClient : Client ;
5056 private readonly logger : Logger ;
5157 private readonly stop$ = new Subject < void > ( ) ;
5258 private readonly overrides$ = new BehaviorSubject < Record < string , unknown > > ( { } ) ;
5359 private context : MultiContextEvaluationContext = { kind : 'multi' } ;
60+ private initialFeatureFlagsGetter : InitialFeatureFlagsGetter = async ( ) => ( { } ) ;
5461
5562 /**
5663 * The core service's constructor
@@ -77,6 +84,10 @@ export class FeatureFlagsService {
7784
7885 return {
7986 getOverrides : ( ) => this . overrides$ . value ,
87+ getInitialFeatureFlags : ( ) => this . initialFeatureFlagsGetter ( ) ,
88+ setInitialFeatureFlagsGetter : ( getter : InitialFeatureFlagsGetter ) => {
89+ this . initialFeatureFlagsGetter = getter ;
90+ } ,
8091 setProvider : ( provider ) => {
8192 if ( OpenFeature . providerMetadata !== NOOP_PROVIDER . metadata ) {
8293 throw new Error ( 'A provider has already been set. This API cannot be called twice.' ) ;
@@ -175,7 +186,7 @@ export class FeatureFlagsService {
175186 * @param evaluationFn The actual evaluation API
176187 * @param flagName The name of the flag to evaluate
177188 * @param fallbackValue The fallback value
178- * @private
189+ * @internal
179190 */
180191 private async evaluateFlag < T extends string | boolean | number > (
181192 evaluationFn : ( flagName : string , fallbackValue : T ) => Promise < T > ,
@@ -196,7 +207,7 @@ export class FeatureFlagsService {
196207 /**
197208 * Formats the provided context to fulfill the expected multi-context structure.
198209 * @param contextToAppend The {@link EvaluationContext} to append.
199- * @private
210+ * @internal
200211 */
201212 private appendContext ( contextToAppend : EvaluationContext ) : void {
202213 // If no kind provided, default to the project|deployment level.
0 commit comments