Esempio n. 1
0
 public JToken JsonVariation(string key, User user, JToken defaultValue)
 {
     return(Evaluate(key, user, LdValue.FromSafeValue(defaultValue), LdValue.Convert.UnsafeJToken, false, EventFactory.Default).Value);
 }
 public IUserBuilderCanMakeAttributePrivate Custom(string name, float value)
 {
     return(Custom(name, LdValue.Of(value)));
 }
Esempio n. 3
0
 /// <inheritdoc/>
 public string StringVariation(string key, User user, string defaultValue)
 {
     return(Evaluate(key, user, LdValue.Of(defaultValue), LdValue.Convert.String, true, EventFactory.Default).Value);
 }
Esempio n. 4
0
        private EvaluationDetail <T> Evaluate <T>(string featureKey, User user, LdValue defaultValue, LdValue.Converter <T> converter,
                                                  bool checkType, EventFactory eventFactory)
        {
            T defaultValueOfType = converter.ToType(defaultValue);

            if (!Initialized())
            {
                if (_featureStore.Initialized())
                {
                    Log.Warn("Flag evaluation before client initialized; using last known values from feature store");
                }
                else
                {
                    Log.Warn("Flag evaluation before client initialized; feature store unavailable, returning default value");
                    return(new EvaluationDetail <T>(defaultValueOfType, null,
                                                    EvaluationReason.ErrorReason(EvaluationErrorKind.CLIENT_NOT_READY)));
                }
            }

            FeatureFlag featureFlag = null;

            try
            {
                featureFlag = _featureStore.Get(VersionedDataKind.Features, featureKey);
                if (featureFlag == null)
                {
                    Log.InfoFormat("Unknown feature flag {0}; returning default value",
                                   featureKey);
                    _eventProcessor.SendEvent(eventFactory.NewUnknownFeatureRequestEvent(featureKey, user, defaultValue,
                                                                                         EvaluationErrorKind.FLAG_NOT_FOUND));
                    return(new EvaluationDetail <T>(defaultValueOfType, null,
                                                    EvaluationReason.ErrorReason(EvaluationErrorKind.FLAG_NOT_FOUND)));
                }

                if (user == null || user.Key == null)
                {
                    Log.Warn("Feature flag evaluation called with null user or null user key. Returning default");
                    _eventProcessor.SendEvent(eventFactory.NewDefaultFeatureRequestEvent(featureFlag, user, defaultValue,
                                                                                         EvaluationErrorKind.USER_NOT_SPECIFIED));
                    return(new EvaluationDetail <T>(defaultValueOfType, null,
                                                    EvaluationReason.ErrorReason(EvaluationErrorKind.USER_NOT_SPECIFIED)));
                }

                FeatureFlag.EvalResult evalResult = featureFlag.Evaluate(user, _featureStore, eventFactory);
                if (!IsOffline())
                {
                    foreach (var prereqEvent in evalResult.PrerequisiteEvents)
                    {
                        _eventProcessor.SendEvent(prereqEvent);
                    }
                }
                var evalDetail = evalResult.Result;
                EvaluationDetail <T> returnDetail;
                if (evalDetail.VariationIndex == null)
                {
                    returnDetail = new EvaluationDetail <T>(defaultValueOfType, null, evalDetail.Reason);
                    evalDetail   = new EvaluationDetail <LdValue>(defaultValue, null, evalDetail.Reason);
                }
                else
                {
                    if (checkType && !defaultValue.IsNull && evalDetail.Value.Type != defaultValue.Type)
                    {
                        Log.ErrorFormat("Expected type: {0} but got {1} when evaluating FeatureFlag: {2}. Returning default",
                                        defaultValue.Type,
                                        evalDetail.Value.Type,
                                        featureKey);

                        _eventProcessor.SendEvent(eventFactory.NewDefaultFeatureRequestEvent(featureFlag, user,
                                                                                             defaultValue, EvaluationErrorKind.WRONG_TYPE));
                        return(new EvaluationDetail <T>(defaultValueOfType, null,
                                                        EvaluationReason.ErrorReason(EvaluationErrorKind.WRONG_TYPE)));
                    }
                    returnDetail = new EvaluationDetail <T>(converter.ToType(evalDetail.Value),
                                                            evalDetail.VariationIndex, evalDetail.Reason);
                }
                _eventProcessor.SendEvent(eventFactory.NewFeatureRequestEvent(featureFlag, user,
                                                                              evalDetail, defaultValue));
                return(returnDetail);
            }
            catch (Exception e)
            {
                Log.ErrorFormat("Encountered exception in LaunchDarkly client: {0} when evaluating feature key: {1} for user key: {2}",
                                Util.ExceptionMessage(e),
                                featureKey,
                                user.Key);
                Log.Debug(e.ToString(), e);
                var reason = EvaluationReason.ErrorReason(EvaluationErrorKind.EXCEPTION);
                if (featureFlag == null)
                {
                    _eventProcessor.SendEvent(eventFactory.NewUnknownFeatureRequestEvent(featureKey, user,
                                                                                         defaultValue, EvaluationErrorKind.EXCEPTION));
                }
                else
                {
                    _eventProcessor.SendEvent(eventFactory.NewFeatureRequestEvent(featureFlag, user,
                                                                                  new EvaluationDetail <LdValue>(defaultValue, null, reason), defaultValue));
                }
                return(new EvaluationDetail <T>(defaultValueOfType, null, reason));
            }
        }
