private Task SubscribeToUser(HubConnectionContext connection)
        {
            if (string.IsNullOrEmpty(connection.UserIdentifier))
            {
                return(Task.CompletedTask);
            }

            var userChannel = _channels.User(connection.UserIdentifier);

            return(_users.AddSubscriptionAsync(userChannel, connection, async(channelName, subscriptions) =>
            {
                var server = _options.ServerResovler.Resolve(_shardingServers, channelName);
                await server.Subscriber.SubscribeAsync(channelName, async(_, data) =>
                {
                    try
                    {
                        var invocation = _protocol.ReadInvocation((byte[])data);
                        var tasks = subscriptions.AsEnumerable().Select(connectionContext =>
                        {
                            var task = connectionContext.WriteAsync(invocation.Message);
                            return task.AsTask();
                        });

                        await Task.WhenAll(tasks);
                    }
                    catch (Exception ex)
                    {
                        RedisLog.FailedWritingMessage(_logger, ex);
                    }
                });
            }));
        }
        private async Task AddGroupAsyncCore(HubConnectionContext connection, string groupName)
        {
            var feature    = connection.Features.Get <IRedisFeature>();
            var groupNames = feature.Groups;

            lock (groupNames)
            {
                // Connection already in group
                if (!groupNames.Add(groupName))
                {
                    return;
                }
            }

            var channel = _channels.Group(groupName);
            await _groups.AddSubscriptionAsync(channel, connection, SubscribeToGroupAsync);
        }
Beispiel #3
0
        private Task AddGroupAsyncCore(HubConnectionContext connection, string groupName)
        {
            var feature    = connection.Features.Get <IRedisFeature>() !;
            var groupNames = feature.Groups;

            lock (groupNames)
            {
                // Connection already in group
                if (!groupNames.Add(groupName))
                {
                    return(Task.CompletedTask);
                }
            }

            var groupChannel = _channels.Group(groupName);

            return(_groups.AddSubscriptionAsync(groupChannel, connection, SubscribeToGroupAsync));
        }