diff --git a/__tests__/client.test.ts b/__tests__/client.test.ts index 8708170..a0e3b50 100644 --- a/__tests__/client.test.ts +++ b/__tests__/client.test.ts @@ -9,6 +9,7 @@ import { Variant, Variants } from '../src/types/variant'; import { randomString } from '../src/util/randomstring'; import AsyncStorage from '@react-native-async-storage/async-storage'; import { ExposureTrackingProvider } from '../src/types/exposure'; +import { Exposure } from '../lib/typescript'; const delay = (ms: number) => new Promise((res) => setTimeout(res, ms)); @@ -375,3 +376,19 @@ test('ExperimentClient.clear, clear all variants in the cache and storage', asyn var clearedVariants = client.all(); expect(clearedVariants).toEqual({}); }); + +test('ExperimentClient.variant experiment key passed from variant to exposure', async () => { + let didTrack = false; + const client = new ExperimentClient(API_KEY, { + exposureTrackingProvider: { + track: (exposure: Exposure) => { + expect(exposure.experiment_key).toEqual('expKey'); + didTrack = true; + }, + }, + source: Source.InitialVariants, + initialVariants: { flagKey: { value: 'value', expKey: 'expKey' } }, + }); + client.variant('flagKey'); + expect(didTrack).toEqual(true); +}); diff --git a/src/experimentClient.ts b/src/experimentClient.ts index 011b1ce..5922460 100644 --- a/src/experimentClient.ts +++ b/src/experimentClient.ts @@ -377,6 +377,7 @@ export class ExperimentClient implements Client { variants[key] = { value: json[key].key, payload: json[key].payload, + expKey: json[key].expKey, }; } this.debug('[Experiment] Received variants: ', variants); @@ -481,6 +482,7 @@ export class ExperimentClient implements Client { this.exposureTrackingProvider?.track({ flag_key: key, variant: variant.value, + experiment_key: variant.expKey, }); } } diff --git a/src/types/exposure.ts b/src/types/exposure.ts index d9e88db..8746c9a 100644 --- a/src/types/exposure.ts +++ b/src/types/exposure.ts @@ -1,21 +1,23 @@ /** - * Improved exposure event for tracking exposures to Amplitude Experiment. + * Event object for tracking exposures to Amplitude Experiment. * * This object contains all the required information to send an `$exposure` - * event through any SDK or CDP to experiment. The resulting exposure event - * must follow the following definition: + * event through any SDK or CDP to experiment. + * + * The resulting exposure event must follow the following definition: * ``` * { * "event_type": "$exposure", * "event_properties": { * "flag_key": "", - * "variant": "" + * "variant": "", + * "experiment_key": "", * } * } * ``` * - * Where `` and `` are the {@link flag_key} and - * {@link variant} variant` members on this type. + * Where ``, ``, and `` are the {@link flag_key}, + * {@link variant}, and {@link experiment_key} variant members on this type: * * For example, if you're using Segment for analytics: * @@ -24,8 +26,20 @@ * ``` */ export type Exposure = { + /** + * (Required) The key for the flag the user was exposed to. + */ flag_key: string; + /** + * (Optional) The variant the user was exposed to. If null or missing, the + * event will not be persisted, and will unset the user property. + */ variant?: string; + /** + * (Optional) The experiment key used to differentiate between multiple + * experiments associated with the same flag. + */ + experiment_key?: string; }; /** @@ -72,7 +86,8 @@ export interface ExposureTrackingProvider { * "event_type": "$exposure", * "event_properties": { * "flag_key": "", - * "variant": "" + * "variant": "", + * "experiment_key": "" * } * } * ``` diff --git a/src/types/variant.ts b/src/types/variant.ts index 9015126..0090c95 100644 --- a/src/types/variant.ts +++ b/src/types/variant.ts @@ -10,8 +10,12 @@ export type Variant = { /** * The attached payload, if any. */ - payload?: any; + + /** + * The experiment key. Used to distinguish two experiments associated with the same flag. + */ + expKey?: string; }; /**