fix: change order of resuming and make sure to reset heartbeat tracking values after canceling the heartbeat task

This commit is contained in:
Stevan Freeborn
2025-05-24 13:20:45 -05:00
parent 01f69f3b6f
commit 2a014bf8f8
@@ -238,17 +238,17 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient
switch (e) switch (e)
{ {
case HelloDiscordEvent he: case HelloDiscordEvent he:
_logger.LogInformation("Hello event received");
await SetHeartbeatIntervalAsync(he.Data.HeartbeatInterval, cancellationToken); await SetHeartbeatIntervalAsync(he.Data.HeartbeatInterval, cancellationToken);
await StartHeartbeatAsync(cancellationToken); await StartHeartbeatAsync(cancellationToken);
await IdentifyAsync(cancellationToken); await IdentifyAsync(cancellationToken);
_logger.LogInformation("Hello event received");
break; break;
case HeartbeatAckDiscordEvent: case HeartbeatAckDiscordEvent:
_logger.LogInformation("Heartbeat acknowledged event received");
await SetHeartbeatAcknowledgedAsync(_timeProvider.GetUtcNow(), cancellationToken); await SetHeartbeatAcknowledgedAsync(_timeProvider.GetUtcNow(), cancellationToken);
_logger.LogInformation("Heartbeat acknowledged");
break; break;
case HeartbeatDiscordEvent: case HeartbeatDiscordEvent:
_logger.LogInformation("Heartbeat request received"); _logger.LogInformation("Heartbeat request event received");
await SendHeartbeatAsync(cancellationToken); await SendHeartbeatAsync(cancellationToken);
break; break;
case DispatchDiscordEvent de: case DispatchDiscordEvent de:
@@ -257,9 +257,9 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient
if (de is ReadyDiscordEvent re) if (de is ReadyDiscordEvent re)
{ {
_logger.LogInformation("Ready event received");
await SetSessionIdAsync(re.Data.SessionId, cancellationToken); await SetSessionIdAsync(re.Data.SessionId, cancellationToken);
await SetResumeGatewayUrlAsync(re.Data.ResumeGatewayUrl, cancellationToken); await SetResumeGatewayUrlAsync(re.Data.ResumeGatewayUrl, cancellationToken);
_logger.LogInformation("Ready event received");
} }
if (_eventHandlers.TryGetValue(eventType, out var handler)) if (_eventHandlers.TryGetValue(eventType, out var handler))
@@ -377,6 +377,9 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient
private async Task ReconnectAsync(CancellationToken cancellationToken) private async Task ReconnectAsync(CancellationToken cancellationToken)
{ {
await CancelHeartbeatTaskAsync(cancellationToken); await CancelHeartbeatTaskAsync(cancellationToken);
await SetHeartbeatSentAsync(DateTimeOffset.MinValue, cancellationToken);
await SetHeartbeatAcknowledgedAsync(DateTimeOffset.MinValue, cancellationToken);
await CancelReceiveMessagesTaskAsync(cancellationToken); await CancelReceiveMessagesTaskAsync(cancellationToken);
var closeStatus = _canResume ? WebSocketCloseStatus.MandatoryExtension : WebSocketCloseStatus.NormalClosure; var closeStatus = _canResume ? WebSocketCloseStatus.MandatoryExtension : WebSocketCloseStatus.NormalClosure;
@@ -395,9 +398,9 @@ internal sealed class DiscordGatewayClient : IDiscordGatewayClient
await SetWebSocketAsync(_webSocketFactory.Create(), cancellationToken); await SetWebSocketAsync(_webSocketFactory.Create(), cancellationToken);
await ConnectWithResumeUrlAsync(cancellationToken); await ConnectWithResumeUrlAsync(cancellationToken);
await SendResumeAsync(cancellationToken);
await StartReceiveMessagesAsync(cancellationToken); await StartReceiveMessagesAsync(cancellationToken);
await StartHeartbeatAsync(cancellationToken); await StartHeartbeatAsync(cancellationToken);
await SendResumeAsync(cancellationToken);
return; return;
} }