Skip to content

Commit b96cf74

Browse files
Implement websocket keepalive
1 parent 2d56d8b commit b96cf74

File tree

3 files changed

+18
-18
lines changed

3 files changed

+18
-18
lines changed

xconn/src/main/kotlin/io/xconn/xconn/Client.kt

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
11
package io.xconn.xconn
22

3-
import io.xconn.wampproto.auth.AnonymousAuthenticator
4-
import io.xconn.wampproto.auth.ClientAuthenticator
5-
import io.xconn.wampproto.serializers.JSONSerializer
6-
import io.xconn.wampproto.serializers.Serializer
7-
83
class Client(
9-
private var authenticator: ClientAuthenticator = AnonymousAuthenticator(""),
10-
private var serializer: Serializer = JSONSerializer(),
4+
private var config: ClientConfig,
115
) {
126
suspend fun connect(url: String, realm: String): Session {
13-
val joiner = WAMPSessionJoiner(authenticator, serializer)
7+
val joiner = WAMPSessionJoiner(config)
148
val baseSession: BaseSession = joiner.join(url, realm)
159

1610
return Session(baseSession)

xconn/src/main/kotlin/io/xconn/xconn/Types.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ package io.xconn.xconn
33
import io.ktor.client.plugins.websocket.DefaultClientWebSocketSession
44
import io.ktor.websocket.close
55
import io.xconn.wampproto.SessionDetails
6+
import io.xconn.wampproto.auth.AnonymousAuthenticator
7+
import io.xconn.wampproto.auth.ClientAuthenticator
68
import io.xconn.wampproto.messages.Message
9+
import io.xconn.wampproto.serializers.JSONSerializer
710
import io.xconn.wampproto.serializers.Serializer
811
import kotlinx.coroutines.CompletableDeferred
912

@@ -118,3 +121,9 @@ data class UnsubscribeRequest(
118121
val completable: CompletableDeferred<Unit>,
119122
val subscriptionID: Long,
120123
)
124+
125+
data class ClientConfig(
126+
var authenticator: ClientAuthenticator = AnonymousAuthenticator(""),
127+
var serializer: Serializer = JSONSerializer(),
128+
val keepAliveInterval: Long = 0,
129+
)

xconn/src/main/kotlin/io/xconn/xconn/WAMPSessionJoiner.kt

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,27 @@ import io.ktor.websocket.Frame
1111
import io.ktor.websocket.readBytes
1212
import io.ktor.websocket.readText
1313
import io.xconn.wampproto.Joiner
14-
import io.xconn.wampproto.auth.AnonymousAuthenticator
15-
import io.xconn.wampproto.auth.ClientAuthenticator
16-
import io.xconn.wampproto.serializers.JSONSerializer
17-
import io.xconn.wampproto.serializers.Serializer
1814
import kotlinx.coroutines.CompletableDeferred
1915
import kotlinx.coroutines.async
2016
import kotlinx.coroutines.coroutineScope
2117

2218
class WAMPSessionJoiner(
23-
private val authenticator: ClientAuthenticator = AnonymousAuthenticator(""),
24-
private val serializer: Serializer = JSONSerializer(),
19+
private val config: ClientConfig,
2520
) {
26-
private val subProtocol = getSubProtocol(serializer)
21+
private val subProtocol = getSubProtocol(config.serializer)
2722
private val client =
2823
HttpClient(CIO) {
29-
install(WebSockets)
24+
install(WebSockets) {
25+
pingInterval = config.keepAliveInterval
26+
}
3027
defaultRequest {
3128
header("Sec-WebSocket-Protocol", subProtocol)
3229
}
3330
}
3431

3532
suspend fun join(url: String, realm: String): BaseSession {
3633
val welcomeCompleter = CompletableDeferred<BaseSession>()
37-
val joiner = Joiner(realm, serializer, authenticator)
34+
val joiner = Joiner(realm, config.serializer, config.authenticator)
3835

3936
val session = client.webSocketSession(url)
4037

@@ -51,7 +48,7 @@ class WAMPSessionJoiner(
5148

5249
if (toSend == null) {
5350
// Complete handshake and session creation
54-
welcomeCompleter.complete(BaseSession(session, joiner.getSessionDetails(), serializer))
51+
welcomeCompleter.complete(BaseSession(session, joiner.getSessionDetails(), config.serializer))
5552
break
5653
} else {
5754
session.sendFrame(toSend)

0 commit comments

Comments
 (0)