Skip to content

Commit e4289de

Browse files
Merge branch 'refactor-impressions-tracker' into configs-sdk-client
2 parents 6241b0f + 16dea9f commit e4289de

10 files changed

Lines changed: 98 additions & 121 deletions

File tree

src/sdkClient/__tests__/sdkClientMethod.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const paramMocks = [
1818
settings: { mode: CONSUMER_MODE, log: loggerMock, core: { authorizationKey: 'sdk key '} },
1919
telemetryTracker: telemetryTrackerFactory(),
2020
clients: {},
21-
uniqueKeysTracker: { start: jest.fn(), stop: jest.fn() },
21+
impressionsTracker: { start: jest.fn(), stop: jest.fn(), track: jest.fn() },
2222
fallbackTreatmentsCalculator: new FallbackTreatmentsCalculator({})
2323
},
2424
// SyncManager (i.e., Sync SDK) and Signal listener
@@ -30,7 +30,7 @@ const paramMocks = [
3030
settings: { mode: STANDALONE_MODE, log: loggerMock, core: { authorizationKey: 'sdk key '} },
3131
telemetryTracker: telemetryTrackerFactory(),
3232
clients: {},
33-
uniqueKeysTracker: { start: jest.fn(), stop: jest.fn() },
33+
impressionsTracker: { start: jest.fn(), stop: jest.fn(), track: jest.fn() },
3434
fallbackTreatmentsCalculator: new FallbackTreatmentsCalculator({})
3535
}
3636
];
@@ -75,7 +75,7 @@ test.each(paramMocks)('sdkClientMethodFactory', (params, done: any) => {
7575
client.destroy().then(() => {
7676
expect(params.sdkReadinessManager.readinessManager.destroy).toBeCalledTimes(1);
7777
expect(params.storage.destroy).toBeCalledTimes(1);
78-
expect(params.uniqueKeysTracker.stop).toBeCalledTimes(1);
78+
expect(params.impressionsTracker.stop).toBeCalledTimes(1);
7979

8080
if (params.syncManager) {
8181
expect(params.syncManager.stop).toBeCalledTimes(1);

src/sdkClient/__tests__/sdkClientMethodCS.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ const params = {
4646
settings: settingsWithKey,
4747
telemetryTracker: telemetryTrackerFactory(),
4848
clients: {},
49-
uniqueKeysTracker: { start: jest.fn(), stop: jest.fn() }
49+
impressionsTracker: { start: jest.fn(), stop: jest.fn(), track: jest.fn() }
5050
};
5151

5252
const invalidAttributes = [
@@ -96,7 +96,7 @@ describe('sdkClientMethodCSFactory', () => {
9696
expect(params.syncManager.stop).toBeCalledTimes(1);
9797
expect(params.syncManager.flush).toBeCalledTimes(1);
9898
expect(params.signalListener.stop).toBeCalledTimes(1);
99-
expect(params.uniqueKeysTracker.stop).toBeCalledTimes(1);
99+
expect(params.impressionsTracker.stop).toBeCalledTimes(1);
100100
});
101101

102102
});

src/sdkClient/sdkLifecycle.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ const COOLDOWN_TIME_IN_MILLIS = 1000;
77
/**
88
* Creates an Sdk client, i.e., a base client with status, init, flush and destroy interface
99
*/
10-
export function sdkLifecycleFactory(params: ISdkFactoryContext, isSharedClient?: boolean): Pick<SplitIO.ConfigSDKClient, 'init' | 'flush' | 'destroy'> {
11-
const { sdkReadinessManager, syncManager, storage, signalListener, settings, telemetryTracker, uniqueKeysTracker } = params;
10+
export function sdkLifecycleFactory(params: ISdkFactoryContext, isSharedClient?: boolean): Pick<SplitIO.ConfigsClient, 'init' | 'flush' | 'destroy'> {
11+
const { sdkReadinessManager, syncManager, storage, signalListener, settings, telemetryTracker, impressionsTracker } = params;
1212

1313
let hasInit = false;
1414
let lastActionTime = 0;
@@ -41,7 +41,7 @@ export function sdkLifecycleFactory(params: ISdkFactoryContext, isSharedClient?:
4141
if (!isSharedClient) {
4242
validateAndTrackApiKey(settings.log, settings.core.authorizationKey);
4343
sdkReadinessManager.readinessManager.init();
44-
uniqueKeysTracker.start();
44+
impressionsTracker.start();
4545
syncManager && syncManager.start();
4646
signalListener && signalListener.start();
4747
}
@@ -62,7 +62,7 @@ export function sdkLifecycleFactory(params: ISdkFactoryContext, isSharedClient?:
6262
releaseApiKey(settings.core.authorizationKey);
6363
telemetryTracker.sessionLength();
6464
signalListener && signalListener.stop();
65-
uniqueKeysTracker.stop();
65+
impressionsTracker.stop();
6666
}
6767

6868
// Stop background jobs

src/sdkConfig/index.ts

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,17 @@ import { createLoggerAPI } from '../logger/sdkLogger';
88
import { NEW_FACTORY } from '../logger/constants';
99
import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED, SDK_SPLITS_CACHE_LOADED } from '../readiness/constants';
1010
import { objectAssign } from '../utils/lang/objectAssign';
11-
import { strategyDebugFactory } from '../trackers/strategy/strategyDebug';
12-
import { strategyOptimizedFactory } from '../trackers/strategy/strategyOptimized';
13-
import { strategyNoneFactory } from '../trackers/strategy/strategyNone';
14-
import { uniqueKeysTrackerFactory } from '../trackers/uniqueKeysTracker';
15-
import { DEBUG, OPTIMIZED } from '../utils/constants';
16-
import { setRolloutPlan } from '../storages/setRolloutPlan';
17-
import { IStorageSync } from '../storages/types';
18-
import { getMatching } from '../utils/key';
1911
import { FallbackTreatmentsCalculator } from '../evaluator/fallbackTreatmentsCalculator';
2012
import { sdkLifecycleFactory } from '../sdkClient/sdkLifecycle';
2113

2214
/**
2315
* Modular SDK factory
2416
*/
25-
export function sdkConfigFactory(params: ISdkFactoryParams): SplitIO.ConfigSDKClient {
17+
export function sdkConfigFactory(params: ISdkFactoryParams): SplitIO.ConfigsClient {
2618

2719
const { settings, platform, storageFactory, splitApiFactory, extraProps,
28-
syncManagerFactory, SignalListener, impressionsObserverFactory,
29-
integrationsManagerFactory,
30-
filterAdapterFactory } = params;
31-
const { log, sync: { impressionsMode }, initialRolloutPlan, core: { key } } = settings;
20+
syncManagerFactory, SignalListener, integrationsManagerFactory } = params;
21+
const { log } = settings;
3222

3323
// @TODO handle non-recoverable errors, such as, global `fetch` not available, invalid SDK Key, etc.
3424
// On non-recoverable errors, we should mark the SDK as destroyed and not start synchronization.
@@ -54,31 +44,16 @@ export function sdkConfigFactory(params: ISdkFactoryParams): SplitIO.ConfigSDKCl
5444

5545
const fallbackTreatmentsCalculator = new FallbackTreatmentsCalculator(settings.fallbackTreatments);
5646

57-
if (initialRolloutPlan) {
58-
setRolloutPlan(log, initialRolloutPlan, storage as IStorageSync, key && getMatching(key));
59-
if ((storage as IStorageSync).splits.getChangeNumber() > -1) readiness.splits.emit(SDK_SPLITS_CACHE_LOADED, { initialCacheLoad: false /* Not an initial load, cache exists */ });
60-
}
61-
6247
const telemetryTracker = telemetryTrackerFactory(storage.telemetry, platform.now);
6348
const integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings, storage, telemetryTracker });
6449

65-
const observer = impressionsObserverFactory();
66-
const uniqueKeysTracker = uniqueKeysTrackerFactory(log, storage.uniqueKeys, filterAdapterFactory && filterAdapterFactory());
67-
68-
const noneStrategy = strategyNoneFactory(storage.impressionCounts, uniqueKeysTracker);
69-
const strategy = impressionsMode === OPTIMIZED ?
70-
strategyOptimizedFactory(observer, storage.impressionCounts) :
71-
impressionsMode === DEBUG ?
72-
strategyDebugFactory(observer) :
73-
noneStrategy;
74-
75-
const impressionsTracker = impressionsTrackerFactory(settings, storage.impressions, noneStrategy, strategy, integrationsManager, storage.telemetry);
50+
const impressionsTracker = impressionsTrackerFactory(params, storage, integrationsManager);
7651
const eventTracker = eventTrackerFactory(settings, storage.events, integrationsManager, storage.telemetry);
7752

7853
// splitApi is used by SyncManager and Browser signal listener
7954
const splitApi = splitApiFactory && splitApiFactory(settings, platform, telemetryTracker);
8055

81-
const ctx: ISdkFactoryContext = { clients: {}, splitApi, eventTracker, impressionsTracker, telemetryTracker, uniqueKeysTracker, sdkReadinessManager, readiness, settings, storage, platform, fallbackTreatmentsCalculator };
56+
const ctx: ISdkFactoryContext = { clients: {}, splitApi, eventTracker, impressionsTracker, telemetryTracker, sdkReadinessManager, readiness, settings, storage, platform, fallbackTreatmentsCalculator };
8257

8358
const syncManager = syncManagerFactory && syncManagerFactory(ctx as ISdkFactoryContextSync);
8459
ctx.syncManager = syncManager;

src/sdkFactory/index.ts

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,6 @@ import { createLoggerAPI } from '../logger/sdkLogger';
88
import { NEW_FACTORY, RETRIEVE_MANAGER } from '../logger/constants';
99
import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED, SDK_SPLITS_CACHE_LOADED } from '../readiness/constants';
1010
import { objectAssign } from '../utils/lang/objectAssign';
11-
import { strategyDebugFactory } from '../trackers/strategy/strategyDebug';
12-
import { strategyOptimizedFactory } from '../trackers/strategy/strategyOptimized';
13-
import { strategyNoneFactory } from '../trackers/strategy/strategyNone';
14-
import { uniqueKeysTrackerFactory } from '../trackers/uniqueKeysTracker';
15-
import { DEBUG, OPTIMIZED } from '../utils/constants';
1611
import { setRolloutPlan } from '../storages/setRolloutPlan';
1712
import { IStorageSync } from '../storages/types';
1813
import { getMatching } from '../utils/key';
@@ -24,10 +19,9 @@ import { FallbackTreatmentsCalculator } from '../evaluator/fallbackTreatmentsCal
2419
export function sdkFactory(params: ISdkFactoryParams): SplitIO.ISDK | SplitIO.IAsyncSDK | SplitIO.IBrowserSDK | SplitIO.IBrowserAsyncSDK {
2520

2621
const { settings, platform, storageFactory, splitApiFactory, extraProps,
27-
syncManagerFactory, SignalListener, impressionsObserverFactory,
28-
integrationsManagerFactory, sdkManagerFactory, sdkClientMethodFactory,
29-
filterAdapterFactory, lazyInit } = params;
30-
const { log, sync: { impressionsMode }, initialRolloutPlan, core: { key } } = settings;
22+
syncManagerFactory, SignalListener,
23+
integrationsManagerFactory, sdkManagerFactory, sdkClientMethodFactory, lazyInit } = params;
24+
const { log, initialRolloutPlan, core: { key } } = settings;
3125

3226
// @TODO handle non-recoverable errors, such as, global `fetch` not available, invalid SDK Key, etc.
3327
// On non-recoverable errors, we should mark the SDK as destroyed and not start synchronization.
@@ -62,23 +56,13 @@ export function sdkFactory(params: ISdkFactoryParams): SplitIO.ISDK | SplitIO.IA
6256
const telemetryTracker = telemetryTrackerFactory(storage.telemetry, platform.now);
6357
const integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings, storage, telemetryTracker });
6458

65-
const observer = impressionsObserverFactory();
66-
const uniqueKeysTracker = uniqueKeysTrackerFactory(log, storage.uniqueKeys, filterAdapterFactory && filterAdapterFactory());
67-
68-
const noneStrategy = strategyNoneFactory(storage.impressionCounts, uniqueKeysTracker);
69-
const strategy = impressionsMode === OPTIMIZED ?
70-
strategyOptimizedFactory(observer, storage.impressionCounts) :
71-
impressionsMode === DEBUG ?
72-
strategyDebugFactory(observer) :
73-
noneStrategy;
74-
75-
const impressionsTracker = impressionsTrackerFactory(settings, storage.impressions, noneStrategy, strategy, integrationsManager, storage.telemetry);
59+
const impressionsTracker = impressionsTrackerFactory(params, storage, integrationsManager);
7660
const eventTracker = eventTrackerFactory(settings, storage.events, integrationsManager, storage.telemetry);
7761

7862
// splitApi is used by SyncManager and Browser signal listener
7963
const splitApi = splitApiFactory && splitApiFactory(settings, platform, telemetryTracker);
8064

81-
const ctx: ISdkFactoryContext = { clients, splitApi, eventTracker, impressionsTracker, telemetryTracker, uniqueKeysTracker, sdkReadinessManager, readiness, settings, storage, platform, fallbackTreatmentsCalculator };
65+
const ctx: ISdkFactoryContext = { clients, splitApi, eventTracker, impressionsTracker, telemetryTracker, sdkReadinessManager, readiness, settings, storage, platform, fallbackTreatmentsCalculator };
8266

8367
const syncManager = syncManagerFactory && syncManagerFactory(ctx as ISdkFactoryContextSync);
8468
ctx.syncManager = syncManager;

src/sdkFactory/types.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { IFetch, ISplitApi, IEventSourceConstructor } from '../services/types';
88
import { IStorageAsync, IStorageSync, IStorageFactoryParams } from '../storages/types';
99
import { ISyncManager } from '../sync/types';
1010
import { IImpressionObserver } from '../trackers/impressionObserver/types';
11-
import { IImpressionsTracker, IEventTracker, ITelemetryTracker, IFilterAdapter, IUniqueKeysTracker } from '../trackers/types';
11+
import { IImpressionsTracker, IEventTracker, ITelemetryTracker, IFilterAdapter } from '../trackers/types';
1212
import { ISettings } from '../types';
1313
import SplitIO from '../../types/splitio';
1414

@@ -47,7 +47,6 @@ export interface ISdkFactoryContext {
4747
eventTracker: IEventTracker,
4848
telemetryTracker: ITelemetryTracker,
4949
storage: IStorageSync | IStorageAsync,
50-
uniqueKeysTracker: IUniqueKeysTracker,
5150
signalListener?: ISignalListener
5251
splitApi?: ISplitApi
5352
syncManager?: ISyncManager,

0 commit comments

Comments
 (0)