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); }
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); } }
public override Task PullData(DataPullRequest request, IServerStreamWriter <DataPullResponse> responseStream, ServerCallContext context) { return(_requestHandler.HandlePullDataAsync(request, responseStream)); }