Starts the work to filter events that return from the relay to make sure they match the subscription submitted

This commit is contained in:
Vitor Pamplona 2025-01-13 19:42:43 -05:00
parent e3e90229ce
commit 3ac303c724
3 changed files with 51 additions and 8 deletions

View File

@ -52,6 +52,17 @@ class RelaySubFilter(
val activeTypes: Set<FeedType>, val activeTypes: Set<FeedType>,
val subs: SubscriptionManager, val subs: SubscriptionManager,
) : SubscriptionCollection { ) : SubscriptionCollection {
fun isMatch(filter: TypedFilter) = activeTypes.any { it in filter.types } && filter.filter.isValidFor(url)
fun match(filters: List<TypedFilter>): 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<Subscription> = override fun allSubscriptions(): List<Subscription> =
subs.allSubscriptions().mapNotNull { filter -> subs.allSubscriptions().mapNotNull { filter ->
val filters = filter(filter.value) 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<TypedFilter>): List<Filter> = fun filter(filters: List<TypedFilter>): List<Filter> =
filters.mapNotNull { filter -> filters.mapNotNull { filter ->
if (activeTypes.any { it in filter.types } && filter.filter.isValidFor(url)) { if (isMatch(filter)) {
filter.filter.toRelay(url) filter.filter.toRelay(url)
} else { } else {
null null

View File

@ -238,13 +238,28 @@ class SimpleRelay(
// Log.w("Relay", "Relay onEVENT ${event.kind} $url, $subscriptionId ${msgArray.get(2)}") // Log.w("Relay", "Relay onEVENT ${event.kind} $url, $subscriptionId ${msgArray.get(2)}")
listeners.forEach { // filter results: subs.isActive(subscriptionId) && subs.match(subscriptionId, event)
it.onEvent( if (true) {
this@SimpleRelay, listeners.forEach {
subscriptionId, it.onEvent(
event, this@SimpleRelay,
afterEOSEPerSubscription[subscriptionId] == true, 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" -> "EOSE" ->

View File

@ -20,6 +20,18 @@
*/ */
package com.vitorpamplona.ammolite.relays.relays package com.vitorpamplona.ammolite.relays.relays
import com.vitorpamplona.quartz.nip01Core.core.Event
import com.vitorpamplona.quartz.nip01Core.relays.Filter
interface SubscriptionCollection { interface SubscriptionCollection {
fun isActive(subscriptionId: String): Boolean
fun getFilters(subscriptionId: String): List<Filter>
fun allSubscriptions(): List<Subscription> fun allSubscriptions(): List<Subscription>
fun match(
subscriptionId: String,
event: Event,
): Boolean
} }