Emit new 'subscription' events
This commit is contained in:
+10
-8
@@ -158,7 +158,7 @@ public:
|
||||
}
|
||||
|
||||
/* Subscribe fails if we already are subscribed */
|
||||
bool subscribe(Subscriber *s, std::string_view topic) {
|
||||
Topic *subscribe(Subscriber *s, std::string_view topic) {
|
||||
/* Notify user that they are doing something wrong here */
|
||||
checkIteratingSubscriber(s);
|
||||
|
||||
@@ -173,16 +173,16 @@ public:
|
||||
/* Insert us in topic, insert topic in us */
|
||||
auto [it, inserted] = s->topics.insert(topicPtr);
|
||||
if (!inserted) {
|
||||
return false;
|
||||
return nullptr;
|
||||
}
|
||||
topicPtr->insert(s);
|
||||
|
||||
/* Success */
|
||||
return true;
|
||||
return topicPtr;
|
||||
}
|
||||
|
||||
/* Returns ok, last */
|
||||
std::pair<bool, bool> unsubscribe(Subscriber *s, std::string_view topic) {
|
||||
/* Returns ok, last, newCount */
|
||||
std::tuple<bool, bool, int> unsubscribe(Subscriber *s, std::string_view topic) {
|
||||
/* Notify user that they are doing something wrong here */
|
||||
checkIteratingSubscriber(s);
|
||||
|
||||
@@ -190,17 +190,19 @@ public:
|
||||
Topic *topicPtr = lookupTopic(topic);
|
||||
if (!topicPtr) {
|
||||
/* If the topic doesn't exist we are assumed to still be subscribers of something */
|
||||
return {false, false};
|
||||
return {false, false, -1};
|
||||
}
|
||||
|
||||
/* Erase from our list first */
|
||||
if (s->topics.erase(topicPtr) == 0) {
|
||||
return {false, false};
|
||||
return {false, false, -1};
|
||||
}
|
||||
|
||||
/* Remove us from topic */
|
||||
topicPtr->erase(s);
|
||||
|
||||
int newCount = topicPtr->size();
|
||||
|
||||
/* If there is no subscriber to this topic, remove it */
|
||||
if (!topicPtr->size()) {
|
||||
/* Unique_ptr deletes the topic */
|
||||
@@ -208,7 +210,7 @@ public:
|
||||
}
|
||||
|
||||
/* If we don't hold any topics we are to be freed altogether */
|
||||
return {true, topics.size() == 0};
|
||||
return {true, s->topics.size() == 0, newCount};
|
||||
}
|
||||
|
||||
/* Factory function for creating a Subscriber */
|
||||
|
||||
+17
-2
@@ -195,6 +195,13 @@ public:
|
||||
/* Set shorter timeout (use ping-timeout) to avoid long hanging sockets after end() on broken connections */
|
||||
Super::timeout(webSocketContextData->idleTimeoutComponents.second);
|
||||
|
||||
/* At this point we iterate all currently held subscriptions and emit an event for all of them */
|
||||
if (webSocketContextData->subscriptionHandler) {
|
||||
for (Topic *t : webSocketData->subscriber->topics) {
|
||||
webSocketContextData->subscriptionHandler(this, t->name, (int) t->size() - 1, (int) t->size());
|
||||
}
|
||||
}
|
||||
|
||||
/* Make sure to unsubscribe from any pub/sub node at exit */
|
||||
webSocketContextData->topicTree->freeSubscriber(webSocketData->subscriber);
|
||||
webSocketData->subscriber = nullptr;
|
||||
@@ -234,7 +241,11 @@ public:
|
||||
}
|
||||
|
||||
/* Cannot return numSubscribers as this is only for this particular websocket context */
|
||||
webSocketContextData->topicTree->subscribe(webSocketData->subscriber, topic);
|
||||
Topic *topicOrNull = webSocketContextData->topicTree->subscribe(webSocketData->subscriber, topic);
|
||||
if (topicOrNull && webSocketContextData->subscriptionHandler) {
|
||||
/* Emit this socket, the topic, new count, old count */
|
||||
webSocketContextData->subscriptionHandler(this, topic, (int) topicOrNull->size(), (int) topicOrNull->size() - 1);
|
||||
}
|
||||
|
||||
/* Subscribe always succeeds */
|
||||
return true;
|
||||
@@ -251,7 +262,11 @@ public:
|
||||
if (!webSocketData->subscriber) { return false; }
|
||||
|
||||
/* Cannot return numSubscribers as this is only for this particular websocket context */
|
||||
auto [ok, last] = webSocketContextData->topicTree->unsubscribe(webSocketData->subscriber, topic);
|
||||
auto [ok, last, newCount] = webSocketContextData->topicTree->unsubscribe(webSocketData->subscriber, topic);
|
||||
/* Emit subscription event if last */
|
||||
if (ok && webSocketContextData->subscriptionHandler) {
|
||||
webSocketContextData->subscriptionHandler(this, topic, newCount, newCount + 1);
|
||||
}
|
||||
|
||||
/* Free us as subscribers if we unsubscribed from our last topic */
|
||||
if (ok && last) {
|
||||
|
||||
Reference in New Issue
Block a user