Skip to content

Commit f2d4744

Browse files
committed
fix: interceptors contract, annotation on experimental status
1 parent 2a794e9 commit f2d4744

File tree

11 files changed

+110
-105
lines changed

11 files changed

+110
-105
lines changed

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

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
package com.y9vad9.rsocket.router
44

5+
import com.y9vad9.rsocket.router.annotations.ExperimentalInterceptorsApi
56
import com.y9vad9.rsocket.router.annotations.ExperimentalRouterApi
67
import com.y9vad9.rsocket.router.interceptors.Preprocessor
78
import com.y9vad9.rsocket.router.interceptors.RouteInterceptor
@@ -13,41 +14,42 @@ import kotlinx.coroutines.flow.Flow
1314
import kotlinx.coroutines.withContext
1415
import kotlin.coroutines.CoroutineContext
1516

16-
@OptIn(ExperimentalRouterApi::class)
17+
@OptIn(ExperimentalInterceptorsApi::class, ExperimentalRouterApi::class)
1718
public data class Route internal constructor(
1819
val path: String,
1920
@property:ExperimentalRouterApi
2021
internal val requests: Requests,
21-
val preprocessors: List<Preprocessor<*, *>>,
22-
val interceptors: List<RouteInterceptor<*, *>>,
22+
@property:ExperimentalInterceptorsApi
23+
val preprocessors: List<Preprocessor>,
24+
@property:ExperimentalInterceptorsApi
25+
val interceptors: List<RouteInterceptor>,
2326
) {
24-
public suspend fun fireAndForgetOrThrow(rSocket: RSocket, payload: Payload) {
27+
public suspend fun fireAndForgetOrThrow(payload: Payload) {
2528
processPayload(payload) { payload ->
26-
requests.fireAndForget?.invoke(rSocket, payload)
29+
requests.fireAndForget?.invoke(payload)
2730
?: throwInvalidRequestOnRoute("fireAndForget")
2831
}
2932
}
3033

31-
public suspend fun requestResponseOrThrow(rSocket: RSocket, payload: Payload): Payload {
34+
public suspend fun requestResponseOrThrow(payload: Payload): Payload {
3235
return processPayload(payload) { payload ->
33-
requests.requestResponse?.invoke(rSocket, payload)
36+
requests.requestResponse?.invoke(payload)
3437
?: throwInvalidRequestOnRoute("requestResponse")
3538
}
3639
}
3740

38-
public suspend fun requestStreamOrThrow(rSocket: RSocket, payload: Payload): Flow<Payload> {
41+
public suspend fun requestStreamOrThrow(payload: Payload): Flow<Payload> {
3942
return processPayload(payload) { payload ->
40-
requests.requestStream?.invoke(rSocket, payload)
43+
requests.requestStream?.invoke(payload)
4144
?: throwInvalidRequestOnRoute("requestStream")
4245
}
4346
}
4447

4548
public suspend fun requestChannelOrThrow(
46-
rSocket: RSocket,
4749
initPayload: Payload,
4850
payloads: Flow<Payload>,
4951
): Flow<Payload> = processPayload(initPayload) { initialPayload ->
50-
requests.requestChannel?.invoke(rSocket, initialPayload, payloads)
52+
requests.requestChannel?.invoke(initialPayload, payloads)
5153
?: throwInvalidRequestOnRoute("requestChannel")
5254
}
5355

@@ -57,9 +59,9 @@ public data class Route internal constructor(
5759
val payload =
5860
interceptors.fold(payload) { acc, interceptor ->
5961
when (interceptor) {
60-
is RouteInterceptor.Modifier -> interceptor.intercept(acc)
62+
is RouteInterceptor.Modifier -> interceptor.intercept(path, acc)
6163
is RouteInterceptor.CoroutineContext -> {
62-
coroutineContext = interceptor.intercept(coroutineContext, acc)
64+
coroutineContext = interceptor.intercept(path, coroutineContext, acc)
6365
acc
6466
}
6567
}
@@ -71,12 +73,19 @@ public data class Route internal constructor(
7173
}
7274

7375
internal data class Requests(
74-
val fireAndForget: (suspend RSocket.(payload: Payload) -> Unit)? = null,
75-
val requestResponse: (suspend RSocket.(payload: Payload) -> Payload)? = null,
76-
val requestStream: (suspend RSocket.(payload: Payload) -> Flow<Payload>)? = null,
77-
val requestChannel: (suspend RSocket.(initPayload: Payload, payloads: Flow<Payload>) -> Flow<Payload>)? = null,
76+
val fireAndForget: (suspend (payload: Payload) -> Unit)? = null,
77+
val requestResponse: (suspend (payload: Payload) -> Payload)? = null,
78+
val requestStream: (suspend (payload: Payload) -> Flow<Payload>)? = null,
79+
val requestChannel: (suspend (initPayload: Payload, payloads: Flow<Payload>) -> Flow<Payload>)? = null,
7880
)
7981
}
8082

8183
private fun Route.throwInvalidRequestOnRoute(requestType: String): Nothing =
82-
throw RSocketError.Invalid("No `$requestType` is registered for `$path` route.")
84+
throw RSocketError.Invalid("No `$requestType` is registered for `$path` route.")
85+
86+
@OptIn(ExperimentalInterceptorsApi::class)
87+
public class MyRouteInterceptor : RouteInterceptor.Modifier {
88+
override fun intercept(route: String, input: Payload): Payload {
89+
return Payload.Empty // just for example
90+
}
91+
}

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.y9vad9.rsocket.router
22

3+
import com.y9vad9.rsocket.router.annotations.ExperimentalInterceptorsApi
34
import io.ktor.utils.io.core.*
45
import com.y9vad9.rsocket.router.annotations.ExperimentalRouterApi
56
import com.y9vad9.rsocket.router.annotations.InternalRouterApi
@@ -28,14 +29,14 @@ public sealed interface Router {
2829
* Preprocessors are always run before any processing from router. They're
2930
* experimental due to considerations of better API.
3031
*/
31-
@ExperimentalRouterApi
32-
public val preprocessors: List<Preprocessor<*, *>>
32+
@ExperimentalInterceptorsApi
33+
public val preprocessors: List<Preprocessor>
3334

3435
/**
3536
* The list of interceptors that are shared to all the routes.
3637
*/
37-
@ExperimentalRouterApi
38-
public val sharedInterceptors: List<RouteInterceptor<*, *>>
38+
@ExperimentalInterceptorsApi
39+
public val sharedInterceptors: List<RouteInterceptor>
3940

4041
/**
4142
* Retrieves route based on given [path].
@@ -66,22 +67,22 @@ public fun router(builder: RouterBuilder.() -> Unit): Router = RouterBuilder().a
6667
public fun Router.installOn(handlerBuilder: RSocketRequestHandlerBuilder): Unit = with(handlerBuilder) {
6768
requestResponse { payload ->
6869
routeAtOrFail(getRoutePathFromMetadata(payload.metadata))
69-
.requestResponseOrThrow(this, payload)
70+
.requestResponseOrThrow(payload)
7071
}
7172

7273
requestStream { payload ->
7374
routeAtOrFail(getRoutePathFromMetadata(payload.metadata))
74-
.requestStreamOrThrow(this, payload)
75+
.requestStreamOrThrow(payload)
7576
}
7677

7778
requestChannel { initPayload, payloads ->
7879
routeAtOrFail(getRoutePathFromMetadata(initPayload.metadata))
79-
.requestChannelOrThrow(this, initPayload, payloads)
80+
.requestChannelOrThrow(initPayload, payloads)
8081
}
8182

8283
fireAndForget { payload ->
8384
routeAtOrFail(getRoutePathFromMetadata(payload.metadata))
84-
.fireAndForgetOrThrow(this, payload)
85+
.fireAndForgetOrThrow(payload)
8586
}
8687
}
8788

@@ -104,12 +105,12 @@ public fun Router.routeAtOrFail(path: String): Route =
104105

105106
// -- internal implementation --
106107

107-
internal class RouterImpl @ExperimentalRouterApi constructor(
108+
internal class RouterImpl @[ExperimentalRouterApi ExperimentalInterceptorsApi] constructor(
108109
override val routeSeparator: Char,
109110
@property:ExperimentalRouterApi
110-
override val preprocessors: List<Preprocessor<*, *>>,
111+
override val preprocessors: List<Preprocessor>,
111112
@property:ExperimentalRouterApi
112-
override val sharedInterceptors: List<RouteInterceptor<*, *>>,
113+
override val sharedInterceptors: List<RouteInterceptor>,
113114
private val routes: Map<String, Route>,
114115
private var routeProvider: suspend (metadata: ByteReadPacket?) -> String,
115116
) : Router {

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.y9vad9.rsocket.router.builders
22

3+
import com.y9vad9.rsocket.router.annotations.ExperimentalInterceptorsApi
34
import io.rsocket.kotlin.RSocket
45
import io.rsocket.kotlin.payload.Payload
56
import com.y9vad9.rsocket.router.annotations.ExperimentalRouterApi
@@ -17,7 +18,7 @@ public interface DeclarableRoutingBuilder : RoutingBuilder {
1718
* This lambda is responsible for processing the payload and generating the response.
1819
* @return The response Payload from the server.
1920
*/
20-
public fun requestResponse(block: suspend RSocket.(payload: Payload) -> Payload)
21+
public fun requestResponse(block: suspend (payload: Payload) -> Payload)
2122

2223
/**
2324
* Makes a stream request to the RSocket with the provided [Payload] and returns a [Flow] of [Payload] as the response.
@@ -31,7 +32,7 @@ public interface DeclarableRoutingBuilder : RoutingBuilder {
3132
*
3233
* @throws Exception if any error occurs during the stream request or handling.
3334
*/
34-
public fun requestStream(block: suspend RSocket.(payload: Payload) -> Flow<Payload>)
35+
public fun requestStream(block: suspend (payload: Payload) -> Flow<Payload>)
3536

3637
/**
3738
* Requests a channel within RSocket in current route.
@@ -42,7 +43,7 @@ public interface DeclarableRoutingBuilder : RoutingBuilder {
4243
* The block should return a flow of payloads received from the channel.
4344
* @return A flow of payloads received from the channel.
4445
*/
45-
public fun requestChannel(block: suspend (RSocket.(initPayload: Payload, payloads: Flow<Payload>) -> Flow<Payload>))
46+
public fun requestChannel(block: suspend (initPayload: Payload, payloads: Flow<Payload>) -> Flow<Payload>)
4647

4748
/**
4849
* Executes the given [block] in a fire-and-forget manner.
@@ -55,14 +56,14 @@ public interface DeclarableRoutingBuilder : RoutingBuilder {
5556
* It takes an RSocket instance and a Payload object as parameters.
5657
* The block is responsible for processing the Payload object accordingly.
5758
*/
58-
public fun fireAndForget(block: suspend RSocket.(payload: Payload) -> Unit)
59+
public fun fireAndForget(block: suspend (payload: Payload) -> Unit)
5960

6061
/**
6162
* Registers interceptor for current route and its sub-routes.
6263
*
6364
* **Experimental** due to considering better design for API.
6465
*/
65-
@ExperimentalRouterApi
66+
@ExperimentalInterceptorsApi
6667
public fun interceptors(
6768
builder: RouteInterceptorsBuilder.() -> Unit,
6869
)
@@ -73,28 +74,28 @@ public interface DeclarableRoutingBuilder : RoutingBuilder {
7374

7475
public fun DeclarableRoutingBuilder.requestResponse(
7576
route: String,
76-
block: suspend RSocket.(payload: Payload) -> Payload
77+
block: suspend (payload: Payload) -> Payload
7778
): Unit = route(route) {
7879
requestResponse(block)
7980
}
8081

8182
public fun DeclarableRoutingBuilder.requestChannel(
8283
route: String,
83-
block: suspend (RSocket.(initPayload: Payload, payloads: Flow<Payload>) -> Flow<Payload>)
84+
block: suspend (initPayload: Payload, payloads: Flow<Payload>) -> Flow<Payload>
8485
): Unit = route(route) {
8586
requestChannel(block)
8687
}
8788

8889
public fun DeclarableRoutingBuilder.requestStream(
8990
route: String,
90-
block: suspend RSocket.(payload: Payload) -> Flow<Payload>
91+
block: suspend (payload: Payload) -> Flow<Payload>
9192
): Unit = route(route) {
9293
requestStream(block)
9394
}
9495

9596
public fun DeclarableRoutingBuilder.fireAndForget(
9697
route: String,
97-
block: suspend RSocket.(payload: Payload) -> Unit
98+
block: suspend (payload: Payload) -> Unit
9899
): Unit = route(route) {
99100
fireAndForget(block)
100101
}

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.y9vad9.rsocket.router.builders
33
import io.ktor.utils.io.core.*
44
import com.y9vad9.rsocket.router.Router
55
import com.y9vad9.rsocket.router.RouterImpl
6+
import com.y9vad9.rsocket.router.annotations.ExperimentalInterceptorsApi
67
import com.y9vad9.rsocket.router.annotations.ExperimentalRouterApi
78
import com.y9vad9.rsocket.router.annotations.InternalRouterApi
89
import com.y9vad9.rsocket.router.annotations.RouterDsl
@@ -14,10 +15,10 @@ import com.y9vad9.rsocket.router.interceptors.builder.RouteInterceptorsBuilder
1415

1516
@RouterDsl
1617
public class RouterBuilder @InternalRouterApi constructor() {
17-
@ExperimentalRouterApi
18-
private var preprocessors: List<Preprocessor<*, *>>? = null
19-
@ExperimentalRouterApi
20-
private var sharedInterceptors: List<RouteInterceptor<*, *>>? = null
18+
@ExperimentalInterceptorsApi
19+
private var preprocessors: List<Preprocessor>? = null
20+
@ExperimentalInterceptorsApi
21+
private var sharedInterceptors: List<RouteInterceptor>? = null
2122

2223
private var routingConfiguration: (RoutingBuilder.() -> Unit)? = null
2324

@@ -42,13 +43,13 @@ public class RouterBuilder @InternalRouterApi constructor() {
4243
*
4344
* @param builder The lambda function where the preprocessors are configured using the `PreprocessorsBuilder`.
4445
*/
45-
@ExperimentalRouterApi
46+
@ExperimentalInterceptorsApi
4647
public fun preprocessors(builder: PreprocessorsBuilder.() -> Unit) {
4748
require(preprocessors == null) { "preprocessors should be defined once." }
4849
preprocessors = PreprocessorsBuilder().apply(builder).build()
4950
}
5051

51-
@ExperimentalRouterApi
52+
@ExperimentalInterceptorsApi
5253
public fun sharedInterceptors(builder: RouteInterceptorsBuilder.() -> Unit) {
5354
require(sharedInterceptors == null) { "sharedInterceptors should be defined once." }
5455
sharedInterceptors = RouteInterceptorsBuilder().apply(builder).build()
@@ -66,7 +67,7 @@ public class RouterBuilder @InternalRouterApi constructor() {
6667
routingConfiguration = block
6768
}
6869

69-
@OptIn(ExperimentalRouterApi::class)
70+
@OptIn(ExperimentalRouterApi::class, ExperimentalInterceptorsApi::class)
7071
@InternalRouterApi
7172
public fun build(): Router {
7273
require(routingConfiguration != null) { "routing should be defined" }

router-core/src/commonMain/kotlin/com.y9vad9.rsocket.router/builders/impl/DeclarableRoutingBuilderScopeImpl.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,35 +14,35 @@ import kotlinx.coroutines.flow.Flow
1414
internal class DeclarableRoutingBuilderScopeImpl(
1515
private val path: String,
1616
private val separator: Char,
17-
private val inheritedInterceptors: List<RouteInterceptor<*, *>>,
18-
private val preprocessors: List<Preprocessor<*, *>>,
17+
private val inheritedInterceptors: List<RouteInterceptor>,
18+
private val preprocessors: List<Preprocessor>,
1919
) : DeclarableRoutingBuilder {
20-
private var currentInterceptors: List<RouteInterceptor<*, *>>? = null
20+
private var currentInterceptors: List<RouteInterceptor>? = null
2121
private var requests = Route.Requests()
2222
private val subRoutes = mutableMapOf<String, Route>()
2323

24-
override fun requestResponse(block: suspend RSocket.(payload: Payload) -> Payload) {
24+
override fun requestResponse(block: suspend (payload: Payload) -> Payload) {
2525
require(requests.requestResponse == null) { "Request-Response is already defined." }
2626
requests = requests.copy(
2727
requestResponse = block,
2828
)
2929
}
3030

31-
override fun requestStream(block: suspend RSocket.(payload: Payload) -> Flow<Payload>) {
31+
override fun requestStream(block: suspend (payload: Payload) -> Flow<Payload>) {
3232
require(requests.requestResponse == null) { "Request-Stream is already defined." }
3333
requests = requests.copy(
3434
requestStream = block,
3535
)
3636
}
3737

38-
override fun requestChannel(block: suspend RSocket.(initPayload: Payload, payloads: Flow<Payload>) -> Flow<Payload>) {
38+
override fun requestChannel(block: suspend (initPayload: Payload, payloads: Flow<Payload>) -> Flow<Payload>) {
3939
require(requests.requestChannel == null) { "Request-Channel is already defined." }
4040
requests = requests.copy(
4141
requestChannel = block,
4242
)
4343
}
4444

45-
override fun fireAndForget(block: suspend RSocket.(payload: Payload) -> Unit) {
45+
override fun fireAndForget(block: suspend (payload: Payload) -> Unit) {
4646
require(requests.fireAndForget == null) { "Fire-and-Forget is already defined." }
4747
requests = requests.copy(
4848
fireAndForget = block,

router-core/src/commonMain/kotlin/com.y9vad9.rsocket.router/builders/impl/RoutingBuilderScopeImpl.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import com.y9vad9.rsocket.router.interceptors.RouteInterceptor
1010
@OptIn(ExperimentalRouterApi::class)
1111
internal class RoutingBuilderScopeImpl(
1212
private val separator: Char,
13-
private val sharedInterceptors: List<RouteInterceptor<*, *>>,
14-
private val preprocessors: List<Preprocessor<*, *>>,
13+
private val sharedInterceptors: List<RouteInterceptor>,
14+
private val preprocessors: List<Preprocessor>,
1515
) : RoutingBuilder {
1616
private val subRoutes = mutableMapOf<String, Route>()
1717

0 commit comments

Comments
 (0)