예제 #1
0
        public bool DisconnectIfRequired(IRelayServerConnection connection)
        {
            if (connection.AbsoluteConnectionLifetime.HasValue && connection.ConnectedSince.HasValue)
            {
                if (DateTime.UtcNow > connection.ConnectedSince + connection.AbsoluteConnectionLifetime)
                {
                    _logger?.Information("Disconnecting because connection instance {RelayServerConnectionInstanceId} reached its maximum absolute lifetime of {AbsoluteConnectionLifetime} since {ConnectedSince}", connection.RelayServerConnectionInstanceId, connection.AbsoluteConnectionLifetime, connection.ConnectedSince);

                    connection.Disconnect();
                    return(true);
                }
            }

            if (connection.SlidingConnectionLifetime.HasValue && (connection.LastActivity.HasValue || connection.ConnectedSince.HasValue))
            {
                if (DateTime.UtcNow > (connection.LastActivity ?? connection.ConnectedSince + connection.SlidingConnectionLifetime))
                {
                    _logger?.Information("Disconnecting because connection instance {RelayServerConnectionInstanceId} reached its maximum sliding lifetime of {SlidingConnectionLifetime} since {LastActivity}", connection.RelayServerConnectionInstanceId, connection.SlidingConnectionLifetime, connection.LastActivity ?? connection.ConnectedSince);

                    connection.Disconnect();
                    return(true);
                }
            }

            return(false);
        }
        public async Task Check(IRelayServerConnection connection)
        {
            if (connection == null)
            {
                throw new ArgumentNullException(nameof(connection));
            }

            var logger = _logger?
                         .ForContext("RelayServerUri", connection.Uri)
                         .ForContext("RelayServerConnectionInstanceId", connection.RelayServerConnectionInstanceId);

            if ((connection.TokenExpiry - connection.TokenRefreshWindow) <= DateTime.UtcNow)
            {
                logger?.Information("Access token is going to expire soon. Trying to refresh token for RelayServer {RelayServerUri} with connection instance id {RelayServerConnectionInstanceId}");

                try
                {
                    if (!await connection.TryRequestAuthorizationTokenAsync().ConfigureAwait(false))
                    {
                        throw new AuthenticationException();
                    }
                }
                catch (AuthenticationException)
                {
                    logger?.Warning("Could not renew access token and trying a hard reconnect. relay-server={RelayServerUri}, relay-server-connection-instance-id={RelayServerConnectionInstanceId}");

                    connection.Reconnect();
                }
            }
        }
        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                _disposed = true;

                if (_connection != null)
                {
                    _connection.Dispose();
                    _connection = null;
                }
            }
        }
예제 #4
0
        public void UnregisterConnection(IRelayServerConnection connection)
        {
            if (connection == null)
            {
                throw new ArgumentNullException(nameof(connection));
            }

            _logger?.Information("Unregistering connection to {RelayServer} from maintenance loop", connection.Uri);

            lock (_connections)
            {
                _connections.Remove(connection);
                _connectionsForLoop = _connections.ToArray();
            }
        }
예제 #5
0
        public void Check(IRelayServerConnection connection)
        {
            if (connection == null)
            {
                throw new ArgumentNullException(nameof(connection));
            }

            var logger = _logger?
                         .ForContext("RelayServerUri", connection.Uri)
                         .ForContext("RelayServerConnectionInstanceId", connection.RelayServerConnectionInstanceId);

            var lastHeartbeat = connection.LastHeartbeat;

            if (lastHeartbeat != DateTime.MinValue && lastHeartbeat != DateTime.MaxValue)
            {
                if (lastHeartbeat <= DateTime.UtcNow.Subtract(connection.HeartbeatInterval.Add(TimeSpan.FromSeconds(2))))
                {
                    logger?.Warning("Did not receive expected heartbeat. last-heartbeat={LastHeartbeat}, heartbeat-interval={HeartbeatInterval}, relay-server={RelayServerUri}, relay-server-connection-instance-id={RelayServerConnectionInstanceId}", lastHeartbeat, connection.HeartbeatInterval);

                    connection.Reconnect();
                }
            }
        }
        /// <summary>
        /// Creates a new instance of <see cref="RelayServerConnector"/>.
        /// </summary>
        /// <param name="userName">A <see cref="String"/> containing the user name.</param>
        /// <param name="password">A <see cref="String"/> containing the password.</param>
        /// <param name="relayServer">An <see cref="Uri"/> containing the relay server's base url.</param>
        /// <param name="requestTimeout">An <see cref="int"/> defining the timeout in seconds.</param>
        /// <param name="maxRetries">An <see cref="int"/> defining how much retries the connector should do for posting the answer back to the relay server.</param>
        public RelayServerConnector(string userName, string password, Uri relayServer, int requestTimeout = 10, int maxRetries = 3)
        {
            var factory = _container.Resolve <IRelayServerConnectionFactory>();

            _connection = factory.Create(userName, password, relayServer, requestTimeout, maxRetries);
        }