Skip to content

Commit a771764

Browse files
Merge branch 'impressions_toggle_track_property' into impressions_toggle_storage_refactors
2 parents ac5659a + 522debd commit a771764

File tree

4 files changed

+43
-28
lines changed

4 files changed

+43
-28
lines changed

src/sdkClient/client.ts

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { IMPRESSION, IMPRESSION_QUEUEING } from '../logger/constants';
1111
import { ISdkFactoryContext } from '../sdkFactory/types';
1212
import { isConsumerMode } from '../utils/settingsValidation/mode';
1313
import { Method } from '../sync/submitters/types';
14+
import { ImpressionDecorated } from '../trackers/types';
1415

1516
const treatmentNotReady = { treatment: CONTROL, label: SDK_NOT_READY };
1617

@@ -34,11 +35,11 @@ export function clientFactory(params: ISdkFactoryContext): SplitIO.IClient | Spl
3435
const stopTelemetryTracker = telemetryTracker.trackEval(withConfig ? TREATMENT_WITH_CONFIG : TREATMENT);
3536

3637
const wrapUp = (evaluationResult: IEvaluationResult) => {
37-
const queue: [impression: SplitIO.ImpressionDTO, track?: boolean][] = [];
38+
const queue: ImpressionDecorated[] = [];
3839
const treatment = processEvaluation(evaluationResult, featureFlagName, key, attributes, withConfig, methodName, queue);
3940
impressionsTracker.track(queue, attributes);
4041

41-
stopTelemetryTracker(queue[0] && queue[0][0].label);
42+
stopTelemetryTracker(queue[0] && queue[0].imp.label);
4243
return treatment;
4344
};
4445

@@ -59,14 +60,14 @@ export function clientFactory(params: ISdkFactoryContext): SplitIO.IClient | Spl
5960
const stopTelemetryTracker = telemetryTracker.trackEval(withConfig ? TREATMENTS_WITH_CONFIG : TREATMENTS);
6061

6162
const wrapUp = (evaluationResults: Record<string, IEvaluationResult>) => {
62-
const queue: [impression: SplitIO.ImpressionDTO, track?: boolean][] = [];
63+
const queue: ImpressionDecorated[] = [];
6364
const treatments: Record<string, SplitIO.Treatment | SplitIO.TreatmentWithConfig> = {};
6465
Object.keys(evaluationResults).forEach(featureFlagName => {
6566
treatments[featureFlagName] = processEvaluation(evaluationResults[featureFlagName], featureFlagName, key, attributes, withConfig, methodName, queue);
6667
});
6768
impressionsTracker.track(queue, attributes);
6869

69-
stopTelemetryTracker(queue[0] && queue[0][0].label);
70+
stopTelemetryTracker(queue[0] && queue[0].imp.label);
7071
return treatments;
7172
};
7273

@@ -87,15 +88,15 @@ export function clientFactory(params: ISdkFactoryContext): SplitIO.IClient | Spl
8788
const stopTelemetryTracker = telemetryTracker.trackEval(method);
8889

8990
const wrapUp = (evaluationResults: Record<string, IEvaluationResult>) => {
90-
const queue: [impression: SplitIO.ImpressionDTO, track?: boolean][] = [];
91+
const queue: ImpressionDecorated[] = [];
9192
const treatments: Record<string, SplitIO.Treatment | SplitIO.TreatmentWithConfig> = {};
9293
const evaluations = evaluationResults;
9394
Object.keys(evaluations).forEach(featureFlagName => {
9495
treatments[featureFlagName] = processEvaluation(evaluations[featureFlagName], featureFlagName, key, attributes, withConfig, methodName, queue);
9596
});
9697
impressionsTracker.track(queue, attributes);
9798

98-
stopTelemetryTracker(queue[0] && queue[0][0].label);
99+
stopTelemetryTracker(queue[0] && queue[0].imp.label);
99100
return treatments;
100101
};
101102

