using System; using System.Collections.Generic; using System.IO.Pipelines; using System.Threading.Tasks; using Microsoft.AspNetCore.Sockets; namespace SocialWeather { public class PersistentConnectionLifeTimeManager { private readonly FormatterResolver _formatterResolver; private readonly ConnectionList _connectionList = new ConnectionList(); public PersistentConnectionLifeTimeManager(FormatterResolver formatterResolver) { _formatterResolver = formatterResolver; } public void OnConnectedAsync(Connection connection) { _connectionList.Add(connection); } public void OnDisconnectedAsync(Connection connection) { _connectionList.Remove(connection); } public async Task SendToAllAsync(T data) { foreach (var connection in _connectionList) { var formatter = _formatterResolver.GetFormatter(connection.Metadata.Get("formatType")); await formatter.WriteAsync(data, connection.Channel.GetStream()); } } public Task InvokeConnectionAsync(string connectionId, object data) { throw new NotImplementedException(); } public Task InvokeGroupAsync(string groupName, object data) { throw new NotImplementedException(); } public Task InvokeUserAsync(string userId, object data) { throw new NotImplementedException(); } public void AddGroupAsync(Connection connection, string groupName) { var groups = connection.Metadata.GetOrAdd("groups", _ => new HashSet()); lock (groups) { groups.Add(groupName); } } public void RemoveGroupAsync(Connection connection, string groupName) { var groups = connection.Metadata.Get>("groups"); if (groups != null) { lock (groups) { groups.Remove(groupName); } } } } }