diff --git a/Realtime/src/commonMain/kotlin/io/github/jan/supabase/realtime/RealtimeChannelImpl.kt b/Realtime/src/commonMain/kotlin/io/github/jan/supabase/realtime/RealtimeChannelImpl.kt index 40f49217..e29c3a85 100644 --- a/Realtime/src/commonMain/kotlin/io/github/jan/supabase/realtime/RealtimeChannelImpl.kt +++ b/Realtime/src/commonMain/kotlin/io/github/jan/supabase/realtime/RealtimeChannelImpl.kt @@ -50,11 +50,15 @@ internal class RealtimeChannelImpl( private val broadcastUrl = realtimeImpl.broadcastUrl() private val subTopic = topic.replaceFirst(Regex("^${RealtimeTopic.PREFIX}:", RegexOption.IGNORE_CASE), "") private val httpClient = realtimeImpl.supabaseClient.httpClient + private val userPresenceEnabled = presenceJoinConfig.enabled internal val joinAttempt = AtomicInt(0) private suspend fun accessToken() = realtimeImpl.config.accessToken(supabaseClient) ?: realtimeImpl.accessToken + private fun shouldEnablePresence(): Boolean = + userPresenceEnabled || callbackManager.hasPresenceCallback() + @OptIn(SupabaseInternal::class) override suspend fun subscribe(blockUntilSubscribed: Boolean) { if(realtimeImpl.status.value != Realtime.Status.CONNECTED) { @@ -68,8 +72,7 @@ internal class RealtimeChannelImpl( Realtime.logger.d { "Subscribing to channel $topic" } val currentJwt = accessToken() val postgrestChanges = clientChanges.toList() - val hasPresenceCallback = callbackManager.hasPresenceCallback() - presenceJoinConfig.enabled = hasPresenceCallback + presenceJoinConfig.enabled = shouldEnablePresence() val joinConfig = RealtimeJoinPayload(RealtimeJoinConfig(broadcastJoinConfig, presenceJoinConfig, postgrestChanges, isPrivate)) val joinConfigObject = buildJsonObject { putJsonObject(Json.encodeToJsonElement(joinConfig).jsonObject) @@ -232,17 +235,14 @@ internal class RealtimeChannelImpl( } val id = callbackManager.addPresenceCallback(callback) if(status.value == RealtimeChannel.Status.SUBSCRIBED && !presenceJoinConfig.enabled) { - // If the channel is already subscribed, we need to resubscribe to enable presence Realtime.logger.d { "Resubscribing to channel $topic to enable presence..." } - launch { - resubscribe() - } + resubscribe() } awaitClose { callbackManager.removeCallbackById(id) } } override fun updateStatus(status: RealtimeChannel.Status) { - if(this.status.value == RealtimeChannel.Status.SUBSCRIBED) { + if(status == RealtimeChannel.Status.SUBSCRIBED) { joinAttempt.store(0) } _status.value = status diff --git a/Realtime/src/commonMain/kotlin/io/github/jan/supabase/realtime/RealtimeJoinPayload.kt b/Realtime/src/commonMain/kotlin/io/github/jan/supabase/realtime/RealtimeJoinPayload.kt index 20037fa8..5af1b301 100644 --- a/Realtime/src/commonMain/kotlin/io/github/jan/supabase/realtime/RealtimeJoinPayload.kt +++ b/Realtime/src/commonMain/kotlin/io/github/jan/supabase/realtime/RealtimeJoinPayload.kt @@ -1,6 +1,10 @@ +@file:OptIn(kotlinx.serialization.ExperimentalSerializationApi::class) + package io.github.jan.supabase.realtime import io.github.jan.supabase.annotations.SupabaseInternal +import kotlinx.serialization.EncodeDefault +import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -33,7 +37,11 @@ data class BroadcastJoinConfig(@SerialName("ack") var acknowledgeBroadcasts: Boo * @param enabled Whether presence is enabled for this channel */ @Serializable -data class PresenceJoinConfig(var key: String, internal var enabled: Boolean) +data class PresenceJoinConfig( + var key: String, + @EncodeDefault + internal var enabled: Boolean = false +) @SupabaseInternal @Serializable