public async Task ManageAsync(WebSocket socket, IHub hub) { var typeOfHub = hub.GetType(); var connectionId = Guid.NewGuid().ToString(); lock (ConnectionsByHub) { if (!ConnectionsByHub.TryGetValue(hub.GetType(), out var connectionsByHub)) { connectionsByHub = new ConcurrentDictionary <string, WebSocket>(); ConnectionsByHub[typeOfHub] = connectionsByHub; } connectionsByHub[connectionId] = socket; } Connections[connectionId] = Tuple.Create(typeOfHub, socket); var buffer = ArrayPool <byte> .Shared.Rent(1024); try { var establishConnectionAsync = typeof(RinChannel).GetMethod(nameof(EstablishConnectionAsync), BindingFlags.Instance | BindingFlags.NonPublic); var task = establishConnectionAsync.MakeGenericMethod(typeOfHub).Invoke(this, new object[] { socket, hub, connectionId, buffer }) as Task; await task; } catch (TaskCanceledException) { } catch (WebSocketException) { } finally { ArrayPool <byte> .Shared.Return(buffer); } }
private Task SendAsync <THub>(object payload) { if (ConnectionsByHub.TryGetValue(typeof(THub), out var connectionsByTHub)) { return(Task.WhenAll(connectionsByTHub.Select(x => SendAsync(x.Key, payload)))); } return(Task.CompletedTask); }