Skip to content

Commit 14e2e2a

Browse files
committed
gRPC: Ktor Plugin (#393)
1 parent 6f64bbf commit 14e2e2a

File tree

22 files changed

+449
-16
lines changed

22 files changed

+449
-16
lines changed

docs/pages/kotlinx-rpc/topics/platforms.topic

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,14 @@
101101
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm32</li><li>watchosArm64</li><li>watchosDeviceArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
102102
</tr>
103103

104+
<tr>
105+
<td>grpc-ktor-server</td>
106+
<td>jvm</td>
107+
<td><list><li>browser</li><li>node</li></list></td>
108+
<td><list><li>wasmJs<list><li>browser</li><li>d8</li><li>node</li></list></li></list></td>
109+
<td><list><li>apple<list><li>ios<list><li>iosArm64</li><li>iosSimulatorArm64</li><li>iosX64</li></list></li><li>macos<list><li>macosArm64</li><li>macosX64</li></list></li><li>watchos<list><li>watchosArm32</li><li>watchosArm64</li><li>watchosDeviceArm64</li><li>watchosSimulatorArm64</li><li>watchosX64</li></list></li><li>tvos<list><li>tvosArm64</li><li>tvosSimulatorArm64</li><li>tvosX64</li></list></li></list></li><li>linux<list><li>linuxArm64</li><li>linuxX64</li></list></li><li>windows<list><li>mingwX64</li></list></li></list></td>
110+
</tr>
111+
104112
<tr>
105113
<td>krpc-client</td>
106114
<td>jvm</td>

grpc/grpc-core/api/grpc-core.api

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
public final class kotlinx/rpc/grpc/GrpcClient : kotlinx/rpc/RpcClient {
2+
public final fun awaitTermination-VtjQ1oo (JLkotlin/coroutines/Continuation;)Ljava/lang/Object;
23
public fun call (Lkotlinx/rpc/RpcCall;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
3-
public fun callAsync (Lkotlinx/coroutines/CoroutineScope;Lkotlinx/rpc/RpcCall;)Lkotlinx/coroutines/Deferred;
4-
public fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;
5-
public fun provideStubContext (J)Lkotlin/coroutines/CoroutineContext;
4+
public fun callServerStreaming (Lkotlinx/rpc/RpcCall;)Lkotlinx/coroutines/flow/Flow;
5+
public final fun shutdown ()V
6+
public final fun shutdownNow ()V
67
}
78

89
public final class kotlinx/rpc/grpc/GrpcClientKt {
@@ -14,11 +15,11 @@ public final class kotlinx/rpc/grpc/GrpcClientKt {
1415

1516
public final class kotlinx/rpc/grpc/GrpcServer : kotlinx/rpc/RpcServer, kotlinx/rpc/grpc/Server {
1617
public fun awaitTermination-VtjQ1oo (JLkotlin/coroutines/Continuation;)Ljava/lang/Object;
17-
public fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext;
18+
public fun deregisterService (Lkotlin/reflect/KClass;)V
1819
public fun getPort ()I
1920
public fun isShutdown ()Z
2021
public fun isTerminated ()Z
21-
public fun registerService (Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function1;)V
22+
public fun registerService (Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function0;)V
2223
public fun shutdown ()Lkotlinx/rpc/grpc/GrpcServer;
2324
public synthetic fun shutdown ()Lkotlinx/rpc/grpc/Server;
2425
public fun shutdownNow ()Lkotlinx/rpc/grpc/GrpcServer;
@@ -47,6 +48,7 @@ public final class kotlinx/rpc/grpc/ManagedChannel_jvmKt {
4748

4849
public abstract interface class kotlinx/rpc/grpc/Server {
4950
public abstract fun awaitTermination-VtjQ1oo (JLkotlin/coroutines/Continuation;)Ljava/lang/Object;
51+
public static synthetic fun awaitTermination-VtjQ1oo$default (Lkotlinx/rpc/grpc/Server;JLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object;
5052
public abstract fun getPort ()I
5153
public abstract fun isShutdown ()Z
5254
public abstract fun isTerminated ()Z
@@ -102,7 +104,7 @@ public final class kotlinx/rpc/grpc/StatusRuntimeException_jvmKt {
102104

103105
public abstract interface class kotlinx/rpc/grpc/descriptor/GrpcClientDelegate {
104106
public abstract fun call (Lkotlinx/rpc/RpcCall;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
105-
public abstract fun callAsync (Lkotlinx/rpc/RpcCall;)Lkotlinx/coroutines/Deferred;
107+
public abstract fun callServerStreaming (Lkotlinx/rpc/RpcCall;)Lkotlinx/coroutines/flow/Flow;
106108
}
107109

108110
public abstract interface class kotlinx/rpc/grpc/descriptor/GrpcDelegate {

grpc/grpc-core/api/grpc-core.klib.api

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
// Klib ABI Dump
2+
// Targets: [iosArm64, iosSimulatorArm64, iosX64, js, linuxArm64, linuxX64, macosArm64, macosX64, mingwX64, tvosArm64, tvosSimulatorArm64, tvosX64, wasmJs, watchosArm32, watchosArm64, watchosDeviceArm64, watchosSimulatorArm64, watchosX64]
3+
// Rendering settings:
4+
// - Signature version: 2
5+
// - Show manifest properties: true
6+
// - Show declarations: true
7+
8+
// Library unique name: <org.jetbrains.kotlinx:grpc-core>
9+
abstract interface <#A: kotlin/Any> kotlinx.rpc.grpc.descriptor/GrpcDelegate { // kotlinx.rpc.grpc.descriptor/GrpcDelegate|null[0]
10+
abstract fun clientProvider(kotlinx.rpc.grpc/ManagedChannel): kotlinx.rpc.grpc.descriptor/GrpcClientDelegate // kotlinx.rpc.grpc.descriptor/GrpcDelegate.clientProvider|clientProvider(kotlinx.rpc.grpc.ManagedChannel){}[0]
11+
abstract fun definitionFor(#A): kotlinx.rpc.grpc/ServerServiceDefinition // kotlinx.rpc.grpc.descriptor/GrpcDelegate.definitionFor|definitionFor(1:0){}[0]
12+
}
13+
14+
abstract interface <#A: kotlin/Any> kotlinx.rpc.grpc.descriptor/GrpcServiceDescriptor : kotlinx.rpc.descriptor/RpcServiceDescriptor<#A> { // kotlinx.rpc.grpc.descriptor/GrpcServiceDescriptor|null[0]
15+
abstract val delegate // kotlinx.rpc.grpc.descriptor/GrpcServiceDescriptor.delegate|{}delegate[0]
16+
abstract fun <get-delegate>(): kotlinx.rpc.grpc.descriptor/GrpcDelegate<#A> // kotlinx.rpc.grpc.descriptor/GrpcServiceDescriptor.delegate.<get-delegate>|<get-delegate>(){}[0]
17+
}
18+
19+
abstract interface kotlinx.rpc.grpc.descriptor/GrpcClientDelegate { // kotlinx.rpc.grpc.descriptor/GrpcClientDelegate|null[0]
20+
abstract fun <#A1: kotlin/Any?> callServerStreaming(kotlinx.rpc/RpcCall): kotlinx.coroutines.flow/Flow<#A1> // kotlinx.rpc.grpc.descriptor/GrpcClientDelegate.callServerStreaming|callServerStreaming(kotlinx.rpc.RpcCall){0§<kotlin.Any?>}[0]
21+
abstract suspend fun <#A1: kotlin/Any?> call(kotlinx.rpc/RpcCall): #A1 // kotlinx.rpc.grpc.descriptor/GrpcClientDelegate.call|call(kotlinx.rpc.RpcCall){0§<kotlin.Any?>}[0]
22+
}
23+
24+
abstract interface kotlinx.rpc.grpc/ManagedChannel { // kotlinx.rpc.grpc/ManagedChannel|null[0]
25+
abstract val isShutdown // kotlinx.rpc.grpc/ManagedChannel.isShutdown|{}isShutdown[0]
26+
abstract fun <get-isShutdown>(): kotlin/Boolean // kotlinx.rpc.grpc/ManagedChannel.isShutdown.<get-isShutdown>|<get-isShutdown>(){}[0]
27+
abstract val isTerminated // kotlinx.rpc.grpc/ManagedChannel.isTerminated|{}isTerminated[0]
28+
abstract fun <get-isTerminated>(): kotlin/Boolean // kotlinx.rpc.grpc/ManagedChannel.isTerminated.<get-isTerminated>|<get-isTerminated>(){}[0]
29+
abstract val platformApi // kotlinx.rpc.grpc/ManagedChannel.platformApi|{}platformApi[0]
30+
abstract fun <get-platformApi>(): kotlinx.rpc.grpc/ManagedChannelPlatform // kotlinx.rpc.grpc/ManagedChannel.platformApi.<get-platformApi>|<get-platformApi>(){}[0]
31+
32+
abstract fun shutdown(): kotlinx.rpc.grpc/ManagedChannel // kotlinx.rpc.grpc/ManagedChannel.shutdown|shutdown(){}[0]
33+
abstract fun shutdownNow(): kotlinx.rpc.grpc/ManagedChannel // kotlinx.rpc.grpc/ManagedChannel.shutdownNow|shutdownNow(){}[0]
34+
abstract suspend fun awaitTermination(kotlin.time/Duration): kotlin/Boolean // kotlinx.rpc.grpc/ManagedChannel.awaitTermination|awaitTermination(kotlin.time.Duration){}[0]
35+
}
36+
37+
abstract interface kotlinx.rpc.grpc/Server { // kotlinx.rpc.grpc/Server|null[0]
38+
abstract val isShutdown // kotlinx.rpc.grpc/Server.isShutdown|{}isShutdown[0]
39+
abstract fun <get-isShutdown>(): kotlin/Boolean // kotlinx.rpc.grpc/Server.isShutdown.<get-isShutdown>|<get-isShutdown>(){}[0]
40+
abstract val isTerminated // kotlinx.rpc.grpc/Server.isTerminated|{}isTerminated[0]
41+
abstract fun <get-isTerminated>(): kotlin/Boolean // kotlinx.rpc.grpc/Server.isTerminated.<get-isTerminated>|<get-isTerminated>(){}[0]
42+
abstract val port // kotlinx.rpc.grpc/Server.port|{}port[0]
43+
abstract fun <get-port>(): kotlin/Int // kotlinx.rpc.grpc/Server.port.<get-port>|<get-port>(){}[0]
44+
45+
abstract fun shutdown(): kotlinx.rpc.grpc/Server // kotlinx.rpc.grpc/Server.shutdown|shutdown(){}[0]
46+
abstract fun shutdownNow(): kotlinx.rpc.grpc/Server // kotlinx.rpc.grpc/Server.shutdownNow|shutdownNow(){}[0]
47+
abstract fun start(): kotlinx.rpc.grpc/Server // kotlinx.rpc.grpc/Server.start|start(){}[0]
48+
abstract suspend fun awaitTermination(kotlin.time/Duration = ...): kotlinx.rpc.grpc/Server // kotlinx.rpc.grpc/Server.awaitTermination|awaitTermination(kotlin.time.Duration){}[0]
49+
}
50+
51+
abstract interface kotlinx.rpc.grpc/Status { // kotlinx.rpc.grpc/Status|null[0]
52+
abstract val cause // kotlinx.rpc.grpc/Status.cause|{}cause[0]
53+
abstract fun <get-cause>(): kotlin/Throwable? // kotlinx.rpc.grpc/Status.cause.<get-cause>|<get-cause>(){}[0]
54+
abstract val code // kotlinx.rpc.grpc/Status.code|{}code[0]
55+
abstract fun <get-code>(): kotlinx.rpc.grpc/Status.Code // kotlinx.rpc.grpc/Status.code.<get-code>|<get-code>(){}[0]
56+
abstract val description // kotlinx.rpc.grpc/Status.description|{}description[0]
57+
abstract fun <get-description>(): kotlin/String? // kotlinx.rpc.grpc/Status.description.<get-description>|<get-description>(){}[0]
58+
59+
final enum class Code : kotlin/Enum<kotlinx.rpc.grpc/Status.Code> { // kotlinx.rpc.grpc/Status.Code|null[0]
60+
enum entry ABORTED // kotlinx.rpc.grpc/Status.Code.ABORTED|null[0]
61+
enum entry ALREADY_EXISTS // kotlinx.rpc.grpc/Status.Code.ALREADY_EXISTS|null[0]
62+
enum entry CANCELLED // kotlinx.rpc.grpc/Status.Code.CANCELLED|null[0]
63+
enum entry DATA_LOSS // kotlinx.rpc.grpc/Status.Code.DATA_LOSS|null[0]
64+
enum entry DEADLINE_EXCEEDED // kotlinx.rpc.grpc/Status.Code.DEADLINE_EXCEEDED|null[0]
65+
enum entry FAILED_PRECONDITION // kotlinx.rpc.grpc/Status.Code.FAILED_PRECONDITION|null[0]
66+
enum entry INTERNAL // kotlinx.rpc.grpc/Status.Code.INTERNAL|null[0]
67+
enum entry INVALID_ARGUMENT // kotlinx.rpc.grpc/Status.Code.INVALID_ARGUMENT|null[0]
68+
enum entry NOT_FOUND // kotlinx.rpc.grpc/Status.Code.NOT_FOUND|null[0]
69+
enum entry OK // kotlinx.rpc.grpc/Status.Code.OK|null[0]
70+
enum entry OUT_OF_RANGE // kotlinx.rpc.grpc/Status.Code.OUT_OF_RANGE|null[0]
71+
enum entry PERMISSION_DENIED // kotlinx.rpc.grpc/Status.Code.PERMISSION_DENIED|null[0]
72+
enum entry RESOURCE_EXHAUSTED // kotlinx.rpc.grpc/Status.Code.RESOURCE_EXHAUSTED|null[0]
73+
enum entry UNAUTHENTICATED // kotlinx.rpc.grpc/Status.Code.UNAUTHENTICATED|null[0]
74+
enum entry UNAVAILABLE // kotlinx.rpc.grpc/Status.Code.UNAVAILABLE|null[0]
75+
enum entry UNIMPLEMENTED // kotlinx.rpc.grpc/Status.Code.UNIMPLEMENTED|null[0]
76+
enum entry UNKNOWN // kotlinx.rpc.grpc/Status.Code.UNKNOWN|null[0]
77+
78+
final val entries // kotlinx.rpc.grpc/Status.Code.entries|#static{}entries[0]
79+
final fun <get-entries>(): kotlin.enums/EnumEntries<kotlinx.rpc.grpc/Status.Code> // kotlinx.rpc.grpc/Status.Code.entries.<get-entries>|<get-entries>#static(){}[0]
80+
final val value // kotlinx.rpc.grpc/Status.Code.value|{}value[0]
81+
final fun <get-value>(): kotlin/Int // kotlinx.rpc.grpc/Status.Code.value.<get-value>|<get-value>(){}[0]
82+
final val valueAscii // kotlinx.rpc.grpc/Status.Code.valueAscii|{}valueAscii[0]
83+
final fun <get-valueAscii>(): kotlin/ByteArray // kotlinx.rpc.grpc/Status.Code.valueAscii.<get-valueAscii>|<get-valueAscii>(){}[0]
84+
85+
final fun valueOf(kotlin/String): kotlinx.rpc.grpc/Status.Code // kotlinx.rpc.grpc/Status.Code.valueOf|valueOf#static(kotlin.String){}[0]
86+
final fun values(): kotlin/Array<kotlinx.rpc.grpc/Status.Code> // kotlinx.rpc.grpc/Status.Code.values|values#static(){}[0]
87+
}
88+
}
89+
90+
abstract interface kotlinx.rpc.grpc/StatusRuntimeException { // kotlinx.rpc.grpc/StatusRuntimeException|null[0]
91+
abstract val status // kotlinx.rpc.grpc/StatusRuntimeException.status|{}status[0]
92+
abstract fun <get-status>(): kotlinx.rpc.grpc/Status // kotlinx.rpc.grpc/StatusRuntimeException.status.<get-status>|<get-status>(){}[0]
93+
}
94+
95+
abstract class <#A: kotlinx.rpc.grpc/ManagedChannelBuilder<#A>> kotlinx.rpc.grpc/ManagedChannelBuilder { // kotlinx.rpc.grpc/ManagedChannelBuilder|null[0]
96+
constructor <init>() // kotlinx.rpc.grpc/ManagedChannelBuilder.<init>|<init>(){}[0]
97+
}
98+
99+
abstract class <#A: kotlinx.rpc.grpc/ServerBuilder<#A>> kotlinx.rpc.grpc/ServerBuilder { // kotlinx.rpc.grpc/ServerBuilder|null[0]
100+
constructor <init>() // kotlinx.rpc.grpc/ServerBuilder.<init>|<init>(){}[0]
101+
102+
abstract fun addService(kotlinx.rpc.grpc/ServerServiceDefinition): #A // kotlinx.rpc.grpc/ServerBuilder.addService|addService(kotlinx.rpc.grpc.ServerServiceDefinition){}[0]
103+
abstract fun fallbackHandlerRegistry(kotlinx.rpc.grpc/HandlerRegistry?): #A // kotlinx.rpc.grpc/ServerBuilder.fallbackHandlerRegistry|fallbackHandlerRegistry(kotlinx.rpc.grpc.HandlerRegistry?){}[0]
104+
}
105+
106+
abstract class kotlinx.rpc.grpc/HandlerRegistry { // kotlinx.rpc.grpc/HandlerRegistry|null[0]
107+
constructor <init>() // kotlinx.rpc.grpc/HandlerRegistry.<init>|<init>(){}[0]
108+
}
109+
110+
abstract class kotlinx.rpc.grpc/ManagedChannelPlatform { // kotlinx.rpc.grpc/ManagedChannelPlatform|null[0]
111+
constructor <init>() // kotlinx.rpc.grpc/ManagedChannelPlatform.<init>|<init>(){}[0]
112+
}
113+
114+
final class kotlinx.rpc.grpc/GrpcClient : kotlinx.rpc/RpcClient { // kotlinx.rpc.grpc/GrpcClient|null[0]
115+
final fun <#A1: kotlin/Any?> callServerStreaming(kotlinx.rpc/RpcCall): kotlinx.coroutines.flow/Flow<#A1> // kotlinx.rpc.grpc/GrpcClient.callServerStreaming|callServerStreaming(kotlinx.rpc.RpcCall){0§<kotlin.Any?>}[0]
116+
final fun shutdown() // kotlinx.rpc.grpc/GrpcClient.shutdown|shutdown(){}[0]
117+
final fun shutdownNow() // kotlinx.rpc.grpc/GrpcClient.shutdownNow|shutdownNow(){}[0]
118+
final suspend fun <#A1: kotlin/Any?> call(kotlinx.rpc/RpcCall): #A1 // kotlinx.rpc.grpc/GrpcClient.call|call(kotlinx.rpc.RpcCall){0§<kotlin.Any?>}[0]
119+
final suspend fun awaitTermination(kotlin.time/Duration) // kotlinx.rpc.grpc/GrpcClient.awaitTermination|awaitTermination(kotlin.time.Duration){}[0]
120+
}
121+
122+
final class kotlinx.rpc.grpc/GrpcServer : kotlinx.rpc.grpc/Server, kotlinx.rpc/RpcServer { // kotlinx.rpc.grpc/GrpcServer|null[0]
123+
final val isShutdown // kotlinx.rpc.grpc/GrpcServer.isShutdown|{}isShutdown[0]
124+
final fun <get-isShutdown>(): kotlin/Boolean // kotlinx.rpc.grpc/GrpcServer.isShutdown.<get-isShutdown>|<get-isShutdown>(){}[0]
125+
final val isTerminated // kotlinx.rpc.grpc/GrpcServer.isTerminated|{}isTerminated[0]
126+
final fun <get-isTerminated>(): kotlin/Boolean // kotlinx.rpc.grpc/GrpcServer.isTerminated.<get-isTerminated>|<get-isTerminated>(){}[0]
127+
final val port // kotlinx.rpc.grpc/GrpcServer.port|{}port[0]
128+
final fun <get-port>(): kotlin/Int // kotlinx.rpc.grpc/GrpcServer.port.<get-port>|<get-port>(){}[0]
129+
130+
final fun <#A1: kotlin/Any> deregisterService(kotlin.reflect/KClass<#A1>) // kotlinx.rpc.grpc/GrpcServer.deregisterService|deregisterService(kotlin.reflect.KClass<0:0>){0§<kotlin.Any>}[0]
131+
final fun <#A1: kotlin/Any> registerService(kotlin.reflect/KClass<#A1>, kotlin/Function0<#A1>) // kotlinx.rpc.grpc/GrpcServer.registerService|registerService(kotlin.reflect.KClass<0:0>;kotlin.Function0<0:0>){0§<kotlin.Any>}[0]
132+
final fun shutdown(): kotlinx.rpc.grpc/GrpcServer // kotlinx.rpc.grpc/GrpcServer.shutdown|shutdown(){}[0]
133+
final fun shutdownNow(): kotlinx.rpc.grpc/GrpcServer // kotlinx.rpc.grpc/GrpcServer.shutdownNow|shutdownNow(){}[0]
134+
final fun start(): kotlinx.rpc.grpc/GrpcServer // kotlinx.rpc.grpc/GrpcServer.start|start(){}[0]
135+
final suspend fun awaitTermination(kotlin.time/Duration): kotlinx.rpc.grpc/GrpcServer // kotlinx.rpc.grpc/GrpcServer.awaitTermination|awaitTermination(kotlin.time.Duration){}[0]
136+
}
137+
138+
final class kotlinx.rpc.grpc/ServerServiceDefinition { // kotlinx.rpc.grpc/ServerServiceDefinition|null[0]
139+
constructor <init>() // kotlinx.rpc.grpc/ServerServiceDefinition.<init>|<init>(){}[0]
140+
}
141+
142+
final fun kotlinx.rpc.grpc/GrpcClient(kotlin/String, kotlin/Function1<kotlinx.rpc.grpc/ManagedChannelBuilder<*>, kotlin/Unit> = ...): kotlinx.rpc.grpc/GrpcClient // kotlinx.rpc.grpc/GrpcClient|GrpcClient(kotlin.String;kotlin.Function1<kotlinx.rpc.grpc.ManagedChannelBuilder<*>,kotlin.Unit>){}[0]
143+
final fun kotlinx.rpc.grpc/GrpcClient(kotlin/String, kotlin/Int, kotlin/Function1<kotlinx.rpc.grpc/ManagedChannelBuilder<*>, kotlin/Unit> = ...): kotlinx.rpc.grpc/GrpcClient // kotlinx.rpc.grpc/GrpcClient|GrpcClient(kotlin.String;kotlin.Int;kotlin.Function1<kotlinx.rpc.grpc.ManagedChannelBuilder<*>,kotlin.Unit>){}[0]
144+
final fun kotlinx.rpc.grpc/GrpcServer(kotlin/Int, kotlin/Function1<kotlinx.rpc.grpc/ServerBuilder<*>, kotlin/Unit> = ..., kotlin/Function1<kotlinx.rpc/RpcServer, kotlin/Unit> = ...): kotlinx.rpc.grpc/GrpcServer // kotlinx.rpc.grpc/GrpcServer|GrpcServer(kotlin.Int;kotlin.Function1<kotlinx.rpc.grpc.ServerBuilder<*>,kotlin.Unit>;kotlin.Function1<kotlinx.rpc.RpcServer,kotlin.Unit>){}[0]
145+
final fun kotlinx.rpc.grpc/StatusRuntimeException(kotlinx.rpc.grpc/Status): kotlinx.rpc.grpc/StatusRuntimeException // kotlinx.rpc.grpc/StatusRuntimeException|StatusRuntimeException(kotlinx.rpc.grpc.Status){}[0]

grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcClient.kt

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import kotlinx.rpc.RpcClient
1010
import kotlinx.rpc.grpc.descriptor.GrpcClientDelegate
1111
import kotlinx.rpc.grpc.descriptor.GrpcServiceDescriptor
1212
import kotlinx.rpc.internal.utils.map.RpcInternalConcurrentHashMap
13+
import kotlin.time.Duration
1314

1415
/**
1516
* GrpcClient manages gRPC communication by providing implementation for making asynchronous RPC calls.
@@ -19,6 +20,20 @@ import kotlinx.rpc.internal.utils.map.RpcInternalConcurrentHashMap
1920
public class GrpcClient internal constructor(private val channel: ManagedChannel) : RpcClient {
2021
private val stubs = RpcInternalConcurrentHashMap<Long, GrpcClientDelegate>()
2122

23+
public fun shutdown() {
24+
stubs.clear()
25+
channel.shutdown()
26+
}
27+
28+
public fun shutdownNow() {
29+
stubs.clear()
30+
channel.shutdownNow()
31+
}
32+
33+
public suspend fun awaitTermination(duration: Duration) {
34+
channel.awaitTermination(duration)
35+
}
36+
2237
override suspend fun <T> call(call: RpcCall): T {
2338
return call.delegate().call(call)
2439
}
@@ -39,11 +54,11 @@ public class GrpcClient internal constructor(private val channel: ManagedChannel
3954
* Constructor function for the [GrpcClient] class.
4055
*/
4156
public fun GrpcClient(
42-
name: String,
57+
hostname: String,
4358
port: Int,
4459
configure: ManagedChannelBuilder<*>.() -> Unit = {},
4560
): GrpcClient {
46-
val channel = ManagedChannelBuilder(name, port).apply(configure).buildChannel()
61+
val channel = ManagedChannelBuilder(hostname, port).apply(configure).buildChannel()
4762
return GrpcClient(channel)
4863
}
4964

grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcServer.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
package kotlinx.rpc.grpc
66

7+
import kotlinx.atomicfu.atomic
78
import kotlinx.rpc.RpcServer
89
import kotlinx.rpc.descriptor.serviceDescriptorOf
910
import kotlinx.rpc.grpc.annotations.Grpc
@@ -65,9 +66,13 @@ public class GrpcServer internal constructor(
6566
return grpc.delegate.definitionFor(service)
6667
}
6768

69+
private val buildLock = atomic(false)
70+
6871
internal fun build() {
69-
internalServer = Server(serverBuilder)
70-
isBuilt = true
72+
if (buildLock.compareAndSet(expect = false, update = true)) {
73+
internalServer = Server(serverBuilder)
74+
isBuilt = true
75+
}
7176
}
7277

7378
override val isShutdown: Boolean

grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public interface ManagedChannel {
6868
*/
6969
public expect abstract class ManagedChannelBuilder<T : ManagedChannelBuilder<T>>
7070

71-
internal expect fun ManagedChannelBuilder(name: String, port: Int): ManagedChannelBuilder<*>
71+
internal expect fun ManagedChannelBuilder(hostname: String, port: Int): ManagedChannelBuilder<*>
7272
internal expect fun ManagedChannelBuilder(target: String): ManagedChannelBuilder<*>
7373

7474
internal expect fun ManagedChannelBuilder<*>.buildChannel(): ManagedChannel

grpc/grpc-core/src/jsMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.js.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ internal actual fun ManagedChannelBuilder<*>.buildChannel(): ManagedChannel {
2020
error("JS target is not supported in gRPC")
2121
}
2222

23-
internal actual fun ManagedChannelBuilder(name: String, port: Int): ManagedChannelBuilder<*> {
23+
internal actual fun ManagedChannelBuilder(hostname: String, port: Int): ManagedChannelBuilder<*> {
2424
error("JS target is not supported in gRPC")
2525
}
2626

0 commit comments

Comments
 (0)