Skip to content

Commit 2a4c50b

Browse files
authored
feat: add flag metadata to in-process evaluator (#709)
Signed-off-by: Michael Beemer <[email protected]>
1 parent 890a70d commit 2a4c50b

File tree

2 files changed

+53
-10
lines changed

2 files changed

+53
-10
lines changed

libs/providers/flagd/src/lib/service/in-process/in-process-service.spec.ts

+16
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,21 @@ describe('In-process-service', () => {
2424
expect(resolveBoolean.value).toBeTruthy();
2525
expect(resolveBoolean.variant).toBe('on');
2626
expect(resolveBoolean.reason).toBe('STATIC');
27+
expect(resolveBoolean.flagMetadata).toEqual({});
28+
});
29+
30+
describe('flag metadata', () => {
31+
it('should include scope as flag metadata', async () => {
32+
// given
33+
const selector = 'devFlags';
34+
const service = new InProcessService({ host: '', port: 0, tls: false, selector }, dataFetcher);
35+
36+
// when
37+
await service.connect(jest.fn, jest.fn, jest.fn);
38+
39+
// then
40+
const resolveBoolean = await service.resolveBoolean('booleanFlag', false, {}, console);
41+
expect(resolveBoolean.flagMetadata).toEqual({ scope: selector });
42+
});
2743
});
2844
});

libs/providers/flagd/src/lib/service/in-process/in-process-service.ts

+37-10
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Service } from '../service';
2-
import { EvaluationContext, JsonValue, Logger, ResolutionDetails } from '@openfeature/core';
2+
import { EvaluationContext, FlagValue, JsonValue, Logger, ResolutionDetails, FlagValueType } from '@openfeature/core';
33
import { Config } from '../../configuration';
44
import { FlagdCore } from '@openfeature/flagd-core';
55
import { DataFetch } from './data-fetch';
@@ -10,7 +10,11 @@ export class InProcessService implements Service {
1010
private _flagdCore: FlagdCore;
1111
private _dataFetcher: DataFetch;
1212

13-
constructor(config: Config, dataFetcher?: DataFetch, logger?: Logger) {
13+
constructor(
14+
private readonly config: Config,
15+
dataFetcher?: DataFetch,
16+
logger?: Logger,
17+
) {
1418
this._flagdCore = new FlagdCore(undefined, logger);
1519
this._dataFetcher = dataFetcher
1620
? dataFetcher
@@ -36,40 +40,63 @@ export class InProcessService implements Service {
3640
this._dataFetcher.disconnect();
3741
}
3842

39-
resolveBoolean(
43+
async resolveBoolean(
4044
flagKey: string,
4145
defaultValue: boolean,
4246
context: EvaluationContext,
4347
logger: Logger,
4448
): Promise<ResolutionDetails<boolean>> {
45-
return Promise.resolve(this._flagdCore.resolveBooleanEvaluation(flagKey, defaultValue, context, logger));
49+
return this.evaluate('boolean', flagKey, defaultValue, context, logger);
4650
}
4751

48-
resolveNumber(
52+
async resolveNumber(
4953
flagKey: string,
5054
defaultValue: number,
5155
context: EvaluationContext,
5256
logger: Logger,
5357
): Promise<ResolutionDetails<number>> {
54-
return Promise.resolve(this._flagdCore.resolveNumberEvaluation(flagKey, defaultValue, context, logger));
58+
return this.evaluate('number', flagKey, defaultValue, context, logger);
5559
}
5660

57-
resolveString(
61+
async resolveString(
5862
flagKey: string,
5963
defaultValue: string,
6064
context: EvaluationContext,
6165
logger: Logger,
6266
): Promise<ResolutionDetails<string>> {
63-
return Promise.resolve(this._flagdCore.resolveStringEvaluation(flagKey, defaultValue, context, logger));
67+
return this.evaluate('string', flagKey, defaultValue, context, logger);
6468
}
6569

66-
resolveObject<T extends JsonValue>(
70+
async resolveObject<T extends JsonValue>(
6771
flagKey: string,
6872
defaultValue: T,
6973
context: EvaluationContext,
7074
logger: Logger,
7175
): Promise<ResolutionDetails<T>> {
72-
return Promise.resolve(this._flagdCore.resolveObjectEvaluation(flagKey, defaultValue, context, logger));
76+
return this.evaluate('object', flagKey, defaultValue, context, logger);
77+
}
78+
79+
private evaluate<T extends FlagValue>(
80+
type: FlagValueType,
81+
flagKey: string,
82+
defaultValue: T,
83+
context: EvaluationContext,
84+
logger: Logger,
85+
): ResolutionDetails<T> {
86+
const details = this._flagdCore.resolve(type, flagKey, defaultValue, context, logger);
87+
return {
88+
...details,
89+
flagMetadata: this.addFlagMetadata(),
90+
};
91+
}
92+
93+
/**
94+
* Adds the flag metadata to the resolution details
95+
*/
96+
private addFlagMetadata() {
97+
return {
98+
...(this.config.selector ? { scope: this.config.selector } : {}),
99+
};
73100
}
74101

75102
/**

0 commit comments

Comments
 (0)