public object ReadJson(ref JReader reader)
        {
            var valid = true;
            var flags = new Dictionary <string, FlagState>();

            for (var topLevelObj = reader.Object(); topLevelObj.Next(ref reader);)
            {
                var key = topLevelObj.Name.ToString();
                switch (key)
                {
                case "$valid":
                    valid = reader.Bool();
                    break;

                case "$flagsState":
                    for (var flagsObj = reader.Object(); flagsObj.Next(ref reader);)
                    {
                        var subKey = flagsObj.Name.ToString();
                        var flag   = flags.ContainsKey(subKey) ? flags[subKey] : new FlagState();
                        for (var metaObj = reader.Object(); metaObj.Next(ref reader);)
                        {
                            switch (metaObj.Name.ToString())
                            {
                            case "variation":
                                flag.Variation = reader.IntOrNull();
                                break;

                            case "version":
                                flag.Version = reader.IntOrNull();
                                break;

                            case "trackEvents":
                                flag.TrackEvents = reader.Bool();
                                break;

                            case "debugEventsUntilDate":
                                var n = reader.LongOrNull();
                                flag.DebugEventsUntilDate = n.HasValue ? UnixMillisecondTime.OfMillis(n.Value) :
                                                            (UnixMillisecondTime?)null;
                                break;

                            case "reason":
                                flag.Reason = EvaluationReasonConverter.ReadJsonNullableValue(ref reader);
                                break;
                            }
                        }
                        flags[subKey] = flag;
                    }
                    break;

                default:
                    var flagForValue = flags.ContainsKey(key) ? flags[key] : new FlagState();
                    flagForValue.Value = LdValueConverter.ReadJsonValue(ref reader);
                    flags[key]         = flagForValue;
                    break;
                }
            }
            return(new FeatureFlagsState(valid, flags));
        }
Exemplo n.º 2
0
        internal static ImmutableList <LdValue> ReadValues(ref JReader r)
        {
            var builder = ImmutableList.CreateBuilder <LdValue>();

            for (var arr = r.ArrayOrNull(); arr.Next(ref r);)
            {
                builder.Add(LdValueConverter.ReadJsonValue(ref r));
            }
            return(builder.ToImmutable());
        }
