Skip to content

Commit a383473

Browse files
committed
undo
1 parent badf5d4 commit a383473

File tree

34 files changed

+1805
-239
lines changed

34 files changed

+1805
-239
lines changed

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ plugins {
88
alias(libs.plugins.serialization) apply false
99
alias(libs.plugins.kotlinx.rpc) apply false
1010
alias(libs.plugins.atomicfu) apply false
11-
alias(libs.plugins.conventions.kover)
11+
// alias(libs.plugins.conventions.kover)
1212
alias(libs.plugins.conventions.root)
1313
}
1414

gradle-conventions/src/main/kotlin/conventions-common.gradle.kts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ afterEvaluate {
5252
}
5353
}
5454

55-
apply(plugin = "org.jetbrains.kotlinx.kover")
55+
//apply(plugin = "org.jetbrains.kotlinx.kover")
5656

5757
val thisProject = project
5858

59-
rootProject.configurations.matching { it.name == "kover" }.all {
60-
rootProject.dependencies.add("kover", thisProject)
61-
}
59+
//rootProject.configurations.matching { it.name == "kover" }.all {
60+
// rootProject.dependencies.add("kover", thisProject)
61+
//}

gradle-conventions/src/main/kotlin/conventions-kover.gradle.kts

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,31 @@ import kotlinx.kover.gradle.plugin.dsl.CoverageUnit
77
import kotlinx.kover.gradle.plugin.dsl.GroupingEntityType
88

99
plugins {
10-
id("org.jetbrains.kotlinx.kover")
10+
// id("org.jetbrains.kotlinx.kover")
1111
}
1212

13-
kover {
14-
reports {
15-
total {
16-
html {
17-
onCheck.set(false)
18-
charset.set("UTF-8")
19-
htmlDir.set(rootDir.resolve("kover"))
20-
}
21-
22-
verify {
23-
onCheck.set(false)
24-
25-
rule {
26-
groupBy.set(GroupingEntityType.APPLICATION)
27-
28-
bound {
29-
coverageUnits.set(CoverageUnit.LINE)
30-
aggregationForGroup.set(AggregationType.COVERED_PERCENTAGE)
31-
minValue.set(70)
32-
}
33-
}
34-
}
35-
}
36-
}
37-
}
13+
//kover {
14+
// reports {
15+
// total {
16+
// html {
17+
// onCheck.set(false)
18+
// charset.set("UTF-8")
19+
// htmlDir.set(rootDir.resolve("kover"))
20+
// }
21+
//
22+
// verify {
23+
// onCheck.set(false)
24+
//
25+
// rule {
26+
// groupBy.set(GroupingEntityType.APPLICATION)
27+
//
28+
// bound {
29+
// coverageUnits.set(CoverageUnit.LINE)
30+
// aggregationForGroup.set(AggregationType.COVERED_PERCENTAGE)
31+
// minValue.set(70)
32+
// }
33+
// }
34+
// }
35+
// }
36+
// }
37+
//}

