Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
6241b0f
Extract SDK lifecycle methods (init, flush, destroy) into separate mo…
EmilianoSanchez Mar 9, 2026
e4289de
Merge branch 'refactor-impressions-tracker' into configs-sdk-client
EmilianoSanchez Mar 10, 2026
008756a
Merge branch 'refactor-impressions-tracker' into configs-sdk-client
EmilianoSanchez Mar 11, 2026
767324d
Add IConfig DTO and Configs SDK client wrapper
EmilianoSanchez Mar 12, 2026
6a6febd
Merge branch 'refactor-evaluator-to-support-no-target' into configs-s…
EmilianoSanchez Mar 13, 2026
c396555
Consolidate impression logging into single message when queueing
EmilianoSanchez Mar 13, 2026
74ac2e6
Merge branch 'refactor-evaluator-to-support-no-target' into configs-s…
EmilianoSanchez Mar 13, 2026
ee756a0
Merge branch 'refactor-evaluator-to-support-no-target' into configs-s…
EmilianoSanchez Mar 13, 2026
021086f
Merge branch 'refactor-evaluator-to-support-no-target' into configs-s…
EmilianoSanchez Mar 13, 2026
c3d9730
Rename SPLIT_NOT_FOUND to DEFINITION_NOT_FOUND and update related ref…
EmilianoSanchez Mar 13, 2026
30d102f
Remove feature flag name from SDK not ready warning message and simpl…
EmilianoSanchez Mar 13, 2026
858bb96
Polishing
EmilianoSanchez Mar 13, 2026
7004f30
Merge branch 'refactor-evaluator-to-support-no-target' into configs-s…
EmilianoSanchez Mar 18, 2026
f75580e
Merge branch 'sdk-configs-handle-configs-dto' into configs-sdk-client
EmilianoSanchez Mar 18, 2026
38a9f3a
Merge branch 'refactor-fallback-calculator' into configs-sdk-client
EmilianoSanchez Mar 18, 2026
51724d3
Merge branch 'sdk-configs-rename-split-to-definition' into configs-sd…
EmilianoSanchez Mar 19, 2026
db9e597
Merge branch 'sdk-configs-rename-split-to-definition' into configs-sd…
EmilianoSanchez Mar 19, 2026
92170bc
support configs fetcher
EmilianoSanchez Mar 19, 2026
aa9ff60
rename
EmilianoSanchez Mar 19, 2026
485d432
Add CONFIGS_UPDATE constant and update splitChangesUpdater for config…
EmilianoSanchez Mar 23, 2026
e0db405
Polishing
EmilianoSanchez Mar 23, 2026
5e6932a
Merge branch 'sdk-configs-rename-split-to-definition' into configs-sd…
EmilianoSanchez Mar 23, 2026
b9cb6ed
Merge branch 'sdk-configs-handle-configs-dto' into configs-sdk-client
EmilianoSanchez Mar 23, 2026
41a2e3e
Merge branch 'sdk-configs-rename-split-to-definition' into configs-sd…
EmilianoSanchez Mar 25, 2026
9e20ea4
Merge branch 'sdk-configs-rename-split-to-definition' into configs-sd…
EmilianoSanchez Apr 8, 2026
b597c53
Merge branch 'sdk-configs-rename-split-to-definition' into configs-sd…
EmilianoSanchez Apr 9, 2026
0a84376
Merge branch 'sdk-configs-rename-split-to-definition' into configs-sd…
EmilianoSanchez Apr 9, 2026
b614d6f
Merge branch 'sdk-configs-endpoint-updates' into configs-sdk-client
EmilianoSanchez Apr 13, 2026
4620cdc
Merge branch 'sdk-configs-endpoint-updates' into configs-sdk-client
EmilianoSanchez Apr 13, 2026
cbdc76a
Merge branch 'sdk-configs-endpoint-updates' into configs-sdk-client
EmilianoSanchez Apr 13, 2026
d47ec73
Revert unused code
EmilianoSanchez Apr 13, 2026
216a9e3
Move code to configs-client repo
EmilianoSanchez Apr 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 3 additions & 67 deletions src/sdkClient/sdkClient.ts
Original file line number Diff line number Diff line change
@@ -1,40 +1,16 @@
import { objectAssign } from '../utils/lang/objectAssign';
import SplitIO from '../../types/splitio';
import { releaseApiKey, validateAndTrackApiKey } from '../utils/inputValidation/apiKey';
import { clientFactory } from './client';
import { clientInputValidationDecorator } from './clientInputValidation';
import { ISdkFactoryContext } from '../sdkFactory/types';

