Пример #1
0
        private async Task <bool> PollDataAsync()
        {
            var request = new DataPullRequest
            {
                RequestId       = Guid.NewGuid().ToString(),
                DestinationNode = DestinationNode
            };

            var pullResponse = Client.PullData(request);

            if (await pullResponse.ResponseStream.MoveNext() && !string.IsNullOrEmpty(pullResponse.ResponseStream.Current.Name))
            {
                var responseStreamContext = new ResponseStreamContext <DataPullResponse>(pullResponse.ResponseStream.Current, pullResponse.ResponseStream);

                DataRetrieved?.Invoke(this, responseStreamContext);

                return(true);
            }

            return(false);
        }
Пример #2
0
        public async Task HandlePullDataAsync(DataPullRequest request, IServerStreamWriter <DataPullResponse> responseStream)
        {
            var routeRequest = _routeRepository.GetRouteRequest(request.DestinationNode);

            if (routeRequest == null)
            {
                await responseStream.WriteAsync(new DataPullResponse
                {
                    RequestId       = request.RequestId,
                    SourceRequestId = string.Empty,
                    SourceNode      = string.Empty,
                    DestinationNode = request.DestinationNode,
                    BlockNumber     = 0,
                    TotalBlocks     = 0,
                    Name            = string.Empty,
                    Payload         = ByteString.Empty,
                });
            }
            else
            {
                _logger?.Information($"Route Request Found for {request.DestinationNode} from {routeRequest.SourceNode} " +
                                     $"(Name: {routeRequest.Name}).");

                // Alert the user that a stream is avaiable.
                await responseStream.WriteAsync(new DataPullResponse
                {
                    RequestId       = request.RequestId,
                    SourceRequestId = routeRequest.RequestId.ToString(),
                    SourceNode      = routeRequest.SourceNode,
                    DestinationNode = request.DestinationNode,
                    BlockNumber     = 0,
                    TotalBlocks     = routeRequest.TotalBlocks,
                    Name            = routeRequest.Name,
                    Payload         = ByteString.Empty,
                });

                // Sends the payload data.
                while (!routeRequest.PayloadQueue.IsEmpty)
                {
                    var payload = routeRequest.GetFromPayload();

                    _logger?.Information($"Pushing Data from {routeRequest.SourceNode} to {routeRequest.DestinationNode} " +
                                         $"(Block {payload.BlockNumber} of {routeRequest.TotalBlocks}, " +
                                         $"Name: {routeRequest.Name}, " +
                                         $"Size: {payload.Payload.Length} bytes).");

                    await responseStream.WriteAsync(new DataPullResponse
                    {
                        SourceNode      = routeRequest.SourceNode,
                        SourceRequestId = routeRequest.RequestId.ToString(),
                        DestinationNode = routeRequest.DestinationNode,
                        Name            = routeRequest.Name,
                        BlockNumber     = payload.BlockNumber,
                        TotalBlocks     = routeRequest.TotalBlocks,
                        Payload         = payload.Payload,
                    });
                }

                _routeRepository.CloseRouteRequest(routeRequest);
            }
        }
Пример #3
0
 public override Task PullData(DataPullRequest request, IServerStreamWriter <DataPullResponse> responseStream, ServerCallContext context)
 {
     return(_requestHandler.HandlePullDataAsync(request, responseStream));
 }