krpc/krpc-client/src/commonMain/kotlin/kotlinx/rpc/krpc/client/KrpcClient.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ public abstract class KrpcClient : RpcClient, KrpcEndpoint {
157157
private val connector by lazy {
158158
checkTransportReadiness()
159159

160-
KrpcClientConnector(config.serialFormatInitializer.build(), transport, config.waitForServices)
160+
KrpcClientConnector(config.serialFormatInitializer.build(), transport, config.connector)
161161
}
162162

163163
private var connectionId: Long? = null

krpc/krpc-client/src/commonMain/kotlin/kotlinx/rpc/krpc/client/internal/KrpcClientConnector.kt

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,48 @@
11
/*
2-
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
2+
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
33
*/
44

55
package kotlinx.rpc.krpc.client.internal
66

7+
import kotlinx.rpc.krpc.KrpcConfig
78
import kotlinx.rpc.krpc.KrpcTransport
89
import kotlinx.rpc.krpc.internal.*
910
import kotlinx.serialization.SerialFormat
1011

11-
internal sealed interface CallSubscriptionId {
12-
data class Service(
13-
val serviceTypeString: String,
14-
val callId: String,
15-
) : CallSubscriptionId
16-
17-
data object Protocol : CallSubscriptionId
18-
19-
data object Generic : CallSubscriptionId
20-
}
21-
2212
internal class KrpcClientConnector private constructor(
23-
private val connector: KrpcConnector<CallSubscriptionId>
13+
private val connector: KrpcConnector
2414
) : KrpcMessageSender by connector {
2515
constructor(
2616
serialFormat: SerialFormat,
2717
transport: KrpcTransport,
28-
waitForServices: Boolean = false,
18+
config: KrpcConfig.Connector,
2919
) : this(
30-
KrpcConnector(serialFormat, transport, waitForServices, isServer = false) {
31-
when (this) {
32-
is KrpcCallMessage -> CallSubscriptionId.Service(serviceType, callId)
33-
is KrpcProtocolMessage -> CallSubscriptionId.Protocol
34-
is KrpcGenericMessage -> CallSubscriptionId.Generic
35-
}
36-
}
20+
KrpcConnector(serialFormat, transport, config, isServer = false)
3721
)
3822

3923
fun unsubscribeFromMessages(serviceTypeString: String, callId: String, callback: () -> Unit = {}) {
40-
connector.unsubscribeFromMessages(CallSubscriptionId.Service(serviceTypeString, callId), callback)
24+
connector.unsubscribeFromMessages(HandlerKey.ServiceCall(serviceTypeString, callId), callback)
4125
}
4226

4327
suspend fun subscribeToCallResponse(
4428
serviceTypeString: String,
4529
callId: String,
4630
subscription: suspend (KrpcCallMessage) -> Unit,
4731
) {
48-
connector.subscribeToMessages(CallSubscriptionId.Service(serviceTypeString, callId)) {
32+
connector.subscribeToMessages(HandlerKey.ServiceCall(serviceTypeString, callId)) {
4933
subscription(it as KrpcCallMessage)
5034
}
5135
}
5236

5337
suspend fun subscribeToProtocolMessages(subscription: suspend (KrpcProtocolMessage) -> Unit) {
54-
connector.subscribeToMessages(CallSubscriptionId.Protocol) {
38+
connector.subscribeToMessages(HandlerKey.Protocol) {
5539
subscription(it as KrpcProtocolMessage)
5640
}
5741
}
5842

5943
@Suppress("unused")
6044
suspend fun subscribeToGenericMessages(subscription: suspend (KrpcGenericMessage) -> Unit) {
61-
connector.subscribeToMessages(CallSubscriptionId.Generic) {
45+
connector.subscribeToMessages(HandlerKey.Generic) {
6246
subscription(it as KrpcGenericMessage)
6347
}
6448
}

krpc/krpc-core/build.gradle.kts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,23 @@ kotlin {
2424
implementation(libs.kotlin.reflect)
2525
}
2626
}
27+
28+
commonTest {
29+
dependencies {
30+
implementation(libs.kotlin.test)
31+
implementation(libs.coroutines.test)
32+
implementation(libs.serialization.json)
33+
}
34+
}
35+
36+
jvmTest {
37+
dependencies {
38+
implementation(libs.lincheck)
39+
}
40+
}
2741
}
2842
}
43+
44+
tasks.jvmTest {
45+
jvmArgs("-XX:+EnableDynamicAgentLoading")
46+
}

krpc/krpc-core/src/commonMain/kotlin/kotlinx/rpc/krpc/KrpcConfig.kt

Lines changed: 85 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ package kotlinx.rpc.krpc
77
import kotlinx.rpc.krpc.serialization.KrpcSerialFormat
88
import kotlinx.rpc.krpc.serialization.KrpcSerialFormatBuilder
99
import kotlinx.rpc.krpc.serialization.KrpcSerialFormatConfiguration
10+
import kotlin.time.Duration
11+
import kotlin.time.Duration.Companion.seconds
1012

1113
/**
1214
* Builder for [KrpcConfig]. Provides DSL to configure parameters for KrpcClient and/or KrpcServer.
@@ -32,12 +34,58 @@ public sealed class KrpcConfigBuilder protected constructor() {
3234
}
3335

3436
/**
35-
* A flag indicating whether a client or a server should wait for subscribers
36-
* if no service is available to process a message immediately.
37-
* If `false`, the endpoint that sent the unprocessed message will receive a call exception
38-
* saying there were no services to process the message.
37+
* DSL for connector configuration.
38+
*
39+
* Connector is responsible for handling all messages transferring.
40+
* Example usage:
41+
* ```kotlin
42+
* connector {
43+
* waitTimeout = 10.seconds
44+
* callTimeout = 10.seconds
45+
* perCallBufferSize = 1000
46+
* }
47+
* ```
3948
*/
40-
public var waitForServices: Boolean = true
49+
public fun connector(builder: Connector.() -> Unit) {
50+
connector.builder()
51+
}
52+
53+
/**
54+
* Configuration for RPC connector - a handler for all messages transferring.
55+
*/
56+
public class Connector {
57+
/**
58+
* A flag indicating how long a client or a server should wait for subscribers
59+
* if no service is available to process a message immediately.
60+
* If negative ([dontWait]) or when timeout is exceeded,
61+
* the endpoint that sent the unprocessed message will receive a call exception
62+
* saying there were no services to process the message.
63+
*/
64+
public var waitTimeout: Duration = Duration.INFINITE
65+
66+
/**
67+
* A flag indicating that a client or a server should not wait for subscribers
68+
*
69+
* @see Connector.waitTimeout
70+
*/
71+
public fun dontWait(): Duration = (-1).seconds
72+
73+
/**
74+
* A timeout for a call.
75+
* If a call is not completed in this time, it will be cancelled with a call exception.
76+
*/
77+
public var callTimeout: Duration = Duration.INFINITE
78+
79+
/**
80+
* A buffer size for a single call.
81+
*
82+
* The default value is 1,
83+
* meaning that only after one message is handled - the next one will be sent.
84+
*
85+
* This buffer also applies to how many messages are cached with [waitTimeout]
86+
*/
87+
public var perCallBufferSize: Int = 1
88+
}
4189

4290
/**
4391
* @see [KrpcConfigBuilder]
@@ -46,7 +94,7 @@ public sealed class KrpcConfigBuilder protected constructor() {
4694
public fun build(): KrpcConfig.Client {
4795
return KrpcConfig.Client(
4896
serialFormatInitializer = rpcSerialFormat(),
49-
waitForServices = waitForServices,
97+
connector = buildConnector(),
5098
)
5199
}
52100
}
@@ -58,7 +106,7 @@ public sealed class KrpcConfigBuilder protected constructor() {
58106
public fun build(): KrpcConfig.Server {
59107
return KrpcConfig.Server(
60108
serialFormatInitializer = rpcSerialFormat(),
61-
waitForServices = waitForServices,
109+
connector = buildConnector(),
62110
)
63111
}
64112
}
@@ -73,6 +121,12 @@ public sealed class KrpcConfigBuilder protected constructor() {
73121

74122
private var serialFormatInitializer: KrpcSerialFormatBuilder<*, *>? = null
75123

124+
private val connector = Connector()
125+
126+
public fun buildConnector(): KrpcConfig.Connector {
127+
return KrpcConfig.Connector(connector.waitTimeout, connector.callTimeout, connector.perCallBufferSize)
128+
}
129+
76130
private val configuration = object : KrpcSerialFormatConfiguration {
77131
override fun register(rpcSerialFormatInitializer: KrpcSerialFormatBuilder.Binary<*, *>) {
78132
serialFormatInitializer = rpcSerialFormatInitializer
@@ -100,10 +154,27 @@ public sealed interface KrpcConfig {
100154
*/
101155
public val serialFormatInitializer: KrpcSerialFormatBuilder<*, *>
102156

157+
public val connector: Connector
158+
103159
/**
104-
* @see KrpcConfigBuilder.waitForServices
160+
* @see KrpcConfigBuilder.connector
105161
*/
106-
public val waitForServices: Boolean
162+
public class Connector internal constructor(
163+
/**
164+
* @see KrpcConfigBuilder.Connector.waitTimeout
165+
*/
166+
public val waitTimeout: Duration,
167+
168+
/**
169+
* @see KrpcConfigBuilder.Connector.callTimeout
170+
*/
171+
public val callTimeout: Duration,
172+
173+
/**
174+
* @see KrpcConfigBuilder.Connector.perCallBufferSize
175+
*/
176+
public val perCallBufferSize: Int,
177+
)
107178

108179
/**
109180
* @see [KrpcConfig]
@@ -113,10 +184,8 @@ public sealed interface KrpcConfig {
113184
* @see KrpcConfigBuilder.serialization
114185
*/
115186
override val serialFormatInitializer: KrpcSerialFormatBuilder<*, *>,
116-
/**
117-
* @see KrpcConfigBuilder.waitForServices
118-
*/
119-
override val waitForServices: Boolean,
187+
188+
override val connector: Connector,
120189
) : KrpcConfig
121190

122191
/**
@@ -127,10 +196,11 @@ public sealed interface KrpcConfig {
127196
* @see KrpcConfigBuilder.serialization
128197
*/
129198
override val serialFormatInitializer: KrpcSerialFormatBuilder<*, *>,
199+
130200
/**
131-
* @see KrpcConfigBuilder.waitForServices
201+
* @see KrpcConfigBuilder.connector
132202
*/
133-
override val waitForServices: Boolean,
203+
override val connector: Connector,
134204
) : KrpcConfig
135205
}
136206

