6
6
using System . Threading . Tasks ;
7
7
using Microsoft . Extensions . Logging ;
8
8
using OpenFeature . Constant ;
9
+ using OpenFeature . Error ;
9
10
using OpenFeature . Model ;
10
11
11
12
namespace OpenFeature
@@ -37,18 +38,17 @@ static Api() { }
37
38
private Api ( ) { }
38
39
39
40
/// <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,
41
42
/// await the returned task.
42
43
/// </summary>
43
44
/// <remarks>The provider cannot be set to null. Attempting to set the provider to null has no effect.</remarks>
44
45
/// <param name="featureProvider">Implementation of <see cref="FeatureProvider"/></param>
45
46
public async Task SetProviderAsync ( FeatureProvider featureProvider )
46
47
{
47
48
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 ) ;
49
50
}
50
51
51
-
52
52
/// <summary>
53
53
/// Sets the feature provider to given clientName. In order to wait for the provider to be set, and
54
54
/// initialization to complete, await the returned task.
@@ -62,7 +62,7 @@ public async Task SetProviderAsync(string clientName, FeatureProvider featurePro
62
62
throw new ArgumentNullException ( nameof ( clientName ) ) ;
63
63
}
64
64
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 ) ;
66
66
}
67
67
68
68
/// <summary>
@@ -121,7 +121,7 @@ public FeatureProvider GetProvider(string clientName)
121
121
/// <returns><see cref="FeatureClient"/></returns>
122
122
public FeatureClient GetClient ( string ? name = null , string ? version = null , ILogger ? logger = null ,
123
123
EvaluationContext ? context = null ) =>
124
- new FeatureClient ( name , version , logger , context ) ;
124
+ new FeatureClient ( ( ) => _repository . GetProvider ( name ) , name , version , logger , context ) ;
125
125
126
126
/// <summary>
127
127
/// Appends list of hooks to global hooks list
@@ -258,12 +258,46 @@ public void RemoveHandler(ProviderEventTypes type, EventHandlerDelegate handler)
258
258
public void SetLogger ( ILogger logger )
259
259
{
260
260
this . _eventExecutor . SetLogger ( logger ) ;
261
+ this . _repository . SetLogger ( logger ) ;
261
262
}
262
263
263
264
internal void AddClientHandler ( string client , ProviderEventTypes eventType , EventHandlerDelegate handler )
264
265
=> this . _eventExecutor . AddClientHandler ( client , eventType , handler ) ;
265
266
266
267
internal void RemoveClientHandler ( string client , ProviderEventTypes eventType , EventHandlerDelegate handler )
267
268
=> 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
+ }
268
302
}
269
303
}
0 commit comments