1- import {
2- EvaluationContext ,
3- FlagValue ,
4- Logger ,
5- OpenFeatureCommonAPI ,
6- ProviderMetadata ,
7- SafeLogger ,
8- } from '@openfeature/shared' ;
1+ import { EvaluationContext , FlagValue , Logger , OpenFeatureCommonAPI , SafeLogger } from '@openfeature/shared' ;
92import { OpenFeatureClient } from './client' ;
103import { NOOP_PROVIDER } from './no-op-provider' ;
11- import { Client , Hook , OpenFeatureEventEmitter , Provider , ProviderEvents } from './types' ;
12- import { objectOrUndefined , stringOrUndefined } from '@openfeature/shared/src/type-guards' ;
4+ import { Client , Hook , Provider } from './types' ;
135
146// use a symbol as a key for the global singleton
157const GLOBAL_OPENFEATURE_API_KEY = Symbol . for ( '@openfeature/js.api' ) ;
@@ -19,12 +11,9 @@ type OpenFeatureGlobal = {
1911} ;
2012const _globalThis = globalThis as OpenFeatureGlobal ;
2113
22- export class OpenFeatureAPI extends OpenFeatureCommonAPI {
14+ export class OpenFeatureAPI extends OpenFeatureCommonAPI < Provider > {
2315 protected _hooks : Hook [ ] = [ ] ;
24- private readonly _events = new OpenFeatureEventEmitter ( ) ;
2516 protected _defaultProvider : Provider = NOOP_PROVIDER ;
26- protected _clientProviders : Map < string , Provider > = new Map ( ) ;
27- protected _clientEvents : Map < string | undefined , OpenFeatureEventEmitter > = new Map ( ) ;
2817
2918 // eslint-disable-next-line @typescript-eslint/no-empty-function
3019 private constructor ( ) {
@@ -47,14 +36,6 @@ export class OpenFeatureAPI extends OpenFeatureCommonAPI {
4736 return instance ;
4837 }
4938
50- /**
51- * Get metadata about registered provider.
52- * @returns {ProviderMetadata } Provider Metadata
53- */
54- get providerMetadata ( ) : ProviderMetadata {
55- return this . _defaultProvider . metadata ;
56- }
57-
5839 setLogger ( logger : Logger ) : this {
5940 this . _logger = new SafeLogger ( logger ) ;
6041 return this ;
@@ -80,70 +61,6 @@ export class OpenFeatureAPI extends OpenFeatureCommonAPI {
8061 await this . _defaultProvider ?. onContextChange ?.( oldContext , context ) ;
8162 }
8263
83- /**
84- * Sets the default provider for flag evaluations.
85- * This provider will be used by unnamed clients and named clients to which no provider is bound.
86- * Setting a provider supersedes the current provider used in new and existing clients without a name.
87- * @param {Provider } provider The provider responsible for flag evaluations.
88- * @returns {OpenFeatureAPI } OpenFeature API
89- */
90- setProvider ( provider : Provider ) : this;
91- /**
92- * Sets the provider that OpenFeature will use for flag evaluations of providers with the given name.
93- * Setting a provider supersedes the current provider used in new and existing clients with that name.
94- * @param {string } clientName The name to identify the client
95- * @param {Provider } provider The provider responsible for flag evaluations.
96- * @returns {OpenFeatureAPI } OpenFeature API
97- */
98- setProvider ( clientName : string , provider : Provider ) : this;
99- setProvider ( clientOrProvider ?: string | Provider , providerOrUndefined ?: Provider ) : this {
100- const clientName = stringOrUndefined ( clientOrProvider ) ;
101- const provider = objectOrUndefined < Provider > ( clientOrProvider ) ?? objectOrUndefined < Provider > ( providerOrUndefined ) ;
102-
103- if ( ! provider ) {
104- return this ;
105- }
106-
107- const oldProvider = this . getProviderForClient ( clientName ) ;
108-
109- // ignore no-ops
110- if ( oldProvider === provider ) {
111- return this ;
112- }
113-
114- if ( clientName ) {
115- this . _clientProviders . set ( clientName , provider ) ;
116- } else {
117- this . _defaultProvider = provider ;
118- }
119-
120- const clientEmitter = this . getEventEmitterForClient ( clientName ) ;
121- this . transferListeners ( oldProvider , provider , clientEmitter ) ;
122-
123- if ( typeof provider . initialize === 'function' ) {
124- provider
125- . initialize ?.( this . _context )
126- ?. then ( ( ) => {
127- clientEmitter . emit ( ProviderEvents . Ready ) ;
128- this . _events ?. emit ( ProviderEvents . Ready ) ;
129- } )
130- ?. catch ( ( ) => {
131- clientEmitter . emit ( ProviderEvents . Error ) ;
132- this . _events ?. emit ( ProviderEvents . Error ) ;
133- } ) ;
134- } else {
135- clientEmitter . emit ( ProviderEvents . Ready ) ;
136- this . _events ?. emit ( ProviderEvents . Ready ) ;
137- }
138-
139- oldProvider ?. onClose ?.( ) ;
140- return this ;
141- }
142-
143- async close ( ) : Promise < void > {
144- await this ?. _defaultProvider ?. onClose ?.( ) ;
145- }
146-
14764 /**
14865 * A factory function for creating new named OpenFeature clients. Clients can contain
14966 * their own state (e.g. logger, hook, context). Multiple clients can be used
@@ -165,39 +82,6 @@ export class OpenFeatureAPI extends OpenFeatureCommonAPI {
16582 { name, version }
16683 ) ;
16784 }
168-
169- private getProviderForClient ( name ?: string ) : Provider {
170- if ( ! name ) {
171- return this . _defaultProvider ;
172- }
173-
174- return this . _clientProviders . get ( name ) ?? this . _defaultProvider ;
175- }
176-
177- private getEventEmitterForClient ( name ?: string ) : OpenFeatureEventEmitter {
178- const emitter = this . _clientEvents . get ( name ) ;
179-
180- if ( emitter ) {
181- return emitter ;
182- }
183-
184- const newEmitter = new OpenFeatureEventEmitter ( { } ) ;
185- this . _clientEvents . set ( name , newEmitter ) ;
186- return newEmitter ;
187- }
188-
189- private transferListeners ( oldProvider : Provider , newProvider : Provider , clientEmitter : OpenFeatureEventEmitter ) {
190- oldProvider . events ?. removeAllListeners ( ) ;
191-
192- // iterate over the event types
193- Object . values ( ProviderEvents ) . forEach ( ( eventType ) =>
194- newProvider . events ?. on ( eventType , ( ) => {
195- // on each event type, fire the associated handlers
196- clientEmitter . emit ( eventType ) ;
197- this . _events . emit ( eventType ) ;
198- } )
199- ) ;
200- }
20185}
20286
20387/**
0 commit comments