Skip to content

Commit

Permalink
refactor: use Channels as queueing mechanism for periodic websocket m…
Browse files Browse the repository at this point in the history
…essages (jellyfin#11092)
  • Loading branch information
cvium committed Mar 18, 2024
1 parent 1271e60 commit eae031a
Show file tree
Hide file tree
Showing 5 changed files with 169 additions and 107 deletions.
7 changes: 2 additions & 5 deletions Emby.Server.Implementations/Session/SessionManager.cs
Expand Up @@ -456,8 +456,8 @@ private static string GetSessionKey(string appName, string deviceId)

if (!_activeConnections.TryGetValue(key, out var sessionInfo))
{
_activeConnections[key] = await CreateSession(key, appName, appVersion, deviceId, deviceName, remoteEndPoint, user).ConfigureAwait(false);
sessionInfo = _activeConnections[key];
sessionInfo = await CreateSession(key, appName, appVersion, deviceId, deviceName, remoteEndPoint, user).ConfigureAwait(false);
_activeConnections[key] = sessionInfo;
}

sessionInfo.UserId = user?.Id ?? Guid.Empty;
Expand Down Expand Up @@ -614,9 +614,6 @@ private async void CheckForIdlePlayback(object state)
_logger.LogDebug(ex, "Error calling OnPlaybackStopped");
}
}

playingSessions = Sessions.Where(i => i.NowPlayingItem is not null)
.ToList();
}
else
{
Expand Down
13 changes: 8 additions & 5 deletions Jellyfin.Api/WebSocketListeners/ActivityLogWebSocketListener.cs
Expand Up @@ -20,6 +20,8 @@ public class ActivityLogWebSocketListener : BasePeriodicWebSocketListener<Activi
/// </summary>
private readonly IActivityManager _activityManager;

private bool _disposed;

/// <summary>
/// Initializes a new instance of the <see cref="ActivityLogWebSocketListener"/> class.
/// </summary>
Expand Down Expand Up @@ -51,14 +53,15 @@ protected override Task<ActivityLogEntry[]> GetDataToSend()
}

/// <inheritdoc />
protected override void Dispose(bool dispose)
protected override async ValueTask DisposeAsyncCore()
{
if (dispose)
if (!_disposed)
{
_activityManager.EntryCreated -= OnEntryCreated;
_disposed = true;
}

base.Dispose(dispose);
await base.DisposeAsyncCore().ConfigureAwait(false);
}

/// <summary>
Expand All @@ -75,8 +78,8 @@ protected override void Start(WebSocketMessageInfo message)
base.Start(message);
}

private async void OnEntryCreated(object? sender, GenericEventArgs<ActivityLogEntry> e)
private void OnEntryCreated(object? sender, GenericEventArgs<ActivityLogEntry> e)
{
await SendData(true).ConfigureAwait(false);
SendData(true);
}
}
21 changes: 12 additions & 9 deletions Jellyfin.Api/WebSocketListeners/ScheduledTasksWebSocketListener.cs
Expand Up @@ -20,6 +20,8 @@ public class ScheduledTasksWebSocketListener : BasePeriodicWebSocketListener<IEn
/// <value>The task manager.</value>
private readonly ITaskManager _taskManager;

private bool _disposed;

/// <summary>
/// Initializes a new instance of the <see cref="ScheduledTasksWebSocketListener"/> class.
/// </summary>
Expand Down Expand Up @@ -56,31 +58,32 @@ protected override Task<IEnumerable<TaskInfo>> GetDataToSend()
}

/// <inheritdoc />
protected override void Dispose(bool dispose)
protected override async ValueTask DisposeAsyncCore()
{
if (dispose)
if (!_disposed)
{
_taskManager.TaskExecuting -= OnTaskExecuting;
_taskManager.TaskCompleted -= OnTaskCompleted;
_disposed = true;
}

base.Dispose(dispose);
await base.DisposeAsyncCore().ConfigureAwait(false);
}

private async void OnTaskCompleted(object? sender, TaskCompletionEventArgs e)
private void OnTaskCompleted(object? sender, TaskCompletionEventArgs e)
{
e.Task.TaskProgress -= OnTaskProgress;
await SendData(true).ConfigureAwait(false);
SendData(true);
}

