posthog-node 5.30.8 → 5.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,6 +10,9 @@ interface MiddlewareError extends Error {
10
10
  statusCode?: number | string;
11
11
  };
12
12
  }
13
+ export declare function setupExpressRequestContext(_posthog: PostHogBackendClient, app: {
14
+ use: (middleware: ExpressMiddleware) => unknown;
15
+ }): void;
13
16
  export declare function setupExpressErrorHandler(_posthog: PostHogBackendClient, app: {
14
17
  use: (middleware: ExpressMiddleware | ExpressErrorMiddleware) => unknown;
15
18
  }): void;
@@ -1 +1 @@
1
- {"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/extensions/express.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAEhD,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEhD,KAAK,iBAAiB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,CAAA;AAEhF,KAAK,sBAAsB,GAAG,CAC5B,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,KACnC,IAAI,CAAA;AAET,UAAU,eAAgB,SAAQ,KAAK;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7B,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAC7B,CAAA;CACF;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,oBAAoB,EAC9B,GAAG,EAAE;IACH,GAAG,EAAE,CAAC,UAAU,EAAE,iBAAiB,GAAG,sBAAsB,KAAK,OAAO,CAAA;CACzE,GACA,IAAI,CAEN"}
1
+ {"version":3,"file":"express.d.ts","sourceRoot":"","sources":["../../src/extensions/express.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAGhD,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGhD,KAAK,iBAAiB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,CAAA;AAEhF,KAAK,sBAAsB,GAAG,CAC5B,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,KACnC,IAAI,CAAA;AAET,UAAU,eAAgB,SAAQ,KAAK;IACrC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAC7B,MAAM,CAAC,EAAE;QACP,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAC7B,CAAA;CACF;AA4BD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,oBAAoB,EAC9B,GAAG,EAAE;IACH,GAAG,EAAE,CAAC,UAAU,EAAE,iBAAiB,KAAK,OAAO,CAAA;CAChD,GACA,IAAI,CAEN;AAQD,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,oBAAoB,EAC9B,GAAG,EAAE;IACH,GAAG,EAAE,CAAC,UAAU,EAAE,iBAAiB,GAAG,sBAAsB,KAAK,OAAO,CAAA;CACzE,GACA,IAAI,CAEN"}
@@ -33,18 +33,53 @@ var __webpack_require__ = {};
33
33
  var __webpack_exports__ = {};
34
34
  __webpack_require__.r(__webpack_exports__);
35
35
  __webpack_require__.d(__webpack_exports__, {
36
+ setupExpressRequestContext: ()=>setupExpressRequestContext,
36
37
  setupExpressErrorHandler: ()=>setupExpressErrorHandler
37
38
  });
38
39
  const index_js_namespaceObject = require("./error-tracking/index.js");
39
40
  var index_js_default = /*#__PURE__*/ __webpack_require__.n(index_js_namespaceObject);
41
+ const external_tracing_headers_js_namespaceObject = require("./tracing-headers.js");
42
+ function getClientIp(req) {
43
+ const forwarded = (0, external_tracing_headers_js_namespaceObject.getFirstHeaderValue)(req.headers['x-forwarded-for']);
44
+ if (forwarded) {
45
+ const ip = forwarded.split(',')[0].trim();
46
+ if (ip) return ip;
47
+ }
48
+ return req.socket?.remoteAddress;
49
+ }
50
+ function buildRequestContextData(req) {
51
+ const { sessionId, distinctId } = (0, external_tracing_headers_js_namespaceObject.getPostHogTracingHeaderValues)(req.headers);
52
+ const properties = {};
53
+ (0, external_tracing_headers_js_namespaceObject.addProperty)(properties, '$current_url', req.originalUrl || req.url);
54
+ (0, external_tracing_headers_js_namespaceObject.addProperty)(properties, '$request_method', req.method);
55
+ (0, external_tracing_headers_js_namespaceObject.addProperty)(properties, '$request_path', req.path);
56
+ (0, external_tracing_headers_js_namespaceObject.addProperty)(properties, '$user_agent', (0, external_tracing_headers_js_namespaceObject.getFirstHeaderValue)(req.headers['user-agent']));
57
+ (0, external_tracing_headers_js_namespaceObject.addProperty)(properties, '$ip', getClientIp(req));
58
+ return {
59
+ ...void 0 !== sessionId ? {
60
+ sessionId
61
+ } : {},
62
+ ...void 0 !== distinctId ? {
63
+ distinctId
64
+ } : {},
65
+ properties
66
+ };
67
+ }
68
+ function setupExpressRequestContext(_posthog, app) {
69
+ app.use(posthogRequestContext(_posthog));
70
+ }
71
+ function posthogRequestContext(posthog) {
72
+ return (req, _res, next)=>{
73
+ posthog.withContext(buildRequestContextData(req), ()=>next());
74
+ };
75
+ }
40
76
  function setupExpressErrorHandler(_posthog, app) {
41
77
  app.use(posthogErrorHandler(_posthog));
42
78
  }
43
79
  function posthogErrorHandler(posthog) {
44
80
  return (error, req, res, next)=>{
45
81
  if (index_js_default().isPreviouslyCapturedError(error)) return void next(error);
46
- const sessionId = req.headers['x-posthog-session-id'];
47
- const distinctId = req.headers['x-posthog-distinct-id'];
82
+ const contextData = buildRequestContextData(req);
48
83
  const syntheticException = new Error('Synthetic exception');
49
84
  const hint = {
50
85
  mechanism: {
@@ -53,23 +88,24 @@ function posthogErrorHandler(posthog) {
53
88
  },
54
89
  syntheticException
55
90
  };
56
- posthog.addPendingPromise(index_js_default().buildEventMessage(error, hint, distinctId, {
57
- $session_id: sessionId,
58
- $current_url: req.url,
59
- $request_method: req.method,
60
- $request_path: req.path,
61
- $user_agent: req.headers['user-agent'],
62
- $response_status_code: res.statusCode,
63
- $ip: req.headers['x-forwarded-for'] || req?.socket?.remoteAddress
64
- }).then((msg)=>{
91
+ const additionalProperties = {
92
+ ...void 0 !== contextData.sessionId ? {
93
+ $session_id: contextData.sessionId
94
+ } : {},
95
+ ...contextData.properties || {},
96
+ $response_status_code: res.statusCode
97
+ };
98
+ posthog.addPendingPromise(index_js_default().buildEventMessage(error, hint, contextData.distinctId, additionalProperties).then((msg)=>{
65
99
  posthog.capture(msg);
66
100
  }));
67
101
  next(error);
68
102
  };
69
103
  }
70
104
  exports.setupExpressErrorHandler = __webpack_exports__.setupExpressErrorHandler;
105
+ exports.setupExpressRequestContext = __webpack_exports__.setupExpressRequestContext;
71
106
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
72
- "setupExpressErrorHandler"
107
+ "setupExpressErrorHandler",
108
+ "setupExpressRequestContext"
73
109
  ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
74
110
  Object.defineProperty(exports, '__esModule', {
75
111
  value: true
@@ -1,12 +1,46 @@
1
1
  import error_tracking from "./error-tracking/index.mjs";
2
+ import { addProperty, getFirstHeaderValue, getPostHogTracingHeaderValues } from "./tracing-headers.mjs";
3
+ function getClientIp(req) {
4
+ const forwarded = getFirstHeaderValue(req.headers['x-forwarded-for']);
5
+ if (forwarded) {
6
+ const ip = forwarded.split(',')[0].trim();
7
+ if (ip) return ip;
8
+ }
9
+ return req.socket?.remoteAddress;
10
+ }
11
+ function buildRequestContextData(req) {
12
+ const { sessionId, distinctId } = getPostHogTracingHeaderValues(req.headers);
13
+ const properties = {};
14
+ addProperty(properties, '$current_url', req.originalUrl || req.url);
15
+ addProperty(properties, '$request_method', req.method);
16
+ addProperty(properties, '$request_path', req.path);
17
+ addProperty(properties, '$user_agent', getFirstHeaderValue(req.headers['user-agent']));
18
+ addProperty(properties, '$ip', getClientIp(req));
19
+ return {
20
+ ...void 0 !== sessionId ? {
21
+ sessionId
22
+ } : {},
23
+ ...void 0 !== distinctId ? {
24
+ distinctId
25
+ } : {},
26
+ properties
27
+ };
28
+ }
29
+ function setupExpressRequestContext(_posthog, app) {
30
+ app.use(posthogRequestContext(_posthog));
31
+ }
32
+ function posthogRequestContext(posthog) {
33
+ return (req, _res, next)=>{
34
+ posthog.withContext(buildRequestContextData(req), ()=>next());
35
+ };
36
+ }
2
37
  function setupExpressErrorHandler(_posthog, app) {
3
38
  app.use(posthogErrorHandler(_posthog));
4
39
  }
5
40
  function posthogErrorHandler(posthog) {
6
41
  return (error, req, res, next)=>{
7
42
  if (error_tracking.isPreviouslyCapturedError(error)) return void next(error);
8
- const sessionId = req.headers['x-posthog-session-id'];
9
- const distinctId = req.headers['x-posthog-distinct-id'];
43
+ const contextData = buildRequestContextData(req);
10
44
  const syntheticException = new Error('Synthetic exception');
11
45
  const hint = {
12
46
  mechanism: {
@@ -15,18 +49,17 @@ function posthogErrorHandler(posthog) {
15
49
  },
16
50
  syntheticException
17
51
  };
18
- posthog.addPendingPromise(error_tracking.buildEventMessage(error, hint, distinctId, {
19
- $session_id: sessionId,
20
- $current_url: req.url,
21
- $request_method: req.method,
22
- $request_path: req.path,
23
- $user_agent: req.headers['user-agent'],
24
- $response_status_code: res.statusCode,
25
- $ip: req.headers['x-forwarded-for'] || req?.socket?.remoteAddress
26
- }).then((msg)=>{
52
+ const additionalProperties = {
53
+ ...void 0 !== contextData.sessionId ? {
54
+ $session_id: contextData.sessionId
55
+ } : {},
56
+ ...contextData.properties || {},
57
+ $response_status_code: res.statusCode
58
+ };
59
+ posthog.addPendingPromise(error_tracking.buildEventMessage(error, hint, contextData.distinctId, additionalProperties).then((msg)=>{
27
60
  posthog.capture(msg);
28
61
  }));
29
62
  next(error);
30
63
  };
31
64
  }
32
- export { setupExpressErrorHandler };
65
+ export { setupExpressErrorHandler, setupExpressRequestContext };
@@ -1 +1 @@
1
- {"version":3,"file":"feature-flags.d.ts","sourceRoot":"","sources":["../../../src/extensions/feature-flags/feature-flags.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"feature-flags.d.ts","sourceRoot":"","sources":["../../../src/extensions/feature-flags/feature-flags.ts"],"names":[],"mappings":"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"}
@@ -251,13 +251,33 @@ class FeatureFlagsPoller {
251
251
  async matchFeatureFlagProperties(flag, bucketingValue, properties, evaluationContext) {
252
252
  const flagFilters = flag.filters || {};
253
253
  const flagConditions = flagFilters.groups || [];
254
+ const flagAggregation = flagFilters.aggregation_group_type_index;
255
+ const { groups, groupProperties } = evaluationContext;
254
256
  let isInconclusive = false;
255
257
  let result;
256
258
  for (const condition of flagConditions)try {
257
- if (await this.isConditionMatch(flag, bucketingValue, condition, properties, evaluationContext)) {
259
+ const conditionAggregation = void 0 !== condition.aggregation_group_type_index ? condition.aggregation_group_type_index : flagAggregation;
260
+ let effectiveProperties = properties;
261
+ let effectiveBucketingValue = bucketingValue;
262
+ if (conditionAggregation !== flagAggregation) {
263
+ if (null != conditionAggregation) {
264
+ const groupName = this.groupTypeMapping[String(conditionAggregation)];
265
+ if (!groupName || !(groupName in groups)) {
266
+ this.logMsgIfDebug(()=>console.debug(`[FEATURE FLAGS] Skipping group condition for flag '${flag.key}': group type index ${conditionAggregation} not available`));
267
+ continue;
268
+ }
269
+ if (!(groupName in groupProperties)) {
270
+ isInconclusive = true;
271
+ continue;
272
+ }
273
+ effectiveProperties = groupProperties[groupName];
274
+ effectiveBucketingValue = groups[groupName];
275
+ }
276
+ }
277
+ if (await this.isConditionMatch(flag, effectiveBucketingValue, condition, effectiveProperties, evaluationContext)) {
258
278
  const variantOverride = condition.variant;
259
279
  const flagVariants = flagFilters.multivariate?.variants || [];
260
- result = variantOverride && flagVariants.some((variant)=>variant.key === variantOverride) ? variantOverride : await this.getMatchingVariant(flag, bucketingValue) || true;
280
+ result = variantOverride && flagVariants.some((variant)=>variant.key === variantOverride) ? variantOverride : await this.getMatchingVariant(flag, effectiveBucketingValue) || true;
261
281
  break;
262
282
  }
263
283
  } catch (e) {
@@ -217,13 +217,33 @@ class FeatureFlagsPoller {
217
217
  async matchFeatureFlagProperties(flag, bucketingValue, properties, evaluationContext) {
218
218
  const flagFilters = flag.filters || {};
219
219
  const flagConditions = flagFilters.groups || [];
220
+ const flagAggregation = flagFilters.aggregation_group_type_index;
221
+ const { groups, groupProperties } = evaluationContext;
220
222
  let isInconclusive = false;
221
223
  let result;
222
224
  for (const condition of flagConditions)try {
223
- if (await this.isConditionMatch(flag, bucketingValue, condition, properties, evaluationContext)) {
225
+ const conditionAggregation = void 0 !== condition.aggregation_group_type_index ? condition.aggregation_group_type_index : flagAggregation;
226
+ let effectiveProperties = properties;
227
+ let effectiveBucketingValue = bucketingValue;
228
+ if (conditionAggregation !== flagAggregation) {
229
+ if (null != conditionAggregation) {
230
+ const groupName = this.groupTypeMapping[String(conditionAggregation)];
231
+ if (!groupName || !(groupName in groups)) {
232
+ this.logMsgIfDebug(()=>console.debug(`[FEATURE FLAGS] Skipping group condition for flag '${flag.key}': group type index ${conditionAggregation} not available`));
233
+ continue;
234
+ }
235
+ if (!(groupName in groupProperties)) {
236
+ isInconclusive = true;
237
+ continue;
238
+ }
239
+ effectiveProperties = groupProperties[groupName];
240
+ effectiveBucketingValue = groups[groupName];
241
+ }
242
+ }
243
+ if (await this.isConditionMatch(flag, effectiveBucketingValue, condition, effectiveProperties, evaluationContext)) {
224
244
  const variantOverride = condition.variant;
225
245
  const flagVariants = flagFilters.multivariate?.variants || [];
226
- result = variantOverride && flagVariants.some((variant)=>variant.key === variantOverride) ? variantOverride : await this.getMatchingVariant(flag, bucketingValue) || true;
246
+ result = variantOverride && flagVariants.some((variant)=>variant.key === variantOverride) ? variantOverride : await this.getMatchingVariant(flag, effectiveBucketingValue) || true;
227
247
  break;
228
248
  }
229
249
  } catch (e) {
@@ -1 +1 @@
1
- {"version":3,"file":"nestjs.d.ts","sourceRoot":"","sources":["../../src/extensions/nestjs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAc,MAAM,MAAM,CAAA;AAI7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAGhD,UAAU,iBAAiB;IACzB,UAAU,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAA;IACxB,WAAW,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAA;CAC1B;AAED,UAAU,gBAAgB;IACxB,YAAY,IAAI,iBAAiB,CAAA;CAClC;AAED,UAAU,WAAW,CAAC,CAAC,GAAG,GAAG;IAC3B,MAAM,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;CACxB;AAED,UAAU,eAAe,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG;IACxC,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;CAC1E;AAED,MAAM,WAAW,uBAAuB;IACtC,+GAA+G;IAC/G,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,mGAAmG;IACnG,iBAAiB,CAAC,EAAE,OAAO,GAAG,uBAAuB,CAAA;CACtD;AAwBD,qBAAa,kBAAmB,YAAW,eAAe;IACxD,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,kBAAkB,CAAQ;gBAEtB,OAAO,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,yBAAyB;IAO9E,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC;CAiDzE"}
1
+ {"version":3,"file":"nestjs.d.ts","sourceRoot":"","sources":["../../src/extensions/nestjs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAc,MAAM,MAAM,CAAA;AAK7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAGhD,UAAU,iBAAiB;IACzB,UAAU,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAA;IACxB,WAAW,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAA;CAC1B;AAED,UAAU,gBAAgB;IACxB,YAAY,IAAI,iBAAiB,CAAA;CAClC;AAED,UAAU,WAAW,CAAC,CAAC,GAAG,GAAG;IAC3B,MAAM,IAAI,UAAU,CAAC,CAAC,CAAC,CAAA;CACxB;AAED,UAAU,eAAe,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG;IACxC,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;CAC1E;AAED,MAAM,WAAW,uBAAuB;IACtC,+GAA+G;IAC/G,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,mGAAmG;IACnG,iBAAiB,CAAC,EAAE,OAAO,GAAG,uBAAuB,CAAA;CACtD;AAwBD,qBAAa,kBAAmB,YAAW,eAAe;IACxD,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,kBAAkB,CAAQ;gBAEtB,OAAO,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,yBAAyB;IAO9E,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC;CA+CzE"}
@@ -39,10 +39,11 @@ const external_rxjs_namespaceObject = require("rxjs");
39
39
  const operators_namespaceObject = require("rxjs/operators");
40
40
  const index_js_namespaceObject = require("./error-tracking/index.js");
41
41
  var index_js_default = /*#__PURE__*/ __webpack_require__.n(index_js_namespaceObject);
42
+ const external_tracing_headers_js_namespaceObject = require("./tracing-headers.js");
42
43
  function getClientIp(headers, request) {
43
- const forwarded = headers['x-forwarded-for'];
44
+ const forwarded = (0, external_tracing_headers_js_namespaceObject.getFirstHeaderValue)(headers['x-forwarded-for']);
44
45
  if (forwarded) {
45
- const ip = String(forwarded).split(',')[0].trim();
46
+ const ip = forwarded.split(',')[0].trim();
46
47
  if (ip) return ip;
47
48
  }
48
49
  return request?.socket?.remoteAddress;
@@ -65,20 +66,21 @@ class PostHogInterceptor {
65
66
  const request = httpHost.getRequest();
66
67
  const response = httpHost.getResponse();
67
68
  const headers = request?.headers ?? {};
68
- const sessionId = headers['x-posthog-session-id'];
69
- const windowId = headers['x-posthog-window-id'];
70
- const distinctId = headers['x-posthog-distinct-id'];
69
+ const { sessionId, distinctId } = (0, external_tracing_headers_js_namespaceObject.getPostHogTracingHeaderValues)(headers);
70
+ const properties = {};
71
+ (0, external_tracing_headers_js_namespaceObject.addProperty)(properties, '$current_url', request?.url);
72
+ (0, external_tracing_headers_js_namespaceObject.addProperty)(properties, '$request_method', request?.method);
73
+ (0, external_tracing_headers_js_namespaceObject.addProperty)(properties, '$request_path', request?.path ?? request?.url);
74
+ (0, external_tracing_headers_js_namespaceObject.addProperty)(properties, '$user_agent', (0, external_tracing_headers_js_namespaceObject.getFirstHeaderValue)(headers['user-agent']));
75
+ (0, external_tracing_headers_js_namespaceObject.addProperty)(properties, '$ip', getClientIp(headers, request));
71
76
  const contextData = {
72
- sessionId,
73
- distinctId,
74
- properties: {
75
- $current_url: request?.url,
76
- $request_method: request?.method,
77
- $request_path: request?.path ?? request?.url,
78
- $window_id: windowId,
79
- $user_agent: headers['user-agent'],
80
- $ip: getClientIp(headers, request)
81
- }
77
+ ...void 0 !== sessionId ? {
78
+ sessionId
79
+ } : {},
80
+ ...void 0 !== distinctId ? {
81
+ distinctId
82
+ } : {},
83
+ properties
82
84
  };
83
85
  this.posthog.enterContext(contextData);
84
86
  let source = next.handle();
@@ -1,10 +1,11 @@
1
1
  import { throwError } from "rxjs";
2
2
  import { catchError } from "rxjs/operators";
3
3
  import error_tracking from "./error-tracking/index.mjs";
4
+ import { addProperty, getFirstHeaderValue, getPostHogTracingHeaderValues } from "./tracing-headers.mjs";
4
5
  function getClientIp(headers, request) {
5
- const forwarded = headers['x-forwarded-for'];
6
+ const forwarded = getFirstHeaderValue(headers['x-forwarded-for']);
6
7
  if (forwarded) {
7
- const ip = String(forwarded).split(',')[0].trim();
8
+ const ip = forwarded.split(',')[0].trim();
8
9
  if (ip) return ip;
9
10
  }
10
11
  return request?.socket?.remoteAddress;
@@ -27,20 +28,21 @@ class PostHogInterceptor {
27
28
  const request = httpHost.getRequest();
28
29
  const response = httpHost.getResponse();
29
30
  const headers = request?.headers ?? {};
30
- const sessionId = headers['x-posthog-session-id'];
31
- const windowId = headers['x-posthog-window-id'];
32
- const distinctId = headers['x-posthog-distinct-id'];
31
+ const { sessionId, distinctId } = getPostHogTracingHeaderValues(headers);
32
+ const properties = {};
33
+ addProperty(properties, '$current_url', request?.url);
34
+ addProperty(properties, '$request_method', request?.method);
35
+ addProperty(properties, '$request_path', request?.path ?? request?.url);
36
+ addProperty(properties, '$user_agent', getFirstHeaderValue(headers['user-agent']));
37
+ addProperty(properties, '$ip', getClientIp(headers, request));
33
38
  const contextData = {
34
- sessionId,
35
- distinctId,
36
- properties: {
37
- $current_url: request?.url,
38
- $request_method: request?.method,
39
- $request_path: request?.path ?? request?.url,
40
- $window_id: windowId,
41
- $user_agent: headers['user-agent'],
42
- $ip: getClientIp(headers, request)
43
- }
39
+ ...void 0 !== sessionId ? {
40
+ sessionId
41
+ } : {},
42
+ ...void 0 !== distinctId ? {
43
+ distinctId
44
+ } : {},
45
+ properties
44
46
  };
45
47
  this.posthog.enterContext(contextData);
46
48
  let source = next.handle();
@@ -0,0 +1,16 @@
1
+ import type { IncomingHttpHeaders } from 'node:http';
2
+ type HeaderValue = IncomingHttpHeaders[string];
3
+ export declare const POSTHOG_TRACING_HEADERS: {
4
+ readonly sessionId: "x-posthog-session-id";
5
+ readonly distinctId: "x-posthog-distinct-id";
6
+ };
7
+ export interface PostHogTracingHeaderValues {
8
+ sessionId?: string;
9
+ distinctId?: string;
10
+ }
11
+ export declare function addProperty(properties: Record<string, any>, key: string, value: unknown): void;
12
+ export declare function getFirstHeaderValue(value: HeaderValue): string | undefined;
13
+ export declare function sanitizeTracingHeaderValue(value: HeaderValue): string | undefined;
14
+ export declare function getPostHogTracingHeaderValues(headers?: IncomingHttpHeaders): PostHogTracingHeaderValues;
15
+ export {};
16
+ //# sourceMappingURL=tracing-headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing-headers.d.ts","sourceRoot":"","sources":["../../src/extensions/tracing-headers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAOpD,KAAK,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAA;AAE9C,eAAO,MAAM,uBAAuB;;;CAG1B,CAAA;AAEV,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAI9F;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAE1E;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAqBjF;AAED,wBAAgB,6BAA6B,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,0BAA0B,CAYvG"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ POSTHOG_TRACING_HEADERS: ()=>POSTHOG_TRACING_HEADERS,
28
+ addProperty: ()=>addProperty,
29
+ getFirstHeaderValue: ()=>getFirstHeaderValue,
30
+ getPostHogTracingHeaderValues: ()=>getPostHogTracingHeaderValues,
31
+ sanitizeTracingHeaderValue: ()=>sanitizeTracingHeaderValue
32
+ });
33
+ const TRACING_HEADER_MAX_LENGTH = 1000;
34
+ const TRACING_HEADER_CONTROL_CHARS_REGEX = /[\x00-\x1f\x7f-\x9f]/g;
35
+ const POSTHOG_TRACING_HEADERS = {
36
+ sessionId: 'x-posthog-session-id',
37
+ distinctId: 'x-posthog-distinct-id'
38
+ };
39
+ function addProperty(properties, key, value) {
40
+ if (null != value && '' !== value) properties[key] = value;
41
+ }
42
+ function getFirstHeaderValue(value) {
43
+ return Array.isArray(value) ? value[0] : value;
44
+ }
45
+ function sanitizeTracingHeaderValue(value) {
46
+ if (Array.isArray(value)) {
47
+ for (const item of value){
48
+ const sanitized = sanitizeTracingHeaderValue(item);
49
+ if (void 0 !== sanitized) return sanitized;
50
+ }
51
+ return;
52
+ }
53
+ if ('string' != typeof value) return;
54
+ const sanitized = value.replace(TRACING_HEADER_CONTROL_CHARS_REGEX, '').trim();
55
+ if (!sanitized) return;
56
+ return sanitized.length > TRACING_HEADER_MAX_LENGTH ? sanitized.slice(0, TRACING_HEADER_MAX_LENGTH) : sanitized;
57
+ }
58
+ function getPostHogTracingHeaderValues(headers) {
59
+ if (!headers) return {};
60
+ const sessionId = sanitizeTracingHeaderValue(headers[POSTHOG_TRACING_HEADERS.sessionId]);
61
+ const distinctId = sanitizeTracingHeaderValue(headers[POSTHOG_TRACING_HEADERS.distinctId]);
62
+ return {
63
+ ...void 0 !== sessionId ? {
64
+ sessionId
65
+ } : {},
66
+ ...void 0 !== distinctId ? {
67
+ distinctId
68
+ } : {}
69
+ };
70
+ }
71
+ exports.POSTHOG_TRACING_HEADERS = __webpack_exports__.POSTHOG_TRACING_HEADERS;
72
+ exports.addProperty = __webpack_exports__.addProperty;
73
+ exports.getFirstHeaderValue = __webpack_exports__.getFirstHeaderValue;
74
+ exports.getPostHogTracingHeaderValues = __webpack_exports__.getPostHogTracingHeaderValues;
75
+ exports.sanitizeTracingHeaderValue = __webpack_exports__.sanitizeTracingHeaderValue;
76
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
77
+ "POSTHOG_TRACING_HEADERS",
78
+ "addProperty",
79
+ "getFirstHeaderValue",
80
+ "getPostHogTracingHeaderValues",
81
+ "sanitizeTracingHeaderValue"
82
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
83
+ Object.defineProperty(exports, '__esModule', {
84
+ value: true
85
+ });
@@ -0,0 +1,39 @@
1
+ const TRACING_HEADER_MAX_LENGTH = 1000;
2
+ const TRACING_HEADER_CONTROL_CHARS_REGEX = /[\x00-\x1f\x7f-\x9f]/g;
3
+ const POSTHOG_TRACING_HEADERS = {
4
+ sessionId: 'x-posthog-session-id',
5
+ distinctId: 'x-posthog-distinct-id'
6
+ };
7
+ function addProperty(properties, key, value) {
8
+ if (null != value && '' !== value) properties[key] = value;
9
+ }
10
+ function getFirstHeaderValue(value) {
11
+ return Array.isArray(value) ? value[0] : value;
12
+ }
13
+ function sanitizeTracingHeaderValue(value) {
14
+ if (Array.isArray(value)) {
15
+ for (const item of value){
16
+ const sanitized = sanitizeTracingHeaderValue(item);
17
+ if (void 0 !== sanitized) return sanitized;
18
+ }
19
+ return;
20
+ }
21
+ if ('string' != typeof value) return;
22
+ const sanitized = value.replace(TRACING_HEADER_CONTROL_CHARS_REGEX, '').trim();
23
+ if (!sanitized) return;
24
+ return sanitized.length > TRACING_HEADER_MAX_LENGTH ? sanitized.slice(0, TRACING_HEADER_MAX_LENGTH) : sanitized;
25
+ }
26
+ function getPostHogTracingHeaderValues(headers) {
27
+ if (!headers) return {};
28
+ const sessionId = sanitizeTracingHeaderValue(headers[POSTHOG_TRACING_HEADERS.sessionId]);
29
+ const distinctId = sanitizeTracingHeaderValue(headers[POSTHOG_TRACING_HEADERS.distinctId]);
30
+ return {
31
+ ...void 0 !== sessionId ? {
32
+ sessionId
33
+ } : {},
34
+ ...void 0 !== distinctId ? {
35
+ distinctId
36
+ } : {}
37
+ };
38
+ }
39
+ export { POSTHOG_TRACING_HEADERS, addProperty, getFirstHeaderValue, getPostHogTracingHeaderValues, sanitizeTracingHeaderValue };
package/dist/types.d.ts CHANGED
@@ -88,6 +88,7 @@ export type FeatureFlagCondition = {
88
88
  properties: FlagProperty[];
89
89
  rollout_percentage?: number;
90
90
  variant?: string;
91
+ aggregation_group_type_index?: number | null;
91
92
  };
92
93
  export type FeatureFlagBucketingIdentifier = 'distinct_id' | 'device_id' | '' | null;
93
94
  export type BeforeSendFn = (event: EventMessage | null) => EventMessage | null;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const version = "5.30.8";
1
+ export declare const version = "5.32.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -26,7 +26,7 @@ __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
27
  version: ()=>version
28
28
  });
29
- const version = '5.30.8';
29
+ const version = '5.32.0';
30
30
  exports.version = __webpack_exports__.version;
31
31
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
32
32
  "version"
package/dist/version.mjs CHANGED
@@ -1,2 +1,2 @@
1
- const version = '5.30.8';
1
+ const version = '5.32.0';
2
2
  export { version };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posthog-node",
3
- "version": "5.30.8",
3
+ "version": "5.32.0",
4
4
  "description": "PostHog Node.js integration",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,7 +1,9 @@
1
1
  import ErrorTracking from './error-tracking'
2
2
  import { PostHogBackendClient } from '../client'
3
3
  import { ErrorTracking as CoreErrorTracking } from '@posthog/core'
4
+ import { addProperty, getFirstHeaderValue, getPostHogTracingHeaderValues } from './tracing-headers'
4
5
  import type { Request, Response } from 'express'
6
+ import type { ContextData } from './context/types'
5
7
 
6
8
  type ExpressMiddleware = (req: Request, res: Response, next: () => void) => void
7
9
 
@@ -21,6 +23,47 @@ interface MiddlewareError extends Error {
21
23
  }
22
24
  }
23
25
 
26
+ function getClientIp(req: Request): string | undefined {
27
+ const forwarded = getFirstHeaderValue(req.headers['x-forwarded-for'])
28
+ if (forwarded) {
29
+ const ip = forwarded.split(',')[0].trim()
30
+ if (ip) return ip
31
+ }
32
+ return req.socket?.remoteAddress
33
+ }
34
+
35
+ function buildRequestContextData(req: Request): Partial<ContextData> {
36
+ const { sessionId, distinctId } = getPostHogTracingHeaderValues(req.headers)
37
+ const properties: Record<string, any> = {}
38
+
39
+ addProperty(properties, '$current_url', req.originalUrl || req.url)
40
+ addProperty(properties, '$request_method', req.method)
41
+ addProperty(properties, '$request_path', req.path)
42
+ addProperty(properties, '$user_agent', getFirstHeaderValue(req.headers['user-agent']))
43
+ addProperty(properties, '$ip', getClientIp(req))
44
+
45
+ return {
46
+ ...(sessionId !== undefined ? { sessionId } : {}),
47
+ ...(distinctId !== undefined ? { distinctId } : {}),
48
+ properties,
49
+ }
50
+ }
51
+
52
+ export function setupExpressRequestContext(
53
+ _posthog: PostHogBackendClient,
54
+ app: {
55
+ use: (middleware: ExpressMiddleware) => unknown
56
+ }
57
+ ): void {
58
+ app.use(posthogRequestContext(_posthog))
59
+ }
60
+
61
+ function posthogRequestContext(posthog: PostHogBackendClient): ExpressMiddleware {
62
+ return (req, _res, next): void => {
63
+ posthog.withContext(buildRequestContextData(req), () => next())
64
+ }
65
+ }
66
+
24
67
  export function setupExpressErrorHandler(
25
68
  _posthog: PostHogBackendClient,
26
69
  app: {
@@ -37,21 +80,17 @@ function posthogErrorHandler(posthog: PostHogBackendClient): ExpressErrorMiddlew
37
80
  return
38
81
  }
39
82
 
40
- const sessionId: string | undefined = req.headers['x-posthog-session-id'] as string | undefined
41
- const distinctId: string | undefined = req.headers['x-posthog-distinct-id'] as string | undefined
83
+ const contextData = buildRequestContextData(req)
42
84
  const syntheticException = new Error('Synthetic exception')
43
85
  const hint: CoreErrorTracking.EventHint = { mechanism: { type: 'middleware', handled: false }, syntheticException }
86
+ const additionalProperties: Record<string, any> = {
87
+ ...(contextData.sessionId !== undefined ? { $session_id: contextData.sessionId } : {}),
88
+ ...(contextData.properties || {}),
89
+ $response_status_code: res.statusCode,
90
+ }
44
91
 
45
92
  posthog.addPendingPromise(
46
- ErrorTracking.buildEventMessage(error, hint, distinctId, {
47
- $session_id: sessionId,
48
- $current_url: req.url,
49
- $request_method: req.method,
50
- $request_path: req.path,
51
- $user_agent: req.headers['user-agent'],
52
- $response_status_code: res.statusCode,
53
- $ip: req.headers['x-forwarded-for'] || req?.socket?.remoteAddress,
54
- }).then((msg) => {
93
+ ErrorTracking.buildEventMessage(error, hint, contextData.distinctId, additionalProperties).then((msg) => {
55
94
  posthog.capture(msg)
56
95
  })
57
96
  )
@@ -485,18 +485,55 @@ class FeatureFlagsPoller {
485
485
  ): Promise<FeatureFlagValue> {
486
486
  const flagFilters = flag.filters || {}
487
487
  const flagConditions = flagFilters.groups || []
488
+ const flagAggregation = flagFilters.aggregation_group_type_index
489
+ const { groups, groupProperties } = evaluationContext
488
490
  let isInconclusive = false
489
491
  let result = undefined
490
492
 
491
493
  for (const condition of flagConditions) {
492
494
  try {
493
- if (await this.isConditionMatch(flag, bucketingValue, condition, properties, evaluationContext)) {
495
+ // Per-condition aggregation overrides only when the condition explicitly
496
+ // sets its own aggregation_group_type_index (mixed targeting).
497
+ // When absent, use the properties/bucketing already resolved by the caller.
498
+ const conditionAggregation =
499
+ condition.aggregation_group_type_index !== undefined
500
+ ? condition.aggregation_group_type_index
501
+ : flagAggregation
502
+
503
+ let effectiveProperties = properties
504
+ let effectiveBucketingValue = bucketingValue
505
+
506
+ // Mixed-override path: condition-level aggregation differs from flag-level.
507
+ // This assumes flag-level aggregation is null/undefined for mixed flags.
508
+ if (conditionAggregation !== flagAggregation) {
509
+ if (conditionAggregation !== null && conditionAggregation !== undefined) {
510
+ const groupName = this.groupTypeMapping[String(conditionAggregation)]
511
+ if (!groupName || !(groupName in groups)) {
512
+ this.logMsgIfDebug(() =>
513
+ console.debug(
514
+ `[FEATURE FLAGS] Skipping group condition for flag '${flag.key}': group type index ${conditionAggregation} not available`
515
+ )
516
+ )
517
+ continue
518
+ }
519
+ if (!(groupName in groupProperties)) {
520
+ isInconclusive = true
521
+ continue
522
+ }
523
+ effectiveProperties = groupProperties[groupName]
524
+ effectiveBucketingValue = groups[groupName]
525
+ }
526
+ }
527
+
528
+ if (
529
+ await this.isConditionMatch(flag, effectiveBucketingValue, condition, effectiveProperties, evaluationContext)
530
+ ) {
494
531
  const variantOverride = condition.variant
495
532
  const flagVariants = flagFilters.multivariate?.variants || []
496
533
  if (variantOverride && flagVariants.some((variant) => variant.key === variantOverride)) {
497
534
  result = variantOverride
498
535
  } else {
499
- result = (await this.getMatchingVariant(flag, bucketingValue)) || true
536
+ result = (await this.getMatchingVariant(flag, effectiveBucketingValue)) || true
500
537
  }
501
538
  break
502
539
  }
@@ -1,7 +1,9 @@
1
+ import type { IncomingHttpHeaders } from 'node:http'
1
2
  import { Observable, throwError } from 'rxjs'
2
3
  import { catchError } from 'rxjs/operators'
3
4
 
4
5
  import ErrorTracking from './error-tracking'
6
+ import { addProperty, getFirstHeaderValue, getPostHogTracingHeaderValues } from './tracing-headers'
5
7
  import { PostHogBackendClient } from '../client'
6
8
 
7
9
  // Local interfaces to avoid runtime dependency on @nestjs/common
@@ -32,10 +34,10 @@ export interface PostHogInterceptorOptions {
32
34
  captureExceptions?: boolean | ExceptionCaptureOptions
33
35
  }
34
36
 
35
- function getClientIp(headers: Record<string, any>, request: any): string | undefined {
36
- const forwarded = headers['x-forwarded-for']
37
+ function getClientIp(headers: IncomingHttpHeaders, request: any): string | undefined {
38
+ const forwarded = getFirstHeaderValue(headers['x-forwarded-for'])
37
39
  if (forwarded) {
38
- const ip = String(forwarded).split(',')[0].trim()
40
+ const ip = forwarded.split(',')[0].trim()
39
41
  if (ip) return ip
40
42
  }
41
43
  return request?.socket?.remoteAddress
@@ -71,22 +73,20 @@ export class PostHogInterceptor implements NestInterceptor {
71
73
  const request = httpHost.getRequest()
72
74
  const response = httpHost.getResponse()
73
75
 
74
- const headers = request?.headers ?? {}
75
- const sessionId: string | undefined = headers['x-posthog-session-id']
76
- const windowId: string | undefined = headers['x-posthog-window-id']
77
- const distinctId: string | undefined = headers['x-posthog-distinct-id']
76
+ const headers = (request?.headers ?? {}) as IncomingHttpHeaders
77
+ const { sessionId, distinctId } = getPostHogTracingHeaderValues(headers)
78
+
79
+ const properties: Record<string, any> = {}
80
+ addProperty(properties, '$current_url', request?.url)
81
+ addProperty(properties, '$request_method', request?.method)
82
+ addProperty(properties, '$request_path', request?.path ?? request?.url)
83
+ addProperty(properties, '$user_agent', getFirstHeaderValue(headers['user-agent']))
84
+ addProperty(properties, '$ip', getClientIp(headers, request))
78
85
 
79
86
  const contextData = {
80
- sessionId,
81
- distinctId,
82
- properties: {
83
- $current_url: request?.url,
84
- $request_method: request?.method,
85
- $request_path: request?.path ?? request?.url,
86
- $window_id: windowId,
87
- $user_agent: headers['user-agent'],
88
- $ip: getClientIp(headers, request),
89
- },
87
+ ...(sessionId !== undefined ? { sessionId } : {}),
88
+ ...(distinctId !== undefined ? { distinctId } : {}),
89
+ properties,
90
90
  }
91
91
 
92
92
  // Use enterContext so the context propagates through RxJS Observable
@@ -0,0 +1,65 @@
1
+ import type { IncomingHttpHeaders } from 'node:http'
2
+
3
+ const TRACING_HEADER_MAX_LENGTH = 1000
4
+ // Remove C0 controls, DEL, and C1 controls from PostHog tracing IDs only.
5
+ // eslint-disable-next-line no-control-regex
6
+ const TRACING_HEADER_CONTROL_CHARS_REGEX = /[\x00-\x1f\x7f-\x9f]/g
7
+
8
+ type HeaderValue = IncomingHttpHeaders[string]
9
+
10
+ export const POSTHOG_TRACING_HEADERS = {
11
+ sessionId: 'x-posthog-session-id',
12
+ distinctId: 'x-posthog-distinct-id',
13
+ } as const
14
+
15
+ export interface PostHogTracingHeaderValues {
16
+ sessionId?: string
17
+ distinctId?: string
18
+ }
19
+
20
+ export function addProperty(properties: Record<string, any>, key: string, value: unknown): void {
21
+ if (value !== undefined && value !== null && value !== '') {
22
+ properties[key] = value
23
+ }
24
+ }
25
+
26
+ export function getFirstHeaderValue(value: HeaderValue): string | undefined {
27
+ return Array.isArray(value) ? value[0] : value
28
+ }
29
+
30
+ export function sanitizeTracingHeaderValue(value: HeaderValue): string | undefined {
31
+ if (Array.isArray(value)) {
32
+ for (const item of value) {
33
+ const sanitized = sanitizeTracingHeaderValue(item)
34
+ if (sanitized !== undefined) {
35
+ return sanitized
36
+ }
37
+ }
38
+ return undefined
39
+ }
40
+
41
+ if (typeof value !== 'string') {
42
+ return undefined
43
+ }
44
+
45
+ const sanitized = value.replace(TRACING_HEADER_CONTROL_CHARS_REGEX, '').trim()
46
+ if (!sanitized) {
47
+ return undefined
48
+ }
49
+
50
+ return sanitized.length > TRACING_HEADER_MAX_LENGTH ? sanitized.slice(0, TRACING_HEADER_MAX_LENGTH) : sanitized
51
+ }
52
+
53
+ export function getPostHogTracingHeaderValues(headers?: IncomingHttpHeaders): PostHogTracingHeaderValues {
54
+ if (!headers) {
55
+ return {}
56
+ }
57
+
58
+ const sessionId = sanitizeTracingHeaderValue(headers[POSTHOG_TRACING_HEADERS.sessionId])
59
+ const distinctId = sanitizeTracingHeaderValue(headers[POSTHOG_TRACING_HEADERS.distinctId])
60
+
61
+ return {
62
+ ...(sessionId !== undefined ? { sessionId } : {}),
63
+ ...(distinctId !== undefined ? { distinctId } : {}),
64
+ }
65
+ }
package/src/types.ts CHANGED
@@ -112,6 +112,7 @@ export type FeatureFlagCondition = {
112
112
  properties: FlagProperty[]
113
113
  rollout_percentage?: number
114
114
  variant?: string
115
+ aggregation_group_type_index?: number | null
115
116
  }
116
117
 
117
118
  export type FeatureFlagBucketingIdentifier = 'distinct_id' | 'device_id' | '' | null
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '5.30.8'
1
+ export const version = '5.32.0'