using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Gameboard.ShogiUI.Sockets.Managers { public interface ISocketTokenManager { Guid GenerateToken(string s); string GetUsername(Guid g); } public class SocketTokenManager : ISocketTokenManager { /// /// Key is userName or webSessionId /// private readonly ConcurrentDictionary Tokens; public SocketTokenManager() { Tokens = new ConcurrentDictionary(); } public Guid GenerateToken(string userName) { Tokens.Remove(userName, out _); var guid = Guid.NewGuid(); Tokens.TryAdd(userName, guid); _ = Task.Run(async () => { await Task.Delay(TimeSpan.FromMinutes(1)); Tokens.Remove(userName, out _); }); return guid; } /// User name associated to the guid or null. public string GetUsername(Guid guid) { var userName = Tokens.FirstOrDefault(kvp => kvp.Value == guid).Key; if (userName != null) { Tokens.Remove(userName, out _); } return userName; } } }