Skip to content

Commit 0cb3a1f

Browse files
Move validateCache call from splitChangesUpdater to syncManagerOnline
1 parent bb0c197 commit 0cb3a1f

File tree

3 files changed

+41
-18
lines changed

3 files changed

+41
-18
lines changed

src/sync/__tests__/syncManagerOnline.spec.ts

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { fullSettings } from '../../utils/settingsValidation/__tests__/settings.
22
import { syncTaskFactory } from './syncTask.mock';
33
import { syncManagerOnlineFactory } from '../syncManagerOnline';
44
import { IReadinessManager } from '../../readiness/types';
5+
import { SDK_SPLITS_CACHE_LOADED } from '../../readiness/constants';
56

67
jest.mock('../submitters/submitterManager', () => {
78
return {
@@ -45,8 +46,10 @@ const pushManagerFactoryMock = jest.fn(() => pushManagerMock);
4546
test('syncManagerOnline should start or not the submitter depending on user consent status', () => {
4647
const settings = { ...fullSettings };
4748

48-
// @ts-ignore
49-
const syncManager = syncManagerOnlineFactory()({ settings });
49+
const syncManager = syncManagerOnlineFactory()({
50+
settings, // @ts-ignore
51+
storage: { splits: { checkCache: () => false } },
52+
});
5053
const submitterManager = syncManager.submitterManager!;
5154

5255
syncManager.start();
@@ -95,7 +98,10 @@ test('syncManagerOnline should syncAll a single time when sync is disabled', ()
9598

9699
// @ts-ignore
97100
// Test pushManager for main client
98-
const syncManager = syncManagerOnlineFactory(() => pollingManagerMock, pushManagerFactoryMock)({ settings });
101+
const syncManager = syncManagerOnlineFactory(() => pollingManagerMock, pushManagerFactoryMock)({
102+
settings, // @ts-ignore
103+
storage: { splits: { checkCache: () => false } },
104+
});
99105

100106
expect(pushManagerFactoryMock).not.toBeCalled();
101107

@@ -161,7 +167,10 @@ test('syncManagerOnline should syncAll a single time when sync is disabled', ()
161167
settings.sync.enabled = true;
162168
// @ts-ignore
163169
// pushManager instantiation control test
164-
const testSyncManager = syncManagerOnlineFactory(() => pollingManagerMock, pushManagerFactoryMock)({ settings });
170+
const testSyncManager = syncManagerOnlineFactory(() => pollingManagerMock, pushManagerFactoryMock)({
171+
settings, // @ts-ignore
172+
storage: { splits: { checkCache: () => false } },
173+
});
165174

166175
expect(pushManagerFactoryMock).toBeCalled();
167176

@@ -173,3 +182,18 @@ test('syncManagerOnline should syncAll a single time when sync is disabled', ()
173182
testSyncManager.stop();
174183

175184
});
185+
186+
test('syncManagerOnline should emit SDK_SPLITS_CACHE_LOADED if validateCache returns true', async () => {
187+
const params = {
188+
settings: fullSettings,
189+
storage: { splits: { checkCache: () => true } },
190+
readiness: { splits: { emit: jest.fn() } }
191+
}; // @ts-ignore
192+
const syncManager = syncManagerOnlineFactory()(params);
193+
194+
await syncManager.start();
195+
196+
expect(params.readiness.splits.emit).toBeCalledWith(SDK_SPLITS_CACHE_LOADED);
197+
198+
syncManager.stop();
199+
});

src/sync/polling/updaters/splitChangesUpdater.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ISplitChangesFetcher } from '../fetchers/types';
33
import { ISplit, ISplitChangesResponse, ISplitFiltersValidation } from '../../../dtos/types';
44
import { ISplitsEventEmitter } from '../../../readiness/types';
55
import { timeout } from '../../../utils/promise/timeout';
6-
import { SDK_SPLITS_ARRIVED, SDK_SPLITS_CACHE_LOADED } from '../../../readiness/constants';
6+
import { SDK_SPLITS_ARRIVED } from '../../../readiness/constants';
77
import { ILogger } from '../../../logger/types';
88
import { SYNC_SPLITS_FETCH, SYNC_SPLITS_NEW, SYNC_SPLITS_REMOVED, SYNC_SPLITS_SEGMENTS, SYNC_SPLITS_FETCH_FAILS, SYNC_SPLITS_FETCH_RETRY } from '../../../logger/constants';
99
import { startsWith } from '../../../utils/lang';
@@ -153,7 +153,7 @@ export function splitChangesUpdaterFactory(
153153
*/
154154
function _splitChangesUpdater(since: number, retry = 0): Promise<boolean> {
155155
log.debug(SYNC_SPLITS_FETCH, [since]);
156-
const fetcherPromise = Promise.resolve(splitUpdateNotification ?
156+
return Promise.resolve(splitUpdateNotification ?
157157
{ splits: [splitUpdateNotification.payload], till: splitUpdateNotification.changeNumber } :
158158
splitChangesFetcher(since, noCache, till, _promiseDecorator)
159159
)
@@ -200,15 +200,6 @@ export function splitChangesUpdaterFactory(
200200
}
201201
return false;
202202
});
203-
204-
// After triggering the requests, if we have cached splits information let's notify that to emit SDK_READY_FROM_CACHE.
205-
// Wrapping in a promise since checkCache can be async.
206-
if (splitsEventEmitter && startingUp) {
207-
Promise.resolve(splits.checkCache()).then(isCacheReady => {
208-
if (isCacheReady) splitsEventEmitter.emit(SDK_SPLITS_CACHE_LOADED);
209-
});
210-
}
211-
return fetcherPromise;
212203
}
213204

214205
let sincePromise = Promise.resolve(splits.getChangeNumber()); // `getChangeNumber` never rejects or throws error

src/sync/syncManagerOnline.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { SYNC_START_POLLING, SYNC_CONTINUE_POLLING, SYNC_STOP_POLLING } from '..
99
import { isConsentGranted } from '../consent';
1010
import { POLLING, STREAMING, SYNC_MODE_UPDATE } from '../utils/constants';
1111
import { ISdkFactoryContextSync } from '../sdkFactory/types';
12+
import { SDK_SPLITS_CACHE_LOADED } from '../readiness/constants';
1213

1314
/**
1415
* Online SyncManager factory.
@@ -28,7 +29,7 @@ export function syncManagerOnlineFactory(
2829
*/
2930
return function (params: ISdkFactoryContextSync): ISyncManagerCS {
3031

31-
const { settings, settings: { log, streamingEnabled, sync: { enabled: syncEnabled } }, telemetryTracker } = params;
32+
const { settings, settings: { log, streamingEnabled, sync: { enabled: syncEnabled } }, telemetryTracker, storage, readiness } = params;
3233

3334
/** Polling Manager */
3435
const pollingManager = pollingManagerFactory && pollingManagerFactory(params);
@@ -87,6 +88,13 @@ export function syncManagerOnlineFactory(
8788
start() {
8889
running = true;
8990

91+
if (startFirstTime) {
92+
const isCacheLoaded = storage.splits.checkCache();
93+
Promise.resolve().then(() => {
94+
if (isCacheLoaded) readiness.splits.emit(SDK_SPLITS_CACHE_LOADED);
95+
});
96+
}
97+
9098
// start syncing splits and segments
9199
if (pollingManager) {
92100

@@ -96,7 +104,6 @@ export function syncManagerOnlineFactory(
96104
// Doesn't call `syncAll` when the syncManager is resuming
97105
if (startFirstTime) {
98106
pollingManager.syncAll();
99-
startFirstTime = false;
100107
}
101108
pushManager.start();
102109
} else {
@@ -105,13 +112,14 @@ export function syncManagerOnlineFactory(
105112
} else {
106113
if (startFirstTime) {
107114
pollingManager.syncAll();
108-
startFirstTime = false;
109115
}
110116
}
111117
}
112118

113119
// start periodic data recording (events, impressions, telemetry).
114120
submitterManager.start(!isConsentGranted(settings));
121+
122+
startFirstTime = false;
115123
},
116124

117125
/**

0 commit comments

Comments
 (0)