|
1 | 1 | package com.y9vad9.rsocket.router |
2 | 2 |
|
3 | 3 | import io.ktor.utils.io.core.* |
4 | | -import io.rsocket.kotlin.RSocketError |
5 | | -import io.rsocket.kotlin.RSocketRequestHandlerBuilder |
6 | 4 | import com.y9vad9.rsocket.router.annotations.ExperimentalRouterApi |
7 | 5 | import com.y9vad9.rsocket.router.annotations.InternalRouterApi |
8 | 6 | import com.y9vad9.rsocket.router.annotations.RouterDsl |
9 | 7 | import com.y9vad9.rsocket.router.builders.RouterBuilder |
10 | 8 | import com.y9vad9.rsocket.router.interceptors.Preprocessor |
11 | 9 | import com.y9vad9.rsocket.router.interceptors.RouteInterceptor |
| 10 | +import io.rsocket.kotlin.* |
12 | 11 |
|
13 | 12 | /** |
14 | 13 | * The RSocket router with all registered routes, configurations, preprocessors |
@@ -49,32 +48,49 @@ public sealed interface Router { |
49 | 48 |
|
50 | 49 | // -- builders -- |
51 | 50 |
|
52 | | -@OptIn(ExperimentalRouterApi::class, InternalRouterApi::class) |
53 | 51 | @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() |
56 | 58 |
|
| 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) { |
57 | 67 | requestResponse { payload -> |
58 | | - router.routeAtOrFail(router.getRoutePathFromMetadata(payload.metadata)) |
| 68 | + routeAtOrFail(getRoutePathFromMetadata(payload.metadata)) |
59 | 69 | .requestResponseOrThrow(this, payload) |
60 | 70 | } |
61 | 71 |
|
62 | 72 | requestStream { payload -> |
63 | | - router.routeAtOrFail(router.getRoutePathFromMetadata(payload.metadata)) |
| 73 | + routeAtOrFail(getRoutePathFromMetadata(payload.metadata)) |
64 | 74 | .requestStreamOrThrow(this, payload) |
65 | 75 | } |
66 | 76 |
|
67 | 77 | requestChannel { initPayload, payloads -> |
68 | | - router.routeAtOrFail(router.getRoutePathFromMetadata(initPayload.metadata)) |
| 78 | + routeAtOrFail(getRoutePathFromMetadata(initPayload.metadata)) |
69 | 79 | .requestChannelOrThrow(this, initPayload, payloads) |
70 | 80 | } |
71 | 81 |
|
72 | 82 | fireAndForget { payload -> |
73 | | - router.routeAtOrFail(router.getRoutePathFromMetadata(payload.metadata)) |
| 83 | + routeAtOrFail(getRoutePathFromMetadata(payload.metadata)) |
74 | 84 | .fireAndForgetOrThrow(this, payload) |
75 | 85 | } |
| 86 | +} |
76 | 87 |
|
77 | | - return router |
| 88 | + |
| 89 | +@Suppress("UnusedReceiverParameter") |
| 90 | +public fun ConnectionAcceptor.installRouter(router: Router): RSocket { |
| 91 | + return RSocketRequestHandler { |
| 92 | + router.installOn(this) |
| 93 | + } |
78 | 94 | } |
79 | 95 |
|
80 | 96 |
|
|
0 commit comments