krpc/krpc-core/src/commonMain/kotlin/kotlinx/rpc/krpc/KrpcTransport.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2023-2024 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
2+
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
33
*/
44

55
package kotlinx.rpc.krpc
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package kotlinx.rpc.krpc.internal
6+
7+
internal sealed interface BufferResult<T> {
8+
class Success<T>(val message: T) : BufferResult<T>
9+
class Failure<T>() : BufferResult<T>
10+
class Closed<T>(val cause: Throwable?) : BufferResult<T>
11+
}
12+
13+
internal fun <T> BufferResult<T>.getOrNull(): T? {
14+
return if (this is BufferResult.Success) message else null
15+
}
16+
17+
internal inline fun <T> BufferResult<T>.onFailure(body: () -> Unit): BufferResult<T> {
18+
if (this is BufferResult.Failure) {
19+
body()
20+
}
21+
22+
return this
23+
}
24+
25+
internal inline fun <T> BufferResult<T>.onClosed(body: (Throwable?) -> Unit): BufferResult<T> {
26+
if (this is BufferResult.Closed) {
27+
body(cause)
28+
}
29+
30+
return this
31+
}
32+
33+
internal inline val BufferResult<*>.isFailure: Boolean
34+
get() = this is BufferResult.Failure
35+
36+
internal inline val BufferResult<*>.isSuccess: Boolean
37+
get() = this is BufferResult.Success
38+
39+
internal inline val BufferResult<*>.isClosed: Boolean
40+
get() = this is BufferResult.Closed

0 commit comments

Comments
 (0)