| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- using System;
- using System.Collections.Concurrent;
- using System.Collections.Generic;
- using System.Collections.Immutable;
- using System.Linq;
- using Abp.Collections.Extensions;
- using Abp.Dependency;
- using Abp.Extensions;
- using JetBrains.Annotations;
- namespace Abp.RealTime
- {
- public class OnlineClientManager<T> : OnlineClientManager, IOnlineClientManager<T>
- {
- }
- /// <summary>
- /// Implements <see cref="IOnlineClientManager"/>.
- /// </summary>
- public class OnlineClientManager : IOnlineClientManager, ISingletonDependency
- {
- public event EventHandler<OnlineClientEventArgs> ClientConnected;
- public event EventHandler<OnlineClientEventArgs> ClientDisconnected;
- public event EventHandler<OnlineUserEventArgs> UserConnected;
- public event EventHandler<OnlineUserEventArgs> UserDisconnected;
- /// <summary>
- /// Online clients.
- /// </summary>
- protected ConcurrentDictionary<string, IOnlineClient> Clients { get; }
- protected readonly object SyncObj = new object();
- /// <summary>
- /// Initializes a new instance of the <see cref="OnlineClientManager"/> class.
- /// </summary>
- public OnlineClientManager()
- {
- Clients = new ConcurrentDictionary<string, IOnlineClient>();
- }
- public virtual void Add(IOnlineClient client)
- {
- lock (SyncObj)
- {
- var userWasAlreadyOnline = false;
- var user = client.ToUserIdentifierOrNull();
- if (user != null)
- {
- userWasAlreadyOnline = this.IsOnline(user);
- }
- Clients[client.ConnectionId] = client;
- ClientConnected.InvokeSafely(this, new OnlineClientEventArgs(client));
- if (user != null && !userWasAlreadyOnline)
- {
- UserConnected.InvokeSafely(this, new OnlineUserEventArgs(user, client));
- }
- }
- }
- public virtual bool Remove(string connectionId)
- {
- lock (SyncObj)
- {
- IOnlineClient client;
- var isRemoved = Clients.TryRemove(connectionId, out client);
- if (isRemoved)
- {
- var user = client.ToUserIdentifierOrNull();
- if (user != null && !this.IsOnline(user))
- {
- UserDisconnected.InvokeSafely(this, new OnlineUserEventArgs(user, client));
- }
- ClientDisconnected.InvokeSafely(this, new OnlineClientEventArgs(client));
- }
- return isRemoved;
- }
- }
- public virtual IOnlineClient GetByConnectionIdOrNull(string connectionId)
- {
- lock (SyncObj)
- {
- return Clients.GetOrDefault(connectionId);
- }
- }
-
- public virtual IReadOnlyList<IOnlineClient> GetAllClients()
- {
- lock (SyncObj)
- {
- return Clients.Values.ToImmutableList();
- }
- }
- [NotNull]
- public virtual IReadOnlyList<IOnlineClient> GetAllByUserId([NotNull] IUserIdentifier user)
- {
- Check.NotNull(user, nameof(user));
- return GetAllClients()
- .Where(c => (c.UserId == user.UserId && c.TenantId == user.TenantId))
- .ToImmutableList();
- }
- }
- }
|