private async void OnTaskExecuting(object? sender, GenericEventArgs<IScheduledTaskWorker> e)
private void OnTaskExecuting(object? sender, GenericEventArgs<IScheduledTaskWorker> e)
{
await SendData(true).ConfigureAwait(false);
SendData(true);
e.Argument.TaskProgress += OnTaskProgress;
}

private async void OnTaskProgress(object? sender, GenericEventArgs<double> e)
private void OnTaskProgress(object? sender, GenericEventArgs<double> e)
{
await SendData(false).ConfigureAwait(false);
SendData(false);
}
}
36 changes: 19 additions & 17 deletions Jellyfin.Api/WebSocketListeners/SessionInfoWebSocketListener.cs
Expand Up @@ -16,6 +16,7 @@ namespace Jellyfin.Api.WebSocketListeners;
public class SessionInfoWebSocketListener : BasePeriodicWebSocketListener<IEnumerable<SessionInfo>, WebSocketListenerState>
{
private readonly ISessionManager _sessionManager;
private bool _disposed;

/// <summary>
/// Initializes a new instance of the <see cref="SessionInfoWebSocketListener"/> class.
Expand Down Expand Up @@ -55,9 +56,9 @@ protected override Task<IEnumerable<SessionInfo>> GetDataToSend()
}

/// <inheritdoc />
protected override void Dispose(bool dispose)
protected override async ValueTask DisposeAsyncCore()
{
if (dispose)
if (!_disposed)
{
_sessionManager.SessionStarted -= OnSessionManagerSessionStarted;
_sessionManager.SessionEnded -= OnSessionManagerSessionEnded;
Expand All @@ -66,9 +67,10 @@ protected override void Dispose(bool dispose)
_sessionManager.PlaybackProgress -= OnSessionManagerPlaybackProgress;
_sessionManager.CapabilitiesChanged -= OnSessionManagerCapabilitiesChanged;
_sessionManager.SessionActivity -= OnSessionManagerSessionActivity;
_disposed = true;
}

base.Dispose(dispose);
await base.DisposeAsyncCore().ConfigureAwait(false);
}

/// <summary>
Expand All @@ -85,38 +87,38 @@ protected override void Start(WebSocketMessageInfo message)
base.Start(message);
}

private async void OnSessionManagerSessionActivity(object? sender, SessionEventArgs e)
private void OnSessionManagerSessionActivity(object? sender, SessionEventArgs e)
{
await SendData(false).ConfigureAwait(false);
SendData(false);
}

private async void OnSessionManagerCapabilitiesChanged(object? sender, SessionEventArgs e)
private void OnSessionManagerCapabilitiesChanged(object? sender, SessionEventArgs e)
{
await SendData(true).ConfigureAwait(false);
SendData(true);
}

private async void OnSessionManagerPlaybackProgress(object? sender, PlaybackProgressEventArgs e)
private void OnSessionManagerPlaybackProgress(object? sender, PlaybackProgressEventArgs e)
{
await SendData(!e.IsAutomated).ConfigureAwait(false);
SendData(!e.IsAutomated);
}

private async void OnSessionManagerPlaybackStopped(object? sender, PlaybackStopEventArgs e)
private void OnSessionManagerPlaybackStopped(object? sender, PlaybackStopEventArgs e)
{
await SendData(true).ConfigureAwait(false);
SendData(true);
}

private async void OnSessionManagerPlaybackStart(object? sender, PlaybackProgressEventArgs e)
private void OnSessionManagerPlaybackStart(object? sender, PlaybackProgressEventArgs e)
{
await SendData(true).ConfigureAwait(false);
SendData(true);
}

private async void OnSessionManagerSessionEnded(object? sender, SessionEventArgs e)
private void OnSessionManagerSessionEnded(object? sender, SessionEventArgs e)
{
await SendData(true).ConfigureAwait(false);
SendData(true);
}

private async void OnSessionManagerSessionStarted(object? sender, SessionEventArgs e)
private void OnSessionManagerSessionStarted(object? sender, SessionEventArgs e)
{
await SendData(true).ConfigureAwait(false);
SendData(true);
}
}

0 comments on commit eae031a

Please sign in to comment.