UNPKG

@splitsoftware/splitio-commons

Version:
71 lines (70 loc) 3.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.sdkClientMethodCSFactory = void 0; var clientCS_1 = require("./clientCS"); var key_1 = require("../utils/inputValidation/key"); var key_2 = require("../utils/key"); var sdkClient_1 = require("./sdkClient"); var objectAssign_1 = require("../utils/lang/objectAssign"); var constants_1 = require("../logger/constants"); var constants_2 = require("../readiness/constants"); var identity_1 = require("./identity"); var setRolloutPlan_1 = require("../storages/setRolloutPlan"); /** * Factory of client method for the client-side API variant where TT is ignored. * Therefore, clients don't have a bound TT for the track method. */ function sdkClientMethodCSFactory(params) { var clients = params.clients, storage = params.storage, syncManager = params.syncManager, sdkReadinessManager = params.sdkReadinessManager, _a = params.settings, key = _a.core.key, log = _a.log, initialRolloutPlan = _a.initialRolloutPlan; var mainClientInstance = (0, clientCS_1.clientCSDecorator)(log, (0, sdkClient_1.sdkClientFactory)(params), key); var parsedDefaultKey = (0, key_2.keyParser)(key); var defaultInstanceId = (0, identity_1.buildInstanceId)(parsedDefaultKey); // Cache instances created per factory. clients[defaultInstanceId] = mainClientInstance; return function client(key) { if (key === undefined) { log.debug(constants_1.RETRIEVE_CLIENT_DEFAULT); return mainClientInstance; } // Validate the key value var validKey = (0, key_1.validateKey)(log, key, constants_1.LOG_PREFIX_CLIENT_INSTANTIATION); if (validKey === false) { throw new Error('Shared Client needs a valid key.'); } var instanceId = (0, identity_1.buildInstanceId)(validKey); if (!clients[instanceId]) { var matchingKey = (0, key_2.getMatching)(validKey); var sharedSdkReadiness_1 = sdkReadinessManager.shared(); var sharedStorage = storage.shared && storage.shared(matchingKey, function (err) { if (err) { sharedSdkReadiness_1.readinessManager.timeout(); return; } // Emit SDK_READY in consumer mode for shared clients sharedSdkReadiness_1.readinessManager.segments.emit(constants_2.SDK_SEGMENTS_ARRIVED); }); if (sharedStorage && initialRolloutPlan) { (0, setRolloutPlan_1.setRolloutPlan)(log, initialRolloutPlan, { segments: sharedStorage.segments, largeSegments: sharedStorage.largeSegments }, matchingKey); } // 3 possibilities: // - Standalone mode: both syncManager and sharedSyncManager are defined // - Consumer mode: both syncManager and sharedSyncManager are undefined // - Consumer partial mode: syncManager is defined (only for submitters) but sharedSyncManager is undefined // @ts-ignore var sharedSyncManager = syncManager && sharedStorage && syncManager.shared(matchingKey, sharedSdkReadiness_1.readinessManager, sharedStorage); // As shared clients reuse all the storage information, we don't need to check here if we // will use offline or online mode. We should stick with the original decision. clients[instanceId] = (0, clientCS_1.clientCSDecorator)(log, (0, sdkClient_1.sdkClientFactory)((0, objectAssign_1.objectAssign)({}, params, { sdkReadinessManager: sharedSdkReadiness_1, storage: sharedStorage || storage, syncManager: sharedSyncManager, }), true), validKey); log.info(constants_1.NEW_SHARED_CLIENT); } else { log.debug(constants_1.RETRIEVE_CLIENT_EXISTING); } return clients[instanceId]; }; } exports.sdkClientMethodCSFactory = sdkClientMethodCSFactory;