Exemplo n.º 3
0
        internal static void WriteValues(IValueWriter writer, IEnumerable <LdValue> values)
        {
            var arr = writer.Array();

            foreach (var v in values)
            {
                LdValueConverter.WriteJsonValue(v, arr);
            }
            arr.End();
        }
        public void WriteOutputEvent(object e)
        {
            _obj = _jsonWriter.Object();
            switch (e)
            {
            case EvaluationEvent ee:
                WriteEvaluationEvent(ee, false);
                break;

            case IdentifyEvent ie:
                WriteBase("identify", ie.Timestamp, ie.User?.Key);
                WriteUser(ie.User);
                break;

            case CustomEvent ce:
                WriteBase("custom", ce.Timestamp, ce.EventKey);
                WriteUserOrKey(ce.User, false, true);
                if (!ce.Data.IsNull)
                {
                    LdValueConverter.WriteJsonValue(ce.Data, _obj.Name("data"));
                }
                if (ce.MetricValue.HasValue)
                {
                    _obj.Name("metricValue").Double(ce.MetricValue.Value);
                }
                break;

            case AliasEvent ae:
                WriteBase("alias", ae.Timestamp, ae.Key);
                _obj.Name("contextKind").String(ae.ContextKind.ToIdentifier());
                _obj.Name("previousKey").String(ae.PreviousKey);
                _obj.Name("previousContextKind").String(ae.PreviousContextKind.ToIdentifier());
                break;

            case EventProcessorInternal.IndexEvent ie:
                WriteBase("index", ie.Timestamp, null);
                WriteUserOrKey(ie.User, true, false);
                break;

            case EventProcessorInternal.DebugEvent de:
                WriteEvaluationEvent(de.FromEvent, true);
                break;

            default:
                break;
            }
            _obj.End();
        }
        private static FullDataSet <ItemDescriptor> ParseJson(ref JReader r, int version)
        {
            var flagsBuilder    = ImmutableList.CreateBuilder <KeyValuePair <string, ItemDescriptor> >();
            var segmentsBuilder = ImmutableList.CreateBuilder <KeyValuePair <string, ItemDescriptor> >();

            for (var obj = r.Object(); obj.Next(ref r);)
            {
                switch (obj.Name.ToString())
                {
                case "flags":
                    for (var subObj = r.ObjectOrNull(); subObj.Next(ref r);)
                    {
                        var key  = subObj.Name.ToString();
                        var flag = FeatureFlagSerialization.Instance.ReadJson(ref r) as FeatureFlag;
                        flagsBuilder.Add(new KeyValuePair <string, ItemDescriptor>(key, new ItemDescriptor(version,
                                                                                                           FlagWithVersion(flag, version))));
                    }
                    break;

                case "flagValues":
                    for (var subObj = r.ObjectOrNull(); subObj.Next(ref r);)
                    {
                        var key   = subObj.Name.ToString();
                        var value = LdValueConverter.ReadJsonValue(ref r);
                        var flag  = FlagWithValue(key, value, version);
                        flagsBuilder.Add(new KeyValuePair <string, ItemDescriptor>(key, new ItemDescriptor(version, flag)));
                    }
                    break;

                case "segments":
                    for (var subObj = r.ObjectOrNull(); subObj.Next(ref r);)
                    {
                        var key     = subObj.Name.ToString();
                        var segment = SegmentSerialization.Instance.ReadJson(ref r) as Segment;
                        segmentsBuilder.Add(new KeyValuePair <string, ItemDescriptor>(key, new ItemDescriptor(version,
                                                                                                              SegmentWithVersion(segment, version))));
                    }
                    break;
                }
            }
            return(new FullDataSet <ItemDescriptor>(ImmutableList.Create <KeyValuePair <DataKind, KeyedItems <ItemDescriptor> > >(
                                                        new KeyValuePair <DataKind, KeyedItems <ItemDescriptor> >(DataModel.Features,
                                                                                                                  new KeyedItems <ItemDescriptor>(flagsBuilder.ToImmutable())),
                                                        new KeyValuePair <DataKind, KeyedItems <ItemDescriptor> >(DataModel.Segments,
                                                                                                                  new KeyedItems <ItemDescriptor>(segmentsBuilder.ToImmutable()))
                                                        )));
        }