Esempio n. 5
0
 public void Track(string name, JToken data, User user)
 {
     Track(name, user, LdValue.FromSafeValue(data));
 }
Esempio n. 6
0
 /// <inheritdoc/>
 public EvaluationDetail <float> FloatVariationDetail(string key, User user, float defaultValue)
 {
     return(Evaluate(key, user, LdValue.Of(defaultValue), LdValue.Convert.Float, true, EventFactory.DefaultWithReasons));
 }
Esempio n. 7
0
 public EvaluationDetail <JToken> JsonVariationDetail(string key, User user, JToken defaultValue)
 {
     return(Evaluate(key, user, LdValue.FromSafeValue(defaultValue), LdValue.Convert.UnsafeJToken, false, EventFactory.DefaultWithReasons));
 }
Esempio n. 8
0
 /// <summary>
 /// Adds a key-value pair to the object being built.
 /// </summary>
 /// <param name="key">the key to add</param>
 /// <param name="value">the value to add</param>
 /// <returns>the same builder</returns>
 public ObjectBuilder Add(string key, LdValue value)
 {
     _builder.Add(key, value);
     return(this);
 }
Esempio n. 9
0
 /// <summary>
 /// Adds a key-value pair to the object being built.
 /// </summary>
 /// <param name="key">the key to add</param>
 /// <param name="value">the value to add</param>
 /// <returns>the same builder</returns>
 public ObjectBuilder Add(string key, string value)
 {
     _builder.Add(key, LdValue.Of(value));
     return(this);
 }
Esempio n. 10
0
 /// <summary>
 /// Adds a value to the array being built.
 /// </summary>
 /// <param name="value">the value to add</param>
 /// <returns>the same builder</returns>
 public ArrayBuilder Add(double value)
 {
     _builder.Add(LdValue.Of(value));
     return(this);
 }
Esempio n. 11
0
 /// <summary>
 /// Adds a value to the array being built.
 /// </summary>
 /// <param name="value">the value to add</param>
 /// <returns>the same builder</returns>
 public ArrayBuilder Add(string value)
 {
     _builder.Add(LdValue.Of(value));
     return(this);
 }
Esempio n. 12
0
 /// <summary>
 /// Adds a value to the array being built.
 /// </summary>
 /// <param name="value">the value to add</param>
 /// <returns>the same builder</returns>
 public ArrayBuilder Add(LdValue value)
 {
     _builder.Add(value);
     return(this);
 }
Esempio n. 13
0
 public override T ToType(LdValue jsonValue) => _toTypeFn(jsonValue);
Esempio n. 14
0
 public IUserBuilderCanMakeAttributePrivate Custom(string name, LdValue value)
 {
     return(_builder.Custom(name, value));
 }
Esempio n. 15
0
 /// <inheritdoc/>
 public LdValue JsonVariation(string key, User user, LdValue defaultValue)
 {
     return(Evaluate(key, user, defaultValue, LdValue.Convert.Json, false, EventFactory.Default).Value);
 }
Esempio n. 16
0
 /// <summary>
 /// Converts an <see cref="LdValue"/> to a value of the specified type.
 /// </summary>
 /// <remarks>
 /// This method should never throw an exception; if the conversion cannot be done, it
 /// should return <c>default(T)</c>.
 /// </remarks>
 /// <param name="jsonValue">an <see cref="LdValue"/></param>
 /// <returns>a value of this type</returns>
 abstract public T ToType(LdValue jsonValue);
Esempio n. 17
0
 /// <inheritdoc/>
 public EvaluationDetail <bool> BoolVariationDetail(string key, User user, bool defaultValue)
 {
     return(Evaluate(key, user, LdValue.Of(defaultValue), LdValue.Convert.Bool, true, EventFactory.DefaultWithReasons));
 }
