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; } } }
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(); } }
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); }