aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/nostr.hpp8
-rw-r--r--src/nostr_service.cpp43
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.";