jellyfin/Emby.Server.Implementations/Session/WebSocketController.cs

123 lines
3.6 KiB
C#
Raw Normal View History

2020-01-13 20:03:49 +01:00
#pragma warning disable CS1591
using System;
2013-10-03 03:22:50 +02:00
using System.Collections.Generic;
using System.Linq;
using System.Net.WebSockets;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Net;
using MediaBrowser.Controller.Net.WebSocketMessages;
using MediaBrowser.Controller.Session;
using MediaBrowser.Model.Session;
using Microsoft.Extensions.Logging;
2016-11-04 00:35:19 +01:00
namespace Emby.Server.Implementations.Session
{
public sealed class WebSocketController : ISessionController, IAsyncDisposable, IDisposable
{
2020-06-06 02:15:56 +02:00
private readonly ILogger<WebSocketController> _logger;
2014-05-17 20:37:40 +02:00
private readonly ISessionManager _sessionManager;
2019-12-17 23:15:02 +01:00
private readonly SessionInfo _session;
2014-05-17 20:37:40 +02:00
2020-05-02 01:30:04 +02:00
private readonly List<IWebSocketConnection> _sockets;
2019-12-17 23:15:02 +01:00
private bool _disposed = false;
public WebSocketController(
ILogger<WebSocketController> logger,
SessionInfo session,
ISessionManager sessionManager)
{
2014-05-17 06:24:10 +02:00
_logger = logger;
2019-12-17 23:15:02 +01:00
_session = session;
2014-05-17 20:37:40 +02:00
_sessionManager = sessionManager;
2019-12-17 23:15:02 +01:00
_sockets = new List<IWebSocketConnection>();
}
private bool HasOpenSockets => GetActiveSockets().Any();
2015-03-21 17:10:02 +01:00
2019-12-17 23:15:02 +01:00
/// <inheritdoc />
public bool SupportsMediaControl => HasOpenSockets;
2015-03-21 17:10:02 +01:00
2019-12-17 23:15:02 +01:00
/// <inheritdoc />
public bool IsSessionActive => HasOpenSockets;
2013-10-03 03:22:50 +02:00
2014-05-17 06:24:10 +02:00
private IEnumerable<IWebSocketConnection> GetActiveSockets()
2019-12-17 23:15:02 +01:00
=> _sockets.Where(i => i.State == WebSocketState.Open);
2014-05-17 06:24:10 +02:00
2014-05-17 20:37:40 +02:00
public void AddWebSocket(IWebSocketConnection connection)
{
2019-12-17 23:15:02 +01:00
_logger.LogDebug("Adding websocket to session {Session}", _session.Id);
_sockets.Add(connection);
2014-05-17 20:37:40 +02:00
2019-12-17 23:15:02 +01:00
connection.Closed += OnConnectionClosed;
2014-05-17 20:37:40 +02:00
}
private async void OnConnectionClosed(object? sender, EventArgs e)
2014-05-17 20:37:40 +02:00
{
2020-11-14 02:04:06 +01:00
var connection = sender as IWebSocketConnection ?? throw new ArgumentException($"{nameof(sender)} is not of type {nameof(IWebSocketConnection)}", nameof(sender));
_logger.LogDebug("Removing websocket from session {Session}", _session.Id);
2019-12-17 23:15:02 +01:00
_sockets.Remove(connection);
connection.Closed -= OnConnectionClosed;
await _sessionManager.CloseIfNeededAsync(_session).ConfigureAwait(false);
2014-05-17 20:37:40 +02:00
}
2019-12-17 23:15:02 +01:00
/// <inheritdoc />
public Task SendMessage<T>(
SessionMessageType name,
2019-12-17 23:15:02 +01:00
Guid messageId,
T data,
CancellationToken cancellationToken)
2014-05-17 06:24:10 +02:00
{
2023-04-01 23:00:51 +02:00
var socket = GetActiveSockets().MaxBy(i => i.LastActivityDate);
2022-12-05 15:00:20 +01:00
if (socket is null)
{
2018-09-12 19:26:21 +02:00
return Task.CompletedTask;
}
2020-01-13 20:03:49 +01:00
return socket.SendAsync(
new OutboundWebSocketMessage<T>
2020-01-13 20:03:49 +01:00
{
Data = data,
MessageType = name,
MessageId = messageId
},
cancellationToken);
}
2019-12-17 23:15:02 +01:00
/// <inheritdoc />
2014-05-17 23:23:48 +02:00
public void Dispose()
{
2019-12-17 23:15:02 +01:00
if (_disposed)
2014-05-17 23:23:48 +02:00
{
2019-12-17 23:15:02 +01:00
return;
2014-05-17 23:23:48 +02:00
}
2019-12-17 23:15:02 +01:00
foreach (var socket in _sockets)
{
socket.Closed -= OnConnectionClosed;
socket.Dispose();
}
_disposed = true;
}
public async ValueTask DisposeAsync()
{
if (_disposed)
{
return;
}
foreach (var socket in _sockets)
{
socket.Closed -= OnConnectionClosed;
await socket.DisposeAsync().ConfigureAwait(false);
2019-12-17 23:15:02 +01:00
}
_disposed = true;
2014-05-17 23:23:48 +02:00
}
}
}