posthog-node 5.24.14 → 5.24.16
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.
- package/dist/extensions/feature-flags/feature-flags.d.ts +7 -6
- package/dist/extensions/feature-flags/feature-flags.d.ts.map +1 -1
- package/dist/extensions/feature-flags/feature-flags.js +28 -15
- package/dist/extensions/feature-flags/feature-flags.mjs +28 -15
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.mjs +1 -1
- package/package.json +2 -2
- package/src/extensions/feature-flags/feature-flags.ts +113 -31
- package/src/types.ts +3 -0
- package/src/version.ts +1 -1
|
@@ -54,23 +54,24 @@ declare class FeatureFlagsPoller {
|
|
|
54
54
|
constructor({ pollingInterval, personalApiKey, projectApiKey, timeout, host, customHeaders, ...options }: FeatureFlagsPollerOptions);
|
|
55
55
|
debug(enabled?: boolean): void;
|
|
56
56
|
private logMsgIfDebug;
|
|
57
|
-
getFeatureFlag(key: string, distinctId: string, groups?: Record<string, string>, personProperties?: Record<string,
|
|
58
|
-
getAllFlagsAndPayloads(distinctId: string, groups?: Record<string, string>, personProperties?: Record<string,
|
|
57
|
+
getFeatureFlag(key: string, distinctId: string, groups?: Record<string, string>, personProperties?: Record<string, any>, groupProperties?: Record<string, Record<string, any>>): Promise<FeatureFlagValue | undefined>;
|
|
58
|
+
getAllFlagsAndPayloads(distinctId: string, groups?: Record<string, string>, personProperties?: Record<string, any>, groupProperties?: Record<string, Record<string, any>>, flagKeysToExplicitlyEvaluate?: string[]): Promise<{
|
|
59
59
|
response: Record<string, FeatureFlagValue>;
|
|
60
60
|
payloads: Record<string, JsonType>;
|
|
61
61
|
fallbackToFlags: boolean;
|
|
62
62
|
}>;
|
|
63
|
-
computeFlagAndPayloadLocally(flag: PostHogFeatureFlag, distinctId: string, groups?: Record<string, string>, personProperties?: Record<string,
|
|
63
|
+
computeFlagAndPayloadLocally(flag: PostHogFeatureFlag, distinctId: string, groups?: Record<string, string>, personProperties?: Record<string, any>, groupProperties?: Record<string, Record<string, any>>, matchValue?: FeatureFlagValue, evaluationCache?: Record<string, FeatureFlagValue>, skipLoadCheck?: boolean): Promise<{
|
|
64
64
|
value: FeatureFlagValue;
|
|
65
65
|
payload: JsonType | null;
|
|
66
66
|
}>;
|
|
67
67
|
private computeFlagValueLocally;
|
|
68
|
+
private getBucketingValueForFlag;
|
|
68
69
|
private getFeatureFlagPayload;
|
|
69
70
|
private evaluateFlagDependency;
|
|
70
71
|
private flagEvaluatesToExpectedValue;
|
|
71
|
-
matchFeatureFlagProperties(flag: PostHogFeatureFlag,
|
|
72
|
-
isConditionMatch(flag: PostHogFeatureFlag,
|
|
73
|
-
getMatchingVariant(flag: PostHogFeatureFlag,
|
|
72
|
+
matchFeatureFlagProperties(flag: PostHogFeatureFlag, bucketingValue: string, properties: Record<string, any>, evaluationCache?: Record<string, FeatureFlagValue>, distinctId?: string, groups?: Record<string, string>, personProperties?: Record<string, any>, groupProperties?: Record<string, Record<string, any>>): Promise<FeatureFlagValue>;
|
|
73
|
+
isConditionMatch(flag: PostHogFeatureFlag, bucketingValue: string, condition: FeatureFlagCondition, properties: Record<string, any>, evaluationCache?: Record<string, FeatureFlagValue>, distinctId?: string, groups?: Record<string, string>, personProperties?: Record<string, any>, groupProperties?: Record<string, Record<string, any>>): Promise<boolean>;
|
|
74
|
+
getMatchingVariant(flag: PostHogFeatureFlag, bucketingValue: string): Promise<FeatureFlagValue | undefined>;
|
|
74
75
|
variantLookupTable(flag: PostHogFeatureFlag): {
|
|
75
76
|
valueMin: number;
|
|
76
77
|
valueMax: number;
|
|
@@ -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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"}
|
|
@@ -152,8 +152,7 @@ class FeatureFlagsPoller {
|
|
|
152
152
|
if (!flag.active) return false;
|
|
153
153
|
const flagFilters = flag.filters || {};
|
|
154
154
|
const aggregation_group_type_index = flagFilters.aggregation_group_type_index;
|
|
155
|
-
if (void 0
|
|
156
|
-
{
|
|
155
|
+
if (void 0 != aggregation_group_type_index) {
|
|
157
156
|
const groupName = this.groupTypeMapping[String(aggregation_group_type_index)];
|
|
158
157
|
if (!groupName) {
|
|
159
158
|
this.logMsgIfDebug(()=>console.warn(`[FEATURE FLAGS] Unknown group type index ${aggregation_group_type_index} for feature flag ${flag.key}`));
|
|
@@ -164,8 +163,22 @@ class FeatureFlagsPoller {
|
|
|
164
163
|
return false;
|
|
165
164
|
}
|
|
166
165
|
const focusedGroupProperties = groupProperties[groupName];
|
|
167
|
-
return await this.matchFeatureFlagProperties(flag, groups[groupName], focusedGroupProperties, evaluationCache);
|
|
166
|
+
return await this.matchFeatureFlagProperties(flag, groups[groupName], focusedGroupProperties, evaluationCache, distinctId, groups, personProperties, groupProperties);
|
|
167
|
+
}
|
|
168
|
+
{
|
|
169
|
+
const bucketingValue = this.getBucketingValueForFlag(flag, distinctId, personProperties);
|
|
170
|
+
if (void 0 === bucketingValue) throw new InconclusiveMatchError(`Can't compute feature flag: ${flag.key} without $device_id`);
|
|
171
|
+
return await this.matchFeatureFlagProperties(flag, bucketingValue, personProperties, evaluationCache, distinctId, groups, personProperties, groupProperties);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
getBucketingValueForFlag(flag, distinctId, properties) {
|
|
175
|
+
if (flag.filters?.aggregation_group_type_index != void 0) return distinctId;
|
|
176
|
+
if ('device_id' === flag.bucketing_identifier) {
|
|
177
|
+
const deviceId = properties?.$device_id;
|
|
178
|
+
if (null == deviceId || '' === deviceId) return;
|
|
179
|
+
return deviceId;
|
|
168
180
|
}
|
|
181
|
+
return distinctId;
|
|
169
182
|
}
|
|
170
183
|
getFeatureFlagPayload(key, flagValue) {
|
|
171
184
|
let payload = null;
|
|
@@ -182,7 +195,7 @@ class FeatureFlagsPoller {
|
|
|
182
195
|
}
|
|
183
196
|
return null;
|
|
184
197
|
}
|
|
185
|
-
async evaluateFlagDependency(property, distinctId, properties, evaluationCache) {
|
|
198
|
+
async evaluateFlagDependency(property, distinctId, groups, personProperties, groupProperties, properties, evaluationCache) {
|
|
186
199
|
const targetFlagKey = property.key;
|
|
187
200
|
if (!this.featureFlagsByKey) throw new InconclusiveMatchError('Feature flags not available for dependency evaluation');
|
|
188
201
|
if (!('dependency_chain' in property)) throw new InconclusiveMatchError(`Flag dependency property for '${targetFlagKey}' is missing required 'dependency_chain' field`);
|
|
@@ -193,7 +206,7 @@ class FeatureFlagsPoller {
|
|
|
193
206
|
if (!(depFlagKey in evaluationCache)) {
|
|
194
207
|
const depFlag = this.featureFlagsByKey[depFlagKey];
|
|
195
208
|
if (depFlag) if (depFlag.active) try {
|
|
196
|
-
const depResult = await this.
|
|
209
|
+
const depResult = await this.computeFlagValueLocally(depFlag, distinctId, groups, personProperties, groupProperties, evaluationCache);
|
|
197
210
|
evaluationCache[depFlagKey] = depResult;
|
|
198
211
|
} catch (error) {
|
|
199
212
|
throw new InconclusiveMatchError(`Error evaluating flag dependency '${depFlagKey}' for flag '${targetFlagKey}': ${error}`);
|
|
@@ -212,16 +225,16 @@ class FeatureFlagsPoller {
|
|
|
212
225
|
if ('string' == typeof expectedValue) return flagValue === expectedValue;
|
|
213
226
|
return false;
|
|
214
227
|
}
|
|
215
|
-
async matchFeatureFlagProperties(flag,
|
|
228
|
+
async matchFeatureFlagProperties(flag, bucketingValue, properties, evaluationCache = {}, distinctId = bucketingValue, groups = {}, personProperties = {}, groupProperties = {}) {
|
|
216
229
|
const flagFilters = flag.filters || {};
|
|
217
230
|
const flagConditions = flagFilters.groups || [];
|
|
218
231
|
let isInconclusive = false;
|
|
219
232
|
let result;
|
|
220
233
|
for (const condition of flagConditions)try {
|
|
221
|
-
if (await this.isConditionMatch(flag,
|
|
234
|
+
if (await this.isConditionMatch(flag, bucketingValue, condition, properties, evaluationCache, distinctId, groups, personProperties, groupProperties)) {
|
|
222
235
|
const variantOverride = condition.variant;
|
|
223
236
|
const flagVariants = flagFilters.multivariate?.variants || [];
|
|
224
|
-
result = variantOverride && flagVariants.some((variant)=>variant.key === variantOverride) ? variantOverride : await this.getMatchingVariant(flag,
|
|
237
|
+
result = variantOverride && flagVariants.some((variant)=>variant.key === variantOverride) ? variantOverride : await this.getMatchingVariant(flag, bucketingValue) || true;
|
|
225
238
|
break;
|
|
226
239
|
}
|
|
227
240
|
} catch (e) {
|
|
@@ -233,7 +246,7 @@ class FeatureFlagsPoller {
|
|
|
233
246
|
if (isInconclusive) throw new InconclusiveMatchError("Can't determine if feature flag is enabled or not with given properties");
|
|
234
247
|
return false;
|
|
235
248
|
}
|
|
236
|
-
async isConditionMatch(flag,
|
|
249
|
+
async isConditionMatch(flag, bucketingValue, condition, properties, evaluationCache = {}, distinctId = bucketingValue, groups = {}, personProperties = {}, groupProperties = {}) {
|
|
237
250
|
const rolloutPercentage = condition.rollout_percentage;
|
|
238
251
|
const warnFunction = (msg)=>{
|
|
239
252
|
this.logMsgIfDebug(()=>console.warn(msg));
|
|
@@ -242,16 +255,16 @@ class FeatureFlagsPoller {
|
|
|
242
255
|
for (const prop of condition.properties){
|
|
243
256
|
const propertyType = prop.type;
|
|
244
257
|
let matches = false;
|
|
245
|
-
matches = 'cohort' === propertyType ? matchCohort(prop, properties, this.cohorts, this.debugMode) : 'flag' === propertyType ? await this.evaluateFlagDependency(prop, distinctId, properties, evaluationCache) : matchProperty(prop, properties, warnFunction);
|
|
258
|
+
matches = 'cohort' === propertyType ? matchCohort(prop, properties, this.cohorts, this.debugMode) : 'flag' === propertyType ? await this.evaluateFlagDependency(prop, distinctId, groups, personProperties, groupProperties, properties, evaluationCache) : matchProperty(prop, properties, warnFunction);
|
|
246
259
|
if (!matches) return false;
|
|
247
260
|
}
|
|
248
261
|
if (void 0 == rolloutPercentage) return true;
|
|
249
262
|
}
|
|
250
|
-
if (void 0 != rolloutPercentage && await _hash(flag.key,
|
|
263
|
+
if (void 0 != rolloutPercentage && await _hash(flag.key, bucketingValue) > rolloutPercentage / 100.0) return false;
|
|
251
264
|
return true;
|
|
252
265
|
}
|
|
253
|
-
async getMatchingVariant(flag,
|
|
254
|
-
const hashValue = await _hash(flag.key,
|
|
266
|
+
async getMatchingVariant(flag, bucketingValue) {
|
|
267
|
+
const hashValue = await _hash(flag.key, bucketingValue, 'variant');
|
|
255
268
|
const matchingVariant = this.variantLookupTable(flag).find((variant)=>hashValue >= variant.valueMin && hashValue < variant.valueMax);
|
|
256
269
|
if (matchingVariant) return matchingVariant.key;
|
|
257
270
|
}
|
|
@@ -440,8 +453,8 @@ class FeatureFlagsPoller {
|
|
|
440
453
|
}
|
|
441
454
|
}
|
|
442
455
|
}
|
|
443
|
-
async function _hash(key,
|
|
444
|
-
const hashString = await (0, external_crypto_js_namespaceObject.hashSHA1)(`${key}.${
|
|
456
|
+
async function _hash(key, bucketingValue, salt = '') {
|
|
457
|
+
const hashString = await (0, external_crypto_js_namespaceObject.hashSHA1)(`${key}.${bucketingValue}${salt}`);
|
|
445
458
|
return parseInt(hashString.slice(0, 15), 16) / LONG_SCALE;
|
|
446
459
|
}
|
|
447
460
|
function matchProperty(property, propertyValues, warnFunction) {
|
|
@@ -119,8 +119,7 @@ class FeatureFlagsPoller {
|
|
|
119
119
|
if (!flag.active) return false;
|
|
120
120
|
const flagFilters = flag.filters || {};
|
|
121
121
|
const aggregation_group_type_index = flagFilters.aggregation_group_type_index;
|
|
122
|
-
if (void 0
|
|
123
|
-
{
|
|
122
|
+
if (void 0 != aggregation_group_type_index) {
|
|
124
123
|
const groupName = this.groupTypeMapping[String(aggregation_group_type_index)];
|
|
125
124
|
if (!groupName) {
|
|
126
125
|
this.logMsgIfDebug(()=>console.warn(`[FEATURE FLAGS] Unknown group type index ${aggregation_group_type_index} for feature flag ${flag.key}`));
|
|
@@ -131,8 +130,22 @@ class FeatureFlagsPoller {
|
|
|
131
130
|
return false;
|
|
132
131
|
}
|
|
133
132
|
const focusedGroupProperties = groupProperties[groupName];
|
|
134
|
-
return await this.matchFeatureFlagProperties(flag, groups[groupName], focusedGroupProperties, evaluationCache);
|
|
133
|
+
return await this.matchFeatureFlagProperties(flag, groups[groupName], focusedGroupProperties, evaluationCache, distinctId, groups, personProperties, groupProperties);
|
|
134
|
+
}
|
|
135
|
+
{
|
|
136
|
+
const bucketingValue = this.getBucketingValueForFlag(flag, distinctId, personProperties);
|
|
137
|
+
if (void 0 === bucketingValue) throw new InconclusiveMatchError(`Can't compute feature flag: ${flag.key} without $device_id`);
|
|
138
|
+
return await this.matchFeatureFlagProperties(flag, bucketingValue, personProperties, evaluationCache, distinctId, groups, personProperties, groupProperties);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
getBucketingValueForFlag(flag, distinctId, properties) {
|
|
142
|
+
if (flag.filters?.aggregation_group_type_index != void 0) return distinctId;
|
|
143
|
+
if ('device_id' === flag.bucketing_identifier) {
|
|
144
|
+
const deviceId = properties?.$device_id;
|
|
145
|
+
if (null == deviceId || '' === deviceId) return;
|
|
146
|
+
return deviceId;
|
|
135
147
|
}
|
|
148
|
+
return distinctId;
|
|
136
149
|
}
|
|
137
150
|
getFeatureFlagPayload(key, flagValue) {
|
|
138
151
|
let payload = null;
|
|
@@ -149,7 +162,7 @@ class FeatureFlagsPoller {
|
|
|
149
162
|
}
|
|
150
163
|
return null;
|
|
151
164
|
}
|
|
152
|
-
async evaluateFlagDependency(property, distinctId, properties, evaluationCache) {
|
|
165
|
+
async evaluateFlagDependency(property, distinctId, groups, personProperties, groupProperties, properties, evaluationCache) {
|
|
153
166
|
const targetFlagKey = property.key;
|
|
154
167
|
if (!this.featureFlagsByKey) throw new InconclusiveMatchError('Feature flags not available for dependency evaluation');
|
|
155
168
|
if (!('dependency_chain' in property)) throw new InconclusiveMatchError(`Flag dependency property for '${targetFlagKey}' is missing required 'dependency_chain' field`);
|
|
@@ -160,7 +173,7 @@ class FeatureFlagsPoller {
|
|
|
160
173
|
if (!(depFlagKey in evaluationCache)) {
|
|
161
174
|
const depFlag = this.featureFlagsByKey[depFlagKey];
|
|
162
175
|
if (depFlag) if (depFlag.active) try {
|
|
163
|
-
const depResult = await this.
|
|
176
|
+
const depResult = await this.computeFlagValueLocally(depFlag, distinctId, groups, personProperties, groupProperties, evaluationCache);
|
|
164
177
|
evaluationCache[depFlagKey] = depResult;
|
|
165
178
|
} catch (error) {
|
|
166
179
|
throw new InconclusiveMatchError(`Error evaluating flag dependency '${depFlagKey}' for flag '${targetFlagKey}': ${error}`);
|
|
@@ -179,16 +192,16 @@ class FeatureFlagsPoller {
|
|
|
179
192
|
if ('string' == typeof expectedValue) return flagValue === expectedValue;
|
|
180
193
|
return false;
|
|
181
194
|
}
|
|
182
|
-
async matchFeatureFlagProperties(flag,
|
|
195
|
+
async matchFeatureFlagProperties(flag, bucketingValue, properties, evaluationCache = {}, distinctId = bucketingValue, groups = {}, personProperties = {}, groupProperties = {}) {
|
|
183
196
|
const flagFilters = flag.filters || {};
|
|
184
197
|
const flagConditions = flagFilters.groups || [];
|
|
185
198
|
let isInconclusive = false;
|
|
186
199
|
let result;
|
|
187
200
|
for (const condition of flagConditions)try {
|
|
188
|
-
if (await this.isConditionMatch(flag,
|
|
201
|
+
if (await this.isConditionMatch(flag, bucketingValue, condition, properties, evaluationCache, distinctId, groups, personProperties, groupProperties)) {
|
|
189
202
|
const variantOverride = condition.variant;
|
|
190
203
|
const flagVariants = flagFilters.multivariate?.variants || [];
|
|
191
|
-
result = variantOverride && flagVariants.some((variant)=>variant.key === variantOverride) ? variantOverride : await this.getMatchingVariant(flag,
|
|
204
|
+
result = variantOverride && flagVariants.some((variant)=>variant.key === variantOverride) ? variantOverride : await this.getMatchingVariant(flag, bucketingValue) || true;
|
|
192
205
|
break;
|
|
193
206
|
}
|
|
194
207
|
} catch (e) {
|
|
@@ -200,7 +213,7 @@ class FeatureFlagsPoller {
|
|
|
200
213
|
if (isInconclusive) throw new InconclusiveMatchError("Can't determine if feature flag is enabled or not with given properties");
|
|
201
214
|
return false;
|
|
202
215
|
}
|
|
203
|
-
async isConditionMatch(flag,
|
|
216
|
+
async isConditionMatch(flag, bucketingValue, condition, properties, evaluationCache = {}, distinctId = bucketingValue, groups = {}, personProperties = {}, groupProperties = {}) {
|
|
204
217
|
const rolloutPercentage = condition.rollout_percentage;
|
|
205
218
|
const warnFunction = (msg)=>{
|
|
206
219
|
this.logMsgIfDebug(()=>console.warn(msg));
|
|
@@ -209,16 +222,16 @@ class FeatureFlagsPoller {
|
|
|
209
222
|
for (const prop of condition.properties){
|
|
210
223
|
const propertyType = prop.type;
|
|
211
224
|
let matches = false;
|
|
212
|
-
matches = 'cohort' === propertyType ? matchCohort(prop, properties, this.cohorts, this.debugMode) : 'flag' === propertyType ? await this.evaluateFlagDependency(prop, distinctId, properties, evaluationCache) : matchProperty(prop, properties, warnFunction);
|
|
225
|
+
matches = 'cohort' === propertyType ? matchCohort(prop, properties, this.cohorts, this.debugMode) : 'flag' === propertyType ? await this.evaluateFlagDependency(prop, distinctId, groups, personProperties, groupProperties, properties, evaluationCache) : matchProperty(prop, properties, warnFunction);
|
|
213
226
|
if (!matches) return false;
|
|
214
227
|
}
|
|
215
228
|
if (void 0 == rolloutPercentage) return true;
|
|
216
229
|
}
|
|
217
|
-
if (void 0 != rolloutPercentage && await _hash(flag.key,
|
|
230
|
+
if (void 0 != rolloutPercentage && await _hash(flag.key, bucketingValue) > rolloutPercentage / 100.0) return false;
|
|
218
231
|
return true;
|
|
219
232
|
}
|
|
220
|
-
async getMatchingVariant(flag,
|
|
221
|
-
const hashValue = await _hash(flag.key,
|
|
233
|
+
async getMatchingVariant(flag, bucketingValue) {
|
|
234
|
+
const hashValue = await _hash(flag.key, bucketingValue, 'variant');
|
|
222
235
|
const matchingVariant = this.variantLookupTable(flag).find((variant)=>hashValue >= variant.valueMin && hashValue < variant.valueMax);
|
|
223
236
|
if (matchingVariant) return matchingVariant.key;
|
|
224
237
|
}
|
|
@@ -407,8 +420,8 @@ class FeatureFlagsPoller {
|
|
|
407
420
|
}
|
|
408
421
|
}
|
|
409
422
|
}
|
|
410
|
-
async function _hash(key,
|
|
411
|
-
const hashString = await hashSHA1(`${key}.${
|
|
423
|
+
async function _hash(key, bucketingValue, salt = '') {
|
|
424
|
+
const hashString = await hashSHA1(`${key}.${bucketingValue}${salt}`);
|
|
412
425
|
return parseInt(hashString.slice(0, 15), 16) / LONG_SCALE;
|
|
413
426
|
}
|
|
414
427
|
function matchProperty(property, propertyValues, warnFunction) {
|
package/dist/types.d.ts
CHANGED
|
@@ -70,6 +70,7 @@ export type FeatureFlagCondition = {
|
|
|
70
70
|
rollout_percentage?: number;
|
|
71
71
|
variant?: string;
|
|
72
72
|
};
|
|
73
|
+
export type FeatureFlagBucketingIdentifier = 'distinct_id' | 'device_id' | '' | null;
|
|
73
74
|
export type BeforeSendFn = (event: EventMessage | null) => EventMessage | null;
|
|
74
75
|
export type PostHogOptions = Omit<PostHogCoreOptions, 'before_send'> & {
|
|
75
76
|
persistence?: 'memory';
|
|
@@ -169,6 +170,7 @@ export type PostHogFeatureFlag = {
|
|
|
169
170
|
id: number;
|
|
170
171
|
name: string;
|
|
171
172
|
key: string;
|
|
173
|
+
bucketing_identifier?: FeatureFlagBucketingIdentifier;
|
|
172
174
|
filters?: {
|
|
173
175
|
aggregation_group_type_index?: number;
|
|
174
176
|
groups?: FeatureFlagCondition[];
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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.24.
|
|
1
|
+
export declare const version = "5.24.16";
|
|
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.24.
|
|
29
|
+
const version = '5.24.16';
|
|
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.24.
|
|
1
|
+
const version = '5.24.16';
|
|
2
2
|
export { version };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "posthog-node",
|
|
3
|
-
"version": "5.24.
|
|
3
|
+
"version": "5.24.16",
|
|
4
4
|
"description": "PostHog Node.js integration",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"module": "dist/entrypoints/index.node.mjs",
|
|
26
26
|
"types": "dist/entrypoints/index.node.d.ts",
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@posthog/core": "1.
|
|
28
|
+
"@posthog/core": "1.23.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@rslib/core": "0.10.6",
|
|
@@ -126,8 +126,8 @@ class FeatureFlagsPoller {
|
|
|
126
126
|
key: string,
|
|
127
127
|
distinctId: string,
|
|
128
128
|
groups: Record<string, string> = {},
|
|
129
|
-
personProperties: Record<string,
|
|
130
|
-
groupProperties: Record<string, Record<string,
|
|
129
|
+
personProperties: Record<string, any> = {},
|
|
130
|
+
groupProperties: Record<string, Record<string, any>> = {}
|
|
131
131
|
): Promise<FeatureFlagValue | undefined> {
|
|
132
132
|
await this.loadFeatureFlags()
|
|
133
133
|
|
|
@@ -166,8 +166,8 @@ class FeatureFlagsPoller {
|
|
|
166
166
|
async getAllFlagsAndPayloads(
|
|
167
167
|
distinctId: string,
|
|
168
168
|
groups: Record<string, string> = {},
|
|
169
|
-
personProperties: Record<string,
|
|
170
|
-
groupProperties: Record<string, Record<string,
|
|
169
|
+
personProperties: Record<string, any> = {},
|
|
170
|
+
groupProperties: Record<string, Record<string, any>> = {},
|
|
171
171
|
flagKeysToExplicitlyEvaluate?: string[]
|
|
172
172
|
): Promise<{
|
|
173
173
|
response: Record<string, FeatureFlagValue>
|
|
@@ -221,8 +221,8 @@ class FeatureFlagsPoller {
|
|
|
221
221
|
flag: PostHogFeatureFlag,
|
|
222
222
|
distinctId: string,
|
|
223
223
|
groups: Record<string, string> = {},
|
|
224
|
-
personProperties: Record<string,
|
|
225
|
-
groupProperties: Record<string, Record<string,
|
|
224
|
+
personProperties: Record<string, any> = {},
|
|
225
|
+
groupProperties: Record<string, Record<string, any>> = {},
|
|
226
226
|
matchValue?: FeatureFlagValue,
|
|
227
227
|
evaluationCache?: Record<string, FeatureFlagValue>,
|
|
228
228
|
skipLoadCheck: boolean = false
|
|
@@ -265,8 +265,8 @@ class FeatureFlagsPoller {
|
|
|
265
265
|
flag: PostHogFeatureFlag,
|
|
266
266
|
distinctId: string,
|
|
267
267
|
groups: Record<string, string> = {},
|
|
268
|
-
personProperties: Record<string,
|
|
269
|
-
groupProperties: Record<string, Record<string,
|
|
268
|
+
personProperties: Record<string, any> = {},
|
|
269
|
+
groupProperties: Record<string, Record<string, any>> = {},
|
|
270
270
|
evaluationCache: Record<string, FeatureFlagValue> = {}
|
|
271
271
|
): Promise<FeatureFlagValue> {
|
|
272
272
|
if (flag.ensure_experience_continuity) {
|
|
@@ -300,10 +300,55 @@ class FeatureFlagsPoller {
|
|
|
300
300
|
}
|
|
301
301
|
|
|
302
302
|
const focusedGroupProperties = groupProperties[groupName]
|
|
303
|
-
return await this.matchFeatureFlagProperties(
|
|
303
|
+
return await this.matchFeatureFlagProperties(
|
|
304
|
+
flag,
|
|
305
|
+
groups[groupName],
|
|
306
|
+
focusedGroupProperties,
|
|
307
|
+
evaluationCache,
|
|
308
|
+
distinctId,
|
|
309
|
+
groups,
|
|
310
|
+
personProperties,
|
|
311
|
+
groupProperties
|
|
312
|
+
)
|
|
304
313
|
} else {
|
|
305
|
-
|
|
314
|
+
const bucketingValue = this.getBucketingValueForFlag(flag, distinctId, personProperties)
|
|
315
|
+
if (bucketingValue === undefined) {
|
|
316
|
+
throw new InconclusiveMatchError(`Can't compute feature flag: ${flag.key} without $device_id`)
|
|
317
|
+
}
|
|
318
|
+
return await this.matchFeatureFlagProperties(
|
|
319
|
+
flag,
|
|
320
|
+
bucketingValue,
|
|
321
|
+
personProperties,
|
|
322
|
+
evaluationCache,
|
|
323
|
+
distinctId,
|
|
324
|
+
groups,
|
|
325
|
+
personProperties,
|
|
326
|
+
groupProperties
|
|
327
|
+
)
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
private getBucketingValueForFlag(
|
|
332
|
+
flag: PostHogFeatureFlag,
|
|
333
|
+
distinctId: string,
|
|
334
|
+
properties: Record<string, any>
|
|
335
|
+
): string | undefined {
|
|
336
|
+
if (flag.filters?.aggregation_group_type_index != undefined) {
|
|
337
|
+
// Group flags are bucketed by group key in computeFlagValueLocally.
|
|
338
|
+
// If a group flag appears in dependency evaluation, ignore bucketing_identifier
|
|
339
|
+
// to preserve existing behavior and avoid requiring $device_id unexpectedly.
|
|
340
|
+
return distinctId
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (flag.bucketing_identifier === 'device_id') {
|
|
344
|
+
const deviceId = properties?.$device_id
|
|
345
|
+
if (deviceId === undefined || deviceId === null || deviceId === '') {
|
|
346
|
+
return undefined
|
|
347
|
+
}
|
|
348
|
+
return deviceId
|
|
306
349
|
}
|
|
350
|
+
|
|
351
|
+
return distinctId
|
|
307
352
|
}
|
|
308
353
|
|
|
309
354
|
private getFeatureFlagPayload(key: string, flagValue: FeatureFlagValue): JsonType | null {
|
|
@@ -340,7 +385,10 @@ class FeatureFlagsPoller {
|
|
|
340
385
|
private async evaluateFlagDependency(
|
|
341
386
|
property: FlagProperty,
|
|
342
387
|
distinctId: string,
|
|
343
|
-
|
|
388
|
+
groups: Record<string, string>,
|
|
389
|
+
personProperties: Record<string, any>,
|
|
390
|
+
groupProperties: Record<string, Record<string, any>>,
|
|
391
|
+
properties: Record<string, any>,
|
|
344
392
|
evaluationCache: Record<string, FeatureFlagValue>
|
|
345
393
|
): Promise<boolean> {
|
|
346
394
|
const targetFlagKey = property.key
|
|
@@ -384,12 +432,18 @@ class FeatureFlagsPoller {
|
|
|
384
432
|
// Inactive flag evaluates to false
|
|
385
433
|
evaluationCache[depFlagKey] = false
|
|
386
434
|
} else {
|
|
387
|
-
//
|
|
435
|
+
// Reuse full flag evaluation so dependencies respect person vs group bucketing rules.
|
|
388
436
|
try {
|
|
389
|
-
const depResult = await this.
|
|
437
|
+
const depResult = await this.computeFlagValueLocally(
|
|
438
|
+
depFlag,
|
|
439
|
+
distinctId,
|
|
440
|
+
groups,
|
|
441
|
+
personProperties,
|
|
442
|
+
groupProperties,
|
|
443
|
+
evaluationCache
|
|
444
|
+
)
|
|
390
445
|
evaluationCache[depFlagKey] = depResult
|
|
391
446
|
} catch (error) {
|
|
392
|
-
// If we can't evaluate a dependency, store throw InconclusiveMatchError(`Missing flag dependency '${depFlagKey}' for flag '${targetFlagKey}'`)
|
|
393
447
|
throw new InconclusiveMatchError(
|
|
394
448
|
`Error evaluating flag dependency '${depFlagKey}' for flag '${targetFlagKey}': ${error}`
|
|
395
449
|
)
|
|
@@ -430,9 +484,13 @@ class FeatureFlagsPoller {
|
|
|
430
484
|
|
|
431
485
|
async matchFeatureFlagProperties(
|
|
432
486
|
flag: PostHogFeatureFlag,
|
|
433
|
-
|
|
434
|
-
properties: Record<string,
|
|
435
|
-
evaluationCache: Record<string, FeatureFlagValue> = {}
|
|
487
|
+
bucketingValue: string,
|
|
488
|
+
properties: Record<string, any>,
|
|
489
|
+
evaluationCache: Record<string, FeatureFlagValue> = {},
|
|
490
|
+
distinctId: string = bucketingValue,
|
|
491
|
+
groups: Record<string, string> = {},
|
|
492
|
+
personProperties: Record<string, any> = {},
|
|
493
|
+
groupProperties: Record<string, Record<string, any>> = {}
|
|
436
494
|
): Promise<FeatureFlagValue> {
|
|
437
495
|
const flagFilters = flag.filters || {}
|
|
438
496
|
const flagConditions = flagFilters.groups || []
|
|
@@ -441,13 +499,25 @@ class FeatureFlagsPoller {
|
|
|
441
499
|
|
|
442
500
|
for (const condition of flagConditions) {
|
|
443
501
|
try {
|
|
444
|
-
if (
|
|
502
|
+
if (
|
|
503
|
+
await this.isConditionMatch(
|
|
504
|
+
flag,
|
|
505
|
+
bucketingValue,
|
|
506
|
+
condition,
|
|
507
|
+
properties,
|
|
508
|
+
evaluationCache,
|
|
509
|
+
distinctId,
|
|
510
|
+
groups,
|
|
511
|
+
personProperties,
|
|
512
|
+
groupProperties
|
|
513
|
+
)
|
|
514
|
+
) {
|
|
445
515
|
const variantOverride = condition.variant
|
|
446
516
|
const flagVariants = flagFilters.multivariate?.variants || []
|
|
447
517
|
if (variantOverride && flagVariants.some((variant) => variant.key === variantOverride)) {
|
|
448
518
|
result = variantOverride
|
|
449
519
|
} else {
|
|
450
|
-
result = (await this.getMatchingVariant(flag,
|
|
520
|
+
result = (await this.getMatchingVariant(flag, bucketingValue)) || true
|
|
451
521
|
}
|
|
452
522
|
break
|
|
453
523
|
}
|
|
@@ -478,10 +548,14 @@ class FeatureFlagsPoller {
|
|
|
478
548
|
|
|
479
549
|
async isConditionMatch(
|
|
480
550
|
flag: PostHogFeatureFlag,
|
|
481
|
-
|
|
551
|
+
bucketingValue: string,
|
|
482
552
|
condition: FeatureFlagCondition,
|
|
483
|
-
properties: Record<string,
|
|
484
|
-
evaluationCache: Record<string, FeatureFlagValue> = {}
|
|
553
|
+
properties: Record<string, any>,
|
|
554
|
+
evaluationCache: Record<string, FeatureFlagValue> = {},
|
|
555
|
+
distinctId: string = bucketingValue,
|
|
556
|
+
groups: Record<string, string> = {},
|
|
557
|
+
personProperties: Record<string, any> = {},
|
|
558
|
+
groupProperties: Record<string, Record<string, any>> = {}
|
|
485
559
|
): Promise<boolean> {
|
|
486
560
|
const rolloutPercentage = condition.rollout_percentage
|
|
487
561
|
const warnFunction = (msg: string): void => {
|
|
@@ -495,7 +569,15 @@ class FeatureFlagsPoller {
|
|
|
495
569
|
if (propertyType === 'cohort') {
|
|
496
570
|
matches = matchCohort(prop, properties, this.cohorts, this.debugMode)
|
|
497
571
|
} else if (propertyType === 'flag') {
|
|
498
|
-
matches = await this.evaluateFlagDependency(
|
|
572
|
+
matches = await this.evaluateFlagDependency(
|
|
573
|
+
prop,
|
|
574
|
+
distinctId,
|
|
575
|
+
groups,
|
|
576
|
+
personProperties,
|
|
577
|
+
groupProperties,
|
|
578
|
+
properties,
|
|
579
|
+
evaluationCache
|
|
580
|
+
)
|
|
499
581
|
} else {
|
|
500
582
|
matches = matchProperty(prop, properties, warnFunction)
|
|
501
583
|
}
|
|
@@ -510,15 +592,15 @@ class FeatureFlagsPoller {
|
|
|
510
592
|
}
|
|
511
593
|
}
|
|
512
594
|
|
|
513
|
-
if (rolloutPercentage != undefined && (await _hash(flag.key,
|
|
595
|
+
if (rolloutPercentage != undefined && (await _hash(flag.key, bucketingValue)) > rolloutPercentage / 100.0) {
|
|
514
596
|
return false
|
|
515
597
|
}
|
|
516
598
|
|
|
517
599
|
return true
|
|
518
600
|
}
|
|
519
601
|
|
|
520
|
-
async getMatchingVariant(flag: PostHogFeatureFlag,
|
|
521
|
-
const hashValue = await _hash(flag.key,
|
|
602
|
+
async getMatchingVariant(flag: PostHogFeatureFlag, bucketingValue: string): Promise<FeatureFlagValue | undefined> {
|
|
603
|
+
const hashValue = await _hash(flag.key, bucketingValue, 'variant')
|
|
522
604
|
const matchingVariant = this.variantLookupTable(flag).find((variant) => {
|
|
523
605
|
return hashValue >= variant.valueMin && hashValue < variant.valueMax
|
|
524
606
|
})
|
|
@@ -904,12 +986,12 @@ class FeatureFlagsPoller {
|
|
|
904
986
|
}
|
|
905
987
|
}
|
|
906
988
|
|
|
907
|
-
// # This function takes a
|
|
908
|
-
// # Given the same
|
|
989
|
+
// # This function takes a bucketing identifier and a feature flag key and returns a float between 0 and 1.
|
|
990
|
+
// # Given the same bucketing identifier and key, it'll always return the same float. These floats are
|
|
909
991
|
// # uniformly distributed between 0 and 1, so if we want to show this feature to 20% of traffic
|
|
910
|
-
// # we can do _hash(key,
|
|
911
|
-
async function _hash(key: string,
|
|
912
|
-
const hashString = await hashSHA1(`${key}.${
|
|
992
|
+
// # we can do _hash(key, bucketing_identifier) < 0.2
|
|
993
|
+
async function _hash(key: string, bucketingValue: string, salt: string = ''): Promise<number> {
|
|
994
|
+
const hashString = await hashSHA1(`${key}.${bucketingValue}${salt}`)
|
|
913
995
|
return parseInt(hashString.slice(0, 15), 16) / LONG_SCALE
|
|
914
996
|
}
|
|
915
997
|
|
package/src/types.ts
CHANGED
|
@@ -92,6 +92,8 @@ export type FeatureFlagCondition = {
|
|
|
92
92
|
variant?: string
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
+
export type FeatureFlagBucketingIdentifier = 'distinct_id' | 'device_id' | '' | null
|
|
96
|
+
|
|
95
97
|
export type BeforeSendFn = (event: EventMessage | null) => EventMessage | null
|
|
96
98
|
|
|
97
99
|
export type PostHogOptions = Omit<PostHogCoreOptions, 'before_send'> & {
|
|
@@ -197,6 +199,7 @@ export type PostHogFeatureFlag = {
|
|
|
197
199
|
id: number
|
|
198
200
|
name: string
|
|
199
201
|
key: string
|
|
202
|
+
bucketing_identifier?: FeatureFlagBucketingIdentifier
|
|
200
203
|
filters?: {
|
|
201
204
|
aggregation_group_type_index?: number
|
|
202
205
|
groups?: FeatureFlagCondition[]
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '5.24.
|
|
1
|
+
export const version = '5.24.16'
|