private async Task <IResponse> InvokeRemoteMethodAsync(IRequest request) { if (request == null) { throw new ArgumentNullException(nameof(request)); } var invokeResult = await _asyncCoupler.WaitOnAsync( async() => await _client.TransmitAsync(request), request.CorrelationId, _requestTimeout); if (invokeResult == null) { throw new NullReferenceException(nameof(invokeResult)); } // timeout is the only likely failure case if (!invokeResult.Successful) { if (invokeResult.Errors == null) { throw new NullReferenceException($"RPC for {request.DestinationPath} failed, {nameof(invokeResult)}.{nameof(invokeResult.Errors)} is null."); } var error = invokeResult.Errors.FirstOrDefault(); if (error != null) { throw new RpcException($"RPC for {request.DestinationPath} failed, {error.Message}"); } } if (invokeResult.Result == null) { throw new NullReferenceException($"RPC for {request.DestinationPath} failed, {nameof(invokeResult)}.{nameof(invokeResult.Result)} is null."); } return((IResponse)invokeResult.Result); }