@splitsoftware/splitio-commons
Version:
Split JavaScript SDK common components
112 lines (111 loc) • 6.87 kB
JavaScript
import { validateAttributes, validateKey, validateDefinition, validateDefinitions, validateIfNotDestroyed, validateIfReadyFromCache, validateEvaluationOptions } from '../utils/inputValidation';
import { startsWith } from '../utils/lang';
import { GET_TREATMENT, GET_TREATMENTS, GET_TREATMENTS_BY_FLAG_SET, GET_TREATMENTS_BY_FLAG_SETS, GET_TREATMENTS_WITH_CONFIG, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET, GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS, GET_TREATMENT_WITH_CONFIG } from '../utils/constants';
import { isConsumerMode } from '../utils/settingsValidation/mode';
import { validateFlagSets } from '../utils/settingsValidation/splitFilters';
/**
* Decorator that validates the input before actually executing the client methods.
* We should "guard" the client here, while not polluting the "real" implementation of those methods.
*/
export function clientInputValidationDecorator(settings, client, readinessManager, fallbackCalculator) {
var log = settings.log, mode = settings.mode;
var isAsync = isConsumerMode(mode);
/**
* Avoid repeating this validations code
*/
function validateEvaluationParams(methodName, maybeKey, maybeNameOrNames, maybeAttributes, maybeOptions) {
var key = validateKey(log, maybeKey, methodName);
var nameOrNames = methodName.indexOf('ByFlagSet') > -1 ?
validateFlagSets(log, methodName, maybeNameOrNames, settings.sync.__splitFiltersValidation.groupedFilters.bySet) :
startsWith(methodName, GET_TREATMENTS) ?
validateDefinitions(log, maybeNameOrNames, methodName) :
validateDefinition(log, maybeNameOrNames, methodName);
var attributes = validateAttributes(log, maybeAttributes, methodName);
var isNotDestroyed = validateIfNotDestroyed(log, readinessManager, methodName);
var options = validateEvaluationOptions(log, maybeOptions, methodName);
validateIfReadyFromCache(log, readinessManager, methodName);
var valid = isNotDestroyed && key && nameOrNames && attributes !== false;
return {
valid: valid,
key: key,
nameOrNames: nameOrNames,
attributes: attributes,
options: options
};
}
function evaluateFallBackTreatment(featureFlagName, withConfig) {
if (Array.isArray(featureFlagName)) {
var res_1 = {};
featureFlagName.forEach(function (split) { return res_1[split] = evaluateFallBackTreatment(split, withConfig); });
return res_1;
}
var _a = fallbackCalculator(featureFlagName), treatment = _a.treatment, config = _a.config;
return withConfig ?
{
treatment: treatment,
config: config
} : treatment;
}
function wrapResult(value) {
return isAsync ? Promise.resolve(value) : value;
}
function getTreatment(maybeKey, maybeFeatureFlagName, maybeAttributes, maybeOptions) {
var params = validateEvaluationParams(GET_TREATMENT, maybeKey, maybeFeatureFlagName, maybeAttributes, maybeOptions);
return params.valid ?
client.getTreatment(params.key, params.nameOrNames, params.attributes, params.options) :
wrapResult(evaluateFallBackTreatment(params.nameOrNames, false));
}
function getTreatmentWithConfig(maybeKey, maybeFeatureFlagName, maybeAttributes, maybeOptions) {
var params = validateEvaluationParams(GET_TREATMENT_WITH_CONFIG, maybeKey, maybeFeatureFlagName, maybeAttributes, maybeOptions);
return params.valid ?
client.getTreatmentWithConfig(params.key, params.nameOrNames, params.attributes, params.options) :
wrapResult(evaluateFallBackTreatment(params.nameOrNames, true));
}
function getTreatments(maybeKey, maybeFeatureFlagNames, maybeAttributes, maybeOptions) {
var params = validateEvaluationParams(GET_TREATMENTS, maybeKey, maybeFeatureFlagNames, maybeAttributes, maybeOptions);
return params.valid ?
client.getTreatments(params.key, params.nameOrNames, params.attributes, params.options) :
wrapResult(evaluateFallBackTreatment(params.nameOrNames || [], false));
}
function getTreatmentsWithConfig(maybeKey, maybeFeatureFlagNames, maybeAttributes, maybeOptions) {
var params = validateEvaluationParams(GET_TREATMENTS_WITH_CONFIG, maybeKey, maybeFeatureFlagNames, maybeAttributes, maybeOptions);
return params.valid ?
client.getTreatmentsWithConfig(params.key, params.nameOrNames, params.attributes, params.options) :
wrapResult(evaluateFallBackTreatment(params.nameOrNames || [], true));
}
function getTreatmentsByFlagSets(maybeKey, maybeFlagSets, maybeAttributes, maybeOptions) {
var params = validateEvaluationParams(GET_TREATMENTS_BY_FLAG_SETS, maybeKey, maybeFlagSets, maybeAttributes, maybeOptions);
return params.valid ?
client.getTreatmentsByFlagSets(params.key, params.nameOrNames, params.attributes, params.options) :
wrapResult({});
}
function getTreatmentsWithConfigByFlagSets(maybeKey, maybeFlagSets, maybeAttributes, maybeOptions) {
var params = validateEvaluationParams(GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SETS, maybeKey, maybeFlagSets, maybeAttributes, maybeOptions);
return params.valid ?
client.getTreatmentsWithConfigByFlagSets(params.key, params.nameOrNames, params.attributes, params.options) :
wrapResult({});
}
function getTreatmentsByFlagSet(maybeKey, maybeFlagSet, maybeAttributes, maybeOptions) {
var params = validateEvaluationParams(GET_TREATMENTS_BY_FLAG_SET, maybeKey, [maybeFlagSet], maybeAttributes, maybeOptions);
return params.valid ?
client.getTreatmentsByFlagSet(params.key, params.nameOrNames[0], params.attributes, params.options) :
wrapResult({});
}
function getTreatmentsWithConfigByFlagSet(maybeKey, maybeFlagSet, maybeAttributes, maybeOptions) {
var params = validateEvaluationParams(GET_TREATMENTS_WITH_CONFIG_BY_FLAG_SET, maybeKey, [maybeFlagSet], maybeAttributes, maybeOptions);
return params.valid ?
client.getTreatmentsWithConfigByFlagSet(params.key, params.nameOrNames[0], params.attributes, params.options) :
wrapResult({});
}
return {
getTreatment: getTreatment,
getTreatmentWithConfig: getTreatmentWithConfig,
getTreatments: getTreatments,
getTreatmentsWithConfig: getTreatmentsWithConfig,
getTreatmentsByFlagSets: getTreatmentsByFlagSets,
getTreatmentsWithConfigByFlagSets: getTreatmentsWithConfigByFlagSets,
getTreatmentsByFlagSet: getTreatmentsByFlagSet,
getTreatmentsWithConfigByFlagSet: getTreatmentsWithConfigByFlagSet,
track: client.track,
};
}