diff options
-rw-r--r-- | include/nostr.hpp | 8 | ||||
-rw-r--r-- | src/nostr_service.cpp | 43 |
2 files changed, 51 insertions, 0 deletions
diff --git a/include/nostr.hpp b/include/nostr.hpp index c410046..8a9d4c9 100644 --- a/include/nostr.hpp +++ b/include/nostr.hpp @@ -161,6 +161,14 @@ public: std::tuple<RelayList, RelayList> closeSubscription(std::string subscriptionId); /** + * @brief Closes all open subscriptions on all open relay connections. + * @returns A tuple of `RelayList` objects, of the form `<successes, failures>`, indicating + * to which relays the message was sent successfully, and which relays failed to receive the + * message. + */ + std::tuple<RelayList, RelayList> closeSubscriptions(); + + /** * @brief Closes all open subscriptions on the given relays. * @returns A tuple of `RelayList` objects, of the form `<successes, failures>`, indicating * to which relays the message was sent successfully, and which relays failed to receive the diff --git a/src/nostr_service.cpp b/src/nostr_service.cpp index e3b1f19..3ac5177 100644 --- a/src/nostr_service.cpp +++ b/src/nostr_service.cpp @@ -225,6 +225,49 @@ tuple<RelayList, RelayList> NostrService::closeSubscription(string subscriptionI return make_tuple(successfulRelays, failedRelays); }; +tuple<RelayList, RelayList> NostrService::closeSubscriptions() +{ + return this->closeSubscriptions(this->_activeRelays); +}; + +tuple<RelayList, RelayList> NostrService::closeSubscriptions(RelayList relays) +{ + RelayList successfulRelays; + RelayList failedRelays; + + vector<future<tuple<RelayList, RelayList>>> closeFutures; + for (const string relay : relays) + { + future<tuple<RelayList, RelayList>> closeFuture = async([this, &relay]() { + RelayList successfulRelays; + RelayList failedRelays; + + for (const string& subscriptionId : this->_subscriptions[relay]) + { + auto [successes, failures] = this->closeSubscription(subscriptionId); + successfulRelays.insert(successfulRelays.end(), successes.begin(), successes.end()); + failedRelays.insert(failedRelays.end(), failures.begin(), failures.end()); + } + + return make_tuple(successfulRelays, failedRelays); + }); + closeFutures.push_back(move(closeFuture)); + } + + for (auto& closeFuture : closeFutures) + { + auto [successes, failures] = closeFuture.get(); + successfulRelays.insert(successfulRelays.end(), successes.begin(), successes.end()); + failedRelays.insert(failedRelays.end(), failures.begin(), failures.end()); + } + + size_t targetCount = relays.size(); + size_t successfulCount = successfulRelays.size(); + PLOG_INFO << "Sent close requests to " << successfulCount << "/" << targetCount << " open relay connections."; + + return make_tuple(successfulRelays, failedRelays); +}; + RelayList NostrService::getConnectedRelays(RelayList relays) { PLOG_VERBOSE << "Identifying connected relays."; |