Exemplo n.º 6
0
            public void WriteJson(object value, IValueWriter writer)
            {
                var user = (User)value;

                if (user is null)
                {
                    writer.Null();
                    return;
                }
                var obj = writer.Object();

                obj.Name("key").String(user.Key);
                obj.MaybeName("secondary", user.Secondary != null).String(user.Secondary);
                obj.MaybeName("ip", user.IPAddress != null).String(user.IPAddress);
                obj.MaybeName("country", user.Country != null).String(user.Country);
                obj.MaybeName("firstName", user.FirstName != null).String(user.FirstName);
                obj.MaybeName("lastName", user.LastName != null).String(user.LastName);
                obj.MaybeName("name", user.Name != null).String(user.Name);
                obj.MaybeName("avatar", user.Avatar != null).String(user.Avatar);
                obj.MaybeName("email", user.Email != null).String(user.Email);
                if (user.AnonymousOptional.HasValue)
                {
                    obj.Name("anonymous").Bool(user.Anonymous);
                }
                if (user.Custom.Count > 0)
                {
                    var customObj = obj.Name("custom").Object();
                    foreach (var kv in user.Custom)
                    {
                        LdValueConverter.WriteJsonValue(kv.Value, customObj.Name(kv.Key));
                    }
                    customObj.End();
                }
                if (user.PrivateAttributeNames.Count > 0)
                {
                    var attrsArr = obj.Name("privateAttributeNames").Array();
                    foreach (var n in user.PrivateAttributeNames)
                    {
                        attrsArr.String(n);
                    }
                    attrsArr.End();
                }
                obj.End();
            }
        private void WriteUser(User user)
        {
            if (user is null)
            {
                return;
            }
            var eu = EventUser.FromUser(user, _config);

            var userObj = _obj.Name("user").Object();

            userObj.Name("key").String(eu.Key);
            userObj.MaybeName("secondary", eu.Secondary != null).String(eu.Secondary);
            userObj.MaybeName("ip", eu.IPAddress != null).String(eu.IPAddress);
            userObj.MaybeName("country", eu.Country != null).String(eu.Country);
            userObj.MaybeName("firstName", eu.FirstName != null).String(eu.FirstName);
            userObj.MaybeName("lastName", eu.LastName != null).String(eu.LastName);
            userObj.MaybeName("name", eu.Name != null).String(eu.Name);
            userObj.MaybeName("avatar", eu.Avatar != null).String(eu.Avatar);
            userObj.MaybeName("email", eu.Email != null).String(eu.Email);
            if (eu.Anonymous.HasValue)
            {
                userObj.Name("anonymous").Bool(eu.Anonymous.Value);
            }
            if (eu.Custom != null && eu.Custom.Count > 0)
            {
                var customObj = userObj.Name("custom").Object();
                foreach (var kv in eu.Custom)
                {
                    LdValueConverter.WriteJsonValue(kv.Value, customObj.Name(kv.Key));
                }
                customObj.End();
            }
            if (eu.PrivateAttrs != null)
            {
                var arr = userObj.Name("privateAttrs").Array();
                foreach (var a in eu.PrivateAttrs)
                {
                    arr.String(a);
                }
                arr.End();
            }
            userObj.End();
        }
        private void WriteEvaluationEvent(EvaluationEvent ee, bool debug)
        {
            WriteBase(debug ? "debug" : "feature", ee.Timestamp, ee.FlagKey);

            WriteUserOrKey(ee.User, debug, true);
            if (ee.FlagVersion.HasValue)
            {
                _obj.Name("version").Int(ee.FlagVersion.Value);
            }
            if (ee.Variation.HasValue)
            {
                _obj.Name("variation").Int(ee.Variation.Value);
            }
            LdValueConverter.WriteJsonValue(ee.Value, _obj.Name("value"));
            if (!ee.Default.IsNull)
            {
                LdValueConverter.WriteJsonValue(ee.Default, _obj.Name("default"));
            }
            _obj.MaybeName("prereqOf", ee.PrereqOf != null).String(ee.PrereqOf);
            WriteReason(ee.Reason);
        }
        public void WriteJson(object value, IValueWriter writer)
        {
            var state = value as FeatureFlagsState;

            if (state is null)
            {
                writer.Null();
                return;
            }

            var obj = writer.Object();

            foreach (var entry in state._flags)
            {
                LdValueConverter.WriteJsonValue(entry.Value.Value, obj.Name(entry.Key));
            }

            obj.Name("$valid").Bool(state._valid);

            var allMetadataObj = obj.Name("$flagsState").Object();

            foreach (var entry in state._flags)
            {
                var flagMetadataObj = allMetadataObj.Name(entry.Key).Object();
                var meta            = entry.Value;
                flagMetadataObj.Name("variation").IntOrNull(meta.Variation);
                flagMetadataObj.Name("version").IntOrNull(meta.Version);
                flagMetadataObj.MaybeName("trackEvents", meta.TrackEvents).Bool(meta.TrackEvents);
                flagMetadataObj.MaybeName("debugEventsUntilDate", meta.DebugEventsUntilDate.HasValue)
                .Long(meta.DebugEventsUntilDate?.Value ?? 0);
                if (meta.Reason.HasValue)
                {
                    EvaluationReasonConverter.WriteJsonValue(meta.Reason.Value, flagMetadataObj.Name("reason"));
                }
                flagMetadataObj.End();
            }
            allMetadataObj.End();

            obj.End();
        }
        private static FlagFileData ParseJson(ref JReader r)
        {
            var ret = new FlagFileData
            {
                Flags      = new Dictionary <string, FeatureFlag>(),
                FlagValues = new Dictionary <string, LdValue>(),
                Segments   = new Dictionary <string, Segment>()
            };

            for (var obj = r.Object(); obj.Next(ref r);)
            {
                switch (obj.Name.ToString())
                {
                case "flags":
                    for (var subObj = r.ObjectOrNull(); subObj.Next(ref r);)
                    {
                        ret.Flags[subObj.Name.ToString()] = FeatureFlagSerialization.Instance.ReadJson(ref r) as FeatureFlag;
                    }
                    break;

                case "flagValues":
                    for (var subObj = r.ObjectOrNull(); subObj.Next(ref r);)
                    {
                        ret.FlagValues[subObj.Name.ToString()] = LdValueConverter.ReadJsonValue(ref r);
                    }
                    break;

                case "segments":
                    for (var subObj = r.ObjectOrNull(); subObj.Next(ref r);)
                    {
                        ret.Segments[subObj.Name.ToString()] = SegmentSerialization.Instance.ReadJson(ref r) as Segment;
                    }
                    break;
                }
            }
            return(ret);
        }
