Skip to content

Commit 2a794e9

Browse files
authored
feat (#3): better router builders
* feat: better router builders * Optimized emptyRSocket builder
1 parent 30b375f commit 2a794e9

File tree

4 files changed

+33
-22
lines changed

4 files changed

+33
-22
lines changed

router-core/src/commonMain/kotlin/com.y9vad9.rsocket.router/Router.kt

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
package com.y9vad9.rsocket.router
22

33
import io.ktor.utils.io.core.*
4-
import io.rsocket.kotlin.RSocketError
5-
import io.rsocket.kotlin.RSocketRequestHandlerBuilder
64
import com.y9vad9.rsocket.router.annotations.ExperimentalRouterApi
75
import com.y9vad9.rsocket.router.annotations.InternalRouterApi
86
import com.y9vad9.rsocket.router.annotations.RouterDsl
97
import com.y9vad9.rsocket.router.builders.RouterBuilder
108
import com.y9vad9.rsocket.router.interceptors.Preprocessor
119
import com.y9vad9.rsocket.router.interceptors.RouteInterceptor
10+
import io.rsocket.kotlin.*
1211

1312
/**
1413
* The RSocket router with all registered routes, configurations, preprocessors
@@ -49,32 +48,49 @@ public sealed interface Router {
4948

5049
// -- builders --
5150

52-
@OptIn(ExperimentalRouterApi::class, InternalRouterApi::class)
5351
@RouterDsl
54-
public fun RSocketRequestHandlerBuilder.router(builder: RouterBuilder.() -> Unit): Router {
55-
val router = RouterBuilder().apply(builder).build()
52+
public fun RSocketRequestHandlerBuilder.router(block: RouterBuilder.() -> Unit): Router {
53+
return router(builder = block).also { router -> router.installOn(this) }
54+
}
55+
56+
@OptIn(InternalRouterApi::class)
57+
public fun router(builder: RouterBuilder.() -> Unit): Router = RouterBuilder().apply(builder).build()
5658

59+
/**
60+
* Applies [Router] to given [RSocketRequestHandlerBuilder]. All registered routes are listened.
61+
*
62+
* **Implementation note**: As [Router] does not provide `metadataPush` feature, this function is especially
63+
* useful if you want to additionally provide it for your [RSocket] instance.
64+
*/
65+
@OptIn(ExperimentalRouterApi::class, InternalRouterApi::class)
66+
public fun Router.installOn(handlerBuilder: RSocketRequestHandlerBuilder): Unit = with(handlerBuilder) {
5767
requestResponse { payload ->
58-
router.routeAtOrFail(router.getRoutePathFromMetadata(payload.metadata))
68+
routeAtOrFail(getRoutePathFromMetadata(payload.metadata))
5969
.requestResponseOrThrow(this, payload)
6070
}
6171

6272
requestStream { payload ->
63-
router.routeAtOrFail(router.getRoutePathFromMetadata(payload.metadata))
73+
routeAtOrFail(getRoutePathFromMetadata(payload.metadata))
6474
.requestStreamOrThrow(this, payload)
6575
}
6676

6777
requestChannel { initPayload, payloads ->
68-
router.routeAtOrFail(router.getRoutePathFromMetadata(initPayload.metadata))
78+
routeAtOrFail(getRoutePathFromMetadata(initPayload.metadata))
6979
.requestChannelOrThrow(this, initPayload, payloads)
7080
}
7181

7282
fireAndForget { payload ->
73-
router.routeAtOrFail(router.getRoutePathFromMetadata(payload.metadata))
83+
routeAtOrFail(getRoutePathFromMetadata(payload.metadata))
7484
.fireAndForgetOrThrow(this, payload)
7585
}
86+
}
7687

77-
return router
88+
89+
@Suppress("UnusedReceiverParameter")
90+
public fun ConnectionAcceptor.installRouter(router: Router): RSocket {
91+
return RSocketRequestHandler {
92+
router.installOn(this)
93+
}
7894
}
7995

8096

router-test/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ deployLibrary {
2828
password = System.getenv("SSH_PASSWORD")
2929
deployPath = System.getenv("SSH_DEPLOY_PATH")
3030

31-
group = "com.y9vad9.rsocket.router.test"
31+
group = "com.y9vad9.rsocket.router"
3232
componentName = "kotlin"
3333
artifactId = "router-test"
3434
name = "router-test"
Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
package com.y9vad9.rsocket.router.test
22

3-
import com.y9vad9.rsocket.router.Router
4-
import com.y9vad9.rsocket.router.annotations.InternalRouterApi
5-
import com.y9vad9.rsocket.router.builders.RouterBuilder
63
import io.rsocket.kotlin.RSocket
74
import kotlin.coroutines.CoroutineContext
85
import kotlin.coroutines.EmptyCoroutineContext
96

10-
@OptIn(InternalRouterApi::class)
11-
public fun testRouter(block: RouterBuilder.() -> Unit): Router {
12-
return RouterBuilder().apply(block).build()
13-
}
14-
15-
public fun emptyRSocket(): RSocket = object : RSocket {
7+
public object EmptyRSocket : RSocket {
168
override val coroutineContext: CoroutineContext
179
get() = EmptyCoroutineContext
18-
}
10+
}
11+
12+
public fun emptyRSocket(): RSocket = EmptyRSocket

router-test/src/jvmTest/kotlin/com/y9vad9/rsocket/router/test/RouterTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.y9vad9.rsocket.router.test
22

33
import com.y9vad9.rsocket.router.annotations.ExperimentalRouterApi
44
import com.y9vad9.rsocket.router.interceptors.RouteInterceptor
5+
import com.y9vad9.rsocket.router.router
56
import io.rsocket.kotlin.payload.Payload
67
import io.rsocket.kotlin.payload.buildPayload
78
import io.rsocket.kotlin.payload.data
@@ -29,7 +30,7 @@ class RouterTest {
2930
}
3031
}
3132

32-
private val router = testRouter {
33+
private val router = router {
3334
routeSeparator = '.'
3435
sharedInterceptors {
3536
forCoroutineContext(MyInterceptor())

0 commit comments

Comments
 (0)