From 87ab420599d4910a5ecab86a3752f68ddb72e26d Mon Sep 17 00:00:00 2001 From: Daniel Wigton Date: Tue, 2 Jul 2024 07:11:37 -0500 Subject: deduplicate events in queryRelays --- src/nostr_service.cpp | 17 +++++++++++------ test/nostr_service_test.cpp | 4 ++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/nostr_service.cpp b/src/nostr_service.cpp index 5adca3b..10d9fc6 100644 --- a/src/nostr_service.cpp +++ b/src/nostr_service.cpp @@ -1,5 +1,6 @@ #include "nostr.hpp" #include "client/web_socket_client.hpp" +#include using namespace nlohmann; using namespace std; @@ -213,8 +214,10 @@ vector> NostrService::queryRelays(shared_ptr filters) vector>> requestFutures; + unordered_set uniqueEventIds; + // Send the same query to each relay. As events trickle in from each relay, they will be added - // to the events vector. Multiple copies of an event may be received if the same event is + // 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) @@ -225,13 +228,17 @@ vector> NostrService::queryRelays(shared_ptr filters) auto [uri, success] = this->_client->send( request, relay, - [this, &relay, &events, &eosePromise](string payload) + [this, &relay, &events, &eosePromise, &uniqueEventIds](string payload) { this->onSubscriptionMessage( payload, - [&events](const string&, shared_ptr event) + [&events, &uniqueEventIds](const string&, shared_ptr event) { - events.push_back(event); + // Check if the event is unique before adding. + if (uniqueEventIds.insert(event->id).second) + { + events.push_back(event); + } }, [relay, &eosePromise](const string&) { @@ -272,8 +279,6 @@ vector> NostrService::queryRelays(shared_ptr filters) } this->closeSubscription(subscriptionId); - // TODO: De-duplicate events in the vector before returning. - return events; }; diff --git a/test/nostr_service_test.cpp b/test/nostr_service_test.cpp index 5867e8e..4e29960 100644 --- a/test/nostr_service_test.cpp +++ b/test/nostr_service_test.cpp @@ -773,8 +773,8 @@ TEST_F(NostrServiceTest, QueryRelays_ReturnsEvents_UpToEOSE) auto filters = make_shared(getKind0And1TestFilters()); auto results = nostrService->queryRelays(filters); - // TODO: Check results size when the queryRelays method deduplicates results before returning. - // ASSERT_EQ(results.size(), testEvents.size()); + // Check results size to ensure there are no duplicates. + ASSERT_EQ(results.size(), testEvents.size()); // Check that the results contain the expected events. for (auto resultEvent : results) -- cgit