Skip to content

Commit 221798a

Browse files
authored
installRPC function in ktor client and RPC plugin in ktor server automatically add WebSockets plugin (#55)
1 parent 13b3968 commit 221798a

File tree

6 files changed

+25
-20
lines changed

6 files changed

+25
-20
lines changed

GETTING_STARTED.md

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,7 @@ To do that, the following DSL can be used:
735735

736736
```kotlin
737737
val ktorClient = HttpClient {
738-
install(RPC) { // this: RPCConfigBuilder.Client
738+
installRPC { // this: RPCConfigBuilder.Client
739739
waitForServices = true
740740
}
741741
}
@@ -795,9 +795,7 @@ interface ImageService : RPC {
795795
// ### CLIENT CODE ###
796796

797797
val client = HttpClient {
798-
install(WebSockets)
799-
800-
install(kotlinx.rpc.transport.ktor.client.RPC) {
798+
installRPC {
801799
serialization {
802800
json()
803801
}
@@ -822,10 +820,8 @@ class ImageServiceImpl(override val coroutineContext: CoroutineContext) : ImageS
822820
}
823821

824822
fun main() {
825-
embeddedServer(Netty, port = 8080) {
826-
install(WebSockets)
827-
828-
install(kotlinx.rpc.transport.ktor.server.RPC) {
823+
embeddedServer(Netty, port = 8080) {
824+
install(RPC) {
829825
serialization {
830826
json()
831827
}

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ fun main() {
5959
```
6060
To connect to the server use the following [Ktor Client](https://ktor.io/docs/create-client.html) setup:
6161
```kotlin
62-
val rpcClient = HttpClient { install(RPC) }.rpc {
62+
val rpcClient = HttpClient { installRPC() }.rpc {
6363
url("ws://localhost:8080/awesome")
6464

6565
rpcConfig {

transport/transport-ktor/src/jvmTest/kotlin/kotlinx/rpc/transport/ktor/KtorTransportTest.kt

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@ import io.ktor.server.application.*
1111
import io.ktor.server.engine.*
1212
import io.ktor.server.netty.*
1313
import io.ktor.server.routing.*
14-
import io.ktor.server.websocket.*
1514
import kotlinx.coroutines.cancel
1615
import kotlinx.coroutines.runBlocking
1716
import kotlinx.rpc.RPC
1817
import kotlinx.rpc.client.withService
1918
import kotlinx.rpc.serialization.json
19+
import kotlinx.rpc.transport.ktor.client.installRPC
2020
import kotlinx.rpc.transport.ktor.client.rpc
2121
import kotlinx.rpc.transport.ktor.client.rpcConfig
2222
import kotlinx.rpc.transport.ktor.server.RPC
@@ -39,12 +39,7 @@ class KtorTransportTest {
3939
@Test
4040
fun testEcho() = runBlocking {
4141
val server = embeddedServer(Netty, port = 4242) {
42-
install(WebSockets)
43-
install(RPC) {
44-
serialization {
45-
json()
46-
}
47-
}
42+
install(RPC)
4843
routing {
4944
rpc("/rpc") {
5045
rpcConfig {
@@ -63,8 +58,7 @@ class KtorTransportTest {
6358
}.start()
6459

6560
val clientWithGlobalConfig = HttpClient {
66-
install(io.ktor.client.plugins.websocket.WebSockets)
67-
install(kotlinx.rpc.transport.ktor.client.RPC) {
61+
installRPC {
6862
serialization {
6963
json()
7064
}
@@ -83,8 +77,7 @@ class KtorTransportTest {
8377
clientWithGlobalConfig.cancel()
8478

8579
val clientWithNoConfig = HttpClient {
86-
install(io.ktor.client.plugins.websocket.WebSockets)
87-
install(kotlinx.rpc.transport.ktor.client.RPC)
80+
installRPC()
8881
}
8982

9083
val serviceWithLocalConfig = clientWithNoConfig.rpc("ws://localhost:4242/rpc") {

transport/transport-ktor/transport-ktor-client/api/kotlinx-rpc-transport-ktor-client.api

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,7 @@ public final class kotlinx/rpc/transport/ktor/client/KtorClientDslKt {
99

1010
public final class kotlinx/rpc/transport/ktor/client/RPCKt {
1111
public static final fun getRPC ()Lio/ktor/client/plugins/api/ClientPlugin;
12+
public static final fun installRPC (Lio/ktor/client/HttpClientConfig;Lkotlin/jvm/functions/Function1;)V
13+
public static synthetic fun installRPC$default (Lio/ktor/client/HttpClientConfig;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
1214
}
1315

transport/transport-ktor/transport-ktor-client/src/commonMain/kotlin/kotlinx/rpc/transport/ktor/client/RPC.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
package kotlinx.rpc.transport.ktor.client
66

7+
import io.ktor.client.*
78
import io.ktor.client.plugins.api.*
9+
import io.ktor.client.plugins.websocket.*
810
import io.ktor.util.*
911
import kotlinx.rpc.RPCConfigBuilder
1012

@@ -16,3 +18,13 @@ internal val RPCClientPluginAttributesKey = AttributeKey<RPCConfigBuilder.Client
1618
public val RPC: ClientPlugin<RPCConfigBuilder.Client> = createClientPlugin("RPC", { RPCConfigBuilder.Client() }) {
1719
client.attributes.put(RPCClientPluginAttributesKey, pluginConfig)
1820
}
21+
22+
/**
23+
* Installs [WebSockets] and [RPC] client plugins
24+
*/
25+
public fun HttpClientConfig<*>.installRPC(
26+
configure: RPCConfigBuilder.Client.() -> Unit = {}
27+
) {
28+
install(WebSockets)
29+
install(RPC, configure)
30+
}

transport/transport-ktor/transport-ktor-server/src/jvmMain/kotlin/kotlinx/rpc/transport/ktor/server/RPC.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package kotlinx.rpc.transport.ktor.server
66

77
import io.ktor.server.application.*
8+
import io.ktor.server.websocket.*
89
import io.ktor.util.*
910
import kotlinx.rpc.RPCConfigBuilder
1011

@@ -17,5 +18,6 @@ public val RPC: ApplicationPlugin<RPCConfigBuilder.Server> = createApplicationPl
1718
name = "RPC",
1819
createConfiguration = { RPCConfigBuilder.Server() },
1920
) {
21+
application.install(WebSockets)
2022
application.attributes.put(RPCServerPluginAttributesKey, pluginConfig)
2123
}

0 commit comments

Comments
 (0)