diff --git a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadDualAxisChartAssemblerTest.kt b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadDualAxisChartAssemblerTest.kt index a591dd5751..095256bdde 100644 --- a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadDualAxisChartAssemblerTest.kt +++ b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadDualAxisChartAssemblerTest.kt @@ -33,7 +33,6 @@ import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair import com.vitorpamplona.quartz.nip01Core.crypto.verify import com.vitorpamplona.quartz.nip01Core.jackson.JacksonMapper -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal import com.vitorpamplona.quartz.nip01Core.tags.aTag.ATag import com.vitorpamplona.quartz.nip03Timestamp.EmptyOtsResolverBuilder @@ -55,7 +54,7 @@ class ThreadDualAxisChartAssemblerTest { val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) val client = - NostrClient( + DefaultNostrClient( OkHttpWebSocket.Builder { OkHttpClient .Builder() diff --git a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/eventsync/EventSyncTest.kt b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/eventsync/EventSyncTest.kt index f892f67403..2c882a0a09 100644 --- a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/eventsync/EventSyncTest.kt +++ b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/eventsync/EventSyncTest.kt @@ -24,7 +24,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import com.vitorpamplona.amethyst.model.Constants import com.vitorpamplona.amethyst.service.okhttp.DefaultContentTypeInterceptor import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.RelayLogger import com.vitorpamplona.quartz.nip01Core.relay.client.auth.RelayAuthenticator import com.vitorpamplona.quartz.nip01Core.relay.normalizer.normalizeRelayUrl @@ -68,7 +67,7 @@ class EventSyncTest { inboxTargets = { setOf(vitor) }, dmTargets = { setOf(vitor) }, clientBuilder = { - NostrClient(socketBuilder, appScope) + DefaultNostrClient(socketBuilder, appScope) }, scope = appScope, ) @@ -87,7 +86,7 @@ class EventSyncTest { inboxTargets = { setOf(vitor) }, dmTargets = { setOf(vitor) }, clientBuilder = { - val newClient = NostrClient(socketBuilder, appScope) + val newClient = DefaultNostrClient(socketBuilder, appScope) val logger = RelayLogger(newClient, debugSending = true, debugReceiving = false) val signer = NostrSignerInternal(KeyPair()) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/AppModules.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/AppModules.kt index 7fe6b43bcb..e29b7454aa 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/AppModules.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/AppModules.kt @@ -68,7 +68,6 @@ import com.vitorpamplona.amethyst.ui.screen.AccountSessionManager import com.vitorpamplona.amethyst.ui.screen.UiSettingsState import com.vitorpamplona.amethyst.ui.tor.TorManager import com.vitorpamplona.quartz.nip01Core.core.Address -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.RelayLogger import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.RelayOfflineTracker @@ -256,7 +255,7 @@ class AppModules( val cache: LocalCache = LocalCache // Provides a relay pool - val client: INostrClient = NostrClient(websocketBuilder, applicationIOScope) + val client: NostrClient = DefaultNostrClient(websocketBuilder, applicationIOScope) // Watches for changes on Tor and Relay List Settings val relayProxyClientConnector = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index 9f988bd19c..6c99e5d71a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -135,8 +135,8 @@ import com.vitorpamplona.quartz.nip01Core.hints.EventHintBundle import com.vitorpamplona.quartz.nip01Core.hints.EventHintProvider import com.vitorpamplona.quartz.nip01Core.hints.PubKeyHintProvider import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.downloadFirstEvent +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.fetchFirst import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.signers.EventTemplate @@ -244,7 +244,7 @@ class Account( val nwcFilterAssembler: () -> NWCPaymentFilterAssembler, val otsResolverBuilder: () -> OtsResolver, val cache: LocalCache, - val client: INostrClient, + val client: NostrClient, val scope: CoroutineScope, ) : IAccount { private var userProfileCache: User? = null @@ -606,7 +606,7 @@ class Account( onResponse: (Response?) -> Unit, ) { val (event, relay) = nip47SignerState.sendNwcRequest(request, onResponse) - client.send(event, setOf(relay)) + client.publish(event, setOf(relay)) } suspend fun sendZapPaymentRequestFor( @@ -615,7 +615,7 @@ class Account( onResponse: (Response?) -> Unit, ) { val (event, relay) = nip47SignerState.sendZapPaymentRequestFor(bolt11, zappedNote, onResponse) - client.send(event, setOf(relay)) + client.publish(event, setOf(relay)) } suspend fun createZapRequestFor( @@ -701,7 +701,7 @@ class Account( suspend fun boost(note: Note) { RepostAction.repost(note, signer)?.let { event -> - client.send(event, computeMyReactionToNote(note, event)) + client.publish(event, computeMyReactionToNote(note, event)) cache.justConsumeMyOwnEvent(event) } } @@ -723,7 +723,7 @@ class Account( event: Event, relays: Set, ) { - client.send(event, relays) + client.publish(event, relays) cache.justConsumeMyOwnEvent(event) } @@ -939,7 +939,7 @@ class Account( // download the event and send it. noteEvent.host?.let { host -> client - .downloadFirstEvent( + .fetchFirst( filters = note.relays.associateWith { relay -> listOf( @@ -1012,7 +1012,7 @@ class Account( fun sendAutomatic(event: Event?) { if (event == null) return cache.justConsumeMyOwnEvent(event) - client.send(event, computeRelayListToBroadcast(event)) + client.publish(event, computeRelayListToBroadcast(event)) } suspend fun sendWebBookmark( @@ -1043,7 +1043,7 @@ class Account( fun sendMyPublicAndPrivateOutbox(event: Event?) { if (event == null) return cache.justConsumeMyOwnEvent(event) - client.send(event, outboxRelays.flow.value) + client.publish(event, outboxRelays.flow.value) } fun sendMyPublicAndPrivateOutbox(events: List) { @@ -1054,7 +1054,7 @@ class Account( } fun sendLiterallyEverywhere(event: Event) { - client.send(event, followPlusAllMineWithIndex.flow.value + client.availableRelaysFlow().value) + client.publish(event, followPlusAllMineWithIndex.flow.value + client.availableRelaysFlow().value) cache.justConsumeMyOwnEvent(event) } @@ -1287,7 +1287,7 @@ class Account( ) { val event = signer.sign(template) cache.justConsumeMyOwnEvent(event) - client.send(event, relayList) + client.publish(event, relayList) } suspend fun signAndSendPrivatelyOrBroadcast( @@ -1298,9 +1298,9 @@ class Account( cache.justConsumeMyOwnEvent(event) val relays = relayList(event) if (!relays.isNullOrEmpty()) { - client.send(event, relays.toSet()) + client.publish(event, relays.toSet()) } else { - client.send(event, computeRelayListToBroadcast(event)) + client.publish(event, computeRelayListToBroadcast(event)) } return event } @@ -1320,7 +1320,7 @@ class Account( val relayList = computeRelayListToBroadcast(note) - client.send(event, relayList) + client.publish(event, relayList) broadcast.forEach { client.send(it, relayList) } @@ -1344,7 +1344,7 @@ class Account( val relayList = computeRelayListToBroadcast(note) - client.send(event, relayList) + client.publish(event, relayList) broadcast.forEach { client.send(it, relayList) } @@ -1463,9 +1463,9 @@ class Account( val relayList = privateStorageRelayList.flow.value + localRelayList.flow.value if (relayList.isNotEmpty()) { - client.send(event, relayList + noteRelays) + client.publish(event, relayList + noteRelays) } else { - client.send(event, outboxRelays.flow.value + noteRelays) + client.publish(event, outboxRelays.flow.value + noteRelays) } cache.justConsumeMyOwnEvent(event) } @@ -1489,9 +1489,9 @@ class Account( val relayList = privateStorageRelayList.flow.value + localRelayList.flow.value if (relayList.isNotEmpty()) { - client.send(event, relayList + noteRelays) + client.publish(event, relayList + noteRelays) } else { - client.send(event, outboxRelays.flow.value + noteRelays) + client.publish(event, outboxRelays.flow.value + noteRelays) } cache.justConsumeMyOwnEvent(event) } @@ -1652,7 +1652,7 @@ class Account( val note = cache.getOrCreateNote(event.id) val relayList = computeRelayListToBroadcast(note) - client.send(event, relayList = relayList) + client.publish(event, relayList = relayList) broadcast.forEach { client.send(it, relayList) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/accountsCache/AccountCacheState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/accountsCache/AccountCacheState.kt index 30379256b3..db5787cc6b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/accountsCache/AccountCacheState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/accountsCache/AccountCacheState.kt @@ -28,7 +28,7 @@ import com.vitorpamplona.amethyst.service.location.LocationState import com.vitorpamplona.amethyst.service.relayClient.reqCommand.nwc.NWCPaymentFilterAssembler import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.toHexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal import com.vitorpamplona.quartz.nip03Timestamp.OtsResolver @@ -50,7 +50,7 @@ class AccountCacheState( val contentResolverFn: () -> ContentResolver, val otsResolverBuilder: () -> OtsResolver, val cache: LocalCache, - val client: INostrClient, + val client: NostrClient, ) { val accounts = MutableStateFlow>(emptyMap()) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip62Vanish/VanishRequestsState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip62Vanish/VanishRequestsState.kt index f5c044e1a3..8015ed82e7 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip62Vanish/VanishRequestsState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip62Vanish/VanishRequestsState.kt @@ -23,8 +23,8 @@ package com.vitorpamplona.amethyst.model.nip62Vanish import androidx.compose.runtime.Stable import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.LocalCache.notes -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.downloadFirstEvent +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.fetchFirst import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner @@ -61,7 +61,7 @@ enum class ComplianceStatus { class VanishRequestsState( val signer: NostrSigner, val cache: LocalCache, - val client: INostrClient, + val client: NostrClient, val scope: CoroutineScope, ) { val noteFlow = @@ -105,7 +105,7 @@ class VanishRequestsState( try { val foundEvent = withContext(Dispatchers.IO) { - client.downloadFirstEvent( + client.fetchFirst( relay = relay, filter = Filter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/broadcast/BroadcastTracker.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/broadcast/BroadcastTracker.kt index c65d10d6fd..ad5855b561 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/broadcast/BroadcastTracker.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/broadcast/BroadcastTracker.kt @@ -21,8 +21,8 @@ package com.vitorpamplona.amethyst.service.broadcast import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.OkMessage @@ -71,7 +71,7 @@ class BroadcastTracker { suspend fun trackBroadcast( event: Event, relays: Set, - client: INostrClient, + client: NostrClient, ) { val trackingId = UUID.randomUUID().toString() @@ -90,7 +90,7 @@ class BroadcastTracker { val resultChannel = Channel(UNLIMITED) val subscription = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onCannotConnect( relay: IRelayClient, errorMessage: String, @@ -143,7 +143,7 @@ class BroadcastTracker { } try { - client.subscribe(subscription) + client.addConnectionListener(subscription) val finalBroadcast = coroutineScope { @@ -178,7 +178,7 @@ class BroadcastTracker { } // Send after setting up listener - client.send(event, relays) + client.publish(event, relays) resultCollector.await() } @@ -192,7 +192,7 @@ class BroadcastTracker { Log.d(TAG, "Broadcast $trackingId complete: ${finalBroadcast.successCount}/${finalBroadcast.totalRelays} success") } finally { - client.unsubscribe(subscription) + client.removeConnectionListener(subscription) } } @@ -232,7 +232,7 @@ class BroadcastTracker { @OptIn(DelicateCoroutinesApi::class) suspend fun retry( broadcast: BroadcastEvent, - client: INostrClient, + client: NostrClient, specificRelay: NormalizedRelayUrl? = null, ): BroadcastEvent { val event = broadcast.event @@ -266,7 +266,7 @@ class BroadcastTracker { val resultChannel = Channel(UNLIMITED) val subscription = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onCannotConnect( relay: IRelayClient, errorMessage: String, @@ -318,7 +318,7 @@ class BroadcastTracker { } } - client.subscribe(subscription) + client.addConnectionListener(subscription) val finalBroadcast = coroutineScope { @@ -370,12 +370,12 @@ class BroadcastTracker { currentBroadcast.copy(status = newStatus) } - client.send(event, relaysToRetry) + client.publish(event, relaysToRetry) resultCollector.await() } - client.unsubscribe(subscription) + client.removeConnectionListener(subscription) resultChannel.close() // Update in active broadcasts diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/CacheClientConnector.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/CacheClientConnector.kt index 6e03d26c7e..6a0bbd52c4 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/CacheClientConnector.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/CacheClientConnector.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.service.relayClient import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.EventCollector import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.RelayInsertConfirmationCollector import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -31,7 +31,7 @@ import com.vitorpamplona.quartz.nip59Giftwrap.seals.SealedRumorEvent import com.vitorpamplona.quartz.nip59Giftwrap.wraps.GiftWrapEvent class CacheClientConnector( - val client: INostrClient, + val client: NostrClient, val cache: LocalCache, ) { val receiver = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/RelayProxyClientConnector.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/RelayProxyClientConnector.kt index 512f85a3b6..b480848210 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/RelayProxyClientConnector.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/RelayProxyClientConnector.kt @@ -26,7 +26,7 @@ import com.vitorpamplona.amethyst.service.connectivity.ConnectivityStatus import com.vitorpamplona.amethyst.service.okhttp.DualHttpClientManagerForRelays import com.vitorpamplona.amethyst.ui.tor.TorManager import com.vitorpamplona.amethyst.ui.tor.TorServiceStatus -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.utils.Log import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -48,7 +48,7 @@ class RelayProxyClientConnector( val okHttpClients: DualHttpClientManagerForRelays, val connManager: ConnectivityManager, val torManager: TorManager, - val client: INostrClient, + val client: NostrClient, val scope: CoroutineScope, ) { data class RelayServiceInfra( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/authCommand/model/AuthCoordinator.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/authCommand/model/AuthCoordinator.kt index 2437c21a26..5e574086de 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/authCommand/model/AuthCoordinator.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/authCommand/model/AuthCoordinator.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.service.relayClient.authCommand.model import androidx.compose.runtime.Stable import com.vitorpamplona.amethyst.isDebug import com.vitorpamplona.amethyst.model.Account -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.auth.RelayAuthenticator import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerSync import com.vitorpamplona.quartz.utils.Log @@ -35,7 +35,7 @@ class ScreenAuthAccount( @Stable class AuthCoordinator( - client: INostrClient, + client: NostrClient, scope: CoroutineScope, ) { private val authWithAccounts = ListWithUniqueSetCache { it.account } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/PerUniqueIdEoseManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/PerUniqueIdEoseManager.kt index dad3d827b1..15bce2c7ce 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/PerUniqueIdEoseManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/PerUniqueIdEoseManager.kt @@ -24,10 +24,10 @@ import com.vitorpamplona.amethyst.commons.relayClient.eoseManagers.BaseEoseManag import com.vitorpamplona.amethyst.service.relays.EOSEByKey import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.pool.groupByRelay -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -42,7 +42,7 @@ import com.vitorpamplona.quartz.utils.TimeUtils * shares all EOSEs among all users. */ abstract class PerUniqueIdEoseManager( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, val invalidateAfterEose: Boolean = false, ) : BaseEoseManager(client, allKeys) { @@ -68,8 +68,8 @@ abstract class PerUniqueIdEoseManager( open fun newSub(key: T): Subscription = requestNewSubscription( - object : IRequestListener { - override fun onEose( + object : SubscriptionListener { + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -78,11 +78,11 @@ abstract class PerUniqueIdEoseManager( override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isLive) { + if (isRealTime) { newEose(key, relay, TimeUtils.now(), forFilters) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/PerUserAndFollowListEoseManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/PerUserAndFollowListEoseManager.kt index da4d9b2b4c..ec6477bd62 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/PerUserAndFollowListEoseManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/PerUserAndFollowListEoseManager.kt @@ -25,10 +25,10 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relays.EOSEAccountKey import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.pool.groupByRelay -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -46,7 +46,7 @@ import com.vitorpamplona.quartz.utils.TimeUtils * app reuse the EOSE because it assumes the filter is going to be different */ abstract class PerUserAndFollowListEoseManager( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, val invalidateAfterEose: Boolean = false, ) : BaseEoseManager(client, allKeys) { @@ -69,8 +69,8 @@ abstract class PerUserAndFollowListEoseManager( open fun newSub(key: T): Subscription = requestNewSubscription( - object : IRequestListener { - override fun onEose( + object : SubscriptionListener { + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -79,11 +79,11 @@ abstract class PerUserAndFollowListEoseManager( override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isLive) { + if (isRealTime) { newEose(key, relay, TimeUtils.now(), forFilters) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/PerUserEoseManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/PerUserEoseManager.kt index 357a2ab105..c1b9e7de60 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/PerUserEoseManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/PerUserEoseManager.kt @@ -25,10 +25,10 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relays.EOSEAccountFast import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.pool.groupByRelay -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -44,7 +44,7 @@ import com.vitorpamplona.quartz.utils.TimeUtils * the subscription disappears and comes back later. */ abstract class PerUserEoseManager( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, val invalidateAfterEose: Boolean = false, ) : BaseEoseManager(client, allKeys) { @@ -67,8 +67,8 @@ abstract class PerUserEoseManager( open fun newSub(key: T): Subscription = requestNewSubscription( - object : IRequestListener { - override fun onEose( + object : SubscriptionListener { + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -77,11 +77,11 @@ abstract class PerUserEoseManager( override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isLive) { + if (isRealTime) { newEose(key, relay, TimeUtils.now(), forFilters) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/SingleSubNoEoseCacheEoseManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/SingleSubNoEoseCacheEoseManager.kt index aaefb517a1..b241a61796 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/SingleSubNoEoseCacheEoseManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/eoseManagers/SingleSubNoEoseCacheEoseManager.kt @@ -22,10 +22,10 @@ package com.vitorpamplona.amethyst.service.relayClient.eoseManagers import com.vitorpamplona.amethyst.commons.relayClient.eoseManagers.BaseEoseManager import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.pool.groupByRelay -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -35,14 +35,14 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl * filters */ abstract class SingleSubNoEoseCacheEoseManager( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, val invalidateAfterEose: Boolean = false, ) : BaseEoseManager(client, allKeys) { val sub = requestNewSubscription( - object : IRequestListener { - override fun onEose( + object : SubscriptionListener { + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -53,11 +53,11 @@ abstract class SingleSubNoEoseCacheEoseManager( override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isLive) { + if (isRealTime) { if (invalidateAfterEose) { invalidateFilters() } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/notifyCommand/model/NotifyCoordinator.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/notifyCommand/model/NotifyCoordinator.kt index 404015a6b3..1842141a31 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/notifyCommand/model/NotifyCoordinator.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/notifyCommand/model/NotifyCoordinator.kt @@ -20,11 +20,11 @@ */ package com.vitorpamplona.amethyst.service.relayClient.notifyCommand.model -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.RelayNotifier class NotifyCoordinator( - client: INostrClient, + client: NostrClient, ) { val requests = NotifyRequestsCache() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/RelaySubscriptionsCoordinator.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/RelaySubscriptionsCoordinator.kt index 3c1363a1fe..43e60799ec 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/RelaySubscriptionsCoordinator.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/RelaySubscriptionsCoordinator.kt @@ -43,14 +43,14 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.relay.datasource.RelayFeedF import com.vitorpamplona.amethyst.ui.screen.loggedIn.relays.datasource.RelayInfoNip66FilterAssembler import com.vitorpamplona.amethyst.ui.screen.loggedIn.threadview.datasources.ThreadFilterAssembler import com.vitorpamplona.amethyst.ui.screen.loggedIn.video.datasource.VideoFilterAssembler -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.RelayOfflineTracker import com.vitorpamplona.quartz.nip01Core.relay.client.auth.IAuthStatus import kotlinx.coroutines.CoroutineScope class RelaySubscriptionsCoordinator( cache: LocalCache, - client: INostrClient, + client: NostrClient, authenticator: IAuthStatus, failureTracker: RelayOfflineTracker, scope: CoroutineScope, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/AccountFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/AccountFilterAssembler.kt index 1c387a3042..9b3aa29083 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/AccountFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/AccountFilterAssembler.kt @@ -32,7 +32,7 @@ import com.vitorpamplona.amethyst.service.relayClient.reqCommand.account.nip01No import com.vitorpamplona.amethyst.service.relayClient.reqCommand.account.nip59GiftWraps.AccountGiftWrapsEoseManager import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountFeedContentStates import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.RelayOfflineTracker import com.vitorpamplona.quartz.nip01Core.relay.client.auth.IAuthStatus import kotlinx.coroutines.CoroutineScope @@ -50,7 +50,7 @@ class AccountQueryState( */ @Stable class AccountFilterAssembler( - client: INostrClient, + client: NostrClient, cache: LocalCache, authenticator: IAuthStatus, failureTracker: RelayOfflineTracker, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/drafts/AccountDraftsEoseManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/drafts/AccountDraftsEoseManager.kt index 1d87c2f002..8d5808e515 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/drafts/AccountDraftsEoseManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/drafts/AccountDraftsEoseManager.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserEoseManager import com.vitorpamplona.amethyst.service.relayClient.reqCommand.account.AccountQueryState import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import kotlinx.coroutines.Dispatchers @@ -34,7 +34,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch class AccountDraftsEoseManager( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserEoseManager(client, allKeys) { override fun user(key: AccountQueryState) = key.account.userProfile() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/follows/AccountFollowsLoaderSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/follows/AccountFollowsLoaderSubAssembler.kt index 5e70dfedd4..f89a4c06be 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/follows/AccountFollowsLoaderSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/follows/AccountFollowsLoaderSubAssembler.kt @@ -30,12 +30,12 @@ import com.vitorpamplona.amethyst.service.BundledUpdate import com.vitorpamplona.amethyst.service.relayClient.reqCommand.account.AccountQueryState import com.vitorpamplona.amethyst.service.relays.EOSEAccountFast import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.RelayOfflineTracker import com.vitorpamplona.quartz.nip01Core.relay.client.auth.IAuthStatus import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.pool.groupByRelay -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.newSubId import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.SubscriptionController import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter @@ -56,7 +56,7 @@ import kotlinx.coroutines.launch * It needs to be super fast on startup. */ class AccountFollowsLoaderSubAssembler( - val client: INostrClient, + val client: NostrClient, val cache: LocalCache, val scope: CoroutineScope, val authStatus: IAuthStatus, @@ -107,8 +107,8 @@ class AccountFollowsLoaderSubAssembler( val sub = orchestrator.requestNewSubscription( if (isDebug) logTag + newSubId() else newSubId(), - object : IRequestListener { - override fun onEose( + object : SubscriptionListener { + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -117,11 +117,11 @@ class AccountFollowsLoaderSubAssembler( override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isLive) { + if (isRealTime) { newEose(TimeUtils.now(), relay, forFilters) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/AccountMetadataEoseManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/AccountMetadataEoseManager.kt index db90fd8b7c..8afa83e021 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/AccountMetadataEoseManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/AccountMetadataEoseManager.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserEoseManager import com.vitorpamplona.amethyst.service.relayClient.reqCommand.account.AccountQueryState import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import com.vitorpamplona.quartz.utils.TimeUtils @@ -35,7 +35,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch class AccountMetadataEoseManager( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserEoseManager(client, allKeys) { override fun user(key: AccountQueryState) = key.account.userProfile() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/nip01Notifications/AccountNotificationsEoseFromInboxRelaysManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/nip01Notifications/AccountNotificationsEoseFromInboxRelaysManager.kt index 9d7c0cdfe6..40695d1e31 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/nip01Notifications/AccountNotificationsEoseFromInboxRelaysManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/nip01Notifications/AccountNotificationsEoseFromInboxRelaysManager.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserEoseManager import com.vitorpamplona.amethyst.service.relayClient.reqCommand.account.AccountQueryState import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import com.vitorpamplona.quartz.utils.TimeUtils @@ -36,7 +36,7 @@ import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch class AccountNotificationsEoseFromInboxRelaysManager( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserEoseManager(client, allKeys) { override fun user(key: AccountQueryState) = key.account.userProfile() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/nip01Notifications/AccountNotificationsEoseFromRandomRelaysManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/nip01Notifications/AccountNotificationsEoseFromRandomRelaysManager.kt index 9aa0acc87d..38cd0a1a67 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/nip01Notifications/AccountNotificationsEoseFromRandomRelaysManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/nip01Notifications/AccountNotificationsEoseFromRandomRelaysManager.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserEoseManager import com.vitorpamplona.amethyst.service.relayClient.reqCommand.account.AccountQueryState import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import com.vitorpamplona.quartz.utils.TimeUtils @@ -37,7 +37,7 @@ import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch class AccountNotificationsEoseFromRandomRelaysManager( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserEoseManager(client, allKeys) { override fun user(key: AccountQueryState) = key.account.userProfile() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/nip59GiftWraps/AccountGiftWrapsEoseManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/nip59GiftWraps/AccountGiftWrapsEoseManager.kt index ab4de28752..ef5d8bfbe2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/nip59GiftWraps/AccountGiftWrapsEoseManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/nip59GiftWraps/AccountGiftWrapsEoseManager.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserEoseManager import com.vitorpamplona.amethyst.service.relayClient.reqCommand.account.AccountQueryState import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import kotlinx.coroutines.Dispatchers @@ -34,7 +34,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch class AccountGiftWrapsEoseManager( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserEoseManager(client, allKeys) { override fun user(key: AccountQueryState) = key.account.userProfile() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/ChannelFinderFilterAssemblyGroup.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/ChannelFinderFilterAssemblyGroup.kt index 9ea5235108..33023a862a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/ChannelFinderFilterAssemblyGroup.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/ChannelFinderFilterAssemblyGroup.kt @@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.commons.model.Channel import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManagers.ComposeSubscriptionManager import com.vitorpamplona.amethyst.service.relayClient.reqCommand.channel.mixChatsLive.ChannelMetadataAndLiveActivityWatcherSubAssembler import com.vitorpamplona.amethyst.service.relayClient.reqCommand.channel.nip28PublicChats.ChannelLoaderSubAssembler -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient // This allows multiple screen to be listening to tags, even the same tag @Stable @@ -35,7 +35,7 @@ class ChannelFinderQueryState( @Stable class ChannelFinderFilterAssemblyGroup( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/mixChatsLive/ChannelMetadataAndLiveActivityWatcherSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/mixChatsLive/ChannelMetadataAndLiveActivityWatcherSubAssembler.kt index 57dfe70503..9fcb70ba4c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/mixChatsLive/ChannelMetadataAndLiveActivityWatcherSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/mixChatsLive/ChannelMetadataAndLiveActivityWatcherSubAssembler.kt @@ -27,7 +27,7 @@ import com.vitorpamplona.amethyst.service.relayClient.reqCommand.channel.Channel import com.vitorpamplona.amethyst.service.relayClient.reqCommand.channel.nip28PublicChats.filterChannelMetadataUpdatesById import com.vitorpamplona.amethyst.service.relayClient.reqCommand.channel.nip53LiveActivities.filterLiveStreamUpdatesByAddress import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.utils.mapOfSet @@ -39,7 +39,7 @@ import com.vitorpamplona.quartz.utils.mapOfSet * only one EOSE for everybody. */ class ChannelMetadataAndLiveActivityWatcherSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : SingleSubEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/nip28PublicChats/ChannelLoaderSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/nip28PublicChats/ChannelLoaderSubAssembler.kt index c14d14bd19..10cacc5714 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/nip28PublicChats/ChannelLoaderSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/nip28PublicChats/ChannelLoaderSubAssembler.kt @@ -22,7 +22,7 @@ package com.vitorpamplona.amethyst.service.relayClient.reqCommand.channel.nip28P import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.SingleSubNoEoseCacheEoseManager import com.vitorpamplona.amethyst.service.relayClient.reqCommand.channel.ChannelFinderQueryState -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter /** @@ -35,7 +35,7 @@ import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter * This is one filter for everybody. */ class ChannelLoaderSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : SingleSubNoEoseCacheEoseManager(client, allKeys, invalidateAfterEose = true) { override fun updateFilter(keys: List): List = filterMissingChannelsById(keys) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/nip28PublicChats/ChannelMetadataWatcherSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/nip28PublicChats/ChannelMetadataWatcherSubAssembler.kt index 4f8dfde481..21992934a8 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/nip28PublicChats/ChannelMetadataWatcherSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/nip28PublicChats/ChannelMetadataWatcherSubAssembler.kt @@ -25,11 +25,11 @@ import com.vitorpamplona.amethyst.commons.model.nip28PublicChats.PublicChatChann import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUniqueIdEoseManager import com.vitorpamplona.amethyst.service.relayClient.reqCommand.channel.ChannelFinderQueryState import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class ChannelMetadataWatcherSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUniqueIdEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/nip53LiveActivities/LiveActivityWatcherSubAssembly.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/nip53LiveActivities/LiveActivityWatcherSubAssembly.kt index 0d087ca167..d7e5541b7a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/nip53LiveActivities/LiveActivityWatcherSubAssembly.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/channel/nip53LiveActivities/LiveActivityWatcherSubAssembly.kt @@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.commons.model.nip53LiveActivities.LiveActiviti import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUniqueIdEoseManager import com.vitorpamplona.amethyst.service.relayClient.reqCommand.channel.ChannelFinderQueryState import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter /** @@ -33,7 +33,7 @@ import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter * since they are replaceable. */ class LiveActivityWatcherSubAssembly( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUniqueIdEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/event/EventFinderFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/event/EventFinderFilterAssembler.kt index 29a6767490..9c6858b73e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/event/EventFinderFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/event/EventFinderFilterAssembler.kt @@ -26,7 +26,7 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.service.relayClient.reqCommand.event.loaders.NoteEventLoaderSubAssembler import com.vitorpamplona.amethyst.service.relayClient.reqCommand.event.watchers.EventWatcherSubAssembler -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient // This allows multiple screen to be listening to tags, even the same tag @Stable @@ -37,7 +37,7 @@ class EventFinderQueryState( @Stable class EventFinderFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/event/loaders/NoteEventLoaderSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/event/loaders/NoteEventLoaderSubAssembler.kt index 9ff15e6407..6fdc7ad791 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/event/loaders/NoteEventLoaderSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/event/loaders/NoteEventLoaderSubAssembler.kt @@ -22,10 +22,10 @@ package com.vitorpamplona.amethyst.service.relayClient.reqCommand.event.loaders import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.SingleSubNoEoseCacheEoseManager import com.vitorpamplona.amethyst.service.relayClient.reqCommand.event.EventFinderQueryState -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient class NoteEventLoaderSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : SingleSubNoEoseCacheEoseManager(client, allKeys, invalidateAfterEose = true) { override fun updateFilter(keys: List) = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/event/watchers/EventWatcherSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/event/watchers/EventWatcherSubAssembler.kt index 91358cdfd0..aa730d6ab5 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/event/watchers/EventWatcherSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/event/watchers/EventWatcherSubAssembler.kt @@ -27,13 +27,13 @@ import com.vitorpamplona.amethyst.service.relayClient.reqCommand.event.EventFind import com.vitorpamplona.amethyst.service.relays.EOSEAccountFast import com.vitorpamplona.amethyst.service.relays.MutableTime import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl class EventWatcherSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : SingleSubEoseManager(client, allKeys) { var lastNotesOnFilter = emptyList() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/nwc/NWCPaymentFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/nwc/NWCPaymentFilterAssembler.kt index 48c66be4ee..1b8e7e4c7c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/nwc/NWCPaymentFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/nwc/NWCPaymentFilterAssembler.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.service.relayClient.reqCommand.nwc import androidx.compose.runtime.Stable import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManagers.ComposeSubscriptionManager import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl // This allows multiple screen to be listening to tags, even the same tag @@ -37,7 +37,7 @@ class NWCPaymentQueryState( @Stable class NWCPaymentFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/nwc/NWCPaymentWatcherSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/nwc/NWCPaymentWatcherSubAssembler.kt index 4be5b34c46..2ff1bcd183 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/nwc/NWCPaymentWatcherSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/nwc/NWCPaymentWatcherSubAssembler.kt @@ -21,11 +21,11 @@ package com.vitorpamplona.amethyst.service.relayClient.reqCommand.nwc import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.SingleSubNoEoseCacheEoseManager -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class NWCPaymentWatcherSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : SingleSubNoEoseCacheEoseManager(client, allKeys) { override fun updateFilter(keys: List): List? { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/UserFinderFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/UserFinderFilterAssembler.kt index e6b572e096..7123850c14 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/UserFinderFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/UserFinderFilterAssembler.kt @@ -29,7 +29,7 @@ import com.vitorpamplona.amethyst.service.relayClient.reqCommand.user.loaders.Us import com.vitorpamplona.amethyst.service.relayClient.reqCommand.user.watchers.UserCardsSubAssembler import com.vitorpamplona.amethyst.service.relayClient.reqCommand.user.watchers.UserReportsSubAssembler import com.vitorpamplona.amethyst.service.relayClient.reqCommand.user.watchers.UserWatcherSubAssembler -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.RelayOfflineTracker // This allows multiple screen to be listening to tags, even the same tag @@ -41,7 +41,7 @@ class UserFinderQueryState( @Stable class UserFinderFilterAssembler( - client: INostrClient, + client: NostrClient, cache: LocalCache, failureTracker: RelayOfflineTracker, ) : ComposeSubscriptionManager() { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/loaders/UserOutboxFinderSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/loaders/UserOutboxFinderSubAssembler.kt index 44316d6b1d..9cb8eaf5d2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/loaders/UserOutboxFinderSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/loaders/UserOutboxFinderSubAssembler.kt @@ -27,18 +27,18 @@ import com.vitorpamplona.amethyst.service.relayClient.reqCommand.account.follows import com.vitorpamplona.amethyst.service.relayClient.reqCommand.user.UserFinderQueryState import com.vitorpamplona.amethyst.service.relays.EOSEAccountFast import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.RelayOfflineTracker import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.pool.groupByRelay -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent import com.vitorpamplona.quartz.utils.TimeUtils class UserOutboxFinderSubAssembler( - client: INostrClient, + client: NostrClient, val cache: LocalCache, val failureTracker: RelayOfflineTracker, allKeys: () -> Set, @@ -68,8 +68,8 @@ class UserOutboxFinderSubAssembler( val sub = requestNewSubscription( - object : IRequestListener { - override fun onEose( + object : SubscriptionListener { + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserCardsSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserCardsSubAssembler.kt index 19474b6c48..93c97616bc 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserCardsSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserCardsSubAssembler.kt @@ -28,14 +28,14 @@ import com.vitorpamplona.amethyst.service.relayClient.reqCommand.user.UserFinder import com.vitorpamplona.amethyst.service.relays.MutableTime import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.utils.mapOfSet class UserCardsSubAssembler( - client: INostrClient, + client: NostrClient, val cache: LocalCache, allKeys: () -> Set, ) : SingleSubEoseManager(client, allKeys) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserReportsSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserReportsSubAssembler.kt index fd2e68532d..1822f310a4 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserReportsSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserReportsSubAssembler.kt @@ -27,14 +27,14 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relayClient.reqCommand.user.UserFinderQueryState import com.vitorpamplona.amethyst.service.relays.MutableTime import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.utils.mapOfSet class UserReportsSubAssembler( - client: INostrClient, + client: NostrClient, val cache: LocalCache, allKeys: () -> Set, ) : SingleSubEoseManager(client, allKeys) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserWatcherSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserWatcherSubAssembler.kt index 4975a63a91..4d7ea00235 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserWatcherSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/user/watchers/UserWatcherSubAssembler.kt @@ -27,15 +27,15 @@ import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relayClient.reqCommand.user.UserFinderQueryState import com.vitorpamplona.amethyst.service.relays.EOSEAccountFast import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.groupByRelay -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.utils.TimeUtils class UserWatcherSubAssembler( - client: INostrClient, + client: NostrClient, val cache: LocalCache, allKeys: () -> Set, ) : BaseEoseManager(client, allKeys) { @@ -61,8 +61,8 @@ class UserWatcherSubAssembler( val sub = requestNewSubscription( - object : IRequestListener { - override fun onEose( + object : SubscriptionListener { + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -71,11 +71,11 @@ class UserWatcherSubAssembler( override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isLive) { + if (isRealTime) { newEose(relay, TimeUtils.now(), forFilters) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/searchCommand/SearchFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/searchCommand/SearchFilterAssembler.kt index ebbd64c4aa..7f2533ac2c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/searchCommand/SearchFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/searchCommand/SearchFilterAssembler.kt @@ -27,7 +27,7 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.service.relayClient.searchCommand.subassemblies.SearchPostWatcherSubAssembler import com.vitorpamplona.amethyst.service.relayClient.searchCommand.subassemblies.SearchUserWatcherSubAssembler -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -42,7 +42,7 @@ class SearchQueryState( @Stable class SearchFilterAssembler( - client: INostrClient, + client: NostrClient, scope: CoroutineScope, val cache: LocalCache, ) : MutableComposeSubscriptionManager(scope) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/searchCommand/subassemblies/SearchPostWatcherSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/searchCommand/subassemblies/SearchPostWatcherSubAssembler.kt index 94b63bcadf..32a0a4839d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/searchCommand/subassemblies/SearchPostWatcherSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/searchCommand/subassemblies/SearchPostWatcherSubAssembler.kt @@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUniqueIdEo import com.vitorpamplona.amethyst.service.relayClient.searchCommand.SearchQueryState import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.quartz.nip01Core.core.toHexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip19Bech32.Nip19Parser import com.vitorpamplona.quartz.nip19Bech32.entities.NAddress @@ -44,7 +44,7 @@ import com.vitorpamplona.quartz.utils.Hex */ class SearchPostWatcherSubAssembler( val cache: LocalCache, - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUniqueIdEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/searchCommand/subassemblies/SearchUserWatcherSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/searchCommand/subassemblies/SearchUserWatcherSubAssembler.kt index 1fa7801e6e..412021ad2e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/searchCommand/subassemblies/SearchUserWatcherSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/searchCommand/subassemblies/SearchUserWatcherSubAssembler.kt @@ -26,7 +26,7 @@ import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUniqueIdEo import com.vitorpamplona.amethyst.service.relayClient.searchCommand.SearchQueryState import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.quartz.nip01Core.core.toHexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip19Bech32.Nip19Parser import com.vitorpamplona.quartz.nip19Bech32.entities.NAddress @@ -45,7 +45,7 @@ import com.vitorpamplona.quartz.utils.Hex */ class SearchUserWatcherSubAssembler( val cache: LocalCache, - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUniqueIdEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/speedLogger/RelaySpeedLogger.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/speedLogger/RelaySpeedLogger.kt index 8bceccb658..4c57edd720 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/speedLogger/RelaySpeedLogger.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/speedLogger/RelaySpeedLogger.kt @@ -20,8 +20,8 @@ */ package com.vitorpamplona.amethyst.service.relayClient.speedLogger -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.EventMessage import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message @@ -32,7 +32,7 @@ import com.vitorpamplona.quartz.utils.bytesUsedInMemory * Listens to NostrClient's onNotify messages from the relay */ class RelaySpeedLogger( - val client: INostrClient, + val client: NostrClient, ) { companion object { val TAG: String = RelaySpeedLogger::class.java.simpleName @@ -41,7 +41,7 @@ class RelaySpeedLogger( var current = FrameStat() private val clientListener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onIncomingMessage( relay: IRelayClient, msgStr: String, @@ -55,7 +55,7 @@ class RelaySpeedLogger( init { Log.d(TAG, "Init, Subscribe") - client.subscribe(clientListener) + client.addConnectionListener(clientListener) // OkHttpDebugLogging.enableHttp2() // OkHttpDebugLogging.enableTaskRunner() } @@ -63,6 +63,6 @@ class RelaySpeedLogger( fun destroy() { // makes sure to run Log.d(TAG, "Destroy, Unsubscribe") - client.unsubscribe(clientListener) + client.removeConnectionListener(clientListener) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountSessionManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountSessionManager.kt index 4bd3202fd2..2d8628574d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountSessionManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/AccountSessionManager.kt @@ -38,7 +38,7 @@ import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray import com.vitorpamplona.quartz.nip01Core.core.toHexKey import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerSync import com.vitorpamplona.quartz.nip02FollowList.ContactListEvent import com.vitorpamplona.quartz.nip02FollowList.tags.ContactTag @@ -94,7 +94,7 @@ sealed class AccountState { class AccountSessionManager( val accountsCache: AccountCacheState, val nip05ClientBuilder: () -> Nip05Client, - val clientBuilder: () -> INostrClient, + val clientBuilder: () -> NostrClient, val localPreferences: LocalPreferences, val scope: CoroutineScope, ) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt index dddd785350..0563450f3b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt @@ -98,7 +98,6 @@ import com.vitorpamplona.quartz.nip01Core.core.toHexKey import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair import com.vitorpamplona.quartz.nip01Core.hints.EventHintBundle import com.vitorpamplona.quartz.nip01Core.relay.client.EmptyNostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.RelayOfflineTracker import com.vitorpamplona.quartz.nip01Core.relay.client.auth.EmptyIAuthStatus import com.vitorpamplona.quartz.nip01Core.relay.client.auth.RelayAuthenticator @@ -220,7 +219,7 @@ class AccountViewModel( val customScope = CoroutineScope(viewModelScope.coroutineContext + SupervisorJob()) // Provides a relay pool - val newClient = NostrClient(Amethyst.instance.websocketBuilder, customScope) + val newClient = DefaultNostrClient(Amethyst.instance.websocketBuilder, customScope) // Authenticates with relays. val auth = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/privateDM/datasource/ChatroomFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/privateDM/datasource/ChatroomFilterAssembler.kt index b5cc945fcd..e8a6c69066 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/privateDM/datasource/ChatroomFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/privateDM/datasource/ChatroomFilterAssembler.kt @@ -22,7 +22,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.privateDM.datasource import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManagers.ComposeSubscriptionManager import com.vitorpamplona.amethyst.model.Account -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip17Dm.base.ChatroomKey // This allows multiple screen to be listening to tags, even the same tag @@ -34,7 +34,7 @@ class ChatroomQueryState( } class ChatroomFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/privateDM/datasource/ChatroomFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/privateDM/datasource/ChatroomFilterSubAssembler.kt index 0d451daecf..4c427295a7 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/privateDM/datasource/ChatroomFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/privateDM/datasource/ChatroomFilterSubAssembler.kt @@ -22,11 +22,11 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.privateDM.datasource import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserAndFollowListEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class ChatroomFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserAndFollowListEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/datasource/ChannelFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/datasource/ChannelFilterAssembler.kt index 3edc54fdb2..4855bf7eec 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/datasource/ChannelFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/datasource/ChannelFilterAssembler.kt @@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManager import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.publicChannels.datasource.subassemblies.ChannelFromUserFilterSubAssembler import com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.publicChannels.datasource.subassemblies.ChannelPublicFilterSubAssembler -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient // This allows multiple screen to be listening to tags, even the same tag class ChannelQueryState( @@ -34,7 +34,7 @@ class ChannelQueryState( ) class ChannelFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/datasource/subassemblies/ChannelFromUserFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/datasource/subassemblies/ChannelFromUserFilterSubAssembler.kt index 70fea4c935..db89c4285b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/datasource/subassemblies/ChannelFromUserFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/datasource/subassemblies/ChannelFromUserFilterSubAssembler.kt @@ -27,11 +27,11 @@ import com.vitorpamplona.amethyst.commons.model.nip53LiveActivities.LiveActiviti import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserAndFollowListEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.publicChannels.datasource.ChannelQueryState -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class ChannelFromUserFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserAndFollowListEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/datasource/subassemblies/ChannelPublicFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/datasource/subassemblies/ChannelPublicFilterSubAssembler.kt index 6fab0c332a..ad10706f55 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/datasource/subassemblies/ChannelPublicFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/publicChannels/datasource/subassemblies/ChannelPublicFilterSubAssembler.kt @@ -27,11 +27,11 @@ import com.vitorpamplona.amethyst.commons.model.nip53LiveActivities.LiveActiviti import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUniqueIdEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.publicChannels.datasource.ChannelQueryState -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class ChannelPublicFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUniqueIdEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/ChatroomListFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/ChatroomListFilterAssembler.kt index 2b9c534502..644f705fa1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/ChatroomListFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/ChatroomListFilterAssembler.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.rooms.datasource import androidx.compose.runtime.Stable import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManagers.ComposeSubscriptionManager import com.vitorpamplona.amethyst.model.Account -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient // This allows multiple screen to be listening to tags, even the same tag @Stable @@ -33,7 +33,7 @@ class ChatroomListState( @Stable class ChatroomListFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/DMsFromUserFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/DMsFromUserFilterSubAssembler.kt index 410e03d59b..d4bab373ed 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/DMsFromUserFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/DMsFromUserFilterSubAssembler.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.rooms.datasource import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import kotlinx.coroutines.Dispatchers @@ -33,7 +33,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch class DMsFromUserFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/FollowingEphemeralChatSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/FollowingEphemeralChatSubAssembler.kt index ad6ca0ddb7..55b4570674 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/FollowingEphemeralChatSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/FollowingEphemeralChatSubAssembler.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.rooms.datasource import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import kotlinx.coroutines.Dispatchers @@ -34,7 +34,7 @@ import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch class FollowingEphemeralChatSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/FollowingPublicChatSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/FollowingPublicChatSubAssembler.kt index 98c66b737e..8a927ead63 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/FollowingPublicChatSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/datasource/FollowingPublicChatSubAssembler.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.rooms.datasource import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import kotlinx.coroutines.Dispatchers @@ -34,7 +34,7 @@ import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch class FollowingPublicChatSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/datasource/ChessFeedFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/datasource/ChessFeedFilterSubAssembler.kt index 3a1cccd1d7..3bb6d12b39 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/datasource/ChessFeedFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/datasource/ChessFeedFilterSubAssembler.kt @@ -22,7 +22,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.chess.datasource import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUniqueIdEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -42,7 +42,7 @@ data class ChessQueryState( * Sub-assembler that creates the actual relay filters */ class ChessFeedFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUniqueIdEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/datasource/ChessFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/datasource/ChessFilterAssembler.kt index 04a4fc5b98..ba918bf296 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/datasource/ChessFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chess/datasource/ChessFilterAssembler.kt @@ -21,13 +21,13 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.chess.datasource import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManagers.ComposeSubscriptionManager -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient /** * Filter assembler for chess events */ class ChessFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/communities/datasource/CommunityFeedFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/communities/datasource/CommunityFeedFilterSubAssembler.kt index d3571be89c..8d68110dae 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/communities/datasource/CommunityFeedFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/communities/datasource/CommunityFeedFilterSubAssembler.kt @@ -23,13 +23,13 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.communities.datasource import com.vitorpamplona.amethyst.commons.relayClient.eoseManagers.SingleSubEoseManager import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip72ModCommunities.definition.CommunityDefinitionEvent import com.vitorpamplona.quartz.utils.mapOfSet class CommunityFeedFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : SingleSubEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/communities/datasource/CommunityFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/communities/datasource/CommunityFilterAssembler.kt index fdb60d00d0..71974a410c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/communities/datasource/CommunityFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/communities/datasource/CommunityFilterAssembler.kt @@ -22,7 +22,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.communities.datasource import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManagers.ComposeSubscriptionManager import com.vitorpamplona.amethyst.model.AddressableNote -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient // This allows multiple screen to be listening to tags, even the same tag class CommunityQueryState( @@ -30,7 +30,7 @@ class CommunityQueryState( ) class CommunityFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryFilterAssembler.kt index dc49d49b5e..6792b29afd 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryFilterAssembler.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.discover.datasource import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManagers.ComposeSubscriptionManager import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountFeedContentStates -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import kotlinx.coroutines.CoroutineScope // This allows multiple screen to be listening to tags, even the same tag @@ -34,7 +34,7 @@ class DiscoveryQueryState( ) class DiscoveryFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryFollowsSetsAndLiveStreamsSubAssembler2.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryFollowsSetsAndLiveStreamsSubAssembler2.kt index 78eb084d1b..d3d5be3aef 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryFollowsSetsAndLiveStreamsSubAssembler2.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryFollowsSetsAndLiveStreamsSubAssembler2.kt @@ -26,7 +26,7 @@ import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserAndFol import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.amethyst.ui.screen.loggedIn.discover.nip51FollowSets.makeFollowSetsFilter import com.vitorpamplona.amethyst.ui.screen.loggedIn.discover.nip53LiveActivities.makeLiveActivitiesFilter -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import kotlinx.coroutines.Dispatchers @@ -38,7 +38,7 @@ import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch class DiscoveryFollowsSetsAndLiveStreamsSubAssembler2( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserAndFollowListEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryLongFormClassifiedsAndDVMSubAssembler1.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryLongFormClassifiedsAndDVMSubAssembler1.kt index 941b95c28c..40279083d4 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryLongFormClassifiedsAndDVMSubAssembler1.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryLongFormClassifiedsAndDVMSubAssembler1.kt @@ -27,7 +27,7 @@ import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.amethyst.ui.screen.loggedIn.discover.nip23LongForm.makeLongFormFilter import com.vitorpamplona.amethyst.ui.screen.loggedIn.discover.nip90DVMs.makeContentDVMsFilter import com.vitorpamplona.amethyst.ui.screen.loggedIn.discover.nip99Classifieds.makeClassifiedsFilter -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import kotlinx.coroutines.Dispatchers @@ -39,7 +39,7 @@ import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch class DiscoveryLongFormClassifiedsAndDVMSubAssembler1( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserAndFollowListEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryPublicChatsAndCommunitiesSubAssembler3.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryPublicChatsAndCommunitiesSubAssembler3.kt index a6e94c133b..78ebfa01de 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryPublicChatsAndCommunitiesSubAssembler3.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/datasource/DiscoveryPublicChatsAndCommunitiesSubAssembler3.kt @@ -26,7 +26,7 @@ import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserAndFol import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.amethyst.ui.screen.loggedIn.discover.nip28Chats.makePublicChatsFilter import com.vitorpamplona.amethyst.ui.screen.loggedIn.discover.nip72Communities.makeCommunitiesFilter -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import kotlinx.coroutines.Dispatchers @@ -38,7 +38,7 @@ import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch class DiscoveryPublicChatsAndCommunitiesSubAssembler3( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserAndFollowListEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/feed/datasource/FollowPackFeedFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/feed/datasource/FollowPackFeedFilterAssembler.kt index 940414cc4d..8747454839 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/feed/datasource/FollowPackFeedFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/feed/datasource/FollowPackFeedFilterAssembler.kt @@ -24,7 +24,7 @@ import androidx.compose.runtime.Stable import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManagers.ComposeSubscriptionManager import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.AddressableNote -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient // This allows multiple screen to be listening to tags, even the same tag class FollowPackFeedQueryState( @@ -34,7 +34,7 @@ class FollowPackFeedQueryState( @Stable class FollowPackFeedFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/feed/datasource/FollowPackFeedFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/feed/datasource/FollowPackFeedFilterSubAssembler.kt index 08f100400c..853e3d3461 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/feed/datasource/FollowPackFeedFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/feed/datasource/FollowPackFeedFilterSubAssembler.kt @@ -25,12 +25,12 @@ import com.vitorpamplona.amethyst.model.topNavFeeds.allUserFollows.AllUserFollow import com.vitorpamplona.amethyst.model.topNavFeeds.allUserFollows.AllUserFollowsByProxyTopNavFilter import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.amethyst.ui.screen.loggedIn.home.datasource.nip65Follows.filterHomePostsByAuthors -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip51Lists.followList.FollowListEvent class FollowPackFeedFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : SingleSubEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/datasource/GeoHashFeedFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/datasource/GeoHashFeedFilterSubAssembler.kt index 9d7fe94ab9..65e2f3d33e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/datasource/GeoHashFeedFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/datasource/GeoHashFeedFilterSubAssembler.kt @@ -22,11 +22,11 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.geohash.datasource import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUniqueIdEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class GeoHashFeedFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUniqueIdEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/datasource/GeoHashFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/datasource/GeoHashFilterAssembler.kt index af5257fa67..af98d9faaa 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/datasource/GeoHashFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/datasource/GeoHashFilterAssembler.kt @@ -22,7 +22,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.geohash.datasource import androidx.compose.runtime.Stable import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManagers.ComposeSubscriptionManager -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl // This allows multiple screen to be listening to tags, even the same tag @@ -38,7 +38,7 @@ class GeohashQueryState( */ @Stable class GeoHashFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/hashtag/datasource/HashtagFeedFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/hashtag/datasource/HashtagFeedFilterSubAssembler.kt index 23a6b1d224..e3156b9f50 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/hashtag/datasource/HashtagFeedFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/hashtag/datasource/HashtagFeedFilterSubAssembler.kt @@ -22,11 +22,11 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.hashtag.datasource import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUniqueIdEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class HashtagFeedFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUniqueIdEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/hashtag/datasource/HashtagFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/hashtag/datasource/HashtagFilterAssembler.kt index 55a481ed2e..dd3bfa7a3a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/hashtag/datasource/HashtagFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/hashtag/datasource/HashtagFilterAssembler.kt @@ -21,7 +21,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.hashtag.datasource import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManagers.ComposeSubscriptionManager -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl // This allows multiple screen to be listening to tags, even the same tag @@ -33,7 +33,7 @@ class HashtagQueryState( } class HashtagFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/HomeFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/HomeFilterAssembler.kt index e76959df4b..6771f1313b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/HomeFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/HomeFilterAssembler.kt @@ -25,7 +25,7 @@ import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManager import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountFeedContentStates import com.vitorpamplona.amethyst.ui.screen.loggedIn.home.datasource.nip65Follows.HomeOutboxEventsEoseManager -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import kotlinx.coroutines.CoroutineScope // This allows multiple screen to be listening to tags, even the same tag @@ -39,7 +39,7 @@ class HomeQueryState( @Stable class HomeFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip65Follows/HomeOutboxEventsEoseManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip65Follows/HomeOutboxEventsEoseManager.kt index ff7f313654..075611e1f2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip65Follows/HomeOutboxEventsEoseManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/datasource/nip65Follows/HomeOutboxEventsEoseManager.kt @@ -40,7 +40,7 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.home.datasource.nip01Core.f import com.vitorpamplona.amethyst.ui.screen.loggedIn.home.datasource.nip64Chess.filterHomePostsByChess import com.vitorpamplona.amethyst.ui.screen.loggedIn.home.datasource.nip72Communities.filterHomePostsByAllCommunities import com.vitorpamplona.amethyst.ui.screen.loggedIn.home.datasource.nip72Communities.filterHomePostsByCommunity -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import kotlinx.coroutines.Dispatchers @@ -51,7 +51,7 @@ import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch class HomeOutboxEventsEoseManager( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserAndFollowListEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileFilterAssembler.kt index b57daf7ce3..6080659e18 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileFilterAssembler.kt @@ -22,7 +22,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.profile.datasource import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManagers.ComposeSubscriptionManager import com.vitorpamplona.amethyst.model.User -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient // This allows multiple screen to be listening to tags, even the same tag class UserProfileQueryState( @@ -30,7 +30,7 @@ class UserProfileQueryState( ) class UserProfileFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileFollowersFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileFollowersFilterSubAssembler.kt index 6fe462fe8e..e15a7514c2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileFollowersFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileFollowersFilterSubAssembler.kt @@ -22,11 +22,11 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.profile.datasource import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class UserProfileFollowersFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileMediaFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileMediaFilterSubAssembler.kt index 1066b7f537..40f6de9754 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileMediaFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileMediaFilterSubAssembler.kt @@ -22,11 +22,11 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.profile.datasource import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class UserProfileMediaFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileMetadataFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileMetadataFilterSubAssembler.kt index e6d21c9338..abfb6182bc 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileMetadataFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileMetadataFilterSubAssembler.kt @@ -23,12 +23,12 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.profile.datasource import com.vitorpamplona.amethyst.commons.relayClient.eoseManagers.SingleSubEoseManager import com.vitorpamplona.amethyst.model.LocalCache import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.utils.mapOfSet class UserProfileMetadataFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : SingleSubEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfilePostsFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfilePostsFilterSubAssembler.kt index 2ef23e9a92..ec945b2b9e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfilePostsFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfilePostsFilterSubAssembler.kt @@ -22,11 +22,11 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.profile.datasource import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class UserProfilePostsFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileZapsFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileZapsFilterSubAssembler.kt index 5546024d08..8de29250d0 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileZapsFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/datasource/UserProfileZapsFilterSubAssembler.kt @@ -22,11 +22,11 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.profile.datasource import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUserEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class UserProfileZapsFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relay/datasource/RelayFeedFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relay/datasource/RelayFeedFilterAssembler.kt index a439a9d43a..0878a3f0c1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relay/datasource/RelayFeedFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relay/datasource/RelayFeedFilterAssembler.kt @@ -21,7 +21,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.relay.datasource import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManagers.ComposeSubscriptionManager -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl // This allows multiple screens to be listening to the same or different relay feeds. @@ -30,7 +30,7 @@ class RelayFeedQueryState( ) class RelayFeedFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relay/datasource/RelayFeedFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relay/datasource/RelayFeedFilterSubAssembler.kt index 2a90bd26b0..de6a9fb364 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relay/datasource/RelayFeedFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relay/datasource/RelayFeedFilterSubAssembler.kt @@ -22,11 +22,11 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.relay.datasource import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUniqueIdEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class RelayFeedFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUniqueIdEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/common/BasicRelaySetupInfoModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/common/BasicRelaySetupInfoModel.kt index 91bc1f373b..af9899177d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/common/BasicRelaySetupInfoModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/common/BasicRelaySetupInfoModel.kt @@ -26,7 +26,7 @@ import com.vitorpamplona.amethyst.Amethyst import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.service.replace import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel -import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.queryCountSuspend +import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.count import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow @@ -99,7 +99,7 @@ abstract class BasicRelaySetupInfoModel : ViewModel() { filters.forEach { countFilter -> viewModelScope.launch(Dispatchers.IO) { - val result = client.queryCountSuspend(item.relay, countFilter.filter) + val result = client.count(item.relay, countFilter.filter) if (result != null) { _countResults.update { currentMap -> val current = currentMap[item.relay] ?: RelayCountResult() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/datasource/RelayInfoNip66FilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/datasource/RelayInfoNip66FilterAssembler.kt index 8a2654284a..f0961ba0d4 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/datasource/RelayInfoNip66FilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/datasource/RelayInfoNip66FilterAssembler.kt @@ -21,7 +21,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.relays.datasource import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManagers.ComposeSubscriptionManager -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl class RelayInfoNip66QueryState( @@ -30,7 +30,7 @@ class RelayInfoNip66QueryState( ) class RelayInfoNip66FilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/datasource/RelayInfoNip66FilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/datasource/RelayInfoNip66FilterSubAssembler.kt index 676288ee0a..253c145607 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/datasource/RelayInfoNip66FilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/datasource/RelayInfoNip66FilterSubAssembler.kt @@ -22,13 +22,13 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.relays.datasource import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUniqueIdEoseManager import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip66RelayMonitor.discovery.RelayDiscoveryEvent class RelayInfoNip66FilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUniqueIdEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/eventsync/EventSync.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/eventsync/EventSync.kt index fe2efdfe15..59d08dfaee 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/eventsync/EventSync.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/eventsync/EventSync.kt @@ -27,9 +27,9 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.relays.eventsync.EventSync. import com.vitorpamplona.amethyst.ui.screen.loggedIn.relays.eventsync.EventSync.LiveSyncActivity.SourceRelayInfo import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.reqBypassingRelayLimits -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.fetchAllPages +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.OkMessage @@ -65,7 +65,7 @@ import kotlin.coroutines.cancellation.CancellationException * Each relay is paginated individually: after EOSE the oldest [Event.createdAt] seen on that * relay becomes the next `until` cursor, repeating until the relay returns no new events. * - * OK (true) responses from destination relays are tracked via [IRelayClientListener] and + * OK (true) responses from destination relays are tracked via [RelayConnectionListener] and * attributed back to the source relay that contributed each event. * * Live activity is emitted via [liveActivity] so the UI can show a per-relay log of events @@ -80,7 +80,7 @@ class EventSync( private val outboxTargets: () -> Set, private val inboxTargets: () -> Set, private val dmTargets: () -> Set, - private val clientBuilder: () -> INostrClient, + private val clientBuilder: () -> NostrClient, private val scope: CoroutineScope, ) { companion object { @@ -406,7 +406,7 @@ class EventSync( ) val okListener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onCannotConnect( relay: IRelayClient, errorMessage: String, @@ -500,7 +500,7 @@ class EventSync( _syncState.emit(runningState) clientBuilder().use { client -> - client.subscribe(okListener) + client.addConnectionListener(okListener) try { client.downloadFromPool( relays = relaysToProcess, @@ -523,21 +523,21 @@ class EventSync( // Each routing rule is independent: an event can match more than one. if (isMyEvent && outboxTargets.isNotEmpty()) { if (outboxDedup.add(event.id)) { - client.send(event, outboxTargets) + client.publish(event, outboxTargets) newEvent = true } matchesAtLeastOneFilter = true } if (mentionsMe && isDmKind && dmTargets.isNotEmpty()) { if (dmDedup.add(event.id)) { - client.send(event, dmTargets) + client.publish(event, dmTargets) newEvent = true } matchesAtLeastOneFilter = true } if (mentionsMe && !isDmKind && inboxTargets.isNotEmpty()) { if (inboxDedup.add(event.id)) { - client.send(event, inboxTargets) + client.publish(event, inboxTargets) newEvent = true } matchesAtLeastOneFilter = true @@ -610,7 +610,7 @@ class EventSync( if (e is CancellationException) throw e _syncState.value = SyncState.Error(e.message ?: "Unknown error", filterSince, filterUntil) } finally { - client.unsubscribe(okListener) + client.removeConnectionListener(okListener) } } } @@ -622,7 +622,7 @@ class EventSync( * * [onEvent] receives the event and the URL of the relay it came from. */ - private suspend fun INostrClient.downloadFromPool( + private suspend fun NostrClient.downloadFromPool( relays: List, filters: Map>, onNewPage: (Long, NormalizedRelayUrl) -> Unit, @@ -661,10 +661,10 @@ class EventSync( * * @return total number of events received across all pages. */ - private suspend fun INostrClient.downloadFromRelay( + private suspend fun NostrClient.downloadFromRelay( relay: NormalizedRelayUrl, filters: List, onNewPage: (Long) -> Unit, onEvent: (Event) -> Unit, - ): Int = reqBypassingRelayLimits(relay, filters, RELAY_TIMEOUT_MS, onNewPage, onEvent) + ): Int = fetchAllPages(relay, filters, RELAY_TIMEOUT_MS, onNewPage, onEvent) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/nip65/Nip65RelayListViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/nip65/Nip65RelayListViewModel.kt index 04e67671ba..36e7258212 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/nip65/Nip65RelayListViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/nip65/Nip65RelayListViewModel.kt @@ -31,7 +31,7 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.relays.common.BasicRelaySetupInfo import com.vitorpamplona.amethyst.ui.screen.loggedIn.relays.common.RelayCountResult import com.vitorpamplona.amethyst.ui.screen.loggedIn.relays.common.relaySetupInfoBuilder -import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.queryCountSuspend +import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.count import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip65RelayList.tags.AdvertisedRelayInfo @@ -131,7 +131,7 @@ class Nip65RelayListViewModel : ViewModel() { _homeRelays.value.forEach { item -> viewModelScope.launch(Dispatchers.IO) { - val result = client.queryCountSuspend(item.relay, Filter(authors = listOf(account.pubKey))) + val result = client.count(item.relay, Filter(authors = listOf(account.pubKey))) if (result != null) { val countResult = RelayCountResult( @@ -150,7 +150,7 @@ class Nip65RelayListViewModel : ViewModel() { _notificationRelays.value.forEach { item -> viewModelScope.launch(Dispatchers.IO) { - val result = client.queryCountSuspend(item.relay, Filter(tags = mapOf("p" to listOf(account.pubKey)))) + val result = client.count(item.relay, Filter(tags = mapOf("p" to listOf(account.pubKey)))) if (result != null) { val countResult = RelayCountResult( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/datasources/ThreadFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/datasources/ThreadFilterAssembler.kt index 9cb7560137..7e74b504cd 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/datasources/ThreadFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/datasources/ThreadFilterAssembler.kt @@ -26,7 +26,7 @@ import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.ui.screen.loggedIn.threadview.datasources.subassembies.ThreadEventLoaderSubAssembler import com.vitorpamplona.amethyst.ui.screen.loggedIn.threadview.datasources.subassembies.ThreadFilterSubAssembler import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient // This allows multiple screen to be listening to tags, even the same tag @Stable @@ -37,7 +37,7 @@ class ThreadQueryState( @Stable class ThreadFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/datasources/subassembies/ThreadEventLoaderSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/datasources/subassembies/ThreadEventLoaderSubAssembler.kt index f9a465a27d..1fdf5bbeb5 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/datasources/subassembies/ThreadEventLoaderSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/datasources/subassembies/ThreadEventLoaderSubAssembler.kt @@ -26,7 +26,7 @@ import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUniqueIdEo import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.amethyst.ui.screen.loggedIn.threadview.datasources.ThreadQueryState import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter /** @@ -39,7 +39,7 @@ import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter * saves the of the thread EOSEs in the long run to avoid re-downloading */ class ThreadEventLoaderSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUniqueIdEoseManager(client, allKeys, invalidateAfterEose = true) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/datasources/subassembies/ThreadFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/datasources/subassembies/ThreadFilterSubAssembler.kt index ac089db908..40b86b66bf 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/datasources/subassembies/ThreadFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/threadview/datasources/subassembies/ThreadFilterSubAssembler.kt @@ -26,7 +26,7 @@ import com.vitorpamplona.amethyst.service.relayClient.eoseManagers.PerUniqueIdEo import com.vitorpamplona.amethyst.service.relays.SincePerRelayMap import com.vitorpamplona.amethyst.ui.screen.loggedIn.threadview.datasources.ThreadQueryState import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter /** @@ -36,7 +36,7 @@ import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter * saves the of the thread EOSEs in the long run to avoid re-downloading */ class ThreadFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUniqueIdEoseManager(client, allKeys) { override fun updateFilter( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/datasource/VideoFilterAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/datasource/VideoFilterAssembler.kt index ca5fa42e7d..5a4e970d3f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/datasource/VideoFilterAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/datasource/VideoFilterAssembler.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.commons.relayClient.composeSubscriptionManager import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountFeedContentStates import com.vitorpamplona.amethyst.ui.screen.loggedIn.video.datasource.subassemblies.VideoOutboxEventsFilterSubAssembler -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import kotlinx.coroutines.CoroutineScope // This allows multiple screen to be listening to tags, even the same tag @@ -35,7 +35,7 @@ class VideoQueryState( ) class VideoFilterAssembler( - client: INostrClient, + client: NostrClient, ) : ComposeSubscriptionManager() { val group = listOf( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/datasource/subassemblies/VideoOutboxEventsFilterSubAssembler.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/datasource/subassemblies/VideoOutboxEventsFilterSubAssembler.kt index 5b02873027..c4cf933a37 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/datasource/subassemblies/VideoOutboxEventsFilterSubAssembler.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/datasource/subassemblies/VideoOutboxEventsFilterSubAssembler.kt @@ -40,7 +40,7 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.video.datasource.subassembl import com.vitorpamplona.amethyst.ui.screen.loggedIn.video.datasource.subassemblies.nip65Follows.filterPictureAndVideoByFollows import com.vitorpamplona.amethyst.ui.screen.loggedIn.video.datasource.subassemblies.nip72Communities.filterPictureAndVideoByAllCommunities import com.vitorpamplona.amethyst.ui.screen.loggedIn.video.datasource.subassemblies.nip72Communities.filterPictureAndVideoByCommunity -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import com.vitorpamplona.quartz.utils.TimeUtils @@ -52,7 +52,7 @@ import kotlinx.coroutines.flow.sample import kotlinx.coroutines.launch class VideoOutboxEventsFilterSubAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : PerUserAndFollowListEoseManager(client, allKeys) { override fun updateFilter( diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessRelayFetchHelper.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessRelayFetchHelper.kt index 4a713d3793..aa5233d11a 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessRelayFetchHelper.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessRelayFetchHelper.kt @@ -21,8 +21,8 @@ package com.vitorpamplona.amethyst.commons.chess import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.newSubId import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -49,7 +49,7 @@ enum class RelayFetchStatus { /** * One-shot relay fetch helper for chess events. * - * Follows the existing INostrClient + IRequestListener + Channel pattern + * Follows the existing NostrClient + SubscriptionListener + Channel pattern * from quartz (see NostrClientSingleDownloadExt.kt). * * Each fetch opens a subscription, collects events until EOSE from all relays, @@ -57,12 +57,12 @@ enum class RelayFetchStatus { * no state is cached between fetches. */ class ChessRelayFetchHelper( - private val client: INostrClient, + private val client: NostrClient, ) { /** * Fetch events matching filters from relays, waiting for EOSE. * - * @param filters Map of relay → filter list (same format as INostrClient.openReqSubscription) + * @param filters Map of relay → filter list (same format as NostrClient.subscribe) * @param timeoutMs Max time to wait for relays to respond (default from ChessConfig) * @param onProgress Optional callback for progress updates per relay * @return Deduplicated list of events received before timeout/EOSE @@ -88,10 +88,10 @@ class ChessRelayFetchHelper( } val listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -100,7 +100,7 @@ class ChessRelayFetchHelper( onProgress?.invoke(RelayFetchProgress(relay, RelayFetchStatus.RECEIVING, count)) } - override fun onEose( + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -114,7 +114,7 @@ class ChessRelayFetchHelper( } } - client.openReqSubscription(subId, filters, listener) + client.subscribe(subId, filters, listener) val eoseResult = withTimeoutOrNull(timeoutMs) { allEose.await() } // Mark timed-out relays @@ -127,7 +127,7 @@ class ChessRelayFetchHelper( } } - client.close(subId) + client.unsubscribe(subId) return events.values.toList() } diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/domain/nip46/BunkerLoginUseCase.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/domain/nip46/BunkerLoginUseCase.kt index 4962f5e3ee..241773ac65 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/domain/nip46/BunkerLoginUseCase.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/domain/nip46/BunkerLoginUseCase.kt @@ -20,7 +20,7 @@ */ package com.vitorpamplona.amethyst.commons.domain.nip46 -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal import com.vitorpamplona.quartz.nip46RemoteSigner.signer.NostrSignerRemote import kotlinx.coroutines.flow.first @@ -32,7 +32,7 @@ object BunkerLoginUseCase { suspend fun execute( bunkerUri: String, ephemeralSigner: NostrSignerInternal, - client: INostrClient, + client: NostrClient, ): BunkerLoginResult { val remoteSigner = NostrSignerRemote.fromBunkerUri(bunkerUri, ephemeralSigner, client) remoteSigner.openSubscription() diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/domain/nip46/NostrConnectLoginUseCase.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/domain/nip46/NostrConnectLoginUseCase.kt index 6725ef332f..72c7efba35 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/domain/nip46/NostrConnectLoginUseCase.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/domain/nip46/NostrConnectLoginUseCase.kt @@ -24,8 +24,8 @@ import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.core.OptimizedJsonMapper import com.vitorpamplona.quartz.nip01Core.core.toHexKey import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.req +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.StaticSubscription import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal @@ -83,7 +83,7 @@ object NostrConnectLoginUseCase { suspend fun awaitAndLogin( uriData: NostrConnectUri, - client: INostrClient, + client: NostrClient, ): BunkerLoginResult { val connectData = waitForConnectRequest( @@ -117,19 +117,22 @@ object NostrConnectLoginUseCase { ephemeralPubKey: HexKey, relays: Set, expectedSecret: String, - client: INostrClient, + client: NostrClient, ): ConnectRequestData { val deferred = CompletableDeferred() val subscription = - client.req( - relays = relays.toList(), - filter = - Filter( - kinds = listOf(NostrConnectEvent.KIND), - tags = mapOf("p" to listOf(ephemeralPubKey)), - since = TimeUtils.now() - 60, - ), + StaticSubscription( + client, + relays.associateWith { + listOf( + Filter( + kinds = listOf(NostrConnectEvent.KIND), + tags = mapOf("p" to listOf(ephemeralPubKey)), + since = TimeUtils.now() - 60, + ), + ) + }, ) { event -> if (event is NostrConnectEvent && !deferred.isCompleted) { deferred.complete(event) @@ -198,7 +201,7 @@ object NostrConnectLoginUseCase { ephemeralSigner: NostrSignerInternal, connectData: ConnectRequestData, relays: Set, - client: INostrClient, + client: NostrClient, ) { val ackResponse = BunkerResponseAck(id = connectData.requestId!!) val ackEvent = @@ -207,7 +210,7 @@ object NostrConnectLoginUseCase { remoteKey = connectData.signerPubkey, signer = ephemeralSigner, ) - client.send(ackEvent, relays) + client.publish(ackEvent, relays) } private fun generateSecret(): String { diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/assemblers/FeedMetadataCoordinator.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/assemblers/FeedMetadataCoordinator.kt index c3b836af9b..4cc8df3313 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/assemblers/FeedMetadataCoordinator.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/assemblers/FeedMetadataCoordinator.kt @@ -27,8 +27,8 @@ import com.vitorpamplona.amethyst.commons.relayClient.subscriptions.Subscription import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.newSubId import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -55,7 +55,7 @@ import kotlinx.coroutines.CoroutineScope * ``` */ class FeedMetadataCoordinator( - private val client: INostrClient, + private val client: NostrClient, private val scope: CoroutineScope, private val indexRelays: Set, private val preloader: MetadataPreloader? = null, @@ -79,10 +79,10 @@ class FeedMetadataCoordinator( // Create listener to pass events to the callback val listener = if (onEvent != null) { - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -93,7 +93,7 @@ class FeedMetadataCoordinator( null } - client.openReqSubscription( + client.subscribe( subId = newSubId(), filters = filterMap, listener = listener, diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/assemblers/MetadataFilterAssembler.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/assemblers/MetadataFilterAssembler.kt index 1dffa08b4e..dbc79f2fd2 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/assemblers/MetadataFilterAssembler.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/assemblers/MetadataFilterAssembler.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.amethyst.commons.relayClient.eoseManagers.SingleSubEose import com.vitorpamplona.amethyst.commons.relays.SincePerRelayMap import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -48,7 +48,7 @@ data class MetadataQueryState( * - Caches EOSE to avoid re-fetching known metadata */ class MetadataFilterAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : SingleSubEoseManager(client, allKeys, invalidateAfterEose = true) { override fun distinct(key: MetadataQueryState): Any = key.pubkeys.hashCode() diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/assemblers/ReactionsFilterAssembler.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/assemblers/ReactionsFilterAssembler.kt index 72c371f65d..0d62c8fc65 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/assemblers/ReactionsFilterAssembler.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/assemblers/ReactionsFilterAssembler.kt @@ -23,7 +23,7 @@ package com.vitorpamplona.amethyst.commons.relayClient.assemblers import com.vitorpamplona.amethyst.commons.relayClient.eoseManagers.SingleSubEoseManager import com.vitorpamplona.amethyst.commons.relays.SincePerRelayMap import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -48,7 +48,7 @@ data class ReactionsQueryState( * - Caches EOSE to avoid re-fetching known reactions */ class ReactionsFilterAssembler( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, ) : SingleSubEoseManager(client, allKeys, invalidateAfterEose = true) { override fun distinct(key: ReactionsQueryState): Any = key.noteIds.hashCode() diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/eoseManagers/BaseEoseManager.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/eoseManagers/BaseEoseManager.kt index 8d0393d380..bcc6827d7b 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/eoseManagers/BaseEoseManager.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/eoseManagers/BaseEoseManager.kt @@ -21,14 +21,14 @@ package com.vitorpamplona.amethyst.commons.relayClient.eoseManagers import com.vitorpamplona.amethyst.commons.service.BundledUpdate -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.newSubId import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.SubscriptionController import kotlinx.coroutines.Dispatchers abstract class BaseEoseManager( - val client: INostrClient, + val client: NostrClient, val allKeys: () -> Set, val sampleTime: Long = 500, ) : IEoseManager { @@ -38,7 +38,7 @@ abstract class BaseEoseManager( fun getSubscription(subId: String) = orchestrator.getSub(subId) - fun requestNewSubscription(listener: IRequestListener) = orchestrator.requestNewSubscription(newSubId(), listener) + fun requestNewSubscription(listener: SubscriptionListener) = orchestrator.requestNewSubscription(newSubId(), listener) fun dismissSubscription(subId: String) = orchestrator.dismissSubscription(subId) diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/eoseManagers/PerKeyEoseManager.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/eoseManagers/PerKeyEoseManager.kt index 469227aa19..dc0d2d1f14 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/eoseManagers/PerKeyEoseManager.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/eoseManagers/PerKeyEoseManager.kt @@ -23,10 +23,10 @@ package com.vitorpamplona.amethyst.commons.relayClient.eoseManagers import com.vitorpamplona.amethyst.commons.relays.EOSECache import com.vitorpamplona.amethyst.commons.relays.SincePerRelayMap import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.pool.groupByRelay -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions.Subscription import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -46,7 +46,7 @@ import com.vitorpamplona.quartz.utils.TimeUtils * shared among multiple query states that map to the same key. */ abstract class PerKeyEoseManager( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, val invalidateAfterEose: Boolean = false, cacheSize: Int = 200, @@ -82,8 +82,8 @@ abstract class PerKeyEoseManager( */ open fun newSub(queryState: T): Subscription = requestNewSubscription( - object : IRequestListener { - override fun onEose( + object : SubscriptionListener { + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -92,11 +92,11 @@ abstract class PerKeyEoseManager( override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isLive) { + if (isRealTime) { newEose(queryState, relay, TimeUtils.now(), forFilters) } } diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/eoseManagers/SingleSubEoseManager.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/eoseManagers/SingleSubEoseManager.kt index 6f31c7421b..99ee6c1304 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/eoseManagers/SingleSubEoseManager.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/relayClient/eoseManagers/SingleSubEoseManager.kt @@ -23,10 +23,10 @@ package com.vitorpamplona.amethyst.commons.relayClient.eoseManagers import com.vitorpamplona.amethyst.commons.relays.EOSERelayList import com.vitorpamplona.amethyst.commons.relays.SincePerRelayMap import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip01Core.relay.client.pool.groupByRelay -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.utils.TimeUtils @@ -44,7 +44,7 @@ import com.vitorpamplona.quartz.utils.TimeUtils * shares all EOSEs among all users. */ abstract class SingleSubEoseManager( - client: INostrClient, + client: NostrClient, allKeys: () -> Set, val invalidateAfterEose: Boolean = false, ) : BaseEoseManager(client, allKeys) { @@ -66,8 +66,8 @@ abstract class SingleSubEoseManager( val sub = requestNewSubscription( - object : IRequestListener { - override fun onEose( + object : SubscriptionListener { + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -76,11 +76,11 @@ abstract class SingleSubEoseManager( override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isLive) { + if (isRealTime) { newEose(relay, TimeUtils.now(), forFilters) } } diff --git a/commons/src/jvmAndroid/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventBroadcaster.kt b/commons/src/jvmAndroid/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventBroadcaster.kt index 59c37d4df2..e996f3b7ce 100644 --- a/commons/src/jvmAndroid/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventBroadcaster.kt +++ b/commons/src/jvmAndroid/kotlin/com/vitorpamplona/amethyst/commons/chess/ChessEventBroadcaster.kt @@ -21,9 +21,9 @@ package com.vitorpamplona.amethyst.commons.chess import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.sendAndWaitForResponse -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.publishAndConfirm +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.newSubId import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -42,11 +42,11 @@ data class BroadcastResult( /** * Helper for broadcasting chess events to relays with reliable delivery. * - * Uses sendAndWaitForResponse to get actual OK confirmations from relays, + * Uses publishAndConfirm to get actual OK confirmations from relays, * ensuring the event was actually received and accepted. */ class ChessEventBroadcaster( - private val client: INostrClient, + private val client: NostrClient, ) { /** * Broadcast an event to the chess relays with confirmation. @@ -84,15 +84,15 @@ class ChessEventBroadcaster( ) val listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { } - override fun onEose( + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { } @@ -100,19 +100,19 @@ class ChessEventBroadcaster( // Open subscription to all target relays (triggers connection) val filterMap = targetRelays.associateWith { listOf(dummyFilter) } - client.openReqSubscription(subId, filterMap, listener) + client.subscribe(subId, filterMap, listener) // Wait for relays to connect (poll with timeout) waitForRelays(targetRelays, 5000L) // Close the dummy subscription - client.close(subId) + client.unsubscribe(subId) } // Step 3: Send the event and wait for OK responses - val success = client.sendAndWaitForResponse(event, targetRelays, timeoutSeconds) + val success = client.publishAndConfirm(event, targetRelays, timeoutSeconds) - // Note: sendAndWaitForResponse only returns aggregate success (any relay accepted) + // Note: publishAndConfirm only returns aggregate success (any relay accepted) // We don't have per-relay results, so relayResults is empty return BroadcastResult( success = success, diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/Main.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/Main.kt index 4c73e002bc..96dcbad661 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/Main.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/Main.kt @@ -193,7 +193,7 @@ fun main() { } Window( - onCloseRequest = ::exitApplication, + onSubscriptionCloseduest = ::exitApplication, state = windowState, title = "Amethyst", ) { diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/account/AccountManager.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/account/AccountManager.kt index 7fab08fbc3..e998fb621c 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/account/AccountManager.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/account/AccountManager.kt @@ -30,8 +30,7 @@ import com.vitorpamplona.amethyst.desktop.network.DesktopHttpClient import com.vitorpamplona.quartz.nip01Core.core.hexToByteArray import com.vitorpamplona.quartz.nip01Core.core.toHexKey import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message import com.vitorpamplona.quartz.nip01Core.relay.commands.toRelay.Command @@ -132,11 +131,11 @@ class AccountManager internal constructor( // --- Dedicated NIP-46 client (isolated from general relay pool) --- private val nip46ClientMutex = Mutex() - private var nip46Client: NostrClient? = null + private var nip46Client: DefaultDefaultNostrClient? = null - private suspend fun getOrCreateNip46Client(): NostrClient = + private suspend fun getOrCreateNip46Client(): DefaultNostrClient = nip46ClientMutex.withLock { - nip46Client ?: NostrClient( + nip46Client ?: DefaultNostrClient( BasicOkHttpWebSocket.Builder(DesktopHttpClient::getHttpClient), ).also { nip46Client = it @@ -156,7 +155,7 @@ class AccountManager internal constructor( * but we must wait for the websocket to be ready before sending requests. */ private suspend fun awaitNip46RelayConnection( - client: NostrClient, + client: DefaultNostrClient, targetRelays: Set, ) { withTimeout(NIP46_RELAY_CONNECT_TIMEOUT_MS) { @@ -180,8 +179,8 @@ class AccountManager internal constructor( } } - private fun createLoginRelayListener(): IRelayClientListener = - object : IRelayClientListener { + private fun createLoginRelayListener(): RelayConnectionListener = + object : RelayConnectionListener { override fun onConnected( relay: IRelayClient, pingMillis: Int, @@ -303,7 +302,7 @@ class AccountManager internal constructor( suspend fun loginWithBunker(bunkerUri: String): Result { val listener = createLoginRelayListener() - var client: NostrClient? = null + var client: DefaultDefaultNostrClient? = null try { val ephemeralKeyPair = KeyPair() val ephemeralSigner = NostrSignerInternal(ephemeralKeyPair) @@ -316,7 +315,7 @@ class AccountManager internal constructor( LoginProgress.ConnectingToRelays( relaysFromUri.associateWith { RelayLoginStatus.CONNECTING }, ) - nip46Client.subscribe(listener) + nip46Client.addConnectionListener(listener) _loginProgress.value = LoginProgress.WaitingForSigner( @@ -356,7 +355,7 @@ class AccountManager internal constructor( return Result.failure(Exception("Connection failed: ${e.message}")) } finally { _loginProgress.value = null - client?.unsubscribe(listener) + client?.removeConnectionListener(listener) } } @@ -364,7 +363,7 @@ class AccountManager internal constructor( suspend fun loginWithNostrConnect(onUriGenerated: (String) -> Unit): Result { val listener = createLoginRelayListener() - var client: NostrClient? = null + var client: DefaultDefaultNostrClient? = null try { val ephemeralKeyPair = KeyPair() val uriData = NostrConnectLoginUseCase.generateUri(ephemeralKeyPair, NIP46_RELAYS, "Amethyst%20Desktop") @@ -376,7 +375,7 @@ class AccountManager internal constructor( LoginProgress.ConnectingToRelays( uriData.relays.associateWith { RelayLoginStatus.CONNECTING }, ) - nip46Client.subscribe(listener) + nip46Client.addConnectionListener(listener) onUriGenerated(uriData.uri) @@ -415,7 +414,7 @@ class AccountManager internal constructor( return Result.failure(Exception("Connection failed: ${e.message}")) } finally { _loginProgress.value = null - client?.unsubscribe(listener) + client?.removeConnectionListener(listener) } } diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/ChessScreen.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/ChessScreen.kt index 2668756b86..b792b53450 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/ChessScreen.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/chess/ChessScreen.kt @@ -140,7 +140,7 @@ fun ChessScreen( onEvent = { event, _, _, _ -> viewModel.handleIncomingEvent(event) }, - onEose = { _, _ -> + onCaughtUp = { _, _ -> // ChessLobbyLogic handles loading state internally }, ) diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/network/RelayConnectionManager.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/network/RelayConnectionManager.kt index 1f98c52ef2..bd84b35b7e 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/network/RelayConnectionManager.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/network/RelayConnectionManager.kt @@ -22,8 +22,8 @@ package com.vitorpamplona.amethyst.desktop.network import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message import com.vitorpamplona.quartz.nip01Core.relay.commands.toRelay.Command @@ -43,11 +43,11 @@ import kotlinx.coroutines.flow.asStateFlow */ open class RelayConnectionManager( websocketBuilder: WebsocketBuilder, -) : IRelayClientListener { - private val _client = NostrClient(websocketBuilder) +) : RelayConnectionListener { + private val _client = DefaultNostrClient(websocketBuilder) - /** Exposes the underlying INostrClient for subscription coordinators */ - val client: com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient get() = _client + /** Exposes the underlying NostrClient for subscription coordinators */ + val client: com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient get() = _client private val _relayStatuses = MutableStateFlow>(emptyMap()) val relayStatuses: StateFlow> = _relayStatuses.asStateFlow() @@ -56,7 +56,7 @@ open class RelayConnectionManager( val availableRelays: StateFlow> = _client.availableRelaysFlow() init { - _client.subscribe(this) + _client.addConnectionListener(this) } fun connect() { @@ -85,21 +85,21 @@ open class RelayConnectionManager( subId: String, filters: List, relays: Set = availableRelays.value, - listener: IRequestListener? = null, + listener: SubscriptionListener? = null, ) { val filterMap = relays.associateWith { filters } - _client.openReqSubscription(subId, filterMap, listener) + _client.subscribe(subId, filterMap, listener) } fun unsubscribe(subId: String) { - _client.close(subId) + _client.unsubscribe(subId) } - fun send( + fun publish( event: Event, relays: Set = connectedRelays.value, ) { - _client.send(event, relays) + _client.publish(event, relays) } /** @@ -107,21 +107,21 @@ open class RelayConnectionManager( */ fun broadcastToAll(event: Event) { val connected = connectedRelays.value - send(event, connected) + publish(event, connected) } /** * Sends an event to a specific relay (for NWC). * Adds the relay if not already in the list. */ - fun sendToRelay( + fun publishToRelay( relay: NormalizedRelayUrl, event: Event, ) { if (relay !in availableRelays.value) { updateRelayStatus(relay) { it.copy(connected = false, error = null) } } - _client.send(event, setOf(relay)) + _client.publish(event, setOf(relay)) } /** @@ -138,14 +138,14 @@ open class RelayConnectionManager( updateRelayStatus(relay) { it.copy(connected = false, error = null) } } val filterMap = mapOf(relay to filters) - _client.openReqSubscription( + _client.subscribe( subId = subId, filters = filterMap, listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -162,7 +162,7 @@ open class RelayConnectionManager( relay: NormalizedRelayUrl, subId: String, ) { - _client.close(subId) + _client.unsubscribe(subId) } private fun updateRelayStatus( diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/nwc/NwcPaymentHandler.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/nwc/NwcPaymentHandler.kt index d535cd7ae2..e538045714 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/nwc/NwcPaymentHandler.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/nwc/NwcPaymentHandler.kt @@ -103,7 +103,7 @@ class NwcPaymentHandler( zappedNote?.addZapPayment(requestNote, null) // Send request to wallet's relay - relayManager.sendToRelay(nwcConnection.relayUri, requestEvent) + relayManager.publishToRelay(nwcConnection.relayUri, requestEvent) // Subscribe and wait for response with timeout return withTimeoutOrNull(timeoutMs) { diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/ChessSubscription.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/ChessSubscription.kt index 44edd4446d..42faeabcd1 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/ChessSubscription.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/ChessSubscription.kt @@ -27,7 +27,7 @@ import com.vitorpamplona.amethyst.desktop.chess.DesktopChessEventCache import com.vitorpamplona.amethyst.desktop.network.RelayConnectionManager import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.relay.client.pool.groupByRelay -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip64Chess.challenge.accept.LiveChessGameAcceptEvent @@ -58,7 +58,7 @@ private val CHESS_EVENT_KINDS = class DesktopChessSubscriptionController( private val relayManager: RelayConnectionManager, private val onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - private val onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + private val onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ) : ChessSubscriptionController { private val _currentState = MutableStateFlow(null) override val currentState: StateFlow = _currentState.asStateFlow() @@ -95,10 +95,10 @@ class DesktopChessSubscriptionController( filters = allFilters, relays = state.relays, listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -106,16 +106,16 @@ class DesktopChessSubscriptionController( if (event.kind in CHESS_EVENT_KINDS) { DesktopChessEventCache.add(event) } - onEvent(event, isLive, relay, forFilters) + onEvent(event, isRealTime, relay, forFilters) } - override fun onEose( + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { // Track EOSE time for this relay for efficient re-subscription relayEoseTimes[relay] = TimeUtils.now() - onEose(relay, forFilters) + onCaughtUp(relay, forFilters) } }, ) @@ -162,7 +162,7 @@ class DesktopChessSubscriptionController( * @param activeGameIds Set of game IDs the user is actively playing (for game-specific filters) * @param opponentPubkeys Set of opponent pubkeys for active games (for move filtering) * @param onEvent Callback for incoming events - * @param onEose Callback for EOSE (End of Stored Events) + * @param onCaughtUp Callback for EOSE (End of Stored Events) */ fun createChessSubscriptionWithGames( relays: Set, @@ -170,7 +170,7 @@ fun createChessSubscriptionWithGames( activeGameIds: Set = emptySet(), opponentPubkeys: Set = emptySet(), onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (relays.isEmpty()) return null @@ -197,7 +197,7 @@ fun createChessSubscriptionWithGames( filters = filters, relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } @@ -207,11 +207,11 @@ fun createChessSubscriptionWithGames( */ @Deprecated( "Use createChessSubscriptionWithGames for active game support", - ReplaceWith("createChessSubscriptionWithGames(relays, userPubkey, emptySet(), emptySet(), onEvent, onEose)"), + ReplaceWith("createChessSubscriptionWithGames(relays, userPubkey, emptySet(), emptySet(), onEvent, onCaughtUp)"), ) fun createChessSubscription( relays: Set, userPubkey: String, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, -): SubscriptionConfig? = createChessSubscriptionWithGames(relays, userPubkey, emptySet(), emptySet(), onEvent, onEose) + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, +): SubscriptionConfig? = createChessSubscriptionWithGames(relays, userPubkey, emptySet(), emptySet(), onEvent, onCaughtUp) diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/DesktopRelaySubscriptionsCoordinator.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/DesktopRelaySubscriptionsCoordinator.kt index f6dd01b7cb..38d9aab20d 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/DesktopRelaySubscriptionsCoordinator.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/DesktopRelaySubscriptionsCoordinator.kt @@ -30,8 +30,8 @@ import com.vitorpamplona.amethyst.desktop.model.DesktopDmRelayState import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.HexKey import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import kotlinx.coroutines.CoroutineScope @@ -73,7 +73,7 @@ import kotlin.time.Duration.Companion.seconds * ``` */ class DesktopRelaySubscriptionsCoordinator( - private val client: INostrClient, + private val client: NostrClient, private val scope: CoroutineScope, private val indexRelays: Set, private val localCache: DesktopLocalCache, @@ -153,7 +153,7 @@ class DesktopRelaySubscriptionsCoordinator( // Cancel any existing subscription with this ID screenSubscriptions.remove(subId)?.cancel() - client.close(subId) + client.unsubscribe(subId) if (noteIds.isEmpty() || relays.isEmpty()) return subId @@ -177,10 +177,10 @@ class DesktopRelaySubscriptionsCoordinator( ) val listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -190,7 +190,7 @@ class DesktopRelaySubscriptionsCoordinator( val job = scope.launch { - client.openReqSubscription( + client.subscribe( subId = subId, filters = relays.associateWith { filters }, listener = listener, @@ -206,7 +206,7 @@ class DesktopRelaySubscriptionsCoordinator( */ fun releaseInteractions(subId: String) { screenSubscriptions.remove(subId)?.cancel() - client.close(subId) + client.unsubscribe(subId) } /** @@ -217,7 +217,7 @@ class DesktopRelaySubscriptionsCoordinator( // Start rate limiter to process queued metadata requests rateLimiter.start { pubkey -> // When rate limiter dequeues a pubkey, subscribe to its metadata - client.openReqSubscription( + client.subscribe( filters = indexRelays.associateWith { listOf( @@ -281,10 +281,10 @@ class DesktopRelaySubscriptionsCoordinator( if (inboxRelays.isEmpty() && outboxRelays.isEmpty()) return val listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -296,7 +296,7 @@ class DesktopRelaySubscriptionsCoordinator( if (inboxRelays.isNotEmpty()) { val inboxSubId = generateSubId("dm-inbox-${userPubKeyHex.take(8)}") activeDmSubIds.add(inboxSubId) - client.openReqSubscription( + client.subscribe( subId = inboxSubId, filters = inboxRelays.associateWith { @@ -310,7 +310,7 @@ class DesktopRelaySubscriptionsCoordinator( if (outboxRelays.isNotEmpty()) { val outboxSubId = generateSubId("dm-outbox-${userPubKeyHex.take(8)}") activeDmSubIds.add(outboxSubId) - client.openReqSubscription( + client.subscribe( subId = outboxSubId, filters = outboxRelays.associateWith { @@ -324,7 +324,7 @@ class DesktopRelaySubscriptionsCoordinator( if (inboxRelays.isNotEmpty()) { val giftWrapSubId = generateSubId("giftwrap-${userPubKeyHex.take(8)}") activeDmSubIds.add(giftWrapSubId) - client.openReqSubscription( + client.subscribe( subId = giftWrapSubId, filters = inboxRelays.associateWith { @@ -340,7 +340,7 @@ class DesktopRelaySubscriptionsCoordinator( */ fun unsubscribeFromDms() { activeDmSubIds.forEach { subId -> - client.close(subId) + client.unsubscribe(subId) } activeDmSubIds.clear() } @@ -353,7 +353,7 @@ class DesktopRelaySubscriptionsCoordinator( // Clean up screen-triggered subscriptions screenSubscriptions.forEach { (subId, job) -> job.cancel() - client.close(subId) + client.unsubscribe(subId) } screenSubscriptions.clear() _lastEventAt.value = null diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/FeedSubscription.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/FeedSubscription.kt index a7d4a633a3..78c677a918 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/FeedSubscription.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/FeedSubscription.kt @@ -39,14 +39,14 @@ fun createGlobalFeedSubscription( relays: Set, limit: Int = 50, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("global-feed"), filters = listOf(FilterBuilders.textNotesGlobal(limit = limit)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) /** @@ -57,7 +57,7 @@ fun createFollowingFeedSubscription( followedUsers: List, limit: Int = 50, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (followedUsers.isEmpty()) return null @@ -66,7 +66,7 @@ fun createFollowingFeedSubscription( filters = listOf(FilterBuilders.textNotesFromAuthors(followedUsers, limit = limit)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } @@ -77,14 +77,14 @@ fun createContactListSubscription( relays: Set, pubKeyHex: String, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("contacts-${pubKeyHex.take(8)}"), filters = listOf(FilterBuilders.contactList(pubKeyHex)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) /** @@ -94,14 +94,14 @@ fun createNoteSubscription( relays: Set, noteId: String, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("note-${noteId.take(8)}"), filters = listOf(FilterBuilders.byIds(listOf(noteId))), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) /** @@ -115,7 +115,7 @@ fun createThreadRepliesSubscription( noteId: String, limit: Int = 200, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("thread-${noteId.take(8)}"), @@ -129,7 +129,7 @@ fun createThreadRepliesSubscription( ), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) /** @@ -144,7 +144,7 @@ fun createSearchPeopleSubscription( searchQuery: String, limit: Int = 50, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, onClosed: (NormalizedRelayUrl, String, List?) -> Unit = { _, _, _ -> }, ): SubscriptionConfig? { if (searchQuery.isBlank()) return null @@ -154,7 +154,7 @@ fun createSearchPeopleSubscription( filters = listOf(FilterBuilders.searchPeople(searchQuery, limit)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, onClosed = onClosed, ) } @@ -171,7 +171,7 @@ fun createSearchNotesSubscription( searchQuery: String, limit: Int = 50, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (searchQuery.isBlank()) return null @@ -180,7 +180,7 @@ fun createSearchNotesSubscription( filters = listOf(FilterBuilders.searchNotes(searchQuery, limit)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } @@ -195,7 +195,7 @@ fun createZapsSubscription( eventIds: List, limit: Int = 100, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (eventIds.isEmpty()) return null @@ -204,7 +204,7 @@ fun createZapsSubscription( filters = listOf(FilterBuilders.zapsForEvents(eventIds, limit)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } @@ -219,7 +219,7 @@ fun createReactionsSubscription( eventIds: List, limit: Int = 100, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (eventIds.isEmpty()) return null @@ -228,7 +228,7 @@ fun createReactionsSubscription( filters = listOf(FilterBuilders.reactionsForEvents(eventIds, limit)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } @@ -243,7 +243,7 @@ fun createRepliesSubscription( eventIds: List, limit: Int = 100, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (eventIds.isEmpty()) return null @@ -252,7 +252,7 @@ fun createRepliesSubscription( filters = listOf(FilterBuilders.repliesForEvents(eventIds, limit)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } @@ -267,7 +267,7 @@ fun createRepostsSubscription( eventIds: List, limit: Int = 100, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (eventIds.isEmpty()) return null @@ -276,7 +276,7 @@ fun createRepostsSubscription( filters = listOf(FilterBuilders.repostsForEvents(eventIds, limit)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } @@ -287,14 +287,14 @@ fun createLongFormFeedSubscription( relays: Set, limit: Int = 30, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("longform-feed"), filters = listOf(FilterBuilders.longFormGlobal(limit = limit)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) /** @@ -305,7 +305,7 @@ fun createFollowingLongFormFeedSubscription( followedUsers: List, limit: Int = 30, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (followedUsers.isEmpty()) return null @@ -314,7 +314,7 @@ fun createFollowingLongFormFeedSubscription( filters = listOf(FilterBuilders.longFormFromAuthors(followedUsers, limit = limit)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } @@ -333,7 +333,7 @@ fun createChessSubscription( userPubkey: String, limit: Int = 100, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("chess-${userPubkey.take(8)}"), @@ -348,5 +348,5 @@ fun createChessSubscription( ), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/FilterDMs.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/FilterDMs.kt index e1b9ced846..28aebdf2ac 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/FilterDMs.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/FilterDMs.kt @@ -144,7 +144,7 @@ fun createNip04DmInboxSubscription( since: Long? = null, limit: Int? = null, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (relays.isEmpty() || userPubKeyHex.length != 64) return null @@ -153,7 +153,7 @@ fun createNip04DmInboxSubscription( filters = listOf(FilterDMs.nip04ToMe(userPubKeyHex, since, limit)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } @@ -167,7 +167,7 @@ fun createNip04DmOutboxSubscription( since: Long? = null, limit: Int? = null, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (relays.isEmpty() || userPubKeyHex.length != 64) return null @@ -176,7 +176,7 @@ fun createNip04DmOutboxSubscription( filters = listOf(FilterDMs.nip04FromMe(userPubKeyHex, since, limit)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } @@ -189,7 +189,7 @@ fun createGiftWrapSubscription( userPubKeyHex: HexKey, since: Long? = null, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (relays.isEmpty() || userPubKeyHex.length != 64) return null @@ -198,7 +198,7 @@ fun createGiftWrapSubscription( filters = listOf(FilterDMs.giftWrapsToMe(userPubKeyHex, since)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } @@ -213,7 +213,7 @@ fun createDmConversationSubscription( conversationPubKeys: Set, since: Long? = null, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (conversationPubKeys.isEmpty() || userPubKeyHex.length != 64) return null @@ -225,6 +225,6 @@ fun createDmConversationSubscription( filters = FilterDMs.nip04Conversation(userPubKeyHex, conversationPubKeys, since), relays = allRelays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/ProfileSubscription.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/ProfileSubscription.kt index da9f93413b..e2d03f464b 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/ProfileSubscription.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/ProfileSubscription.kt @@ -32,7 +32,7 @@ fun createMetadataSubscription( relays: Set, pubKeyHex: String, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { // Validate pubkey length if (pubKeyHex.length != 64) { @@ -43,7 +43,7 @@ fun createMetadataSubscription( filters = listOf(FilterBuilders.userMetadata(pubKeyHex)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } @@ -56,7 +56,7 @@ fun createBatchMetadataSubscription( relays: Set, pubKeyHexList: List, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { // Filter out invalid pubkeys val validPubkeys = pubKeyHexList.filter { it.length == 64 } @@ -67,7 +67,7 @@ fun createBatchMetadataSubscription( filters = listOf(FilterBuilders.userMetadataBatch(validPubkeys)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } @@ -79,7 +79,7 @@ fun createMetadataListSubscription( relays: Set, pubKeys: List, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (pubKeys.isEmpty()) return null @@ -88,7 +88,7 @@ fun createMetadataListSubscription( filters = listOf(FilterBuilders.userMetadataMultiple(pubKeys)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) } @@ -100,7 +100,7 @@ fun createUserPostsSubscription( pubKeyHex: String, limit: Int = 50, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("posts-${pubKeyHex.take(8)}"), @@ -111,7 +111,7 @@ fun createUserPostsSubscription( ), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) /** @@ -122,12 +122,12 @@ fun createNotificationsSubscription( pubKeyHex: String, limit: Int = 100, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("notif-${pubKeyHex.take(8)}"), filters = listOf(FilterBuilders.notificationsForUser(pubKeyHex, limit = limit)), relays = relays, onEvent = onEvent, - onEose = onEose, + onCaughtUp = onCaughtUp, ) diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/SubscriptionUtils.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/SubscriptionUtils.kt index f7ce8727d5..7ddb5ec3f1 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/SubscriptionUtils.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/subscriptions/SubscriptionUtils.kt @@ -25,7 +25,7 @@ import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.remember import com.vitorpamplona.amethyst.desktop.network.RelayConnectionManager import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -45,7 +45,7 @@ data class SubscriptionConfig( val filters: List, val relays: Set, val onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - val onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + val onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, val onClosed: (NormalizedRelayUrl, String, List?) -> Unit = { _, _, _ -> }, ) @@ -80,21 +80,21 @@ fun rememberSubscription( filters = cfg.filters, relays = cfg.relays, listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - cfg.onEvent(event, isLive, relay, forFilters) + cfg.onEvent(event, isRealTime, relay, forFilters) } - override fun onEose( + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { - cfg.onEose(relay, forFilters) + cfg.onCaughtUp(relay, forFilters) } override fun onClosed( diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ArticleEditorScreen.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ArticleEditorScreen.kt index c0debf9ac1..965b258212 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ArticleEditorScreen.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ArticleEditorScreen.kt @@ -175,7 +175,7 @@ fun ArticleEditorScreen( ) // TODO: send() is fire-and-forget; markPublished runs before relay ack. // Consider waiting for relay OK response before marking as published. - relayManager.send(event) + relayManager.publish(event) draftStore.markPublished(slug) onPublished() } catch (e: Exception) { diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ArticleReaderScreen.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ArticleReaderScreen.kt index 4bd362e907..6d1c5d20ae 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ArticleReaderScreen.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ArticleReaderScreen.kt @@ -222,7 +222,7 @@ fun ArticleReaderScreen( } } }, - onEose = { _, _ -> + onCaughtUp = { _, _ -> eoseReceived = true }, ) @@ -335,7 +335,7 @@ fun ArticleReaderScreen( .toSet() } }, - onEose = { _, _ -> }, + onCaughtUp = { _, _ -> }, ) } else { null diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/BookmarksScreen.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/BookmarksScreen.kt index e692b64707..95f487dc27 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/BookmarksScreen.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/BookmarksScreen.kt @@ -168,7 +168,7 @@ fun BookmarksScreen( publicBookmarkIds = pubIds } }, - onEose = { _, _ -> + onCaughtUp = { _, _ -> hasReceivedEose = true isLoading = false }, @@ -214,7 +214,7 @@ fun BookmarksScreen( subscriptionsCoordinator?.consumeEvent(event, relay) publicEventState.addItem(event) }, - onEose = { _, _ -> }, + onCaughtUp = { _, _ -> }, ) } else { null @@ -236,7 +236,7 @@ fun BookmarksScreen( subscriptionsCoordinator?.consumeEvent(event, relay) privateEventState.addItem(event) }, - onEose = { _, _ -> }, + onCaughtUp = { _, _ -> }, ) } else { null diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/FeedScreen.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/FeedScreen.kt index 9f12a8163c..654da5d7cc 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/FeedScreen.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/FeedScreen.kt @@ -170,7 +170,7 @@ fun FeedScreen( val connectedRelays by relayManager.connectedRelays.collectAsState() val followedUsers by localCache.followedUsers.collectAsState() - // Available relay URLs — openReqSubscription triggers connection on-demand + // Available relay URLs — subscribe triggers connection on-demand val allRelayUrls = remember(relayStatuses) { relayStatuses.keys } var replyToEvent by remember { mutableStateOf(null) } diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/NoteActions.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/NoteActions.kt index 4e940173df..5a24ce6144 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/NoteActions.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/NoteActions.kt @@ -72,7 +72,7 @@ import com.vitorpamplona.amethyst.desktop.nwc.NwcPaymentHandler import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.hints.EventHintBundle import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip19Bech32.entities.NEvent @@ -436,10 +436,10 @@ private suspend fun fetchMetadataForUsers( filters = filters, relays = relays, listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -457,7 +457,7 @@ private suspend fun fetchMetadataForUsers( } } - override fun onEose( + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -1058,10 +1058,10 @@ private suspend fun fetchUserLightningAddress( filters = filters, relays = relays, listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -1078,7 +1078,7 @@ private suspend fun fetchUserLightningAddress( } } - override fun onEose( + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/NotificationsScreen.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/NotificationsScreen.kt index edb2e43d88..c9efe8a4d7 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/NotificationsScreen.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/NotificationsScreen.kt @@ -228,7 +228,7 @@ fun NotificationsScreen( notificationState.addItem(notification) }, - onEose = { _, _ -> + onCaughtUp = { _, _ -> eoseReceivedCount++ }, ) diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ReadsScreen.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ReadsScreen.kt index 80438b7b00..9284ee5aab 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ReadsScreen.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ReadsScreen.kt @@ -261,7 +261,7 @@ fun ReadsScreen( eventState.addItem(event) } }, - onEose = { _, _ -> + onCaughtUp = { _, _ -> eoseReceivedCount++ }, ) @@ -277,7 +277,7 @@ fun ReadsScreen( eventState.addItem(event) } }, - onEose = { _, _ -> + onCaughtUp = { _, _ -> eoseReceivedCount++ }, ) diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/SearchScreen.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/SearchScreen.kt index c866b0ba5b..2bd3c86d5f 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/SearchScreen.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/SearchScreen.kt @@ -172,7 +172,7 @@ fun SearchScreen( } } - // NIP-50 people search subscription (use allRelayUrls — openReqSubscription will connect) + // NIP-50 people search subscription (use allRelayUrls — subscribe will connect) rememberSubscription(connectedRelays, debouncedQuery, relayManager = relayManager) { if (allRelayUrls.isEmpty() || debouncedQuery.isEmpty) { return@rememberSubscription null @@ -202,7 +202,7 @@ fun SearchScreen( } } }, - onEose = { relay, _ -> + onCaughtUp = { relay, _ -> state.updateRelayState(relay.url, RelaySyncStatus.EOSE_RECEIVED) state.stopSearching("people-search") }, @@ -236,7 +236,7 @@ fun SearchScreen( } } }, - onEose = { relay, _ -> + onCaughtUp = { relay, _ -> state.updateRelayState(relay.url, RelaySyncStatus.EOSE_RECEIVED) state.stopSearching("adv-search") }, diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ThreadScreen.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ThreadScreen.kt index ff54ca15b9..7a30eb3ebf 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ThreadScreen.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/ThreadScreen.kt @@ -131,7 +131,7 @@ fun ThreadScreen( subscriptionsCoordinator?.consumeEvent(event, relay) levelCache[event.id] = 0 }, - onEose = { _, _ -> + onCaughtUp = { _, _ -> rootNoteEoseReceived = true }, ) @@ -149,7 +149,7 @@ fun ThreadScreen( onEvent = { event, _, relay, _ -> subscriptionsCoordinator?.consumeEvent(event, relay) }, - onEose = { _, _ -> }, + onCaughtUp = { _, _ -> }, ) } else { null diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/UserProfileScreen.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/UserProfileScreen.kt index 0c9582151d..da2111a936 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/UserProfileScreen.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/UserProfileScreen.kt @@ -190,7 +190,7 @@ fun UserProfileScreen( onEvent = { event, _, relay, _ -> subscriptionsCoordinator?.consumeEvent(event, relay) }, - onEose = { _, _ -> }, + onCaughtUp = { _, _ -> }, ) } else { null @@ -232,7 +232,7 @@ fun UserProfileScreen( contactListLoaded = true } }, - onEose = { _, _ -> + onCaughtUp = { _, _ -> eoseReceivedCount++ // Wait for EOSE from at least 2 relays or all relays before enabling button @@ -294,7 +294,7 @@ fun UserProfileScreen( localCache.cacheFollowingCount(pubKeyHex, count) } }, - onEose = { _, _ -> }, + onCaughtUp = { _, _ -> }, ) } else { null @@ -329,7 +329,7 @@ fun UserProfileScreen( localCache.cacheFollowerCount(pubKeyHex, count) } }, - onEose = { _, _ -> }, + onCaughtUp = { _, _ -> }, ) } else { null @@ -356,7 +356,7 @@ fun UserProfileScreen( pictureEvents.add(event) } }, - onEose = { _, _ -> }, + onCaughtUp = { _, _ -> }, ) } else { null @@ -383,7 +383,7 @@ fun UserProfileScreen( articleEvents.add(event) } }, - onEose = { _, _ -> }, + onCaughtUp = { _, _ -> }, ) } else { null @@ -410,7 +410,7 @@ fun UserProfileScreen( highlightEvents.add(event) } }, - onEose = { _, _ -> }, + onCaughtUp = { _, _ -> }, ) } else { null diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/chats/ChatroomListState.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/chats/ChatroomListState.kt index 26e0cbd810..bcbd2c54df 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/chats/ChatroomListState.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/chats/ChatroomListState.kt @@ -29,7 +29,7 @@ import com.vitorpamplona.amethyst.desktop.cache.DesktopLocalCache import com.vitorpamplona.amethyst.desktop.network.RelayConnectionManager import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip04Dm.messages.PrivateDmEvent @@ -161,10 +161,10 @@ class ChatroomListState( ) val listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/chats/DmSendTracker.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/chats/DmSendTracker.kt index 216d3ab439..b074e3ec1e 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/chats/DmSendTracker.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/chats/DmSendTracker.kt @@ -22,8 +22,8 @@ package com.vitorpamplona.amethyst.desktop.ui.chats import com.vitorpamplona.amethyst.commons.ui.chat.DmBroadcastStatus import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.sendAndWaitForResponseDetailed +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.publishAndConfirmDetailed import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow @@ -31,7 +31,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow class DmSendTracker( - private val client: INostrClient, + private val client: NostrClient, ) { private val _status = MutableStateFlow(DmBroadcastStatus.Idle) val status: StateFlow = _status.asStateFlow() @@ -56,7 +56,7 @@ class DmSendTracker( val allSuccessful = mutableSetOf() for ((event, relays) in events) { - val results = client.sendAndWaitForResponseDetailed(event, relays, 10) + val results = client.publishAndConfirmDetailed(event, relays, 10) allSuccessful.addAll(results.filter { it.value }.keys) _status.value = DmBroadcastStatus.Sending(allSuccessful.size, totalRelays) } diff --git a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/chats/NewDmDialog.kt b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/chats/NewDmDialog.kt index d50cbbb338..a0f7c4ec6e 100644 --- a/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/chats/NewDmDialog.kt +++ b/desktopApp/src/jvmMain/kotlin/com/vitorpamplona/amethyst/desktop/ui/chats/NewDmDialog.kt @@ -103,7 +103,7 @@ fun NewDmDialog( } } }, - onEose = { _, _ -> + onCaughtUp = { _, _ -> searchState.endRelaySearch() }, ) diff --git a/desktopApp/src/jvmTest/kotlin/com/vitorpamplona/amethyst/desktop/cache/CoordinatorPipelineTest.kt b/desktopApp/src/jvmTest/kotlin/com/vitorpamplona/amethyst/desktop/cache/CoordinatorPipelineTest.kt index b47fa330f1..f3fa81aa99 100644 --- a/desktopApp/src/jvmTest/kotlin/com/vitorpamplona/amethyst/desktop/cache/CoordinatorPipelineTest.kt +++ b/desktopApp/src/jvmTest/kotlin/com/vitorpamplona/amethyst/desktop/cache/CoordinatorPipelineTest.kt @@ -27,9 +27,9 @@ import com.vitorpamplona.amethyst.desktop.subscriptions.DesktopRelaySubscription import com.vitorpamplona.amethyst.desktop.viewmodels.DesktopFeedViewModel import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -50,7 +50,7 @@ import kotlin.test.assertTrue /** * Integration tests for the Coordinator → Cache → ViewModel pipeline. * - * These tests use a stub INostrClient (no real relay connections) and exercise + * These tests use a stub NostrClient (no real relay connections) and exercise * the full event consumption path through DesktopRelaySubscriptionsCoordinator. * * Key invariant being tested: when coordinator.consumeEvent() is called, @@ -65,11 +65,11 @@ class CoordinatorPipelineTest { private suspend fun waitForBundler() = delay(600) /** - * Stub INostrClient — records subscription calls but doesn't connect to any relay. + * Stub NostrClient — records subscription calls but doesn't connect to any relay. * This lets us test the coordinator's event routing without network dependencies. */ - private class StubNostrClient : INostrClient { - val openedSubs = mutableMapOf>, IRequestListener?>>() + private class StubNostrClient : NostrClient { + val openedSubs = mutableMapOf>, SubscriptionListener?>>() override fun connectedRelaysFlow(): StateFlow> = MutableStateFlow(emptySet()) @@ -88,17 +88,17 @@ class CoordinatorPipelineTest { override fun isActive() = false - override fun renewFilters(relay: IRelayClient) {} + override fun syncFilters(relay: IRelayClient) {} - override fun openReqSubscription( + override fun subscribe( subId: String, filters: Map>, - listener: IRequestListener?, + listener: SubscriptionListener?, ) { openedSubs[subId] = filters to listener } - override fun queryCount( + override fun count( subId: String, filters: Map>, ) {} @@ -112,9 +112,9 @@ class CoordinatorPipelineTest { relayList: Set, ) {} - override fun subscribe(listener: IRelayClientListener) {} + override fun addConnectionListener(listener: RelayConnectionListener) {} - override fun unsubscribe(listener: IRelayClientListener) {} + override fun removeConnectionListener(listener: RelayConnectionListener) {} override fun getReqFiltersOrNull(subId: String): Map>? = null @@ -376,7 +376,7 @@ class CoordinatorPipelineTest { val noteIds = listOf("n1".padEnd(64, '0')) val subId = coordinator.requestInteractions(noteIds, setOf(relayUrl)) - // openReqSubscription is launched in scope — wait for it + // subscribe is launched in scope — wait for it delay(200) assertTrue(client.openedSubs.containsKey(subId), "Interaction subscription should be opened") diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/NostrClient.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/DefaultNostrClient.kt similarity index 94% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/NostrClient.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/DefaultNostrClient.kt index a314a0dd85..0d58098b9c 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/NostrClient.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/DefaultNostrClient.kt @@ -22,12 +22,12 @@ package com.vitorpamplona.quartz.nip01Core.relay.client import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.pool.PoolCounts import com.vitorpamplona.quartz.nip01Core.relay.client.pool.PoolEventOutbox import com.vitorpamplona.quartz.nip01Core.relay.client.pool.PoolRequests import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayPool -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message import com.vitorpamplona.quartz.nip01Core.relay.commands.toRelay.AuthCmd @@ -76,11 +76,11 @@ import kotlinx.coroutines.launch * are connected to all necessary endpoints. It also listens to relay state changes to update * subscriptions and message retries when connections are re-established. */ -class NostrClient( +class DefaultNostrClient( private val websocketBuilder: WebsocketBuilder, private val parentScope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob()), -) : INostrClient, - IRelayClientListener, +) : NostrClient, + RelayConnectionListener, AutoCloseable { private val relayPool: RelayPool = RelayPool(websocketBuilder, this) @@ -91,7 +91,7 @@ class NostrClient( private val activeCounts: PoolCounts = PoolCounts() private val eventOutbox: PoolEventOutbox = PoolEventOutbox() - private var listeners = setOf() + private var listeners = setOf() // controls the state of the client in such a way that if it is active // new filters will be sent to the relays and a potential reconnect can @@ -164,10 +164,10 @@ class NostrClient( refreshConnection.tryEmit(Reconnect(onlyIfChanged, ignoreRetryDelays)) } - override fun openReqSubscription( + override fun subscribe( subId: String, filters: Map>, - listener: IRequestListener?, + listener: SubscriptionListener?, ) { val relaysToUpdate = activeRequests.addOrUpdate(subId, filters, listener) @@ -188,7 +188,7 @@ class NostrClient( } } - override fun queryCount( + override fun count( subId: String, filters: Map>, ) { @@ -208,7 +208,7 @@ class NostrClient( } } - override fun send( + override fun publish( event: Event, relayList: Set, ) { @@ -222,7 +222,7 @@ class NostrClient( } } - override fun close(subId: String) { + override fun unsubscribe(subId: String) { val relaysToUpdateReqs = activeRequests.remove(subId) val relaysToUpdateCounts = activeCounts.remove(subId) @@ -232,7 +232,7 @@ class NostrClient( } } - override fun renewFilters(relay: IRelayClient) { + override fun syncFilters(relay: IRelayClient) { if (isActive) { scope.launch { activeRequests.syncState(relay.url, relay::sendOrConnectAndSync) @@ -259,7 +259,7 @@ class NostrClient( pingMillis: Int, compressed: Boolean, ) { - renewFilters(relay) + syncFilters(relay) listeners.forEach { it.onConnected(relay, pingMillis, compressed) } } @@ -308,13 +308,13 @@ class NostrClient( listeners.forEach { it.onCannotConnect(relay, errorMessage) } } - override fun subscribe(listener: IRelayClientListener) { + override fun addConnectionListener(listener: RelayConnectionListener) { listeners = listeners.plus(listener) } - fun isSubscribed(listener: IRelayClientListener): Boolean = listeners.contains(listener) + fun hasConnectionListener(listener: RelayConnectionListener): Boolean = listeners.contains(listener) - override fun unsubscribe(listener: IRelayClientListener) { + override fun removeConnectionListener(listener: RelayConnectionListener) { listeners = listeners.minus(listener) } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/INostrClient.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/NostrClientInterface.kt similarity index 82% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/INostrClient.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/NostrClientInterface.kt index 6b738aec60..1bce302d95 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/INostrClient.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/NostrClientInterface.kt @@ -22,8 +22,8 @@ package com.vitorpamplona.quartz.nip01Core.relay.client import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.client.single.newSubId import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter @@ -31,7 +31,7 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -interface INostrClient : AutoCloseable { +interface NostrClient : AutoCloseable { fun connectedRelaysFlow(): StateFlow> fun availableRelaysFlow(): StateFlow> @@ -52,29 +52,29 @@ interface INostrClient : AutoCloseable { * This is called every time the relay connects * and when auth is successful */ - fun renewFilters(relay: IRelayClient) + fun syncFilters(relay: IRelayClient) - fun openReqSubscription( + fun subscribe( subId: String = newSubId(), filters: Map>, - listener: IRequestListener? = null, + listener: SubscriptionListener? = null, ) - fun queryCount( + fun count( subId: String = newSubId(), filters: Map>, ) - fun close(subId: String) + fun unsubscribe(subId: String) - fun send( + fun publish( event: Event, relayList: Set, ) - fun subscribe(listener: IRelayClientListener) + fun addConnectionListener(listener: RelayConnectionListener) - fun unsubscribe(listener: IRelayClientListener) + fun removeConnectionListener(listener: RelayConnectionListener) fun getReqFiltersOrNull(subId: String): Map>? @@ -87,7 +87,7 @@ interface INostrClient : AutoCloseable { fun activeOutboxCache(url: NormalizedRelayUrl): Set } -class EmptyNostrClient : INostrClient { +class EmptyNostrClient : NostrClient { override fun connectedRelaysFlow() = MutableStateFlow(emptySet()) override fun availableRelaysFlow() = MutableStateFlow(emptySet()) @@ -103,29 +103,29 @@ class EmptyNostrClient : INostrClient { override fun isActive() = false - override fun renewFilters(relay: IRelayClient) { } + override fun syncFilters(relay: IRelayClient) { } - override fun openReqSubscription( + override fun subscribe( subId: String, filters: Map>, - listener: IRequestListener?, + listener: SubscriptionListener?, ) { } - override fun queryCount( + override fun count( subId: String, filters: Map>, ) { } - override fun close(subId: String) { } + override fun unsubscribe(subId: String) { } - override fun send( + override fun publish( event: Event, relayList: Set, ) { } - override fun subscribe(listener: IRelayClientListener) {} + override fun addConnectionListener(listener: RelayConnectionListener) {} - override fun unsubscribe(listener: IRelayClientListener) {} + override fun removeConnectionListener(listener: RelayConnectionListener) {} override fun getReqFiltersOrNull(subId: String): Map>? = null diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/EventCollector.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/EventCollector.kt index 1853525ee1..4bb4af7afb 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/EventCollector.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/EventCollector.kt @@ -21,8 +21,8 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.EventMessage import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message @@ -32,11 +32,11 @@ import com.vitorpamplona.quartz.utils.Log * Listens to NostrClient's onEvent messages for caching purposes. */ class EventCollector( - val client: INostrClient, + val client: NostrClient, val onEvent: (event: Event, relay: IRelayClient) -> Unit, ) { private val clientListener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onIncomingMessage( relay: IRelayClient, msgStr: String, @@ -50,12 +50,12 @@ class EventCollector( init { Log.d("EventCollector", "Init, Subscribe") - client.subscribe(clientListener) + client.addConnectionListener(clientListener) } fun destroy() { // makes sure to run Log.d("EventCollector", "Destroy, Unsubscribe") - client.unsubscribe(clientListener) + client.removeConnectionListener(clientListener) } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientCountExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientCountExt.kt index 2816642c84..c0841a9f5a 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientCountExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientCountExt.kt @@ -20,8 +20,8 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.client.single.newSubId import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.CountMessage @@ -43,7 +43,7 @@ import kotlinx.coroutines.withTimeoutOrNull * @param timeoutMs How long to wait for a response (default 15 s). * @return The [CountResult], or `null` on timeout. */ -suspend fun INostrClient.queryCountSuspend( +suspend fun NostrClient.count( relay: NormalizedRelayUrl, filter: Filter, timeoutMs: Long = 15_000, @@ -52,7 +52,7 @@ suspend fun INostrClient.queryCountSuspend( val resultChannel = Channel(UNLIMITED) val listener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onIncomingMessage( relay: IRelayClient, msgStr: String, @@ -64,18 +64,18 @@ suspend fun INostrClient.queryCountSuspend( } } - subscribe(listener) + addConnectionListener(listener) val result = try { - queryCount(subId = subId, filters = mapOf(relay to listOf(filter))) + count(subId = subId, filters = mapOf(relay to listOf(filter))) withTimeoutOrNull(timeoutMs) { resultChannel.receive() } } finally { - close(subId) - unsubscribe(listener) + unsubscribe(subId) + removeConnectionListener(listener) } resultChannel.close() @@ -92,7 +92,7 @@ suspend fun INostrClient.queryCountSuspend( * @param timeoutMs How long to wait for all responses (default 15 s). * @return Map of relay -> [CountResult] for every relay that responded in time. */ -suspend fun INostrClient.queryCountSuspend( +suspend fun NostrClient.count( filters: Map>, timeoutMs: Long = 15_000, ): Map { @@ -102,7 +102,7 @@ suspend fun INostrClient.queryCountSuspend( val resultChannel = Channel>(UNLIMITED) val listener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onIncomingMessage( relay: IRelayClient, msgStr: String, @@ -115,12 +115,12 @@ suspend fun INostrClient.queryCountSuspend( } } - subscribe(listener) + addConnectionListener(listener) filters.forEach { (relay, filterList) -> val subId = newSubId() subIdToRelay[subId] = relay - queryCount(subId = subId, filters = mapOf(relay to filterList)) + count(subId = subId, filters = mapOf(relay to filterList)) } val results = mutableMapOf() @@ -132,8 +132,8 @@ suspend fun INostrClient.queryCountSuspend( } } - subIdToRelay.keys.forEach { close(it) } - unsubscribe(listener) + subIdToRelay.keys.forEach { unsubscribe(it) } + removeConnectionListener(listener) resultChannel.close() return results @@ -155,7 +155,7 @@ suspend fun INostrClient.queryCountSuspend( * @param timeoutMs How long to wait for all responses (default 15 s). * @return A merged [CountResult], or `null` if no relay responded. */ -suspend fun INostrClient.queryCountMergedHll( +suspend fun NostrClient.countMerged( relays: List, filter: Filter, timeoutMs: Long = 15_000, @@ -163,7 +163,7 @@ suspend fun INostrClient.queryCountMergedHll( if (relays.isEmpty()) return null val results = - queryCountSuspend( + count( filters = relays.associateWith { listOf(filter) }, timeoutMs = timeoutMs, ) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientQueryExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchAllExt.kt similarity index 78% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientQueryExt.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchAllExt.kt index fefd81bbd2..340a528281 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientQueryExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchAllExt.kt @@ -22,8 +22,8 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.newSubId import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -31,45 +31,45 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.withTimeoutOrNull -suspend fun INostrClient.query( +suspend fun NostrClient.fetchAll( relay: String, filter: Filter, timeoutMs: Long = 30_000L, -) = query(newSubId(), mapOf(RelayUrlNormalizer.normalize(relay) to listOf(filter)), timeoutMs) +) = fetchAll(newSubId(), mapOf(RelayUrlNormalizer.normalize(relay) to listOf(filter)), timeoutMs) -suspend fun INostrClient.query( +suspend fun NostrClient.fetchAll( relay: String, filters: List, timeoutMs: Long = 30_000L, -) = query(newSubId(), mapOf(RelayUrlNormalizer.normalize(relay) to filters), timeoutMs) +) = fetchAll(newSubId(), mapOf(RelayUrlNormalizer.normalize(relay) to filters), timeoutMs) -suspend fun INostrClient.query( +suspend fun NostrClient.fetchAll( subscriptionId: String = newSubId(), relay: String, filters: List, timeoutMs: Long = 30_000L, -) = query(subscriptionId, mapOf(RelayUrlNormalizer.normalize(relay) to filters), timeoutMs) +) = fetchAll(subscriptionId, mapOf(RelayUrlNormalizer.normalize(relay) to filters), timeoutMs) -suspend fun INostrClient.query( +suspend fun NostrClient.fetchAll( relay: NormalizedRelayUrl, filter: Filter, timeoutMs: Long = 30_000L, -) = query(newSubId(), mapOf(relay to listOf(filter)), timeoutMs) +) = fetchAll(newSubId(), mapOf(relay to listOf(filter)), timeoutMs) -suspend fun INostrClient.query( +suspend fun NostrClient.fetchAll( relay: NormalizedRelayUrl, filters: List, timeoutMs: Long = 30_000L, -) = query(newSubId(), mapOf(relay to filters), timeoutMs) +) = fetchAll(newSubId(), mapOf(relay to filters), timeoutMs) -suspend fun INostrClient.query( +suspend fun NostrClient.fetchAll( subscriptionId: String = newSubId(), relay: NormalizedRelayUrl, filters: List, timeoutMs: Long = 30_000L, -) = query(subscriptionId, mapOf(relay to filters), timeoutMs) +) = fetchAll(subscriptionId, mapOf(relay to filters), timeoutMs) -suspend fun INostrClient.query( +suspend fun NostrClient.fetchAll( subscriptionId: String = newSubId(), filters: Map>, timeoutMs: Long = 30_000L, @@ -82,10 +82,10 @@ suspend fun INostrClient.query( val remaining = filters.keys.toMutableSet() val listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -110,7 +110,7 @@ suspend fun INostrClient.query( doneChannel.trySend(relay) } - override fun onEose( + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -119,7 +119,7 @@ suspend fun INostrClient.query( } try { - openReqSubscription(subscriptionId, filters, listener) + subscribe(subscriptionId, filters, listener) withTimeoutOrNull(timeoutMs) { while (remaining.isNotEmpty()) { @@ -128,7 +128,7 @@ suspend fun INostrClient.query( } } } finally { - close(subscriptionId) + unsubscribe(subscriptionId) doneChannel.close() } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientReqBypassingRelayLimitsExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchAllPagesExt.kt similarity index 92% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientReqBypassingRelayLimitsExt.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchAllPagesExt.kt index a4a20ab3f0..9889c0407d 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientReqBypassingRelayLimitsExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchAllPagesExt.kt @@ -21,8 +21,8 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.newSubId import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -51,7 +51,7 @@ import kotlin.math.min * @param onEvent Called for every event received (in page order, after each EOSE). * @return Total number of events received across all pages. */ -suspend fun INostrClient.reqBypassingRelayLimits( +suspend fun NostrClient.fetchAllPages( relay: NormalizedRelayUrl, filters: List, timeoutMs: Long = 30_000L, @@ -95,10 +95,10 @@ suspend fun INostrClient.reqBypassingRelayLimits( try { val listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -120,7 +120,7 @@ suspend fun INostrClient.reqBypassingRelayLimits( } } - override fun onEose( + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -144,16 +144,16 @@ suspend fun INostrClient.reqBypassingRelayLimits( } } - openReqSubscription(subId, mapOf(relay to remainingFilters), listener) + subscribe(subId, mapOf(relay to remainingFilters), listener) withTimeoutOrNull(timeoutMs) { doneChannel.receive() } - close(subId) + unsubscribe(subId) doneChannel.close() } finally { - close(subId) + unsubscribe(subId) doneChannel.close() } @@ -168,14 +168,14 @@ suspend fun INostrClient.reqBypassingRelayLimits( return totalEvents } -suspend fun INostrClient.reqBypassingRelayLimits( +suspend fun NostrClient.fetchAllPages( relay: String, filters: List, timeoutMs: Long = 30_000L, onNewPage: ((Long) -> Unit)? = null, onEvent: (Event) -> Unit, ): Int = - reqBypassingRelayLimits( + fetchAllPages( relay = RelayUrlNormalizer.normalize(relay), filters = filters, timeoutMs = timeoutMs, diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientSingleDownloadExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchFirstExt.kt similarity index 74% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientSingleDownloadExt.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchFirstExt.kt index 68ee0f621f..98951f19f6 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientSingleDownloadExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchFirstExt.kt @@ -21,8 +21,8 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.newSubId import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -31,49 +31,49 @@ import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel.Factory.UNLIMITED import kotlinx.coroutines.withTimeoutOrNull -suspend fun INostrClient.downloadFirstEvent( +suspend fun NostrClient.fetchFirst( relay: String, filter: Filter, -) = downloadFirstEvent(newSubId(), mapOf(RelayUrlNormalizer.normalize(relay) to listOf(filter))) +) = fetchFirst(newSubId(), mapOf(RelayUrlNormalizer.normalize(relay) to listOf(filter))) -suspend fun INostrClient.downloadFirstEvent( +suspend fun NostrClient.fetchFirst( relay: String, filters: List, -) = downloadFirstEvent(newSubId(), mapOf(RelayUrlNormalizer.normalize(relay) to filters)) +) = fetchFirst(newSubId(), mapOf(RelayUrlNormalizer.normalize(relay) to filters)) -suspend fun INostrClient.downloadFirstEvent( +suspend fun NostrClient.fetchFirst( subscriptionId: String = newSubId(), relay: String, filters: List, -) = downloadFirstEvent(subscriptionId, mapOf(RelayUrlNormalizer.normalize(relay) to filters)) +) = fetchFirst(subscriptionId, mapOf(RelayUrlNormalizer.normalize(relay) to filters)) -suspend fun INostrClient.downloadFirstEvent( +suspend fun NostrClient.fetchFirst( relay: NormalizedRelayUrl, filter: Filter, -) = downloadFirstEvent(newSubId(), mapOf(relay to listOf(filter))) +) = fetchFirst(newSubId(), mapOf(relay to listOf(filter))) -suspend fun INostrClient.downloadFirstEvent( +suspend fun NostrClient.fetchFirst( relay: NormalizedRelayUrl, filters: List, -) = downloadFirstEvent(newSubId(), mapOf(relay to filters)) +) = fetchFirst(newSubId(), mapOf(relay to filters)) -suspend fun INostrClient.downloadFirstEvent( +suspend fun NostrClient.fetchFirst( subscriptionId: String = newSubId(), relay: NormalizedRelayUrl, filters: List, -) = downloadFirstEvent(subscriptionId, mapOf(relay to filters)) +) = fetchFirst(subscriptionId, mapOf(relay to filters)) -suspend fun INostrClient.downloadFirstEvent( +suspend fun NostrClient.fetchFirst( subscriptionId: String = newSubId(), filters: Map>, ): Event? { val resultChannel = Channel(UNLIMITED) val listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -96,7 +96,7 @@ suspend fun INostrClient.downloadFirstEvent( resultChannel.trySend(null) } - override fun onEose( + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -106,13 +106,13 @@ suspend fun INostrClient.downloadFirstEvent( val result = try { - openReqSubscription(subscriptionId, filters, listener) + subscribe(subscriptionId, filters, listener) withTimeoutOrNull(30000) { resultChannel.receive() } } finally { - close(subscriptionId) + unsubscribe(subscriptionId) } resultChannel.close() diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientSendAndWaitExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientPublishExt.kt similarity index 83% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientSendAndWaitExt.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientPublishExt.kt index 9815f8d429..44307ceb89 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientSendAndWaitExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientPublishExt.kt @@ -21,8 +21,8 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.OkMessage @@ -41,42 +41,42 @@ class Result( ) @OptIn(DelicateCoroutinesApi::class) -suspend fun INostrClient.sendAndWaitForResponse( +suspend fun NostrClient.publishAndConfirm( event: Event, relayList: Set, timeoutInSeconds: Long = 15, -): Boolean = sendAndWaitForResponseDetailed(event, relayList, timeoutInSeconds).any { it.value } +): Boolean = publishAndConfirmDetailed(event, relayList, timeoutInSeconds).any { it.value } /** * Sends an event to the given relays and waits for OK responses. * Returns per-relay results: relay URL -> accepted (true/false). */ @OptIn(DelicateCoroutinesApi::class) -suspend fun INostrClient.sendAndWaitForResponseDetailed( +suspend fun NostrClient.publishAndConfirmDetailed( event: Event, relayList: Set, timeoutInSeconds: Long = 15, ): Map { val resultChannel = Channel(UNLIMITED) - Log.d("sendAndWaitForResponse", "Waiting for ${relayList.size} responses") + Log.d("publishAndConfirm", "Waiting for ${relayList.size} responses") val subscription = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onCannotConnect( relay: IRelayClient, errorMessage: String, ) { if (relay.url in relayList) { resultChannel.trySend(Result(relay.url, false)) - Log.d("sendAndWaitForResponse", "Error from relay ${relay.url}: $errorMessage") + Log.d("publishAndConfirm", "Error from relay ${relay.url}: $errorMessage") } } override fun onDisconnected(relay: IRelayClient) { if (relay.url in relayList) { resultChannel.trySend(Result(relay.url, false)) - Log.d("sendAndWaitForResponse", "Disconnected from relay ${relay.url}") + Log.d("publishAndConfirm", "Disconnected from relay ${relay.url}") } } @@ -91,7 +91,7 @@ suspend fun INostrClient.sendAndWaitForResponseDetailed( is OkMessage -> { if (msg.eventId == event.id) { resultChannel.trySend(Result(relay.url, msg.success)) - Log.d("sendAndWaitForResponse", "onSendResponse Received response for ${msg.eventId} from relay ${relay.url} message ${msg.message} success ${msg.success}") + Log.d("publishAndConfirm", "onSendResponse Received response for ${msg.eventId} from relay ${relay.url} message ${msg.message} success ${msg.success}") } } } @@ -100,7 +100,7 @@ suspend fun INostrClient.sendAndWaitForResponseDetailed( val receivedResults = try { - subscribe(subscription) + addConnectionListener(subscription) // subscribe before sending the result. val resultSubscription = @@ -123,20 +123,20 @@ suspend fun INostrClient.sendAndWaitForResponseDetailed( receivedResults } - send(event, relayList) + publish(event, relayList) result } resultSubscription.await() } finally { - unsubscribe(subscription) + removeConnectionListener(subscription) } // Clean up the channel resultChannel.close() - Log.d("sendAndWaitForResponse", "Finished with ${receivedResults.size} results") + Log.d("publishAndConfirm", "Finished with ${receivedResults.size} results") return receivedResults } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayInsertConfirmationCollector.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayInsertConfirmationCollector.kt index 1b73dcd78d..411df7b97e 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayInsertConfirmationCollector.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayInsertConfirmationCollector.kt @@ -21,8 +21,8 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.OkMessage @@ -32,11 +32,11 @@ import com.vitorpamplona.quartz.utils.Log * Listens to NostrClient's onEvent messages for caching purposes. */ class RelayInsertConfirmationCollector( - val client: INostrClient, + val client: NostrClient, val onRelayReceived: (eventId: HexKey, relay: IRelayClient) -> Unit, ) { private val clientListener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onIncomingMessage( relay: IRelayClient, msgStr: String, @@ -50,12 +50,12 @@ class RelayInsertConfirmationCollector( init { Log.d("RelayInsertConfirmationCollector", "Init, Subscribe") - client.subscribe(clientListener) + client.addConnectionListener(clientListener) } fun destroy() { // makes sure to run Log.d("RelayInsertConfirmationCollector", "Destroy, Unsubscribe") - client.unsubscribe(clientListener) + client.removeConnectionListener(clientListener) } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayLogger.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayLogger.kt index 303f8727fe..1a6734937b 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayLogger.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayLogger.kt @@ -20,8 +20,8 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.AuthMessage import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.ClosedMessage @@ -41,14 +41,14 @@ import com.vitorpamplona.quartz.utils.Log * Listens to NostrClient's onNotify messages from the relay */ class RelayLogger( - val client: INostrClient, + val client: NostrClient, val debugSending: Boolean = false, val debugReceiving: Boolean = false, ) { fun logTag(url: NormalizedRelayUrl) = "Relay ${url.displayUrl()}" private val clientListener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onIncomingMessage( relay: IRelayClient, msgStr: String, @@ -110,12 +110,12 @@ class RelayLogger( init { Log.d("RelayLogger", "Init, Subscribe") - client.subscribe(clientListener) + client.addConnectionListener(clientListener) } fun destroy() { // makes sure to run Log.d("RelayLogger", "Destroy, Unsubscribe") - client.unsubscribe(clientListener) + client.removeConnectionListener(clientListener) } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayNotifier.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayNotifier.kt index 7deb246908..67f4bad85c 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayNotifier.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayNotifier.kt @@ -20,8 +20,8 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.NotifyMessage @@ -31,7 +31,7 @@ import com.vitorpamplona.quartz.utils.Log * Listens to NostrClient's onNotify messages from the relay */ class RelayNotifier( - val client: INostrClient, + val client: NostrClient, val notify: (message: String, relay: IRelayClient) -> Unit, ) { companion object { @@ -39,7 +39,7 @@ class RelayNotifier( } private val clientListener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onIncomingMessage( relay: IRelayClient, msgStr: String, @@ -54,12 +54,12 @@ class RelayNotifier( init { Log.d(TAG, "Init, Subscribe") - client.subscribe(clientListener) + client.addConnectionListener(clientListener) } fun destroy() { // makes sure to run Log.d(TAG, "Destroy, Unsubscribe") - client.unsubscribe(clientListener) + client.removeConnectionListener(clientListener) } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayOfflineTracker.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayOfflineTracker.kt index abda66eb19..a3baede475 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayOfflineTracker.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/RelayOfflineTracker.kt @@ -20,8 +20,8 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.utils.Log @@ -30,7 +30,7 @@ import com.vitorpamplona.quartz.utils.Log * Listens to NostrClient's onNotify messages from the relay */ class RelayOfflineTracker( - val client: INostrClient, + val client: NostrClient, ) { companion object { const val TAG = "RelayOfflineTracker" @@ -39,7 +39,7 @@ class RelayOfflineTracker( var cannotConnectRelays = setOf() private val clientListener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onConnected( relay: IRelayClient, pingMillis: Int, @@ -58,12 +58,12 @@ class RelayOfflineTracker( init { Log.d(TAG, "Init, Subscribe") - client.subscribe(clientListener) + client.addConnectionListener(clientListener) } fun destroy() { // makes sure to run Log.d(TAG, "Destroy, Unsubscribe") - client.unsubscribe(clientListener) + client.removeConnectionListener(clientListener) } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/auth/RelayAuthenticator.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/auth/RelayAuthenticator.kt index 226f0ce8dd..1057b54c61 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/auth/RelayAuthenticator.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/auth/RelayAuthenticator.kt @@ -20,8 +20,8 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.auth -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.AuthMessage import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message @@ -46,14 +46,14 @@ object EmptyIAuthStatus : IAuthStatus { } class RelayAuthenticator( - val client: INostrClient, + val client: NostrClient, val scope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob()), val signWithAllLoggedInUsers: suspend (EventTemplate) -> List, ) : IAuthStatus { private val authStatus = mutableMapOf() private val clientListener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onIncomingMessage( relay: IRelayClient, msgStr: String, @@ -95,7 +95,7 @@ class RelayAuthenticator( ) { // if this is the OK of an auth event, renew all subscriptions and resend all outgoing events. if (authStatus[relay.url]?.checkAuthResults(msg.eventId, msg.success) == true) { - client.renewFilters(relay) + client.syncFilters(relay) } } @@ -103,12 +103,12 @@ class RelayAuthenticator( init { Log.d("RelayAuthenticator", "Init, Subscribe") - client.subscribe(clientListener) + client.addConnectionListener(clientListener) } fun destroy() { // makes sure to run Log.d("RelayAuthenticator", "Destroy, Unsubscribe") - client.unsubscribe(clientListener) + client.removeConnectionListener(clientListener) } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/counts/RelayActiveCountStates.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/counts/RelayActiveCountStates.kt index c8b7388c6a..81db54f814 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/counts/RelayActiveCountStates.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/counts/RelayActiveCountStates.kt @@ -20,8 +20,8 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.counts -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.ClosedMessage import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.CountMessage @@ -33,14 +33,14 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.utils.Log class RelayActiveCountStates( - val client: INostrClient, + val client: NostrClient, ) { private var queryStates = mutableMapOf>() fun subGetOrCreate(relay: NormalizedRelayUrl): CountQueryState = queryStates[relay] ?: CountQueryState().also { queryStates.put(relay, it) } private val clientListener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onConnecting(relay: IRelayClient) { queryStates.put(relay.url, CountQueryState()) } @@ -75,12 +75,12 @@ class RelayActiveCountStates( init { Log.d("RelaySubStateMachine", "Init, Subscribe") - client.subscribe(clientListener) + client.addConnectionListener(clientListener) } fun destroy() { // makes sure to run Log.d("RelaySubStateMachine", "Destroy, Unsubscribe") - client.unsubscribe(clientListener) + client.removeConnectionListener(clientListener) } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/listeners/RedirectRelayClientListener.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/listeners/RedirectConnectionListener.kt similarity index 95% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/listeners/RedirectRelayClientListener.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/listeners/RedirectConnectionListener.kt index 5438118744..5d7fba5ffc 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/listeners/RedirectRelayClientListener.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/listeners/RedirectConnectionListener.kt @@ -24,9 +24,9 @@ import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message import com.vitorpamplona.quartz.nip01Core.relay.commands.toRelay.Command -open class RedirectRelayClientListener( - val listener: IRelayClientListener, -) : IRelayClientListener { +open class RedirectConnectionListener( + val listener: RelayConnectionListener, +) : RelayConnectionListener { override fun onConnecting(relay: IRelayClient) { listener.onConnecting(relay) } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/listeners/IRelayClientListener.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/listeners/RelayConnectionListener.kt similarity index 96% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/listeners/IRelayClientListener.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/listeners/RelayConnectionListener.kt index 9910400b84..90d4c167b8 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/listeners/IRelayClientListener.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/listeners/RelayConnectionListener.kt @@ -24,7 +24,7 @@ import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message import com.vitorpamplona.quartz.nip01Core.relay.commands.toRelay.Command -interface IRelayClientListener { +interface RelayConnectionListener { fun onConnecting(relay: IRelayClient) {} /** @@ -72,4 +72,4 @@ interface IRelayClientListener { ) {} } -object EmptyClientListener : IRelayClientListener +object EmptyConnectionListener : RelayConnectionListener diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/pool/PoolRequests.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/pool/PoolRequests.kt index 0ea0c49d76..80e66a0b4a 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/pool/PoolRequests.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/pool/PoolRequests.kt @@ -20,9 +20,9 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.pool -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.ReqSubStatus import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.RequestSubscriptionState +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.ClosedMessage import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.EoseMessage @@ -51,7 +51,7 @@ class PoolRequests { * to what the app whants to do. */ private val desiredSubs = LargeCache>>() - private val desiredSubListeners = LargeCache() + private val desiredSubListeners = LargeCache() val desiredRelays = MutableStateFlow(setOf()) /** @@ -101,7 +101,7 @@ class PoolRequests { fun addOrUpdate( subId: String, filters: Map>, - listener: IRequestListener?, + listener: SubscriptionListener?, ): Set { // saves old relays val oldRelays = desiredSubs.get(subId)?.keys ?: emptySet() @@ -165,15 +165,15 @@ class PoolRequests { when (cmd) { is ReqCmd -> { subState(cmd.subId).onOpenReq(relay, cmd.filters) - desiredSubListeners.get(cmd.subId)?.onStartReq( + desiredSubListeners.get(cmd.subId)?.onSubscriptionStarted( relay = relay.url, forFilters = cmd.filters, ) } is CloseCmd -> { - subState(cmd.subId).onCloseReq(relay) - desiredSubListeners.get(cmd.subId)?.onCloseReq( + subState(cmd.subId).onSubscriptionClosed(relay) + desiredSubListeners.get(cmd.subId)?.onSubscriptionClosed( relay = relay.url, ) } @@ -193,7 +193,7 @@ class PoolRequests { state?.onNewEvent(relay.url) desiredSubListeners.get(msg.subId)?.onEvent( event = msg.event, - isLive = state?.currentState(relay.url) == ReqSubStatus.LIVE, + isRealTime = state?.currentState(relay.url) == ReqSubStatus.LIVE, relay = relay.url, forFilters = state?.lastKnownFilterStates(relay.url), ) @@ -201,8 +201,8 @@ class PoolRequests { is EoseMessage -> { val state = relayState.get(msg.subId) - state?.onEose(relay.url) - desiredSubListeners.get(msg.subId)?.onEose( + state?.onCaughtUp(relay.url) + desiredSubListeners.get(msg.subId)?.onCaughtUp( relay = relay.url, forFilters = state?.lastKnownFilterStates(relay.url), ) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/pool/RelayPool.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/pool/RelayPool.kt index 6f2c4b03a1..b60eda98a6 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/pool/RelayPool.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/pool/RelayPool.kt @@ -20,8 +20,8 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.pool -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.EmptyClientListener -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.EmptyConnectionListener +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.client.single.basic.BasicRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message @@ -56,8 +56,8 @@ import kotlinx.coroutines.flow.update */ class RelayPool( val websocketBuilder: WebsocketBuilder, - val listener: IRelayClientListener = EmptyClientListener, -) : IRelayClientListener { + val listener: RelayConnectionListener = EmptyConnectionListener, +) : RelayConnectionListener { private val relays = LargeCache() private val _connectedRelays = MutableStateFlow>(emptySet()) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientDynamicReq.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/DynamicSubscription.kt similarity index 81% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientDynamicReq.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/DynamicSubscription.kt index dd77200a37..a470fb871b 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientDynamicReq.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/DynamicSubscription.kt @@ -21,22 +21,22 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.reqs import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.utils.RandomInstance -class NostrClientDynamicReq( - val client: INostrClient, +class DynamicSubscription( + val client: NostrClient, val filter: () -> Map>, val onEvent: (event: Event) -> Unit = {}, -) : IRequestListener, - IOpenNostrRequest { +) : SubscriptionListener, + SubscriptionHandle { val subId = RandomInstance.randomChars(10) override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -47,16 +47,16 @@ class NostrClientDynamicReq( * Creates or Updates the filter with relays. This method should be called * everytime the filter changes. */ - override fun updateFilter() = client.openReqSubscription(subId, filter(), this) + override fun refresh() = client.subscribe(subId, filter(), this) - override fun close() = client.close(subId) + override fun close() = client.unsubscribe(subId) init { - updateFilter() + refresh() } } -fun INostrClient.req( +fun NostrClient.subscribe( filters: () -> Map>, onEvent: (event: Event) -> Unit = {}, -): IOpenNostrRequest = NostrClientDynamicReq(this, filters, onEvent) +): SubscriptionHandle = DynamicSubscription(this, filters, onEvent) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientStaticReqUntilEoseAsFlow.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientFetchAsFlowExt.kt similarity index 82% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientStaticReqUntilEoseAsFlow.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientFetchAsFlowExt.kt index 371c48d29d..0e9af3f6e7 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientStaticReqUntilEoseAsFlow.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientFetchAsFlowExt.kt @@ -22,7 +22,7 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.reqs import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer @@ -37,22 +37,22 @@ import kotlinx.coroutines.flow.callbackFlow * 3. Closes the flow (completes) when the relay sends EOSE, * cancelling the subscription automatically via [awaitClose]. */ -fun INostrClient.reqUntilEoseAsFlow( +fun NostrClient.fetchAsFlow( relay: String, filters: List, -) = reqUntilEoseAsFlow(RelayUrlNormalizer.normalize(relay), filters) +) = fetchAsFlow(RelayUrlNormalizer.normalize(relay), filters) -fun INostrClient.reqUntilEoseAsFlow( +fun NostrClient.fetchAsFlow( relay: String, filter: Filter, -) = reqUntilEoseAsFlow(RelayUrlNormalizer.normalize(relay), listOf(filter)) +) = fetchAsFlow(RelayUrlNormalizer.normalize(relay), listOf(filter)) -fun INostrClient.reqUntilEoseAsFlow( +fun NostrClient.fetchAsFlow( relay: NormalizedRelayUrl, filter: Filter, -) = reqUntilEoseAsFlow(relay, listOf(filter)) +) = fetchAsFlow(relay, listOf(filter)) -fun INostrClient.reqUntilEoseAsFlow( +fun NostrClient.fetchAsFlow( relay: NormalizedRelayUrl, filters: List, ): Flow> = @@ -62,10 +62,10 @@ fun INostrClient.reqUntilEoseAsFlow( var currentEvents = listOf() val listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -76,7 +76,7 @@ fun INostrClient.reqUntilEoseAsFlow( } } - override fun onEose( + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -84,9 +84,9 @@ fun INostrClient.reqUntilEoseAsFlow( } } - openReqSubscription(subId, mapOf(relay to filters), listener) + subscribe(subId, mapOf(relay to filters), listener) awaitClose { - close(subId) + unsubscribe(subId) } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientStaticReqAsStateFlow.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientSubscribeAsFlowExt.kt similarity index 86% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientStaticReqAsStateFlow.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientSubscribeAsFlowExt.kt index aacd7ec70d..a1580adb3d 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientStaticReqAsStateFlow.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientSubscribeAsFlowExt.kt @@ -22,7 +22,7 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.reqs import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer @@ -42,22 +42,22 @@ import kotlinx.coroutines.flow.callbackFlow * - They will be ignored if they are already in the list. * - They will be added to the beginning of the list if they are new. */ -fun INostrClient.reqAsFlow( +fun NostrClient.subscribeAsFlow( relay: String, filters: List, -) = reqAsFlow(RelayUrlNormalizer.normalize(relay), filters) +) = subscribeAsFlow(RelayUrlNormalizer.normalize(relay), filters) -fun INostrClient.reqAsFlow( +fun NostrClient.subscribeAsFlow( relay: String, filter: Filter, -) = reqAsFlow(RelayUrlNormalizer.normalize(relay), listOf(filter)) +) = subscribeAsFlow(RelayUrlNormalizer.normalize(relay), listOf(filter)) -fun INostrClient.reqAsFlow( +fun NostrClient.subscribeAsFlow( relay: NormalizedRelayUrl, filter: Filter, -) = reqAsFlow(relay, listOf(filter)) +) = subscribeAsFlow(relay, listOf(filter)) -fun INostrClient.reqAsFlow( +fun NostrClient.subscribeAsFlow( relay: NormalizedRelayUrl, filters: List, ): Flow> = @@ -68,10 +68,10 @@ fun INostrClient.reqAsFlow( var currentEvents = listOf() val listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -90,7 +90,7 @@ fun INostrClient.reqAsFlow( } } - override fun onEose( + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -98,9 +98,9 @@ fun INostrClient.reqAsFlow( } } - openReqSubscription(subId, mapOf(relay to filters), listener) + subscribe(subId, mapOf(relay to filters), listener) awaitClose { - close(subId) + unsubscribe(subId) } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/RelayActiveRequestStates.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/RelayActiveRequestStates.kt index f3c822491c..2f6f0e6743 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/RelayActiveRequestStates.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/RelayActiveRequestStates.kt @@ -20,8 +20,8 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.reqs -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.ClosedMessage import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.EoseMessage @@ -34,14 +34,14 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.utils.Log class RelayActiveRequestStates( - val client: INostrClient, + val client: NostrClient, ) { private var subStates = mutableMapOf>() fun subGetOrCreate(relay: NormalizedRelayUrl): RequestSubscriptionState = subStates[relay] ?: RequestSubscriptionState().also { subStates.put(relay, it) } private val clientListener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onConnecting(relay: IRelayClient) { subStates[relay.url] = RequestSubscriptionState() } @@ -53,7 +53,7 @@ class RelayActiveRequestStates( ) { when (msg) { is EventMessage -> subGetOrCreate(relay.url).onNewEvent(msg.subId) - is EoseMessage -> subGetOrCreate(relay.url).onEose(msg.subId) + is EoseMessage -> subGetOrCreate(relay.url).onCaughtUp(msg.subId) is ClosedMessage -> subGetOrCreate(relay.url).onClosed(msg.subId) } } @@ -66,7 +66,7 @@ class RelayActiveRequestStates( ) { when (cmd) { is ReqCmd -> subGetOrCreate(relay.url).onOpenReq(cmd.subId, cmd.filters) - is CloseCmd -> subGetOrCreate(relay.url).onCloseReq(cmd.subId) + is CloseCmd -> subGetOrCreate(relay.url).onSubscriptionClosed(cmd.subId) } } @@ -77,12 +77,12 @@ class RelayActiveRequestStates( init { Log.d("RelaySubStateMachine", "Init, Subscribe") - client.subscribe(clientListener) + client.addConnectionListener(clientListener) } fun destroy() { // makes sure to run Log.d("RelaySubStateMachine", "Destroy, Unsubscribe") - client.unsubscribe(clientListener) + client.removeConnectionListener(clientListener) } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/RequestSubscriptionState.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/RequestSubscriptionState.kt index 3cd75342f2..b32d3aaf83 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/RequestSubscriptionState.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/RequestSubscriptionState.kt @@ -57,7 +57,7 @@ class RequestSubscriptionState { } } - fun onEose(reference: T) { + fun onCaughtUp(reference: T) { subStates[reference] = ReqSubStatus.LIVE } @@ -80,7 +80,7 @@ class RequestSubscriptionState { lastKnownFilterStates[reference] = filters } - fun onCloseReq(reference: T) { + fun onSubscriptionClosed(reference: T) { subStates[reference] = ReqSubStatus.CLOSED filterStates.remove(reference) } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientStaticReq.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/StaticSubscription.kt similarity index 70% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientStaticReq.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/StaticSubscription.kt index f6e1371c6a..d093c3b2e5 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientStaticReq.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/StaticSubscription.kt @@ -21,23 +21,23 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.reqs import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer import com.vitorpamplona.quartz.utils.RandomInstance -class NostrClientStaticReq( - val client: INostrClient, +class StaticSubscription( + val client: NostrClient, val filter: Map>, val onEvent: (event: Event) -> Unit = {}, -) : IRequestListener, - IOpenNostrRequest { +) : SubscriptionListener, + SubscriptionHandle { val subId = RandomInstance.randomChars(10) override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -48,50 +48,50 @@ class NostrClientStaticReq( * Creates or Updates the filter with relays. This method should be called * everytime the filter changes. */ - override fun updateFilter() = client.openReqSubscription(subId, filter, this) + override fun refresh() = client.subscribe(subId, filter, this) - override fun close() = client.close(subId) + override fun close() = client.unsubscribe(subId) init { - updateFilter() + refresh() } } -fun INostrClient.req( +fun NostrClient.subscribe( relay: NormalizedRelayUrl, filters: List, onEvent: (event: Event) -> Unit = {}, -): IOpenNostrRequest = NostrClientStaticReq(this, mapOf(relay to filters), onEvent) +): SubscriptionHandle = StaticSubscription(this, mapOf(relay to filters), onEvent) -fun INostrClient.req( +fun NostrClient.subscribe( relay: NormalizedRelayUrl, filter: Filter, onEvent: (event: Event) -> Unit = {}, -): IOpenNostrRequest = NostrClientStaticReq(this, mapOf(relay to listOf(filter)), onEvent) +): SubscriptionHandle = StaticSubscription(this, mapOf(relay to listOf(filter)), onEvent) -fun INostrClient.req( +fun NostrClient.subscribe( relays: List, filters: List, onEvent: (event: Event) -> Unit = {}, -): IOpenNostrRequest = NostrClientStaticReq(this, relays.associateWith { filters }, onEvent) +): SubscriptionHandle = StaticSubscription(this, relays.associateWith { filters }, onEvent) -fun INostrClient.req( +fun NostrClient.subscribe( relays: List, filter: Filter, onEvent: (event: Event) -> Unit = {}, -): IOpenNostrRequest = NostrClientStaticReq(this, relays.associateWith { listOf(filter) }, onEvent) +): SubscriptionHandle = StaticSubscription(this, relays.associateWith { listOf(filter) }, onEvent) // ----------------------------------- // Helper methods with relay as string // ----------------------------------- -fun INostrClient.req( +fun NostrClient.subscribe( relay: String, filters: List, onEvent: (event: Event) -> Unit = {}, -): IOpenNostrRequest = NostrClientStaticReq(this, mapOf(RelayUrlNormalizer.normalize(relay) to filters), onEvent) +): SubscriptionHandle = StaticSubscription(this, mapOf(RelayUrlNormalizer.normalize(relay) to filters), onEvent) -fun INostrClient.req( +fun NostrClient.subscribe( relay: String, filter: Filter, onEvent: (event: Event) -> Unit = {}, -): IOpenNostrRequest = NostrClientStaticReq(this, mapOf(RelayUrlNormalizer.normalize(relay) to listOf(filter)), onEvent) +): SubscriptionHandle = StaticSubscription(this, mapOf(RelayUrlNormalizer.normalize(relay) to listOf(filter)), onEvent) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/IOpenNostrRequest.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/SubscriptionHandle.kt similarity index 95% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/IOpenNostrRequest.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/SubscriptionHandle.kt index c9eaea3041..6aa55066f4 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/IOpenNostrRequest.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/SubscriptionHandle.kt @@ -20,8 +20,8 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.reqs -interface IOpenNostrRequest { - fun updateFilter() +interface SubscriptionHandle { + fun refresh() fun close() } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/IRequestListener.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/SubscriptionListener.kt similarity index 92% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/IRequestListener.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/SubscriptionListener.kt index 4c88592f20..eb2dde2bbd 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/IRequestListener.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/SubscriptionListener.kt @@ -24,15 +24,15 @@ import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl -interface IRequestListener { - fun onEose( +interface SubscriptionListener { + fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) {} fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) {} @@ -49,10 +49,10 @@ interface IRequestListener { forFilters: List?, ) {} - fun onStartReq( + fun onSubscriptionStarted( relay: String, forFilters: List, ) {} - fun onCloseReq(relay: String) {} + fun onSubscriptionClosed(relay: String) {} } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/stats/RelayReqStats.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/stats/RelayReqStats.kt index 86d576f109..1d8793a634 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/stats/RelayReqStats.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/stats/RelayReqStats.kt @@ -20,8 +20,8 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.reqs.stats -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.EventMessage import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message @@ -31,12 +31,12 @@ import com.vitorpamplona.quartz.utils.Log * Listens to NostrClient's onNotify messages from the relay */ class RelayReqStats( - val client: INostrClient, + val client: NostrClient, ) { private val stats = ReqStatsRepository() private val clientListener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onIncomingMessage( relay: IRelayClient, msgStr: String, @@ -56,12 +56,12 @@ class RelayReqStats( init { Log.d("RelaySubStats", "Init, Subscribe") - client.subscribe(clientListener) + client.addConnectionListener(clientListener) } fun destroy() { // makes sure to run Log.d("RelaySubStats", "Destroy, Unsubscribe") - client.unsubscribe(clientListener) + client.removeConnectionListener(clientListener) } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/basic/BasicRelayClient.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/basic/BasicRelayClient.kt index c8a4373ffb..e832569884 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/basic/BasicRelayClient.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/basic/BasicRelayClient.kt @@ -21,7 +21,7 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.single.basic import com.vitorpamplona.quartz.nip01Core.core.OptimizedJsonMapper -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.client.single.basic.BasicRelayClient.Companion.DELAY_TO_RECONNECT_IN_SECS import com.vitorpamplona.quartz.nip01Core.relay.commands.toRelay.Command @@ -55,7 +55,7 @@ import kotlin.coroutines.cancellation.CancellationException open class BasicRelayClient( override val url: NormalizedRelayUrl, val socketBuilder: WebsocketBuilder, - val listener: IRelayClientListener, + val listener: RelayConnectionListener, ) : IRelayClient { companion object { // minimum wait time to reconnect: 1 second diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/standalone/StandaloneRelayClient.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/standalone/StandaloneRelayClient.kt index a5964708be..5063f03319 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/standalone/StandaloneRelayClient.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/single/standalone/StandaloneRelayClient.kt @@ -22,9 +22,9 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.single.standalone import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.EmptyClientListener -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RedirectRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.EmptyConnectionListener +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RedirectConnectionListener +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.client.single.basic.BasicRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message @@ -46,7 +46,7 @@ import com.vitorpamplona.quartz.utils.cache.LargeCache class StandaloneRelayClient( url: NormalizedRelayUrl, socketBuilder: WebsocketBuilder, - listener: IRelayClientListener = EmptyClientListener, + listener: RelayConnectionListener = EmptyConnectionListener, ) { private val outbox = LargeCache() private val reqs = LargeCache>() @@ -56,14 +56,14 @@ class StandaloneRelayClient( BasicRelayClient( url, socketBuilder, - object : RedirectRelayClientListener(listener) { + object : RedirectConnectionListener(listener) { override fun onConnected( relay: IRelayClient, pingMillis: Int, compressed: Boolean, ) { super.onConnected(relay, pingMillis, compressed) - renewFilters() + syncFilters() } override fun onIncomingMessage( @@ -83,7 +83,7 @@ class StandaloneRelayClient( }, ) - fun renewFilters() { + fun syncFilters() { outbox.forEach { id, event -> client.sendOrConnectAndSync(EventCmd(event)) } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/stats/RelayStats.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/stats/RelayStats.kt index 835499361f..cd35ccec25 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/stats/RelayStats.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/stats/RelayStats.kt @@ -21,8 +21,8 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.stats import androidx.collection.LruCache -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.ClosedMessage import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message @@ -35,7 +35,7 @@ import com.vitorpamplona.quartz.utils.Log import com.vitorpamplona.quartz.utils.bytesUsedInMemory class RelayStats( - val client: INostrClient, + val client: NostrClient, ) { private val innerCache = object : LruCache(1000) { @@ -47,7 +47,7 @@ class RelayStats( fun get(url: NormalizedRelayUrl): RelayStat = innerCache[url] ?: throw IllegalArgumentException("Should never happen") private val clientListener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onConnecting(relay: IRelayClient) { super.onConnecting(relay) with(get(relay.url)) { @@ -116,12 +116,12 @@ class RelayStats( init { Log.d("RelayStats", "Init, Subscribe") - client.subscribe(clientListener) + client.addConnectionListener(clientListener) } fun destroy() { // makes sure to run Log.d("RelayStats", "Destroy, Unsubscribe") - client.unsubscribe(clientListener) + client.removeConnectionListener(clientListener) } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/subscriptions/Subscription.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/subscriptions/Subscription.kt index 0e0b592c99..ef2a72ed08 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/subscriptions/Subscription.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/subscriptions/Subscription.kt @@ -20,14 +20,14 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.newSubId import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl data class Subscription( val id: String = newSubId(), - val listener: IRequestListener, + val listener: SubscriptionListener, ) { private var currentVersion: Map>? = null // Inactive when null diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/subscriptions/SubscriptionController.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/subscriptions/SubscriptionController.kt index cf926f8e4c..0481699ab0 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/subscriptions/SubscriptionController.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/subscriptions/SubscriptionController.kt @@ -20,8 +20,8 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.utils.cache.LargeCache @@ -45,7 +45,7 @@ import com.vitorpamplona.quartz.utils.cache.LargeCache * - Dismiss subscriptions with [dismissSubscription]. */ class SubscriptionController( - val client: INostrClient, + val client: NostrClient, ) { private val subscriptions = LargeCache() @@ -53,7 +53,7 @@ class SubscriptionController( fun requestNewSubscription( subId: String, - listener: IRequestListener, + listener: SubscriptionListener, ): Subscription = Subscription(subId, listener).also { subscriptions.put(it.id, it) } fun dismissSubscription(subId: String) = getSub(subId)?.let { dismissSubscription(it) } @@ -61,7 +61,7 @@ class SubscriptionController( fun dismissSubscription(subscription: Subscription) { subscription.reset() subscriptions.remove(subscription.id) - client.close(subscription.id) + client.unsubscribe(subscription.id) } fun updateRelays() { @@ -77,23 +77,23 @@ class SubscriptionController( fun updateRelaysIfNeeded( subId: String, - listener: IRequestListener, + listener: SubscriptionListener, newFilters: Map>?, oldFilters: Map>?, ) { if (oldFilters != null) { if (newFilters == null) { // was active and is not active anymore, just close. - client.close(subId) + client.unsubscribe(subId) } else { - client.openReqSubscription(subId, newFilters, listener) + client.subscribe(subId, newFilters, listener) } } else { if (newFilters == null) { // was not active and is still not active, does nothing } else { // was not active and becomes active, sends the entire filter. - client.openReqSubscription(subId, newFilters, listener) + client.subscribe(subId, newFilters, listener) } } } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/server/LiveEventStore.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/server/LiveEventStore.kt index 4268dcef39..9013ffc666 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/server/LiveEventStore.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/server/LiveEventStore.kt @@ -54,13 +54,13 @@ class LiveEventStore( suspend fun query( filters: List, onEach: (Event) -> Unit, - onEose: () -> Unit, + onCaughtUp: () -> Unit, ) { // 1. Replay stored events matching filters. store.query(filters, onEach) // 2. Signal end of stored events. - onEose() + onCaughtUp() // 3. Stream live events until cancelled. newEventStream.collect { newEvent -> diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/server/RelaySession.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/server/RelaySession.kt index 2a384d8a68..f81436b7e3 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/server/RelaySession.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/server/RelaySession.kt @@ -146,7 +146,7 @@ class RelaySession( send(EventMessage(cmd.subId, event)) } }, - onEose = { send(EoseMessage(cmd.subId)) }, + onCaughtUp = { send(EoseMessage(cmd.subId)) }, ) } catch (_: kotlinx.coroutines.CancellationException) { // Subscription was closed – this is expected. diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip46RemoteSigner/signer/NostrSignerRemote.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip46RemoteSigner/signer/NostrSignerRemote.kt index 515043d44c..8f07a56560 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip46RemoteSigner/signer/NostrSignerRemote.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip46RemoteSigner/signer/NostrSignerRemote.kt @@ -22,8 +22,8 @@ package com.vitorpamplona.quartz.nip46RemoteSigner.signer import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.req +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.StaticSubscription import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.signers.EventTemplate @@ -52,7 +52,7 @@ class NostrSignerRemote( val signer: NostrSignerInternal, val remotePubkey: HexKey, val relays: Set, - val client: INostrClient, + val client: NostrClient, val permissions: String? = null, val secret: String? = null, ) : NostrSigner(signer.pubKey) { @@ -67,13 +67,16 @@ class NostrSignerRemote( ) val subscription = - client.req( - relays = relays.toList(), - filter = - Filter( - kinds = listOf(NostrConnectEvent.KIND), - tags = mapOf("p" to listOf(signer.pubKey)), - ), + StaticSubscription( + client, + relays.associateWith { + listOf( + Filter( + kinds = listOf(NostrConnectEvent.KIND), + tags = mapOf("p" to listOf(signer.pubKey)), + ), + ) + }, ) { event -> if (event is NostrConnectEvent) { scope.launch { @@ -83,7 +86,7 @@ class NostrSignerRemote( } fun openSubscription() { - subscription.updateFilter() + subscription.refresh() } fun closeSubscription() { @@ -293,7 +296,7 @@ class NostrSignerRemote( fun fromBunkerUri( bunkerUri: String, signer: NostrSignerInternal, - client: INostrClient, + client: NostrClient, permissions: String? = null, ): NostrSignerRemote { if (!bunkerUri.startsWith("bunker://")) throw Exception("Invalid bunker uri") diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip46RemoteSigner/signer/RemoteSignerManager.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip46RemoteSigner/signer/RemoteSignerManager.kt index adae21dfac..bec9768012 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip46RemoteSigner/signer/RemoteSignerManager.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip46RemoteSigner/signer/RemoteSignerManager.kt @@ -21,7 +21,7 @@ package com.vitorpamplona.quartz.nip46RemoteSigner.signer import com.vitorpamplona.quartz.nip01Core.core.OptimizedJsonMapper -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal import com.vitorpamplona.quartz.nip46RemoteSigner.BunkerRequest @@ -34,7 +34,7 @@ import kotlin.coroutines.resume class RemoteSignerManager( val timeout: Long = 30000, - val client: INostrClient, + val client: NostrClient, val signer: NostrSignerInternal, val remoteKey: String, val relayList: Set, @@ -77,7 +77,7 @@ class RemoteSignerManager( awaitingRequests.put(request.id, continuation) - client.send(event, relayList = relayList) + client.publish(event, relayList = relayList) } return when (result) { diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip77Negentropy/NegentropyManager.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip77Negentropy/NegentropyManager.kt index 7401a63be8..4af65a8d2b 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip77Negentropy/NegentropyManager.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip77Negentropy/NegentropyManager.kt @@ -21,7 +21,7 @@ package com.vitorpamplona.quartz.nip77Negentropy import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter @@ -58,7 +58,7 @@ interface INegentropyListener { /** * Manages NIP-77 negentropy sync sessions across multiple relays. * - * This class acts as a [IRelayClientListener] that intercepts NEG-MSG and NEG-ERR + * This class acts as a [RelayConnectionListener] that intercepts NEG-MSG and NEG-ERR * messages and drives the reconciliation protocol. It maintains active sessions * per relay and subscription ID. * @@ -69,7 +69,7 @@ interface INegentropyListener { */ class NegentropyManager( private val listener: INegentropyListener, -) : IRelayClientListener { +) : RelayConnectionListener { private val activeSessions = mutableMapOf>() fun startSync( diff --git a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip46RemoteSigner/signer/NostrSignerRemoteIsolationTest.kt b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip46RemoteSigner/signer/NostrSignerRemoteIsolationTest.kt index 946b8fb2da..e19fb4afa5 100644 --- a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip46RemoteSigner/signer/NostrSignerRemoteIsolationTest.kt +++ b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip46RemoteSigner/signer/NostrSignerRemoteIsolationTest.kt @@ -22,9 +22,9 @@ package com.vitorpamplona.quartz.nip46RemoteSigner.signer import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair -import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl @@ -37,10 +37,10 @@ import kotlin.test.assertNotNull import kotlin.test.assertTrue /** - * INostrClient that records openReqSubscription calls for verification. + * NostrClient that records subscribe calls for verification. * Used instead of mockk since commonTest doesn't have mockk. */ -private class TrackingNostrClient : INostrClient { +private class TrackingNostrClient : NostrClient { data class SubscriptionRecord( val subId: String, val filters: Map>, @@ -64,33 +64,33 @@ private class TrackingNostrClient : INostrClient { override fun isActive() = false - override fun renewFilters(relay: IRelayClient) {} + override fun syncFilters(relay: IRelayClient) {} - override fun openReqSubscription( + override fun subscribe( subId: String, filters: Map>, - listener: IRequestListener?, + listener: SubscriptionListener?, ) { subscriptions.add(SubscriptionRecord(subId, filters)) } - override fun queryCount( + override fun count( subId: String, filters: Map>, ) {} - override fun close(subId: String) {} + override fun unsubscribe(subId: String) {} - override fun send( + override fun publish( event: Event, relayList: Set, ) { sentEvents.add(event to relayList) } - override fun subscribe(listener: IRelayClientListener) {} + override fun addConnectionListener(listener: RelayConnectionListener) {} - override fun unsubscribe(listener: IRelayClientListener) {} + override fun removeConnectionListener(listener: RelayConnectionListener) {} override fun getReqFiltersOrNull(subId: String): Map>? = null @@ -120,7 +120,7 @@ class NostrSignerRemoteIsolationTest { val trackingClient = TrackingNostrClient() val ephemeralSigner = NostrSignerInternal(KeyPair()) - // Construction triggers client.req() which calls openReqSubscription + // Construction triggers client.subscribe() which calls subscribe NostrSignerRemote( signer = ephemeralSigner, remotePubkey = validHex, diff --git a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientFirstEventTest.kt b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientFirstEventTest.kt index 5f5e888ea2..655db87210 100644 --- a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientFirstEventTest.kt +++ b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientFirstEventTest.kt @@ -19,10 +19,9 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.vitorpamplona.quartz.nip01Core.relay - import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.downloadFirstEvent +import com.vitorpamplona.quartz.nip01Core.relay.client.DefaultNostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.fetchFirst import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -37,10 +36,10 @@ class NostrClientFirstEventTest : BaseNostrClientTest() { fun testDownloadFirstEvent() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = NostrClient(socketBuilder, appScope) + val client = DefaultNostrClient(socketBuilder, appScope) val event = - client.downloadFirstEvent( + client.fetchFirst( relay = "wss://nos.lol", filter = Filter( diff --git a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientManualSubTest.kt b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientManualSubTest.kt index e974d964da..eee18c4974 100644 --- a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientManualSubTest.kt +++ b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientManualSubTest.kt @@ -19,11 +19,10 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.vitorpamplona.quartz.nip01Core.relay - import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.IRequestListener +import com.vitorpamplona.quartz.nip01Core.relay.client.DefaultNostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer @@ -43,24 +42,24 @@ class NostrClientManualSubTest : BaseNostrClientTest() { fun testEoseAfter100Events() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = NostrClient(socketBuilder, appScope) + val client = DefaultNostrClient(socketBuilder, appScope) val resultChannel = Channel(UNLIMITED) val events = mutableListOf() val mySubId = "test-sub-id-1" val listener = - object : IRequestListener { + object : SubscriptionListener { override fun onEvent( event: Event, - isLive: Boolean, + isRealTime: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { resultChannel.trySend(event.id) } - override fun onEose( + override fun onCaughtUp( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -79,7 +78,7 @@ class NostrClientManualSubTest : BaseNostrClientTest() { ), ) - client.openReqSubscription(mySubId, filters, listener) + client.subscribe(mySubId, filters, listener) withTimeoutOrNull(10000) { while (events.size < 101) { @@ -90,7 +89,7 @@ class NostrClientManualSubTest : BaseNostrClientTest() { resultChannel.close() - client.close(mySubId) + client.unsubscribe(mySubId) client.disconnect() appScope.cancel() diff --git a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientQueryCountTest.kt b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientQueryCountTest.kt index d58ed363fd..36bd0c0ae3 100644 --- a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientQueryCountTest.kt +++ b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientQueryCountTest.kt @@ -19,9 +19,8 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.vitorpamplona.quartz.nip01Core.relay - -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.queryCountSuspend +import com.vitorpamplona.quartz.nip01Core.relay.client.DefaultNostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.count import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.normalizeRelayUrl import junit.framework.TestCase.assertTrue @@ -43,9 +42,9 @@ class NostrClientQueryCountTest : BaseNostrClientTest() { fun testQueryCountSuspend() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = NostrClient(socketBuilder, appScope) + val client = DefaultNostrClient(socketBuilder, appScope) - val result = client.queryCountSuspend(relay = fiatjaf, filter = metadata) + val result = client.count(fiatjaf, metadata) assertTrue((result?.count ?: 0) > 1) @@ -57,9 +56,9 @@ class NostrClientQueryCountTest : BaseNostrClientTest() { fun testQueryCountSuspendAllEvents() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = NostrClient(socketBuilder, appScope) + val client = DefaultNostrClient(socketBuilder, appScope) - val result = client.queryCountSuspend(relay = fiatjaf, filter = Filter()) + val result = client.count(fiatjaf, Filter()) assertTrue((result?.count ?: 0) > 1) @@ -71,20 +70,19 @@ class NostrClientQueryCountTest : BaseNostrClientTest() { fun testQueryCountSuspendMultipleRelays() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = NostrClient(socketBuilder, appScope) + val client = DefaultNostrClient(socketBuilder, appScope) - val result = - client.queryCountSuspend( - filters = - mapOf( - fiatjaf to listOf(metadata, outboxRelays), - utxo to listOf(metadata, outboxRelays), - ), + val results = + client.count( + mapOf( + fiatjaf to listOf(metadata, outboxRelays), + utxo to listOf(metadata, outboxRelays), + ), ) - result.forEach { url, result -> - println("${url.url}: ${result.count}") - assertTrue(result.count > 1) + results.forEach { (url, countResult) -> + println("${url.url}: ${countResult.count}") + assertTrue(countResult.count > 1) } client.disconnect() diff --git a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientRepeatSubTest.kt b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientRepeatSubTest.kt index 7334cb1583..a5012b39bb 100644 --- a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientRepeatSubTest.kt +++ b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientRepeatSubTest.kt @@ -19,10 +19,9 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.vitorpamplona.quartz.nip01Core.relay - import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.IRelayClientListener +import com.vitorpamplona.quartz.nip01Core.relay.client.DefaultNostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.listeners.RelayConnectionListener import com.vitorpamplona.quartz.nip01Core.relay.client.single.IRelayClient import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.EoseMessage import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.EventMessage @@ -49,14 +48,14 @@ class NostrClientRepeatSubTest : BaseNostrClientTest() { fun testRepeatSubEvents() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = NostrClient(socketBuilder, appScope) + val client = DefaultNostrClient(socketBuilder, appScope) val resultChannel = Channel(UNLIMITED) val events = mutableListOf() val mySubId = "test-sub-id-2" val listener = - object : IRelayClientListener { + object : RelayConnectionListener { override fun onIncomingMessage( relay: IRelayClient, msgStr: String, @@ -79,7 +78,7 @@ class NostrClientRepeatSubTest : BaseNostrClientTest() { } } - client.subscribe(listener) + client.addConnectionListener(listener) val filters = mapOf( @@ -121,10 +120,10 @@ class NostrClientRepeatSubTest : BaseNostrClientTest() { Log.d("Test", "Processing message ${events.size}") // simulates an update in the middle of the sub if (events.size == 1) { - client.openReqSubscription(mySubId, filtersShouldIgnore) + client.subscribe(mySubId, filtersShouldIgnore) } if (events.size == 5) { - client.openReqSubscription(mySubId, filtersShouldSendAfterEOSE) + client.subscribe(mySubId, filtersShouldSendAfterEOSE) } events.add(resultChannel.receive()) } @@ -132,12 +131,12 @@ class NostrClientRepeatSubTest : BaseNostrClientTest() { } launch { - client.openReqSubscription(mySubId, filters) + client.subscribe(mySubId, filters) } } - client.close(mySubId) - client.unsubscribe(listener) + client.unsubscribe(mySubId) + client.removeConnectionListener(listener) client.disconnect() appScope.cancel() diff --git a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientReqBypassingRelayLimitsTest.kt b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientReqBypassingRelayLimitsTest.kt index 352ecada21..9f4e576e25 100644 --- a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientReqBypassingRelayLimitsTest.kt +++ b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientReqBypassingRelayLimitsTest.kt @@ -19,11 +19,10 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.vitorpamplona.quartz.nip01Core.relay - import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.reqBypassingRelayLimits +import com.vitorpamplona.quartz.nip01Core.relay.client.DefaultNostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.fetchAllPages import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip02FollowList.ContactListEvent import kotlinx.coroutines.CoroutineScope @@ -40,13 +39,13 @@ class NostrClientReqBypassingRelayLimitsTest : BaseNostrClientTest() { fun testDownloadFromRelayReturnsMetadataEvents() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = NostrClient(socketBuilder, appScope) + val client = DefaultNostrClient(socketBuilder, appScope) val events = mutableListOf() // nos.lol returns only 500 events per req val totalFound = - client.reqBypassingRelayLimits( + client.fetchAllPages( relay = "wss://nos.lol", filters = listOf( @@ -74,14 +73,14 @@ class NostrClientReqBypassingRelayLimitsTest : BaseNostrClientTest() { fun testDownloadFromRelayReturnsMetadataAndContactListEvents() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = NostrClient(socketBuilder, appScope) + val client = DefaultNostrClient(socketBuilder, appScope) val metadataEvents = mutableListOf() val contactListEvents = mutableListOf() // nos.lol returns only 500 events per req val totalFound = - client.reqBypassingRelayLimits( + client.fetchAllPages( relay = "wss://nos.lol", filters = listOf( diff --git a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSendAndWaitTest.kt b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSendAndWaitTest.kt index e942fe1345..a347fd0644 100644 --- a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSendAndWaitTest.kt +++ b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSendAndWaitTest.kt @@ -19,10 +19,9 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.vitorpamplona.quartz.nip01Core.relay - import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.sendAndWaitForResponse +import com.vitorpamplona.quartz.nip01Core.relay.client.DefaultNostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.publishAndConfirm import com.vitorpamplona.quartz.nip01Core.relay.normalizer.normalizeRelayUrl import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal import com.vitorpamplona.quartz.nip10Notes.TextNoteEvent @@ -39,20 +38,20 @@ class NostrClientSendAndWaitTest : BaseNostrClientTest() { fun testSendAndWaitForResponse() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = NostrClient(socketBuilder, appScope) + val client = DefaultNostrClient(socketBuilder, appScope) val randomSigner = NostrSignerInternal(KeyPair()) val event = randomSigner.sign(TextNoteEvent.build("Hello World")) val resultDamus = - client.sendAndWaitForResponse( + client.publishAndConfirm( event = event, relayList = setOf("wss://nostr.bitcoiner.social".normalizeRelayUrl()), ) val resultNos = - client.sendAndWaitForResponse( + client.publishAndConfirm( event = event, relayList = setOf("wss://nos.lol".normalizeRelayUrl()), ) diff --git a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSubscriptionAsFlowTest.kt b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSubscriptionAsFlowTest.kt index 7afd9caad4..6a9964c799 100644 --- a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSubscriptionAsFlowTest.kt +++ b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSubscriptionAsFlowTest.kt @@ -19,11 +19,10 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.vitorpamplona.quartz.nip01Core.relay - import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.reqAsFlow +import com.vitorpamplona.quartz.nip01Core.relay.client.DefaultNostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.subscribeAsFlow import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.utils.Log import kotlinx.coroutines.CoroutineScope @@ -50,10 +49,10 @@ class NostrClientSubscriptionAsFlowTest : BaseNostrClientTest() { fun testNostrClientSubscriptionAsFlow() = runTest { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = NostrClient(socketBuilder, appScope) + val client = DefaultNostrClient(socketBuilder, appScope) val flow = - client.reqAsFlow( + client.subscribeAsFlow( relay = "wss://nos.lol", filter = Filter( @@ -89,10 +88,10 @@ class NostrClientSubscriptionAsFlowTest : BaseNostrClientTest() { fun testNostrClientSubscriptionAsFlowDebouncing() = runTest { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = NostrClient(socketBuilder, appScope) + val client = DefaultNostrClient(socketBuilder, appScope) val flow = - client.reqAsFlow( + client.subscribeAsFlow( relay = "wss://nos.lol", filter = Filter( diff --git a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSubscriptionTest.kt b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSubscriptionTest.kt index 00c37f00ea..360f4e534f 100644 --- a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSubscriptionTest.kt +++ b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSubscriptionTest.kt @@ -19,12 +19,12 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.vitorpamplona.quartz.nip01Core.relay - import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.req +import com.vitorpamplona.quartz.nip01Core.relay.client.DefaultNostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.StaticSubscription import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter +import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob @@ -41,19 +41,23 @@ class NostrClientSubscriptionTest : BaseNostrClientTest() { fun testNostrClientSubscription() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = NostrClient(socketBuilder, appScope) + val client = DefaultNostrClient(socketBuilder, appScope) val resultChannel = Channel(UNLIMITED) val events = mutableSetOf() val sub = - client.req( - relay = "wss://nos.lol", - filter = - Filter( - kinds = listOf(MetadataEvent.KIND), - limit = 100, - ), + StaticSubscription( + client, + mapOf( + RelayUrlNormalizer.normalize("wss://nos.lol") to + listOf( + Filter( + kinds = listOf(MetadataEvent.KIND), + limit = 100, + ), + ), + ), ) { event -> assertEquals(MetadataEvent.KIND, event.kind) resultChannel.trySend(event) diff --git a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSubscriptionUntilEoseAsFlowTest.kt b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSubscriptionUntilEoseAsFlowTest.kt index de36239681..2ed7002248 100644 --- a/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSubscriptionUntilEoseAsFlowTest.kt +++ b/quartz/src/jvmAndroidTest/kotlin/com/vitorpamplona/quartz/nip01Core/relay/NostrClientSubscriptionUntilEoseAsFlowTest.kt @@ -19,11 +19,10 @@ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package com.vitorpamplona.quartz.nip01Core.relay - import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient -import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.reqUntilEoseAsFlow +import com.vitorpamplona.quartz.nip01Core.relay.client.DefaultNostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.fetchAsFlow import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.utils.Log import kotlinx.coroutines.CoroutineScope @@ -50,10 +49,10 @@ class NostrClientSubscriptionUntilEoseAsFlowTest : BaseNostrClientTest() { fun testNostrClientSubscriptionUntilEoseAsFlow() = runTest { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = NostrClient(socketBuilder, appScope) + val client = DefaultNostrClient(socketBuilder, appScope) val flow = - client.reqUntilEoseAsFlow( + client.fetchAsFlow( relay = "wss://nos.lol", filter = Filter( @@ -89,10 +88,10 @@ class NostrClientSubscriptionUntilEoseAsFlowTest : BaseNostrClientTest() { fun testNostrClientSubscriptionUntilEoseAsFlowDebouncing() = runTest { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = NostrClient(socketBuilder, appScope) + val client = DefaultNostrClient(socketBuilder, appScope) val flow = - client.reqUntilEoseAsFlow( + client.fetchAsFlow( relay = "wss://nos.lol", filter = Filter(