Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
// Return if user is bucketed into a different experiment than the one specified
if (bucketedExperimentId !== bucketerParams.experimentId) {
var notBucketedIntoExperimentOfGroupLogMessage = sprintf(LOG_MESSAGES.USER_NOT_BUCKETED_INTO_EXPERIMENT_IN_GROUP, MODULE_NAME, bucketerParams.userId, bucketerParams.experimentKey, groupId);
bucketerParams.logger.log(LOG_LEVEL.INFO, notBucketedIntoExperimentOfGroupLogMessage);
return null;
}
// Continue bucketing if user is bucketed into specified experiment
var bucketedIntoExperimentOfGroupLogMessage = sprintf(LOG_MESSAGES.USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP, MODULE_NAME, bucketerParams.userId, bucketerParams.experimentKey, groupId);
bucketerParams.logger.log(LOG_LEVEL.INFO, bucketedIntoExperimentOfGroupLogMessage);
}
}
var bucketingId = sprintf('%s%s', bucketerParams.bucketingId, bucketerParams.experimentId);
var bucketValue = module.exports._generateBucketValue(bucketingId);
var bucketedUserLogMessage = sprintf(LOG_MESSAGES.USER_ASSIGNED_TO_VARIATION_BUCKET, MODULE_NAME, bucketValue, bucketerParams.userId);
bucketerParams.logger.log(LOG_LEVEL.DEBUG, bucketedUserLogMessage);
var entityId = module.exports._findBucket(bucketValue, bucketerParams.trafficAllocationConfig);
if (entityId === null || entityId === '') {
var userHasNoVariationLogMessage = sprintf(LOG_MESSAGES.USER_HAS_NO_VARIATION, MODULE_NAME, bucketerParams.userId, bucketerParams.experimentKey);
bucketerParams.logger.log(LOG_LEVEL.DEBUG, userHasNoVariationLogMessage);
} else if (!bucketerParams.variationIdMap.hasOwnProperty(entityId)) {
var invalidVariationIdLogMessage = sprintf(LOG_MESSAGES.INVALID_VARIATION_ID, MODULE_NAME);
bucketerParams.logger.log(LOG_LEVEL.WARNING, invalidVariationIdLogMessage);
return null;
} else {
var variationKey = bucketerParams.variationIdMap[entityId].key;
var userInVariationLogMessage = sprintf(LOG_MESSAGES.USER_HAS_VARIATION, MODULE_NAME, bucketerParams.userId, variationKey, bucketerParams.experimentKey);
bucketerParams.logger.log(LOG_LEVEL.INFO, userInVariationLogMessage);
}
return null;
}
// Return if user is bucketed into a different experiment than the one specified
if (bucketedExperimentId !== bucketerParams.experimentId) {
var notBucketedIntoExperimentOfGroupLogMessage = sprintf(LOG_MESSAGES.USER_NOT_BUCKETED_INTO_EXPERIMENT_IN_GROUP, MODULE_NAME, bucketerParams.userId, bucketerParams.experimentKey, groupId);
bucketerParams.logger.log(LOG_LEVEL.INFO, notBucketedIntoExperimentOfGroupLogMessage);
return null;
}
// Continue bucketing if user is bucketed into specified experiment
var bucketedIntoExperimentOfGroupLogMessage = sprintf(LOG_MESSAGES.USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP, MODULE_NAME, bucketerParams.userId, bucketerParams.experimentKey, groupId);
bucketerParams.logger.log(LOG_LEVEL.INFO, bucketedIntoExperimentOfGroupLogMessage);
}
}
var bucketingId = sprintf('%s%s', bucketerParams.bucketingId, bucketerParams.experimentId);
var bucketValue = module.exports._generateBucketValue(bucketingId);
var bucketedUserLogMessage = sprintf(LOG_MESSAGES.USER_ASSIGNED_TO_VARIATION_BUCKET, MODULE_NAME, bucketValue, bucketerParams.userId);
bucketerParams.logger.log(LOG_LEVEL.DEBUG, bucketedUserLogMessage);
var entityId = module.exports._findBucket(bucketValue, bucketerParams.trafficAllocationConfig);
if (entityId === null || entityId === '') {
var userHasNoVariationLogMessage = sprintf(LOG_MESSAGES.USER_HAS_NO_VARIATION, MODULE_NAME, bucketerParams.userId, bucketerParams.experimentKey);
bucketerParams.logger.log(LOG_LEVEL.DEBUG, userHasNoVariationLogMessage);
} else if (!bucketerParams.variationIdMap.hasOwnProperty(entityId)) {
var invalidVariationIdLogMessage = sprintf(LOG_MESSAGES.INVALID_VARIATION_ID, MODULE_NAME);
bucketerParams.logger.log(LOG_LEVEL.WARNING, invalidVariationIdLogMessage);
return null;
} else {
var variationKey = bucketerParams.variationIdMap[entityId].key;
var userInVariationLogMessage = sprintf(LOG_MESSAGES.USER_HAS_VARIATION, MODULE_NAME, bucketerParams.userId, variationKey, bucketerParams.experimentKey);
it('should call the error handler and fulfill onReady with an unsuccessful result if neither datafile nor sdkKey are passed into the constructor', function() {
var manager = new projectConfigManager.ProjectConfigManager({
skipJSONValidation: true,
});
sinon.assert.calledOnce(globalStubErrorHandler.handleError);
var errorMessage = globalStubErrorHandler.handleError.lastCall.args[0].message;
assert.strictEqual(errorMessage, sprintf(ERROR_MESSAGES.DATAFILE_AND_SDK_KEY_MISSING, 'PROJECT_CONFIG_MANAGER'));
return manager.onReady().then(function(result) {
assert.include(result, {
success: false,
});
});
});
var userValue = userAttributes[conditionName];
var userValueType = typeof userValue;
var conditionValue = condition.value;
if (!fns.isFinite(conditionValue)) {
logger.log(LOG_LEVEL.WARNING, sprintf(LOG_MESSAGES.UNEXPECTED_CONDITION_VALUE, MODULE_NAME, JSON.stringify(condition)));
return null;
}
if (userValue === null) {
logger.log(LOG_LEVEL.DEBUG, sprintf(LOG_MESSAGES.UNEXPECTED_TYPE_NULL, MODULE_NAME, JSON.stringify(condition), conditionName));
return null;
}
if (!fns.isNumber(userValue)) {
logger.log(LOG_LEVEL.WARNING, sprintf(LOG_MESSAGES.UNEXPECTED_TYPE, MODULE_NAME, JSON.stringify(condition), userValueType, conditionName));
return null;
}
if (!fns.isFinite(userValue)) {
logger.log(LOG_LEVEL.WARNING, sprintf(LOG_MESSAGES.OUT_OF_BOUNDS, MODULE_NAME, JSON.stringify(condition), conditionName));
return null;
}
return userValue > conditionValue;
}
);
return null;
}
var decision = this.decisionService.getVariationForFeature(this.configObj, featureFlag, userId, attributes);
var variableValue;
if (decision.variation !== null) {
variableValue = projectConfig.getVariableValueForVariation(
this.configObj,
variable,
decision.variation,
this.logger
);
this.logger.log(
LOG_LEVEL.INFO,
sprintf(
LOG_MESSAGES.USER_RECEIVED_VARIABLE_VALUE,
MODULE_NAME,
variableKey,
featureFlag.key,
variableValue,
userId
)
);
} else {
variableValue = variable.defaultValue;
this.logger.log(
LOG_LEVEL.INFO,
sprintf(LOG_MESSAGES.USER_RECEIVED_DEFAULT_VARIABLE_VALUE, MODULE_NAME, userId, variableKey, featureFlag.key)
);
}
tryCreatingProjectConfig: function(config) {
configValidator.validateDatafile(config.datafile);
if (config.skipJSONValidation === true) {
config.logger.log(LOG_LEVEL.INFO, sprintf(LOG_MESSAGES.SKIPPING_JSON_VALIDATION, MODULE_NAME));
} else if (config.jsonSchemaValidator) {
config.jsonSchemaValidator.validate(projectConfigSchema, config.datafile);
config.logger.log(LOG_LEVEL.INFO, sprintf(LOG_MESSAGES.VALID_DATAFILE, MODULE_NAME));
}
return module.exports.createProjectConfig(config.datafile);
},
};
DecisionService.prototype.__getWhitelistedVariation = function(experiment, userId) {
if (!fns.isEmpty(experiment.forcedVariations) && experiment.forcedVariations.hasOwnProperty(userId)) {
var forcedVariationKey = experiment.forcedVariations[userId];
if (experiment.variationKeyMap.hasOwnProperty(forcedVariationKey)) {
var forcedBucketingSucceededMessageLog = sprintf(LOG_MESSAGES.USER_FORCED_IN_VARIATION, MODULE_NAME, userId, forcedVariationKey);
this.logger.log(LOG_LEVEL.INFO, forcedBucketingSucceededMessageLog);
return experiment.variationKeyMap[forcedVariationKey];
} else {
var forcedBucketingFailedMessageLog = sprintf(LOG_MESSAGES.FORCED_BUCKETING_FAILED, MODULE_NAME, forcedVariationKey, userId);
this.logger.log(LOG_LEVEL.ERROR, forcedBucketingFailedMessageLog);
return null;
}
}
return null;
};
if (!jsonSchema) {
throw new Error(sprintf(ERROR_MESSAGES.JSON_SCHEMA_EXPECTED, MODULE_NAME));
}
if (!jsonObject) {
throw new Error(sprintf(ERROR_MESSAGES.NO_JSON_PROVIDED, MODULE_NAME));
}
var result = validate(jsonObject, jsonSchema);
if (result.valid) {
return true;
} else {
if (fns.isArray(result.errors)) {
throw new Error(sprintf(ERROR_MESSAGES.INVALID_DATAFILE, MODULE_NAME, result.errors[0].property, result.errors[0].message));
}
throw new Error(sprintf(ERROR_MESSAGES.INVALID_JSON, MODULE_NAME));
}
}
};
function evaluate(condition, userAttributes, logger) {
if (condition.type !== CUSTOM_ATTRIBUTE_CONDITION_TYPE) {
logger.log(LOG_LEVEL.WARNING, sprintf(LOG_MESSAGES.UNKNOWN_CONDITION_TYPE, MODULE_NAME, JSON.stringify(condition)));
return null;
}
var conditionMatch = condition.match;
if (typeof conditionMatch !== 'undefined' && MATCH_TYPES.indexOf(conditionMatch) === -1) {
logger.log(LOG_LEVEL.WARNING, sprintf(LOG_MESSAGES.UNKNOWN_MATCH_TYPE, MODULE_NAME, JSON.stringify(condition)));
return null;
}
var attributeKey = condition.name;
if (!userAttributes.hasOwnProperty(attributeKey) && conditionMatch != EXISTS_MATCH_TYPE) {
logger.log(LOG_LEVEL.DEBUG, sprintf(LOG_MESSAGES.MISSING_ATTRIBUTE_VALUE, MODULE_NAME, JSON.stringify(condition), attributeKey));
return null;
}
var evaluatorForMatch = EVALUATORS_BY_MATCH_TYPE[conditionMatch] || exactEvaluator;
return evaluatorForMatch(condition, userAttributes, logger);
}
if (decision.variation !== null) {
featureEnabled = decision.variation.featureEnabled;
var value = projectConfig.getVariableValueForVariation(configObj, variable, decision.variation, this.logger);
if (value !== null) {
if (featureEnabled === true) {
variableValue = value;
this.logger.log(LOG_LEVEL.INFO, sprintf(LOG_MESSAGES.USER_RECEIVED_VARIABLE_VALUE, MODULE_NAME, variableKey, featureFlag.key, variableValue, userId));
} else {
this.logger.log(LOG_LEVEL.INFO, sprintf(LOG_MESSAGES.FEATURE_NOT_ENABLED_RETURN_DEFAULT_VARIABLE_VALUE, MODULE_NAME,
featureFlag.key, userId, variableKey));
}
} else {
this.logger.log(LOG_LEVEL.INFO, sprintf(LOG_MESSAGES.VARIABLE_NOT_USED_RETURN_DEFAULT_VARIABLE_VALUE, MODULE_NAME, variableKey, decision.variation.key));
}
} else {
this.logger.log(LOG_LEVEL.INFO, sprintf(LOG_MESSAGES.USER_RECEIVED_DEFAULT_VARIABLE_VALUE, MODULE_NAME, userId,
variableKey, featureFlag.key));
}
var sourceInfo = {};
if (decision.decisionSource === DECISION_SOURCES.FEATURE_TEST) {
sourceInfo = {
experimentKey: decision.experiment.key,
variationKey: decision.variation.key,
}
}
var typeCastedValue = projectConfig.getTypeCastValue(variableValue, variableType, this.logger);
this.notificationCenter.sendNotifications(
NOTIFICATION_TYPES.DECISION,
{
type: DECISION_NOTIFICATION_TYPES.FEATURE_VARIABLE,