import { objectAssign } from '../utils/lang/objectAssign'; import SplitIO from '../../types/splitio'; import { clientFactory } from './client'; import { clientInputValidationDecorator } from './clientInputValidation'; import { ISdkFactoryContext } from '../sdkFactory/types'; 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, settings } = params; return objectAssign( // Proto-linkage of the readiness Event Emitter Object.create(sdkReadinessManager.sdkStatus) as SplitIO.IStatusInterface, // Client API (getTreatment* & track methods) clientInputValidationDecorator( settings, clientFactory(params), sdkReadinessManager.readinessManager, params.fallbackCalculator ), sdkLifecycleFactory(params, isSharedClient) ); }