Skip to content

Commit e5fff59

Browse files
Swiftworkpavkam
andauthored
refactor: remove "evaluate" and "evaluate-config" events. (#471)
- Eliminated the emitEvaluationEvents configuration option and related logic. - Cleaned up tests to reflect the removal of evaluation event handling. --------- Co-authored-by: Alexandru Ciobanu <[email protected]>
1 parent 37ba6c8 commit e5fff59

File tree

6 files changed

+11
-200
lines changed

6 files changed

+11
-200
lines changed

packages/node-sdk/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@reflag/node-sdk",
3-
"version": "1.0.0",
3+
"version": "1.0.1",
44
"license": "MIT",
55
"repository": {
66
"type": "git",

packages/node-sdk/src/client.ts

Lines changed: 3 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ type BulkEvent =
7878
}
7979
| {
8080
type: "feature-flag-event";
81-
action: "check" | "evaluate" | "check-config" | "evaluate-config";
81+
action: "check" | "check-config";
8282
key: string;
8383
targetingVersion?: number;
8484
evalResult:
@@ -126,7 +126,6 @@ export class ReflagClient {
126126
fallbackFlags?: Record<TypedFlagKey, RawFlag>;
127127
flagOverrides: FlagOverridesFn;
128128
offline: boolean;
129-
emitEvaluationEvents: boolean;
130129
configFile?: string;
131130
flagsFetchRetries: number;
132131
fetchTimeoutMs: number;
@@ -302,7 +301,6 @@ export class ReflagClient {
302301

303302
this._config = {
304303
offline,
305-
emitEvaluationEvents: config.emitEvaluationEvents ?? true,
306304
apiBaseUrl: (config.apiBaseUrl ?? config.host) || API_BASE_URL,
307305
headers: {
308306
"Content-Type": "application/json",
@@ -841,10 +839,7 @@ export class ReflagClient {
841839
ok(typeof event === "object", "event must be an object");
842840
ok(
843841
typeof event.action === "string" &&
844-
(event.action === "evaluate" ||
845-
event.action === "evaluate-config" ||
846-
event.action === "check" ||
847-
event.action === "check-config"),
842+
(event.action === "check" || event.action === "check-config"),
848843
"event must have an action",
849844
);
850845
ok(
@@ -883,13 +878,6 @@ export class ReflagClient {
883878
return;
884879
}
885880

886-
if (
887-
!this._config.emitEvaluationEvents &&
888-
(event.action === "evaluate" || event.action === "evaluate-config")
889-
) {
890-
return;
891-
}
892-
893881
if (
894882
!this.rateLimiter.isAllowed(
895883
hashObject({
@@ -1056,7 +1044,7 @@ export class ReflagClient {
10561044
flagDefinitions = flagDefs;
10571045
}
10581046

1059-
const { enableTracking = true, meta: _, ...context } = options;
1047+
const { enableTracking: _, meta: __, ...context } = options;
10601048

10611049
const evaluated = flagDefinitions
10621050
.filter(({ key: flagKey }) => (key ? key === flagKey : true))
@@ -1076,55 +1064,6 @@ export class ReflagClient {
10761064
} satisfies EvaluationResult<any>),
10771065
}));
10781066

1079-
if (enableTracking) {
1080-
const promises = evaluated
1081-
.map((res) => {
1082-
const outPromises: Promise<void>[] = [];
1083-
outPromises.push(
1084-
this.sendFlagEvent({
1085-
action: "evaluate",
1086-
key: res.flagKey,
1087-
targetingVersion: res.targetingVersion,
1088-
evalResult: res.enabledResult.value ?? false,
1089-
evalContext: res.enabledResult.context,
1090-
evalRuleResults: res.enabledResult.ruleEvaluationResults,
1091-
evalMissingFields: res.enabledResult.missingContextFields,
1092-
}),
1093-
);
1094-
1095-
const config = res.configResult;
1096-
if (config.value) {
1097-
outPromises.push(
1098-
this.sendFlagEvent({
1099-
action: "evaluate-config",
1100-
key: res.flagKey,
1101-
targetingVersion: res.configVersion,
1102-
evalResult: config.value,
1103-
evalContext: config.context,
1104-
evalRuleResults: config.ruleEvaluationResults,
1105-
evalMissingFields: config.missingContextFields,
1106-
}),
1107-
);
1108-
}
1109-
1110-
return outPromises;
1111-
})
1112-
.flat();
1113-
1114-
void Promise.allSettled(promises).then((results) => {
1115-
const failed = results
1116-
.map((result) =>
1117-
result.status === "rejected" ? result.reason : undefined,
1118-
)
1119-
.filter(Boolean);
1120-
if (failed.length > 0) {
1121-
this.logger.error(`failed to queue some evaluate events.`, {
1122-
errors: failed,
1123-
});
1124-
}
1125-
});
1126-
}
1127-
11281067
let evaluatedFlags = evaluated.reduce(
11291068
(acc, res) => {
11301069
acc[res.flagKey as TypedFlagKey] = {

packages/node-sdk/src/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,16 @@ export type TrackingMeta = {
1818
export type Attributes = Record<string, any>;
1919

2020
/**
21-
* Describes a feature event. Can be "check" or "evaluate".
21+
* Describes a flag event. Can be "check" or "check-config event".
2222
**/
2323
export type FlagEvent = {
2424
/**
2525
* The action that was performed.
2626
**/
27-
action: "evaluate" | "evaluate-config" | "check" | "check-config";
27+
action: "check" | "check-config";
2828

2929
/**
30-
* The feature key.
30+
* The flag key.
3131
**/
3232
key: string;
3333

packages/node-sdk/test/client.test.ts

Lines changed: 0 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import {
1010
vi,
1111
} from "vitest";
1212

13-
import { flattenJSON } from "@reflag/flag-evaluation";
14-
1513
import { BoundReflagClient, ReflagClient } from "../src";
1614
import {
1715
API_BASE_URL,
@@ -1082,95 +1080,6 @@ describe("ReflagClient", () => {
10821080
type: "user",
10831081
userId: "user123",
10841082
},
1085-
{
1086-
type: "feature-flag-event",
1087-
action: "evaluate",
1088-
key: "flag1",
1089-
targetingVersion: 1,
1090-
evalContext: flattenJSON(context),
1091-
evalResult: true,
1092-
evalRuleResults: [true],
1093-
evalMissingFields: [],
1094-
},
1095-
{
1096-
type: "feature-flag-event",
1097-
action: "evaluate-config",
1098-
key: "flag1",
1099-
targetingVersion: 1,
1100-
evalContext: flattenJSON(context),
1101-
evalResult: {
1102-
key: "config-1",
1103-
payload: {
1104-
something: "else",
1105-
},
1106-
},
1107-
evalRuleResults: [true],
1108-
evalMissingFields: [],
1109-
},
1110-
{
1111-
type: "event",
1112-
event: "flag1",
1113-
userId: user.id,
1114-
companyId: company.id,
1115-
},
1116-
],
1117-
);
1118-
});
1119-
1120-
it("`track` does not send evaluation events when `emitEvaluationEvents` is `false`", async () => {
1121-
client = new ReflagClient({
1122-
...validOptions,
1123-
emitEvaluationEvents: false,
1124-
});
1125-
1126-
const context = {
1127-
company,
1128-
user,
1129-
other: otherContext,
1130-
};
1131-
1132-
// test that the flag is returned
1133-
await client.initialize();
1134-
const flag = client.getFlag(
1135-
{
1136-
...context,
1137-
meta: {
1138-
active: true,
1139-
},
1140-
enableTracking: true,
1141-
},
1142-
"flag1",
1143-
);
1144-
1145-
await flag.track();
1146-
await client.flush();
1147-
1148-
expect(httpClient.post).toHaveBeenCalledWith(
1149-
BULK_ENDPOINT,
1150-
expectedHeaders,
1151-
[
1152-
{
1153-
attributes: {
1154-
employees: 100,
1155-
name: "Acme Inc.",
1156-
},
1157-
companyId: "company123",
1158-
context: {
1159-
active: true,
1160-
},
1161-
type: "company",
1162-
},
1163-
{
1164-
attributes: {
1165-
age: 1,
1166-
name: "John",
1167-
},
1168-
context: {
1169-
active: true,
1170-
},
1171-
type: "user",
1172-
userId: "user123",
1173-
},
11741083
{
11751084
type: "event",
11761085
event: "flag1",
@@ -1560,8 +1469,6 @@ describe("ReflagClient", () => {
15601469
});
15611470

15621471
await client.flush();
1563-
1564-
expect(httpClient.post).toHaveBeenCalledTimes(1);
15651472
});
15661473

15671474
it("should send `track` with user and company if provided", async () => {
@@ -1775,41 +1682,6 @@ describe("ReflagClient", () => {
17751682
);
17761683
});
17771684

1778-
it("should not fail if sendFlagEvent fails to send evaluate event", async () => {
1779-
httpClient.post.mockRejectedValueOnce(new Error("Network error"));
1780-
const context = { user, company, other: otherContext };
1781-
1782-
await client.initialize();
1783-
const flags = client.getFlags(context);
1784-
1785-
await client.flush();
1786-
1787-
expect(logger.error).toHaveBeenCalledWith(
1788-
expect.stringMatching("post request .* failed with error"),
1789-
expect.any(Error),
1790-
);
1791-
1792-
expect(flags).toStrictEqual({
1793-
flag1: {
1794-
key: "flag1",
1795-
isEnabled: true,
1796-
config: {
1797-
key: "config-1",
1798-
payload: {
1799-
something: "else",
1800-
},
1801-
},
1802-
track: expect.any(Function),
1803-
},
1804-
flag2: {
1805-
key: "flag2",
1806-
isEnabled: false,
1807-
config: { key: undefined, payload: undefined },
1808-
track: expect.any(Function),
1809-
},
1810-
});
1811-
});
1812-
18131685
it("should not fail if sendFlagEvent fails to send check event", async () => {
18141686
httpClient.post.mockResolvedValue({
18151687
status: 200,

packages/openfeature-node-provider/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@reflag/openfeature-node-provider",
3-
"version": "1.0.0",
3+
"version": "1.0.1",
44
"license": "MIT",
55
"repository": {
66
"type": "git",
@@ -50,7 +50,7 @@
5050
"vitest": "~1.6.0"
5151
},
5252
"dependencies": {
53-
"@reflag/node-sdk": "1.0.0"
53+
"@reflag/node-sdk": "1.0.1"
5454
},
5555
"peerDependencies": {
5656
"@openfeature/server-sdk": ">=1.16.1"

yarn.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3055,7 +3055,7 @@ __metadata:
30553055
languageName: unknown
30563056
linkType: soft
30573057

3058-
"@reflag/node-sdk@npm:1.0.0, @reflag/node-sdk@workspace:packages/node-sdk":
3058+
"@reflag/node-sdk@npm:1.0.1, @reflag/node-sdk@workspace:packages/node-sdk":
30593059
version: 0.0.0-use.local
30603060
resolution: "@reflag/node-sdk@workspace:packages/node-sdk"
30613061
dependencies:
@@ -3107,7 +3107,7 @@ __metadata:
31073107
"@openfeature/core": "npm:^1.5.0"
31083108
"@openfeature/server-sdk": "npm:>=1.16.1"
31093109
"@reflag/eslint-config": "npm:~0.0.2"
3110-
"@reflag/node-sdk": "npm:1.0.0"
3110+
"@reflag/node-sdk": "npm:1.0.1"
31113111
"@reflag/tsconfig": "npm:~0.0.2"
31123112
"@types/node": "npm:^22.12.0"
31133113
eslint: "npm:^9.21.0"

0 commit comments

Comments
 (0)