From 4e2717c5c5fd0129fdecb22eedfebfce2429ee4b Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 28 Mar 2026 03:23:20 +0000 Subject: [PATCH 1/5] refactor: simplify NostrClient API for beginner-friendliness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Comprehensive rename of the NostrClient relay infrastructure to use intuitive, self-documenting names instead of protocol-level jargon. Interface/class renames: - INostrClient → NostrClient (interface) - NostrClient → DefaultNostrClient (implementation) - IRequestListener → SubscriptionListener - IRelayClientListener → RelayConnectionListener - IOpenNostrRequest → SubscriptionHandle - NostrClientStaticReq → StaticSubscription - NostrClientDynamicReq → DynamicSubscription Method renames: - openReqSubscription() → subscribe() - close(subId) → unsubscribe(subId) - send() → publish() - queryCount() → count() - subscribe/unsubscribe(listener) → addConnectionListener/removeConnectionListener - renewFilters() → syncFilters() Callback renames: - onEose → onCaughtUp - isLive → isRealTime - onStartReq → onSubscriptionStarted - onCloseReq → onSubscriptionClosed Extension function renames: - query() → fetchAll() - downloadFirstEvent() → fetchFirst() - req() → subscribe() - reqAsFlow() → subscribeAsFlow() - reqUntilEoseAsFlow() → fetchAsFlow() - sendAndWaitForResponse() → publishAndConfirm() - queryCountSuspend() → count() - queryCountMergedHll() → countMerged() - reqBypassingRelayLimits() → fetchAllPages() - updateFilter() → refresh() on SubscriptionHandle https://claude.ai/code/session_01JPcYCcRx5eZN4GvgGxGwbf --- .../ThreadDualAxisChartAssemblerTest.kt | 3 +- .../relays/eventsync/EventSyncTest.kt | 5 +- .../com/vitorpamplona/amethyst/AppModules.kt | 3 +- .../vitorpamplona/amethyst/model/Account.kt | 42 +++++++------- .../model/accountsCache/AccountCacheState.kt | 4 +- .../model/nip62Vanish/VanishRequestsState.kt | 8 +-- .../service/broadcast/BroadcastTracker.kt | 24 ++++---- .../relayClient/CacheClientConnector.kt | 4 +- .../relayClient/RelayProxyClientConnector.kt | 4 +- .../authCommand/model/AuthCoordinator.kt | 4 +- .../eoseManagers/PerUniqueIdEoseManager.kt | 14 ++--- .../PerUserAndFollowListEoseManager.kt | 14 ++--- .../eoseManagers/PerUserEoseManager.kt | 14 ++--- .../SingleSubNoEoseCacheEoseManager.kt | 14 ++--- .../notifyCommand/model/NotifyCoordinator.kt | 4 +- .../RelaySubscriptionsCoordinator.kt | 4 +- .../account/AccountFilterAssembler.kt | 4 +- .../drafts/AccountDraftsEoseManager.kt | 4 +- .../AccountFollowsLoaderSubAssembler.kt | 14 ++--- .../metadata/AccountMetadataEoseManager.kt | 4 +- ...NotificationsEoseFromInboxRelaysManager.kt | 4 +- ...otificationsEoseFromRandomRelaysManager.kt | 4 +- .../AccountGiftWrapsEoseManager.kt | 4 +- .../ChannelFinderFilterAssemblyGroup.kt | 4 +- ...adataAndLiveActivityWatcherSubAssembler.kt | 4 +- .../ChannelLoaderSubAssembler.kt | 4 +- .../ChannelMetadataWatcherSubAssembler.kt | 4 +- .../LiveActivityWatcherSubAssembly.kt | 4 +- .../event/EventFinderFilterAssembler.kt | 4 +- .../loaders/NoteEventLoaderSubAssembler.kt | 4 +- .../watchers/EventWatcherSubAssembler.kt | 4 +- .../nwc/NWCPaymentFilterAssembler.kt | 4 +- .../nwc/NWCPaymentWatcherSubAssembler.kt | 4 +- .../user/UserFinderFilterAssembler.kt | 4 +- .../loaders/UserOutboxFinderSubAssembler.kt | 10 ++-- .../user/watchers/UserCardsSubAssembler.kt | 4 +- .../user/watchers/UserReportsSubAssembler.kt | 4 +- .../user/watchers/UserWatcherSubAssembler.kt | 14 ++--- .../searchCommand/SearchFilterAssembler.kt | 4 +- .../SearchPostWatcherSubAssembler.kt | 4 +- .../SearchUserWatcherSubAssembler.kt | 4 +- .../speedLogger/RelaySpeedLogger.kt | 12 ++-- .../ui/screen/AccountSessionManager.kt | 4 +- .../ui/screen/loggedIn/AccountViewModel.kt | 3 +- .../datasource/ChatroomFilterAssembler.kt | 4 +- .../datasource/ChatroomFilterSubAssembler.kt | 4 +- .../datasource/ChannelFilterAssembler.kt | 4 +- .../ChannelFromUserFilterSubAssembler.kt | 4 +- .../ChannelPublicFilterSubAssembler.kt | 4 +- .../datasource/ChatroomListFilterAssembler.kt | 4 +- .../DMsFromUserFilterSubAssembler.kt | 4 +- .../FollowingEphemeralChatSubAssembler.kt | 4 +- .../FollowingPublicChatSubAssembler.kt | 4 +- .../datasource/ChessFeedFilterSubAssembler.kt | 4 +- .../chess/datasource/ChessFilterAssembler.kt | 4 +- .../CommunityFeedFilterSubAssembler.kt | 4 +- .../datasource/CommunityFilterAssembler.kt | 4 +- .../datasource/DiscoveryFilterAssembler.kt | 4 +- ...yFollowsSetsAndLiveStreamsSubAssembler2.kt | 4 +- ...yLongFormClassifiedsAndDVMSubAssembler1.kt | 4 +- ...yPublicChatsAndCommunitiesSubAssembler3.kt | 4 +- .../FollowPackFeedFilterAssembler.kt | 4 +- .../FollowPackFeedFilterSubAssembler.kt | 4 +- .../GeoHashFeedFilterSubAssembler.kt | 4 +- .../datasource/GeoHashFilterAssembler.kt | 4 +- .../HashtagFeedFilterSubAssembler.kt | 4 +- .../datasource/HashtagFilterAssembler.kt | 4 +- .../home/datasource/HomeFilterAssembler.kt | 4 +- .../HomeOutboxEventsEoseManager.kt | 4 +- .../datasource/UserProfileFilterAssembler.kt | 4 +- .../UserProfileFollowersFilterSubAssembler.kt | 4 +- .../UserProfileMediaFilterSubAssembler.kt | 4 +- .../UserProfileMetadataFilterSubAssembler.kt | 4 +- .../UserProfilePostsFilterSubAssembler.kt | 4 +- .../UserProfileZapsFilterSubAssembler.kt | 4 +- .../datasource/RelayFeedFilterAssembler.kt | 4 +- .../datasource/RelayFeedFilterSubAssembler.kt | 4 +- .../relays/common/BasicRelaySetupInfoModel.kt | 4 +- .../RelayInfoNip66FilterAssembler.kt | 4 +- .../RelayInfoNip66FilterSubAssembler.kt | 4 +- .../loggedIn/relays/eventsync/EventSync.kt | 28 +++++----- .../relays/nip65/Nip65RelayListViewModel.kt | 6 +- .../datasources/ThreadFilterAssembler.kt | 4 +- .../ThreadEventLoaderSubAssembler.kt | 4 +- .../subassembies/ThreadFilterSubAssembler.kt | 4 +- .../video/datasource/VideoFilterAssembler.kt | 4 +- .../VideoOutboxEventsFilterSubAssembler.kt | 4 +- .../commons/chess/ChessRelayFetchHelper.kt | 20 +++---- .../domain/nip46/BunkerLoginUseCase.kt | 4 +- .../domain/nip46/NostrConnectLoginUseCase.kt | 31 +++++----- .../assemblers/FeedMetadataCoordinator.kt | 12 ++-- .../assemblers/MetadataFilterAssembler.kt | 4 +- .../assemblers/ReactionsFilterAssembler.kt | 4 +- .../eoseManagers/BaseEoseManager.kt | 8 +-- .../eoseManagers/PerKeyEoseManager.kt | 14 ++--- .../eoseManagers/SingleSubEoseManager.kt | 14 ++--- .../commons/chess/ChessEventBroadcaster.kt | 24 ++++---- .../vitorpamplona/amethyst/desktop/Main.kt | 2 +- .../desktop/account/AccountManager.kt | 27 +++++---- .../amethyst/desktop/chess/ChessScreen.kt | 2 +- .../desktop/network/RelayConnectionManager.kt | 38 ++++++------- .../amethyst/desktop/nwc/NwcPaymentHandler.kt | 2 +- .../subscriptions/ChessSubscription.kt | 26 ++++----- .../DesktopRelaySubscriptionsCoordinator.kt | 32 +++++------ .../desktop/subscriptions/FeedSubscription.kt | 56 +++++++++---------- .../desktop/subscriptions/FilterDMs.kt | 16 +++--- .../subscriptions/ProfileSubscription.kt | 20 +++---- .../subscriptions/SubscriptionUtils.kt | 14 ++--- .../desktop/ui/ArticleEditorScreen.kt | 2 +- .../desktop/ui/ArticleReaderScreen.kt | 4 +- .../amethyst/desktop/ui/BookmarksScreen.kt | 6 +- .../amethyst/desktop/ui/FeedScreen.kt | 2 +- .../amethyst/desktop/ui/NoteActions.kt | 14 ++--- .../desktop/ui/NotificationsScreen.kt | 2 +- .../amethyst/desktop/ui/ReadsScreen.kt | 4 +- .../amethyst/desktop/ui/SearchScreen.kt | 6 +- .../amethyst/desktop/ui/ThreadScreen.kt | 4 +- .../amethyst/desktop/ui/UserProfileScreen.kt | 14 ++--- .../desktop/ui/chats/ChatroomListState.kt | 6 +- .../desktop/ui/chats/DmSendTracker.kt | 8 +-- .../amethyst/desktop/ui/chats/NewDmDialog.kt | 2 +- .../desktop/cache/CoordinatorPipelineTest.kt | 28 +++++----- .../{NostrClient.kt => DefaultNostrClient.kt} | 32 +++++------ ...NostrClient.kt => NostrClientInterface.kt} | 40 ++++++------- .../client/accessories/EventCollector.kt | 12 ++-- .../client/accessories/NostrClientCountExt.kt | 32 +++++------ ...tQueryExt.kt => NostrClientFetchAllExt.kt} | 40 ++++++------- ...sExt.kt => NostrClientFetchAllPagesExt.kt} | 22 ++++---- ...loadExt.kt => NostrClientFetchFirstExt.kt} | 40 ++++++------- ...AndWaitExt.kt => NostrClientPublishExt.kt} | 28 +++++----- .../RelayInsertConfirmationCollector.kt | 12 ++-- .../relay/client/accessories/RelayLogger.kt | 12 ++-- .../relay/client/accessories/RelayNotifier.kt | 12 ++-- .../client/accessories/RelayOfflineTracker.kt | 12 ++-- .../relay/client/auth/RelayAuthenticator.kt | 14 ++--- .../client/counts/RelayActiveCountStates.kt | 12 ++-- ...tener.kt => RedirectConnectionListener.kt} | 6 +- ...Listener.kt => RelayConnectionListener.kt} | 4 +- .../relay/client/pool/PoolRequests.kt | 18 +++--- .../nip01Core/relay/client/pool/RelayPool.kt | 8 +-- ...ntDynamicReq.kt => DynamicSubscription.kt} | 22 ++++---- ...AsFlow.kt => NostrClientFetchAsFlowExt.kt} | 26 ++++----- ...ow.kt => NostrClientSubscribeAsFlowExt.kt} | 26 ++++----- .../client/reqs/RelayActiveRequestStates.kt | 16 +++--- .../client/reqs/RequestSubscriptionState.kt | 4 +- ...ientStaticReq.kt => StaticSubscription.kt} | 42 +++++++------- ...nNostrRequest.kt => SubscriptionHandle.kt} | 4 +- ...estListener.kt => SubscriptionListener.kt} | 10 ++-- .../relay/client/reqs/stats/RelayReqStats.kt | 12 ++-- .../client/single/basic/BasicRelayClient.kt | 4 +- .../standalone/StandaloneRelayClient.kt | 14 ++--- .../relay/client/stats/RelayStats.kt | 12 ++-- .../client/subscriptions/Subscription.kt | 4 +- .../subscriptions/SubscriptionController.kt | 18 +++--- .../nip01Core/relay/server/LiveEventStore.kt | 4 +- .../nip01Core/relay/server/RelaySession.kt | 2 +- .../signer/NostrSignerRemote.kt | 27 +++++---- .../signer/RemoteSignerManager.kt | 6 +- .../nip77Negentropy/NegentropyManager.kt | 6 +- .../signer/NostrSignerRemoteIsolationTest.kt | 28 +++++----- .../relay/NostrClientFirstEventTest.kt | 9 ++- .../relay/NostrClientManualSubTest.kt | 17 +++--- .../relay/NostrClientQueryCountTest.kt | 34 ++++++----- .../relay/NostrClientRepeatSubTest.kt | 21 ++++--- .../NostrClientReqBypassingRelayLimitsTest.kt | 13 ++--- .../relay/NostrClientSendAndWaitTest.kt | 11 ++-- .../NostrClientSubscriptionAsFlowTest.kt | 13 ++--- .../relay/NostrClientSubscriptionTest.kt | 26 +++++---- ...trClientSubscriptionUntilEoseAsFlowTest.kt | 13 ++--- 169 files changed, 888 insertions(+), 892 deletions(-) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/{NostrClient.kt => DefaultNostrClient.kt} (94%) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/{INostrClient.kt => NostrClientInterface.kt} (82%) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/{NostrClientQueryExt.kt => NostrClientFetchAllExt.kt} (78%) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/{NostrClientReqBypassingRelayLimitsExt.kt => NostrClientFetchAllPagesExt.kt} (92%) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/{NostrClientSingleDownloadExt.kt => NostrClientFetchFirstExt.kt} (74%) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/{NostrClientSendAndWaitExt.kt => NostrClientPublishExt.kt} (83%) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/listeners/{RedirectRelayClientListener.kt => RedirectConnectionListener.kt} (95%) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/listeners/{IRelayClientListener.kt => RelayConnectionListener.kt} (96%) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/{NostrClientDynamicReq.kt => DynamicSubscription.kt} (81%) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/{NostrClientStaticReqUntilEoseAsFlow.kt => NostrClientFetchAsFlowExt.kt} (82%) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/{NostrClientStaticReqAsStateFlow.kt => NostrClientSubscribeAsFlowExt.kt} (86%) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/{NostrClientStaticReq.kt => StaticSubscription.kt} (70%) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/{IOpenNostrRequest.kt => SubscriptionHandle.kt} (95%) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/{IRequestListener.kt => SubscriptionListener.kt} (92%) 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( From 4be617e64a1b4a500e0e678ccb4ec74de75a2d56 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 28 Mar 2026 16:38:01 +0000 Subject: [PATCH 2/5] revert: keep INostrClient/NostrClient naming and restore onEose/isLive Reverts three naming changes from the previous refactor: - Interface stays INostrClient (not NostrClient) - Class stays NostrClient (not DefaultNostrClient) - onEose stays onEose (not onCaughtUp) - isLive stays isLive (not isRealTime) All other renames from the API simplification are preserved: subscribe, unsubscribe, publish, count, fetchAll, fetchFirst, etc. https://claude.ai/code/session_01JPcYCcRx5eZN4GvgGxGwbf --- .../ThreadDualAxisChartAssemblerTest.kt | 2 +- .../relays/eventsync/EventSyncTest.kt | 4 +- .../com/vitorpamplona/amethyst/AppModules.kt | 6 +- .../vitorpamplona/amethyst/model/Account.kt | 4 +- .../model/accountsCache/AccountCacheState.kt | 4 +- .../model/nip62Vanish/VanishRequestsState.kt | 4 +- .../service/broadcast/BroadcastTracker.kt | 6 +- .../relayClient/CacheClientConnector.kt | 4 +- .../relayClient/RelayProxyClientConnector.kt | 4 +- .../authCommand/model/AuthCoordinator.kt | 4 +- .../eoseManagers/PerUniqueIdEoseManager.kt | 10 ++-- .../PerUserAndFollowListEoseManager.kt | 10 ++-- .../eoseManagers/PerUserEoseManager.kt | 10 ++-- .../SingleSubNoEoseCacheEoseManager.kt | 10 ++-- .../notifyCommand/model/NotifyCoordinator.kt | 4 +- .../RelaySubscriptionsCoordinator.kt | 4 +- .../account/AccountFilterAssembler.kt | 4 +- .../drafts/AccountDraftsEoseManager.kt | 4 +- .../AccountFollowsLoaderSubAssembler.kt | 10 ++-- .../metadata/AccountMetadataEoseManager.kt | 4 +- ...NotificationsEoseFromInboxRelaysManager.kt | 4 +- ...otificationsEoseFromRandomRelaysManager.kt | 4 +- .../AccountGiftWrapsEoseManager.kt | 4 +- .../ChannelFinderFilterAssemblyGroup.kt | 4 +- ...adataAndLiveActivityWatcherSubAssembler.kt | 4 +- .../ChannelLoaderSubAssembler.kt | 4 +- .../ChannelMetadataWatcherSubAssembler.kt | 4 +- .../LiveActivityWatcherSubAssembly.kt | 4 +- .../event/EventFinderFilterAssembler.kt | 4 +- .../loaders/NoteEventLoaderSubAssembler.kt | 4 +- .../watchers/EventWatcherSubAssembler.kt | 4 +- .../nwc/NWCPaymentFilterAssembler.kt | 4 +- .../nwc/NWCPaymentWatcherSubAssembler.kt | 4 +- .../user/UserFinderFilterAssembler.kt | 4 +- .../loaders/UserOutboxFinderSubAssembler.kt | 6 +- .../user/watchers/UserCardsSubAssembler.kt | 4 +- .../user/watchers/UserReportsSubAssembler.kt | 4 +- .../user/watchers/UserWatcherSubAssembler.kt | 10 ++-- .../searchCommand/SearchFilterAssembler.kt | 4 +- .../SearchPostWatcherSubAssembler.kt | 4 +- .../SearchUserWatcherSubAssembler.kt | 4 +- .../speedLogger/RelaySpeedLogger.kt | 6 +- .../ui/screen/AccountSessionManager.kt | 4 +- .../ui/screen/loggedIn/AccountViewModel.kt | 2 +- .../datasource/ChatroomFilterAssembler.kt | 4 +- .../datasource/ChatroomFilterSubAssembler.kt | 4 +- .../datasource/ChannelFilterAssembler.kt | 4 +- .../ChannelFromUserFilterSubAssembler.kt | 4 +- .../ChannelPublicFilterSubAssembler.kt | 4 +- .../datasource/ChatroomListFilterAssembler.kt | 4 +- .../DMsFromUserFilterSubAssembler.kt | 4 +- .../FollowingEphemeralChatSubAssembler.kt | 4 +- .../FollowingPublicChatSubAssembler.kt | 4 +- .../datasource/ChessFeedFilterSubAssembler.kt | 4 +- .../chess/datasource/ChessFilterAssembler.kt | 4 +- .../CommunityFeedFilterSubAssembler.kt | 4 +- .../datasource/CommunityFilterAssembler.kt | 4 +- .../datasource/DiscoveryFilterAssembler.kt | 4 +- ...yFollowsSetsAndLiveStreamsSubAssembler2.kt | 4 +- ...yLongFormClassifiedsAndDVMSubAssembler1.kt | 4 +- ...yPublicChatsAndCommunitiesSubAssembler3.kt | 4 +- .../FollowPackFeedFilterAssembler.kt | 4 +- .../FollowPackFeedFilterSubAssembler.kt | 4 +- .../GeoHashFeedFilterSubAssembler.kt | 4 +- .../datasource/GeoHashFilterAssembler.kt | 4 +- .../HashtagFeedFilterSubAssembler.kt | 4 +- .../datasource/HashtagFilterAssembler.kt | 4 +- .../home/datasource/HomeFilterAssembler.kt | 4 +- .../HomeOutboxEventsEoseManager.kt | 4 +- .../datasource/UserProfileFilterAssembler.kt | 4 +- .../UserProfileFollowersFilterSubAssembler.kt | 4 +- .../UserProfileMediaFilterSubAssembler.kt | 4 +- .../UserProfileMetadataFilterSubAssembler.kt | 4 +- .../UserProfilePostsFilterSubAssembler.kt | 4 +- .../UserProfileZapsFilterSubAssembler.kt | 4 +- .../datasource/RelayFeedFilterAssembler.kt | 4 +- .../datasource/RelayFeedFilterSubAssembler.kt | 4 +- .../RelayInfoNip66FilterAssembler.kt | 4 +- .../RelayInfoNip66FilterSubAssembler.kt | 4 +- .../loggedIn/relays/eventsync/EventSync.kt | 8 +-- .../datasources/ThreadFilterAssembler.kt | 4 +- .../ThreadEventLoaderSubAssembler.kt | 4 +- .../subassembies/ThreadFilterSubAssembler.kt | 4 +- .../video/datasource/VideoFilterAssembler.kt | 4 +- .../VideoOutboxEventsFilterSubAssembler.kt | 4 +- .../commons/chess/ChessRelayFetchHelper.kt | 12 ++-- .../domain/nip46/BunkerLoginUseCase.kt | 4 +- .../domain/nip46/NostrConnectLoginUseCase.kt | 8 +-- .../assemblers/FeedMetadataCoordinator.kt | 6 +- .../assemblers/MetadataFilterAssembler.kt | 4 +- .../assemblers/ReactionsFilterAssembler.kt | 4 +- .../eoseManagers/BaseEoseManager.kt | 4 +- .../eoseManagers/PerKeyEoseManager.kt | 10 ++-- .../eoseManagers/SingleSubEoseManager.kt | 10 ++-- .../commons/chess/ChessEventBroadcaster.kt | 8 +-- .../desktop/account/AccountManager.kt | 12 ++-- .../amethyst/desktop/chess/ChessScreen.kt | 2 +- .../desktop/network/RelayConnectionManager.kt | 10 ++-- .../subscriptions/ChessSubscription.kt | 22 ++++---- .../DesktopRelaySubscriptionsCoordinator.kt | 8 +-- .../desktop/subscriptions/FeedSubscription.kt | 56 +++++++++---------- .../desktop/subscriptions/FilterDMs.kt | 16 +++--- .../subscriptions/ProfileSubscription.kt | 20 +++---- .../subscriptions/SubscriptionUtils.kt | 10 ++-- .../desktop/ui/ArticleReaderScreen.kt | 4 +- .../amethyst/desktop/ui/BookmarksScreen.kt | 6 +- .../amethyst/desktop/ui/NoteActions.kt | 8 +-- .../desktop/ui/NotificationsScreen.kt | 2 +- .../amethyst/desktop/ui/ReadsScreen.kt | 4 +- .../amethyst/desktop/ui/SearchScreen.kt | 4 +- .../amethyst/desktop/ui/ThreadScreen.kt | 4 +- .../amethyst/desktop/ui/UserProfileScreen.kt | 14 ++--- .../desktop/ui/chats/ChatroomListState.kt | 2 +- .../desktop/ui/chats/DmSendTracker.kt | 4 +- .../amethyst/desktop/ui/chats/NewDmDialog.kt | 2 +- .../desktop/cache/CoordinatorPipelineTest.kt | 8 +-- ...ostrClientInterface.kt => INostrClient.kt} | 4 +- .../{DefaultNostrClient.kt => NostrClient.kt} | 6 +- .../client/accessories/EventCollector.kt | 6 +- .../client/accessories/NostrClientCountExt.kt | 8 +-- .../accessories/NostrClientFetchAllExt.kt | 20 +++---- .../NostrClientFetchAllPagesExt.kt | 10 ++-- .../accessories/NostrClientFetchFirstExt.kt | 20 +++---- .../accessories/NostrClientPublishExt.kt | 6 +- .../RelayInsertConfirmationCollector.kt | 6 +- .../relay/client/accessories/RelayLogger.kt | 6 +- .../relay/client/accessories/RelayNotifier.kt | 6 +- .../client/accessories/RelayOfflineTracker.kt | 6 +- .../relay/client/auth/RelayAuthenticator.kt | 4 +- .../client/counts/RelayActiveCountStates.kt | 4 +- .../relay/client/pool/PoolRequests.kt | 6 +- .../relay/client/reqs/DynamicSubscription.kt | 8 +-- .../client/reqs/NostrClientFetchAsFlowExt.kt | 14 ++--- .../reqs/NostrClientSubscribeAsFlowExt.kt | 14 ++--- .../client/reqs/RelayActiveRequestStates.kt | 6 +- .../client/reqs/RequestSubscriptionState.kt | 2 +- .../relay/client/reqs/StaticSubscription.kt | 18 +++--- .../relay/client/reqs/SubscriptionListener.kt | 4 +- .../relay/client/reqs/stats/RelayReqStats.kt | 6 +- .../relay/client/stats/RelayStats.kt | 4 +- .../subscriptions/SubscriptionController.kt | 6 +- .../nip01Core/relay/server/LiveEventStore.kt | 4 +- .../nip01Core/relay/server/RelaySession.kt | 2 +- .../signer/NostrSignerRemote.kt | 6 +- .../signer/RemoteSignerManager.kt | 4 +- .../nip77Negentropy/NegentropyManager.kt | 2 +- .../signer/NostrSignerRemoteIsolationTest.kt | 6 +- .../relay/NostrClientFirstEventTest.kt | 3 +- .../relay/NostrClientManualSubTest.kt | 7 +-- .../relay/NostrClientQueryCountTest.kt | 7 +-- .../relay/NostrClientRepeatSubTest.kt | 3 +- .../NostrClientReqBypassingRelayLimitsTest.kt | 5 +- .../relay/NostrClientSendAndWaitTest.kt | 3 +- .../NostrClientSubscriptionAsFlowTest.kt | 5 +- .../relay/NostrClientSubscriptionTest.kt | 3 +- ...trClientSubscriptionUntilEoseAsFlowTest.kt | 5 +- 156 files changed, 464 insertions(+), 473 deletions(-) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/{NostrClientInterface.kt => INostrClient.kt} (98%) rename quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/{DefaultNostrClient.kt => NostrClient.kt} (98%) diff --git a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadDualAxisChartAssemblerTest.kt b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadDualAxisChartAssemblerTest.kt index 095256bdde..9902c067af 100644 --- a/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadDualAxisChartAssemblerTest.kt +++ b/amethyst/src/androidTest/java/com/vitorpamplona/amethyst/ThreadDualAxisChartAssemblerTest.kt @@ -54,7 +54,7 @@ class ThreadDualAxisChartAssemblerTest { val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) val client = - DefaultNostrClient( + NostrClient( 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 2c882a0a09..41dd0cc3b5 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 @@ -67,7 +67,7 @@ class EventSyncTest { inboxTargets = { setOf(vitor) }, dmTargets = { setOf(vitor) }, clientBuilder = { - DefaultNostrClient(socketBuilder, appScope) + NostrClient(socketBuilder, appScope) }, scope = appScope, ) @@ -86,7 +86,7 @@ class EventSyncTest { inboxTargets = { setOf(vitor) }, dmTargets = { setOf(vitor) }, clientBuilder = { - val newClient = DefaultNostrClient(socketBuilder, appScope) + val newClient = NostrClient(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 e29b7454aa..2f3690482e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/AppModules.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/AppModules.kt @@ -68,7 +68,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.RelayLogger import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.RelayOfflineTracker import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.stats.RelayReqStats @@ -244,7 +244,7 @@ class AppModules( scope = applicationIOScope, ) - // Connects the NostrClient class with okHttp + // Connects the INostrClient class with okHttp val websocketBuilder = OkHttpWebSocket.Builder { url -> val useTor = torEvaluatorFlow.flow.value.useTor(url) @@ -255,7 +255,7 @@ class AppModules( val cache: LocalCache = LocalCache // Provides a relay pool - val client: NostrClient = DefaultNostrClient(websocketBuilder, applicationIOScope) + val client: INostrClient = NostrClient(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 6c99e5d71a..f3bfa0e955 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -135,7 +135,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -244,7 +244,7 @@ class Account( val nwcFilterAssembler: () -> NWCPaymentFilterAssembler, val otsResolverBuilder: () -> OtsResolver, val cache: LocalCache, - val client: NostrClient, + val client: INostrClient, val scope: CoroutineScope, ) : IAccount { private var userProfileCache: User? = null 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 db5787cc6b..30379256b3 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + val client: INostrClient, ) { 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 8015ed82e7..a5337ac52e 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,7 +23,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -61,7 +61,7 @@ enum class ComplianceStatus { class VanishRequestsState( val signer: NostrSigner, val cache: LocalCache, - val client: NostrClient, + val client: INostrClient, val scope: CoroutineScope, ) { val noteFlow = 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 ad5855b561..7c9e15c08c 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,7 +21,7 @@ package com.vitorpamplona.amethyst.service.broadcast import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -71,7 +71,7 @@ class BroadcastTracker { suspend fun trackBroadcast( event: Event, relays: Set, - client: NostrClient, + client: INostrClient, ) { val trackingId = UUID.randomUUID().toString() @@ -232,7 +232,7 @@ class BroadcastTracker { @OptIn(DelicateCoroutinesApi::class) suspend fun retry( broadcast: BroadcastEvent, - client: NostrClient, + client: INostrClient, specificRelay: NormalizedRelayUrl? = null, ): BroadcastEvent { val event = broadcast.event 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 6a0bbd52c4..6e03d26c7e 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + val client: INostrClient, 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 b480848210..512f85a3b6 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + val client: INostrClient, 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 5e574086de..2437c21a26 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 15bce2c7ce..2817e2a39d 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,7 +24,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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.SubscriptionListener @@ -42,7 +42,7 @@ import com.vitorpamplona.quartz.utils.TimeUtils * shares all EOSEs among all users. */ abstract class PerUniqueIdEoseManager( - client: NostrClient, + client: INostrClient, allKeys: () -> Set, val invalidateAfterEose: Boolean = false, ) : BaseEoseManager(client, allKeys) { @@ -69,7 +69,7 @@ abstract class PerUniqueIdEoseManager( open fun newSub(key: T): Subscription = requestNewSubscription( object : SubscriptionListener { - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -78,11 +78,11 @@ abstract class PerUniqueIdEoseManager( override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isRealTime) { + if (isLive) { 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 ec6477bd62..0635acab87 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,7 +25,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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.SubscriptionListener @@ -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: NostrClient, + client: INostrClient, allKeys: () -> Set, val invalidateAfterEose: Boolean = false, ) : BaseEoseManager(client, allKeys) { @@ -70,7 +70,7 @@ abstract class PerUserAndFollowListEoseManager( open fun newSub(key: T): Subscription = requestNewSubscription( object : SubscriptionListener { - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -79,11 +79,11 @@ abstract class PerUserAndFollowListEoseManager( override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isRealTime) { + if (isLive) { 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 c1b9e7de60..ad899cd2c1 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,7 +25,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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.SubscriptionListener @@ -44,7 +44,7 @@ import com.vitorpamplona.quartz.utils.TimeUtils * the subscription disappears and comes back later. */ abstract class PerUserEoseManager( - client: NostrClient, + client: INostrClient, allKeys: () -> Set, val invalidateAfterEose: Boolean = false, ) : BaseEoseManager(client, allKeys) { @@ -68,7 +68,7 @@ abstract class PerUserEoseManager( open fun newSub(key: T): Subscription = requestNewSubscription( object : SubscriptionListener { - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -77,11 +77,11 @@ abstract class PerUserEoseManager( override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isRealTime) { + if (isLive) { 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 b241a61796..28c3648bbb 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,7 +22,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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.SubscriptionListener @@ -35,14 +35,14 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl * filters */ abstract class SingleSubNoEoseCacheEoseManager( - client: NostrClient, + client: INostrClient, allKeys: () -> Set, val invalidateAfterEose: Boolean = false, ) : BaseEoseManager(client, allKeys) { val sub = requestNewSubscription( object : SubscriptionListener { - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -53,11 +53,11 @@ abstract class SingleSubNoEoseCacheEoseManager( override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isRealTime) { + if (isLive) { 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 1842141a31..404015a6b3 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.RelayNotifier class NotifyCoordinator( - client: NostrClient, + client: INostrClient, ) { 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 43e60799ec..3c1363a1fe 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 9b3aa29083..1c387a3042 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 8d5808e515..1d87c2f002 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 f89a4c06be..dc98df29ff 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,7 +30,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -56,7 +56,7 @@ import kotlinx.coroutines.launch * It needs to be super fast on startup. */ class AccountFollowsLoaderSubAssembler( - val client: NostrClient, + val client: INostrClient, val cache: LocalCache, val scope: CoroutineScope, val authStatus: IAuthStatus, @@ -108,7 +108,7 @@ class AccountFollowsLoaderSubAssembler( orchestrator.requestNewSubscription( if (isDebug) logTag + newSubId() else newSubId(), object : SubscriptionListener { - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -117,11 +117,11 @@ class AccountFollowsLoaderSubAssembler( override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isRealTime) { + if (isLive) { 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 8afa83e021..db90fd8b7c 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 40695d1e31..9d7c0cdfe6 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 38cd0a1a67..9aa0acc87d 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 ef5d8bfbe2..ab4de28752 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 33023a862a..9ea5235108 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient // This allows multiple screen to be listening to tags, even the same tag @Stable @@ -35,7 +35,7 @@ class ChannelFinderQueryState( @Stable class ChannelFinderFilterAssemblyGroup( - client: NostrClient, + client: INostrClient, ) : 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 9fcb70ba4c..57dfe70503 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 10cacc5714..c14d14bd19 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 21992934a8..4f8dfde481 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class ChannelMetadataWatcherSubAssembler( - client: NostrClient, + client: INostrClient, 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 d7e5541b7a..0d087ca167 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 9c6858b73e..29a6767490 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient // This allows multiple screen to be listening to tags, even the same tag @Stable @@ -37,7 +37,7 @@ class EventFinderQueryState( @Stable class EventFinderFilterAssembler( - client: NostrClient, + client: INostrClient, ) : 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 6fdc7ad791..9ff15e6407 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient class NoteEventLoaderSubAssembler( - client: NostrClient, + client: INostrClient, 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 aa730d6ab5..91358cdfd0 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 1b8e7e4c7c..48c66be4ee 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, ) : 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 2ff1bcd183..4be5b34c46 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class NWCPaymentWatcherSubAssembler( - client: NostrClient, + client: INostrClient, 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 7123850c14..e6b572e096 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 9cb8eaf5d2..d4d9504db9 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,7 +27,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -38,7 +38,7 @@ import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent import com.vitorpamplona.quartz.utils.TimeUtils class UserOutboxFinderSubAssembler( - client: NostrClient, + client: INostrClient, val cache: LocalCache, val failureTracker: RelayOfflineTracker, allKeys: () -> Set, @@ -69,7 +69,7 @@ class UserOutboxFinderSubAssembler( val sub = requestNewSubscription( object : SubscriptionListener { - override fun onCaughtUp( + override fun onEose( 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 93c97616bc..19474b6c48 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 1822f310a4..fd2e68532d 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 4d7ea00235..698c93b76b 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,7 +27,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.groupByRelay import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.SubscriptionListener import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter @@ -35,7 +35,7 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.utils.TimeUtils class UserWatcherSubAssembler( - client: NostrClient, + client: INostrClient, val cache: LocalCache, allKeys: () -> Set, ) : BaseEoseManager(client, allKeys) { @@ -62,7 +62,7 @@ class UserWatcherSubAssembler( val sub = requestNewSubscription( object : SubscriptionListener { - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -71,11 +71,11 @@ class UserWatcherSubAssembler( override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isRealTime) { + if (isLive) { 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 7f2533ac2c..ebbd64c4aa 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow @@ -42,7 +42,7 @@ class SearchQueryState( @Stable class SearchFilterAssembler( - client: NostrClient, + client: INostrClient, 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 32a0a4839d..94b63bcadf 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 412021ad2e..1fa7801e6e 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 4c57edd720..66718a9ea1 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,7 +20,7 @@ */ package com.vitorpamplona.amethyst.service.relayClient.speedLogger -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -29,10 +29,10 @@ import com.vitorpamplona.quartz.utils.Log import com.vitorpamplona.quartz.utils.bytesUsedInMemory /** - * Listens to NostrClient's onNotify messages from the relay + * Listens to INostrClient's onNotify messages from the relay */ class RelaySpeedLogger( - val client: NostrClient, + val client: INostrClient, ) { companion object { val TAG: String = RelaySpeedLogger::class.java.simpleName 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 2d8628574d..4bd3202fd2 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: () -> NostrClient, + val clientBuilder: () -> INostrClient, 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 0563450f3b..519d049989 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 @@ -219,7 +219,7 @@ class AccountViewModel( val customScope = CoroutineScope(viewModelScope.coroutineContext + SupervisorJob()) // Provides a relay pool - val newClient = DefaultNostrClient(Amethyst.instance.websocketBuilder, customScope) + val newClient = NostrClient(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 e8a6c69066..b5cc945fcd 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, ) : 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 4c427295a7..0d451daecf 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class ChatroomFilterSubAssembler( - client: NostrClient, + client: INostrClient, 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 4855bf7eec..3edc54fdb2 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient // This allows multiple screen to be listening to tags, even the same tag class ChannelQueryState( @@ -34,7 +34,7 @@ class ChannelQueryState( ) class ChannelFilterAssembler( - client: NostrClient, + client: INostrClient, ) : 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 db89c4285b..70fea4c935 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class ChannelFromUserFilterSubAssembler( - client: NostrClient, + client: INostrClient, 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 ad10706f55..6fab0c332a 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class ChannelPublicFilterSubAssembler( - client: NostrClient, + client: INostrClient, 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 644f705fa1..2b9c534502 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient // This allows multiple screen to be listening to tags, even the same tag @Stable @@ -33,7 +33,7 @@ class ChatroomListState( @Stable class ChatroomListFilterAssembler( - client: NostrClient, + client: INostrClient, ) : 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 d4bab373ed..410e03d59b 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 55b4570674..ad6ca0ddb7 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 8a927ead63..98c66b737e 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 3bb6d12b39..3a1cccd1d7 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 ba918bf296..04a4fc5b98 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient /** * Filter assembler for chess events */ class ChessFilterAssembler( - client: NostrClient, + client: INostrClient, ) : 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 8d68110dae..d3571be89c 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 71974a410c..fdb60d00d0 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient // This allows multiple screen to be listening to tags, even the same tag class CommunityQueryState( @@ -30,7 +30,7 @@ class CommunityQueryState( ) class CommunityFilterAssembler( - client: NostrClient, + client: INostrClient, ) : 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 6792b29afd..dc49d49b5e 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, ) : 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 d3d5be3aef..78eb084d1b 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 40279083d4..941b95c28c 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 78ebfa01de..a6e94c133b 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 8747454839..940414cc4d 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient // 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: NostrClient, + client: INostrClient, ) : 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 853e3d3461..08f100400c 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.nip51Lists.followList.FollowListEvent class FollowPackFeedFilterSubAssembler( - client: NostrClient, + client: INostrClient, 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 65e2f3d33e..9d7fe94ab9 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class GeoHashFeedFilterSubAssembler( - client: NostrClient, + client: INostrClient, 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 af98d9faaa..af5257fa67 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, ) : 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 e3156b9f50..23a6b1d224 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class HashtagFeedFilterSubAssembler( - client: NostrClient, + client: INostrClient, 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 dd3bfa7a3a..55a481ed2e 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, ) : 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 6771f1313b..e76959df4b 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, ) : 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 075611e1f2..ff7f313654 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 6080659e18..b57daf7ce3 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient // This allows multiple screen to be listening to tags, even the same tag class UserProfileQueryState( @@ -30,7 +30,7 @@ class UserProfileQueryState( ) class UserProfileFilterAssembler( - client: NostrClient, + client: INostrClient, ) : 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 e15a7514c2..6fe462fe8e 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class UserProfileFollowersFilterSubAssembler( - client: NostrClient, + client: INostrClient, 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 40f6de9754..1066b7f537 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class UserProfileMediaFilterSubAssembler( - client: NostrClient, + client: INostrClient, 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 abfb6182bc..e6d21c9338 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter import com.vitorpamplona.quartz.utils.mapOfSet class UserProfileMetadataFilterSubAssembler( - client: NostrClient, + client: INostrClient, 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 ec945b2b9e..2ef23e9a92 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class UserProfilePostsFilterSubAssembler( - client: NostrClient, + client: INostrClient, 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 8de29250d0..5546024d08 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class UserProfileZapsFilterSubAssembler( - client: NostrClient, + client: INostrClient, 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 0878a3f0c1..a439a9d43a 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, ) : 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 de6a9fb364..2a90bd26b0 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.pool.RelayBasedFilter class RelayFeedFilterSubAssembler( - client: NostrClient, + client: INostrClient, allKeys: () -> Set, ) : PerUniqueIdEoseManager(client, allKeys) { override fun updateFilter( 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 f0961ba0d4..8a2654284a 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl class RelayInfoNip66QueryState( @@ -30,7 +30,7 @@ class RelayInfoNip66QueryState( ) class RelayInfoNip66FilterAssembler( - client: NostrClient, + client: INostrClient, ) : 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 253c145607..676288ee0a 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 59d08dfaee..568a7fc17f 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,7 +27,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -80,7 +80,7 @@ class EventSync( private val outboxTargets: () -> Set, private val inboxTargets: () -> Set, private val dmTargets: () -> Set, - private val clientBuilder: () -> NostrClient, + private val clientBuilder: () -> INostrClient, private val scope: CoroutineScope, ) { companion object { @@ -622,7 +622,7 @@ class EventSync( * * [onEvent] receives the event and the URL of the relay it came from. */ - private suspend fun NostrClient.downloadFromPool( + private suspend fun INostrClient.downloadFromPool( relays: List, filters: Map>, onNewPage: (Long, NormalizedRelayUrl) -> Unit, @@ -661,7 +661,7 @@ class EventSync( * * @return total number of events received across all pages. */ - private suspend fun NostrClient.downloadFromRelay( + private suspend fun INostrClient.downloadFromRelay( relay: NormalizedRelayUrl, filters: List, onNewPage: (Long) -> Unit, 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 7e74b504cd..9cb7560137 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient // This allows multiple screen to be listening to tags, even the same tag @Stable @@ -37,7 +37,7 @@ class ThreadQueryState( @Stable class ThreadFilterAssembler( - client: NostrClient, + client: INostrClient, ) : 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 1fdf5bbeb5..f9a465a27d 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 40b86b66bf..ac089db908 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 5a4e970d3f..ca5fa42e7d 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, ) : 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 c4cf933a37..5b02873027 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 aa5233d11a..703ab3c985 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,7 +21,7 @@ package com.vitorpamplona.amethyst.commons.chess import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -49,7 +49,7 @@ enum class RelayFetchStatus { /** * One-shot relay fetch helper for chess events. * - * Follows the existing NostrClient + SubscriptionListener + Channel pattern + * Follows the existing INostrClient + 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: NostrClient, + private val client: INostrClient, ) { /** * Fetch events matching filters from relays, waiting for EOSE. * - * @param filters Map of relay → filter list (same format as NostrClient.subscribe) + * @param filters Map of relay → filter list (same format as INostrClient.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 @@ -91,7 +91,7 @@ class ChessRelayFetchHelper( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -100,7 +100,7 @@ class ChessRelayFetchHelper( onProgress?.invoke(RelayFetchProgress(relay, RelayFetchStatus.RECEIVING, count)) } - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { 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 241773ac65..4962f5e3ee 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, ): 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 72c7efba35..ef044ba8f1 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,7 +24,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -83,7 +83,7 @@ object NostrConnectLoginUseCase { suspend fun awaitAndLogin( uriData: NostrConnectUri, - client: NostrClient, + client: INostrClient, ): BunkerLoginResult { val connectData = waitForConnectRequest( @@ -117,7 +117,7 @@ object NostrConnectLoginUseCase { ephemeralPubKey: HexKey, relays: Set, expectedSecret: String, - client: NostrClient, + client: INostrClient, ): ConnectRequestData { val deferred = CompletableDeferred() @@ -201,7 +201,7 @@ object NostrConnectLoginUseCase { ephemeralSigner: NostrSignerInternal, connectData: ConnectRequestData, relays: Set, - client: NostrClient, + client: INostrClient, ) { val ackResponse = BunkerResponseAck(id = connectData.requestId!!) val ackEvent = 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 4cc8df3313..4b62fc9ab6 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,7 +27,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -55,7 +55,7 @@ import kotlinx.coroutines.CoroutineScope * ``` */ class FeedMetadataCoordinator( - private val client: NostrClient, + private val client: INostrClient, private val scope: CoroutineScope, private val indexRelays: Set, private val preloader: MetadataPreloader? = null, @@ -82,7 +82,7 @@ class FeedMetadataCoordinator( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { 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 dbc79f2fd2..1dffa08b4e 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 0d62c8fc65..72c371f65d 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + client: INostrClient, 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 bcc6827d7b..427d341953 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + val client: INostrClient, val allKeys: () -> Set, val sampleTime: Long = 500, ) : IEoseManager { 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 dc0d2d1f14..b609d52dc2 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,7 +23,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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.SubscriptionListener @@ -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: NostrClient, + client: INostrClient, allKeys: () -> Set, val invalidateAfterEose: Boolean = false, cacheSize: Int = 200, @@ -83,7 +83,7 @@ abstract class PerKeyEoseManager( open fun newSub(queryState: T): Subscription = requestNewSubscription( object : SubscriptionListener { - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -92,11 +92,11 @@ abstract class PerKeyEoseManager( override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isRealTime) { + if (isLive) { 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 99ee6c1304..8c012cc94d 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,7 +23,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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.SubscriptionListener @@ -44,7 +44,7 @@ import com.vitorpamplona.quartz.utils.TimeUtils * shares all EOSEs among all users. */ abstract class SingleSubEoseManager( - client: NostrClient, + client: INostrClient, allKeys: () -> Set, val invalidateAfterEose: Boolean = false, ) : BaseEoseManager(client, allKeys) { @@ -67,7 +67,7 @@ abstract class SingleSubEoseManager( val sub = requestNewSubscription( object : SubscriptionListener { - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -76,11 +76,11 @@ abstract class SingleSubEoseManager( override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - if (isRealTime) { + if (isLive) { 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 e996f3b7ce..0293c58d12 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,7 +21,7 @@ package com.vitorpamplona.amethyst.commons.chess import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -46,7 +46,7 @@ data class BroadcastResult( * ensuring the event was actually received and accepted. */ class ChessEventBroadcaster( - private val client: NostrClient, + private val client: INostrClient, ) { /** * Broadcast an event to the chess relays with confirmation. @@ -87,12 +87,12 @@ class ChessEventBroadcaster( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { } - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { } 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 e998fb621c..535f3245c5 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 @@ -131,11 +131,11 @@ class AccountManager internal constructor( // --- Dedicated NIP-46 client (isolated from general relay pool) --- private val nip46ClientMutex = Mutex() - private var nip46Client: DefaultDefaultNostrClient? = null + private var nip46Client: NostrClient? = null - private suspend fun getOrCreateNip46Client(): DefaultNostrClient = + private suspend fun getOrCreateNip46Client(): INostrClient = nip46ClientMutex.withLock { - nip46Client ?: DefaultNostrClient( + nip46Client ?: NostrClient( BasicOkHttpWebSocket.Builder(DesktopHttpClient::getHttpClient), ).also { nip46Client = it @@ -155,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: DefaultNostrClient, + client: INostrClient, targetRelays: Set, ) { withTimeout(NIP46_RELAY_CONNECT_TIMEOUT_MS) { @@ -302,7 +302,7 @@ class AccountManager internal constructor( suspend fun loginWithBunker(bunkerUri: String): Result { val listener = createLoginRelayListener() - var client: DefaultDefaultNostrClient? = null + var client: NostrClient? = null try { val ephemeralKeyPair = KeyPair() val ephemeralSigner = NostrSignerInternal(ephemeralKeyPair) @@ -363,7 +363,7 @@ class AccountManager internal constructor( suspend fun loginWithNostrConnect(onUriGenerated: (String) -> Unit): Result { val listener = createLoginRelayListener() - var client: DefaultDefaultNostrClient? = null + var client: NostrClient? = null try { val ephemeralKeyPair = KeyPair() val uriData = NostrConnectLoginUseCase.generateUri(ephemeralKeyPair, NIP46_RELAYS, "Amethyst%20Desktop") 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 b792b53450..2668756b86 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) }, - onCaughtUp = { _, _ -> + onEose = { _, _ -> // 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 bd84b35b7e..54380dea84 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 @@ -21,7 +21,7 @@ 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.INostrClient 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 @@ -44,10 +44,10 @@ import kotlinx.coroutines.flow.asStateFlow open class RelayConnectionManager( websocketBuilder: WebsocketBuilder, ) : RelayConnectionListener { - private val _client = DefaultNostrClient(websocketBuilder) + private val _client = NostrClient(websocketBuilder) - /** Exposes the underlying NostrClient for subscription coordinators */ - val client: com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient get() = _client + /** Exposes the underlying INostrClient for subscription coordinators */ + val client: com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient get() = _client private val _relayStatuses = MutableStateFlow>(emptyMap()) val relayStatuses: StateFlow> = _relayStatuses.asStateFlow() @@ -145,7 +145,7 @@ open class RelayConnectionManager( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { 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 42faeabcd1..8027f1ecf3 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 @@ -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 onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + private val onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ) : ChessSubscriptionController { private val _currentState = MutableStateFlow(null) override val currentState: StateFlow = _currentState.asStateFlow() @@ -98,7 +98,7 @@ class DesktopChessSubscriptionController( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -106,16 +106,16 @@ class DesktopChessSubscriptionController( if (event.kind in CHESS_EVENT_KINDS) { DesktopChessEventCache.add(event) } - onEvent(event, isRealTime, relay, forFilters) + onEvent(event, isLive, relay, forFilters) } - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { // Track EOSE time for this relay for efficient re-subscription relayEoseTimes[relay] = TimeUtils.now() - onCaughtUp(relay, forFilters) + onEose(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 onCaughtUp Callback for EOSE (End of Stored Events) + * @param onEose 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, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (relays.isEmpty()) return null @@ -197,7 +197,7 @@ fun createChessSubscriptionWithGames( filters = filters, relays = relays, onEvent = onEvent, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } @@ -207,11 +207,11 @@ fun createChessSubscriptionWithGames( */ @Deprecated( "Use createChessSubscriptionWithGames for active game support", - ReplaceWith("createChessSubscriptionWithGames(relays, userPubkey, emptySet(), emptySet(), onEvent, onCaughtUp)"), + ReplaceWith("createChessSubscriptionWithGames(relays, userPubkey, emptySet(), emptySet(), onEvent, onEose)"), ) fun createChessSubscription( relays: Set, userPubkey: String, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, -): SubscriptionConfig? = createChessSubscriptionWithGames(relays, userPubkey, emptySet(), emptySet(), onEvent, onCaughtUp) + onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, +): SubscriptionConfig? = createChessSubscriptionWithGames(relays, userPubkey, emptySet(), emptySet(), onEvent, onEose) 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 38d9aab20d..474f3a1630 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,7 +30,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -73,7 +73,7 @@ import kotlin.time.Duration.Companion.seconds * ``` */ class DesktopRelaySubscriptionsCoordinator( - private val client: NostrClient, + private val client: INostrClient, private val scope: CoroutineScope, private val indexRelays: Set, private val localCache: DesktopLocalCache, @@ -180,7 +180,7 @@ class DesktopRelaySubscriptionsCoordinator( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -284,7 +284,7 @@ class DesktopRelaySubscriptionsCoordinator( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { 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 78c677a918..a7d4a633a3 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, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("global-feed"), filters = listOf(FilterBuilders.textNotesGlobal(limit = limit)), relays = relays, onEvent = onEvent, - onCaughtUp = onCaughtUp, + onEose = onEose, ) /** @@ -57,7 +57,7 @@ fun createFollowingFeedSubscription( followedUsers: List, limit: Int = 50, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (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, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } @@ -77,14 +77,14 @@ fun createContactListSubscription( relays: Set, pubKeyHex: String, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("contacts-${pubKeyHex.take(8)}"), filters = listOf(FilterBuilders.contactList(pubKeyHex)), relays = relays, onEvent = onEvent, - onCaughtUp = onCaughtUp, + onEose = onEose, ) /** @@ -94,14 +94,14 @@ fun createNoteSubscription( relays: Set, noteId: String, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("note-${noteId.take(8)}"), filters = listOf(FilterBuilders.byIds(listOf(noteId))), relays = relays, onEvent = onEvent, - onCaughtUp = onCaughtUp, + onEose = onEose, ) /** @@ -115,7 +115,7 @@ fun createThreadRepliesSubscription( noteId: String, limit: Int = 200, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("thread-${noteId.take(8)}"), @@ -129,7 +129,7 @@ fun createThreadRepliesSubscription( ), relays = relays, onEvent = onEvent, - onCaughtUp = onCaughtUp, + onEose = onEose, ) /** @@ -144,7 +144,7 @@ fun createSearchPeopleSubscription( searchQuery: String, limit: Int = 50, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (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, - onCaughtUp = onCaughtUp, + onEose = onEose, onClosed = onClosed, ) } @@ -171,7 +171,7 @@ fun createSearchNotesSubscription( searchQuery: String, limit: Int = 50, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (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, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } @@ -195,7 +195,7 @@ fun createZapsSubscription( eventIds: List, limit: Int = 100, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (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, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } @@ -219,7 +219,7 @@ fun createReactionsSubscription( eventIds: List, limit: Int = 100, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (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, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } @@ -243,7 +243,7 @@ fun createRepliesSubscription( eventIds: List, limit: Int = 100, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (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, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } @@ -267,7 +267,7 @@ fun createRepostsSubscription( eventIds: List, limit: Int = 100, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (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, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } @@ -287,14 +287,14 @@ fun createLongFormFeedSubscription( relays: Set, limit: Int = 30, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("longform-feed"), filters = listOf(FilterBuilders.longFormGlobal(limit = limit)), relays = relays, onEvent = onEvent, - onCaughtUp = onCaughtUp, + onEose = onEose, ) /** @@ -305,7 +305,7 @@ fun createFollowingLongFormFeedSubscription( followedUsers: List, limit: Int = 30, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (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, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } @@ -333,7 +333,7 @@ fun createChessSubscription( userPubkey: String, limit: Int = 100, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("chess-${userPubkey.take(8)}"), @@ -348,5 +348,5 @@ fun createChessSubscription( ), relays = relays, onEvent = onEvent, - onCaughtUp = onCaughtUp, + onEose = onEose, ) 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 28aebdf2ac..e1b9ced846 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, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (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, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } @@ -167,7 +167,7 @@ fun createNip04DmOutboxSubscription( since: Long? = null, limit: Int? = null, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (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, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } @@ -189,7 +189,7 @@ fun createGiftWrapSubscription( userPubKeyHex: HexKey, since: Long? = null, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (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, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } @@ -213,7 +213,7 @@ fun createDmConversationSubscription( conversationPubKeys: Set, since: Long? = null, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (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, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } 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 e2d03f464b..da9f93413b 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, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (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, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } @@ -56,7 +56,7 @@ fun createBatchMetadataSubscription( relays: Set, pubKeyHexList: List, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (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, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } @@ -79,7 +79,7 @@ fun createMetadataListSubscription( relays: Set, pubKeys: List, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig? { if (pubKeys.isEmpty()) return null @@ -88,7 +88,7 @@ fun createMetadataListSubscription( filters = listOf(FilterBuilders.userMetadataMultiple(pubKeys)), relays = relays, onEvent = onEvent, - onCaughtUp = onCaughtUp, + onEose = onEose, ) } @@ -100,7 +100,7 @@ fun createUserPostsSubscription( pubKeyHex: String, limit: Int = 50, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("posts-${pubKeyHex.take(8)}"), @@ -111,7 +111,7 @@ fun createUserPostsSubscription( ), relays = relays, onEvent = onEvent, - onCaughtUp = onCaughtUp, + onEose = onEose, ) /** @@ -122,12 +122,12 @@ fun createNotificationsSubscription( pubKeyHex: String, limit: Int = 100, onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, ): SubscriptionConfig = SubscriptionConfig( subId = generateSubId("notif-${pubKeyHex.take(8)}"), filters = listOf(FilterBuilders.notificationsForUser(pubKeyHex, limit = limit)), relays = relays, onEvent = onEvent, - onCaughtUp = onCaughtUp, + onEose = onEose, ) 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 7ddb5ec3f1..b9fa38e75b 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 @@ -45,7 +45,7 @@ data class SubscriptionConfig( val filters: List, val relays: Set, val onEvent: (Event, Boolean, NormalizedRelayUrl, List?) -> Unit, - val onCaughtUp: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, + val onEose: (NormalizedRelayUrl, List?) -> Unit = { _, _ -> }, val onClosed: (NormalizedRelayUrl, String, List?) -> Unit = { _, _, _ -> }, ) @@ -83,18 +83,18 @@ fun rememberSubscription( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { - cfg.onEvent(event, isRealTime, relay, forFilters) + cfg.onEvent(event, isLive, relay, forFilters) } - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { - cfg.onCaughtUp(relay, forFilters) + cfg.onEose(relay, forFilters) } override fun onClosed( 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 6d1c5d20ae..4bd362e907 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( } } }, - onCaughtUp = { _, _ -> + onEose = { _, _ -> eoseReceived = true }, ) @@ -335,7 +335,7 @@ fun ArticleReaderScreen( .toSet() } }, - onCaughtUp = { _, _ -> }, + onEose = { _, _ -> }, ) } 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 95f487dc27..e692b64707 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 } }, - onCaughtUp = { _, _ -> + onEose = { _, _ -> hasReceivedEose = true isLoading = false }, @@ -214,7 +214,7 @@ fun BookmarksScreen( subscriptionsCoordinator?.consumeEvent(event, relay) publicEventState.addItem(event) }, - onCaughtUp = { _, _ -> }, + onEose = { _, _ -> }, ) } else { null @@ -236,7 +236,7 @@ fun BookmarksScreen( subscriptionsCoordinator?.consumeEvent(event, relay) privateEventState.addItem(event) }, - onCaughtUp = { _, _ -> }, + onEose = { _, _ -> }, ) } else { 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 5a24ce6144..d14ae4b50c 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 @@ -439,7 +439,7 @@ private suspend fun fetchMetadataForUsers( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -457,7 +457,7 @@ private suspend fun fetchMetadataForUsers( } } - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -1061,7 +1061,7 @@ private suspend fun fetchUserLightningAddress( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -1078,7 +1078,7 @@ private suspend fun fetchUserLightningAddress( } } - override fun onCaughtUp( + override fun onEose( 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 c9efe8a4d7..edb2e43d88 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) }, - onCaughtUp = { _, _ -> + onEose = { _, _ -> 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 9284ee5aab..80438b7b00 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) } }, - onCaughtUp = { _, _ -> + onEose = { _, _ -> eoseReceivedCount++ }, ) @@ -277,7 +277,7 @@ fun ReadsScreen( eventState.addItem(event) } }, - onCaughtUp = { _, _ -> + onEose = { _, _ -> 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 2bd3c86d5f..2ac9bd5469 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 @@ -202,7 +202,7 @@ fun SearchScreen( } } }, - onCaughtUp = { relay, _ -> + onEose = { relay, _ -> state.updateRelayState(relay.url, RelaySyncStatus.EOSE_RECEIVED) state.stopSearching("people-search") }, @@ -236,7 +236,7 @@ fun SearchScreen( } } }, - onCaughtUp = { relay, _ -> + onEose = { 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 7a30eb3ebf..ff54ca15b9 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 }, - onCaughtUp = { _, _ -> + onEose = { _, _ -> rootNoteEoseReceived = true }, ) @@ -149,7 +149,7 @@ fun ThreadScreen( onEvent = { event, _, relay, _ -> subscriptionsCoordinator?.consumeEvent(event, relay) }, - onCaughtUp = { _, _ -> }, + onEose = { _, _ -> }, ) } 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 da2111a936..0c9582151d 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) }, - onCaughtUp = { _, _ -> }, + onEose = { _, _ -> }, ) } else { null @@ -232,7 +232,7 @@ fun UserProfileScreen( contactListLoaded = true } }, - onCaughtUp = { _, _ -> + onEose = { _, _ -> 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) } }, - onCaughtUp = { _, _ -> }, + onEose = { _, _ -> }, ) } else { null @@ -329,7 +329,7 @@ fun UserProfileScreen( localCache.cacheFollowerCount(pubKeyHex, count) } }, - onCaughtUp = { _, _ -> }, + onEose = { _, _ -> }, ) } else { null @@ -356,7 +356,7 @@ fun UserProfileScreen( pictureEvents.add(event) } }, - onCaughtUp = { _, _ -> }, + onEose = { _, _ -> }, ) } else { null @@ -383,7 +383,7 @@ fun UserProfileScreen( articleEvents.add(event) } }, - onCaughtUp = { _, _ -> }, + onEose = { _, _ -> }, ) } else { null @@ -410,7 +410,7 @@ fun UserProfileScreen( highlightEvents.add(event) } }, - onCaughtUp = { _, _ -> }, + onEose = { _, _ -> }, ) } 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 bcbd2c54df..8137cc4b06 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 @@ -164,7 +164,7 @@ class ChatroomListState( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: 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 b074e3ec1e..3399e8e4d6 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,7 +22,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.publishAndConfirmDetailed import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import kotlinx.coroutines.delay @@ -31,7 +31,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow class DmSendTracker( - private val client: NostrClient, + private val client: INostrClient, ) { private val _status = MutableStateFlow(DmBroadcastStatus.Idle) val status: StateFlow = _status.asStateFlow() 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 a0f7c4ec6e..d50cbbb338 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( } } }, - onCaughtUp = { _, _ -> + onEose = { _, _ -> 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 f3fa81aa99..e3092696cb 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,7 +27,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -50,7 +50,7 @@ import kotlin.test.assertTrue /** * Integration tests for the Coordinator → Cache → ViewModel pipeline. * - * These tests use a stub NostrClient (no real relay connections) and exercise + * These tests use a stub INostrClient (no real relay connections) and exercise * the full event consumption path through DesktopRelaySubscriptionsCoordinator. * * Key invariant being tested: when coordinator.consumeEvent() is called, @@ -65,10 +65,10 @@ class CoordinatorPipelineTest { private suspend fun waitForBundler() = delay(600) /** - * Stub NostrClient — records subscription calls but doesn't connect to any relay. + * Stub INostrClient — 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 : NostrClient { + private class StubNostrClient : INostrClient { val openedSubs = mutableMapOf>, SubscriptionListener?>>() override fun connectedRelaysFlow(): StateFlow> = MutableStateFlow(emptySet()) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/NostrClientInterface.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/INostrClient.kt similarity index 98% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/NostrClientInterface.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/INostrClient.kt index 1bce302d95..f7b1119504 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/NostrClientInterface.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/INostrClient.kt @@ -31,7 +31,7 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -interface NostrClient : AutoCloseable { +interface INostrClient : AutoCloseable { fun connectedRelaysFlow(): StateFlow> fun availableRelaysFlow(): StateFlow> @@ -87,7 +87,7 @@ interface NostrClient : AutoCloseable { fun activeOutboxCache(url: NormalizedRelayUrl): Set } -class EmptyNostrClient : NostrClient { +class EmptyNostrClient : INostrClient { override fun connectedRelaysFlow() = MutableStateFlow(emptySet()) override fun availableRelaysFlow() = MutableStateFlow(emptySet()) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/DefaultNostrClient.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/NostrClient.kt similarity index 98% rename from quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/DefaultNostrClient.kt rename to quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/NostrClient.kt index 0d58098b9c..91b1952d99 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/DefaultNostrClient.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/NostrClient.kt @@ -52,7 +52,7 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch /** - * The NostrClient manages Nostr relay operations, subscriptions, and event delivery. It maintains: + * The INostrClient manages Nostr relay operations, subscriptions, and event delivery. It maintains: * - A RelayPool for managing connections to a collection of Nostr relays * - Active subscriptions tracking through PoolSubscriptionRepository * - An event outbox for managing unsent events and retry logic @@ -76,10 +76,10 @@ 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 DefaultNostrClient( +class NostrClient( private val websocketBuilder: WebsocketBuilder, private val parentScope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob()), -) : NostrClient, +) : INostrClient, RelayConnectionListener, AutoCloseable { private val relayPool: RelayPool = RelayPool(websocketBuilder, this) 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 4bb4af7afb..7c97ec3211 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,7 +21,7 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -29,10 +29,10 @@ import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message import com.vitorpamplona.quartz.utils.Log /** - * Listens to NostrClient's onEvent messages for caching purposes. + * Listens to INostrClient's onEvent messages for caching purposes. */ class EventCollector( - val client: NostrClient, + val client: INostrClient, val onEvent: (event: Event, relay: IRelayClient) -> Unit, ) { private val 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 c0841a9f5a..9222ba74d2 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,7 +20,7 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -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 NostrClient.count( +suspend fun INostrClient.count( relay: NormalizedRelayUrl, filter: Filter, timeoutMs: Long = 15_000, @@ -92,7 +92,7 @@ suspend fun NostrClient.count( * @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 NostrClient.count( +suspend fun INostrClient.count( filters: Map>, timeoutMs: Long = 15_000, ): Map { @@ -155,7 +155,7 @@ suspend fun NostrClient.count( * @param timeoutMs How long to wait for all responses (default 15 s). * @return A merged [CountResult], or `null` if no relay responded. */ -suspend fun NostrClient.countMerged( +suspend fun INostrClient.countMerged( relays: List, filter: Filter, timeoutMs: Long = 15_000, diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchAllExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchAllExt.kt index 340a528281..01cc3a560b 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchAllExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchAllExt.kt @@ -22,7 +22,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -31,45 +31,45 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.RelayUrlNormalizer import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.withTimeoutOrNull -suspend fun NostrClient.fetchAll( +suspend fun INostrClient.fetchAll( relay: String, filter: Filter, timeoutMs: Long = 30_000L, ) = fetchAll(newSubId(), mapOf(RelayUrlNormalizer.normalize(relay) to listOf(filter)), timeoutMs) -suspend fun NostrClient.fetchAll( +suspend fun INostrClient.fetchAll( relay: String, filters: List, timeoutMs: Long = 30_000L, ) = fetchAll(newSubId(), mapOf(RelayUrlNormalizer.normalize(relay) to filters), timeoutMs) -suspend fun NostrClient.fetchAll( +suspend fun INostrClient.fetchAll( subscriptionId: String = newSubId(), relay: String, filters: List, timeoutMs: Long = 30_000L, ) = fetchAll(subscriptionId, mapOf(RelayUrlNormalizer.normalize(relay) to filters), timeoutMs) -suspend fun NostrClient.fetchAll( +suspend fun INostrClient.fetchAll( relay: NormalizedRelayUrl, filter: Filter, timeoutMs: Long = 30_000L, ) = fetchAll(newSubId(), mapOf(relay to listOf(filter)), timeoutMs) -suspend fun NostrClient.fetchAll( +suspend fun INostrClient.fetchAll( relay: NormalizedRelayUrl, filters: List, timeoutMs: Long = 30_000L, ) = fetchAll(newSubId(), mapOf(relay to filters), timeoutMs) -suspend fun NostrClient.fetchAll( +suspend fun INostrClient.fetchAll( subscriptionId: String = newSubId(), relay: NormalizedRelayUrl, filters: List, timeoutMs: Long = 30_000L, ) = fetchAll(subscriptionId, mapOf(relay to filters), timeoutMs) -suspend fun NostrClient.fetchAll( +suspend fun INostrClient.fetchAll( subscriptionId: String = newSubId(), filters: Map>, timeoutMs: Long = 30_000L, @@ -85,7 +85,7 @@ suspend fun NostrClient.fetchAll( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -110,7 +110,7 @@ suspend fun NostrClient.fetchAll( doneChannel.trySend(relay) } - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchAllPagesExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchAllPagesExt.kt index 9889c0407d..8bacb7b383 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchAllPagesExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchAllPagesExt.kt @@ -21,7 +21,7 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -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 NostrClient.fetchAllPages( +suspend fun INostrClient.fetchAllPages( relay: NormalizedRelayUrl, filters: List, timeoutMs: Long = 30_000L, @@ -98,7 +98,7 @@ suspend fun NostrClient.fetchAllPages( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -120,7 +120,7 @@ suspend fun NostrClient.fetchAllPages( } } - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -168,7 +168,7 @@ suspend fun NostrClient.fetchAllPages( return totalEvents } -suspend fun NostrClient.fetchAllPages( +suspend fun INostrClient.fetchAllPages( relay: String, filters: List, timeoutMs: Long = 30_000L, diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchFirstExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchFirstExt.kt index 98951f19f6..16aa650348 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchFirstExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientFetchFirstExt.kt @@ -21,7 +21,7 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -31,39 +31,39 @@ import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel.Factory.UNLIMITED import kotlinx.coroutines.withTimeoutOrNull -suspend fun NostrClient.fetchFirst( +suspend fun INostrClient.fetchFirst( relay: String, filter: Filter, ) = fetchFirst(newSubId(), mapOf(RelayUrlNormalizer.normalize(relay) to listOf(filter))) -suspend fun NostrClient.fetchFirst( +suspend fun INostrClient.fetchFirst( relay: String, filters: List, ) = fetchFirst(newSubId(), mapOf(RelayUrlNormalizer.normalize(relay) to filters)) -suspend fun NostrClient.fetchFirst( +suspend fun INostrClient.fetchFirst( subscriptionId: String = newSubId(), relay: String, filters: List, ) = fetchFirst(subscriptionId, mapOf(RelayUrlNormalizer.normalize(relay) to filters)) -suspend fun NostrClient.fetchFirst( +suspend fun INostrClient.fetchFirst( relay: NormalizedRelayUrl, filter: Filter, ) = fetchFirst(newSubId(), mapOf(relay to listOf(filter))) -suspend fun NostrClient.fetchFirst( +suspend fun INostrClient.fetchFirst( relay: NormalizedRelayUrl, filters: List, ) = fetchFirst(newSubId(), mapOf(relay to filters)) -suspend fun NostrClient.fetchFirst( +suspend fun INostrClient.fetchFirst( subscriptionId: String = newSubId(), relay: NormalizedRelayUrl, filters: List, ) = fetchFirst(subscriptionId, mapOf(relay to filters)) -suspend fun NostrClient.fetchFirst( +suspend fun INostrClient.fetchFirst( subscriptionId: String = newSubId(), filters: Map>, ): Event? { @@ -73,7 +73,7 @@ suspend fun NostrClient.fetchFirst( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -96,7 +96,7 @@ suspend fun NostrClient.fetchFirst( resultChannel.trySend(null) } - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientPublishExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientPublishExt.kt index 44307ceb89..cdbfbf68f0 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientPublishExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/accessories/NostrClientPublishExt.kt @@ -21,7 +21,7 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -41,7 +41,7 @@ class Result( ) @OptIn(DelicateCoroutinesApi::class) -suspend fun NostrClient.publishAndConfirm( +suspend fun INostrClient.publishAndConfirm( event: Event, relayList: Set, timeoutInSeconds: Long = 15, @@ -52,7 +52,7 @@ suspend fun NostrClient.publishAndConfirm( * Returns per-relay results: relay URL -> accepted (true/false). */ @OptIn(DelicateCoroutinesApi::class) -suspend fun NostrClient.publishAndConfirmDetailed( +suspend fun INostrClient.publishAndConfirmDetailed( event: Event, relayList: Set, timeoutInSeconds: Long = 15, 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 411df7b97e..5014eada6f 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,7 +21,7 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories import com.vitorpamplona.quartz.nip01Core.core.HexKey -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -29,10 +29,10 @@ import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.OkMessage import com.vitorpamplona.quartz.utils.Log /** - * Listens to NostrClient's onEvent messages for caching purposes. + * Listens to INostrClient's onEvent messages for caching purposes. */ class RelayInsertConfirmationCollector( - val client: NostrClient, + val client: INostrClient, val onRelayReceived: (eventId: HexKey, relay: IRelayClient) -> Unit, ) { private val 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 1a6734937b..34f32dcd53 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,7 +20,7 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -38,10 +38,10 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.displayUrl import com.vitorpamplona.quartz.utils.Log /** - * Listens to NostrClient's onNotify messages from the relay + * Listens to INostrClient's onNotify messages from the relay */ class RelayLogger( - val client: NostrClient, + val client: INostrClient, val debugSending: Boolean = false, val debugReceiving: Boolean = false, ) { 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 67f4bad85c..65f2c6aae8 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,7 +20,7 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -28,10 +28,10 @@ import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.NotifyMessage import com.vitorpamplona.quartz.utils.Log /** - * Listens to NostrClient's onNotify messages from the relay + * Listens to INostrClient's onNotify messages from the relay */ class RelayNotifier( - val client: NostrClient, + val client: INostrClient, val notify: (message: String, relay: IRelayClient) -> Unit, ) { companion object { 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 a3baede475..c7981bdf78 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,17 +20,17 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.accessories -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 /** - * Listens to NostrClient's onNotify messages from the relay + * Listens to INostrClient's onNotify messages from the relay */ class RelayOfflineTracker( - val client: NostrClient, + val client: INostrClient, ) { companion object { const val TAG = "RelayOfflineTracker" 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 1057b54c61..cce594855a 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,7 +20,7 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.auth -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -46,7 +46,7 @@ object EmptyIAuthStatus : IAuthStatus { } class RelayAuthenticator( - val client: NostrClient, + val client: INostrClient, val scope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob()), val signWithAllLoggedInUsers: suspend (EventTemplate) -> List, ) : IAuthStatus { 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 81db54f814..dba6888dc7 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,7 +20,7 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.counts -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -33,7 +33,7 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.utils.Log class RelayActiveCountStates( - val client: NostrClient, + val client: INostrClient, ) { private var queryStates = mutableMapOf>() 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 80e66a0b4a..fce7019694 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 @@ -193,7 +193,7 @@ class PoolRequests { state?.onNewEvent(relay.url) desiredSubListeners.get(msg.subId)?.onEvent( event = msg.event, - isRealTime = state?.currentState(relay.url) == ReqSubStatus.LIVE, + isLive = 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?.onCaughtUp(relay.url) - desiredSubListeners.get(msg.subId)?.onCaughtUp( + state?.onEose(relay.url) + desiredSubListeners.get(msg.subId)?.onEose( relay = relay.url, forFilters = state?.lastKnownFilterStates(relay.url), ) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/DynamicSubscription.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/DynamicSubscription.kt index a470fb871b..1821f4ad86 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/DynamicSubscription.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/DynamicSubscription.kt @@ -21,13 +21,13 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.reqs import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.utils.RandomInstance class DynamicSubscription( - val client: NostrClient, + val client: INostrClient, val filter: () -> Map>, val onEvent: (event: Event) -> Unit = {}, ) : SubscriptionListener, @@ -36,7 +36,7 @@ class DynamicSubscription( override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -56,7 +56,7 @@ class DynamicSubscription( } } -fun NostrClient.subscribe( +fun INostrClient.subscribe( filters: () -> Map>, onEvent: (event: Event) -> Unit = {}, ): SubscriptionHandle = DynamicSubscription(this, filters, onEvent) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientFetchAsFlowExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientFetchAsFlowExt.kt index 0e9af3f6e7..1cda8b7e7c 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientFetchAsFlowExt.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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 NostrClient.fetchAsFlow( +fun INostrClient.fetchAsFlow( relay: String, filters: List, ) = fetchAsFlow(RelayUrlNormalizer.normalize(relay), filters) -fun NostrClient.fetchAsFlow( +fun INostrClient.fetchAsFlow( relay: String, filter: Filter, ) = fetchAsFlow(RelayUrlNormalizer.normalize(relay), listOf(filter)) -fun NostrClient.fetchAsFlow( +fun INostrClient.fetchAsFlow( relay: NormalizedRelayUrl, filter: Filter, ) = fetchAsFlow(relay, listOf(filter)) -fun NostrClient.fetchAsFlow( +fun INostrClient.fetchAsFlow( relay: NormalizedRelayUrl, filters: List, ): Flow> = @@ -65,7 +65,7 @@ fun NostrClient.fetchAsFlow( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -76,7 +76,7 @@ fun NostrClient.fetchAsFlow( } } - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientSubscribeAsFlowExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientSubscribeAsFlowExt.kt index a1580adb3d..50b6af68ab 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/NostrClientSubscribeAsFlowExt.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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 NostrClient.subscribeAsFlow( +fun INostrClient.subscribeAsFlow( relay: String, filters: List, ) = subscribeAsFlow(RelayUrlNormalizer.normalize(relay), filters) -fun NostrClient.subscribeAsFlow( +fun INostrClient.subscribeAsFlow( relay: String, filter: Filter, ) = subscribeAsFlow(RelayUrlNormalizer.normalize(relay), listOf(filter)) -fun NostrClient.subscribeAsFlow( +fun INostrClient.subscribeAsFlow( relay: NormalizedRelayUrl, filter: Filter, ) = subscribeAsFlow(relay, listOf(filter)) -fun NostrClient.subscribeAsFlow( +fun INostrClient.subscribeAsFlow( relay: NormalizedRelayUrl, filters: List, ): Flow> = @@ -71,7 +71,7 @@ fun NostrClient.subscribeAsFlow( object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -90,7 +90,7 @@ fun NostrClient.subscribeAsFlow( } } - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { 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 2f6f0e6743..a51d2f1df2 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,7 +20,7 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.reqs -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -34,7 +34,7 @@ import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl import com.vitorpamplona.quartz.utils.Log class RelayActiveRequestStates( - val client: NostrClient, + val client: INostrClient, ) { private var subStates = mutableMapOf>() @@ -53,7 +53,7 @@ class RelayActiveRequestStates( ) { when (msg) { is EventMessage -> subGetOrCreate(relay.url).onNewEvent(msg.subId) - is EoseMessage -> subGetOrCreate(relay.url).onCaughtUp(msg.subId) + is EoseMessage -> subGetOrCreate(relay.url).onEose(msg.subId) is ClosedMessage -> subGetOrCreate(relay.url).onClosed(msg.subId) } } 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 b32d3aaf83..f4c8bd8dd6 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 onCaughtUp(reference: T) { + fun onEose(reference: T) { subStates[reference] = ReqSubStatus.LIVE } diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/StaticSubscription.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/StaticSubscription.kt index d093c3b2e5..1e87560adb 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/StaticSubscription.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/StaticSubscription.kt @@ -21,14 +21,14 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.reqs import com.vitorpamplona.quartz.nip01Core.core.Event -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 StaticSubscription( - val client: NostrClient, + val client: INostrClient, val filter: Map>, val onEvent: (event: Event) -> Unit = {}, ) : SubscriptionListener, @@ -37,7 +37,7 @@ class StaticSubscription( override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { @@ -57,25 +57,25 @@ class StaticSubscription( } } -fun NostrClient.subscribe( +fun INostrClient.subscribe( relay: NormalizedRelayUrl, filters: List, onEvent: (event: Event) -> Unit = {}, ): SubscriptionHandle = StaticSubscription(this, mapOf(relay to filters), onEvent) -fun NostrClient.subscribe( +fun INostrClient.subscribe( relay: NormalizedRelayUrl, filter: Filter, onEvent: (event: Event) -> Unit = {}, ): SubscriptionHandle = StaticSubscription(this, mapOf(relay to listOf(filter)), onEvent) -fun NostrClient.subscribe( +fun INostrClient.subscribe( relays: List, filters: List, onEvent: (event: Event) -> Unit = {}, ): SubscriptionHandle = StaticSubscription(this, relays.associateWith { filters }, onEvent) -fun NostrClient.subscribe( +fun INostrClient.subscribe( relays: List, filter: Filter, onEvent: (event: Event) -> Unit = {}, @@ -84,13 +84,13 @@ fun NostrClient.subscribe( // ----------------------------------- // Helper methods with relay as string // ----------------------------------- -fun NostrClient.subscribe( +fun INostrClient.subscribe( relay: String, filters: List, onEvent: (event: Event) -> Unit = {}, ): SubscriptionHandle = StaticSubscription(this, mapOf(RelayUrlNormalizer.normalize(relay) to filters), onEvent) -fun NostrClient.subscribe( +fun INostrClient.subscribe( relay: String, filter: Filter, onEvent: (event: Event) -> Unit = {}, diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/SubscriptionListener.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/SubscriptionListener.kt index eb2dde2bbd..45f614237d 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/SubscriptionListener.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip01Core/relay/client/reqs/SubscriptionListener.kt @@ -25,14 +25,14 @@ import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip01Core.relay.normalizer.NormalizedRelayUrl interface SubscriptionListener { - fun onCaughtUp( + fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) {} fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) {} 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 1d8793a634..4b34d22739 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,7 +20,7 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.reqs.stats -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -28,10 +28,10 @@ import com.vitorpamplona.quartz.nip01Core.relay.commands.toClient.Message import com.vitorpamplona.quartz.utils.Log /** - * Listens to NostrClient's onNotify messages from the relay + * Listens to INostrClient's onNotify messages from the relay */ class RelayReqStats( - val client: NostrClient, + val client: INostrClient, ) { private val stats = ReqStatsRepository() 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 cd35ccec25..b6548e1a2c 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,7 +21,7 @@ package com.vitorpamplona.quartz.nip01Core.relay.client.stats import androidx.collection.LruCache -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -35,7 +35,7 @@ import com.vitorpamplona.quartz.utils.Log import com.vitorpamplona.quartz.utils.bytesUsedInMemory class RelayStats( - val client: NostrClient, + val client: INostrClient, ) { private val innerCache = object : LruCache(1000) { 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 0481699ab0..6e0f4883e4 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,14 +20,14 @@ */ package com.vitorpamplona.quartz.nip01Core.relay.client.subscriptions -import com.vitorpamplona.quartz.nip01Core.relay.client.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 /** - * Manages Nostr subscriptions using a [NostrClient], allowing subscriptions to be created, modified, + * Manages Nostr subscriptions using a [INostrClient], allowing subscriptions to be created, modified, * and synchronized with relay filters. Subscriptions are stored in a cache and processed through * [updateRelays] to update relay filters dynamically. Also tracks event statistics and EOSE (End of * Stored Events) events, and provides utility methods to interact with subscriptions like dismissal. @@ -45,7 +45,7 @@ import com.vitorpamplona.quartz.utils.cache.LargeCache * - Dismiss subscriptions with [dismissSubscription]. */ class SubscriptionController( - val client: NostrClient, + val client: INostrClient, ) { private val subscriptions = LargeCache() 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 9013ffc666..4268dcef39 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, - onCaughtUp: () -> Unit, + onEose: () -> Unit, ) { // 1. Replay stored events matching filters. store.query(filters, onEach) // 2. Signal end of stored events. - onCaughtUp() + onEose() // 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 f81436b7e3..2a384d8a68 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)) } }, - onCaughtUp = { send(EoseMessage(cmd.subId)) }, + onEose = { 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 8f07a56560..27d2f4a508 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,7 +22,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -52,7 +52,7 @@ class NostrSignerRemote( val signer: NostrSignerInternal, val remotePubkey: HexKey, val relays: Set, - val client: NostrClient, + val client: INostrClient, val permissions: String? = null, val secret: String? = null, ) : NostrSigner(signer.pubKey) { @@ -296,7 +296,7 @@ class NostrSignerRemote( fun fromBunkerUri( bunkerUri: String, signer: NostrSignerInternal, - client: NostrClient, + client: INostrClient, 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 bec9768012..5ae463e050 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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: NostrClient, + val client: INostrClient, val signer: NostrSignerInternal, val remoteKey: String, val relayList: Set, 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 4af65a8d2b..018e9e46fa 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip77Negentropy/NegentropyManager.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip77Negentropy/NegentropyManager.kt @@ -63,7 +63,7 @@ interface INegentropyListener { * per relay and subscription ID. * * Usage: - * 1. Register this as a listener on the NostrClient + * 1. Register this as a listener on the INostrClient * 2. Call [startSync] with a filter and local events to begin reconciliation * 3. Receive results via [INegentropyListener] callbacks */ 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 e19fb4afa5..47b9376dcc 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,7 +22,7 @@ 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.NostrClient +import com.vitorpamplona.quartz.nip01Core.relay.client.INostrClient 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 @@ -37,10 +37,10 @@ import kotlin.test.assertNotNull import kotlin.test.assertTrue /** - * NostrClient that records subscribe calls for verification. + * INostrClient that records subscribe calls for verification. * Used instead of mockk since commonTest doesn't have mockk. */ -private class TrackingNostrClient : NostrClient { +private class TrackingNostrClient : INostrClient { data class SubscriptionRecord( val subId: String, val filters: Map>, 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 655db87210..5e9d2b35f9 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 @@ -20,7 +20,6 @@ */ package com.vitorpamplona.quartz.nip01Core.relay import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -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 @@ -36,7 +35,7 @@ class NostrClientFirstEventTest : BaseNostrClientTest() { fun testDownloadFirstEvent() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = DefaultNostrClient(socketBuilder, appScope) + val client = NostrClient(socketBuilder, appScope) val event = client.fetchFirst( 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 eee18c4974..05270debae 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 @@ -21,7 +21,6 @@ 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.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 @@ -42,7 +41,7 @@ class NostrClientManualSubTest : BaseNostrClientTest() { fun testEoseAfter100Events() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = DefaultNostrClient(socketBuilder, appScope) + val client = NostrClient(socketBuilder, appScope) val resultChannel = Channel(UNLIMITED) val events = mutableListOf() @@ -52,14 +51,14 @@ class NostrClientManualSubTest : BaseNostrClientTest() { object : SubscriptionListener { override fun onEvent( event: Event, - isRealTime: Boolean, + isLive: Boolean, relay: NormalizedRelayUrl, forFilters: List?, ) { resultChannel.trySend(event.id) } - override fun onCaughtUp( + override fun onEose( relay: NormalizedRelayUrl, forFilters: List?, ) { 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 36bd0c0ae3..3d39dceb76 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,7 +19,6 @@ * 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.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 @@ -42,7 +41,7 @@ class NostrClientQueryCountTest : BaseNostrClientTest() { fun testQueryCountSuspend() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = DefaultNostrClient(socketBuilder, appScope) + val client = NostrClient(socketBuilder, appScope) val result = client.count(fiatjaf, metadata) @@ -56,7 +55,7 @@ class NostrClientQueryCountTest : BaseNostrClientTest() { fun testQueryCountSuspendAllEvents() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = DefaultNostrClient(socketBuilder, appScope) + val client = NostrClient(socketBuilder, appScope) val result = client.count(fiatjaf, Filter()) @@ -70,7 +69,7 @@ class NostrClientQueryCountTest : BaseNostrClientTest() { fun testQueryCountSuspendMultipleRelays() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = DefaultNostrClient(socketBuilder, appScope) + val client = NostrClient(socketBuilder, appScope) val results = client.count( 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 a5012b39bb..0554d866b6 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 @@ -20,7 +20,6 @@ */ package com.vitorpamplona.quartz.nip01Core.relay import com.vitorpamplona.quartz.nip01Core.metadata.MetadataEvent -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 @@ -48,7 +47,7 @@ class NostrClientRepeatSubTest : BaseNostrClientTest() { fun testRepeatSubEvents() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = DefaultNostrClient(socketBuilder, appScope) + val client = NostrClient(socketBuilder, appScope) val resultChannel = Channel(UNLIMITED) val events = mutableListOf() 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 9f4e576e25..ec7388cce7 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 @@ -21,7 +21,6 @@ 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.DefaultNostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.accessories.fetchAllPages import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.nip02FollowList.ContactListEvent @@ -39,7 +38,7 @@ class NostrClientReqBypassingRelayLimitsTest : BaseNostrClientTest() { fun testDownloadFromRelayReturnsMetadataEvents() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = DefaultNostrClient(socketBuilder, appScope) + val client = NostrClient(socketBuilder, appScope) val events = mutableListOf() @@ -73,7 +72,7 @@ class NostrClientReqBypassingRelayLimitsTest : BaseNostrClientTest() { fun testDownloadFromRelayReturnsMetadataAndContactListEvents() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = DefaultNostrClient(socketBuilder, appScope) + val client = NostrClient(socketBuilder, appScope) val metadataEvents = mutableListOf() val contactListEvents = mutableListOf() 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 a347fd0644..5dbe4a5f09 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 @@ -20,7 +20,6 @@ */ package com.vitorpamplona.quartz.nip01Core.relay import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair -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 @@ -38,7 +37,7 @@ class NostrClientSendAndWaitTest : BaseNostrClientTest() { fun testSendAndWaitForResponse() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = DefaultNostrClient(socketBuilder, appScope) + val client = NostrClient(socketBuilder, appScope) val randomSigner = NostrSignerInternal(KeyPair()) 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 6a9964c799..e3d767fde1 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 @@ -21,7 +21,6 @@ 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.DefaultNostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.subscribeAsFlow import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.utils.Log @@ -49,7 +48,7 @@ class NostrClientSubscriptionAsFlowTest : BaseNostrClientTest() { fun testNostrClientSubscriptionAsFlow() = runTest { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = DefaultNostrClient(socketBuilder, appScope) + val client = NostrClient(socketBuilder, appScope) val flow = client.subscribeAsFlow( @@ -88,7 +87,7 @@ class NostrClientSubscriptionAsFlowTest : BaseNostrClientTest() { fun testNostrClientSubscriptionAsFlowDebouncing() = runTest { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = DefaultNostrClient(socketBuilder, appScope) + val client = NostrClient(socketBuilder, appScope) val flow = client.subscribeAsFlow( 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 360f4e534f..89a5b97caf 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 @@ -21,7 +21,6 @@ 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.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 @@ -41,7 +40,7 @@ class NostrClientSubscriptionTest : BaseNostrClientTest() { fun testNostrClientSubscription() = runBlocking { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = DefaultNostrClient(socketBuilder, appScope) + val client = NostrClient(socketBuilder, appScope) val resultChannel = Channel(UNLIMITED) val events = mutableSetOf() 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 2ed7002248..289d9d2cb1 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 @@ -21,7 +21,6 @@ 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.DefaultNostrClient import com.vitorpamplona.quartz.nip01Core.relay.client.reqs.fetchAsFlow import com.vitorpamplona.quartz.nip01Core.relay.filters.Filter import com.vitorpamplona.quartz.utils.Log @@ -49,7 +48,7 @@ class NostrClientSubscriptionUntilEoseAsFlowTest : BaseNostrClientTest() { fun testNostrClientSubscriptionUntilEoseAsFlow() = runTest { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = DefaultNostrClient(socketBuilder, appScope) + val client = NostrClient(socketBuilder, appScope) val flow = client.fetchAsFlow( @@ -88,7 +87,7 @@ class NostrClientSubscriptionUntilEoseAsFlowTest : BaseNostrClientTest() { fun testNostrClientSubscriptionUntilEoseAsFlowDebouncing() = runTest { val appScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) - val client = DefaultNostrClient(socketBuilder, appScope) + val client = NostrClient(socketBuilder, appScope) val flow = client.fetchAsFlow( From 9c361dbe1ef555fd9d6a134e947ee4f236c7c6c5 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 28 Mar 2026 21:29:29 +0000 Subject: [PATCH 3/5] feat: add OpenGraph preview to WebBookmark cards Fetches URL metadata via the existing UrlCachedPreviewer to display OG images, fallback titles, and descriptions in the bookmark list. https://claude.ai/code/session_016igt51hduwQ7bXF9kNNHGD --- .../webBookmarks/WebBookmarksScreen.kt | 46 +++++++++++++++++-- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/webBookmarks/WebBookmarksScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/webBookmarks/WebBookmarksScreen.kt index 129ed18c74..526e8b1fa0 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/webBookmarks/WebBookmarksScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/webBookmarks/WebBookmarksScreen.kt @@ -53,22 +53,28 @@ import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.onFocusChanged +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import coil3.compose.AsyncImage import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.commons.ui.feeds.FeedContentState import com.vitorpamplona.amethyst.commons.ui.feeds.FeedState import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.model.UrlCachedPreviewer import com.vitorpamplona.amethyst.ui.components.UrlPreviewState import com.vitorpamplona.amethyst.ui.feeds.RefresheableBox import com.vitorpamplona.amethyst.ui.feeds.RenderFeedContentState @@ -83,6 +89,7 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.amethyst.ui.theme.DividerThickness import com.vitorpamplona.amethyst.ui.theme.FeedPadding +import com.vitorpamplona.amethyst.ui.theme.QuoteBorder import com.vitorpamplona.amethyst.ui.theme.Size55Modifier import com.vitorpamplona.quartz.nipB0WebBookmarks.WebBookmarkEvent import kotlinx.coroutines.launch @@ -238,6 +245,17 @@ private fun WebBookmarkCard( ) } + @Suppress("ProduceStateDoesNotAssignValue") + val urlPreviewState by + produceState( + initialValue = UrlCachedPreviewer.cache.get(event.url()) ?: UrlPreviewState.Loading, + key1 = event.url(), + ) { + if (value == UrlPreviewState.Loading) { + accountViewModel.urlPreview(event.url()) { value = it } + } + } + Column( modifier = Modifier @@ -245,6 +263,23 @@ private fun WebBookmarkCard( .clickable { uriHandler.openUri(event.url()) } .padding(16.dp), ) { + val previewInfo = (urlPreviewState as? UrlPreviewState.Loaded)?.previewInfo + + if (previewInfo?.imageUrlFullPath != null) { + AsyncImage( + model = previewInfo.imageUrlFullPath, + contentDescription = event.title() ?: previewInfo.title, + contentScale = ContentScale.Crop, + modifier = + Modifier + .fillMaxWidth() + .height(180.dp) + .clip(QuoteBorder), + ) + + Spacer(modifier = Modifier.height(8.dp)) + } + Row( modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, @@ -252,7 +287,7 @@ private fun WebBookmarkCard( ) { Column(modifier = Modifier.weight(1f)) { Text( - text = event.title() ?: event.url(), + text = event.title() ?: previewInfo?.title?.ifBlank { null } ?: event.url(), style = MaterialTheme.typography.titleMedium, fontWeight = FontWeight.Bold, maxLines = 1, @@ -260,9 +295,9 @@ private fun WebBookmarkCard( ) Text( - text = event.url(), + text = previewInfo?.verifiedUrl?.host ?: event.url(), style = MaterialTheme.typography.bodySmall, - color = MaterialTheme.colorScheme.primary, + color = Color.Gray, maxLines = 1, overflow = TextOverflow.Ellipsis, ) @@ -291,10 +326,11 @@ private fun WebBookmarkCard( } } - if (event.description().isNotBlank()) { + val description = event.description().ifBlank { previewInfo?.description ?: "" } + if (description.isNotBlank()) { Spacer(modifier = Modifier.height(4.dp)) Text( - text = event.description(), + text = description, style = MaterialTheme.typography.bodyMedium, maxLines = 3, overflow = TextOverflow.Ellipsis, From 0adea4f40ab7ef09f548323dda022f867106eb64 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 28 Mar 2026 22:36:42 +0000 Subject: [PATCH 4/5] feat: add RelayDiscoveryEvent renderer for feed display Add a composable to render NIP-66 RelayDiscoveryEvent (kind 30166) in the note feed, displaying relay URL, RTT metrics with color-coded chips, network type, relay type, requirements, supported NIPs, accepted kinds, topics, and geohash location. https://claude.ai/code/session_01EsPmtRFQgknkDV6zmKkeS2 --- .../amethyst/ui/note/NoteCompose.kt | 6 + .../amethyst/ui/note/types/RelayDiscovery.kt | 297 ++++++++++++++++++ amethyst/src/main/res/values/strings.xml | 2 + 3 files changed, 305 insertions(+) create mode 100644 amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/RelayDiscovery.kt diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt index bb33359599..11833bcab0 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/NoteCompose.kt @@ -144,6 +144,7 @@ import com.vitorpamplona.amethyst.ui.note.types.RenderPostApproval import com.vitorpamplona.amethyst.ui.note.types.RenderPrivateMessage import com.vitorpamplona.amethyst.ui.note.types.RenderPublicMessage import com.vitorpamplona.amethyst.ui.note.types.RenderReaction +import com.vitorpamplona.amethyst.ui.note.types.RenderRelayDiscovery import com.vitorpamplona.amethyst.ui.note.types.RenderReport import com.vitorpamplona.amethyst.ui.note.types.RenderTextEvent import com.vitorpamplona.amethyst.ui.note.types.RenderTextModificationEvent @@ -244,6 +245,7 @@ import com.vitorpamplona.quartz.nip64Chess.challenge.offer.LiveChessGameChalleng import com.vitorpamplona.quartz.nip64Chess.end.LiveChessGameEndEvent import com.vitorpamplona.quartz.nip64Chess.game.ChessGameEvent import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent +import com.vitorpamplona.quartz.nip66RelayMonitor.discovery.RelayDiscoveryEvent import com.vitorpamplona.quartz.nip68Picture.PictureEvent import com.vitorpamplona.quartz.nip71Video.VideoHorizontalEvent import com.vitorpamplona.quartz.nip71Video.VideoNormalEvent @@ -911,6 +913,10 @@ private fun RenderNoteRow( DisplayBroadcastRelayList(baseNote, backgroundColor, accountViewModel, nav) } + is RelayDiscoveryEvent -> { + RenderRelayDiscovery(baseNote, accountViewModel, nav) + } + is PinListEvent -> { RenderPinListEvent(baseNote, backgroundColor, accountViewModel, nav) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/RelayDiscovery.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/RelayDiscovery.kt new file mode 100644 index 0000000000..e1b24815a8 --- /dev/null +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/RelayDiscovery.kt @@ -0,0 +1,297 @@ +/* + * Copyright (c) 2025 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.amethyst.ui.note.types + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Dns +import androidx.compose.material.icons.filled.Language +import androidx.compose.material.icons.filled.Lock +import androidx.compose.material.icons.filled.LockOpen +import androidx.compose.material.icons.filled.Numbers +import androidx.compose.material.icons.filled.Tag +import androidx.compose.material.icons.filled.TravelExplore +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.model.Note +import com.vitorpamplona.amethyst.ui.navigation.navs.INav +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import com.vitorpamplona.amethyst.ui.stringRes +import com.vitorpamplona.quartz.nip01Core.relay.normalizer.displayUrl +import com.vitorpamplona.quartz.nip66RelayMonitor.discovery.RelayDiscoveryEvent + +@OptIn(ExperimentalLayoutApi::class) +@Composable +fun RenderRelayDiscovery( + baseNote: Note, + accountViewModel: AccountViewModel, + nav: INav, +) { + val noteEvent = baseNote.event as? RelayDiscoveryEvent ?: return + val context = LocalContext.current + + val relayUrl = remember(noteEvent) { noteEvent.relay() } + val rttOpen = remember(noteEvent) { noteEvent.rttOpen() } + val rttRead = remember(noteEvent) { noteEvent.rttRead() } + val rttWrite = remember(noteEvent) { noteEvent.rttWrite() } + val networkTypes = remember(noteEvent) { noteEvent.networkTypes() } + val relayTypes = remember(noteEvent) { noteEvent.relayTypes() } + val supportedNips = remember(noteEvent) { noteEvent.supportedNips() } + val requirements = remember(noteEvent) { noteEvent.requirements() } + val acceptedKinds = remember(noteEvent) { noteEvent.acceptedKinds() } + val topics = remember(noteEvent) { noteEvent.topics() } + val geohashes = remember(noteEvent) { noteEvent.geohashes() } + + Column( + modifier = Modifier.fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + // Relay URL header + if (relayUrl != null) { + Text( + text = relayUrl.displayUrl(), + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.primary, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + + // RTT metrics + if (rttOpen != null || rttRead != null || rttWrite != null) { + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceEvenly, + ) { + rttOpen?.let { + RttMetricChip(stringRes(R.string.relay_monitor_rtt_open), it) + } + rttRead?.let { + RttMetricChip(stringRes(R.string.relay_monitor_rtt_read), it) + } + rttWrite?.let { + RttMetricChip(stringRes(R.string.relay_monitor_rtt_write), it) + } + } + } + + // Network type + if (networkTypes.isNotEmpty()) { + DiscoveryInfoRow( + icon = Icons.Default.Language, + label = stringRes(R.string.relay_monitor_network), + value = networkTypes.joinToString { it.code }, + ) + } + + // Relay type + if (relayTypes.isNotEmpty()) { + DiscoveryInfoRow( + icon = Icons.Default.Dns, + label = stringRes(R.string.relay_monitor_relay_type), + value = relayTypes.joinToString(), + ) + } + + // Requirements + if (requirements.isNotEmpty()) { + DiscoveryInfoRow( + icon = if (requirements.any { !it.negated }) Icons.Default.Lock else Icons.Default.LockOpen, + label = stringRes(R.string.relay_monitor_requirements), + value = + requirements.joinToString { req -> + if (req.negated) "!${req.value}" else req.value + }, + ) + } + + // Supported NIPs + if (supportedNips.isNotEmpty()) { + DiscoveryInfoRow( + icon = Icons.Default.Numbers, + label = stringRes(R.string.relay_monitor_supported_nips), + value = supportedNips.sorted().joinToString(), + ) + } + + // Accepted kinds + if (acceptedKinds.isNotEmpty()) { + DiscoveryInfoRow( + icon = Icons.Default.Dns, + label = stringRes(R.string.relay_discovery_accepted_kinds), + value = + acceptedKinds.joinToString { kind -> + if (kind.negated) "!${kind.kind}" else "${kind.kind}" + }, + ) + } + + // Topics + if (topics.isNotEmpty()) { + Row( + modifier = Modifier.padding(vertical = 2.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + Icons.Default.Tag, + contentDescription = null, + modifier = Modifier.size(18.dp), + tint = MaterialTheme.colorScheme.secondary, + ) + Spacer(Modifier.width(12.dp)) + FlowRow( + horizontalArrangement = Arrangement.spacedBy(6.dp), + verticalArrangement = Arrangement.spacedBy(4.dp), + ) { + topics.forEach { topic -> + TopicChip(topic) + } + } + } + } + + // Geohashes + if (geohashes.isNotEmpty()) { + DiscoveryInfoRow( + icon = Icons.Default.TravelExplore, + label = stringRes(R.string.relay_discovery_geohash), + value = geohashes.joinToString(), + ) + } + + // Content description + if (noteEvent.content.isNotBlank()) { + Text( + text = noteEvent.content, + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + maxLines = 5, + overflow = TextOverflow.Ellipsis, + ) + } + } +} + +@Composable +private fun RttMetricChip( + label: String, + ms: Long, +) { + val color = + when { + ms < 200 -> Color(0xFF4CAF50) + ms < 500 -> Color(0xFFFFC107) + else -> MaterialTheme.colorScheme.error + } + Column(horizontalAlignment = Alignment.CenterHorizontally) { + Text( + text = label, + style = MaterialTheme.typography.labelSmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + Surface( + shape = RoundedCornerShape(50), + color = color.copy(alpha = 0.15f), + ) { + Text( + text = stringRes(R.string.relay_monitor_ms, ms.toInt()), + modifier = Modifier.padding(horizontal = 10.dp, vertical = 4.dp), + style = MaterialTheme.typography.labelMedium, + fontWeight = FontWeight.Bold, + color = color, + ) + } + } +} + +@Composable +private fun TopicChip(topic: String) { + Surface( + shape = RoundedCornerShape(50), + color = MaterialTheme.colorScheme.secondaryContainer, + ) { + Text( + text = "#$topic", + modifier = Modifier.padding(horizontal = 10.dp, vertical = 4.dp), + style = MaterialTheme.typography.labelMedium, + color = MaterialTheme.colorScheme.onSecondaryContainer, + ) + } +} + +@Composable +private fun DiscoveryInfoRow( + icon: ImageVector, + label: String, + value: String, +) { + Row( + modifier = Modifier.padding(vertical = 2.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + icon, + contentDescription = null, + modifier = Modifier.size(18.dp), + tint = MaterialTheme.colorScheme.secondary, + ) + Spacer(Modifier.width(12.dp)) + Text( + text = label, + style = MaterialTheme.typography.labelLarge, + maxLines = 1, + ) + Text( + text = value, + textAlign = TextAlign.End, + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.SemiBold, + modifier = Modifier.weight(1f), + overflow = TextOverflow.Ellipsis, + maxLines = 1, + ) + } +} diff --git a/amethyst/src/main/res/values/strings.xml b/amethyst/src/main/res/values/strings.xml index 139f6ca4c2..e62ea06c22 100644 --- a/amethyst/src/main/res/values/strings.xml +++ b/amethyst/src/main/res/values/strings.xml @@ -839,6 +839,8 @@ Requirements Last check %1$d ms + Accepted Kinds + Location Active Subscriptions Pending Outbox Events REQ Subscriptions (%1$d) From 1514de53c7214e5fb6c8923c701a5b9fcb15d1d8 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 28 Mar 2026 22:40:03 +0000 Subject: [PATCH 5/5] fix: keep screen on during PiP playback and survive screen lock PiP video now keeps the screen on while playing (matching YouTube behavior) and no longer kills the activity when the screen locks, allowing audio to continue through the PlaybackService. https://claude.ai/code/session_01QJzmFaabSA9YQ3oCQwEHTJ --- .../service/playback/pip/PipVideoActivity.kt | 20 +++++++++---- .../service/playback/pip/PipVideoView.kt | 29 +++++++++++++++++++ 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/pip/PipVideoActivity.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/pip/PipVideoActivity.kt index f69ce32c43..0252d48358 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/pip/PipVideoActivity.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/pip/PipVideoActivity.kt @@ -60,14 +60,22 @@ class PipVideoActivity : ComponentActivity() { } } - override fun onStop() { - super.onStop() - finishAndRemoveTask() + override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) { + super.onPictureInPictureModeChanged(isInPictureInPictureMode) + if (!isInPictureInPictureMode) { + // User dismissed PiP (swiped away or expanded). + finishAndRemoveTask() + } } - override fun finish() { - finishAndRemoveTask() - super.finish() + override fun onStop() { + super.onStop() + if (!isInPictureInPictureMode) { + // Only finish if we're not in PiP mode. + // When the screen locks while in PiP, we stay alive + // so the PlaybackService can continue audio playback. + finishAndRemoveTask() + } } companion object { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/pip/PipVideoView.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/pip/PipVideoView.kt index 4a01cb6ec6..59a4259812 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/pip/PipVideoView.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/pip/PipVideoView.kt @@ -32,7 +32,9 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView import androidx.core.content.ContextCompat +import androidx.media3.common.Player import androidx.media3.common.util.UnstableApi import androidx.media3.ui.compose.ContentFrame import androidx.media3.ui.compose.state.rememberMuteButtonState @@ -51,6 +53,8 @@ fun RenderPipVideo( controller: MediaControllerState, waveformData: WaveformData?, ) { + KeepScreenOnWhilePlaying(controller) + val modifier = remember { val ratio = @@ -78,6 +82,31 @@ fun RenderPipVideo( } } +@Composable +fun KeepScreenOnWhilePlaying(controller: MediaControllerState) { + val view = LocalView.current + + DisposableEffect(controller.controller, view) { + val listener = + object : Player.Listener { + override fun onIsPlayingChanged(isPlaying: Boolean) { + if (view.keepScreenOn != isPlaying) { + view.keepScreenOn = isPlaying + } + } + } + + // Set initial state + view.keepScreenOn = controller.controller.isPlaying + + controller.controller.addListener(listener) + onDispose { + controller.controller.removeListener(listener) + view.keepScreenOn = false + } + } +} + @Composable fun RegisterControllerReceiver(controllerState: MediaControllerState) { val context = LocalContext.current