diff --git a/.changeset/node-sdk-emit-evaluation-events.md b/.changeset/node-sdk-emit-evaluation-events.md new file mode 100644 index 00000000..18b93d80 --- /dev/null +++ b/.changeset/node-sdk-emit-evaluation-events.md @@ -0,0 +1,5 @@ +--- +"@reflag/node-sdk": patch +--- + +Honor `emitEvaluationEvents: false` by suppressing evaluation `check` and `check-config` events emitted during flag access. diff --git a/packages/node-sdk/src/client.ts b/packages/node-sdk/src/client.ts index 89735ba2..36096648 100644 --- a/packages/node-sdk/src/client.ts +++ b/packages/node-sdk/src/client.ts @@ -254,6 +254,7 @@ export class ReflagClient { flagsFallbackProviderContext: FlagsFallbackProviderContext; flagOverrides: FlagOverridesFn; offline: boolean; + emitEvaluationEvents: boolean; configFile?: string; flagsFetchRetries: number; fetchTimeoutMs: number; @@ -357,6 +358,11 @@ export class ReflagClient { typeof options.configFile === "string", "configFile must be a string", ); + ok( + options.emitEvaluationEvents === undefined || + typeof options.emitEvaluationEvents === "boolean", + "emitEvaluationEvents must be a boolean", + ); ok( options.flagsFetchRetries === undefined || @@ -486,6 +492,7 @@ export class ReflagClient { this._config = { offline, + emitEvaluationEvents: config.emitEvaluationEvents ?? true, apiBaseUrl: (config.apiBaseUrl ?? config.host) || API_BASE_URL, headers: { "Content-Type": "application/json", @@ -1532,7 +1539,11 @@ export class ReflagClient { return { get isEnabled() { - if (enableTracking && enableChecks) { + if ( + enableTracking && + enableChecks && + client._config.emitEvaluationEvents + ) { client._warnMissingFlagContextFields(context, flag); void client @@ -1555,7 +1566,11 @@ export class ReflagClient { return flag.isEnabled ?? false; }, get config() { - if (enableTracking && enableChecks) { + if ( + enableTracking && + enableChecks && + client._config.emitEvaluationEvents + ) { client._warnMissingFlagContextFields(context, flag); void client diff --git a/packages/node-sdk/test/client.test.ts b/packages/node-sdk/test/client.test.ts index e2cf65cb..3c1bd763 100644 --- a/packages/node-sdk/test/client.test.ts +++ b/packages/node-sdk/test/client.test.ts @@ -1637,6 +1637,37 @@ describe("ReflagClient", () => { ]); }); + it("does not emit evaluation events when emitEvaluationEvents is false", async () => { + const client = new ReflagClient({ + ...validOptions, + emitEvaluationEvents: false, + }); + const context = { + company, + user, + other: otherContext, + }; + + await client.initialize(); + const flag = client.getFlag(context, "flag1"); + + expect(flag.isEnabled).toBe(true); + expect(flag.config).toEqual({ + key: "config-1", + payload: { + something: "else", + }, + }); + + await client.flush(); + + const evaluationEvents = httpClient.post.mock.calls + .flatMap((call) => call[2]) + .filter((event) => event.type === "feature-flag-event"); + + expect(evaluationEvents).toStrictEqual([]); + }); + it("sends events for unknown flags", async () => { const context: Context = { company,