public async Task <MqttUnsubAckPacket> UnsubscribeAsync(MqttUnsubscribePacket unsubscribePacket) { if (unsubscribePacket == null) { throw new ArgumentNullException(nameof(unsubscribePacket)); } var unsubAckPacket = new MqttUnsubAckPacket { PacketIdentifier = unsubscribePacket.PacketIdentifier }; lock (_subscriptions) { foreach (var topicFilter in unsubscribePacket.TopicFilters) { if (_subscriptions.Remove(topicFilter)) { unsubAckPacket.ReasonCodes.Add(MqttUnsubscribeReasonCode.Success); } else { unsubAckPacket.ReasonCodes.Add(MqttUnsubscribeReasonCode.NoSubscriptionExisted); } } } foreach (var topicFilter in unsubscribePacket.TopicFilters) { await _eventDispatcher.HandleClientUnsubscribedTopicAsync(_clientId, topicFilter).ConfigureAwait(false); } return(unsubAckPacket); }
public async Task <MqttUnsubAckPacket> UnsubscribeAsync(MqttUnsubscribePacket unsubscribePacket) { if (unsubscribePacket == null) { throw new ArgumentNullException(nameof(unsubscribePacket)); } var unsubAckPacket = new MqttUnsubAckPacket { PacketIdentifier = unsubscribePacket.PacketIdentifier }; foreach (var topicFilter in unsubscribePacket.TopicFilters) { var interceptorContext = await InterceptUnsubscribeAsync(topicFilter).ConfigureAwait(false); if (!interceptorContext.AcceptUnsubscription) { unsubAckPacket.ReasonCodes.Add(MqttUnsubscribeReasonCode.ImplementationSpecificError); continue; } lock (_subscriptions) { if (_subscriptions.Remove(topicFilter)) { unsubAckPacket.ReasonCodes.Add(MqttUnsubscribeReasonCode.Success); } else { unsubAckPacket.ReasonCodes.Add(MqttUnsubscribeReasonCode.NoSubscriptionExisted); } } } foreach (var topicFilter in unsubscribePacket.TopicFilters) { await _eventDispatcher.HandleClientUnsubscribedTopicAsync(_clientSession.ClientId, topicFilter).ConfigureAwait(false); } return(unsubAckPacket); }