66using System . Threading . Tasks ;
77using Microsoft . Extensions . Logging ;
88using OpenFeature . Constant ;
9+ using OpenFeature . Error ;
910using OpenFeature . Model ;
1011
1112namespace OpenFeature
@@ -37,18 +38,17 @@ static Api() { }
3738 private Api ( ) { }
3839
3940 /// <summary>
40- /// Sets the feature provider. In order to wait for the provider to be set, and initialization to complete,
41+ /// Sets the default feature provider. In order to wait for the provider to be set, and initialization to complete,
4142 /// await the returned task.
4243 /// </summary>
4344 /// <remarks>The provider cannot be set to null. Attempting to set the provider to null has no effect.</remarks>
4445 /// <param name="featureProvider">Implementation of <see cref="FeatureProvider"/></param>
4546 public async Task SetProviderAsync ( FeatureProvider featureProvider )
4647 {
4748 this . _eventExecutor . RegisterDefaultFeatureProvider ( featureProvider ) ;
48- await this . _repository . SetProviderAsync ( featureProvider , this . GetContext ( ) ) . ConfigureAwait ( false ) ;
49+ await this . _repository . SetProviderAsync ( featureProvider , this . GetContext ( ) , AfterInitialization , AfterError ) . ConfigureAwait ( false ) ;
4950 }
5051
51-
5252 /// <summary>
5353 /// Sets the feature provider to given clientName. In order to wait for the provider to be set, and
5454 /// initialization to complete, await the returned task.
@@ -62,7 +62,7 @@ public async Task SetProviderAsync(string clientName, FeatureProvider featurePro
6262 throw new ArgumentNullException ( nameof ( clientName ) ) ;
6363 }
6464 this . _eventExecutor . RegisterClientFeatureProvider ( clientName , featureProvider ) ;
65- await this . _repository . SetProviderAsync ( clientName , featureProvider , this . GetContext ( ) ) . ConfigureAwait ( false ) ;
65+ await this . _repository . SetProviderAsync ( clientName , featureProvider , this . GetContext ( ) , AfterInitialization , AfterError ) . ConfigureAwait ( false ) ;
6666 }
6767
6868 /// <summary>
@@ -121,7 +121,7 @@ public FeatureProvider GetProvider(string clientName)
121121 /// <returns><see cref="FeatureClient"/></returns>
122122 public FeatureClient GetClient ( string ? name = null , string ? version = null , ILogger ? logger = null ,
123123 EvaluationContext ? context = null ) =>
124- new FeatureClient ( name , version , logger , context ) ;
124+ new FeatureClient ( ( ) => _repository . GetProvider ( name ) , name , version , logger , context ) ;
125125
126126 /// <summary>
127127 /// Appends list of hooks to global hooks list
@@ -258,12 +258,46 @@ public void RemoveHandler(ProviderEventTypes type, EventHandlerDelegate handler)
258258 public void SetLogger ( ILogger logger )
259259 {
260260 this . _eventExecutor . SetLogger ( logger ) ;
261+ this . _repository . SetLogger ( logger ) ;
261262 }
262263
263264 internal void AddClientHandler ( string client , ProviderEventTypes eventType , EventHandlerDelegate handler )
264265 => this . _eventExecutor . AddClientHandler ( client , eventType , handler ) ;
265266
266267 internal void RemoveClientHandler ( string client , ProviderEventTypes eventType , EventHandlerDelegate handler )
267268 => this . _eventExecutor . RemoveClientHandler ( client , eventType , handler ) ;
269+
270+ /// <summary>
271+ /// Update the provider state to READY and emit a READY event after successful init.
272+ /// </summary>
273+ private async Task AfterInitialization ( FeatureProvider provider )
274+ {
275+ provider . Status = ProviderStatus . Ready ;
276+ var eventPayload = new ProviderEventPayload
277+ {
278+ Type = ProviderEventTypes . ProviderReady ,
279+ Message = "Provider initialization complete" ,
280+ ProviderName = provider . GetMetadata ( ) . Name ,
281+ } ;
282+
283+ await this . _eventExecutor . EventChannel . Writer . WriteAsync ( new Event { Provider = provider , EventPayload = eventPayload } ) . ConfigureAwait ( false ) ;
284+ }
285+
286+ /// <summary>
287+ /// Update the provider state to ERROR and emit an ERROR after failed init.
288+ /// </summary>
289+ private async Task AfterError ( FeatureProvider provider , Exception ex )
290+
291+ {
292+ provider . Status = typeof ( ProviderFatalException ) == ex . GetType ( ) ? ProviderStatus . Fatal : ProviderStatus . Error ;
293+ var eventPayload = new ProviderEventPayload
294+ {
295+ Type = ProviderEventTypes . ProviderError ,
296+ Message = $ "Provider initialization error: { ex ? . Message } ",
297+ ProviderName = provider . GetMetadata ( ) ? . Name ,
298+ } ;
299+
300+ await this . _eventExecutor . EventChannel . Writer . WriteAsync ( new Event { Provider = provider , EventPayload = eventPayload } ) . ConfigureAwait ( false ) ;
301+ }
268302 }
269303}
0 commit comments