UNPKG

@splitsoftware/splitio-commons

Version:
112 lines (111 loc) 6.87 kB
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, }; }