void OnReverseCallContextReceived(ReverseCallArgumentsContext context) { _waitForCallContextStopwatch.Stop(); _metrics.AddToTotalWaitForFirstMessageTime(_waitForCallContextStopwatch.Elapsed); _logger.ReceivedReverseCallContext(_requestId, _waitForCallContextStopwatch.Elapsed); var pingInterval = context.PingInterval.ToTimeSpan(); StartPinging(pingInterval); StartKeepaliveTokenTimeout(pingInterval); }
public void SetConnectArgumentsContext(ReverseCallArgumentsContext context, MyConnectArguments arguments) => arguments.Context = context;
/// <inheritdoc/> public async Task <bool> Connect(TConnectArguments connectArguments, CancellationToken cancellationToken) { ThrowIfConnecting(); lock (_connectLock) { ThrowIfConnecting(); _connecting = true; } var streamingCall = _establishConnection(); _clientToServer = streamingCall.RequestStream; _serverToClient = streamingCall.ResponseStream; var callContext = new ReverseCallArgumentsContext { ExecutionContext = _executionContextManager.Current.ToProtobuf(), PingInterval = Duration.FromTimeSpan(_pingInterval) }; _setArgumentsContext(connectArguments, callContext); var message = new TClientMessage(); _setConnectArguments(message, connectArguments); await _clientToServer.WriteAsync(message).ConfigureAwait(false); using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); linkedCts.CancelAfter(_pingInterval.Multiply(3)); try { if (await _serverToClient.MoveNext(linkedCts.Token).ConfigureAwait(false)) { var response = _getConnectResponse(_serverToClient.Current); if (response != null) { _logger.Trace("Received connect response"); ConnectResponse = response; _connectionEstablished = true; return(true); } else { _logger.Warning("Did not receive connect response. Server message did not contain the connect response"); } } else { _logger.Warning("Did not receive connect response. Server stream was empty"); } await _clientToServer.CompleteAsync().ConfigureAwait(false); return(false); } catch (RpcException ex) when(ex.StatusCode == StatusCode.Cancelled) { if (cancellationToken.IsCancellationRequested) { _logger.Debug("Reverse Call Client was cancelled by client while connecting"); } else { _logger.Warning("Reverse Call Client was cancelled by server while connecting"); } return(false); } }
/// <inheritdoc/> public void SetConnectArgumentsContext(ReverseCallArgumentsContext context, ConsumerSubscriptionRequest arguments) => arguments.CallContext = context;