const COOLDOWN_TIME_IN_MILLIS = 1000;
import { sdkLifecycleFactory } from './sdkLifecycle';

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

let hasInit = false;
let lastActionTime = 0;

function __cooldown(func: Function, time: number) {
const now = Date.now();
//get the actual time elapsed in ms
const timeElapsed = now - lastActionTime;
//check if the time elapsed is less than desired cooldown
if (timeElapsed < time) {
//if yes, return message with remaining time in seconds
settings.log.warn(`Flush cooldown, remaining time ${(time - timeElapsed) / 1000} seconds`);
return Promise.resolve();
} else {
//Do the requested action and re-assign the lastActionTime
lastActionTime = now;
return func();
}
}
const { sdkReadinessManager, settings } = params;

function __flush() {
return syncManager ? syncManager.flush() : Promise.resolve();
}

return objectAssign(
// Proto-linkage of the readiness Event Emitter
Expand All @@ -48,46 +24,6 @@ export function sdkClientFactory(params: ISdkFactoryContext, isSharedClient?: bo
params.fallbackCalculator
),

{
init() {
if (hasInit) return;
hasInit = true;

if (!isSharedClient) {
validateAndTrackApiKey(settings.log, settings.core.authorizationKey);
sdkReadinessManager.readinessManager.init();
impressionsTracker.start();
syncManager && syncManager.start();
signalListener && signalListener.start();
}
},

flush() {
// @TODO define cooldown time
return __cooldown(__flush, COOLDOWN_TIME_IN_MILLIS);
},

destroy() {
hasInit = false;
// Mark the SDK as destroyed immediately
sdkReadinessManager.readinessManager.destroy();

// For main client, cleanup the SDK Key, listeners and scheduled jobs, and record stat before flushing data
if (!isSharedClient) {
releaseApiKey(settings.core.authorizationKey);
telemetryTracker.sessionLength();
signalListener && signalListener.stop();
impressionsTracker.stop();
}

// Stop background jobs
syncManager && syncManager.stop();

return __flush().then(() => {
// Cleanup storage
return storage.destroy();
});
}
}
sdkLifecycleFactory(params, isSharedClient)
);
}
76 changes: 76 additions & 0 deletions src/sdkClient/sdkLifecycle.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import { releaseApiKey, validateAndTrackApiKey } from '../utils/inputValidation/apiKey';
import { ISdkFactoryContext } from '../sdkFactory/types';

const COOLDOWN_TIME_IN_MILLIS = 1000;

/**
* Creates an Sdk client, i.e., a base client with status, init, flush and destroy interface
*/
export function sdkLifecycleFactory(params: ISdkFactoryContext, isSharedClient?: boolean): { init(): void; flush(): Promise<void>; destroy(): Promise<void> } {
const { sdkReadinessManager, syncManager, storage, signalListener, settings, telemetryTracker, impressionsTracker } = params;

let hasInit = false;
let lastActionTime = 0;

function __cooldown(func: Function, time: number) {
const now = Date.now();
//get the actual time elapsed in ms
const timeElapsed = now - lastActionTime;
//check if the time elapsed is less than desired cooldown
if (timeElapsed < time) {
//if yes, return message with remaining time in seconds
settings.log.warn(`Flush cooldown, remaining time ${(time - timeElapsed) / 1000} seconds`);
return Promise.resolve();
} else {
//Do the requested action and re-assign the lastActionTime
lastActionTime = now;
return func();
}
}

function __flush() {
return syncManager ? syncManager.flush() : Promise.resolve();
}

return {
init() {
if (hasInit) return;
hasInit = true;

if (!isSharedClient) {
validateAndTrackApiKey(settings.log, settings.core.authorizationKey);
sdkReadinessManager.readinessManager.init();
impressionsTracker.start();
syncManager && syncManager.start();
signalListener && signalListener.start();
}
},

flush() {
// @TODO define cooldown time
return __cooldown(__flush, COOLDOWN_TIME_IN_MILLIS);
},

destroy() {
hasInit = false;
// Mark the SDK as destroyed immediately
sdkReadinessManager.readinessManager.destroy();

// For main client, cleanup the SDK Key, listeners and scheduled jobs, and record stat before flushing data
if (!isSharedClient) {
releaseApiKey(settings.core.authorizationKey);
telemetryTracker.sessionLength();
signalListener && signalListener.stop();
impressionsTracker.stop();
}

// Stop background jobs
syncManager && syncManager.stop();

return __flush().then(() => {
// Cleanup storage
return storage.destroy();
});
}
};
}