Files
wehub-resource-sync 3a28426bf4
Lint and Format Check / lint-and-format (push) Failing after 0s
Check Migrations / Check for duplicate migration numbers (push) Failing after 1s
CI Pre-merge Check / CI Pre-merge Check (push) Failing after 2m17s
chore: import upstream snapshot with attribution
2026-07-13 12:23:40 +08:00

172 lines
3.9 KiB
Plaintext

---
title: Kotlin realtime SDK reference
description: Connect over Socket.IO, subscribe to channels, publish events, track presence, and handle reconnects with the InsForge Kotlin realtime client.
---
import KotlinSdkInstallation from '/snippets/kotlin-sdk-installation.mdx';
## Installation
<KotlinSdkInstallation />
## Mental model
The Kotlin SDK connects to InsForge Realtime over Socket.IO. Subscribe to channel names such as `order:123` or `chat:room-1`, then listen for event names published to those channels.
Events are published by database triggers that call `realtime.publish(...)` or by clients that publish to a channel they have already joined. See [Realtime overview](/core-concepts/realtime/overview) for the channel and RLS model.
## Quick start
```kotlin
import dev.insforge.realtime.models.SocketMessage
client.realtime.connect()
val response = client.realtime.subscribe("order:$orderId")
if (!response.ok) {
println("Subscribe failed: ${response.error?.message}")
return
}
client.realtime.on<SocketMessage>("status_changed") { message ->
message?.let {
println("Status changed: ${it.payload}")
}
}
```
## connect()
Establish a realtime connection.
```kotlin
client.realtime.connect()
println("Connected: ${client.realtime.isConnected}")
println("Socket ID: ${client.realtime.socketId}")
```
Monitor connection state:
```kotlin
client.realtime.connectionState.collect { state ->
when (state) {
is Realtime.ConnectionState.Connected -> println("Connected")
is Realtime.ConnectionState.Connecting -> println("Connecting")
is Realtime.ConnectionState.Disconnected -> println("Disconnected")
is Realtime.ConnectionState.Error -> println("Error: ${state.message}")
}
}
```
## subscribe()
Subscribe to a channel and receive the current presence snapshot.
```kotlin
val response = client.realtime.subscribe("chat:room-1")
if (response.ok) {
println("Subscribed to: ${response.channel}")
println("Members: ${response.presence?.members}")
} else {
println("Error: ${response.error?.message}")
}
```
## publish()
Publish an event to a channel.
```kotlin
client.realtime.publish(
channel = "chat:room-1",
event = "new_message",
payload = mapOf(
"text" to "Hello from Kotlin",
"sentAt" to System.currentTimeMillis()
)
)
```
<Note>
The client must subscribe to a channel before publishing to that same channel.
</Note>
If RLS is enabled on `realtime.messages`, publish is also checked against `INSERT` policies.
## on()
Register an event listener.
```kotlin
client.realtime.on<SocketMessage>("new_message") { message ->
message?.let {
println("Message: ${it.payload}")
}
}
```
Connection and system events:
| Event | Description |
|-------|-------------|
| `presence:join` | A logical member became present in the channel. |
| `presence:leave` | A logical member is no longer present in the channel. |
| `realtime:error` | Subscribe or publish failed. |
## once()
Listen for an event once.
```kotlin
client.realtime.once<SocketMessage>("checkout_completed") { message ->
println("Checkout completed: ${message?.payload}")
}
```
## off()
Remove an event listener.
```kotlin
val callback = Realtime.EventCallback<SocketMessage> { message ->
println("Event received: $message")
}
client.realtime.on("status_changed", callback)
client.realtime.off("status_changed", callback)
```
## unsubscribe()
Leave a channel.
```kotlin
client.realtime.unsubscribe("chat:room-1")
```
## disconnect()
Close the realtime connection.
```kotlin
client.realtime.disconnect()
```
## getSubscribedChannels()
Return locally subscribed channels.
```kotlin
val channels = client.realtime.getSubscribedChannels()
println(channels)
```
## Presence
Successful subscriptions return a presence snapshot. Listen for `presence:join` and `presence:leave` to update local online state.
Presence is ephemeral. It is not a durable room membership table.