@splitsoftware/splitio-commons
Version:
Split JavaScript SDK common components
67 lines (66 loc) • 3.62 kB
JavaScript
;
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");
/**
* 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;
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);
});
// 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;