public override Task OnConnectedAsync(HubConnectionContext connection)
        {
            var feature = new RedisFeature();

            connection.Features.Set <IRedisFeature>(feature);

            var redisSubscriptions = feature.Subscriptions;
            var connectionTask     = Task.CompletedTask;
            var userTask           = Task.CompletedTask;

            _connections.Add(connection);

            var connectionChannel = _channelNamePrefix + "." + connection.ConnectionId;

            redisSubscriptions.Add(connectionChannel);

            var previousConnectionTask = Task.CompletedTask;

            _logger.LogInformation("Subscribing to connection channel: {channel}", connectionChannel);
            connectionTask = _bus.SubscribeAsync(connectionChannel, async(c, data) =>
            {
                await previousConnectionTask;

                var message = DeserializeMessage <HubMessage>(data);

                previousConnectionTask = WriteAsync(connection, message);
            });

            if (connection.User.Identity.IsAuthenticated)
            {
                var userChannel = _channelNamePrefix + ".user." + connection.User.Identity.Name;
                redisSubscriptions.Add(userChannel);

                var previousUserTask = Task.CompletedTask;

                // TODO: Look at optimizing (looping over connections checking for Name)
                userTask = _bus.SubscribeAsync(userChannel, async(c, data) =>
                {
                    await previousUserTask;

                    var message = DeserializeMessage <HubMessage>(data);

                    previousUserTask = WriteAsync(connection, message);
                });
            }

            return(Task.WhenAll(connectionTask, userTask));
        }
        public override Task OnConnectedAsync(HubConnectionContext connection)
        {
            var feature = new RedisFeature();

            connection.Features.Set <IRedisFeature>(feature);

            var redisSubscriptions = feature.Subscriptions;
            var connectionTask     = Task.CompletedTask;
            var userTask           = Task.CompletedTask;

            _connections.Add(connection);

            connectionTask = SubscribeToConnection(connection, redisSubscriptions);

            if (!string.IsNullOrEmpty(connection.UserIdentifier))
            {
                userTask = SubscribeToUser(connection, redisSubscriptions);
            }

            return(Task.WhenAll(connectionTask, userTask));
        }
    /// <inheritdoc />
    public override async Task OnConnectedAsync(HubConnectionContext connection)
    {
        await EnsureRedisServerConnection();

        var feature = new RedisFeature();

        connection.Features.Set <IRedisFeature>(feature);

        var userTask = Task.CompletedTask;

        _connections.Add(connection);

        var connectionTask = SubscribeToConnection(connection);

        if (!string.IsNullOrEmpty(connection.UserIdentifier))
        {
            userTask = SubscribeToUser(connection);
        }

        await Task.WhenAll(connectionTask, userTask);
    }