/// <inheritdoc/>
        public Task Unsubscribe <T>(BusEvent <T> eventMessage) where T : class
        {
            if (eventMessage == null)
            {
                throw new ArgumentNullException(nameof(eventMessage));
            }

            var @event = (eventMessage is PlatformEvent <T>) ?
                         eventMessage as PlatformEvent <T> :
                         throw new ArgumentException($"{nameof(eventMessage)} must be type of {nameof(PlatformEvent<T>)}");

            if (!typeof(IMessageListener).IsAssignableFrom(typeof(T)))
            {
                throw new InvalidOperationException("Type parameter must be an IMessageListener");
            }

            var eventName = eventMessage.Name;

            if (string.IsNullOrWhiteSpace(eventName))
            {
                throw new ArgumentException($"EventName of {nameof(eventMessage)} cannot be empty");
            }

            var key = new SubscriptionInfo(eventName, @event.ReplayId, typeof(T));

            if (!_subscriptions.ContainsKey(key))
            {
                return(Task.CompletedTask);
            }

            // build channel segment
            var topicName = GetEventOrTopicName(eventMessage.Name);

            var handler = _subscriptions[key];

            _streamingClient.UnsubscribeTopic(topicName, handler as IMessageListener, @event.ReplayId);

            _subscriptions.TryRemove(key, out var val);

            return(Task.CompletedTask);
        }