Skip to content

Commit 6b495bb

Browse files
Move SDK initialization logic together with destroy, since both use the same modules.
1 parent bfab496 commit 6b495bb

4 files changed

Lines changed: 27 additions & 27 deletions

File tree

src/sdkClient/sdkClient.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
import { objectAssign } from '../utils/lang/objectAssign';
22
import SplitIO from '../../types/splitio';
3-
import { releaseApiKey } from '../utils/inputValidation/apiKey';
3+
import { releaseApiKey, validateAndTrackApiKey } from '../utils/inputValidation/apiKey';
44
import { clientFactory } from './client';
55
import { clientInputValidationDecorator } from './clientInputValidation';
66
import { ISdkFactoryContext } from '../sdkFactory/types';
77

88
const COOLDOWN_TIME_IN_MILLIS = 1000;
99

1010
/**
11-
* Creates an Sdk client, i.e., a base client with status and destroy interface
11+
* Creates an Sdk client, i.e., a base client with status, init, flush and destroy interface
1212
*/
1313
export function sdkClientFactory(params: ISdkFactoryContext, isSharedClient?: boolean): SplitIO.IClient | SplitIO.IAsyncClient {
1414
const { sdkReadinessManager, syncManager, storage, signalListener, settings, telemetryTracker, uniqueKeysTracker } = params;
1515

16+
let hasInit = false;
1617
let lastActionTime = 0;
1718

1819
function __cooldown(func: Function, time: number) {
@@ -47,13 +48,27 @@ export function sdkClientFactory(params: ISdkFactoryContext, isSharedClient?: bo
4748
params.fallbackTreatmentsCalculator
4849
),
4950

50-
// Sdk destroy
5151
{
52+
init() {
53+
if (hasInit) return;
54+
hasInit = true;
55+
56+
if (!isSharedClient) {
57+
validateAndTrackApiKey(settings.log, settings.core.authorizationKey);
58+
sdkReadinessManager.readinessManager.init();
59+
uniqueKeysTracker.start();
60+
syncManager && syncManager.start();
61+
signalListener && signalListener.start();
62+
}
63+
},
64+
5265
flush() {
5366
// @TODO define cooldown time
5467
return __cooldown(__flush, COOLDOWN_TIME_IN_MILLIS);
5568
},
69+
5670
destroy() {
71+
hasInit = false;
5772
// Mark the SDK as destroyed immediately
5873
sdkReadinessManager.readinessManager.destroy();
5974

src/sdkFactory/__tests__/index.spec.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { FallbackTreatmentsCalculator } from '../../evaluator/fallbackTreatments
77

88
/** Mocks */
99

10-
const clientInstance = { destroy: jest.fn() };
10+
const clientInstance = { init: jest.fn(), destroy: jest.fn() };
1111
const managerInstance = 'manager';
1212
const mockStorage = {
1313
splits: jest.fn(),
@@ -40,13 +40,10 @@ const paramsForAsyncSDK = {
4040
fallbackTreatmentsCalculator: new FallbackTreatmentsCalculator()
4141
};
4242

43-
const SignalListenerInstanceMock = { start: jest.fn() };
44-
4543
// IBrowserSDK, full params
4644
const fullParamsForSyncSDK = {
4745
...paramsForAsyncSDK,
4846
syncManagerFactory: jest.fn(),
49-
SignalListener: jest.fn(() => SignalListenerInstanceMock),
5047
impressionsObserverFactory: jest.fn(),
5148
platform: {
5249
getEventSource: jest.fn(),
@@ -79,10 +76,6 @@ function assertModulesCalled(params: any) {
7976
if (params.impressionsObserverFactory) {
8077
expect(params.impressionsObserverFactory).toBeCalledTimes(1);
8178
}
82-
if (params.SignalListener) {
83-
expect(params.SignalListener).toBeCalledTimes(1);
84-
expect(SignalListenerInstanceMock.start).toBeCalledTimes(1);
85-
}
8679
if (params.splitApiFactory) {
8780
expect(params.splitApiFactory.mock.calls).toEqual([[params.settings, params.platform, telemetryTrackerMock]]);
8881
}

src/sdkFactory/index.ts

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { impressionsTrackerFactory } from '../trackers/impressionsTracker';
44
import { eventTrackerFactory } from '../trackers/eventTracker';
55
import { telemetryTrackerFactory } from '../trackers/telemetryTracker';
66
import SplitIO from '../../types/splitio';
7-
import { validateAndTrackApiKey } from '../utils/inputValidation/apiKey';
87
import { createLoggerAPI } from '../logger/sdkLogger';
98
import { NEW_FACTORY, RETRIEVE_MANAGER } from '../logger/constants';
109
import { SDK_SPLITS_ARRIVED, SDK_SEGMENTS_ARRIVED, SDK_SPLITS_CACHE_LOADED } from '../readiness/constants';
@@ -33,9 +32,6 @@ export function sdkFactory(params: ISdkFactoryParams): SplitIO.ISDK | SplitIO.IA
3332
// @TODO handle non-recoverable errors, such as, global `fetch` not available, invalid SDK Key, etc.
3433
// On non-recoverable errors, we should mark the SDK as destroyed and not start synchronization.
3534

36-
// initialization
37-
let hasInit = false;
38-
3935
const sdkReadinessManager = sdkReadinessManagerFactory(platform.EventEmitter, settings);
4036
const readiness = sdkReadinessManager.readinessManager;
4137

@@ -62,7 +58,7 @@ export function sdkFactory(params: ISdkFactoryParams): SplitIO.ISDK | SplitIO.IA
6258
if ((storage as IStorageSync).splits.getChangeNumber() > -1) readiness.splits.emit(SDK_SPLITS_CACHE_LOADED, { initialCacheLoad: false /* Not an initial load, cache exists */ });
6359
}
6460

65-
const clients: Record<string, SplitIO.IBasicClient> = {};
61+
const clients: Record<string, SplitIO.IBasicClient & { init: () => void }> = {};
6662
const telemetryTracker = telemetryTrackerFactory(storage.telemetry, platform.now);
6763
const integrationsManager = integrationsManagerFactory && integrationsManagerFactory({ settings, storage, telemetryTracker });
6864

@@ -87,6 +83,7 @@ export function sdkFactory(params: ISdkFactoryParams): SplitIO.ISDK | SplitIO.IA
8783
const syncManager = syncManagerFactory && syncManagerFactory(ctx as ISdkFactoryContextSync);
8884
ctx.syncManager = syncManager;
8985

86+
// @TODO: move into platform, and call inside sdkClientFactory (if it's used only there)
9087
const signalListener = SignalListener && new SignalListener(syncManager, settings, storage, splitApi);
9188
ctx.signalListener = signalListener;
9289

@@ -96,15 +93,7 @@ export function sdkFactory(params: ISdkFactoryParams): SplitIO.ISDK | SplitIO.IA
9693

9794

9895
function init() {
99-
if (hasInit) return;
100-
hasInit = true;
101-
102-
// We will just log and allow for the SDK to end up throwing an SDK_TIMEOUT event for devs to handle.
103-
validateAndTrackApiKey(log, settings.core.authorizationKey);
104-
readiness.init();
105-
uniqueKeysTracker.start();
106-
syncManager && syncManager.start();
107-
signalListener && signalListener.start();
96+
Object.keys(clients).map(key => clients[key].init());
10897
}
10998

11099
log.info(NEW_FACTORY, [settings.version]);
@@ -126,7 +115,6 @@ export function sdkFactory(params: ISdkFactoryParams): SplitIO.ISDK | SplitIO.IA
126115
settings,
127116

128117
destroy() {
129-
hasInit = false;
130118
return Promise.all(Object.keys(clients).map(key => clients[key].destroy())).then(() => { });
131119
}
132120
}, extraProps && extraProps(ctx), lazyInit ? { init } : init());

src/sdkFactory/types.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,11 @@ export interface ISdkFactoryParams {
9898

9999
// Sdk client method factory.
100100
// It Allows to distinguish SDK clients with the client-side API (`IBrowserSDK` and `IBrowserAsyncSDK`) or server-side API (`ISDK` and `IAsyncSDK`).
101-
sdkClientMethodFactory: (params: ISdkFactoryContext) => ({ (): SplitIO.IBrowserClient; (key: SplitIO.SplitKey): SplitIO.IBrowserClient; } | (() => SplitIO.IClient) | (() => SplitIO.IAsyncClient))
101+
sdkClientMethodFactory: (params: ISdkFactoryContext) => (
102+
{ (): SplitIO.IBrowserClient & { init(): void }; (key: SplitIO.SplitKey): SplitIO.IBrowserClient & { init(): void }; } |
103+
(() => SplitIO.IClient & { init(): void }) |
104+
(() => SplitIO.IAsyncClient & { init(): void })
105+
)
102106

103107
// Impression observer factory.
104108
impressionsObserverFactory: () => IImpressionObserver

0 commit comments

Comments
 (0)