Skip to content

Commit b338fd2

Browse files
committed
Add support for Realtime Protocol V2
1 parent bf70390 commit b338fd2

6 files changed

Lines changed: 35 additions & 7 deletions

File tree

Realtime/src/commonMain/kotlin/io/github/jan/supabase/realtime/Realtime.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ interface Realtime : MainPlugin<Realtime.Config>, CustomSerializationPlugin {
146146
var connectOnSubscribe: Boolean = true
147147
@SupabaseInternal var websocketFactory: RealtimeWebsocketFactory? = null
148148
var disconnectOnNoSubscriptions: Boolean = true
149+
var vsn = RealtimeProtocolVersion.V2
149150
override var requireValidSession: Boolean = false
150151

151152
internal var customAccessTokenProvider = false

Realtime/src/commonMain/kotlin/io/github/jan/supabase/realtime/RealtimeImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ import kotlin.time.Duration
308308
private fun realtimeWebsocketUrl(): String {
309309
return buildUrl(realtimeBaseUrl()) {
310310
parameters["apikey"] = supabaseClient.supabaseKey
311-
parameters["vsn"] = "1.0.0"
311+
parameters["vsn"] = config.vsn.value
312312
pathSegments += listOf("websocket")
313313
}
314314
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.github.jan.supabase.realtime
2+
3+
/**
4+
* Phoenix protocol version used for WebSocket communication.
5+
*/
6+
enum class RealtimeProtocolVersion(val value: String) {
7+
/**
8+
* Protocol 1.0.0 — JSON object text frames for all messages.
9+
*/
10+
V1("1.0.0"),
11+
/**
12+
* Protocol 2.0.0 — JSON array text frames for non-broadcast messages,
13+
* binary frames for broadcast messages
14+
*/
15+
V2("2.0.0")
16+
}

Realtime/src/commonMain/kotlin/io/github/jan/supabase/realtime/websocket/KtorRealtimeWebsocket.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package io.github.jan.supabase.realtime.websocket
22

33
import io.github.jan.supabase.realtime.RealtimeMessage
4+
import io.github.jan.supabase.realtime.RealtimeProtocolVersion
45
import io.ktor.client.plugins.websocket.DefaultClientWebSocketSession
5-
import io.ktor.client.plugins.websocket.receiveDeserialized
66
import io.ktor.client.plugins.websocket.sendSerialized
77
import kotlinx.coroutines.cancel
88
import kotlinx.coroutines.isActive
@@ -12,15 +12,17 @@ import kotlinx.coroutines.job
1212
* Implementation of [RealtimeWebsocket] using Ktor's [DefaultClientWebSocketSession].
1313
*/
1414
class KtorRealtimeWebsocket(
15-
private val ws: DefaultClientWebSocketSession
15+
private val ws: DefaultClientWebSocketSession,
16+
val vsn: RealtimeProtocolVersion
1617
): RealtimeWebsocket {
1718

1819
override val hasIncomingMessages: Boolean get() = ws.isActive
1920

20-
override suspend fun receive(): RealtimeMessage {
21-
return ws.receiveDeserialized()
21+
override suspend fun receive(): RealtimeFrame {
22+
TODO("")
2223
}
2324

25+
2426
override suspend fun send(message: RealtimeMessage) {
2527
ws.sendSerialized(message)
2628
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package io.github.jan.supabase.realtime.websocket
2+
3+
sealed interface RealtimeFrame {
4+
5+
class Binary(val data: ByteArray)
6+
7+
data class Text(val text: String)
8+
9+
}

Realtime/src/commonMain/kotlin/io/github/jan/supabase/realtime/websocket/RealtimeWebsocket.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ interface RealtimeWebsocket {
1616
val hasIncomingMessages: Boolean
1717

1818
/**
19-
* Receive a message from the websocket.
19+
* Receive a frame from the websocket.
2020
*/
21-
suspend fun receive(): RealtimeMessage
21+
suspend fun receive(): RealtimeFrame
2222

2323
/**
2424
* Send a message to the websocket.

0 commit comments

Comments
 (0)