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.SafeNotifyClientUnsubscribedTopicAsync(_clientSession.ClientId, topicFilter).ConfigureAwait(false); } return(unsubAckPacket); }
public async Task <List <MqttUnsubscribeReasonCode> > UnsubscribeAsync(MqttUnsubscribePacket unsubscribePacket) { if (unsubscribePacket == null) { throw new ArgumentNullException(nameof(unsubscribePacket)); } var reasonCodes = new List <MqttUnsubscribeReasonCode>(); foreach (var topicFilter in unsubscribePacket.TopicFilters) { var interceptorContext = await InterceptUnsubscribeAsync(topicFilter).ConfigureAwait(false); if (!interceptorContext.AcceptUnsubscription) { reasonCodes.Add(MqttUnsubscribeReasonCode.ImplementationSpecificError); continue; } _subscriptionsLock.EnterWriteLock(); try { reasonCodes.Add(_subscriptions.Remove(topicFilter) ? MqttUnsubscribeReasonCode.Success : MqttUnsubscribeReasonCode.NoSubscriptionExisted); } finally { _subscriptionsLock.ExitWriteLock(); } } foreach (var topicFilter in unsubscribePacket.TopicFilters) { await _eventDispatcher.SafeNotifyClientUnsubscribedTopicAsync(_clientSession.ClientId, topicFilter).ConfigureAwait(false); } return(reasonCodes); }