Skip to content

Commit f1b3a1f

Browse files
Merge branch 'impressions_toggle_storage_refactors' into impressions_toggle_strategy_refactors
2 parents 334ec45 + a771764 commit f1b3a1f

File tree

6 files changed

+51
-36
lines changed

6 files changed

+51
-36
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/storages/inMemory/InMemoryStorage.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ export function InMemoryStorageFactory(params: IStorageFactoryParams): IStorageS
3737
const noopTrack = () => true;
3838
storage.impressions.track = noopTrack;
3939
storage.events.track = noopTrack;
40-
if (storage.impressionCounts) storage.impressionCounts.track = noopTrack;
41-
if (storage.uniqueKeys) storage.uniqueKeys.track = noopTrack;
40+
storage.impressionCounts.track = noopTrack;
41+
storage.uniqueKeys.track = noopTrack;
4242
}
4343

4444
return storage;

src/storages/inMemory/InMemoryStorageCS.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ export function InMemoryStorageCSFactory(params: IStorageFactoryParams): IStorag
5555
const noopTrack = () => true;
5656
storage.impressions.track = noopTrack;
5757
storage.events.track = noopTrack;
58-
if (storage.impressionCounts) storage.impressionCounts.track = noopTrack;
59-
if (storage.uniqueKeys) storage.uniqueKeys.track = noopTrack;
58+
storage.impressionCounts.track = noopTrack;
59+
storage.uniqueKeys.track = noopTrack;
6060
}
6161

6262
return storage;

src/trackers/__tests__/impressionsTracker.spec.ts

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

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

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

8080
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.
8181
});
@@ -98,7 +98,7 @@ describe('Impressions Tracker', () => {
9898
expect(fakeIntegrationsManager.handleImpression).not.toBeCalled(); // The integrations manager handleImpression method should not be invoked if we haven't tracked impressions.
9999

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

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

164164
trackers.forEach(tracker => {
165-
tracker.track([[impression], [impression2], [impression3]]);
165+
tracker.track([{ imp: impression }, { imp: impression2 }, { imp: impression3 }]);
166166

167167
const lastArgs = fakeImpressionsCache.track.mock.calls[fakeImpressionsCache.track.mock.calls.length - 1];
168168

@@ -187,7 +187,7 @@ describe('Impressions Tracker', () => {
187187

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

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

192192
const lastArgs = fakeImpressionsCache.track.mock.calls[fakeImpressionsCache.track.mock.calls.length - 1];
193193

@@ -208,19 +208,19 @@ describe('Impressions Tracker', () => {
208208

209209
const tracker = impressionsTrackerFactory(settings, fakeImpressionsCache, fakeNoneStrategy, strategy, fakeWhenInit);
210210

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

214214
settings.userConsent = 'UNKNOWN';
215-
tracker.track([[impression]]);
215+
tracker.track([{ imp: impression }]);
216216
expect(fakeImpressionsCache.track).toBeCalledTimes(2); // impression should be tracked if userConsent is unknown
217217

218218
settings.userConsent = 'GRANTED';
219-
tracker.track([[impression]]);
219+
tracker.track([{ imp: impression }]);
220220
expect(fakeImpressionsCache.track).toBeCalledTimes(3); // impression should be tracked if userConsent is granted
221221

222222
settings.userConsent = 'DECLINED';
223-
tracker.track([[impression]]);
223+
tracker.track([{ imp: impression }]);
224224
expect(fakeImpressionsCache.track).toBeCalledTimes(3); // impression should not be tracked if userConsent is declined
225225
});
226226

src/trackers/impressionsTracker.ts

Lines changed: 7 additions & 7 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';
@@ -23,20 +23,20 @@ export function impressionsTrackerFactory(
2323
const { log, impressionListener, runtime: { ip, hostname }, version } = settings;
2424

2525
return {
26-
track(impressions: [impression: SplitIO.ImpressionDTO, track?: boolean][], attributes?: SplitIO.Attributes) {
26+
track(impressions: ImpressionDecorated[], attributes?: SplitIO.Attributes) {
2727
if (settings.userConsent === CONSENT_DECLINED) return;
2828

29-
const impressionsToStore = impressions.filter(([impression, track]) => {
29+
const impressionsToStore = impressions.filter(({ imp, track }) => {
3030
return track === false ?
31-
noneStrategy.process(impression) :
32-
strategy.process(impression);
31+
noneStrategy.process(imp) :
32+
strategy.process(imp);
3333
});
3434

3535
const impressionsLength = impressions.length;
3636
const impressionsToStoreLength = impressionsToStore.length;
3737

3838
if (impressionsToStoreLength) {
39-
const res = impressionsCache.track(impressionsToStore.map((item) => item[0]));
39+
const res = impressionsCache.track(impressionsToStore.map((item) => item.imp));
4040

4141
// If we're on an async storage, handle error and log it.
4242
if (thenable(res)) {
@@ -60,7 +60,7 @@ export function impressionsTrackerFactory(
6060
for (let i = 0; i < impressionsLength; i++) {
6161
const impressionData: SplitIO.ImpressionData = {
6262
// copy of impression, to avoid unexpected behaviour if modified by integrations or impressionListener
63-
impression: objectAssign({}, impressions[i][0]),
63+
impression: objectAssign({}, impressions[i].imp),
6464
attributes,
6565
ip,
6666
hostname,

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)