Exemplo n.º 11
0
        public void WriteSummaryEvent(EventSummary summary)
        {
            var obj = _jsonWriter.Object();

            obj.Name("kind").String("summary");
            obj.Name("startDate").Long(summary.StartDate.Value);
            obj.Name("endDate").Long(summary.EndDate.Value);

            var flagsObj = obj.Name("features").Object();

            var unprocessedCounters = summary.Counters.Select(kv => MutableKeyValuePair <EventsCounterKey, EventsCounterValue> .FromKeyValue(kv)).ToArray();

            for (var i = 0; i < unprocessedCounters.Length; i++)
            {
                var firstEntry = unprocessedCounters[i];
                if (firstEntry.Value is null)
                { // already processed
                    continue;
                }
                var flagKey     = firstEntry.Key.Key;
                var flagDefault = firstEntry.Value.Default;

                var flagObj = flagsObj.Name(flagKey).Object();
                LdValueConverter.WriteJsonValue(flagDefault, flagObj.Name("default"));
                var countersArr = flagObj.Name("counters").Array();

                for (var j = i; j < unprocessedCounters.Length; j++)
                {
                    var entry = unprocessedCounters[j];
                    var key   = entry.Key;
                    if (key.Key == flagKey && entry.Value != null)
                    {
                        var counter = entry.Value;
                        unprocessedCounters[j].Value = null; // mark as already processed

                        var counterObj = countersArr.Object();
                        if (key.Variation.HasValue)
                        {
                            counterObj.Name("variation").Int(key.Variation.Value);
                        }
                        LdValueConverter.WriteJsonValue(counter.FlagValue, counterObj.Name("value"));
                        if (key.Version.HasValue)
                        {
                            counterObj.Name("version").Int(key.Version.Value);
                        }
                        else
                        {
                            counterObj.Name("unknown").Bool(true);
                        }
                        counterObj.Name("count").Int(counter.Count);
                        counterObj.End();
                    }
                }

                countersArr.End();
                flagObj.End();
            }

            flagsObj.End();
            obj.End();
        }
Exemplo n.º 12
0
            public object ReadJson(ref JReader reader)
            {
                var obj = reader.ObjectOrNull().WithRequiredProperties(_requiredProperties);

                if (!obj.IsDefined)
                {
                    return(null);
                }
                var builder = User.Builder("");

                try
                {
                    while (obj.Next(ref reader))
                    {
                        switch (obj.Name.ToString())
                        {
                        case "key":
                            builder.Key(reader.String());
                            break;

                        case "secondary":
                            builder.Secondary(reader.StringOrNull());
                            break;

                        case "ip":
                            builder.IPAddress(reader.StringOrNull());
                            break;

                        case "country":
                            builder.Country(reader.StringOrNull());
                            break;

                        case "firstName":
                            builder.FirstName(reader.StringOrNull());
                            break;

                        case "lastName":
                            builder.LastName(reader.StringOrNull());
                            break;

                        case "name":
                            builder.Name(reader.StringOrNull());
                            break;

                        case "avatar":
                            builder.Avatar(reader.StringOrNull());
                            break;

                        case "email":
                            builder.Email(reader.StringOrNull());
                            break;

                        case "anonymous":
                            builder.AnonymousOptional(reader.BoolOrNull());
                            break;

                        case "custom":
                            for (var customObj = reader.ObjectOrNull(); customObj.Next(ref reader);)
                            {
                                builder.Custom(customObj.Name.ToString(),
                                               LdValueConverter.ReadJsonValue(ref reader));
                            }
                            break;

                        case "privateAttributeNames":
                            var internalBuilder = builder as UserBuilder;
                            for (var arr = reader.ArrayOrNull(); arr.Next(ref reader);)
                            {
                                internalBuilder.AddPrivateAttribute(reader.String());
                            }
                            break;
                        }
                    }
                }
                catch (Exception e)
                {
                    throw reader.TranslateException(e);
                }
                return(builder.Build());
            }