/// <summary> /// Initializes a new instance of the <see cref="PingedConnection{TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse}"/> class. /// </summary> /// <param name="requestId">The request id for the gRPC method call.</param> /// <param name="runtimeStream">The <see cref="IAsyncStreamReader{TClientMessage}"/> to read messages to the Runtime.</param> /// <param name="clientStream">The <see cref="IServerStreamWriter{TServerMessage}"/> to write messages to the Client.</param> /// <param name="context">The <see cref="ServerCallContext"/> of the method call.</param> /// <param name="messageConverter">The <see cref="MethodConverter"/> to use for decoding the connect arguments and reading the desired ping interval from.</param> /// <param name="keepalive">The keepalive token canceller to use for keeping track of ping timeouts.</param> /// <param name="pingScheduler">The callback scheduler to use for scheduling accurate pings.</param> /// <param name="metrics">The metrics collector to use for metrics about reverse calls.</param> /// <param name="loggerFactory">The logger factory to use to create loggers.</param> public PingedConnection( RequestId requestId, IAsyncStreamReader <TClientMessage> runtimeStream, IAsyncStreamWriter <TServerMessage> clientStream, ServerCallContext context, IConvertReverseCallMessages <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse> messageConverter, ICancelTokenIfDeadlineIsMissed keepalive, ICallbackScheduler pingScheduler, IMetricsCollector metrics, ILoggerFactory loggerFactory) { _cancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(context.CancellationToken, keepalive.Token); _requestId = requestId; _keepalive = keepalive; _pingScheduler = pingScheduler; _wrappedReader = new WrappedAsyncStreamReader <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse>( requestId, runtimeStream, messageConverter, metrics, loggerFactory.CreateLogger <WrappedAsyncStreamReader <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse> >(), _cancellationTokenSource.Token); _wrappedWriter = new WrappedAsyncStreamWriter <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse>( requestId, clientStream, messageConverter, metrics, loggerFactory.CreateLogger <WrappedAsyncStreamWriter <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse> >(), _cancellationTokenSource.Token); _metrics = metrics; _logger = loggerFactory.CreateLogger <PingedConnection <TClientMessage, TServerMessage, TConnectArguments, TConnectResponse, TRequest, TResponse> >(); WaitForCallContextInFirstMessageThenStartPinging(); _keepAliveExpiredRegistration = keepalive.Token.Register(NotifyKeepaliveTimedOut); }
/// <summary> /// Initializes a new instance of the <see cref="PingedConnectionFactory"/> class. /// </summary> /// <param name="callbackScheduler">The callback scheduler to use for scheduling pings.</param> /// <param name="metricsCollector">The metrics collector to use for metrics about pinged reverse call connections.</param> /// <param name="loggerFactory">The logger factory to use to create loggers.</param> public PingedConnectionFactory(ICallbackScheduler callbackScheduler, IMetricsCollector metricsCollector, ILoggerFactory loggerFactory) { _callbackScheduler = callbackScheduler; _metricsCollector = metricsCollector; _loggerFactory = loggerFactory; }