diff options
author | dwigton <daniel@stonecottageweb.com> | 2024-07-16 07:14:08 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-16 07:14:08 -0500 |
commit | 576ca6100d8aa7c62c9107d857575325425e7e6e (patch) | |
tree | 041ea8ca06a26fb6a25bcb30c9964cbceed69e74 /src | |
parent | dbf4df01cd58957b23ef2ef8316e31d2524246a8 (diff) | |
parent | 1e6bf40d457def0faa12e3f6cf58be0e9c69e6f5 (diff) |
Resolution to issue 9
Diffstat (limited to 'src')
-rw-r--r-- | src/nostr_service.cpp | 166 |
1 files changed, 85 insertions, 81 deletions
diff --git a/src/nostr_service.cpp b/src/nostr_service.cpp index 10d9fc6..73cd602 100644 --- a/src/nostr_service.cpp +++ b/src/nostr_service.cpp @@ -182,104 +182,108 @@ tuple<vector<string>, vector<string>> NostrService::publishEvent(shared_ptr<Even return make_tuple(successfulRelays, failedRelays); }; -// TODO: Make this method return a promise. // TODO: Add a timeout to this method to prevent hanging while waiting for the relay. -vector<shared_ptr<Event>> NostrService::queryRelays(shared_ptr<Filters> filters) +future<vector<shared_ptr<Event>>> NostrService::queryRelays(shared_ptr<Filters> filters) { - if (filters->limit > 64 || filters->limit < 1) + return async(launch::async, [this, filters]() -> vector<shared_ptr<Event>> { - PLOG_WARNING << "Filters limit must be between 1 and 64, inclusive. Setting limit to 16."; - filters->limit = 16; - } + if (filters->limit > 64 || filters->limit < 1) + { + PLOG_WARNING << "Filters limit must be between 1 and 64, inclusive. Setting limit to 16."; + filters->limit = 16; + } - vector<shared_ptr<Event>> events; + vector<shared_ptr<Event>> events; - string subscriptionId = this->generateSubscriptionId(); - string request; + string subscriptionId = this->generateSubscriptionId(); + string request; - try - { - request = filters->serialize(subscriptionId); - } - catch (const invalid_argument& e) - { - PLOG_ERROR << "Failed to serialize filters - invalid object: " << e.what(); - throw e; - } - catch (const json::exception& je) - { - PLOG_ERROR << "Failed to serialize filters - JSON exception: " << je.what(); - throw je; - } + try + { + request = filters->serialize(subscriptionId); + } + catch (const invalid_argument& e) + { + PLOG_ERROR << "Failed to serialize filters - invalid object: " << e.what(); + throw e; + } + catch (const json::exception& je) + { + PLOG_ERROR << "Failed to serialize filters - JSON exception: " << je.what(); + throw je; + } - vector<future<tuple<string, bool>>> requestFutures; + vector<future<tuple<string, bool>>> requestFutures; - unordered_set<string> uniqueEventIds; + unordered_set<string> uniqueEventIds; - // Send the same query to each relay. As events trickle in from each relay, they will be added - // to the events vector. Duplicate copies of the same event will be ignored, as events are - // stored on multiple relays. The function will block until all of the relays send an EOSE or - // CLOSE message. - for (const string relay : this->_activeRelays) - { - promise<tuple<string, bool>> eosePromise; - requestFutures.push_back(move(eosePromise.get_future())); + // Send the same query to each relay. As events trickle in from each relay, they will be added + // to the events vector. Duplicate copies of the same event will be ignored, as events are + // stored on multiple relays. The function will block until all of the relays send an EOSE or + // CLOSE message. + for (const string relay : this->_activeRelays) + { + promise<tuple<string, bool>> eosePromise; + requestFutures.push_back(move(eosePromise.get_future())); - auto [uri, success] = this->_client->send( - request, - relay, - [this, &relay, &events, &eosePromise, &uniqueEventIds](string payload) - { - this->onSubscriptionMessage( - payload, - [&events, &uniqueEventIds](const string&, shared_ptr<Event> event) - { - // Check if the event is unique before adding. - if (uniqueEventIds.insert(event->id).second) + auto [uri, success] = this->_client->send( + request, + relay, + [this, &relay, &events, &eosePromise, &uniqueEventIds](string payload) + { + this->onSubscriptionMessage( + payload, + [&events, &uniqueEventIds](const string&, shared_ptr<Event> event) { - events.push_back(event); - } - }, - [relay, &eosePromise](const string&) - { - eosePromise.set_value(make_tuple(relay, true)); - }, - [relay, &eosePromise](const string&, const string&) - { - eosePromise.set_value(make_tuple(relay, false)); - }); - }); + // Check if the event is unique before adding. + if (uniqueEventIds.insert(event->id).second) + { + events.push_back(event); + } + }, + [relay, &eosePromise](const string&) + { + eosePromise.set_value(make_tuple(relay, true)); + }, + [relay, &eosePromise](const string&, const string&) + { + eosePromise.set_value(make_tuple(relay, false)); + }); + }); - if (success) - { - PLOG_INFO << "Sent query to relay " << relay; - lock_guard<mutex> lock(this->_propertyMutex); - this->_subscriptions[subscriptionId].push_back(relay); - } - else - { - PLOG_WARNING << "Failed to send query to relay " << relay; - eosePromise.set_value(make_tuple(uri, false)); + if (success) + { + PLOG_INFO << "Sent query to relay " << relay; + lock_guard<mutex> lock(this->_propertyMutex); + this->_subscriptions[subscriptionId].push_back(relay); + } + else + { + PLOG_WARNING << "Failed to send query to relay " << relay; + eosePromise.set_value(make_tuple(uri, false)); + } } - } - // Close open subscriptions and disconnect from relays after events are received. - for (auto& publishFuture : requestFutures) - { - auto [relay, isEose] = publishFuture.get(); - if (isEose) - { - PLOG_INFO << "Received EOSE message from relay " << relay; - } - else + + // Close open subscriptions and disconnect from relays after events are received. + + for (auto& publishFuture : requestFutures) { - PLOG_WARNING << "Received CLOSE message from relay " << relay; - this->closeRelayConnections({ relay }); + auto [relay, isEose] = publishFuture.get(); + if (isEose) + { + PLOG_INFO << "Received EOSE message from relay " << relay; + } + else + { + PLOG_WARNING << "Received CLOSE message from relay " << relay; + this->closeRelayConnections({ relay }); + } } - } - this->closeSubscription(subscriptionId); + this->closeSubscription(subscriptionId); - return events; + return events; + }); }; string NostrService::queryRelays( |