From 5cd5a7d4cebe134d8256d4a1b6eadff760fbb2a7 Mon Sep 17 00:00:00 2001 From: Greenback Date: Sat, 28 Nov 2020 00:25:20 +0000 Subject: Removed Lazy implementation. --- .../HttpServer/WebSocketManager.cs | 31 ++++++++++------------ .../Session/ISessionWebSocketListener.cs | 30 +++++++++++++++++++++ .../Session/SessionWebSocketListener.cs | 27 +++++++------------ 3 files changed, 54 insertions(+), 34 deletions(-) create mode 100644 Emby.Server.Implementations/Session/ISessionWebSocketListener.cs (limited to 'Emby.Server.Implementations') diff --git a/Emby.Server.Implementations/HttpServer/WebSocketManager.cs b/Emby.Server.Implementations/HttpServer/WebSocketManager.cs index 71ece80a7..5518fb95a 100644 --- a/Emby.Server.Implementations/HttpServer/WebSocketManager.cs +++ b/Emby.Server.Implementations/HttpServer/WebSocketManager.cs @@ -4,7 +4,9 @@ using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -using Jellyfin.Data.Events; +using Emby.Server.Implementations.Session; +using Jellyfin.Api.WebSocketListeners; +using MediaBrowser.Controller; using MediaBrowser.Controller.Net; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; @@ -13,24 +15,21 @@ namespace Emby.Server.Implementations.HttpServer { public class WebSocketManager : IWebSocketManager { - private readonly Lazy> _webSocketListeners; + private readonly IServerApplicationHost _appHost; private readonly ILogger _logger; private readonly ILoggerFactory _loggerFactory; - private bool _disposed = false; public WebSocketManager( - Lazy> webSocketListeners, + IServerApplicationHost appHost, ILogger logger, ILoggerFactory loggerFactory) { - _webSocketListeners = webSocketListeners; + _appHost = appHost; _logger = logger; _loggerFactory = loggerFactory; } - public event EventHandler> WebSocketConnected; - /// public async Task WebSocketRequestHandler(HttpContext context) { @@ -39,6 +38,8 @@ namespace Emby.Server.Implementations.HttpServer return; } + var listener = _appHost.Resolve(); + try { _logger.LogInformation("WS {IP} request", context.Connection.RemoteIpAddress); @@ -54,7 +55,7 @@ namespace Emby.Server.Implementations.HttpServer OnReceive = ProcessWebSocketMessageReceived }; - WebSocketConnected?.Invoke(this, new GenericEventArgs(connection)); + listener?.ProcessWebSocketConnected(connection); await connection.ProcessAsync().ConfigureAwait(false); _logger.LogInformation("WS {IP} closed", context.Connection.RemoteIpAddress); @@ -80,16 +81,12 @@ namespace Emby.Server.Implementations.HttpServer return Task.CompletedTask; } - IEnumerable GetTasks() - { - var listeners = _webSocketListeners.Value; - foreach (var x in listeners) - { - yield return x.ProcessMessageAsync(result); - } - } + Parallel.Invoke( + () => _appHost.Resolve(), + () => _appHost.Resolve(), + () => _appHost.Resolve()); - return Task.WhenAll(GetTasks()); + return Task.CompletedTask; } } } diff --git a/Emby.Server.Implementations/Session/ISessionWebSocketListener.cs b/Emby.Server.Implementations/Session/ISessionWebSocketListener.cs new file mode 100644 index 000000000..9b0b28e6e --- /dev/null +++ b/Emby.Server.Implementations/Session/ISessionWebSocketListener.cs @@ -0,0 +1,30 @@ +namespace Emby.Server.Implementations.Session +{ + using System.Threading.Tasks; + using Jellyfin.Data.Events; + using MediaBrowser.Controller.Net; + + /// + /// Defines the . + /// + public interface ISessionWebSocketListener + { + /// + /// Runs processes due to a WebSocket connection event. + /// + /// The instance. + void ProcessWebSocketConnected(IWebSocketConnection websocketConnection); + + /// + /// Disposes the object. + /// + void Dispose(); + + /// + /// Processes a message. + /// + /// The . + /// A . + Task ProcessMessageAsync(WebSocketMessageInfo message); + } +} diff --git a/Emby.Server.Implementations/Session/SessionWebSocketListener.cs b/Emby.Server.Implementations/Session/SessionWebSocketListener.cs index a5f847953..8f81ee194 100644 --- a/Emby.Server.Implementations/Session/SessionWebSocketListener.cs +++ b/Emby.Server.Implementations/Session/SessionWebSocketListener.cs @@ -17,7 +17,7 @@ namespace Emby.Server.Implementations.Session /// /// Class SessionWebSocketListener. /// - public sealed class SessionWebSocketListener : IWebSocketListener, IDisposable + public sealed class SessionWebSocketListener : ISessionWebSocketListener, IDisposable { /// /// The timeout in seconds after which a WebSocket is considered to be lost. @@ -45,15 +45,13 @@ namespace Emby.Server.Implementations.Session private readonly ILogger _logger; private readonly ILoggerFactory _loggerFactory; - private readonly IWebSocketManager _webSocketManager; - /// /// The KeepAlive cancellation token. /// private CancellationTokenSource _keepAliveCancellationToken; /// - /// Lock used for accesing the KeepAlive cancellation token. + /// Lock used for accessing the KeepAlive cancellation token. /// private readonly object _keepAliveLock = new object(); @@ -63,7 +61,7 @@ namespace Emby.Server.Implementations.Session private readonly HashSet _webSockets = new HashSet(); /// - /// Lock used for accesing the WebSockets watchlist. + /// Lock used for accessing the WebSockets watchlist. /// private readonly object _webSocketsLock = new object(); @@ -73,32 +71,28 @@ namespace Emby.Server.Implementations.Session /// The logger. /// The session manager. /// The logger factory. - /// The HTTP server. public SessionWebSocketListener( ILogger logger, ISessionManager sessionManager, - ILoggerFactory loggerFactory, - IWebSocketManager webSocketManager) + ILoggerFactory loggerFactory) { _logger = logger; _sessionManager = sessionManager; _loggerFactory = loggerFactory; - _webSocketManager = webSocketManager; - - webSocketManager.WebSocketConnected += OnServerManagerWebSocketConnected; } - private async void OnServerManagerWebSocketConnected(object sender, GenericEventArgs e) + /// + public async void ProcessWebSocketConnected(IWebSocketConnection websocketConnection) { - var session = GetSession(e.Argument.QueryString, e.Argument.RemoteEndPoint.ToString()); + var session = GetSession(websocketConnection.QueryString, websocketConnection.RemoteEndPoint.ToString()); if (session != null) { - EnsureController(session, e.Argument); - await KeepAliveWebSocket(e.Argument).ConfigureAwait(false); + EnsureController(session, websocketConnection); + await KeepAliveWebSocket(websocketConnection).ConfigureAwait(false); } else { - _logger.LogWarning("Unable to determine session based on query string: {0}", e.Argument.QueryString); + _logger.LogWarning("Unable to determine session based on query string: {Querystring}", websocketConnection.QueryString); } } @@ -122,7 +116,6 @@ namespace Emby.Server.Implementations.Session /// public void Dispose() { - _webSocketManager.WebSocketConnected -= OnServerManagerWebSocketConnected; StopKeepAlive(); } -- cgit v1.2.3