From 1892d18e4f23b9c1f09217e7431670d597802dd5 Mon Sep 17 00:00:00 2001 From: Alexandru Ciobanu Date: Mon, 4 Aug 2025 09:11:24 +0100 Subject: [PATCH 1/2] feat: allow disabling "evaluate" event generation --- packages/node-sdk/package.json | 2 +- packages/node-sdk/src/client.ts | 9 +++ packages/node-sdk/src/types.ts | 5 ++ packages/node-sdk/test/client.test.ts | 64 +++++++++++++++++++ .../openfeature-node-provider/package.json | 2 +- yarn.lock | 13 +--- 6 files changed, 82 insertions(+), 13 deletions(-) diff --git a/packages/node-sdk/package.json b/packages/node-sdk/package.json index 7329271e..788976a7 100644 --- a/packages/node-sdk/package.json +++ b/packages/node-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@bucketco/node-sdk", - "version": "1.9.0", + "version": "1.9.1", "license": "MIT", "repository": { "type": "git", diff --git a/packages/node-sdk/src/client.ts b/packages/node-sdk/src/client.ts index 8c06b57c..85d3283b 100644 --- a/packages/node-sdk/src/client.ts +++ b/packages/node-sdk/src/client.ts @@ -123,6 +123,7 @@ export class BucketClient { fallbackFeatures?: Record; featureOverrides: FeatureOverridesFn; offline: boolean; + emitEvaluationEvents: boolean; configFile?: string; featuresFetchRetries: number; fetchTimeoutMs: number; @@ -302,6 +303,7 @@ export class BucketClient { this._config = { offline, + emitEvaluationEvents: config.emitEvaluationEvents ?? true, apiBaseUrl: (config.apiBaseUrl ?? config.host) || API_BASE_URL, headers: { "Content-Type": "application/json", @@ -908,6 +910,13 @@ export class BucketClient { return; } + if ( + !this._config.emitEvaluationEvents && + (event.action === "evaluate" || event.action === "evaluate-config") + ) { + return; + } + if ( !this.rateLimiter.isAllowed( hashObject({ diff --git a/packages/node-sdk/src/types.ts b/packages/node-sdk/src/types.ts index f9005d6d..25215670 100644 --- a/packages/node-sdk/src/types.ts +++ b/packages/node-sdk/src/types.ts @@ -644,6 +644,11 @@ export type ClientOptions = { */ offline?: boolean; + /** + * If set to `false`, no evaluation events will be emitted. + */ + emitEvaluationEvents?: boolean; + /** * The path to the config file. If supplied, the config file will be loaded. * Defaults to `bucket.json` when NODE_ENV is not production. Can also be diff --git a/packages/node-sdk/test/client.test.ts b/packages/node-sdk/test/client.test.ts index 5927a1ff..87520d5b 100644 --- a/packages/node-sdk/test/client.test.ts +++ b/packages/node-sdk/test/client.test.ts @@ -1130,6 +1130,70 @@ describe("BucketClient", () => { ); }); + it("`track` does not send evaluation events when `emitEvaluationEvents` is `false`", async () => { + client = new BucketClient({ + ...validOptions, + emitEvaluationEvents: false, + }); + + const context = { + company, + user, + other: otherContext, + }; + + // test that the feature is returned + await client.initialize(); + const feature = client.getFeature( + { + ...context, + meta: { + active: true, + }, + enableTracking: true, + }, + "feature1", + ); + + await feature.track(); + await client.flush(); + + expect(httpClient.post).toHaveBeenCalledWith( + BULK_ENDPOINT, + expectedHeaders, + [ + { + attributes: { + employees: 100, + name: "Acme Inc.", + }, + companyId: "company123", + context: { + active: true, + }, + type: "company", + }, + { + attributes: { + age: 1, + name: "John", + }, + context: { + active: true, + }, + type: "user", + userId: "user123", + }, + { + type: "event", + event: "feature1", + userId: user.id, + companyId: company.id, + }, + ], + ); + }); + it("`isEnabled` sends `check` event", async () => { const context = { company, diff --git a/packages/openfeature-node-provider/package.json b/packages/openfeature-node-provider/package.json index 66a642fb..e4aa4983 100644 --- a/packages/openfeature-node-provider/package.json +++ b/packages/openfeature-node-provider/package.json @@ -50,7 +50,7 @@ "vitest": "~1.6.0" }, "dependencies": { - "@bucketco/node-sdk": "1.8.4" + "@bucketco/node-sdk": "1.9.1" }, "peerDependencies": { "@openfeature/server-sdk": ">=1.16.1" diff --git a/yarn.lock b/yarn.lock index 62534b0f..7ac2d68f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -795,16 +795,7 @@ __metadata: languageName: unknown linkType: soft -"@bucketco/node-sdk@npm:1.8.4": - version: 1.8.4 - resolution: "@bucketco/node-sdk@npm:1.8.4" - dependencies: - "@bucketco/flag-evaluation": "npm:0.1.4" - checksum: 10c0/f5270915b61526f69f7dbd37b41edf0f130a4a008730f20baf00bbbf49c0a2e3e190a56d35a9451d5645e6da4d874f5d0d555f378596440cccb10306c4362003 - languageName: node - linkType: hard - -"@bucketco/node-sdk@workspace:packages/node-sdk": +"@bucketco/node-sdk@npm:1.9.1, @bucketco/node-sdk@workspace:packages/node-sdk": version: 0.0.0-use.local resolution: "@bucketco/node-sdk@workspace:packages/node-sdk" dependencies: @@ -854,7 +845,7 @@ __metadata: dependencies: "@babel/core": "npm:~7.24.7" "@bucketco/eslint-config": "npm:~0.0.2" - "@bucketco/node-sdk": "npm:1.8.4" + "@bucketco/node-sdk": "npm:1.9.1" "@bucketco/tsconfig": "npm:~0.0.2" "@openfeature/core": "npm:^1.5.0" "@openfeature/server-sdk": "npm:>=1.16.1" From 092c9009177b6f8242efbb02c81295d4772c7427 Mon Sep 17 00:00:00 2001 From: Alexandru Ciobanu Date: Mon, 4 Aug 2025 15:31:46 +0100 Subject: [PATCH 2/2] chore: bump @bucketco/node-sdk to version 1.9.2 and @bucketco/openfeature-node-provider to version 0.4.1 - Updated the version of `@bucketco/node-sdk` in package.json and yarn.lock to 1.9.2. - Updated the version of `@bucketco/openfeature-node-provider` in package.json to 0.4.1, reflecting the new dependency on `@bucketco/node-sdk` version 1.9.2. --- packages/node-sdk/package.json | 2 +- packages/openfeature-node-provider/package.json | 4 ++-- yarn.lock | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/node-sdk/package.json b/packages/node-sdk/package.json index a309e5e4..ddbc22ca 100644 --- a/packages/node-sdk/package.json +++ b/packages/node-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@bucketco/node-sdk", - "version": "1.9.1", + "version": "1.9.2", "license": "MIT", "repository": { "type": "git", diff --git a/packages/openfeature-node-provider/package.json b/packages/openfeature-node-provider/package.json index af38b2b0..afe1fe03 100644 --- a/packages/openfeature-node-provider/package.json +++ b/packages/openfeature-node-provider/package.json @@ -1,6 +1,6 @@ { "name": "@bucketco/openfeature-node-provider", - "version": "0.4.0", + "version": "0.4.1", "license": "MIT", "repository": { "type": "git", @@ -50,7 +50,7 @@ "vitest": "~1.6.0" }, "dependencies": { - "@bucketco/node-sdk": "1.9.1" + "@bucketco/node-sdk": "1.9.2" }, "peerDependencies": { "@openfeature/server-sdk": ">=1.16.1" diff --git a/yarn.lock b/yarn.lock index d8f8fdd2..faf8a2d1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -786,7 +786,7 @@ __metadata: languageName: unknown linkType: soft -"@bucketco/node-sdk@npm:1.9.1, @bucketco/node-sdk@workspace:packages/node-sdk": +"@bucketco/node-sdk@npm:1.9.2, @bucketco/node-sdk@workspace:packages/node-sdk": version: 0.0.0-use.local resolution: "@bucketco/node-sdk@workspace:packages/node-sdk" dependencies: @@ -836,7 +836,7 @@ __metadata: dependencies: "@babel/core": "npm:~7.24.7" "@bucketco/eslint-config": "npm:~0.0.2" - "@bucketco/node-sdk": "npm:1.9.1" + "@bucketco/node-sdk": "npm:1.9.2" "@bucketco/tsconfig": "npm:~0.0.2" "@openfeature/core": "npm:^1.5.0" "@openfeature/server-sdk": "npm:>=1.16.1"