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 subs: SubscriptionManager,
) : 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> =
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<TypedFilter>): List<Filter> =
filters.mapNotNull { filter ->
if (activeTypes.any { it in filter.types } && filter.filter.isValidFor(url)) {
if (isMatch(filter)) {
filter.filter.toRelay(url)
} else {
null

View File

@ -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" ->

View File

@ -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<Filter>
fun allSubscriptions(): List<Subscription>
fun match(
subscriptionId: String,
event: Event,
): Boolean
}