diff --git a/src/TopicTree.h b/src/TopicTree.h index 44cb4fb..92bae98 100644 --- a/src/TopicTree.h +++ b/src/TopicTree.h @@ -278,7 +278,7 @@ public: return emptyVector; } - void subscribe(std::string_view topic, Subscriber *subscriber) { + void subscribe(std::string_view topic, Subscriber *subscriber, bool nonStrict = false) { /* Start iterating from the root */ Topic *iterator = root; @@ -322,7 +322,9 @@ public: /* If this topic is triggered, drain the tree before we join */ if (iterator->triggered) { - drain(); + if (!nonStrict) { + drain(); + } } /* Add socket to Topic's Set */ @@ -346,7 +348,7 @@ public: } /* Returns whether we were subscribed prior */ - bool unsubscribe(std::string_view topic, Subscriber *subscriber) { + bool unsubscribe(std::string_view topic, Subscriber *subscriber, bool nonStrict = false) { /* Subscribers are likely to have very few subscriptions (20 or fewer) */ if (subscriber) { /* Lookup exact Topic ptr from string */ @@ -369,7 +371,9 @@ public: if (*it == iterator) { /* If this topic is triggered, drain the tree before we leave */ if (iterator->triggered) { - drain(); + if (!nonStrict) { + drain(); + } } /* Remove topic ptr from our list */ @@ -394,6 +398,7 @@ public: /* If this topic is triggered, drain the tree before we leave */ if (mayFlush && topic->triggered) { + /* Never mind nonStrict here (yet?) */ drain(); } diff --git a/src/WebSocket.h b/src/WebSocket.h index 3bf6f13..4d87508 100644 --- a/src/WebSocket.h +++ b/src/WebSocket.h @@ -191,7 +191,7 @@ public: } /* Subscribe to a topic according to MQTT rules and syntax */ - void subscribe(std::string_view topic) { + void subscribe(std::string_view topic, bool nonStrict = false) { WebSocketContextData *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, (us_socket_context_t *) us_socket_context(SSL, (us_socket_t *) this) ); @@ -202,18 +202,18 @@ public: webSocketData->subscriber = new Subscriber(this); } - webSocketContextData->topicTree.subscribe(topic, webSocketData->subscriber); + webSocketContextData->topicTree.subscribe(topic, webSocketData->subscriber, nonStrict); } /* Unsubscribe from a topic, returns true if we were subscribed */ - bool unsubscribe(std::string_view topic) { + bool unsubscribe(std::string_view topic, bool nonStrict = false) { WebSocketContextData *webSocketContextData = (WebSocketContextData *) us_socket_context_ext(SSL, (us_socket_context_t *) us_socket_context(SSL, (us_socket_t *) this) ); WebSocketData *webSocketData = (WebSocketData *) us_socket_ext(SSL, (us_socket_t *) this); - return webSocketContextData->topicTree.unsubscribe(topic, webSocketData->subscriber); + return webSocketContextData->topicTree.unsubscribe(topic, webSocketData->subscriber, nonStrict); } /* Unsubscribe from all topics you might be subscribed to */