public async Task <bool> StartIndexingRequest(int chainId, long targetHeight, ICrossChainDataProducer crossChainDataProducer) { var requestData = new RequestCrossChainBlockData { FromChainId = LocalChainId, NextHeight = targetHeight }; using (var serverStream = RequestIndexing(requestData)) { while (await serverStream.ResponseStream.MoveNext()) { var response = serverStream.ResponseStream.Current; // requestCrossChain failed or useless response if (!response.Success || !crossChainDataProducer.AddNewBlockInfo(response.BlockInfoResult)) { break; } crossChainDataProducer.Logger.LogTrace( $"Received response from chain {ChainHelpers.ConvertChainIdToBase58(response.BlockInfoResult.ChainId)} at height {response.Height}"); } } return(true); }
private async Task WriteResponseStream <T>(RequestCrossChainBlockData request, IServerStreamWriter <T> responseStream, bool isSideChainRequest) where T : IResponseIndexingMessage { var requestedHeight = request.NextHeight; var remoteChainId = request.FromChainId; var parentChainHeightOfCreation = isSideChainRequest ? (await GetChainInitializationContextAsync(remoteChainId)).ParentChainHeightOfCreation : 0; while (true) { var block = await GetIrreversibleBlock(requestedHeight); if (block == null) { return; } var res = isSideChainRequest ? await CreateResponseForSideChain(block, remoteChainId, parentChainHeightOfCreation) : CreateSideChainResponse(block); await responseStream.WriteAsync((T)res); requestedHeight++; } }
public async Task RequestIndexingSideChain() { var requestData = new RequestCrossChainBlockData { FromChainId = 0, NextHeight = 10 }; IServerStreamWriter <ResponseSideChainBlockData> responseStream = Mock.Of <IServerStreamWriter <ResponseSideChainBlockData> >(); var context = BuildServerCallContext(); await CrossChainGrpcServer.RequestIndexingFromSideChain(requestData, responseStream, context); }
//protected abstract AsyncDuplexStreamingCall<RequestCrossChainBlockData, TResponse> CallWithDuplexStreaming(int milliSeconds = 0); protected abstract AsyncServerStreamingCall <TResponse> RequestIndexing( RequestCrossChainBlockData requestCrossChainBlockData);
protected override AsyncServerStreamingCall <ResponseParentChainBlockData> RequestIndexing(RequestCrossChainBlockData requestCrossChainBlockData) { return(Client.RequestIndexingFromParentChain(requestCrossChainBlockData, new CallOptions().WithDeadline(DateTime.UtcNow.AddSeconds(DialTimeout)))); }
public override async Task RequestIndexingFromSideChain(RequestCrossChainBlockData request, IServerStreamWriter <ResponseSideChainBlockData> responseStream, ServerCallContext context) { Logger.LogTrace("Side Chain Server received IndexedInfo message."); await WriteResponseStream(request, responseStream, false); }