From 52252fcd554a7ac1105374ca6d1b440787820f0a Mon Sep 17 00:00:00 2001 From: Cody Robibero Date: Sun, 2 Jul 2023 16:14:44 -0600 Subject: [PATCH] Fix sending websocket messages (#9948) --- .../HttpServer/WebSocketConnection.cs | 32 ++++++------------- .../Session/SessionWebSocketListener.cs | 9 ++---- .../Net/BasePeriodicWebSocketListener.cs | 1 - .../Net/IWebSocketConnection.cs | 12 ++++++- .../Net/WebSocketMessageInfo.cs | 4 ++- .../Net/WebSocketMessageOfT.cs | 5 ++- .../OutboundWebSocketMessage.cs | 2 +- .../OutboundWebSocketMessageOfT.cs | 2 +- 8 files changed, 29 insertions(+), 38 deletions(-) diff --git a/Emby.Server.Implementations/HttpServer/WebSocketConnection.cs b/Emby.Server.Implementations/HttpServer/WebSocketConnection.cs index af79c18c4e..fd7653a32d 100644 --- a/Emby.Server.Implementations/HttpServer/WebSocketConnection.cs +++ b/Emby.Server.Implementations/HttpServer/WebSocketConnection.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using Jellyfin.Extensions.Json; using MediaBrowser.Controller.Net; using MediaBrowser.Controller.Net.WebSocketMessages; +using MediaBrowser.Controller.Net.WebSocketMessages.Outbound; using MediaBrowser.Model.Session; using Microsoft.Extensions.Logging; @@ -85,26 +86,15 @@ namespace Emby.Server.Implementations.HttpServer /// The state. public WebSocketState State => _socket.State; - /// - /// Sends a message asynchronously. - /// - /// The message. - /// The cancellation token. - /// Task. - public Task SendAsync(WebSocketMessage message, CancellationToken cancellationToken) + /// + public Task SendAsync(OutboundWebSocketMessage message, CancellationToken cancellationToken) { var json = JsonSerializer.SerializeToUtf8Bytes(message, _jsonOptions); return _socket.SendAsync(json, WebSocketMessageType.Text, true, cancellationToken); } - /// - /// Sends a message asynchronously. - /// - /// The type of the message. - /// The message. - /// The cancellation token. - /// Task. - public Task SendAsync(WebSocketMessage message, CancellationToken cancellationToken) + /// + public Task SendAsync(OutboundWebSocketMessage message, CancellationToken cancellationToken) { var json = JsonSerializer.SerializeToUtf8Bytes(message, _jsonOptions); return _socket.SendAsync(json, WebSocketMessageType.Text, true, cancellationToken); @@ -183,7 +173,7 @@ namespace Emby.Server.Implementations.HttpServer return; } - WebSocketMessage? stub; + InboundWebSocketMessage? stub; long bytesConsumed; try { @@ -224,10 +214,10 @@ namespace Emby.Server.Implementations.HttpServer } } - internal WebSocketMessage? DeserializeWebSocketMessage(ReadOnlySequence bytes, out long bytesConsumed) + internal InboundWebSocketMessage? DeserializeWebSocketMessage(ReadOnlySequence bytes, out long bytesConsumed) { var jsonReader = new Utf8JsonReader(bytes); - var ret = JsonSerializer.Deserialize>(ref jsonReader, _jsonOptions); + var ret = JsonSerializer.Deserialize>(ref jsonReader, _jsonOptions); bytesConsumed = jsonReader.BytesConsumed; return ret; } @@ -236,11 +226,7 @@ namespace Emby.Server.Implementations.HttpServer { LastKeepAliveDate = DateTime.UtcNow; return SendAsync( - new OutboundWebSocketMessage - { - MessageId = Guid.NewGuid(), - MessageType = SessionMessageType.KeepAlive - }, + new OutboundKeepAliveMessage(), CancellationToken.None); } diff --git a/Emby.Server.Implementations/Session/SessionWebSocketListener.cs b/Emby.Server.Implementations/Session/SessionWebSocketListener.cs index 4e427b1a4b..b3c93a904a 100644 --- a/Emby.Server.Implementations/Session/SessionWebSocketListener.cs +++ b/Emby.Server.Implementations/Session/SessionWebSocketListener.cs @@ -6,9 +6,8 @@ using System.Threading; using System.Threading.Tasks; using Jellyfin.Api.Extensions; using MediaBrowser.Controller.Net; +using MediaBrowser.Controller.Net.WebSocketMessages.Outbound; using MediaBrowser.Controller.Session; -using MediaBrowser.Model.Net; -using MediaBrowser.Model.Session; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; @@ -308,11 +307,7 @@ namespace Emby.Server.Implementations.Session private Task SendForceKeepAlive(IWebSocketConnection webSocket) { return webSocket.SendAsync( - new WebSocketMessage - { - MessageType = SessionMessageType.ForceKeepAlive, - Data = WebSocketLostTimeout - }, + new ForceKeepAliveMessage(WebSocketLostTimeout), CancellationToken.None); } diff --git a/MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs b/MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs index a07d9b3eb4..8f38d4976b 100644 --- a/MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs +++ b/MediaBrowser.Controller/Net/BasePeriodicWebSocketListener.cs @@ -171,7 +171,6 @@ namespace MediaBrowser.Controller.Net await connection.SendAsync( new OutboundWebSocketMessage { - MessageId = Guid.NewGuid(), MessageType = Type, Data = data }, diff --git a/MediaBrowser.Controller/Net/IWebSocketConnection.cs b/MediaBrowser.Controller/Net/IWebSocketConnection.cs index 04b333230d..79f0846b4a 100644 --- a/MediaBrowser.Controller/Net/IWebSocketConnection.cs +++ b/MediaBrowser.Controller/Net/IWebSocketConnection.cs @@ -5,6 +5,7 @@ using System.Net; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; +using MediaBrowser.Controller.Net.WebSocketMessages; namespace MediaBrowser.Controller.Net { @@ -45,6 +46,15 @@ namespace MediaBrowser.Controller.Net /// The remote end point. IPAddress? RemoteEndPoint { get; } + /// + /// Sends a message asynchronously. + /// + /// The message. + /// The cancellation token. + /// Task. + /// The message is null. + Task SendAsync(OutboundWebSocketMessage message, CancellationToken cancellationToken); + /// /// Sends a message asynchronously. /// @@ -53,7 +63,7 @@ namespace MediaBrowser.Controller.Net /// The cancellation token. /// Task. /// The message is null. - Task SendAsync(WebSocketMessage message, CancellationToken cancellationToken); + Task SendAsync(OutboundWebSocketMessage message, CancellationToken cancellationToken); Task ProcessAsync(CancellationToken cancellationToken = default); } diff --git a/MediaBrowser.Controller/Net/WebSocketMessageInfo.cs b/MediaBrowser.Controller/Net/WebSocketMessageInfo.cs index 2d986b7b34..f7a9ccc44d 100644 --- a/MediaBrowser.Controller/Net/WebSocketMessageInfo.cs +++ b/MediaBrowser.Controller/Net/WebSocketMessageInfo.cs @@ -1,11 +1,13 @@ #nullable disable +using MediaBrowser.Controller.Net.WebSocketMessages; + namespace MediaBrowser.Controller.Net { /// /// Class WebSocketMessageInfo. /// - public class WebSocketMessageInfo : WebSocketMessage + public class WebSocketMessageInfo : InboundWebSocketMessage { /// /// Gets or sets the connection. diff --git a/MediaBrowser.Controller/Net/WebSocketMessageOfT.cs b/MediaBrowser.Controller/Net/WebSocketMessageOfT.cs index 7c35c8010d..11e5a6bb29 100644 --- a/MediaBrowser.Controller/Net/WebSocketMessageOfT.cs +++ b/MediaBrowser.Controller/Net/WebSocketMessageOfT.cs @@ -6,13 +6,12 @@ namespace MediaBrowser.Controller.Net; /// Class WebSocketMessage. /// /// The type of the data. -// TODO make this abstract, remove empty ctor. -public class WebSocketMessage : WebSocketMessage +public abstract class WebSocketMessage : WebSocketMessage { /// /// Initializes a new instance of the class. /// - public WebSocketMessage() + protected WebSocketMessage() { } diff --git a/MediaBrowser.Controller/Net/WebSocketMessages/OutboundWebSocketMessage.cs b/MediaBrowser.Controller/Net/WebSocketMessages/OutboundWebSocketMessage.cs index ad97796e70..1782458516 100644 --- a/MediaBrowser.Controller/Net/WebSocketMessages/OutboundWebSocketMessage.cs +++ b/MediaBrowser.Controller/Net/WebSocketMessages/OutboundWebSocketMessage.cs @@ -10,5 +10,5 @@ public class OutboundWebSocketMessage : WebSocketMessage, IOutboundWebSocketMess /// /// Gets or sets the message id. /// - public Guid MessageId { get; set; } + public Guid MessageId { get; set; } = Guid.NewGuid(); } diff --git a/MediaBrowser.Controller/Net/WebSocketMessages/OutboundWebSocketMessageOfT.cs b/MediaBrowser.Controller/Net/WebSocketMessages/OutboundWebSocketMessageOfT.cs index f09f294b41..cce331805c 100644 --- a/MediaBrowser.Controller/Net/WebSocketMessages/OutboundWebSocketMessageOfT.cs +++ b/MediaBrowser.Controller/Net/WebSocketMessages/OutboundWebSocketMessageOfT.cs @@ -29,5 +29,5 @@ public class OutboundWebSocketMessage : WebSocketMessage, IOutboundWebSock /// /// Gets or sets the message id. /// - public Guid MessageId { get; set; } + public Guid MessageId { get; set; } = Guid.NewGuid(); }