fix: correct locking issue that was preventing progress

This commit is contained in:
Stevan Freeborn
2025-05-14 16:45:44 -05:00
parent 3458890960
commit 16aa4b5775
9 changed files with 147 additions and 52 deletions
@@ -2,7 +2,7 @@ using System.Text;
namespace StevesBot.Worker.Discord;
internal class DiscordGatewayClient : IDiscordGatewayClient
internal sealed class DiscordGatewayClient : IDiscordGatewayClient
{
private readonly DiscordClientOptions _options;
private readonly IWebSocketFactory _webSocketFactory;
@@ -80,6 +80,12 @@ internal class DiscordGatewayClient : IDiscordGatewayClient
}
}
if (_webSocket?.State is not WebSocketState.Open)
{
_logger.LogWarning("WebSocket is not open. Cannot receive messages.");
return;
}
// websocket message might be larger than the
// size of the buffer so we need to loop until
// we receive the end of the message and
@@ -245,13 +251,10 @@ internal class DiscordGatewayClient : IDiscordGatewayClient
private async Task SendJsonAsync(object data, CancellationToken cancellationToken)
{
using (await _lock.LockAsync(cancellationToken))
if (_webSocket?.State is not WebSocketState.Open)
{
if (_webSocket?.State is not WebSocketState.Open)
{
_logger.LogWarning("WebSocket is not open. Cannot send message.");
return;
}
_logger.LogWarning("WebSocket is not open. Cannot send message.");
return;
}
try
@@ -275,10 +278,20 @@ internal class DiscordGatewayClient : IDiscordGatewayClient
public void Dispose()
{
_heartbeatCts?.Cancel();
_linkedCts?.Cancel();
if (_heartbeatTask is not null && _heartbeatTask.IsCompleted)
{
_heartbeatTask.Dispose();
}
if (_receiveTask is not null && _receiveTask.IsCompleted)
{
_receiveTask.Dispose();
}
_heartbeatCts?.Dispose();
_linkedCts?.Dispose();
_heartbeatTask?.Dispose();
_receiveTask?.Dispose();
_webSocket?.Dispose();
_lock.Dispose();
}
@@ -1,6 +1,6 @@
namespace StevesBot.Worker.Discord;
internal class DiscordRestClient : IDiscordRestClient
internal sealed class DiscordRestClient : IDiscordRestClient
{
private readonly ILogger<DiscordRestClient> _logger;
private readonly HttpClient _httpClient;
@@ -1,6 +1,6 @@
namespace StevesBot.Worker.Discord;
internal class DiscordRestClientException : Exception
internal sealed class DiscordRestClientException : Exception
{
public DiscordRestClientException()
{
@@ -1,5 +1,5 @@
namespace StevesBot.Worker.Discord.Events;
internal record HeartbeatAckDiscordEvent : DiscordEvent
internal sealed record HeartbeatAckDiscordEvent : DiscordEvent
{
}
@@ -1,6 +1,6 @@
namespace StevesBot.Worker.Discord.Events;
internal record HeartbeatDiscordEvent : DiscordEvent
internal sealed record HeartbeatDiscordEvent : DiscordEvent
{
public HeartbeatDiscordEvent(int? sequence)
{