using Microsoft.Extensions.Logging; using NLog; using StackExchange.Redis; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EgwCoreLib.Lux.Data.Services { public class RedisSubscriptionManager { #region Public Constructors public RedisSubscriptionManager(IConnectionMultiplexer connection) { _subscriber = connection.GetSubscriber(); } #endregion Public Constructors #region Public Methods public IEnumerable GetActiveChannels() => _subscriptions.Keys; public bool Subscribe(string channel, Action handler) { if (_subscriptions.ContainsKey(channel)) return false; RedisChannel rChannel = new RedisChannel(channel, RedisChannel.PatternMode.Literal); var task = _subscriber.SubscribeAsync(rChannel, handler); _subscriptions[channel] = new ChannelSubscription(channel, handler); Log.Info($"✅ Subscribed to channel: {channel}"); return true; } public bool Unsubscribe(string channel) { if (!_subscriptions.TryRemove(channel, out var sub)) return false; RedisChannel rChannel = new RedisChannel(channel, RedisChannel.PatternMode.Literal); _subscriber.Unsubscribe(rChannel, sub.Handler); Log.Info($"❌ Unsubscribed from channel: {channel}"); return true; } #endregion Public Methods #region Private Fields private static Logger Log = LogManager.GetCurrentClassLogger(); private readonly ISubscriber _subscriber; private readonly ConcurrentDictionary _subscriptions = new(); #endregion Private Fields } public record ChannelSubscription(string Channel, Action Handler); }