From 3ac303c7248ae27f0024906f90f7921a1a4b21a9 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 13 Jan 2025 19:42:43 -0500 Subject: [PATCH] Starts the work to filter events that return from the relay to make sure they match the subscription submitted --- .../vitorpamplona/ammolite/relays/Relay.kt | 18 +++++++++++- .../ammolite/relays/relays/SimpleRelay.kt | 29 ++++++++++++++----- .../relays/relays/SubscriptionCollection.kt | 12 ++++++++ 3 files changed, 51 insertions(+), 8 deletions(-) diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Relay.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Relay.kt index bd4e31f29..58263f48c 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Relay.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/Relay.kt @@ -52,6 +52,17 @@ class RelaySubFilter( val activeTypes: Set, val subs: SubscriptionManager, ) : SubscriptionCollection { + fun isMatch(filter: TypedFilter) = activeTypes.any { it in filter.types } && filter.filter.isValidFor(url) + + fun match(filters: List): Boolean = + filters.any { filter -> + isMatch(filter) + } + + override fun isActive(subscriptionId: String): Boolean = subs.isActive(subscriptionId) && match(subs.getSubscriptionFilters(subscriptionId)) + + override fun getFilters(subscriptionId: String) = filter(subs.getSubscriptionFilters(subscriptionId)) + override fun allSubscriptions(): List = subs.allSubscriptions().mapNotNull { filter -> val filters = filter(filter.value) @@ -62,9 +73,14 @@ class RelaySubFilter( } } + override fun match( + subscriptionId: String, + event: Event, + ): Boolean = subs.getSubscriptionFilters(subscriptionId).any { it.filter.match(event, url) } + fun filter(filters: List): List = filters.mapNotNull { filter -> - if (activeTypes.any { it in filter.types } && filter.filter.isValidFor(url)) { + if (isMatch(filter)) { filter.filter.toRelay(url) } else { null diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/relays/SimpleRelay.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/relays/SimpleRelay.kt index 1013f8338..e43e55aa3 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/relays/SimpleRelay.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/relays/SimpleRelay.kt @@ -238,13 +238,28 @@ class SimpleRelay( // Log.w("Relay", "Relay onEVENT ${event.kind} $url, $subscriptionId ${msgArray.get(2)}") - listeners.forEach { - it.onEvent( - this@SimpleRelay, - subscriptionId, - event, - afterEOSEPerSubscription[subscriptionId] == true, - ) + // filter results: subs.isActive(subscriptionId) && subs.match(subscriptionId, event) + if (true) { + listeners.forEach { + it.onEvent( + this@SimpleRelay, + subscriptionId, + event, + afterEOSEPerSubscription[subscriptionId] == true, + ) + } + } else { + val filter = + subs.getFilters(subscriptionId).joinToStringLimited( + separator = ",", + limit = 19, + prefix = """["REQ","$subscriptionId",""", + postfix = "]", + ) { + it.toJson() + } + + Log.w("Relay", "Subscription $filter is not active or the filter does not match the event ${msgArray.get(2)}") } } "EOSE" -> diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/relays/SubscriptionCollection.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/relays/SubscriptionCollection.kt index 41b9a2aaf..256803bee 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/relays/SubscriptionCollection.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/relays/SubscriptionCollection.kt @@ -20,6 +20,18 @@ */ package com.vitorpamplona.ammolite.relays.relays +import com.vitorpamplona.quartz.nip01Core.core.Event +import com.vitorpamplona.quartz.nip01Core.relays.Filter + interface SubscriptionCollection { + fun isActive(subscriptionId: String): Boolean + + fun getFilters(subscriptionId: String): List + fun allSubscriptions(): List + + fun match( + subscriptionId: String, + event: Event, + ): Boolean }