Esempio n. 18
0
        public static bool Apply(string op, LdValue uValue, LdValue cValue)
        {
            try
            {
                if (uValue.IsNull || cValue.IsNull)
                {
                    return(false);
                }

                int comparison;

                switch (op)
                {
                case "in":
                    if (uValue.Equals(cValue))
                    {
                        return(true);
                    }

                    if (uValue.IsString || cValue.IsString)
                    {
                        return(StringOperator(uValue, cValue, (a, b) => a.Equals(b)));
                    }

                    if (TryCompareNumericValues(uValue, cValue, out comparison))
                    {
                        return(comparison == 0);
                    }
                    break;

                case "endsWith":
                    return(StringOperator(uValue, cValue, (a, b) => a.EndsWith(b)));

                case "startsWith":
                    return(StringOperator(uValue, cValue, (a, b) => a.StartsWith(b)));

                case "matches":
                    return(StringOperator(uValue, cValue, (a, b) => new Regex(b).IsMatch(a)));

                case "contains":
                    return(StringOperator(uValue, cValue, (a, b) => a.Contains(b)));

                case "lessThan":
                    if (TryCompareNumericValues(uValue, cValue, out comparison))
                    {
                        return(comparison < 0);
                    }
                    break;

                case "lessThanOrEqual":
                    if (TryCompareNumericValues(uValue, cValue, out comparison))
                    {
                        return(comparison <= 0);
                    }
                    break;

                case "greaterThan":
                    if (TryCompareNumericValues(uValue, cValue, out comparison))
                    {
                        return(comparison > 0);
                    }
                    break;

                case "greaterThanOrEqual":
                    if (TryCompareNumericValues(uValue, cValue, out comparison))
                    {
                        return(comparison >= 0);
                    }
                    break;

                case "before":
                    return(DateOperator(uValue, cValue, (a, b) => DateTime.Compare(a, b) < 0));

                case "after":
                    return(DateOperator(uValue, cValue, (a, b) => DateTime.Compare(a, b) > 0));

                case "semVerEqual":
                    return(SemVerOperator(uValue, cValue, (a, b) => a.ComparePrecedence(b) == 0));

                case "semVerLessThan":
                    return(SemVerOperator(uValue, cValue, (a, b) => a.ComparePrecedence(b) < 0));

                case "semVerGreaterThan":
                    return(SemVerOperator(uValue, cValue, (a, b) => a.ComparePrecedence(b) > 0));

                default:
                    return(false);
                }
            }
            catch (Exception e)
            {
                Log.DebugFormat("Got a possibly expected exception when applying operator: {0} to user Value: {1} and feature flag value: {2}. Exception message: {3}",
                                e,
                                op,
                                uValue,
                                cValue,
                                Util.ExceptionMessage(e));
            }
            return(false);
        }
Esempio n. 19
0
 /// <inheritdoc/>
 public EvaluationDetail <string> StringVariationDetail(string key, User user, string defaultValue)
 {
     return(Evaluate(key, user, LdValue.Of(defaultValue), LdValue.Convert.String, true, EventFactory.DefaultWithReasons));
 }
Esempio n. 20
0
 /// <inheritdoc/>
 public bool BoolVariation(string key, User user, bool defaultValue = false)
 {
     return(Evaluate(key, user, LdValue.Of(defaultValue), LdValue.Convert.Bool, true, EventFactory.Default).Value);
 }
Esempio n. 21
0
 /// <inheritdoc/>
 public EvaluationDetail <LdValue> JsonVariationDetail(string key, User user, LdValue defaultValue)
 {
     return(Evaluate(key, user, defaultValue, LdValue.Convert.Json, false, EventFactory.DefaultWithReasons));
 }
Esempio n. 22
0
 /// <inheritdoc/>
 public int IntVariation(string key, User user, int defaultValue)
 {
     return(Evaluate(key, user, LdValue.Of(defaultValue), LdValue.Convert.Int, true, EventFactory.Default).Value);
 }
Esempio n. 23
0
 public void Track(string name, User user, string data)
 {
     Track(name, user, LdValue.Of(data));
 }
Esempio n. 24
0
 /// <inheritdoc/>
 public float FloatVariation(string key, User user, float defaultValue)
 {
     return(Evaluate(key, user, LdValue.Of(defaultValue), LdValue.Convert.Float, true, EventFactory.Default).Value);
 }
Esempio n. 25
0
 internal CustomEvent(long creationDate, string key, User user, LdValue data, double?metricValue) :
     base(creationDate, key, user)
 {
     LdValueData = data;
     MetricValue = metricValue;
 }
 void Start()
 {
     LaunchDarkly.Client.LdValue flagValueDefault = LaunchDarkly.Client.LdValue.Of(showOptionsFeatureFlagDefault);
     LaunchDarklyClientBehavior.Instance.RegisterFeatureFlagChangedCallback(showOptionsFeatureFlagName, flagValueDefault, flagValueCallback, true);
 }