diff --git a/samples/ChatSample/Hubs/Chat.cs b/samples/ChatSample/Hubs/Chat.cs index e2c23218f7..4525d92b62 100644 --- a/samples/ChatSample/Hubs/Chat.cs +++ b/samples/ChatSample/Hubs/Chat.cs @@ -28,7 +28,12 @@ namespace ChatSample.Hubs public override Task OnUserJoined(UserDetails user) { - return Clients.Client(Context.ConnectionId).InvokeAsync("UserJoined", user); + if (user.ConnectionId != Context.ConnectionId) + { + return Clients.Client(Context.ConnectionId).InvokeAsync("UserJoined", user); + } + + return Task.CompletedTask; } public override Task OnUserLeft(UserDetails user) diff --git a/samples/ChatSample/PresenceHubLifetimeManager.cs b/samples/ChatSample/PresenceHubLifetimeManager.cs index 9d551e4566..ddb7bb210b 100644 --- a/samples/ChatSample/PresenceHubLifetimeManager.cs +++ b/samples/ChatSample/PresenceHubLifetimeManager.cs @@ -8,7 +8,18 @@ using Microsoft.Extensions.Logging; namespace ChatSample { - public class PresenceHubLifetimeManager : DefaultHubLifetimeManager, IDisposable + public class DefaultPresenceHublifetimeMenager : PresenceHubLifetimeManager> + where THub : HubWithPresence + { + public DefaultPresenceHublifetimeMenager(IUserTracker userTracker, IServiceScopeFactory serviceScopeFactory, + ILoggerFactory loggerFactory, IServiceProvider serviceProvider) + : base(userTracker, serviceScopeFactory, loggerFactory, serviceProvider) + { + } + } + + public class PresenceHubLifetimeManager : HubLifetimeManager, IDisposable + where THubLifetimeManager : HubLifetimeManager where THub : HubWithPresence { private readonly ConnectionList _connections = new ConnectionList(); @@ -16,11 +27,11 @@ namespace ChatSample private readonly IServiceScopeFactory _serviceScopeFactory; private readonly ILogger _logger; private readonly IServiceProvider _serviceProvider; + private readonly HubLifetimeManager _wrappedHubLifetimeManager; private IHubContext _hubContext; - public PresenceHubLifetimeManager(InvocationAdapterRegistry registry, IUserTracker userTracker, - IServiceScopeFactory serviceScopeFactory, ILoggerFactory loggerFactory, IServiceProvider serviceProvider) - : base(registry) + public PresenceHubLifetimeManager(IUserTracker userTracker, IServiceScopeFactory serviceScopeFactory, + ILoggerFactory loggerFactory, IServiceProvider serviceProvider) { _userTracker = userTracker; _userTracker.UserJoined += OnUserJoined; @@ -28,19 +39,20 @@ namespace ChatSample _serviceScopeFactory = serviceScopeFactory; _serviceProvider = serviceProvider; - _logger = loggerFactory.CreateLogger>(); + _logger = loggerFactory.CreateLogger>(); + _wrappedHubLifetimeManager = serviceProvider.GetRequiredService(); } public override async Task OnConnectedAsync(Connection connection) { - await base.OnConnectedAsync(connection); + await _wrappedHubLifetimeManager.OnConnectedAsync(connection); _connections.Add(connection); await _userTracker.AddUser(connection, new UserDetails(connection.ConnectionId, connection.User.Identity.Name)); } public override async Task OnDisconnectedAsync(Connection connection) { - await base.OnDisconnectedAsync(connection); + await _wrappedHubLifetimeManager.OnDisconnectedAsync(connection); _connections.Remove(connection); await _userTracker.RemoveUser(connection); } @@ -95,5 +107,35 @@ namespace ChatSample _userTracker.UserJoined -= OnUserJoined; _userTracker.UserLeft -= OnUserLeft; } + + public override Task InvokeAllAsync(string methodName, object[] args) + { + return _wrappedHubLifetimeManager.InvokeAllAsync(methodName, args); + } + + public override Task InvokeConnectionAsync(string connectionId, string methodName, object[] args) + { + return _wrappedHubLifetimeManager.InvokeConnectionAsync(connectionId, methodName, args); + } + + public override Task InvokeGroupAsync(string groupName, string methodName, object[] args) + { + return _wrappedHubLifetimeManager.InvokeGroupAsync(groupName, methodName, args); + } + + public override Task InvokeUserAsync(string userId, string methodName, object[] args) + { + return _wrappedHubLifetimeManager.InvokeUserAsync(userId, methodName, args); + } + + public override Task AddGroupAsync(Connection connection, string groupName) + { + return _wrappedHubLifetimeManager.AddGroupAsync(connection, groupName); + } + + public override Task RemoveGroupAsync(Connection connection, string groupName) + { + return _wrappedHubLifetimeManager.RemoveGroupAsync(connection, groupName); + } } } diff --git a/samples/ChatSample/Startup.cs b/samples/ChatSample/Startup.cs index d2a02b8f0b..50fd036c1e 100644 --- a/samples/ChatSample/Startup.cs +++ b/samples/ChatSample/Startup.cs @@ -60,7 +60,8 @@ namespace ChatSample ; services.AddAuthentication(); - services.AddSingleton(typeof(HubLifetimeManager<>), typeof(PresenceHubLifetimeManager<>)); + services.AddSingleton(typeof(DefaultHubLifetimeManager<>), typeof(DefaultHubLifetimeManager<>)); + services.AddSingleton(typeof(HubLifetimeManager<>), typeof(DefaultPresenceHublifetimeMenager<>)); services.AddSingleton(typeof(IUserTracker<>), typeof(InMemoryUserTracker<>)); }