From 680c48d5840f47fc19a347c98a334d02ea17ea70 Mon Sep 17 00:00:00 2001 From: Mikael Mengistu Date: Tue, 6 Jun 2017 21:50:34 -0400 Subject: [PATCH] Change Group Add and Remove API (#522) --- .../ChatSample/PresenceHubLifetimeManager.cs | 8 ++++---- samples/SocketsSample/Hubs/Chat.cs | 6 +++--- .../RedisHubLifetimeManager.cs | 18 ++++++++++++++---- .../DefaultHubLifetimeManager.cs | 17 ++++++++++++++--- .../HubLifetimeManager.cs | 4 ++-- .../IGroupManager.cs | 4 ++-- src/Microsoft.AspNetCore.SignalR/Proxies.cs | 8 ++++---- .../HubEndpointTests.cs | 4 ++-- 8 files changed, 45 insertions(+), 24 deletions(-) diff --git a/samples/ChatSample/PresenceHubLifetimeManager.cs b/samples/ChatSample/PresenceHubLifetimeManager.cs index ecb8801dc5..7ce90ede21 100644 --- a/samples/ChatSample/PresenceHubLifetimeManager.cs +++ b/samples/ChatSample/PresenceHubLifetimeManager.cs @@ -157,14 +157,14 @@ namespace ChatSample return _wrappedHubLifetimeManager.InvokeUserAsync(userId, methodName, args); } - public override Task AddGroupAsync(ConnectionContext connection, string groupName) + public override Task AddGroupAsync(string connectionId, string groupName) { - return _wrappedHubLifetimeManager.AddGroupAsync(connection, groupName); + return _wrappedHubLifetimeManager.AddGroupAsync(connectionId, groupName); } - public override Task RemoveGroupAsync(ConnectionContext connection, string groupName) + public override Task RemoveGroupAsync(string connectionId, string groupName) { - return _wrappedHubLifetimeManager.RemoveGroupAsync(connection, groupName); + return _wrappedHubLifetimeManager.RemoveGroupAsync(connectionId, groupName); } } } diff --git a/samples/SocketsSample/Hubs/Chat.cs b/samples/SocketsSample/Hubs/Chat.cs index 80b3d3b145..29f09f1ca8 100644 --- a/samples/SocketsSample/Hubs/Chat.cs +++ b/samples/SocketsSample/Hubs/Chat.cs @@ -31,14 +31,14 @@ namespace SocketsSample.Hubs public async Task JoinGroup(string groupName) { - await Clients.Group(groupName).InvokeAsync("Send", $"{Context.ConnectionId} joined {groupName}"); + await Groups.AddAsync(Context.ConnectionId, groupName); - await Groups.AddAsync(groupName); + await Clients.Group(groupName).InvokeAsync("Send", $"{Context.ConnectionId} joined {groupName}"); } public async Task LeaveGroup(string groupName) { - await Groups.RemoveAsync(groupName); + await Groups.RemoveAsync(Context.ConnectionId, groupName); await Clients.Group(groupName).InvokeAsync("Send", $"{Context.ConnectionId} left {groupName}"); } diff --git a/src/Microsoft.AspNetCore.SignalR.Redis/RedisHubLifetimeManager.cs b/src/Microsoft.AspNetCore.SignalR.Redis/RedisHubLifetimeManager.cs index 485b6e7d23..dd80dc5afc 100644 --- a/src/Microsoft.AspNetCore.SignalR.Redis/RedisHubLifetimeManager.cs +++ b/src/Microsoft.AspNetCore.SignalR.Redis/RedisHubLifetimeManager.cs @@ -200,17 +200,21 @@ namespace Microsoft.AspNetCore.SignalR.Redis // in RemoveGroupAsync foreach (var group in groupNames.ToArray()) { - tasks.Add(RemoveGroupAsync(connection, group)); + tasks.Add(RemoveGroupAsync(connection.ConnectionId, group)); } } return Task.WhenAll(tasks); } - public override async Task AddGroupAsync(ConnectionContext connection, string groupName) + public override async Task AddGroupAsync(string connectionId, string groupName) { var groupChannel = typeof(THub).FullName + ".group." + groupName; - + var connection = _connections[connectionId]; + if (connection == null) + { + return; + } var groupNames = connection.Metadata.GetOrAdd(HubConnectionMetadataNames.Groups, _ => new HashSet()); lock (groupNames) @@ -258,7 +262,7 @@ namespace Microsoft.AspNetCore.SignalR.Redis } } - public override async Task RemoveGroupAsync(ConnectionContext connection, string groupName) + public override async Task RemoveGroupAsync(string connectionId, string groupName) { var groupChannel = typeof(THub).FullName + ".group." + groupName; @@ -268,6 +272,12 @@ namespace Microsoft.AspNetCore.SignalR.Redis return; } + var connection = _connections[connectionId]; + if (connection != null) + { + return; + } + var groupNames = connection.Metadata.Get>(HubConnectionMetadataNames.Groups); if (groupNames != null) { diff --git a/src/Microsoft.AspNetCore.SignalR/DefaultHubLifetimeManager.cs b/src/Microsoft.AspNetCore.SignalR/DefaultHubLifetimeManager.cs index e6042603d1..15218eb4d6 100644 --- a/src/Microsoft.AspNetCore.SignalR/DefaultHubLifetimeManager.cs +++ b/src/Microsoft.AspNetCore.SignalR/DefaultHubLifetimeManager.cs @@ -20,10 +20,15 @@ namespace Microsoft.AspNetCore.SignalR private long _nextInvocationId = 0; private readonly ConnectionList _connections = new ConnectionList(); - public override Task AddGroupAsync(ConnectionContext connection, string groupName) + public override Task AddGroupAsync(string connectionId, string groupName) { - var groups = connection.Metadata.GetOrAdd(HubConnectionMetadataNames.Groups, _ => new HashSet()); + var connection = _connections[connectionId]; + if (connection == null) + { + return Task.CompletedTask; + } + var groups = connection.Metadata.GetOrAdd(HubConnectionMetadataNames.Groups, _ => new HashSet()); lock (groups) { groups.Add(groupName); @@ -32,8 +37,14 @@ namespace Microsoft.AspNetCore.SignalR return Task.CompletedTask; } - public override Task RemoveGroupAsync(ConnectionContext connection, string groupName) + public override Task RemoveGroupAsync(string connectionId, string groupName) { + var connection = _connections[connectionId]; + if (connection == null) + { + return Task.CompletedTask; + } + var groups = connection.Metadata.Get>(HubConnectionMetadataNames.Groups); if (groups == null) diff --git a/src/Microsoft.AspNetCore.SignalR/HubLifetimeManager.cs b/src/Microsoft.AspNetCore.SignalR/HubLifetimeManager.cs index 2e6f34a01d..872ea8901c 100644 --- a/src/Microsoft.AspNetCore.SignalR/HubLifetimeManager.cs +++ b/src/Microsoft.AspNetCore.SignalR/HubLifetimeManager.cs @@ -20,9 +20,9 @@ namespace Microsoft.AspNetCore.SignalR public abstract Task InvokeUserAsync(string userId, string methodName, object[] args); - public abstract Task AddGroupAsync(ConnectionContext connection, string groupName); + public abstract Task AddGroupAsync(string connectionId, string groupName); - public abstract Task RemoveGroupAsync(ConnectionContext connection, string groupName); + public abstract Task RemoveGroupAsync(string connnectionId, string groupName); } } diff --git a/src/Microsoft.AspNetCore.SignalR/IGroupManager.cs b/src/Microsoft.AspNetCore.SignalR/IGroupManager.cs index e95d53cd08..71b22289fd 100644 --- a/src/Microsoft.AspNetCore.SignalR/IGroupManager.cs +++ b/src/Microsoft.AspNetCore.SignalR/IGroupManager.cs @@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.SignalR { public interface IGroupManager { - Task AddAsync(string groupName); - Task RemoveAsync(string groupName); + Task AddAsync(string connectionId, string groupName); + Task RemoveAsync(string connectionId, string groupName); } } diff --git a/src/Microsoft.AspNetCore.SignalR/Proxies.cs b/src/Microsoft.AspNetCore.SignalR/Proxies.cs index f0b8423580..b221e9f5d5 100644 --- a/src/Microsoft.AspNetCore.SignalR/Proxies.cs +++ b/src/Microsoft.AspNetCore.SignalR/Proxies.cs @@ -84,14 +84,14 @@ namespace Microsoft.AspNetCore.SignalR _lifetimeManager = lifetimeManager; } - public Task AddAsync(string groupName) + public Task AddAsync(string connectionId, string groupName) { - return _lifetimeManager.AddGroupAsync(_connection, groupName); + return _lifetimeManager.AddGroupAsync(connectionId, groupName); } - public Task RemoveAsync(string groupName) + public Task RemoveAsync(string connectionId, string groupName) { - return _lifetimeManager.RemoveGroupAsync(_connection, groupName); + return _lifetimeManager.RemoveGroupAsync(connectionId, groupName); } } } diff --git a/test/Microsoft.AspNetCore.SignalR.Tests/HubEndpointTests.cs b/test/Microsoft.AspNetCore.SignalR.Tests/HubEndpointTests.cs index fc4d94c9b5..b51bd2ba47 100644 --- a/test/Microsoft.AspNetCore.SignalR.Tests/HubEndpointTests.cs +++ b/test/Microsoft.AspNetCore.SignalR.Tests/HubEndpointTests.cs @@ -649,7 +649,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests { public Task GroupRemoveMethod(string groupName) { - return Groups.RemoveAsync(groupName); + return Groups.RemoveAsync(Context.ConnectionId, groupName); } public Task ClientSendMethod(string userId, string message) @@ -664,7 +664,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests public Task GroupAddMethod(string groupName) { - return Groups.AddAsync(groupName); + return Groups.AddAsync(Context.ConnectionId, groupName); } public Task GroupSendMethod(string groupName, string message)