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 a591dd575..095256bdd 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 f892f6740..2c882a0a0 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 7fe6b43bc..e29b7454a 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 9f988bd19..6c99e5d71 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 30379256b..db5787cc6 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 f5c044e1a..8015ed82e 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 c65d10d6f..ad5855b56 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 6e03d26c7..6a0bbd52c 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 512f85a3b..b48084821 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 2437c21a2..5e574086d 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 dad3d827b..15bce2c7c 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 da4d9b2b4..ec6477bd6 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 357a2ab10..c1b9e7de6 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 aaefb517a..b241a6179 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 404015a6b..1842141a3 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 3c1363a1f..43e60799e 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 1c387a304..9b3aa2908 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 1d87c2f00..8d5808e51 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 5e70dfedd..f89a4c06b 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 db90fd8b7..8afa83e02 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 9d7c0cdfe..40695d1e3 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 9aa0acc87..38cd0a1a6 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 ab4de2875..ef5d8bfbe 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 9ea523510..33023a862 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 57dfe7050..9fcb70ba4 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 c14d14bd1..10cacc571 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 4f8dfde48..21992934a 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 0d087ca16..d7e5541b7 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 29a676749..9c6858b73 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 9ff15e640..6fdc7ad79 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 91358cdfd..aa730d6ab 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 48c66be4e..1b8e7e4c7 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 4be5b34c4..2ff1bcd18 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 e6b572e09..7123850c1 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 44316d6b1..9cb8eaf5d 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 19474b6c4..93c97616b 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 fd2e68532..1822f310a 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 4975a63a9..4d7ea0023 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 ebbd64c4a..7f2533ac2 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 94b63bcad..32a0a4839 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 1fa7801e6..412021ad2 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 8bceccb65..4c57edd72 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 4bd3202fd..2d8628574 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 dddd78535..0563450f3 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 b5cc945fc..e8a6c6906 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 0d451daec..4c427295a 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 3edc54fdb..4855bf7ee 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 70fea4c93..db89c4285 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 6fab0c332..ad10706f5 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 2b9c53450..644f705fa 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 410e03d59..d4bab373e 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 ad6ca0ddb..55b457067 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 98c66b737..8a927ead6 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 3a1cccd1d..3bb6d12b3 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 04a4fc5b9..ba918bf29 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 d3571be89..8d68110da 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 fdb60d00d..71974a410 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 dc49d49b5..6792b29af 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 78eb084d1..d3d5be3ae 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 941b95c28..40279083d 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 a6e94c133..78ebfa01d 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 940414cc4..874745483 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 08f100400..853e3d346 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 9d7fe94ab..65e2f3d33 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 af5257fa6..af98d9faa 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 23a6b1d22..e3156b9f5 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 55a481ed2..dd3bfa7a3 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 e76959df4..6771f1313 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 ff7f31365..075611e1f 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 b57daf7ce..6080659e1 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 6fe462fe8..e15a7514c 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 1066b7f53..40f6de975 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 e6d21c933..abfb6182b 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 2ef23e9a9..ec945b2b9 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 5546024d0..8de29250d 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 a439a9d43..0878a3f0c 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 2a90bd26b..de6a9fb36 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 91bc1f373..af9899177 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 8a2654284..f0961ba0d 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 676288ee0..253c14560 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 fe2efdfe1..59d08dfae 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 04e67671b..36e725821 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 9cb756013..7e74b504c 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 f9a465a27..1fdf5bbeb 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 ac089db90..40b86b66b 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 ca5fa42e7..5a4e970d3 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 5b0287302..c4cf933a3 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 4a713d379..aa5233d11 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 4962f5e3e..241773ac6 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 6725ef332..72c7efba3 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 c3b836af9..4cc8df331 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 1dffa08b4..dbc79f2fd 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 72c371f65..0d62c8fc6 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 8d0393d38..bcc6827d7 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 469227aa1..dc0d2d1f1 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 6f31c7421..99ee6c130 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 59c37d4df..e996f3b7c 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 4c73e002b..96dcbad66 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 7fab08fbc..e998fb621 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 2668756b8..b792b5345 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 1f98c52ef..bd84b35b7 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 d535cd7ae..e53804571 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 44edd4446..42faeabcd 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 f6dd01b7c..38d9aab20 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 a7d4a633a..78c677a91 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 e1b9ced84..28aebdf2a 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 da9f93413..e2d03f464 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 f7ce8727d..7ddb5ec3f 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 c0debf9ac..965b25821 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 4bd362e90..6d1c5d20a 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 e692b6470..95f487dc2 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 9f12a8163..654da5d7c 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 4e940173d..5a24ce614 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 edb2e43d8..c9efe8a4d 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 80438b7b0..9284ee5aa 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 c866b0ba5..2bd3c86d5 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 ff54ca15b..7a30eb3eb 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 0c9582151..da2111a93 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 26e0cbd81..bcbd2c54d 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 216d3ab43..b074e3ec1 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 d50cbbb33..a0f7c4ec6 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 b47fa330f..f3fa81aa9 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 a314a0dd8..0d58098b9 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 6b738aec6..1bce302d9 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 1853525ee..4bb4af7af 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 2816642c8..c0841a9f5 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 fefd81bbd..340a52828 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 a4a20ab3f..9889c0407 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 68ee0f621..98951f19f 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 9815f8d42..44307ceb8 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 1b73dcd78..411df7b97 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 303f8727f..1a6734937 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 7deb24690..67f4bad85 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 abda66eb1..a3baede47 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 226f0ce8d..1057b54c6 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 c8b7388c6..81db54f81 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 543811874..5d7fba5ff 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 9910400b8..90d4c167b 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 0ea0c49d7..80e66a0b4 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 6f2c4b03a..b60eda98a 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 dd77200a3..a470fb871 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 371c48d29..0e9af3f6e 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 aacd7ec70..a1580adb3 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 f3c822491..2f6f0e674 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 3cd75342f..b32d3aaf8 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 f6e1371c6..d093c3b2e 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 c9eaea304..6aa55066f 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 4c88592f2..eb2dde2bb 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 86d576f10..1d8793a63 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 c8a4373ff..e83256988 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 a5964708b..5063f0331 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 835499361..cd35ccec2 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 0e0b592c9..ef2a72ed0 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 cf926f8e4..0481699ab 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 4268dcef3..9013ffc66 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 2a384d8a6..f81436b7e 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 515043d44..8f07a5656 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 adae21dfa..bec976801 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 7401a63be..4af65a8d2 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 946b8fb2d..e19fb4afa 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 5f5e888ea..655db8721 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 e974d964d..eee18c497 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 d58ed363f..36bd0c0ae 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 7334cb158..a5012b39b 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 352ecada2..9f4e576e2 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 e942fe134..a347fd064 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 7afd9caad..6a9964c79 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 00c37f00e..360f4e534 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 de3623968..2ed700224 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 095256bdd..9902c067a 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 2c882a0a0..41dd0cc3b 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 e29b7454a..2f3690482 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 6c99e5d71..f3bfa0e95 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 db5787cc6..30379256b 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 8015ed82e..a5337ac52 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 ad5855b56..7c9e15c08 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 6a0bbd52c..6e03d26c7 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 b48084821..512f85a3b 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 5e574086d..2437c21a2 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 15bce2c7c..2817e2a39 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 ec6477bd6..0635acab8 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 c1b9e7de6..ad899cd2c 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 b241a6179..28c3648bb 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 1842141a3..404015a6b 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 43e60799e..3c1363a1f 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 9b3aa2908..1c387a304 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 8d5808e51..1d87c2f00 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 f89a4c06b..dc98df29f 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 8afa83e02..db90fd8b7 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 40695d1e3..9d7c0cdfe 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 38cd0a1a6..9aa0acc87 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 ef5d8bfbe..ab4de2875 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 33023a862..9ea523510 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 9fcb70ba4..57dfe7050 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 10cacc571..c14d14bd1 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 21992934a..4f8dfde48 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 d7e5541b7..0d087ca16 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 9c6858b73..29a676749 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 6fdc7ad79..9ff15e640 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 aa730d6ab..91358cdfd 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 1b8e7e4c7..48c66be4e 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 2ff1bcd18..4be5b34c4 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 7123850c1..e6b572e09 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 9cb8eaf5d..d4d9504db 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 93c97616b..19474b6c4 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 1822f310a..fd2e68532 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 4d7ea0023..698c93b76 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 7f2533ac2..ebbd64c4a 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 32a0a4839..94b63bcad 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 412021ad2..1fa7801e6 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 4c57edd72..66718a9ea 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 2d8628574..4bd3202fd 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 0563450f3..519d04998 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 e8a6c6906..b5cc945fc 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 4c427295a..0d451daec 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 4855bf7ee..3edc54fdb 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 db89c4285..70fea4c93 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 ad10706f5..6fab0c332 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 644f705fa..2b9c53450 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 d4bab373e..410e03d59 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 55b457067..ad6ca0ddb 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 8a927ead6..98c66b737 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 3bb6d12b3..3a1cccd1d 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 ba918bf29..04a4fc5b9 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 8d68110da..d3571be89 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 71974a410..fdb60d00d 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 6792b29af..dc49d49b5 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 d3d5be3ae..78eb084d1 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 40279083d..941b95c28 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 78ebfa01d..a6e94c133 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 874745483..940414cc4 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 853e3d346..08f100400 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 65e2f3d33..9d7fe94ab 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 af98d9faa..af5257fa6 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 e3156b9f5..23a6b1d22 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 dd3bfa7a3..55a481ed2 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 6771f1313..e76959df4 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 075611e1f..ff7f31365 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 6080659e1..b57daf7ce 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 e15a7514c..6fe462fe8 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 40f6de975..1066b7f53 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 abfb6182b..e6d21c933 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 ec945b2b9..2ef23e9a9 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 8de29250d..5546024d0 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 0878a3f0c..a439a9d43 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 de6a9fb36..2a90bd26b 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 f0961ba0d..8a2654284 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 253c14560..676288ee0 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 59d08dfae..568a7fc17 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 7e74b504c..9cb756013 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 1fdf5bbeb..f9a465a27 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 40b86b66b..ac089db90 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 5a4e970d3..ca5fa42e7 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 c4cf933a3..5b0287302 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 aa5233d11..703ab3c98 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 241773ac6..4962f5e3e 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 72c7efba3..ef044ba8f 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 4cc8df331..4b62fc9ab 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 dbc79f2fd..1dffa08b4 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 0d62c8fc6..72c371f65 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 bcc6827d7..427d34195 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 dc0d2d1f1..b609d52dc 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 99ee6c130..8c012cc94 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 e996f3b7c..0293c58d1 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 e998fb621..535f3245c 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 b792b5345..2668756b8 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 bd84b35b7..54380dea8 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 42faeabcd..8027f1ecf 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 38d9aab20..474f3a163 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 78c677a91..a7d4a633a 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 28aebdf2a..e1b9ced84 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 e2d03f464..da9f93413 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 7ddb5ec3f..b9fa38e75 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 6d1c5d20a..4bd362e90 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 95f487dc2..e692b6470 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 5a24ce614..d14ae4b50 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 c9efe8a4d..edb2e43d8 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 9284ee5aa..80438b7b0 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 2bd3c86d5..2ac9bd546 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 7a30eb3eb..ff54ca15b 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 da2111a93..0c9582151 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 bcbd2c54d..8137cc4b0 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 b074e3ec1..3399e8e4d 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 a0f7c4ec6..d50cbbb33 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 f3fa81aa9..e3092696c 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 1bce302d9..f7b111950 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 0d58098b9..91b1952d9 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 4bb4af7af..7c97ec321 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 c0841a9f5..9222ba74d 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 340a52828..01cc3a560 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 9889c0407..8bacb7b38 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 98951f19f..16aa65034 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 44307ceb8..cdbfbf68f 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 411df7b97..5014eada6 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 1a6734937..34f32dcd5 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 67f4bad85..65f2c6aae 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 a3baede47..c7981bdf7 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 1057b54c6..cce594855 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 81db54f81..dba6888dc 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 80e66a0b4..fce701969 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 a470fb871..1821f4ad8 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 0e9af3f6e..1cda8b7e7 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 a1580adb3..50b6af68a 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 2f6f0e674..a51d2f1df 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 b32d3aaf8..f4c8bd8dd 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 d093c3b2e..1e87560ad 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 eb2dde2bb..45f614237 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 1d8793a63..4b34d2273 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 cd35ccec2..b6548e1a2 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 0481699ab..6e0f4883e 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 9013ffc66..4268dcef3 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 f81436b7e..2a384d8a6 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 8f07a5656..27d2f4a50 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 bec976801..5ae463e05 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 4af65a8d2..018e9e46f 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 e19fb4afa..47b9376dc 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 655db8721..5e9d2b35f 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 eee18c497..05270deba 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 36bd0c0ae..3d39dceb7 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 a5012b39b..0554d866b 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 9f4e576e2..ec7388cce 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 a347fd064..5dbe4a5f0 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 6a9964c79..e3d767fde 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 360f4e534..89a5b97ca 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 2ed700224..289d9d2cb 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 129ed18c7..526e8b1fa 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 bb3335959..11833bcab 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 000000000..e1b24815a --- /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 139f6ca4c..e62ea06c2 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 f69ce32c4..0252d4835 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 4a01cb6ec..59a425981 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