Ejemplo n.º 1
0
        public async Task Handle(EquipmentErrorNotification notification, CancellationToken cancellationToken)
        {
            var(participant, connectionId, error) = notification;

            var dto = new EquipmentErrorDto(connectionId, error);

            var group = _hubContext.Clients.Group(CoreHubGroups.OfParticipant(participant));
            await group.EquipmentError(dto, cancellationToken);
        }
        public async Task <Unit> Handle(EnableParticipantMessagingRequest request, CancellationToken cancellationToken)
        {
            var(participant, connectionId) = request;

            await _hubContext.Groups.AddToGroupAsync(connectionId, CoreHubGroups.OfParticipant(participant),
                                                     cancellationToken);

            await _hubContext.Groups.AddToGroupAsync(connectionId, CoreHubGroups.OfConference(participant.ConferenceId),
                                                     CancellationToken.None);

            _logger.LogDebug("Added participant {participant} with connection {connectionId}", request.Participant,
                             request.ConnectionId);

            return(Unit.Value);
        }
Ejemplo n.º 3
0
        private async Task RemoveParticipant(Participant participant, string?connectionId,
                                             CancellationToken cancellationToken)
        {
            _logger.LogDebug("RemoveParticipant() | {participant}, connectionId:{connectionId}", participant,
                             connectionId);

            if (connectionId == null)
            {
                if (!_connections.TryGetParticipant(participant.Id, out var connection))
                {
                    return;
                }

                connectionId = connection.ConnectionId;
            }

            if (_connections.TryRemoveParticipant(participant.Id,
                                                  new ParticipantConnection(participant.ConferenceId, connectionId)))
            {
                _logger.LogDebug("Remove participant connection");

                await _hubContext.Groups.RemoveFromGroupAsync(connectionId, CoreHubGroups.OfParticipant(participant),
                                                              cancellationToken);

                await _hubContext.Groups.RemoveFromGroupAsync(connectionId,
                                                              CoreHubGroups.OfConference(participant.ConferenceId), cancellationToken);

                if (await _repository.IsParticipantJoined(participant, connectionId))
                {
                    await using var @lock = await _repository.LockParticipantJoin(participant);

                    if (await _repository.IsParticipantJoined(participant, connectionId))
                    {
                        await _mediator.Publish(new ParticipantLeftNotification(participant, connectionId),
                                                @lock.HandleLostToken);
                    }
                }
                else
                {
                    _logger.LogDebug("Participant is not joined");
                }
            }
            else
            {
                _logger.LogDebug("Participant connection was already removed");
            }
        }
Ejemplo n.º 4
0
        public async Task Handle(ParticipantKickedNotification notification, CancellationToken cancellationToken)
        {
            var(participant, connectionId, reason) = notification;

            var targetClient = connectionId != null
                ? _hubContext.Clients.Client(connectionId)
                : _hubContext.Clients.Group(CoreHubGroups.OfParticipant(participant));

            await targetClient.OnRequestDisconnect(new RequestDisconnectDto(reason), cancellationToken);

            if (connectionId != null)
            {
                // it's very important that we publish participant left, as a new participant may be joining right after this and
                // we have to clean up first
                await using (var @lock = await _repository.LockParticipantJoin(participant))
                {
                    await _mediator.Publish(new ParticipantLeftNotification(participant, connectionId),
                                            @lock.HandleLostToken);
                }
            }

            await _publishEndpoint.Publish <ParticipantKicked>(notification, cancellationToken);
        }