Skip to content

Commit 456be7c

Browse files
authored
chore: update sdks, absorb changes (#1119)
Signed-off-by: Todd Baert <[email protected]>
1 parent 929ff6d commit 456be7c

File tree

15 files changed

+170
-77
lines changed

15 files changed

+170
-77
lines changed

libs/providers/multi-provider-web/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@
1111
"current-version": "echo $npm_package_version"
1212
},
1313
"peerDependencies": {
14-
"@openfeature/web-sdk": "^1.2.1"
14+
"@openfeature/web-sdk": "^1.4.0"
1515
}
1616
}

libs/providers/multi-provider-web/src/lib/hook-executor.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,16 @@ export class HookExecutor {
3939
}
4040
}
4141

42-
finallyHooks(hooks: Hook[] | undefined, hookContext: HookContext, hints: HookHints) {
42+
finallyHooks(
43+
hooks: Hook[] | undefined,
44+
hookContext: HookContext,
45+
evaluationDetails: EvaluationDetails<FlagValue>,
46+
hints: HookHints,
47+
) {
4348
// run "finally" hooks sequentially
4449
for (const hook of hooks ?? []) {
4550
try {
46-
hook?.finally?.(hookContext, hints);
51+
hook?.finally?.(hookContext, evaluationDetails, hints);
4752
} catch (err) {
4853
this.logger.error(`Unhandled error during 'finally' hook: ${err}`);
4954
if (err instanceof Error) {

libs/providers/multi-provider-web/src/lib/multi-provider-web.spec.ts

+28-12
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,11 @@ describe('MultiProvider', () => {
390390
]);
391391
const context = {};
392392
callBeforeHook(multiProvider, context, 'flag', 'string', 'default');
393-
expect(multiProvider.resolveStringEvaluation('flag', 'default', context)).toEqual({ value: 'value' });
393+
expect(multiProvider.resolveStringEvaluation('flag', 'default', context)).toEqual({
394+
value: 'value',
395+
flagKey: 'flag',
396+
flagMetadata: {},
397+
});
394398
});
395399

396400
it('evaluates a number variable', () => {
@@ -406,7 +410,11 @@ describe('MultiProvider', () => {
406410

407411
callBeforeHook(multiProvider, context, 'flag', 'number', 0);
408412

409-
expect(multiProvider.resolveNumberEvaluation('flag', 0, context)).toEqual({ value: 1 });
413+
expect(multiProvider.resolveNumberEvaluation('flag', 0, context)).toEqual({
414+
value: 1,
415+
flagKey: 'flag',
416+
flagMetadata: {},
417+
});
410418
});
411419

412420
it('evaluates a boolean variable', () => {
@@ -420,7 +428,11 @@ describe('MultiProvider', () => {
420428
]);
421429
const context = {};
422430
callBeforeHook(multiProvider, context, 'flag', 'boolean', false);
423-
expect(multiProvider.resolveBooleanEvaluation('flag', false, context)).toEqual({ value: true });
431+
expect(multiProvider.resolveBooleanEvaluation('flag', false, context)).toEqual({
432+
value: true,
433+
flagKey: 'flag',
434+
flagMetadata: {},
435+
});
424436
});
425437

426438
it('evaluates an object variable', () => {
@@ -434,7 +446,11 @@ describe('MultiProvider', () => {
434446
]);
435447
const context = {};
436448
callBeforeHook(multiProvider, context, 'flag', 'object', {});
437-
expect(multiProvider.resolveObjectEvaluation('flag', {}, context)).toEqual({ value: { test: true } });
449+
expect(multiProvider.resolveObjectEvaluation('flag', {}, context)).toEqual({
450+
value: { test: true },
451+
flagKey: 'flag',
452+
flagMetadata: {},
453+
});
438454
});
439455
});
440456
describe('first match strategy', () => {
@@ -509,7 +525,7 @@ describe('MultiProvider', () => {
509525
new FirstMatchStrategy(),
510526
);
511527
const result = callEvaluation(multiProvider, {});
512-
expect(result).toEqual({ value: true });
528+
expect(result).toEqual({ value: true, flagKey: 'flag', flagMetadata: {} });
513529
expect(provider2.resolveBooleanEvaluation).toHaveBeenCalled();
514530
expect(provider3.resolveBooleanEvaluation).not.toHaveBeenCalled();
515531
});
@@ -539,7 +555,7 @@ describe('MultiProvider', () => {
539555
new FirstMatchStrategy(),
540556
);
541557
const result = callEvaluation(multiProvider, {});
542-
expect(result).toEqual({ value: true });
558+
expect(result).toEqual({ value: true, flagKey: 'flag', flagMetadata: {} });
543559
expect(provider2.resolveBooleanEvaluation).toHaveBeenCalled();
544560
expect(provider3.resolveBooleanEvaluation).not.toHaveBeenCalled();
545561
});
@@ -572,7 +588,7 @@ describe('MultiProvider', () => {
572588
new FirstSuccessfulStrategy(),
573589
);
574590
const result = callEvaluation(multiProvider, {});
575-
expect(result).toEqual({ value: true });
591+
expect(result).toEqual({ value: true, flagKey: 'flag', flagMetadata: {} });
576592
expect(provider2.resolveBooleanEvaluation).toHaveBeenCalled();
577593
expect(provider3.resolveBooleanEvaluation).not.toHaveBeenCalled();
578594
});
@@ -607,7 +623,7 @@ describe('MultiProvider', () => {
607623
expect(provider2.resolveBooleanEvaluation).toHaveBeenCalled();
608624
expect(provider3.resolveBooleanEvaluation).toHaveBeenCalled();
609625

610-
expect(result).toEqual({ value: true });
626+
expect(result).toEqual({ value: true, flagKey: 'flag', flagMetadata: {} });
611627
});
612628

613629
it('calls every provider and returns the fallback value if any disagree, and calls onMismatch', () => {
@@ -648,21 +664,21 @@ describe('MultiProvider', () => {
648664
{
649665
provider: provider1,
650666
providerName: 'TestProvider-1',
651-
details: { value: true },
667+
details: { value: true, flagKey: 'flag', flagMetadata: {} },
652668
},
653669
{
654670
provider: provider2,
655671
providerName: 'TestProvider-2',
656-
details: { value: false },
672+
details: { value: false, flagKey: 'flag', flagMetadata: {} },
657673
},
658674
{
659675
provider: provider3,
660676
providerName: 'TestProvider-3',
661-
details: { value: false },
677+
details: { value: false, flagKey: 'flag', flagMetadata: {} },
662678
},
663679
]);
664680

665-
expect(result).toEqual({ value: true });
681+
expect(result).toEqual({ value: true, flagKey: 'flag', flagMetadata: {} });
666682
});
667683

668684
it('returns an error if any provider returns an error', () => {

libs/providers/multi-provider-web/src/lib/multi-provider-web.ts

+34-10
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ import {
1313
ProviderMetadata,
1414
BeforeHookContext,
1515
ResolutionDetails,
16+
FlagMetadata,
17+
ErrorCode,
18+
EvaluationDetails,
19+
FlagValue,
20+
OpenFeatureError,
21+
StandardResolutionReasons,
1622
} from '@openfeature/web-sdk';
1723
import { HookExecutor } from './hook-executor';
1824
import { constructAggregateError, throwAggregateErrorFromPromiseResults } from './errors';
@@ -232,32 +238,31 @@ export class WebMultiProvider implements Provider {
232238
hookContext: HookContext,
233239
hookHints: HookHints,
234240
) {
235-
let evaluationResult: ResolutionDetails<T>;
241+
let evaluationDetails: EvaluationDetails<T>;
236242

237243
try {
238244
this.hookExecutor.beforeHooks(provider.hooks, hookContext, hookHints);
239245

240-
evaluationResult = this.callProviderResolve(
246+
const resolutionDetails = this.callProviderResolve<T>(
241247
provider,
242248
flagKey,
243249
defaultValue,
244250
hookContext.context,
245251
) as ResolutionDetails<T>;
246252

247-
const afterHookEvalDetails = {
248-
...evaluationResult,
249-
flagMetadata: Object.freeze(evaluationResult.flagMetadata ?? {}),
253+
evaluationDetails = {
254+
...resolutionDetails,
255+
flagMetadata: Object.freeze(resolutionDetails.flagMetadata ?? {}),
250256
flagKey,
251257
};
252258

253-
this.hookExecutor.afterHooks(provider.hooks, hookContext, afterHookEvalDetails, hookHints);
254-
return evaluationResult;
259+
this.hookExecutor.afterHooks(provider.hooks, hookContext, evaluationDetails, hookHints);
255260
} catch (error: unknown) {
256261
this.hookExecutor.errorHooks(provider.hooks, hookContext, error, hookHints);
257-
throw error;
258-
} finally {
259-
this.hookExecutor.finallyHooks(provider.hooks, hookContext, hookHints);
262+
evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, error);
260263
}
264+
this.hookExecutor.finallyHooks(provider.hooks, hookContext, evaluationDetails, hookHints);
265+
return evaluationDetails;
261266
}
262267

263268
private callProviderResolve<T extends boolean | string | number | JsonValue>(
@@ -291,4 +296,23 @@ export class WebMultiProvider implements Provider {
291296
},
292297
];
293298
}
299+
300+
private getErrorEvaluationDetails<T extends FlagValue>(
301+
flagKey: string,
302+
defaultValue: T,
303+
err: unknown,
304+
flagMetadata: FlagMetadata = {},
305+
): EvaluationDetails<T> {
306+
const errorMessage: string = (err as Error)?.message;
307+
const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;
308+
309+
return {
310+
errorCode,
311+
errorMessage,
312+
value: defaultValue,
313+
reason: StandardResolutionReasons.ERROR,
314+
flagMetadata: Object.freeze(flagMetadata),
315+
flagKey,
316+
};
317+
}
294318
}

libs/providers/multi-provider/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@
1111
"current-version": "echo $npm_package_version"
1212
},
1313
"peerDependencies": {
14-
"@openfeature/server-sdk": "^1.6.0"
14+
"@openfeature/server-sdk": "^1.17.0"
1515
}
1616
}

libs/providers/multi-provider/src/lib/hook-executor.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,16 @@ export class HookExecutor {
4747
}
4848
}
4949

