mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2025-03-17 21:31:57 +01:00
Starts the work to filter events that return from the relay to make sure they match the subscription submitted
This commit is contained in:
parent
e3e90229ce
commit
3ac303c724
@ -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
|
||||
|
@ -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" ->
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user