@@ -9,10 +9,11 @@ import { IKeyValueAdapter } from "./IKeyValueAdapter";
99import { JsonKeyValueAdapter } from "./JsonKeyValueAdapter" ;
1010import { DEFAULT_REFRESH_INTERVAL_IN_MS , MIN_REFRESH_INTERVAL_IN_MS } from "./RefreshOptions" ;
1111import { Disposable } from "./common/disposable" ;
12- import { FEATURE_FLAGS_KEY_NAME , FEATURE_MANAGEMENT_KEY_NAME } from "./featureManagement/constants" ;
12+ import { FEATURE_FLAGS_KEY_NAME , FEATURE_MANAGEMENT_KEY_NAME , CONDITIONS_KEY_NAME , CLIENT_FILTERS_KEY_NAME } from "./featureManagement/constants" ;
1313import { AzureKeyVaultKeyValueAdapter } from "./keyvault/AzureKeyVaultKeyValueAdapter" ;
1414import { RefreshTimer } from "./refresh/RefreshTimer" ;
1515import { getConfigurationSettingWithTrace , listConfigurationSettingsWithTrace , requestTracingEnabled } from "./requestTracing/utils" ;
16+ import { FeatureFlagTracing } from "./requestTracing/FeatureFlagTracing" ;
1617import { KeyFilter , LabelFilter , SettingSelector } from "./types" ;
1718
1819type PagedSettingSelector = SettingSelector & {
@@ -38,6 +39,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
3839 #client: AppConfigurationClient ;
3940 #options: AzureAppConfigurationOptions | undefined ;
4041 #isInitialLoadCompleted: boolean = false ;
42+ #featureFlagTracing: FeatureFlagTracing = new FeatureFlagTracing ( ) ;
4143
4244 // Refresh
4345 #refreshInterval: number = DEFAULT_REFRESH_INTERVAL_IN_MS ;
@@ -173,7 +175,8 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
173175 return {
174176 requestTracingEnabled : this . #requestTracingEnabled,
175177 initialLoadCompleted : this . #isInitialLoadCompleted,
176- appConfigOptions : this . #options
178+ appConfigOptions : this . #options,
179+ featureFlagTracingOptions : this . #featureFlagTracing
177180 } ;
178181 }
179182
@@ -255,8 +258,7 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
255258 }
256259
257260 async #loadFeatureFlags( ) {
258- // Temporary map to store feature flags, key is the key of the setting, value is the raw value of the setting
259- const featureFlagsMap = new Map < string , any > ( ) ;
261+ const featureFlagSettings : ConfigurationSetting [ ] = [ ] ;
260262 for ( const selector of this . #featureFlagSelectors) {
261263 const listOptions : ListConfigurationSettingsOptions = {
262264 keyFilter : `${ featureFlagPrefix } ${ selector . keyFilter } ` ,
@@ -273,15 +275,17 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
273275 pageEtags . push ( page . etag ?? "" ) ;
274276 for ( const setting of page . items ) {
275277 if ( isFeatureFlag ( setting ) ) {
276- featureFlagsMap . set ( setting . key , setting . value ) ;
278+ featureFlagSettings . push ( setting ) ;
277279 }
278280 }
279281 }
280282 selector . pageEtags = pageEtags ;
281283 }
282284
283285 // parse feature flags
284- const featureFlags = Array . from ( featureFlagsMap . values ( ) ) . map ( rawFlag => JSON . parse ( rawFlag ) ) ;
286+ const featureFlags = await Promise . all (
287+ featureFlagSettings . map ( setting => this . #parseFeatureFlag( setting ) )
288+ ) ;
285289
286290 // feature_management is a reserved key, and feature_flags is an array of feature flags
287291 this . #configMap. set ( FEATURE_MANAGEMENT_KEY_NAME , { [ FEATURE_FLAGS_KEY_NAME ] : featureFlags } ) ;
@@ -532,6 +536,18 @@ export class AzureAppConfigurationImpl implements AzureAppConfiguration {
532536 }
533537 return response ;
534538 }
539+
540+ async #parseFeatureFlag( setting : ConfigurationSetting < string > ) : Promise < any > {
541+ const rawFlag = setting . value ;
542+ if ( rawFlag === undefined ) {
543+ throw new Error ( "The value of configuration setting cannot be undefined." ) ;
544+ }
545+ const featureFlag = JSON . parse ( rawFlag ) ;
546+
547+
548+
549+ return featureFlag ;
550+ }
535551}
536552
537553function getValidSelectors ( selectors : SettingSelector [ ] ) : SettingSelector [ ] {
0 commit comments