Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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);
        }