Change Group Add and Remove API (#522)

This commit is contained in:
Mikael Mengistu 2017-06-06 21:50:34 -04:00 committed by GitHub
parent 1ae4d3e042
commit 680c48d584
8 changed files with 45 additions and 24 deletions

View File

@ -157,14 +157,14 @@ namespace ChatSample
return _wrappedHubLifetimeManager.InvokeUserAsync(userId, methodName, args); 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);
} }
} }
} }

View File

@ -31,14 +31,14 @@ namespace SocketsSample.Hubs
public async Task JoinGroup(string groupName) 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) 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}"); await Clients.Group(groupName).InvokeAsync("Send", $"{Context.ConnectionId} left {groupName}");
} }

View File

@ -200,17 +200,21 @@ namespace Microsoft.AspNetCore.SignalR.Redis
// in RemoveGroupAsync // in RemoveGroupAsync
foreach (var group in groupNames.ToArray()) foreach (var group in groupNames.ToArray())
{ {
tasks.Add(RemoveGroupAsync(connection, group)); tasks.Add(RemoveGroupAsync(connection.ConnectionId, group));
} }
} }
return Task.WhenAll(tasks); 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 groupChannel = typeof(THub).FullName + ".group." + groupName;
var connection = _connections[connectionId];
if (connection == null)
{
return;
}
var groupNames = connection.Metadata.GetOrAdd(HubConnectionMetadataNames.Groups, _ => new HashSet<string>()); var groupNames = connection.Metadata.GetOrAdd(HubConnectionMetadataNames.Groups, _ => new HashSet<string>());
lock (groupNames) 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; var groupChannel = typeof(THub).FullName + ".group." + groupName;
@ -268,6 +272,12 @@ namespace Microsoft.AspNetCore.SignalR.Redis
return; return;
} }
var connection = _connections[connectionId];
if (connection != null)
{
return;
}
var groupNames = connection.Metadata.Get<HashSet<string>>(HubConnectionMetadataNames.Groups); var groupNames = connection.Metadata.Get<HashSet<string>>(HubConnectionMetadataNames.Groups);
if (groupNames != null) if (groupNames != null)
{ {

View File

@ -20,10 +20,15 @@ namespace Microsoft.AspNetCore.SignalR
private long _nextInvocationId = 0; private long _nextInvocationId = 0;
private readonly ConnectionList _connections = new ConnectionList(); 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<string>()); var connection = _connections[connectionId];
if (connection == null)
{
return Task.CompletedTask;
}
var groups = connection.Metadata.GetOrAdd(HubConnectionMetadataNames.Groups, _ => new HashSet<string>());
lock (groups) lock (groups)
{ {
groups.Add(groupName); groups.Add(groupName);
@ -32,8 +37,14 @@ namespace Microsoft.AspNetCore.SignalR
return Task.CompletedTask; 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<HashSet<string>>(HubConnectionMetadataNames.Groups); var groups = connection.Metadata.Get<HashSet<string>>(HubConnectionMetadataNames.Groups);
if (groups == null) if (groups == null)

View File

@ -20,9 +20,9 @@ namespace Microsoft.AspNetCore.SignalR
public abstract Task InvokeUserAsync(string userId, string methodName, object[] args); 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);
} }
} }

View File

@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.SignalR
{ {
public interface IGroupManager public interface IGroupManager
{ {
Task AddAsync(string groupName); Task AddAsync(string connectionId, string groupName);
Task RemoveAsync(string groupName); Task RemoveAsync(string connectionId, string groupName);
} }
} }

View File

@ -84,14 +84,14 @@ namespace Microsoft.AspNetCore.SignalR
_lifetimeManager = lifetimeManager; _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);
} }
} }
} }

View File

@ -649,7 +649,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
{ {
public Task GroupRemoveMethod(string groupName) public Task GroupRemoveMethod(string groupName)
{ {
return Groups.RemoveAsync(groupName); return Groups.RemoveAsync(Context.ConnectionId, groupName);
} }
public Task ClientSendMethod(string userId, string message) public Task ClientSendMethod(string userId, string message)
@ -664,7 +664,7 @@ namespace Microsoft.AspNetCore.SignalR.Tests
public Task GroupAddMethod(string groupName) public Task GroupAddMethod(string groupName)
{ {
return Groups.AddAsync(groupName); return Groups.AddAsync(Context.ConnectionId, groupName);
} }
public Task GroupSendMethod(string groupName, string message) public Task GroupSendMethod(string groupName, string message)