Пример #1
0
        private async Task <GremlinResponse <T> > ReceiveAsync <T>()
        {
            ResponseStatus status;
            IAggregator    aggregator = null;
            var            isAggregatingSideEffects = false;
            var            result      = new List <T>();
            List <int>     statusCodes = new List <int>();
            List <Dictionary <string, object> > attributes = new List <Dictionary <string, object> >();

            do
            {
                var received = await _webSocketConnection.ReceiveMessageAsync().ConfigureAwait(false);

                var receivedMsg = _messageSerializer.DeserializeMessage <ResponseMessage <JToken> >(received);

                status = receivedMsg.Status;
                status.ThrowIfStatusIndicatesError();

                if (status.Code == ResponseStatusCode.Authenticate)
                {
                    await AuthenticateAsync().ConfigureAwait(false);
                }
                else
                {
                    statusCodes.Add((int)status.Code);
                    attributes.Add(status.Attributes);
                    if (status.Code != ResponseStatusCode.NoContent)
                    {
                        var receivedData = _graphSONReader.ToObject(receivedMsg.Result.Data);
                        foreach (var d in receivedData)
                        {
                            if (receivedMsg.Result.Meta.ContainsKey(Tokens.ArgsSideEffectKey))
                            {
                                if (aggregator == null)
                                {
                                    aggregator =
                                        new AggregatorFactory().GetAggregatorFor(
                                            (string)receivedMsg.Result.Meta[Tokens.ArgsAggregateTo]);
                                }
                                aggregator.Add(d);
                                isAggregatingSideEffects = true;
                            }
                            else
                            {
                                result.Add(d);
                            }
                        }
                    }
                }
            } while (status.Code == ResponseStatusCode.PartialContent || status.Code == ResponseStatusCode.Authenticate);

            List <T> resultsToReturn = isAggregatingSideEffects
                ? new List <T> {
                (T)aggregator.GetAggregatedResult()
            }
                : result;

            return(new GremlinResponse <T>(resultsToReturn, attributes, statusCodes));
        }
Пример #2
0
        private async Task <IReadOnlyCollection <T> > ReceiveAsync <T>()
        {
            ResponseStatus status;
            IAggregator    aggregator = null;
            var            isAggregatingSideEffects = false;
            var            result = new List <T>();

            do
            {
                var received = await _webSocketConnection.ReceiveMessageAsync().ConfigureAwait(false);

                var receivedMsg = _messageSerializer.DeserializeMessage <ResponseMessage <JToken> >(received);

                status = receivedMsg.Status;
                status.ThrowIfStatusIndicatesError();

                if (status.Code == ResponseStatusCode.Authenticate)
                {
                    await AuthenticateAsync().ConfigureAwait(false);
                }
                else if (status.Code != ResponseStatusCode.NoContent)
                {
                    var receivedData = _graphSONReader.ToObject(receivedMsg.Result.Data);
                    foreach (var d in receivedData)
                    {
                        if (receivedMsg.Result.Meta.ContainsKey(Tokens.ArgsSideEffectKey))
                        {
                            if (aggregator == null)
                            {
                                aggregator =
                                    new AggregatorFactory().GetAggregatorFor(
                                        (string)receivedMsg.Result.Meta[Tokens.ArgsAggregateTo]);
                            }
                            aggregator.Add(d);
                            isAggregatingSideEffects = true;
                        }
                        else
                        {
                            result.Add(d);
                        }
                    }
                }
            } while (status.Code == ResponseStatusCode.PartialContent || status.Code == ResponseStatusCode.Authenticate);

            if (isAggregatingSideEffects)
            {
                return new List <T> {
                           (T)aggregator.GetAggregatedResult()
                }
            }
            ;
            return(result);
        }
Пример #3
0
        private void Parse(byte[] received)
        {
            var receivedMsg = _messageSerializer.DeserializeMessage <ResponseMessage <JToken> >(received);

            try
            {
                TryParseResponseMessage(receivedMsg);
            }
            catch (Exception e)
            {
                if (_callbackByRequestId.TryRemove(receivedMsg.RequestId, out var responseHandler))
                {
                    responseHandler.HandleFailure(e);
                }
            }
        }