diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 624edb63d..9512af1e1 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -175,6 +175,7 @@ import com.vitorpamplona.quartz.nip53LiveActivities.chat.LiveActivitiesChatMessa import com.vitorpamplona.quartz.nip53LiveActivities.clip.LiveActivitiesClipEvent import com.vitorpamplona.quartz.nip53LiveActivities.meetingSpaces.MeetingRoomEvent import com.vitorpamplona.quartz.nip53LiveActivities.meetingSpaces.MeetingSpaceEvent +import com.vitorpamplona.quartz.nip53LiveActivities.nestsServers.NestsServersEvent import com.vitorpamplona.quartz.nip53LiveActivities.presence.MeetingRoomPresenceEvent import com.vitorpamplona.quartz.nip53LiveActivities.raid.LiveActivitiesRaidEvent import com.vitorpamplona.quartz.nip53LiveActivities.streaming.LiveActivitiesEvent @@ -2737,7 +2738,7 @@ object LocalCache : ILocalCache, ICacheProvider { consumeBaseReplaceable(event, relay, wasVerified) } - is com.vitorpamplona.quartz.nip53LiveActivities.nestsServers.NestsServersEvent -> { + is NestsServersEvent -> { consumeBaseReplaceable(event, relay, wasVerified) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip53NestsServers/NestsServerListState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip53NestsServers/NestsServerListState.kt index af5cdd635..cd2a5d190 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip53NestsServers/NestsServerListState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/nip53NestsServers/NestsServerListState.kt @@ -23,6 +23,7 @@ package com.vitorpamplona.amethyst.model.nip53NestsServers import com.vitorpamplona.amethyst.commons.model.cache.ICacheProvider import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.NoteState +import com.vitorpamplona.amethyst.model.nipB7Blossom.BlossomServerListState import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import com.vitorpamplona.quartz.nip53LiveActivities.nestsServers.NestsServersEvent import kotlinx.coroutines.CoroutineScope @@ -36,8 +37,7 @@ import kotlinx.coroutines.flow.stateIn /** * Per-account state for the user's preferred audio-room (NIP-53 / nests) * MoQ host servers — kind 10112 [NestsServersEvent]. Mirror of - * [com.vitorpamplona.amethyst.model.nipB7Blossom.BlossomServerListState] - * for the nests use case. + * [BlossomServerListState] for the nests use case. * * Surfaces: * - [flow] — current `List` of saved server base URLs @@ -46,10 +46,9 @@ import kotlinx.coroutines.flow.stateIn * - [saveNestsServersList] — build + sign a new replaceable kind 10112 * event (preserving prior tags' alt etc.) * - * The list is consumed by [com.vitorpamplona.amethyst.ui.screen.loggedIn.audiorooms.create.CreateAudioRoomViewModel] - * to default the "MoQ service URL" / "MoQ endpoint URL" fields when - * starting a new space, and by the Settings screen for edit / add / - * remove. + * The list is consumed by `CreateAudioRoomViewModel` to default the + * "MoQ service URL" / "MoQ endpoint URL" fields when starting a new + * space, and by the Settings screen for edit / add / remove. */ class NestsServerListState( val signer: NostrSigner, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/FilterAccountInfoAndListsFromKey.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/FilterAccountInfoAndListsFromKey.kt index 38addb9f7..75a315266 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/FilterAccountInfoAndListsFromKey.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/FilterAccountInfoAndListsFromKey.kt @@ -41,6 +41,7 @@ import com.vitorpamplona.quartz.nip51Lists.relayLists.IndexerRelayListEvent import com.vitorpamplona.quartz.nip51Lists.relayLists.ProxyRelayListEvent import com.vitorpamplona.quartz.nip51Lists.relayLists.RelayFeedsListEvent import com.vitorpamplona.quartz.nip51Lists.relayLists.TrustedRelayListEvent +import com.vitorpamplona.quartz.nip53LiveActivities.nestsServers.NestsServersEvent import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent import com.vitorpamplona.quartz.nip78AppData.AppSpecificDataEvent import com.vitorpamplona.quartz.nip85TrustedAssertions.list.TrustProviderListEvent @@ -58,7 +59,7 @@ val AccountInfoAndListsFromKeyKinds = SearchRelayListEvent.KIND, FileServersEvent.KIND, BlossomServersEvent.KIND, - com.vitorpamplona.quartz.nip53LiveActivities.nestsServers.NestsServersEvent.KIND, + NestsServersEvent.KIND, PrivateOutboxRelayListEvent.KIND, ) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/FilterBasicAccountInfoFromKeys.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/FilterBasicAccountInfoFromKeys.kt index a3434dbee..e0285ce5d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/FilterBasicAccountInfoFromKeys.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/relayClient/reqCommand/account/metadata/FilterBasicAccountInfoFromKeys.kt @@ -37,6 +37,7 @@ import com.vitorpamplona.quartz.nip51Lists.relayLists.IndexerRelayListEvent import com.vitorpamplona.quartz.nip51Lists.relayLists.ProxyRelayListEvent import com.vitorpamplona.quartz.nip51Lists.relayLists.RelayFeedsListEvent import com.vitorpamplona.quartz.nip51Lists.relayLists.TrustedRelayListEvent +import com.vitorpamplona.quartz.nip53LiveActivities.nestsServers.NestsServersEvent import com.vitorpamplona.quartz.nip65RelayList.AdvertisedRelayListEvent import com.vitorpamplona.quartz.nip85TrustedAssertions.list.TrustProviderListEvent import com.vitorpamplona.quartz.nip96FileStorage.config.FileServersEvent @@ -52,7 +53,7 @@ val BasicAccountInfoKinds = SearchRelayListEvent.KIND, FileServersEvent.KIND, BlossomServersEvent.KIND, - com.vitorpamplona.quartz.nip53LiveActivities.nestsServers.NestsServersEvent.KIND, + NestsServersEvent.KIND, ) val BasicAccountInfoKinds2 = diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/nestsServers/NestsServersScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/nestsServers/NestsServersScreen.kt index ad4380cea..576ea5ddc 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/nestsServers/NestsServersScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/nestsServers/NestsServersScreen.kt @@ -49,6 +49,7 @@ import androidx.lifecycle.viewmodel.compose.viewModel import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.commons.icons.symbols.Icon import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols +import com.vitorpamplona.amethyst.ui.actions.mediaServers.AllMediaServersScreen import com.vitorpamplona.amethyst.ui.actions.mediaServers.MediaServerEditField import com.vitorpamplona.amethyst.ui.navigation.navs.INav import com.vitorpamplona.amethyst.ui.navigation.topbars.SavingTopBar @@ -62,15 +63,16 @@ import com.vitorpamplona.amethyst.ui.theme.SettingsCategoryFirstModifier import com.vitorpamplona.amethyst.ui.theme.SettingsCategorySpacingModifier import com.vitorpamplona.amethyst.ui.theme.StdVertSpacer import com.vitorpamplona.amethyst.ui.theme.grayText +import com.vitorpamplona.quartz.nip53LiveActivities.nestsServers.NestsServersEvent /** * Settings screen for the user's preferred audio-room (NIP-53 / nests) - * MoQ host servers — kind 10112 [com.vitorpamplona.quartz.nip53LiveActivities.nestsServers.NestsServersEvent]. + * MoQ host servers — kind 10112 [NestsServersEvent]. * - * Mirrors [com.vitorpamplona.amethyst.ui.actions.mediaServers.AllMediaServersScreen] - * — top bar with Cancel / Save, list of saved servers with delete - * buttons, edit-field row to add a new one, and a "Use defaults" row - * for one-tap inclusion of `nostrnests.com`. + * Mirrors [AllMediaServersScreen] — top bar with Cancel / Save, list + * of saved servers with delete buttons, edit-field row to add a new + * one, and a "Use defaults" row for one-tap inclusion of + * `nostrnests.com`. * * Reachable from `Settings → Audio-room servers`. */ diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/nestsServers/NestsServersViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/nestsServers/NestsServersViewModel.kt index c4b6aed60..52f0d5ad8 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/nestsServers/NestsServersViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/nestsServers/NestsServersViewModel.kt @@ -23,7 +23,9 @@ package com.vitorpamplona.amethyst.ui.actions.nestsServers import androidx.compose.runtime.Stable import androidx.lifecycle.ViewModel import com.vitorpamplona.amethyst.model.Account +import com.vitorpamplona.amethyst.ui.actions.mediaServers.BlossomServersViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import com.vitorpamplona.quartz.nip53LiveActivities.nestsServers.NestsServersEvent import com.vitorpamplona.quartz.utils.Rfc3986 import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -31,10 +33,10 @@ import kotlinx.coroutines.flow.update /** * Edit-buffer for the user's audio-room (NIP-53 / nests) MoQ server - * list. Mirror of [com.vitorpamplona.amethyst.ui.actions.mediaServers.BlossomServersViewModel] - * scoped down to a plain `List` of base URLs since nests - * servers don't have a "selected default" concept (clients pick the - * first entry when starting a new space). + * list. Mirror of [BlossomServersViewModel] scoped down to a plain + * `List` of base URLs since nests servers don't have a + * "selected default" concept (clients pick the first entry when + * starting a new space). * * The flow: * 1. [init] binds the [AccountViewModel]. @@ -42,8 +44,8 @@ import kotlinx.coroutines.flow.update * [_servers] buffer. * 3. [addServer] / [removeServer] / [removeAllServers] mutate the * buffer, marking [isModified] = true. - * 4. [save] publishes a fresh kind-10112 [com.vitorpamplona.quartz.nip53LiveActivities.nestsServers.NestsServersEvent] - * via [Account.sendNestsServersList]. + * 4. [save] publishes a fresh kind-10112 [NestsServersEvent] via + * [Account.sendNestsServersList]. */ @Stable class NestsServersViewModel : ViewModel() { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/create/CreateAudioRoomSheet.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/create/CreateAudioRoomSheet.kt index 46da363bc..e860e43e9 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/create/CreateAudioRoomSheet.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/create/CreateAudioRoomSheet.kt @@ -52,6 +52,7 @@ import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import com.vitorpamplona.amethyst.ui.screen.loggedIn.audiorooms.AudioRoomsScreen import com.vitorpamplona.amethyst.ui.screen.loggedIn.audiorooms.room.AudioRoomActivity import com.vitorpamplona.amethyst.ui.screen.loggedIn.audiorooms.room.AudioRoomBridge import com.vitorpamplona.amethyst.ui.stringRes @@ -66,7 +67,7 @@ import kotlinx.coroutines.launch * Talk button enabled. * * Hidden by default; surfaced by the "Start space" FAB on - * [com.vitorpamplona.amethyst.ui.screen.loggedIn.audiorooms.AudioRoomsScreen]. + * [AudioRoomsScreen]. */ @OptIn(ExperimentalMaterial3Api::class) @Composable diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/create/CreateAudioRoomViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/create/CreateAudioRoomViewModel.kt index e3cd089c8..00edea43c 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/create/CreateAudioRoomViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/create/CreateAudioRoomViewModel.kt @@ -22,6 +22,7 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.audiorooms.create import androidx.lifecycle.ViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import com.vitorpamplona.amethyst.ui.screen.loggedIn.audiorooms.room.AudioRoomActivity import com.vitorpamplona.quartz.nip53LiveActivities.meetingSpaces.MeetingSpaceEvent import com.vitorpamplona.quartz.nip53LiveActivities.meetingSpaces.endpoint import com.vitorpamplona.quartz.nip53LiveActivities.meetingSpaces.image @@ -38,7 +39,7 @@ import kotlinx.coroutines.flow.update * Backing ViewModel for [CreateAudioRoomSheet]. Holds form state, runs * [publishAndBuildLaunchInfo] which signs and broadcasts a NIP-53 kind * 30312 [MeetingSpaceEvent] tagging the user as `host`, then returns - * the launch parameters for [com.vitorpamplona.amethyst.ui.screen.loggedIn.audiorooms.room.AudioRoomActivity]. + * the launch parameters for [AudioRoomActivity]. * * The defaults point at `nostrnests.com`'s public moq-rs deployment so a * blank form produces a working room. The user can edit them to point at diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/RelayInformationScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/RelayInformationScreen.kt index 667817545..1a916a519 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/RelayInformationScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/relays/RelayInformationScreen.kt @@ -200,6 +200,7 @@ import com.vitorpamplona.quartz.nip52Calendar.rsvp.CalendarRSVPEvent import com.vitorpamplona.quartz.nip53LiveActivities.chat.LiveActivitiesChatMessageEvent import com.vitorpamplona.quartz.nip53LiveActivities.meetingSpaces.MeetingRoomEvent import com.vitorpamplona.quartz.nip53LiveActivities.meetingSpaces.MeetingSpaceEvent +import com.vitorpamplona.quartz.nip53LiveActivities.nestsServers.NestsServersEvent import com.vitorpamplona.quartz.nip53LiveActivities.presence.MeetingRoomPresenceEvent import com.vitorpamplona.quartz.nip53LiveActivities.streaming.LiveActivitiesEvent import com.vitorpamplona.quartz.nip54Wiki.WikiNoteEvent @@ -543,7 +544,7 @@ fun kindDisplayName(kind: Int): Int = BadgeDefinitionEvent.KIND -> R.string.kind_badge_definitions BlockedRelayListEvent.KIND -> R.string.kind_blocked_relays BlossomServersEvent.KIND -> R.string.kind_blossom_servers - com.vitorpamplona.quartz.nip53LiveActivities.nestsServers.NestsServersEvent.KIND -> R.string.kind_nests_servers + NestsServersEvent.KIND -> R.string.kind_nests_servers BlossomAuthorizationEvent.KIND -> R.string.kind_blossom_auth BroadcastRelayListEvent.KIND -> R.string.kind_broadcast_relays BookmarkListEvent.KIND -> R.string.kind_bookmark_list diff --git a/nestsClient/src/commonMain/kotlin/com/vitorpamplona/nestsclient/NestsConnect.kt b/nestsClient/src/commonMain/kotlin/com/vitorpamplona/nestsclient/NestsConnect.kt index d2eccef33..c5155174b 100644 --- a/nestsClient/src/commonMain/kotlin/com/vitorpamplona/nestsclient/NestsConnect.kt +++ b/nestsClient/src/commonMain/kotlin/com/vitorpamplona/nestsclient/NestsConnect.kt @@ -23,8 +23,10 @@ package com.vitorpamplona.nestsclient import com.vitorpamplona.nestsclient.audio.AudioCapture import com.vitorpamplona.nestsclient.audio.OpusEncoder import com.vitorpamplona.nestsclient.moq.SubscribeHandle +import com.vitorpamplona.nestsclient.moq.lite.MoqLiteSession import com.vitorpamplona.nestsclient.transport.WebTransportException import com.vitorpamplona.nestsclient.transport.WebTransportFactory +import com.vitorpamplona.nestsclient.transport.WebTransportSession import com.vitorpamplona.quartz.nip01Core.signers.NostrSigner import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow @@ -35,14 +37,13 @@ import kotlinx.coroutines.flow.MutableStateFlow * * 1. Mint a JWT — POST `/auth` with NIP-98 + namespace body * (see [NestsClient.mintToken]). - * 2. Open a [com.vitorpamplona.nestsclient.transport.WebTransportSession] - * against the [room.endpoint] via [transport]. The path is - * `/?jwt=` — moq-rs treats the URL path as - * `claims.root` and reads the JWT from `?jwt=`. - * 3. Wrap the WT session in a [com.vitorpamplona.nestsclient.moq.lite.MoqLiteSession]. - * moq-lite Lite-03 has NO in-band SETUP message — the WT handshake - * itself is the handshake, version is selected by the ALPN - * `moq-lite-03`. + * 2. Open a [WebTransportSession] against the [room.endpoint] via + * [transport]. The path is `/?jwt=` — moq-rs + * treats the URL path as `claims.root` and reads the JWT from + * `?jwt=`. + * 3. Wrap the WT session in a [MoqLiteSession]. moq-lite Lite-03 has + * NO in-band SETUP message — the WT handshake itself is the + * handshake, version is selected by the ALPN `moq-lite-03`. * * The returned [NestsListener] is in state [NestsListenerState.Connected]; * if any step fails, the listener is returned in @@ -110,8 +111,7 @@ suspend fun connectNestsListener( // `moq-lite-03`. val moq = try { - com.vitorpamplona.nestsclient.moq.lite.MoqLiteSession - .client(webTransport, scope) + MoqLiteSession.client(webTransport, scope) } catch (t: Throwable) { runCatching { webTransport.close(0, "moq-lite session init failed") } state.value = NestsListenerState.Failed("moq-lite session init failed: ${t.message}", t) @@ -225,8 +225,7 @@ suspend fun connectNestsSpeaker( // path — version is selected by the `moq-lite-03` ALPN. val moq = try { - com.vitorpamplona.nestsclient.moq.lite.MoqLiteSession - .client(webTransport, scope) + MoqLiteSession.client(webTransport, scope) } catch (t: Throwable) { runCatching { webTransport.close(0, "moq-lite session init failed") } state.value = NestsSpeakerState.Failed("moq-lite session init failed: ${t.message}", t) diff --git a/nestsClient/src/commonMain/kotlin/com/vitorpamplona/nestsclient/NestsListener.kt b/nestsClient/src/commonMain/kotlin/com/vitorpamplona/nestsclient/NestsListener.kt index 1719f6e16..1c4221c8b 100644 --- a/nestsClient/src/commonMain/kotlin/com/vitorpamplona/nestsclient/NestsListener.kt +++ b/nestsClient/src/commonMain/kotlin/com/vitorpamplona/nestsclient/NestsListener.kt @@ -20,10 +20,12 @@ */ package com.vitorpamplona.nestsclient +import com.vitorpamplona.nestsclient.moq.MoqProtocolException import com.vitorpamplona.nestsclient.moq.MoqSession import com.vitorpamplona.nestsclient.moq.SubscribeFilter import com.vitorpamplona.nestsclient.moq.SubscribeHandle import com.vitorpamplona.nestsclient.moq.TrackNamespace +import com.vitorpamplona.nestsclient.transport.WebTransportSession import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -45,8 +47,7 @@ interface NestsListener { * Opus stream under the namespace `["nests", ]` with the * speaker's pubkey hex as the track name. * - * @throws com.vitorpamplona.nestsclient.moq.MoqProtocolException if the - * publisher rejects the subscription. + * @throws MoqProtocolException if the publisher rejects the subscription. * @throws IllegalStateException if the listener is not in [NestsListenerState.Connected]. */ suspend fun subscribeSpeaker(speakerPubkeyHex: String): SubscribeHandle @@ -107,8 +108,7 @@ sealed class NestsListenerState { * MoQ-transport target. * * Delegates to a [MoqSession] already set up on a - * [com.vitorpamplona.nestsclient.transport.WebTransportSession]; - * construction does NOT open the transport. + * [WebTransportSession]; construction does NOT open the transport. */ class DefaultNestsListener internal constructor( private val session: MoqSession, diff --git a/nestsClient/src/commonMain/kotlin/com/vitorpamplona/nestsclient/NestsSpeaker.kt b/nestsClient/src/commonMain/kotlin/com/vitorpamplona/nestsclient/NestsSpeaker.kt index ab0a42468..34acca471 100644 --- a/nestsClient/src/commonMain/kotlin/com/vitorpamplona/nestsclient/NestsSpeaker.kt +++ b/nestsClient/src/commonMain/kotlin/com/vitorpamplona/nestsclient/NestsSpeaker.kt @@ -23,6 +23,7 @@ package com.vitorpamplona.nestsclient import com.vitorpamplona.nestsclient.audio.AudioCapture import com.vitorpamplona.nestsclient.audio.AudioRoomBroadcaster import com.vitorpamplona.nestsclient.audio.OpusEncoder +import com.vitorpamplona.nestsclient.moq.MoqProtocolException import com.vitorpamplona.nestsclient.moq.MoqSession import com.vitorpamplona.nestsclient.moq.TrackNamespace import kotlinx.coroutines.CoroutineScope @@ -52,8 +53,7 @@ interface NestsSpeaker { * * @throws IllegalStateException if a broadcast is already running on * this speaker or the session is not [NestsSpeakerState.Connected]. - * @throws com.vitorpamplona.nestsclient.moq.MoqProtocolException if the - * peer rejects the ANNOUNCE. + * @throws MoqProtocolException if the peer rejects the ANNOUNCE. */ suspend fun startBroadcasting(): BroadcastHandle