refactor(AuthClient): Enhance AuthClient with lazy initialization and connection error handling

- Replaced immediate connection start with lazy initialization via Lazy<Task<bool>>.
- Added IsConnected and ConnectionError properties to track connection status and errors.
- Introduced TryStartAsync method to safely attempt connection startup without throwing exceptions.
This commit is contained in:
Developer 02 2025-02-03 16:22:41 +01:00
parent 48970a1e13
commit 31ccd93b0d
2 changed files with 38 additions and 1 deletions

View File

@ -3,4 +3,6 @@
public interface IAuthClient : IAuthClientHandler public interface IAuthClient : IAuthClientHandler
{ {
Task StartAsync(); Task StartAsync();
Task<bool> TryStartAsync();
} }

View File

@ -9,6 +9,8 @@ public class AuthClient : IAuthClient
{ {
private readonly HubConnection _connection; private readonly HubConnection _connection;
private readonly Lazy<Task<bool>> _lazyInitiator;
private readonly ILogger? _logger; private readonly ILogger? _logger;
private readonly ClientParams _params; private readonly ClientParams _params;
@ -24,9 +26,42 @@ public class AuthClient : IAuthClient
_logger = logger; _logger = logger;
_params = paramsOptions.Value; _params = paramsOptions.Value;
_lazyInitiator = new(async () =>
{
try
{
await _connection.StartAsync();
IsConnected = true;
return true;
}
catch(Exception ex)
{
ConnectionError = ex;
throw;
}
});
} }
public async Task StartAsync() => await _connection.StartAsync(); public bool IsConnected { get; private set; } = false;
public Exception? ConnectionError { get; private set; }
public bool IsConnectionFailed => ConnectionError is not null;
public async Task StartAsync() => await _lazyInitiator.Value;
public async Task<bool> TryStartAsync()
{
try
{
return await _lazyInitiator.Value;
}
catch
{
return false;
}
}
public Task ReceiveMessageAsync(string user, string message) => Task.Run(() => _params.Events.OnMessageReceived(user, message, _logger)); public Task ReceiveMessageAsync(string user, string message) => Task.Run(() => _params.Events.OnMessageReceived(user, message, _logger));
} }