using KLHZ.Trader.Core.Contracts.Messaging.Dtos.Interfaces; using KLHZ.Trader.Core.Contracts.Messaging.Interfaces; using System.Collections.Concurrent; using System.Threading.Channels; namespace KLHZ.Trader.Core.Common.Messaging.Services { public class DataBus : IDataBus { private readonly ConcurrentDictionary> _orderbooksChannels = new(); private readonly ConcurrentDictionary> _messagesChannels = new(); private readonly ConcurrentDictionary> _commandsChannel = new(); private readonly ConcurrentDictionary> _priceChannels = new(); public bool AddChannel(string key, Channel channel) { return _messagesChannels.TryAdd(key, channel); } public bool AddChannel(string key, Channel channel) { return _commandsChannel.TryAdd(key, channel); } public bool AddChannel(string key, Channel channel) { return _priceChannels.TryAdd(key, channel); } public bool AddChannel(string key, Channel channel) { return _orderbooksChannels.TryAdd(key, channel); } public async Task Broadcast(ITradeDataItem newPriceMessage) { foreach (var channel in _priceChannels.Values) { await channel.Writer.WriteAsync(newPriceMessage); } } public async Task Broadcast(ITradeCommand command) { foreach (var channel in _commandsChannel.Values) { await channel.Writer.WriteAsync(command); } } public async Task Broadcast(IOrderbook orderbook) { foreach (var channel in _orderbooksChannels.Values) { await channel.Writer.WriteAsync(orderbook); } } public async Task Broadcast(IMessage message) { foreach (var channel in _messagesChannels.Values) { await channel.Writer.WriteAsync(message); } } } }