Skip to content

Commit 8774b4e

Browse files
committed
Improve hub disconnect and closure handling
1 parent 60c9e25 commit 8774b4e

File tree

3 files changed

+21
-17
lines changed

3 files changed

+21
-17
lines changed

Common/Utils/JsonWebSocketUtils.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ public static class JsonWebSocketUtils
2828
bytes += result.Count;
2929
if (result.MessageType == WebSocketMessageType.Close)
3030
{
31-
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closure during message read",
32-
cancellationToken);
3331
return new WebsocketClosure();
3432
}
3533

Common/Websocket/WebsockBaseController.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public abstract class WebsocketBaseController<T> : OpenShockControllerBase, IAsy
4343
/// <summary>
4444
/// Channel for multithreading thread safety of the websocket, MessageLoop is the only reader for this channel
4545
/// </summary>
46-
private readonly Channel<T> _channel = Channel.CreateUnbounded<T>();
46+
protected readonly Channel<T> Channel = System.Threading.Channels.Channel.CreateUnbounded<T>();
4747

4848
#pragma warning disable IDISP008
4949
protected WebSocket? WebSocket;
@@ -64,7 +64,7 @@ public WebsocketBaseController(ILogger<WebsocketBaseController<T>> logger, IHost
6464

6565
/// <inheritdoc />
6666
[NonAction]
67-
public ValueTask QueueMessage(T data) => _channel.Writer.WriteAsync(data, LinkedToken);
67+
public ValueTask QueueMessage(T data) => Channel.Writer.WriteAsync(data, LinkedToken);
6868

6969
private bool _disposed;
7070

@@ -88,7 +88,7 @@ public virtual async ValueTask DisposeAsync()
8888
await DisposeControllerAsync();
8989
await UnregisterConnection();
9090

91-
_channel.Writer.Complete();
91+
Channel.Writer.TryComplete();
9292
await Close.CancelAsync();
9393
WebSocket?.Dispose();
9494
LinkedSource.Dispose();
@@ -167,7 +167,7 @@ await HttpContext.Response.WriteAsJsonAsync(response, jsonOptions.Value.Serializ
167167
[NonAction]
168168
private async Task MessageLoop()
169169
{
170-
await foreach (var msg in _channel.Reader.ReadAllAsync(LinkedToken))
170+
await foreach (var msg in Channel.Reader.ReadAllAsync(LinkedToken))
171171
{
172172
try
173173
{

LiveControlGateway/Controllers/LiveControlController.cs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -280,23 +280,21 @@ await JsonWebSocketUtils.ReceiveFullMessageAsyncNonAlloc<BaseRequest<LiveRequest
280280

281281
if (message.IsT2)
282282
{
283-
if (WebSocket.State != WebSocketState.Open)
284-
{
285-
Logger.LogTrace("Client sent closure, but connection state is not open");
286-
break;
287-
}
288-
289283
try
290284
{
291-
await WebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Normal close",
292-
LinkedToken);
285+
if (WebSocket.State is WebSocketState.Open or WebSocketState.CloseReceived
286+
or WebSocketState.CloseSent)
287+
{
288+
await WebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Normal close",
289+
LinkedToken);
290+
}
293291
}
294292
catch (OperationCanceledException e)
295293
{
296294
Logger.LogError(e, "Error during close handshake");
297295
}
298296

299-
Logger.LogInformation("Closing websocket connection");
297+
Logger.LogTrace("Closing websocket connection");
300298
break;
301299
}
302300

@@ -573,18 +571,26 @@ public async Task HubDisconnected()
573571
_unregistered = true;
574572

575573
Logger.LogTrace("Hub disconnected, disposing controller");
574+
575+
Channel.Writer.TryComplete(); // Complete the channel so we stop sending messages
576+
576577
try
577578
{
579+
var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
580+
578581
await SendWebSocketMessage(new LiveControlResponse<LiveResponseType>
579582
{
580583
ResponseType = LiveResponseType.DeviceNotConnected,
581-
}, WebSocket!, LinkedToken);
584+
}, WebSocket!, cts.Token);
585+
586+
await WebSocket!.CloseAsync(WebSocketCloseStatus.NormalClosure, "Hub is connecting from a different location", cts.Token);
582587
}
583588
catch (Exception e)
584589
{
585590
// We don't really care if this fails
586-
Logger.LogDebug(e, "Error while sending disconnect message");
591+
Logger.LogDebug(e, "Error while sending disconnect message or closing websocket");
587592
}
593+
588594
await DisposeAsync();
589595
}
590596

0 commit comments

Comments
 (0)