@@ -8,27 +8,25 @@ import { IFeatureFlagProvider } from "./featureProvider.js";
88import { TargetingFilter } from "./filter/TargetingFilter.js" ;
99import { Variant } from "./variant/Variant.js" ;
1010import { IFeatureManager } from "./IFeatureManager.js" ;
11- import { ITargetingContext , TargetingContextAccessor } from "./common/targetingContext.js" ;
11+ import { ITargetingContext , ITargetingContextAccessor } from "./common/targetingContext.js" ;
1212import { isTargetedGroup , isTargetedPercentile , isTargetedUser } from "./common/targetingEvaluator.js" ;
1313
1414export class FeatureManager implements IFeatureManager {
15- #provider: IFeatureFlagProvider ;
16- #featureFilters: Map < string , IFeatureFilter > = new Map ( ) ;
17- #onFeatureEvaluated?: ( event : EvaluationResult ) => void ;
18- #targetingContextAccessor?: TargetingContextAccessor ;
15+ readonly #provider: IFeatureFlagProvider ;
16+ readonly #featureFilters: Map < string , IFeatureFilter > = new Map ( ) ;
17+ readonly #onFeatureEvaluated?: ( event : EvaluationResult ) => void ;
18+ readonly #targetingContextAccessor?: ITargetingContextAccessor ;
1919
2020 constructor ( provider : IFeatureFlagProvider , options ?: FeatureManagerOptions ) {
2121 this . #provider = provider ;
22+ this . #onFeatureEvaluated = options ?. onFeatureEvaluated ;
23+ this . #targetingContextAccessor = options ?. targetingContextAccessor ;
2224
23- const builtinFilters = [ new TimeWindowFilter ( ) , new TargetingFilter ( ) ] ;
24-
25+ const builtinFilters = [ new TimeWindowFilter ( ) , new TargetingFilter ( options ?. targetingContextAccessor ) ] ;
2526 // If a custom filter shares a name with an existing filter, the custom filter overrides the existing one.
2627 for ( const filter of [ ...builtinFilters , ...( options ?. customFilters ?? [ ] ) ] ) {
2728 this . #featureFilters. set ( filter . name , filter ) ;
2829 }
29-
30- this . #onFeatureEvaluated = options ?. onFeatureEvaluated ;
31- this . #targetingContextAccessor = options ?. targetingContextAccessor ;
3230 }
3331
3432 async listFeatureNames ( ) : Promise < string [ ] > {
@@ -104,19 +102,11 @@ export class FeatureManager implements IFeatureManager {
104102 for ( const clientFilter of clientFilters ) {
105103 const matchedFeatureFilter = this . #featureFilters. get ( clientFilter . name ) ;
106104 const contextWithFeatureName = { featureName : featureFlag . id , parameters : clientFilter . parameters } ;
107- let clientFilterEvaluationResult : boolean ;
108105 if ( matchedFeatureFilter === undefined ) {
109106 console . warn ( `Feature filter ${ clientFilter . name } is not found.` ) ;
110- clientFilterEvaluationResult = false ;
111- }
112- else {
113- if ( clientFilter . name === "Microsoft.Targeting" ) {
114- clientFilterEvaluationResult = await matchedFeatureFilter . evaluate ( contextWithFeatureName , this . #getTargetingContext( appContext ) ) ;
115- } else {
116- clientFilterEvaluationResult = await matchedFeatureFilter . evaluate ( contextWithFeatureName , appContext ) ;
117- }
107+ return false ;
118108 }
119- if ( clientFilterEvaluationResult === shortCircuitEvaluationResult ) {
109+ if ( await matchedFeatureFilter . evaluate ( contextWithFeatureName , appContext ) === shortCircuitEvaluationResult ) {
120110 return shortCircuitEvaluationResult ;
121111 }
122112 }
@@ -202,9 +192,11 @@ export class FeatureManager implements IFeatureManager {
202192 }
203193
204194 #getTargetingContext( context : unknown ) : ITargetingContext | undefined {
205- let targetingContext = context as ITargetingContext ;
206- if ( targetingContext === undefined && this . #targetingContextAccessor !== undefined ) {
207- targetingContext = this . #targetingContextAccessor( ) ;
195+ let targetingContext : ITargetingContext | undefined = context as ITargetingContext ;
196+ if ( targetingContext ?. userId === undefined &&
197+ targetingContext ?. groups === undefined &&
198+ this . #targetingContextAccessor !== undefined ) {
199+ targetingContext = this . #targetingContextAccessor. getTargetingContext ( ) ;
208200 }
209201 return targetingContext ;
210202 }
@@ -225,7 +217,7 @@ export interface FeatureManagerOptions {
225217 /**
226218 * The accessor function that provides the @see ITargetingContext for targeting evaluation.
227219 */
228- targetingContextAccessor ?: TargetingContextAccessor ;
220+ targetingContextAccessor ?: ITargetingContextAccessor ;
229221}
230222
231223export class EvaluationResult {
0 commit comments