11import { TimewindowFilter } from "./filter/TimeWindowFilter" ;
22import { IFeatureFilter } from "./filter/FeatureFilter" ;
3- import { FEATURE_FLAGS_KEY , FEATURE_MANAGEMENT_KEY , FeatureDefinition , FeatureManagement , RequirementType } from "./model" ;
3+ import { FeatureDefinition , RequirementType } from "./model" ;
4+ import { IFeatureProvider } from "./featureProvider" ;
45
56export class FeatureManager {
6- #provider: IFeatureDefinitionProvider ;
7+ #provider: IFeatureProvider ;
78 #featureFilters: Map < string , IFeatureFilter > = new Map ( ) ;
89
9- constructor ( provider : IFeatureDefinitionProvider , options ?: FeatureManagerOptions ) {
10+ constructor ( provider : IFeatureProvider , options ?: FeatureManagerOptions ) {
1011 this . #provider = provider ;
1112
1213 const defaultFilters = [ new TimewindowFilter ( ) ] ;
@@ -15,14 +16,16 @@ export class FeatureManager {
1516 }
1617 }
1718
18- listFeatureNames ( ) : string [ ] {
19- const featureNameSet = new Set ( this . #features. map ( ( feature ) => feature . id ) ) ;
19+ async listFeatureNames ( ) : Promise < string [ ] > {
20+ const features = await this . #features( ) ;
21+ const featureNameSet = new Set ( features . map ( ( feature ) => feature . id ) ) ;
2022 return Array . from ( featureNameSet ) ;
2123 }
2224
2325 // If multiple feature flags are found, the first one takes precedence.
2426 async isEnabled ( featureId : string , context ?: unknown ) : Promise < boolean > {
25- const featureFlag = this . #features. find ( ( flag ) => flag . id === featureId ) ;
27+ const features = await this . #features( ) ;
28+ const featureFlag = features . find ( ( flag ) => flag . id === featureId ) ;
2629 if ( featureFlag === undefined ) {
2730 // If the feature is not found, then it is disabled.
2831 return false ;
@@ -61,46 +64,13 @@ export class FeatureManager {
6164 }
6265 }
6366
64- get #features( ) : FeatureDefinition [ ] {
65- return this . #provider. getFeatureDefinitions ( ) ;
67+ async #features( ) : Promise < FeatureDefinition [ ] > {
68+ const features = await this . #provider. getFeatureFlags ( ) ;
69+ return features ;
6670 }
6771
6872}
6973
70- export interface IFeatureDefinitionProvider {
71- getFeatureDefinitions ( ) : FeatureDefinition [ ] ;
72- }
73-
74- export class MapBasedFeatureDefinitionProvider implements IFeatureDefinitionProvider {
75- #map: Map < string , FeatureManagement > ;
76-
77- constructor ( map : Map < string , FeatureManagement > ) {
78- this . #map = map ;
79- }
80-
81- getFeatureDefinitions ( ) : FeatureDefinition [ ] {
82- return this . #map. get ( FEATURE_MANAGEMENT_KEY ) ?. [ FEATURE_FLAGS_KEY ] ?? [ ] ;
83- }
84- }
85-
86- export class JsonBasedFeatureDefinitionProvider implements IFeatureDefinitionProvider {
87- #featureFlags: FeatureDefinition [ ] ;
88-
89- constructor ( private json : string ) {
90- const featureManagement = JSON . parse ( this . json ) as FeatureManagement ;
91-
92- if ( featureManagement ?. [ FEATURE_MANAGEMENT_KEY ] ?. [ FEATURE_FLAGS_KEY ] === undefined ) {
93- throw new Error ( "Invalid input data" ) ;
94- }
95-
96- this . #featureFlags = featureManagement [ FEATURE_MANAGEMENT_KEY ] [ FEATURE_FLAGS_KEY ] ;
97- }
98-
99- getFeatureDefinitions ( ) : FeatureDefinition [ ] {
100- return this . #featureFlags;
101- }
102- }
103-
10474interface FeatureManagerOptions {
10575 customFilters ?: IFeatureFilter [ ] ;
10676}
0 commit comments