@@ -10,7 +10,9 @@ import type {
10
10
Logger ,
11
11
TrackingEventDetails ,
12
12
OpenFeatureError ,
13
- ResolutionDetails } from '@openfeature/core' ;
13
+ FlagMetadata ,
14
+ ResolutionDetails ,
15
+ } from '@openfeature/core' ;
14
16
import {
15
17
ErrorCode ,
16
18
ProviderFatalError ,
@@ -24,7 +26,7 @@ import type { FlagEvaluationOptions } from '../../evaluation';
24
26
import type { ProviderEvents } from '../../events' ;
25
27
import type { InternalEventEmitter } from '../../events/internal/internal-event-emitter' ;
26
28
import type { Hook } from '../../hooks' ;
27
- import type { Provider } from '../../provider' ;
29
+ import type { Provider } from '../../provider' ;
28
30
import { ProviderStatus } from '../../provider' ;
29
31
import type { Client } from './../client' ;
30
32
@@ -279,6 +281,8 @@ export class OpenFeatureClient implements Client {
279
281
logger : this . _logger ,
280
282
} ;
281
283
284
+ let evaluationDetails : EvaluationDetails < T > ;
285
+
282
286
try {
283
287
const frozenContext = await this . beforeHooks ( allHooks , hookContext , options ) ;
284
288
@@ -287,27 +291,27 @@ export class OpenFeatureClient implements Client {
287
291
// run the referenced resolver, binding the provider.
288
292
const resolution = await resolver . call ( this . _provider , flagKey , defaultValue , frozenContext , this . _logger ) ;
289
293
290
- const evaluationDetails = {
294
+ const resolutionDetails = {
291
295
...resolution ,
292
296
flagMetadata : Object . freeze ( resolution . flagMetadata ?? { } ) ,
293
297
flagKey,
294
298
} ;
295
299
296
- if ( evaluationDetails . errorCode ) {
297
- const err = instantiateErrorByErrorCode ( evaluationDetails . errorCode ) ;
300
+ if ( resolutionDetails . errorCode ) {
301
+ const err = instantiateErrorByErrorCode ( resolutionDetails . errorCode ) ;
298
302
await this . errorHooks ( allHooksReversed , hookContext , err , options ) ;
299
- return this . getErrorEvaluationDetails ( flagKey , defaultValue , err ) ;
303
+ evaluationDetails = this . getErrorEvaluationDetails ( flagKey , defaultValue , err , resolutionDetails . flagMetadata ) ;
304
+ } else {
305
+ await this . afterHooks ( allHooksReversed , hookContext , resolutionDetails , options ) ;
306
+ evaluationDetails = resolutionDetails ;
300
307
}
301
-
302
- await this . afterHooks ( allHooksReversed , hookContext , evaluationDetails , options ) ;
303
-
304
- return evaluationDetails ;
305
308
} catch ( err : unknown ) {
306
309
await this . errorHooks ( allHooksReversed , hookContext , err , options ) ;
307
- return this . getErrorEvaluationDetails ( flagKey , defaultValue , err ) ;
308
- } finally {
309
- await this . finallyHooks ( allHooksReversed , hookContext , options ) ;
310
+ evaluationDetails = this . getErrorEvaluationDetails ( flagKey , defaultValue , err ) ;
310
311
}
312
+
313
+ await this . finallyHooks ( allHooksReversed , hookContext , evaluationDetails , options ) ;
314
+ return evaluationDetails ;
311
315
}
312
316
313
317
private async beforeHooks ( hooks : Hook [ ] , hookContext : HookContext , options : FlagEvaluationOptions ) {
@@ -353,11 +357,16 @@ export class OpenFeatureClient implements Client {
353
357
}
354
358
}
355
359
356
- private async finallyHooks ( hooks : Hook [ ] , hookContext : HookContext , options : FlagEvaluationOptions ) {
360
+ private async finallyHooks (
361
+ hooks : Hook [ ] ,
362
+ hookContext : HookContext ,
363
+ evaluationDetails : EvaluationDetails < FlagValue > ,
364
+ options : FlagEvaluationOptions ,
365
+ ) {
357
366
// run "finally" hooks sequentially
358
367
for ( const hook of hooks ) {
359
368
try {
360
- await hook ?. finally ?.( hookContext , options . hookHints ) ;
369
+ await hook ?. finally ?.( hookContext , evaluationDetails , options . hookHints ) ;
361
370
} catch ( err ) {
362
371
this . _logger . error ( `Unhandled error during 'finally' hook: ${ err } ` ) ;
363
372
if ( err instanceof Error ) {
@@ -403,6 +412,7 @@ export class OpenFeatureClient implements Client {
403
412
flagKey : string ,
404
413
defaultValue : T ,
405
414
err : unknown ,
415
+ flagMetadata : FlagMetadata = { } ,
406
416
) : EvaluationDetails < T > {
407
417
const errorMessage : string = ( err as Error ) ?. message ;
408
418
const errorCode : ErrorCode = ( err as OpenFeatureError ) ?. code || ErrorCode . GENERAL ;
@@ -412,7 +422,7 @@ export class OpenFeatureClient implements Client {
412
422
errorMessage,
413
423
value : defaultValue ,
414
424
reason : StandardResolutionReasons . ERROR ,
415
- flagMetadata : Object . freeze ( { } ) ,
425
+ flagMetadata : Object . freeze ( flagMetadata ) ,
416
426
flagKey,
417
427
} ;
418
428
}
0 commit comments