@@ -128,7 +129,7 @@ export function clientFactory(params: ISdkFactoryContext): SplitIO.IClient | Spl
128129
attributes: SplitIO.Attributes | undefined,
129130
withConfig: boolean,
130131
invokingMethodName: string,
131-
queue: [impression: SplitIO.ImpressionDTO, track?: boolean][]
132+
queue: ImpressionDecorated[]
132133
): SplitIO.Treatment | SplitIO.TreatmentWithConfig {
133134
const matchingKey = getMatching(key);
134135
const bucketingKey = getBucketing(key);
@@ -138,15 +139,18 @@ export function clientFactory(params: ISdkFactoryContext): SplitIO.IClient | Spl
138139

139140
if (validateSplitExistence(log, readinessManager, featureFlagName, label, invokingMethodName)) {
140141
log.info(IMPRESSION_QUEUEING);
141-
queue.push([{
142-
feature: featureFlagName,
143-
keyName: matchingKey,
144-
treatment,
145-
time: Date.now(),
146-
bucketingKey,
147-
label,
148-
changeNumber: changeNumber as number,
149-
}, track]);
142+
queue.push({
143+
imp: {
144+
feature: featureFlagName,
145+
keyName: matchingKey,
146+
treatment,
147+
time: Date.now(),
148+
bucketingKey,
149+
label,
150+
changeNumber: changeNumber as number,
151+
},
152+
track
153+
});
150154
}
151155

152156
if (withConfig) {

src/trackers/__tests__/impressionsTracker.spec.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ describe('Impressions Tracker', () => {
7070

7171
expect(fakeImpressionsCache.track).not.toBeCalled(); // cache method should not be called by just creating a tracker
7272

73-
tracker.track([[imp1], [imp2], [imp3]]);
73+
tracker.track([{ imp: imp1 }, { imp: imp2 }, { imp: imp3 }]);
7474

7575
expect(fakeImpressionsCache.track.mock.calls[0][0]).toEqual([imp1, imp2, imp3]); // Should call the storage track method once we invoke .track() method, passing queued params in a sequence.
7676
});
@@ -93,7 +93,7 @@ describe('Impressions Tracker', () => {
9393
expect(fakeIntegrationsManager.handleImpression).not.toBeCalled(); // The integrations manager handleImpression method should not be invoked if we haven't tracked impressions.
9494

9595
// We signal that we actually want to track the queued impressions.
96-
tracker.track([[fakeImpression], [fakeImpression2]], fakeAttributes);
96+
tracker.track([{ imp: fakeImpression }, { imp: fakeImpression2 }], fakeAttributes);
9797

9898
expect(fakeImpressionsCache.track.mock.calls[0][0]).toEqual([fakeImpression, fakeImpression2]); // Even with a listener, impression should be sent to the cache
9999
expect(fakeListener.logImpression).not.toBeCalled(); // The listener should not be executed synchronously.
@@ -157,7 +157,7 @@ describe('Impressions Tracker', () => {
157157
expect(fakeImpressionsCache.track).not.toBeCalled(); // storage method should not be called until impressions are tracked.
158158

159159
trackers.forEach(tracker => {
160-
tracker.track([[impression], [impression2], [impression3]]);
160+
tracker.track([{ imp: impression }, { imp: impression2 }, { imp: impression3 }]);
161161

162162
const lastArgs = fakeImpressionsCache.track.mock.calls[fakeImpressionsCache.track.mock.calls.length - 1];
163163

@@ -182,7 +182,7 @@ describe('Impressions Tracker', () => {
182182

183183
expect(fakeImpressionsCache.track).not.toBeCalled(); // cache method should not be called by just creating a tracker
184184

185-
tracker.track([[impression], [impression2], [impression3]]);
185+
tracker.track([{ imp: impression }, { imp: impression2 }, { imp: impression3 }]);
186186

187187
const lastArgs = fakeImpressionsCache.track.mock.calls[fakeImpressionsCache.track.mock.calls.length - 1];
188188

@@ -203,19 +203,19 @@ describe('Impressions Tracker', () => {
203203

204204
const tracker = impressionsTrackerFactory(settings, fakeImpressionsCache, strategy, fakeWhenInit);
205205

206-
tracker.track([[impression]]);
206+
tracker.track([{ imp: impression }]);
207207
expect(fakeImpressionsCache.track).toBeCalledTimes(1); // impression should be tracked if userConsent is undefined
208208

209209
settings.userConsent = 'UNKNOWN';
210-
tracker.track([[impression]]);
210+
tracker.track([{ imp: impression }]);
211211
expect(fakeImpressionsCache.track).toBeCalledTimes(2); // impression should be tracked if userConsent is unknown
212212

213213
settings.userConsent = 'GRANTED';
214-
tracker.track([[impression]]);
214+
tracker.track([{ imp: impression }]);
215215
expect(fakeImpressionsCache.track).toBeCalledTimes(3); // impression should be tracked if userConsent is granted
216216

217217
settings.userConsent = 'DECLINED';
218-
tracker.track([[impression]]);
218+
tracker.track([{ imp: impression }]);
219219
expect(fakeImpressionsCache.track).toBeCalledTimes(3); // impression should not be tracked if userConsent is declined
220220
});
221221

src/trackers/impressionsTracker.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { objectAssign } from '../utils/lang/objectAssign';
22
import { thenable } from '../utils/promise/thenable';
33
import { IImpressionsCacheBase, ITelemetryCacheSync, ITelemetryCacheAsync } from '../storages/types';
4-
import { IImpressionsHandler, IImpressionsTracker, IStrategy } from './types';
4+
import { IImpressionsHandler, IImpressionsTracker, ImpressionDecorated, IStrategy } from './types';
55
import { ISettings } from '../types';
66
import { IMPRESSIONS_TRACKER_SUCCESS, ERROR_IMPRESSIONS_TRACKER, ERROR_IMPRESSIONS_LISTENER } from '../logger/constants';
77
import { CONSENT_DECLINED, DEDUPED, QUEUED } from '../utils/constants';
@@ -28,10 +28,10 @@ export function impressionsTrackerFactory(
2828
const { log, impressionListener, runtime: { ip, hostname }, version } = settings;
2929

3030
return {
31-
track(imps: [impression: SplitIO.ImpressionDTO, track?: boolean][], attributes?: SplitIO.Attributes) {
31+
track(imps: ImpressionDecorated[], attributes?: SplitIO.Attributes) {
3232
if (settings.userConsent === CONSENT_DECLINED) return;
3333

34-
const impressions = imps.map((item) => item[0]);
34+
const impressions = imps.map((item) => item.imp);
3535
const impressionsCount = impressions.length;
3636
const { impressionsToStore, impressionsToListener, deduped } = strategy.process(impressions);
3737

src/trackers/types.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,19 @@ export interface IImpressionsHandler {
1717
handleImpression(impressionData: SplitIO.ImpressionData): any
1818
}
1919

20+
export type ImpressionDecorated = {
21+
/**
22+
* Impression DTO
23+
*/
24+
imp: SplitIO.ImpressionDTO,
25+
/**
26+
* Whether the impression should be tracked or not
27+
*/
28+
track?: boolean
29+
};
30+
2031
export interface IImpressionsTracker {
21-
track(impressions: [impression: SplitIO.ImpressionDTO, track?: boolean][], attributes?: SplitIO.Attributes): void
32+
track(impressions: ImpressionDecorated[], attributes?: SplitIO.Attributes): void
2233
}
2334

2435
/** Telemetry tracker */

0 commit comments

Comments
 (0)