Skip to content

Commit cbf87d5

Browse files
authored
feat(flags): Attach requestId to $feature_flag_called if present in /decide response (#418)
1 parent 5d917d5 commit cbf87d5

File tree

5 files changed

+43
-20
lines changed

5 files changed

+43
-20
lines changed

posthog-core/src/index.ts

+30-15
Original file line numberDiff line numberDiff line change
@@ -335,21 +335,28 @@ export abstract class PostHogCoreStateless {
335335
personProperties: Record<string, string> = {},
336336
groupProperties: Record<string, Record<string, string>> = {},
337337
disableGeoip?: boolean
338-
): Promise<boolean | string | undefined> {
338+
): Promise<{
339+
response: boolean | string | undefined
340+
requestId: string | undefined
341+
}> {
339342
await this._initPromise
340343

341-
const featureFlags = await this.getFeatureFlagsStateless(
344+
const decideResponse = await this.getFeatureFlagsStateless(
342345
distinctId,
343346
groups,
344347
personProperties,
345348
groupProperties,
346349
disableGeoip,
347350
[key]
348351
)
352+
const featureFlags = decideResponse.flags
349353

350354
if (!featureFlags) {
351355
// If we haven't loaded flags yet, or errored out, we respond with undefined
352-
return undefined
356+
return {
357+
response: undefined,
358+
requestId: undefined,
359+
}
353360
}
354361

355362
let response = featureFlags[key]
@@ -361,7 +368,10 @@ export abstract class PostHogCoreStateless {
361368
}
362369

363370
// If we have flags we either return the value (true or string) or false
364-
return response
371+
return {
372+
response,
373+
requestId: decideResponse.requestId,
374+
}
365375
}
366376

367377
protected async getFeatureFlagPayloadStateless(
@@ -436,19 +446,21 @@ export abstract class PostHogCoreStateless {
436446
groupProperties: Record<string, Record<string, string>> = {},
437447
disableGeoip?: boolean,
438448
flagKeysToEvaluate?: string[]
439-
): Promise<PostHogDecideResponse['featureFlags'] | undefined> {
449+
): Promise<{
450+
flags: PostHogDecideResponse['featureFlags'] | undefined
451+
payloads: PostHogDecideResponse['featureFlagPayloads'] | undefined
452+
requestId: PostHogDecideResponse['requestId'] | undefined
453+
}> {
440454
await this._initPromise
441455

442-
return (
443-
await this.getFeatureFlagsAndPayloadsStateless(
444-
distinctId,
445-
groups,
446-
personProperties,
447-
groupProperties,
448-
disableGeoip,
449-
flagKeysToEvaluate
450-
)
451-
).flags
456+
return await this.getFeatureFlagsAndPayloadsStateless(
457+
distinctId,
458+
groups,
459+
personProperties,
460+
groupProperties,
461+
disableGeoip,
462+
flagKeysToEvaluate
463+
)
452464
}
453465

454466
protected async getFeatureFlagsAndPayloadsStateless(
@@ -461,6 +473,7 @@ export abstract class PostHogCoreStateless {
461473
): Promise<{
462474
flags: PostHogDecideResponse['featureFlags'] | undefined
463475
payloads: PostHogDecideResponse['featureFlagPayloads'] | undefined
476+
requestId: PostHogDecideResponse['requestId'] | undefined
464477
}> {
465478
await this._initPromise
466479

@@ -481,6 +494,7 @@ export abstract class PostHogCoreStateless {
481494
return {
482495
flags: undefined,
483496
payloads: undefined,
497+
requestId: decideResponse?.requestId,
484498
}
485499
}
486500

@@ -496,6 +510,7 @@ export abstract class PostHogCoreStateless {
496510
return {
497511
flags,
498512
payloads: parsedPayloads,
513+
requestId: decideResponse?.requestId,
499514
}
500515
}
501516

posthog-core/src/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ export type PostHogDecideResponse = {
126126
| {
127127
[key: string]: JsonType
128128
}
129+
requestId?: string
129130
}
130131

131132
export type PostHogFlagsAndPayloadsResponse = {

posthog-node/CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Next
22

3+
# 4.10.0 – 2025-03-06
4+
5+
1. Attach requestId to $feature_flag_called if present in /decide response
6+
37
# 4.9.0 – 2025-03-04
48

59
1. Allow feature flags to be evaluated individually when local evaluation is not being used

posthog-node/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "posthog-node",
3-
"version": "4.9.0",
3+
"version": "4.10.0",
44
"description": "PostHog Node.js integration",
55
"repository": {
66
"type": "git",

posthog-node/src/posthog-node.ts

+7-4
Original file line numberDiff line numberDiff line change
@@ -130,12 +130,12 @@ export class PostHog extends PostHogCoreStateless implements PostHogNodeV1 {
130130
super.captureStateless(distinctId, event, props, { timestamp, disableGeoip, uuid })
131131
}
132132

133-
const _getFlags = (
133+
const _getFlags = async (
134134
distinctId: EventMessage['distinctId'],
135135
groups: EventMessage['groups'],
136136
disableGeoip: EventMessage['disableGeoip']
137137
): Promise<PostHogDecideResponse['featureFlags'] | undefined> => {
138-
return super.getFeatureFlagsStateless(distinctId, groups, undefined, undefined, disableGeoip)
138+
return (await super.getFeatureFlagsStateless(distinctId, groups, undefined, undefined, disableGeoip)).flags
139139
}
140140

141141
// :TRICKY: If we flush, or need to shut down, to not lose events we want this promise to resolve before we flush
@@ -260,16 +260,18 @@ export class PostHog extends PostHogCoreStateless implements PostHogNodeV1 {
260260
)
261261

262262
const flagWasLocallyEvaluated = response !== undefined
263-
263+
let requestId = undefined
264264
if (!flagWasLocallyEvaluated && !onlyEvaluateLocally) {
265-
response = await super.getFeatureFlagStateless(
265+
const remoteResponse = await super.getFeatureFlagStateless(
266266
key,
267267
distinctId,
268268
groups,
269269
personProperties,
270270
groupProperties,
271271
disableGeoip
272272
)
273+
response = remoteResponse.response
274+
requestId = remoteResponse.requestId
273275
}
274276

275277
const featureFlagReportedKey = `${key}_${response}`
@@ -295,6 +297,7 @@ export class PostHog extends PostHogCoreStateless implements PostHogNodeV1 {
295297
$feature_flag_response: response,
296298
locally_evaluated: flagWasLocallyEvaluated,
297299
[`$feature/${key}`]: response,
300+
$feature_flag_request_id: requestId,
298301
},
299302
groups,
300303
disableGeoip,

0 commit comments

Comments
 (0)