50-
async finallyHooks(hooks: Hook[] | undefined, hookContext: HookContext, hints: HookHints) {
50+
async finallyHooks(
51+
hooks: Hook[] | undefined,
52+
hookContext: HookContext,
53+
evaluationDetails: EvaluationDetails<FlagValue>,
54+
hints: HookHints,
55+
) {
5156
// run "finally" hooks sequentially
5257
for (const hook of hooks ?? []) {
5358
try {
54-
await hook?.finally?.(hookContext, hints);
59+
await hook?.finally?.(hookContext, evaluationDetails, hints);
5560
} catch (err) {
5661
this.logger.error(`Unhandled error during 'finally' hook: ${err}`);
5762
if (err instanceof Error) {

libs/providers/multi-provider/src/lib/multi-provider.spec.ts

+28-12
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,11 @@ describe('MultiProvider', () => {
437437
]);
438438
const context = {};
439439
await callBeforeHook(multiProvider, context, 'flag', 'string', 'default');
440-
expect(await multiProvider.resolveStringEvaluation('flag', 'default', context)).toEqual({ value: 'value' });
440+
expect(await multiProvider.resolveStringEvaluation('flag', 'default', context)).toEqual({
441+
value: 'value',
442+
flagKey: 'flag',
443+
flagMetadata: {},
444+
});
441445
});
442446

443447
it('evaluates a number variable', async () => {
@@ -453,7 +457,11 @@ describe('MultiProvider', () => {
453457

454458
await callBeforeHook(multiProvider, context, 'flag', 'number', 0);
455459

456-
expect(await multiProvider.resolveNumberEvaluation('flag', 0, context)).toEqual({ value: 1 });
460+
expect(await multiProvider.resolveNumberEvaluation('flag', 0, context)).toEqual({
461+
value: 1,
462+
flagKey: 'flag',
463+
flagMetadata: {},
464+
});
457465
});
458466

459467
it('evaluates a boolean variable', async () => {
@@ -467,7 +475,11 @@ describe('MultiProvider', () => {
467475
]);
468476
const context = {};
469477
await callBeforeHook(multiProvider, context, 'flag', 'boolean', false);
470-
expect(await multiProvider.resolveBooleanEvaluation('flag', false, context)).toEqual({ value: true });
478+
expect(await multiProvider.resolveBooleanEvaluation('flag', false, context)).toEqual({
479+
value: true,
480+
flagKey: 'flag',
481+
flagMetadata: {},
482+
});
471483
});
472484

473485
it('evaluates an object variable', async () => {
@@ -481,7 +493,11 @@ describe('MultiProvider', () => {
481493
]);
482494
const context = {};
483495
await callBeforeHook(multiProvider, context, 'flag', 'object', {});
484-
expect(await multiProvider.resolveObjectEvaluation('flag', {}, context)).toEqual({ value: { test: true } });
496+
expect(await multiProvider.resolveObjectEvaluation('flag', {}, context)).toEqual({
497+
flagKey: 'flag',
498+
flagMetadata: {},
499+
value: { test: true },
500+
});
485501
});
486502
});
487503
describe('first match strategy', () => {
@@ -554,7 +570,7 @@ describe('MultiProvider', () => {
554570
new FirstMatchStrategy(),
555571
);
556572
const result = await callEvaluation(multiProvider, {}, logger);
557-
expect(result).toEqual({ value: true });
573+
expect(result).toEqual({ value: true, flagKey: 'flag', flagMetadata: {} });
558574
expect(provider2.resolveBooleanEvaluation).toHaveBeenCalled();
559575
expect(provider3.resolveBooleanEvaluation).not.toHaveBeenCalled();
560576
});
@@ -582,7 +598,7 @@ describe('MultiProvider', () => {
582598
new FirstMatchStrategy(),
583599
);
584600
const result = await callEvaluation(multiProvider, {}, logger);
585-
expect(result).toEqual({ value: true });
601+
expect(result).toEqual({ value: true, flagKey: 'flag', flagMetadata: {} });
586602
expect(provider2.resolveBooleanEvaluation).toHaveBeenCalled();
587603
expect(provider3.resolveBooleanEvaluation).not.toHaveBeenCalled();
588604
});
@@ -615,7 +631,7 @@ describe('MultiProvider', () => {
615631
new FirstSuccessfulStrategy(),
616632
);
617633
const result = await callEvaluation(multiProvider, {}, logger);
618-
expect(result).toEqual({ value: true });
634+
expect(result).toEqual({ value: true, flagKey: 'flag', flagMetadata: {} });
619635
expect(provider2.resolveBooleanEvaluation).toHaveBeenCalled();
620636
expect(provider3.resolveBooleanEvaluation).not.toHaveBeenCalled();
621637
});
@@ -659,7 +675,7 @@ describe('MultiProvider', () => {
659675
expect(provider2.resolveBooleanEvaluation).toHaveBeenCalled();
660676
expect(provider3.resolveBooleanEvaluation).toHaveBeenCalled();
661677

662-
expect(await resultPromise).toEqual({ value: true });
678+
expect(await resultPromise).toEqual({ value: true, flagKey: 'flag', flagMetadata: {} });
663679
});
664680

665681
it('calls every provider and returns the fallback value if any disagree, and calls onMismatch', async () => {
@@ -700,21 +716,21 @@ describe('MultiProvider', () => {
700716
{
701717
provider: provider1,
702718
providerName: 'TestProvider-1',
703-
details: { value: true },
719+
details: { value: true, flagKey: 'flag', flagMetadata: {} },
704720
},
705721
{
706722
provider: provider2,
707723
providerName: 'TestProvider-2',
708-
details: { value: false },
724+
details: { value: false, flagKey: 'flag', flagMetadata: {} },
709725
},
710726
{
711727
provider: provider3,
712728
providerName: 'TestProvider-3',
713-
details: { value: false },
729+
details: { value: false, flagKey: 'flag', flagMetadata: {} },
714730
},
715731
]);
716732

717-
expect(result).toEqual({ value: true });
733+
expect(result).toEqual({ value: true, flagKey: 'flag', flagMetadata: {} });
718734
});
719735

720736
it('returns an error if any provider returns an error', async () => {

0 commit comments

Comments
 (0)