From 84f92e8814c9d44cf8f7a19560274600fd68b1e6 Mon Sep 17 00:00:00 2001 From: Johannes Zottele Date: Thu, 2 Oct 2025 14:19:00 +0200 Subject: [PATCH 1/7] grpc: Split in core, client, server modules --- grpc/grpc-client/build.gradle.kts | 58 +++++ grpc/grpc-client/gradle.properties | 16 ++ .../kotlinx/rpc/grpc/ClientInterceptor.kt | 0 .../kotlin/kotlinx/rpc/grpc/GrpcClient.kt | 10 +- .../kotlin/kotlinx/rpc/grpc/ManagedChannel.kt | 10 +- .../kotlin/kotlinx/rpc/grpc/credentials.kt | 33 +++ .../grpc/descriptor/GrpcServiceDescriptor.kt | 0 .../kotlinx/rpc/grpc/internal/ClientCall.kt | 0 .../rpc/grpc/internal/GrpcCallOptions.kt | 0 .../kotlinx/rpc/grpc/internal/GrpcChannel.kt | 0 .../rpc/grpc/internal/suspendClientCalls.kt | 59 +---- .../kotlinx/rpc/grpc/ManagedChannel.jvm.kt | 10 +- .../kotlinx/rpc/grpc/credentials.jvm.kt | 47 ++++ .../rpc/grpc/internal/ClientCall.jvm.kt | 5 +- .../rpc/grpc/internal/GrpcCallOptions.jvm.kt | 0 .../rpc/grpc/internal/GrpcChannel.jvm.kt | 0 .../kotlinx/rpc/grpc/ManagedChannel.native.kt | 10 +- .../kotlinx/rpc/grpc/credentials.native.kt | 74 +++++++ .../rpc/grpc/internal/ClientCall.native.kt | 0 .../grpc/internal/GrpcCallOptions.native.kt | 0 .../rpc/grpc/internal/GrpcChannel.native.kt | 0 .../rpc/grpc/internal/NativeClientCall.kt | 0 .../rpc/grpc/internal/NativeManagedChannel.kt | 0 grpc/grpc-core/build.gradle.kts | 2 + .../rpc/grpc/internal/CallbackFuture.kt | 10 +- .../rpc/grpc/internal/MethodDescriptor.kt | 2 +- .../kotlinx/rpc/grpc/internal/suspendUtils.kt | 67 ++++++ .../rpc/grpc/internal/MethodDescriptor.jvm.kt | 6 +- .../kotlin/kotlinx/rpc/grpc/credentials.kt | 71 +++++++ .../kotlinx/rpc/grpc/credentials.native.kt | 201 ------------------ .../rpc/grpc/internal/CompletionQueue.kt | 35 +-- .../grpc/internal/MethodDescriptor.native.kt | 2 +- .../rpc/grpc/internal/NativeGrpcLibrary.kt | 6 +- .../kotlin/kotlinx/rpc/grpc/internal/utils.kt | 36 +++- grpc/grpc-ktor-server/build.gradle.kts | 3 +- .../kotlinx/rpc/grpc/ktor/server/Server.kt | 3 - grpc/grpc-server/build.gradle.kts | 58 +++++ grpc/grpc-server/gradle.properties | 16 ++ .../kotlin/kotlinx/rpc/grpc/GrpcServer.kt | 6 +- .../rpc/grpc/MutableHandlerRegistry.kt | 0 .../kotlin/kotlinx/rpc/grpc/Server.kt | 7 +- .../kotlinx/rpc/grpc/ServerInterceptor.kt | 0 .../rpc/grpc/ServerServiceDefinition.kt | 0 .../kotlin/kotlinx/rpc/grpc/credentials.kt | 18 -- .../grpc/descriptor/GrpcServiceDescriptor.kt | 25 +++ .../kotlinx/rpc/grpc/internal/GrpcContext.kt | 0 .../kotlinx/rpc/grpc/internal/ServerCall.kt | 0 .../grpc/internal/ServerMethodDefinition.kt | 0 .../rpc/grpc/internal/suspendServerCalls.kt | 8 +- .../rpc/grpc/MutableHandlerRegistry.jvm.kt | 0 .../kotlin/kotlinx/rpc/grpc/Server.jvm.kt | 7 +- .../rpc/grpc/ServerServiceDefinition.jvm.kt | 0 .../kotlinx/rpc/grpc/credentials.jvm.kt | 34 --- .../kotlinx/rpc/grpc/internal/GrpcContext.kt | 0 .../rpc/grpc/internal/ServerCall.jvm.kt | 0 .../internal/ServerMethodDefinition.jvm.kt | 0 .../rpc/grpc/MutableHandlerRegistry.native.kt | 0 .../kotlin/kotlinx/rpc/grpc/Server.native.kt | 7 +- .../grpc/ServerServiceDefinition.native.kt | 0 .../kotlinx/rpc/grpc/credentials.native.kt | 84 ++++++++ .../rpc/grpc/internal/GrpcContext.native.kt | 0 .../kotlinx/rpc/grpc/internal/NativeServer.kt | 0 .../rpc/grpc/internal/NativeServerCall.kt | 3 +- .../rpc/grpc/internal/ServerCall.native.kt | 0 .../internal/ServerMethodDefinition.native.kt | 0 .../rpc/grpc/internal/serverCallTags.kt | 0 settings.gradle.kts | 2 + 67 files changed, 675 insertions(+), 376 deletions(-) create mode 100644 grpc/grpc-client/build.gradle.kts create mode 100644 grpc/grpc-client/gradle.properties rename grpc/{grpc-core => grpc-client}/src/commonMain/kotlin/kotlinx/rpc/grpc/ClientInterceptor.kt (100%) rename grpc/{grpc-core => grpc-client}/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcClient.kt (98%) rename grpc/{grpc-core => grpc-client}/src/commonMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.kt (91%) create mode 100644 grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt rename grpc/{grpc-core => grpc-client}/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt (100%) rename grpc/{grpc-core => grpc-client}/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.kt (100%) rename grpc/{grpc-core => grpc-client}/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.kt (100%) rename grpc/{grpc-core => grpc-client}/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.kt (100%) rename grpc/{grpc-core => grpc-client}/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendClientCalls.kt (86%) rename grpc/{grpc-core => grpc-client}/src/jvmMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.jvm.kt (88%) create mode 100644 grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt rename grpc/{grpc-core => grpc-client}/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.jvm.kt (91%) rename grpc/{grpc-core => grpc-client}/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.jvm.kt (100%) rename grpc/{grpc-core => grpc-client}/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.jvm.kt (100%) rename grpc/{grpc-core => grpc-client}/src/nativeMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.native.kt (85%) create mode 100644 grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt rename grpc/{grpc-core => grpc-client}/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.native.kt (100%) rename grpc/{grpc-core => grpc-client}/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.native.kt (100%) rename grpc/{grpc-core => grpc-client}/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.native.kt (100%) rename grpc/{grpc-core => grpc-client}/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeClientCall.kt (100%) rename grpc/{grpc-core => grpc-client}/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeManagedChannel.kt (100%) create mode 100644 grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendUtils.kt create mode 100644 grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.kt delete mode 100644 grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt create mode 100644 grpc/grpc-server/build.gradle.kts create mode 100644 grpc/grpc-server/gradle.properties rename grpc/{grpc-core => grpc-server}/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcServer.kt (98%) rename grpc/{grpc-core => grpc-server}/src/commonMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.kt (100%) rename grpc/{grpc-core => grpc-server}/src/commonMain/kotlin/kotlinx/rpc/grpc/Server.kt (94%) rename grpc/{grpc-core => grpc-server}/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerInterceptor.kt (100%) rename grpc/{grpc-core => grpc-server}/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.kt (100%) rename grpc/{grpc-core => grpc-server}/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt (66%) create mode 100644 grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt rename grpc/{grpc-core => grpc-server}/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt (100%) rename grpc/{grpc-core => grpc-server}/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.kt (100%) rename grpc/{grpc-core => grpc-server}/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.kt (100%) rename grpc/{grpc-core => grpc-server}/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendServerCalls.kt (98%) rename grpc/{grpc-core => grpc-server}/src/jvmMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.jvm.kt (100%) rename grpc/{grpc-core => grpc-server}/src/jvmMain/kotlin/kotlinx/rpc/grpc/Server.jvm.kt (87%) rename grpc/{grpc-core => grpc-server}/src/jvmMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.jvm.kt (100%) rename grpc/{grpc-core => grpc-server}/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt (61%) rename grpc/{grpc-core => grpc-server}/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt (100%) rename grpc/{grpc-core => grpc-server}/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.jvm.kt (100%) rename grpc/{grpc-core => grpc-server}/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.jvm.kt (100%) rename grpc/{grpc-core => grpc-server}/src/nativeMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.native.kt (100%) rename grpc/{grpc-core => grpc-server}/src/nativeMain/kotlin/kotlinx/rpc/grpc/Server.native.kt (87%) rename grpc/{grpc-core => grpc-server}/src/nativeMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.native.kt (100%) create mode 100644 grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt rename grpc/{grpc-core => grpc-server}/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.native.kt (100%) rename grpc/{grpc-core => grpc-server}/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServer.kt (100%) rename grpc/{grpc-core => grpc-server}/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServerCall.kt (99%) rename grpc/{grpc-core => grpc-server}/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.native.kt (100%) rename grpc/{grpc-core => grpc-server}/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.native.kt (100%) rename grpc/{grpc-core => grpc-server}/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/serverCallTags.kt (100%) diff --git a/grpc/grpc-client/build.gradle.kts b/grpc/grpc-client/build.gradle.kts new file mode 100644 index 000000000..d88bb57fa --- /dev/null +++ b/grpc/grpc-client/build.gradle.kts @@ -0,0 +1,58 @@ +/* + * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +@file:OptIn(InternalRpcApi::class) + +import kotlinx.rpc.internal.InternalRpcApi + +plugins { + alias(libs.plugins.conventions.kmp) + alias(libs.plugins.kotlinx.rpc) + + // TODO: Check if we can drop these plugins + alias(libs.plugins.atomicfu) + alias(libs.plugins.serialization) // for tests +} + +kotlin { + compilerOptions { + freeCompilerArgs.add("-Xexpect-actual-classes") + } + + sourceSets { + commonMain { + dependencies { + api(projects.grpc.grpcCore) + + implementation(libs.atomicfu) + implementation(libs.kotlinx.io.core) + } + } + + jvmMain { + dependencies { + // TODO: Check if we can drop the API dependencies + api(libs.grpc.api) + api(libs.grpc.util) + api(libs.grpc.stub) + api(libs.grpc.protobuf) + api(libs.grpc.protobuf.lite) + implementation(libs.grpc.kotlin.stub) // causes problems to jpms if api + } + } + + jvmTest { + dependencies { + implementation(libs.grpc.netty) + } + } + + nativeMain { + dependencies { + // required for status.proto + implementation(projects.protobuf.protobufCore) + } + } + } +} diff --git a/grpc/grpc-client/gradle.properties b/grpc/grpc-client/gradle.properties new file mode 100644 index 000000000..1603c27c0 --- /dev/null +++ b/grpc/grpc-client/gradle.properties @@ -0,0 +1,16 @@ +# +# Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. +# +kotlinx.rpc.exclude.wasmWasi=true +kotlinx.rpc.exclude.js=true +kotlinx.rpc.exclude.wasmJs=true +kotlinx.rpc.exclude.mingwX64=true +kotlinx.rpc.exclude.tvosArm64=true +kotlinx.rpc.exclude.tvosSimulatorArm64=true +kotlinx.rpc.exclude.tvosX64=true +kotlinx.rpc.exclude.watchosArm32=true +kotlinx.rpc.exclude.watchosDeviceArm64=true +kotlinx.rpc.exclude.watchosX64=true +# TODO: Remove once we ant to activate WatchOS (these two targets are already prepared for activation) +kotlinx.rpc.exclude.watchosArm64=true +kotlinx.rpc.exclude.watchosSimulatorArm64=true diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/ClientInterceptor.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/ClientInterceptor.kt similarity index 100% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/ClientInterceptor.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/ClientInterceptor.kt diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcClient.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcClient.kt similarity index 98% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcClient.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcClient.kt index 657a98631..c5b09aedc 100644 --- a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcClient.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcClient.kt @@ -19,7 +19,7 @@ import kotlinx.rpc.grpc.internal.MethodType import kotlinx.rpc.grpc.internal.bidirectionalStreamingRpc import kotlinx.rpc.grpc.internal.clientStreamingRpc import kotlinx.rpc.grpc.internal.serverStreamingRpc -import kotlinx.rpc.grpc.internal.type +import kotlinx.rpc.grpc.internal.methodType import kotlinx.rpc.grpc.internal.unaryRpc import kotlinx.rpc.internal.utils.map.RpcInternalConcurrentHashMap import kotlin.time.Duration @@ -57,7 +57,7 @@ public class GrpcClient internal constructor( val callOptions = GrpcDefaultCallOptions val trailers = GrpcMetadata() - return when (methodDescriptor.type) { + return when (methodDescriptor.methodType) { MethodType.UNARY -> unaryRpc( descriptor = methodDescriptor, request = request, @@ -72,7 +72,7 @@ public class GrpcClient internal constructor( trailers = trailers, ) - else -> error("Wrong method type ${methodDescriptor.type}") + else -> error("Wrong method type ${methodDescriptor.methodType}") } } @@ -80,7 +80,7 @@ public class GrpcClient internal constructor( val callOptions = GrpcDefaultCallOptions val trailers = GrpcMetadata() - when (methodDescriptor.type) { + when (methodDescriptor.methodType) { MethodType.SERVER_STREAMING -> serverStreamingRpc( descriptor = methodDescriptor, request = request, @@ -95,7 +95,7 @@ public class GrpcClient internal constructor( trailers = trailers, ) - else -> error("Wrong method type ${methodDescriptor.type}") + else -> error("Wrong method type ${methodDescriptor.methodType}") } } diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.kt similarity index 91% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.kt index ea10366d3..85e5e5928 100644 --- a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.kt @@ -7,6 +7,7 @@ package kotlinx.rpc.grpc import kotlinx.rpc.grpc.internal.GrpcChannel +import kotlinx.rpc.internal.utils.InternalRpcApi import kotlin.time.Duration /** @@ -71,15 +72,18 @@ public expect abstract class ManagedChannelBuilder> public abstract fun overrideAuthority(authority: String): T } -internal expect fun ManagedChannelBuilder( +@InternalRpcApi +public expect fun ManagedChannelBuilder( hostname: String, port: Int, credentials: ClientCredentials? = null, ): ManagedChannelBuilder<*> -internal expect fun ManagedChannelBuilder( +@InternalRpcApi +public expect fun ManagedChannelBuilder( target: String, credentials: ClientCredentials? = null, ): ManagedChannelBuilder<*> -internal expect fun ManagedChannelBuilder<*>.buildChannel(): ManagedChannel +@InternalRpcApi +public expect fun ManagedChannelBuilder<*>.buildChannel(): ManagedChannel diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt new file mode 100644 index 000000000..52226e11b --- /dev/null +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.rpc.grpc + +import kotlinx.rpc.internal.utils.InternalRpcApi + +public expect abstract class ClientCredentials + +public expect class InsecureClientCredentials : ClientCredentials + +// we need a wrapper for InsecureChannelCredentials as our constructor would conflict with the private +// java constructor. +@InternalRpcApi +public expect fun createInsecureClientCredentials(): ClientCredentials + +public expect class TlsClientCredentials : ClientCredentials + +public fun TlsClientCredentials(configure: TlsClientCredentialsBuilder.() -> Unit = {}): ClientCredentials { + val builder = TlsClientCredentialsBuilder() + builder.configure() + return builder.build() +} + +public interface TlsClientCredentialsBuilder { + public fun trustManager(rootCertsPem: String): TlsClientCredentialsBuilder + public fun keyManager(certChainPem: String, privateKeyPem: String): TlsClientCredentialsBuilder +} + +internal expect fun TlsClientCredentialsBuilder(): TlsClientCredentialsBuilder + +internal expect fun TlsClientCredentialsBuilder.build(): ClientCredentials diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt similarity index 100% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.kt similarity index 100% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.kt diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.kt similarity index 100% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.kt diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.kt similarity index 100% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.kt diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendClientCalls.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendClientCalls.kt similarity index 86% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendClientCalls.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendClientCalls.kt index 0621b9810..4d94df322 100644 --- a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendClientCalls.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendClientCalls.kt @@ -36,7 +36,7 @@ public suspend fun GrpcClient.unaryRpc( callOptions: GrpcCallOptions = GrpcDefaultCallOptions, trailers: GrpcMetadata = GrpcMetadata(), ): Response { - val type = descriptor.type + val type = descriptor.methodType require(type == MethodType.UNARY) { "Expected a unary RPC method, but got $descriptor" } @@ -56,7 +56,7 @@ public fun GrpcClient.serverStreamingRpc( callOptions: GrpcCallOptions = GrpcDefaultCallOptions, trailers: GrpcMetadata = GrpcMetadata(), ): Flow { - val type = descriptor.type + val type = descriptor.methodType require(type == MethodType.SERVER_STREAMING) { "Expected a server streaming RPC method, but got $type" } @@ -76,7 +76,7 @@ public suspend fun GrpcClient.clientStreamingRpc( callOptions: GrpcCallOptions = GrpcDefaultCallOptions, trailers: GrpcMetadata = GrpcMetadata(), ): Response { - val type = descriptor.type + val type = descriptor.methodType require(type == MethodType.CLIENT_STREAMING) { "Expected a client streaming RPC method, but got $type" } @@ -96,7 +96,7 @@ public fun GrpcClient.bidirectionalStreamingRpc( callOptions: GrpcCallOptions = GrpcDefaultCallOptions, trailers: GrpcMetadata = GrpcMetadata(), ): Flow { - val type = descriptor.type + val type = descriptor.methodType check(type == MethodType.BIDI_STREAMING) { "Expected a bidirectional streaming method, but got $type" } @@ -153,55 +153,6 @@ private fun GrpcClient.rpcImpl( return clientCallScope.proceed(request) } -// todo really needed? -internal fun Flow.singleOrStatusFlow( - expected: String, - descriptor: Any, -): Flow = flow { - var found = false - collect { - if (!found) { - found = true - emit(it) - } else { - throw StatusException( - Status(StatusCode.INTERNAL, "Expected one $expected for $descriptor but received two") - ) - } - } - - if (!found) { - throw StatusException( - Status(StatusCode.INTERNAL, "Expected one $expected for $descriptor but received none") - ) - } -} - -internal suspend fun Flow.singleOrStatus( - expected: String, - descriptor: Any, -): T = singleOrStatusFlow(expected, descriptor).single() - -internal class Ready(private val isReallyReady: () -> Boolean) { - // A CONFLATED channel never suspends to send, and two notifications of readiness are equivalent - // to one - private val channel = Channel(Channel.CONFLATED) - - fun onReady() { - channel.trySend(Unit).onFailure { e -> - throw e ?: AssertionError( - "Should be impossible; a CONFLATED channel should never return false on offer" - ) - } - } - - suspend fun suspendUntilReady() { - while (!isReallyReady()) { - channel.receive() - } - } -} - private class ClientCallScopeImpl( val client: GrpcClient, override val method: MethodDescriptor, @@ -253,7 +204,7 @@ private class ClientCallScopeImpl( call.start(channelResponseListener(responses, ready), requestHeaders) suspend fun Flow.send() { - if (method.type == MethodType.UNARY || method.type == MethodType.SERVER_STREAMING) { + if (method.methodType == MethodType.UNARY || method.methodType == MethodType.SERVER_STREAMING) { call.sendMessage(single()) } else { ready.suspendUntilReady() diff --git a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.jvm.kt b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.jvm.kt similarity index 88% rename from grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.jvm.kt rename to grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.jvm.kt index ebd658136..61e8b1cdc 100644 --- a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.jvm.kt +++ b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.jvm.kt @@ -8,6 +8,7 @@ package kotlinx.rpc.grpc import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import kotlinx.rpc.internal.utils.InternalRpcApi import kotlin.time.Duration /** @@ -20,11 +21,13 @@ public actual typealias ManagedChannelPlatform = io.grpc.ManagedChannel */ public actual typealias ManagedChannelBuilder = io.grpc.ManagedChannelBuilder -internal actual fun ManagedChannelBuilder<*>.buildChannel(): ManagedChannel { +@InternalRpcApi +public actual fun ManagedChannelBuilder<*>.buildChannel(): ManagedChannel { return build().toKotlin() } -internal actual fun ManagedChannelBuilder( +@InternalRpcApi +public actual fun ManagedChannelBuilder( hostname: String, port: Int, credentials: ClientCredentials?, @@ -33,7 +36,8 @@ internal actual fun ManagedChannelBuilder( return io.grpc.ManagedChannelBuilder.forAddress(hostname, port) } -internal actual fun ManagedChannelBuilder( +@InternalRpcApi +public actual fun ManagedChannelBuilder( target: String, credentials: ClientCredentials?, ): ManagedChannelBuilder<*> { diff --git a/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt new file mode 100644 index 000000000..654a42e44 --- /dev/null +++ b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt @@ -0,0 +1,47 @@ +/* + * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.rpc.grpc + +import kotlinx.rpc.internal.utils.InternalRpcApi + +public actual typealias ClientCredentials = io.grpc.ChannelCredentials + +public actual typealias InsecureClientCredentials = io.grpc.InsecureChannelCredentials + +public actual typealias TlsClientCredentials = io.grpc.TlsChannelCredentials + +// we need a wrapper for InsecureChannelCredentials as our constructor would conflict with the private +// java constructor. +@InternalRpcApi +public actual fun createInsecureClientCredentials(): ClientCredentials { + return InsecureClientCredentials.create() +} + +internal actual fun TlsClientCredentialsBuilder(): TlsClientCredentialsBuilder = JvmTlsCLientCredentialBuilder() +internal actual fun TlsClientCredentialsBuilder.build(): ClientCredentials { + return (this as JvmTlsCLientCredentialBuilder).build() +} + +private class JvmTlsCLientCredentialBuilder : TlsClientCredentialsBuilder { + private var cb = TlsClientCredentials.newBuilder() + + + override fun trustManager(rootCertsPem: String): TlsClientCredentialsBuilder { + cb.trustManager(rootCertsPem.byteInputStream()) + return this + } + + override fun keyManager( + certChainPem: String, + privateKeyPem: String, + ): TlsClientCredentialsBuilder { + cb.keyManager(certChainPem.byteInputStream(), privateKeyPem.byteInputStream()) + return this + } + + fun build(): ClientCredentials { + return cb.build() + } +} diff --git a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.jvm.kt b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.jvm.kt similarity index 91% rename from grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.jvm.kt rename to grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.jvm.kt index 010091179..304fdd9d4 100644 --- a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.jvm.kt +++ b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.jvm.kt @@ -4,13 +4,14 @@ package kotlinx.rpc.grpc.internal -import io.grpc.Metadata import io.grpc.ClientCall +import io.grpc.Metadata import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.Status import kotlinx.rpc.internal.utils.InternalRpcApi -internal actual typealias ClientCall = ClientCall +@InternalRpcApi +public actual typealias ClientCall = ClientCall @InternalRpcApi public actual inline fun clientCallListener( diff --git a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.jvm.kt b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.jvm.kt similarity index 100% rename from grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.jvm.kt rename to grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.jvm.kt diff --git a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.jvm.kt b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.jvm.kt similarity index 100% rename from grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.jvm.kt rename to grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.jvm.kt diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.native.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.native.kt similarity index 85% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.native.kt rename to grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.native.kt index 4f8a27de7..72428bbb4 100644 --- a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.native.kt +++ b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.native.kt @@ -9,6 +9,7 @@ package kotlinx.rpc.grpc import kotlinx.rpc.grpc.internal.GrpcChannel import kotlinx.rpc.grpc.internal.NativeManagedChannel import kotlinx.rpc.grpc.internal.internalError +import kotlinx.rpc.internal.utils.InternalRpcApi /** * Same as [ManagedChannel], but is platform-exposed. @@ -44,12 +45,14 @@ internal class NativeManagedChannelBuilder( } -internal actual fun ManagedChannelBuilder<*>.buildChannel(): ManagedChannel { +@InternalRpcApi +public actual fun ManagedChannelBuilder<*>.buildChannel(): ManagedChannel { check(this is NativeManagedChannelBuilder) { internalError("Wrong builder type, expected NativeManagedChannelBuilder") } return buildChannel() } -internal actual fun ManagedChannelBuilder( +@InternalRpcApi +public actual fun ManagedChannelBuilder( hostname: String, port: Int, credentials: ClientCredentials?, @@ -58,7 +61,8 @@ internal actual fun ManagedChannelBuilder( return NativeManagedChannelBuilder(target = "$hostname:$port", credentials) } -internal actual fun ManagedChannelBuilder(target: String, credentials: ClientCredentials?): ManagedChannelBuilder<*> { +@InternalRpcApi +public actual fun ManagedChannelBuilder(target: String, credentials: ClientCredentials?): ManagedChannelBuilder<*> { val credentials = if (credentials == null) lazy { TlsClientCredentials() } else lazy { credentials } return NativeManagedChannelBuilder(target, credentials) } diff --git a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt new file mode 100644 index 000000000..bc564ea89 --- /dev/null +++ b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt @@ -0,0 +1,74 @@ +/* + * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +@file:OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class) + +package kotlinx.rpc.grpc + +import cnames.structs.grpc_channel_credentials +import kotlinx.cinterop.CPointer +import kotlinx.cinterop.ExperimentalForeignApi +import kotlinx.rpc.internal.utils.InternalRpcApi +import libkgrpc.grpc_channel_credentials_release +import libkgrpc.grpc_insecure_credentials_create +import libkgrpc.grpc_tls_credentials_create +import libkgrpc.grpc_tls_credentials_options_destroy +import kotlin.experimental.ExperimentalNativeApi +import kotlin.native.ref.createCleaner + +public actual abstract class ClientCredentials internal constructor( + internal val raw: CPointer, +) { + @Suppress("unused") + internal val rawCleaner = createCleaner(raw) { + grpc_channel_credentials_release(it) + } +} + +public actual class InsecureClientCredentials internal constructor( + raw: CPointer, +) : ClientCredentials(raw) + +public actual class TlsClientCredentials internal constructor( + raw: CPointer, +) : ClientCredentials(raw) + +@InternalRpcApi +public actual fun createInsecureClientCredentials(): ClientCredentials { + return InsecureClientCredentials( + grpc_insecure_credentials_create() ?: error("grpc_insecure_credentials_create() returned null") + ) +} + +internal actual fun TlsClientCredentialsBuilder(): TlsClientCredentialsBuilder = NativeTlsClientCredentialsBuilder() +internal actual fun TlsClientCredentialsBuilder.build(): ClientCredentials { + return (this as NativeTlsClientCredentialsBuilder).build() +} + +private class NativeTlsClientCredentialsBuilder : TlsClientCredentialsBuilder { + var optionsBuilder = TlsCredentialsOptionsBuilder() + + override fun trustManager(rootCertsPem: String): TlsClientCredentialsBuilder { + optionsBuilder.trustManager(rootCertsPem) + return this + } + + override fun keyManager( + certChainPem: String, + privateKeyPem: String, + ): TlsClientCredentialsBuilder { + optionsBuilder.keyManager(certChainPem, privateKeyPem) + return this + } + + fun build(): ClientCredentials { + val opts = optionsBuilder.build() + val creds = grpc_tls_credentials_create(opts) + ?: run { + grpc_tls_credentials_options_destroy(opts); + error("TLS channel credential creation failed") + } + return TlsClientCredentials(creds) + } +} diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.native.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.native.kt similarity index 100% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.native.kt rename to grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.native.kt diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.native.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.native.kt similarity index 100% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.native.kt rename to grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.native.kt diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.native.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.native.kt similarity index 100% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.native.kt rename to grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.native.kt diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeClientCall.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeClientCall.kt similarity index 100% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeClientCall.kt rename to grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeClientCall.kt diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeManagedChannel.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeManagedChannel.kt similarity index 100% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeManagedChannel.kt rename to grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeManagedChannel.kt diff --git a/grpc/grpc-core/build.gradle.kts b/grpc/grpc-core/build.gradle.kts index 88375babc..d84753c2b 100644 --- a/grpc/grpc-core/build.gradle.kts +++ b/grpc/grpc-core/build.gradle.kts @@ -44,6 +44,8 @@ kotlin { implementation(projects.grpc.grpcCodecKotlinxSerialization) implementation(projects.protobuf.protobufCore) + implementation(projects.grpc.grpcClient) + implementation(projects.grpc.grpcServer) } } diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/CallbackFuture.kt b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/CallbackFuture.kt index 1cd0b907b..6da699493 100644 --- a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/CallbackFuture.kt +++ b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/CallbackFuture.kt @@ -5,11 +5,13 @@ package kotlinx.rpc.grpc.internal import kotlinx.atomicfu.atomic +import kotlinx.rpc.internal.utils.InternalRpcApi /** * Thread safe future for callbacks. */ -internal class CallbackFuture { +@InternalRpcApi +public class CallbackFuture { private sealed interface State { data class Pending(val callbacks: List<(T) -> Unit> = emptyList()) : State data class Done(val value: T) : State @@ -17,7 +19,7 @@ internal class CallbackFuture { private val state = atomic>(State.Pending()) - fun complete(result: T) { + public fun complete(result: T) { var toInvoke: List<(T) -> Unit> while (true) { when (val s = state.value) { @@ -32,7 +34,7 @@ internal class CallbackFuture { for (cb in toInvoke) cb(result) } - fun onComplete(callback: (T) -> Unit) { + public fun onComplete(callback: (T) -> Unit) { while (true) { when (val s = state.value) { is State.Done -> { @@ -47,5 +49,5 @@ internal class CallbackFuture { } } - val isCompleted: Boolean get() = state.value is State.Done + public val isCompleted: Boolean get() = state.value is State.Done } \ No newline at end of file diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.kt b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.kt index fd961723d..92b9ee47e 100644 --- a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.kt +++ b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.kt @@ -26,7 +26,7 @@ public expect class MethodDescriptor { } @InternalRpcApi -internal expect val MethodDescriptor<*, *>.type: MethodType +public expect val MethodDescriptor<*, *>.methodType: MethodType @InternalRpcApi public enum class MethodType { diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendUtils.kt b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendUtils.kt new file mode 100644 index 000000000..4963a745b --- /dev/null +++ b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendUtils.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.rpc.grpc.internal + +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.channels.onFailure +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.single +import kotlinx.rpc.grpc.Status +import kotlinx.rpc.grpc.StatusCode +import kotlinx.rpc.grpc.StatusException +import kotlinx.rpc.internal.utils.InternalRpcApi + +// todo really needed? +@InternalRpcApi +public fun Flow.singleOrStatusFlow( + expected: String, + descriptor: Any, +): Flow = flow { + var found = false + collect { + if (!found) { + found = true + emit(it) + } else { + throw StatusException( + Status(StatusCode.INTERNAL, "Expected one $expected for $descriptor but received two") + ) + } + } + + if (!found) { + throw StatusException( + Status(StatusCode.INTERNAL, "Expected one $expected for $descriptor but received none") + ) + } +} + +@InternalRpcApi +public suspend fun Flow.singleOrStatus( + expected: String, + descriptor: Any, +): T = singleOrStatusFlow(expected, descriptor).single() + +@InternalRpcApi +public class Ready(private val isReallyReady: () -> Boolean) { + // A CONFLATED channel never suspends to send, and two notifications of readiness are equivalent + // to one + private val channel = Channel(Channel.CONFLATED) + + public fun onReady() { + channel.trySend(Unit).onFailure { e -> + throw e ?: AssertionError( + "Should be impossible; a CONFLATED channel should never return false on offer" + ) + } + } + + public suspend fun suspendUntilReady() { + while (!isReallyReady()) { + channel.receive() + } + } +} \ No newline at end of file diff --git a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.jvm.kt b/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.jvm.kt index 5aec16360..265f4f3e7 100644 --- a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.jvm.kt +++ b/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.jvm.kt @@ -8,9 +8,11 @@ import kotlinx.rpc.grpc.codec.MessageCodec import kotlinx.rpc.internal.utils.InternalRpcApi import java.io.InputStream -internal actual typealias MethodDescriptor = io.grpc.MethodDescriptor +@InternalRpcApi +public actual typealias MethodDescriptor = io.grpc.MethodDescriptor -internal actual val MethodDescriptor<*, *>.type: MethodType +@InternalRpcApi +public actual val MethodDescriptor<*, *>.methodType: MethodType get() = when (this.type) { io.grpc.MethodDescriptor.MethodType.UNARY -> MethodType.UNARY io.grpc.MethodDescriptor.MethodType.CLIENT_STREAMING -> MethodType.CLIENT_STREAMING diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.kt b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.kt new file mode 100644 index 000000000..e9f4b18e3 --- /dev/null +++ b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.kt @@ -0,0 +1,71 @@ +/* + * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +@file:OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class) + +package kotlinx.rpc.grpc + +import cnames.structs.grpc_tls_credentials_options +import kotlinx.cinterop.CPointer +import kotlinx.cinterop.ExperimentalForeignApi +import kotlinx.rpc.internal.utils.InternalRpcApi +import libkgrpc.grpc_ssl_client_certificate_request_type +import libkgrpc.grpc_tls_certificate_provider_release +import libkgrpc.grpc_tls_certificate_provider_static_data_create +import libkgrpc.grpc_tls_credentials_options_create +import libkgrpc.grpc_tls_credentials_options_set_cert_request_type +import libkgrpc.grpc_tls_credentials_options_set_certificate_provider +import libkgrpc.grpc_tls_credentials_options_watch_identity_key_cert_pairs +import libkgrpc.grpc_tls_credentials_options_watch_root_certs +import libkgrpc.grpc_tls_identity_pairs_add_pair +import libkgrpc.grpc_tls_identity_pairs_create +import kotlin.experimental.ExperimentalNativeApi + +@InternalRpcApi +public class TlsCredentialsOptionsBuilder { + private var roots: String? = null + private var cert: String? = null + private var key: String? = null + + private var clientAuth: grpc_ssl_client_certificate_request_type? = null + + public fun trustManager(rootCertsPem: String) { + roots = rootCertsPem + } + + public fun keyManager(certChainPem: String, privateKeyPem: String) { + cert = certChainPem; key = privateKeyPem + } + + public fun clientAuth(clientAuth: grpc_ssl_client_certificate_request_type) { + this.clientAuth = clientAuth + } + + public fun build(): CPointer { + val opts = grpc_tls_credentials_options_create() ?: error("alloc opts failed") + + val pairs = if (cert != null && key != null) { + val p = grpc_tls_identity_pairs_create() ?: error("pairs alloc failed") + grpc_tls_identity_pairs_add_pair(p, key, cert); + p + } else null + + if (roots != null || pairs != null) { + val provider = grpc_tls_certificate_provider_static_data_create( + roots, pairs + ) ?: error("provider alloc failed") + grpc_tls_credentials_options_set_certificate_provider(opts, provider) + grpc_tls_certificate_provider_release(provider) + } + + + if (pairs != null) grpc_tls_credentials_options_watch_identity_key_cert_pairs(opts) + if (roots != null) grpc_tls_credentials_options_watch_root_certs(opts) + + val clientAuth = clientAuth + if (clientAuth != null) grpc_tls_credentials_options_set_cert_request_type(opts, clientAuth) + + return opts + } +} diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt deleted file mode 100644 index 77f9e3082..000000000 --- a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. - */ - -@file:OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class) - -package kotlinx.rpc.grpc - -import cnames.structs.grpc_channel_credentials -import cnames.structs.grpc_server_credentials -import cnames.structs.grpc_tls_credentials_options -import kotlinx.cinterop.CPointer -import kotlinx.cinterop.ExperimentalForeignApi -import libkgrpc.grpc_channel_credentials_release -import libkgrpc.grpc_insecure_credentials_create -import libkgrpc.grpc_insecure_server_credentials_create -import libkgrpc.grpc_server_credentials_release -import libkgrpc.grpc_ssl_client_certificate_request_type -import libkgrpc.grpc_tls_certificate_provider_release -import libkgrpc.grpc_tls_certificate_provider_static_data_create -import libkgrpc.grpc_tls_credentials_create -import libkgrpc.grpc_tls_credentials_options_create -import libkgrpc.grpc_tls_credentials_options_destroy -import libkgrpc.grpc_tls_credentials_options_set_cert_request_type -import libkgrpc.grpc_tls_credentials_options_set_certificate_provider -import libkgrpc.grpc_tls_credentials_options_watch_identity_key_cert_pairs -import libkgrpc.grpc_tls_credentials_options_watch_root_certs -import libkgrpc.grpc_tls_identity_pairs_add_pair -import libkgrpc.grpc_tls_identity_pairs_create -import libkgrpc.grpc_tls_server_credentials_create -import kotlin.experimental.ExperimentalNativeApi -import kotlin.native.ref.createCleaner - -public actual abstract class ClientCredentials internal constructor( - internal val raw: CPointer, -) { - @Suppress("unused") - internal val rawCleaner = createCleaner(raw) { - grpc_channel_credentials_release(it) - } -} - -public actual abstract class ServerCredentials internal constructor( - internal val raw: CPointer, -) { - @Suppress("unused") - internal val rawCleaner = createCleaner(raw) { - grpc_server_credentials_release(it) - } -} - -public actual class InsecureClientCredentials internal constructor( - raw: CPointer, -) : ClientCredentials(raw) - -public actual class InsecureServerCredentials internal constructor( - raw: CPointer, -) : ServerCredentials(raw) - -public actual class TlsClientCredentials internal constructor( - raw: CPointer, -) : ClientCredentials(raw) - -public actual class TlsServerCredentials internal constructor( - raw: CPointer, -) : ServerCredentials(raw) - -internal actual fun createInsecureClientCredentials(): ClientCredentials { - return InsecureClientCredentials( - grpc_insecure_credentials_create() ?: error("grpc_insecure_credentials_create() returned null") - ) -} - -internal actual fun createInsecureServerCredentials(): ServerCredentials { - return InsecureServerCredentials( - grpc_insecure_server_credentials_create() ?: error("grpc_insecure_server_credentials_create() returned null") - ) -} - -internal actual fun TlsClientCredentialsBuilder(): TlsClientCredentialsBuilder = NativeTlsClientCredentialsBuilder() -internal actual fun TlsServerCredentialsBuilder( - certChain: String, - privateKey: String, -): TlsServerCredentialsBuilder = NativeTlsServerCredentialsBuilder(certChain, privateKey) - -internal actual fun TlsClientCredentialsBuilder.build(): ClientCredentials { - return (this as NativeTlsClientCredentialsBuilder).build() -} - -internal actual fun TlsServerCredentialsBuilder.build(): ServerCredentials { - return (this as NativeTlsServerCredentialsBuilder).build() -} - -private class NativeTlsClientCredentialsBuilder : TlsClientCredentialsBuilder { - var optionsBuilder = TlsCredentialsOptionsBuilder() - - override fun trustManager(rootCertsPem: String): TlsClientCredentialsBuilder { - optionsBuilder.trustManager(rootCertsPem) - return this - } - - override fun keyManager( - certChainPem: String, - privateKeyPem: String, - ): TlsClientCredentialsBuilder { - optionsBuilder.keyManager(certChainPem, privateKeyPem) - return this - } - - fun build(): ClientCredentials { - val opts = optionsBuilder.build() - val creds = grpc_tls_credentials_create(opts) - ?: run { - grpc_tls_credentials_options_destroy(opts); - error("TLS channel credential creation failed") - } - return TlsClientCredentials(creds) - } -} - -private class NativeTlsServerCredentialsBuilder(certChain: String, privateKey: String) : TlsServerCredentialsBuilder { - var optionsBuilder = TlsCredentialsOptionsBuilder() - - init { - optionsBuilder.keyManager(certChain, privateKey) - } - - override fun trustManager(rootCertsPem: String): TlsServerCredentialsBuilder { - optionsBuilder.trustManager(rootCertsPem) - return this - } - - override fun clientAuth(clientAuth: TlsClientAuth): TlsServerCredentialsBuilder { - optionsBuilder.clientAuth(clientAuth) - return this - } - - fun build(): TlsServerCredentials { - val opts = optionsBuilder.build() - val creds = grpc_tls_server_credentials_create(opts) - ?: run { - grpc_tls_credentials_options_destroy(opts); - error("TLS server credential creation failed") - } - return TlsServerCredentials(creds) - } -} - - -private class TlsCredentialsOptionsBuilder { - private var roots: String? = null - private var cert: String? = null - private var key: String? = null - - private var clientAuth: TlsClientAuth? = null - - fun trustManager(rootCertsPem: String) { - roots = rootCertsPem - } - - fun keyManager(certChainPem: String, privateKeyPem: String) = apply { - cert = certChainPem; key = privateKeyPem - } - - fun clientAuth(clientAuth: TlsClientAuth) { - this.clientAuth = clientAuth - } - - fun build(): CPointer { - val opts = grpc_tls_credentials_options_create() ?: error("alloc opts failed") - - val pairs = if (cert != null && key != null) { - val p = grpc_tls_identity_pairs_create() ?: error("pairs alloc failed") - grpc_tls_identity_pairs_add_pair(p, key, cert); - p - } else null - - if (roots != null || pairs != null) { - val provider = grpc_tls_certificate_provider_static_data_create( - roots, pairs - ) ?: error("provider alloc failed") - grpc_tls_credentials_options_set_certificate_provider(opts, provider) - grpc_tls_certificate_provider_release(provider) - } - - - if (pairs != null) grpc_tls_credentials_options_watch_identity_key_cert_pairs(opts) - if (roots != null) grpc_tls_credentials_options_watch_root_certs(opts) - - val clientAuth = clientAuth - if (clientAuth != null) grpc_tls_credentials_options_set_cert_request_type(opts, clientAuth.toRaw()) - - return opts - } -} - -private fun TlsClientAuth.toRaw(): grpc_ssl_client_certificate_request_type = when (this) { - TlsClientAuth.NONE -> grpc_ssl_client_certificate_request_type.GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE - TlsClientAuth.OPTIONAL -> grpc_ssl_client_certificate_request_type.GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_BUT_DONT_VERIFY - TlsClientAuth.REQUIRE -> grpc_ssl_client_certificate_request_type.GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY -} \ No newline at end of file diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/CompletionQueue.kt b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/CompletionQueue.kt index 59b6cbcd3..da0cc1bdf 100644 --- a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/CompletionQueue.kt +++ b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/CompletionQueue.kt @@ -7,6 +7,7 @@ package kotlinx.rpc.grpc.internal import cnames.structs.grpc_call +import cnames.structs.grpc_completion_queue import kotlinx.atomicfu.atomic import kotlinx.atomicfu.locks.SynchronizedObject import kotlinx.atomicfu.locks.synchronized @@ -24,6 +25,7 @@ import kotlinx.cinterop.ptr import kotlinx.cinterop.reinterpret import kotlinx.cinterop.sizeOf import kotlinx.cinterop.staticCFunction +import kotlinx.rpc.internal.utils.InternalRpcApi import libkgrpc.GRPC_OP_RECV_STATUS_ON_CLIENT import libkgrpc.grpc_call_error import libkgrpc.grpc_call_start_batch @@ -41,26 +43,30 @@ import kotlin.native.ref.createCleaner /** * The result of a batch operation (see [CompletionQueue.runBatch]). */ -internal sealed interface BatchResult { +@InternalRpcApi +public sealed interface BatchResult { /** * Happens when a batch was submitted and... * - the queue is closed * - the queue is in the process of a force shutdown * - the queue is in the process of a normal shutdown, and the batch is a new `RECV_STATUS_ON_CLIENT` batch. */ - object CQShutdown : BatchResult + @InternalRpcApi + public object CQShutdown : BatchResult /** * Happens when the batch couldn't be submitted for some reason. */ - data class SubmitError(val error: grpc_call_error) : BatchResult + @InternalRpcApi + public data class SubmitError(val error: grpc_call_error) : BatchResult /** * Happens when the batch was successfully submitted. * The [future] will be completed with `true` if the batch was successful, `false` otherwise. * In the case of `false`, the status of the `RECV_STATUS_ON_CLIENT` batch will provide the error details. */ - data class Submitted(val future: CallbackFuture) : BatchResult + @InternalRpcApi + public data class Submitted(val future: CallbackFuture) : BatchResult } /** @@ -69,7 +75,8 @@ internal sealed interface BatchResult { * the queue. * Users can attach to the returned [CallbackFuture] if the batch was successfully submitted (see [BatchResult]). */ -internal class CompletionQueue { +@InternalRpcApi +public class CompletionQueue { internal enum class State { OPEN, SHUTTING_DOWN, CLOSED } @@ -100,7 +107,8 @@ internal class CompletionQueue { }.reinterpret() - val raw = grpc_completion_queue_create_for_callback(shutdownFunctor.ptr, null) + public val raw: CPointer? = + grpc_completion_queue_create_for_callback(shutdownFunctor.ptr, null) @Suppress("unused") private val thisStableRefCleaner = createCleaner(thisStableRef) { it.dispose() } @@ -118,7 +126,7 @@ internal class CompletionQueue { * Submits a batch operation to the queue. * See [BatchResult] for possible outcomes. */ - fun runBatch(call: CPointer, ops: CPointer, nOps: ULong): BatchResult { + public fun runBatch(call: CPointer, ops: CPointer, nOps: ULong): BatchResult { if (_shutdownDone.isCompleted) return BatchResult.CQShutdown val completion = CallbackFuture() @@ -162,7 +170,7 @@ internal class CompletionQueue { * Otherwise, the queue allows submitting new batches and shutdown only when there are no more * ongoing batches. */ - fun shutdown(force: Boolean = false): CallbackFuture { + public fun shutdown(force: Boolean = false): CallbackFuture { if (force) { forceShutdown.value = true } @@ -230,14 +238,15 @@ private fun deleteCbTag(tag: CPointer) { * * `this` object is guaranteed to be not garbage collected until the [run] method was executed. */ -internal interface CallbackTag { - fun run(ok: Boolean) +@InternalRpcApi +public interface CallbackTag { + public fun run(ok: Boolean) /** * Creates a pointer to a gRPC callback tag that encapsulates the given `run` function. * It can be passed to callback-based grpc_completion_queue. */ - fun toCbTag(): CPointer { + public fun toCbTag(): CPointer { return newCbTag(this, staticCFunction { functor, ok -> val tag = functor!!.reinterpret() val callbackTag = tag.pointed.user_data!!.asStableRef().get() @@ -247,7 +256,7 @@ internal interface CallbackTag { }) } - companion object { + public companion object { /** * Creates a pointer to a gRPC callback tag that encapsulates the given `run` function. * @@ -257,7 +266,7 @@ internal interface CallbackTag { * @return A pointer to the newly created gRPC callback tag. * It can be passed to callback-based grpc_completion_queue. */ - fun anonymous(run: (ok: Boolean) -> Unit): CPointer { + public fun anonymous(run: (ok: Boolean) -> Unit): CPointer { return object : CallbackTag { override fun run(ok: Boolean) { run(ok) diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.native.kt b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.native.kt index f1a77e0d7..2a7ea4f97 100644 --- a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.native.kt +++ b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.native.kt @@ -57,7 +57,7 @@ public actual class MethodDescriptor internal constructor( } @InternalRpcApi -internal actual val MethodDescriptor<*, *>.type: MethodType +public actual val MethodDescriptor<*, *>.methodType: MethodType get() = this.methodType @InternalRpcApi diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeGrpcLibrary.kt b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeGrpcLibrary.kt index 615295bec..9b50c7414 100644 --- a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeGrpcLibrary.kt +++ b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeGrpcLibrary.kt @@ -10,16 +10,18 @@ import kotlinx.atomicfu.atomic import kotlinx.atomicfu.locks.reentrantLock import kotlinx.atomicfu.locks.withLock import kotlinx.cinterop.ExperimentalForeignApi +import kotlinx.rpc.internal.utils.InternalRpcApi import libkgrpc.grpc_init import libkgrpc.grpc_shutdown import kotlin.experimental.ExperimentalNativeApi -internal object GrpcRuntime { +@InternalRpcApi +public object GrpcRuntime { private val refLock = reentrantLock() private var refs = 0 /** Acquire a runtime reference. Must be closed exactly once. */ - fun acquire(): AutoCloseable { + public fun acquire(): AutoCloseable { refLock.withLock { val prev = refs++ if (prev == 0) grpc_init() diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/utils.kt b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/utils.kt index 289b5b2e5..ce01cddfa 100644 --- a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/utils.kt +++ b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/utils.kt @@ -29,6 +29,7 @@ import kotlinx.io.Source import kotlinx.io.UnsafeIoApi import kotlinx.io.unsafe.UnsafeBufferOperations import kotlinx.rpc.grpc.StatusCode +import kotlinx.rpc.internal.utils.InternalRpcApi import libkgrpc.grpc_byte_buffer import libkgrpc.grpc_byte_buffer_reader import libkgrpc.grpc_byte_buffer_reader_destroy @@ -43,12 +44,15 @@ import libkgrpc.grpc_slice_unref import libkgrpc.grpc_status_code import platform.posix.memcpy -internal fun internalError(message: String): Nothing { +@InternalRpcApi +public fun internalError(message: String): Nothing { error("Unexpected internal error: $message. Please, report the issue here: https://github.com/Kotlin/kotlinx-rpc/issues/new?template=bug_report.md") } + +@InternalRpcApi @OptIn(ExperimentalForeignApi::class, InternalIoApi::class, UnsafeIoApi::class) -internal fun Sink.writeFully(buffer: CPointer, offset: Long, length: Long) { +public fun Sink.writeFully(buffer: CPointer, offset: Long, length: Long) { var consumed = 0L while (consumed < length) { UnsafeBufferOperations.writeToTail(this.buffer, 1) { array, start, endExclusive -> @@ -64,7 +68,8 @@ internal fun Sink.writeFully(buffer: CPointer, offset: Long, length: Lo } } -internal fun grpc_slice.toByteArray(): ByteArray = memScoped { +@InternalRpcApi +public fun grpc_slice.toByteArray(): ByteArray = memScoped { val out = ByteArray(len().toInt()) if (out.isEmpty()) return out @@ -75,7 +80,8 @@ internal fun grpc_slice.toByteArray(): ByteArray = memScoped { } -internal fun CPointer.toKotlin(): Buffer = memScoped { +@InternalRpcApi +public fun CPointer.toKotlin(): Buffer = memScoped { val reader = alloc() check(grpc_byte_buffer_reader_init(reader.ptr, this@toKotlin) == 1) { internalError("Failed to initialized byte buffer.") } @@ -94,7 +100,8 @@ internal fun CPointer.toKotlin(): Buffer = memScoped { return out } -internal fun Source.toGrpcByteBuffer(): CPointer { +@InternalRpcApi +public fun Source.toGrpcByteBuffer(): CPointer { if (this is Buffer) return toGrpcByteBuffer() val tmp = ByteArray(8192) @@ -111,8 +118,9 @@ internal fun Source.toGrpcByteBuffer(): CPointer { return slices.toGrpcByteBuffer() } +@InternalRpcApi @OptIn(UnsafeIoApi::class) -internal fun Buffer.toGrpcByteBuffer(): CPointer { +public fun Buffer.toGrpcByteBuffer(): CPointer { val slices = ArrayList>(4) while (size > 0L) { @@ -151,7 +159,8 @@ private fun ArrayList>.toGrpcByteBuffer(): CPointer { +@InternalRpcApi +public fun grpc_slice.startPtr(): CPointer { return if (this.refcount != null) { this.data.refcounted.bytes!!.reinterpret() } else { @@ -159,7 +168,8 @@ internal fun grpc_slice.startPtr(): CPointer { } } -internal fun grpc_slice.len(): ULong { +@InternalRpcApi +public fun grpc_slice.len(): ULong { return if (this.refcount != null) { this.data.refcounted.length } else { @@ -167,11 +177,14 @@ internal fun grpc_slice.len(): ULong { } } -internal fun String.toGrpcSlice(): CValue { +@InternalRpcApi +public fun String.toGrpcSlice(): CValue { return grpc_slice_from_copied_string(this) } -internal fun grpc_status_code.toKotlin(): StatusCode = when (this) { +@InternalRpcApi +@Suppress("REDUNDANT_ELSE_IN_WHEN") // compilation fails without else case, but gives warning with +public fun grpc_status_code.toKotlin(): StatusCode = when (this) { grpc_status_code.GRPC_STATUS_OK -> StatusCode.OK grpc_status_code.GRPC_STATUS_CANCELLED -> StatusCode.CANCELLED grpc_status_code.GRPC_STATUS_UNKNOWN -> StatusCode.UNKNOWN @@ -193,7 +206,8 @@ internal fun grpc_status_code.toKotlin(): StatusCode = when (this) { else -> error("Invalid status code: $this") } -internal fun StatusCode.toRaw(): grpc_status_code = when (this) { +@InternalRpcApi +public fun StatusCode.toRaw(): grpc_status_code = when (this) { StatusCode.OK -> grpc_status_code.GRPC_STATUS_OK StatusCode.CANCELLED -> grpc_status_code.GRPC_STATUS_CANCELLED StatusCode.UNKNOWN -> grpc_status_code.GRPC_STATUS_UNKNOWN diff --git a/grpc/grpc-ktor-server/build.gradle.kts b/grpc/grpc-ktor-server/build.gradle.kts index 9084429c2..15ebe227d 100644 --- a/grpc/grpc-ktor-server/build.gradle.kts +++ b/grpc/grpc-ktor-server/build.gradle.kts @@ -6,7 +6,6 @@ import kotlinx.rpc.internal.InternalRpcApi import kotlinx.rpc.internal.configureLocalProtocGenDevelopmentDependency -import org.gradle.kotlin.dsl.kotlin plugins { alias(libs.plugins.conventions.kmp) @@ -17,7 +16,7 @@ kotlin { sourceSets { commonMain { dependencies { - api(projects.grpc.grpcCore) + api(projects.grpc.grpcServer) implementation(libs.ktor.server.core) } } diff --git a/grpc/grpc-ktor-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ktor/server/Server.kt b/grpc/grpc-ktor-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ktor/server/Server.kt index 339d79af6..309641850 100644 --- a/grpc/grpc-ktor-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ktor/server/Server.kt +++ b/grpc/grpc-ktor-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ktor/server/Server.kt @@ -7,7 +7,6 @@ package kotlinx.rpc.grpc.ktor.server import io.ktor.server.application.* import io.ktor.server.config.* import io.ktor.util.* -import kotlinx.rpc.RpcServer import kotlinx.rpc.grpc.GrpcServer import kotlinx.rpc.grpc.GrpcServerConfiguration import kotlinx.rpc.grpc.ServerBuilder @@ -48,7 +47,6 @@ public val GrpcServerKey: AttributeKey = AttributeKey("G public fun Application.grpc( port: Int = environment.config.propertyOrNull(GrpcConfigKeys.grpcHostPortPath)?.getAs() ?: 8001, configure: GrpcServerConfiguration.() -> Unit = {}, - builder: RpcServer.() -> Unit, ): GrpcServer { if (attributes.contains(GrpcServerKey)) { error("gRPC Server is already installed, second call to grpc() is not allowed") @@ -61,7 +59,6 @@ public fun Application.grpc( port = port, parentContext = coroutineContext, configure = configure, - builder = builder, ) } diff --git a/grpc/grpc-server/build.gradle.kts b/grpc/grpc-server/build.gradle.kts new file mode 100644 index 000000000..d88bb57fa --- /dev/null +++ b/grpc/grpc-server/build.gradle.kts @@ -0,0 +1,58 @@ +/* + * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +@file:OptIn(InternalRpcApi::class) + +import kotlinx.rpc.internal.InternalRpcApi + +plugins { + alias(libs.plugins.conventions.kmp) + alias(libs.plugins.kotlinx.rpc) + + // TODO: Check if we can drop these plugins + alias(libs.plugins.atomicfu) + alias(libs.plugins.serialization) // for tests +} + +kotlin { + compilerOptions { + freeCompilerArgs.add("-Xexpect-actual-classes") + } + + sourceSets { + commonMain { + dependencies { + api(projects.grpc.grpcCore) + + implementation(libs.atomicfu) + implementation(libs.kotlinx.io.core) + } + } + + jvmMain { + dependencies { + // TODO: Check if we can drop the API dependencies + api(libs.grpc.api) + api(libs.grpc.util) + api(libs.grpc.stub) + api(libs.grpc.protobuf) + api(libs.grpc.protobuf.lite) + implementation(libs.grpc.kotlin.stub) // causes problems to jpms if api + } + } + + jvmTest { + dependencies { + implementation(libs.grpc.netty) + } + } + + nativeMain { + dependencies { + // required for status.proto + implementation(projects.protobuf.protobufCore) + } + } + } +} diff --git a/grpc/grpc-server/gradle.properties b/grpc/grpc-server/gradle.properties new file mode 100644 index 000000000..1603c27c0 --- /dev/null +++ b/grpc/grpc-server/gradle.properties @@ -0,0 +1,16 @@ +# +# Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. +# +kotlinx.rpc.exclude.wasmWasi=true +kotlinx.rpc.exclude.js=true +kotlinx.rpc.exclude.wasmJs=true +kotlinx.rpc.exclude.mingwX64=true +kotlinx.rpc.exclude.tvosArm64=true +kotlinx.rpc.exclude.tvosSimulatorArm64=true +kotlinx.rpc.exclude.tvosX64=true +kotlinx.rpc.exclude.watchosArm32=true +kotlinx.rpc.exclude.watchosDeviceArm64=true +kotlinx.rpc.exclude.watchosX64=true +# TODO: Remove once we ant to activate WatchOS (these two targets are already prepared for activation) +kotlinx.rpc.exclude.watchosArm64=true +kotlinx.rpc.exclude.watchosSimulatorArm64=true diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcServer.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcServer.kt similarity index 98% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcServer.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcServer.kt index dc21c8c6d..a8a74f648 100644 --- a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcServer.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcServer.kt @@ -27,7 +27,7 @@ import kotlinx.rpc.grpc.internal.ServerMethodDefinition import kotlinx.rpc.grpc.internal.bidiStreamingServerMethodDefinition import kotlinx.rpc.grpc.internal.clientStreamingServerMethodDefinition import kotlinx.rpc.grpc.internal.serverStreamingServerMethodDefinition -import kotlinx.rpc.grpc.internal.type +import kotlinx.rpc.grpc.internal.methodType import kotlinx.rpc.grpc.internal.unaryServerMethodDefinition import kotlinx.rpc.internal.utils.map.RpcInternalConcurrentHashMap import kotlin.coroutines.CoroutineContext @@ -116,7 +116,7 @@ public class GrpcServer internal constructor( service: Service, interceptors: List, ): ServerMethodDefinition { - return when (descriptor.type) { + return when (descriptor.methodType) { MethodType.UNARY -> { internalScope.unaryServerMethodDefinition(descriptor, returnType.kType, interceptors) { request -> unaryInvokator.call(service, arrayOf(request)) as ResponseServer @@ -154,7 +154,7 @@ public class GrpcServer internal constructor( } MethodType.UNKNOWN -> { - error("Unsupported method type ${descriptor.type} for ${descriptor.getFullMethodName()}") + error("Unsupported method type ${descriptor.methodType} for ${descriptor.getFullMethodName()}") } } } diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.kt similarity index 100% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.kt diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/Server.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/Server.kt similarity index 94% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/Server.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/Server.kt index 90e4b317b..e65f0a4d5 100644 --- a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/Server.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/Server.kt @@ -6,6 +6,7 @@ package kotlinx.rpc.grpc +import kotlinx.rpc.internal.utils.InternalRpcApi import kotlin.time.Duration /** @@ -31,7 +32,8 @@ public expect abstract class ServerBuilder> { public abstract fun fallbackHandlerRegistry(registry: HandlerRegistry?): T } -internal expect fun ServerBuilder(port: Int, credentials: ServerCredentials? = null): ServerBuilder<*> +@InternalRpcApi +public expect fun ServerBuilder(port: Int, credentials: ServerCredentials? = null): ServerBuilder<*> /** * Server for listening for and dispatching incoming calls. @@ -110,4 +112,5 @@ public interface Server { public suspend fun awaitTermination(duration: Duration = Duration.INFINITE): Server } -internal expect fun Server(builder: ServerBuilder<*>): Server +@InternalRpcApi +public expect fun Server(builder: ServerBuilder<*>): Server diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerInterceptor.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerInterceptor.kt similarity index 100% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerInterceptor.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerInterceptor.kt diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.kt similarity index 100% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.kt diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt similarity index 66% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt index 22717ed3b..5a2f16fe8 100644 --- a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt @@ -4,26 +4,15 @@ package kotlinx.rpc.grpc -public expect abstract class ClientCredentials public expect abstract class ServerCredentials -public expect class InsecureClientCredentials : ClientCredentials public expect class InsecureServerCredentials : ServerCredentials // we need a wrapper for InsecureChannelCredentials as our constructor would conflict with the private -// java constructor. -internal expect fun createInsecureClientCredentials(): ClientCredentials internal expect fun createInsecureServerCredentials(): ServerCredentials -public expect class TlsClientCredentials : ClientCredentials public expect class TlsServerCredentials : ServerCredentials -public fun TlsClientCredentials(configure: TlsClientCredentialsBuilder.() -> Unit = {}): ClientCredentials { - val builder = TlsClientCredentialsBuilder() - builder.configure() - return builder.build() -} - public fun TlsServerCredentials( certChain: String, privateKey: String, @@ -34,11 +23,6 @@ public fun TlsServerCredentials( return builder.build() } -public interface TlsClientCredentialsBuilder { - public fun trustManager(rootCertsPem: String): TlsClientCredentialsBuilder - public fun keyManager(certChainPem: String, privateKeyPem: String): TlsClientCredentialsBuilder -} - public enum class TlsClientAuth { /** Clients will not present any identity. */ NONE, @@ -63,11 +47,9 @@ public interface TlsServerCredentialsBuilder { public fun clientAuth(clientAuth: TlsClientAuth): TlsServerCredentialsBuilder } -internal expect fun TlsClientCredentialsBuilder(): TlsClientCredentialsBuilder internal expect fun TlsServerCredentialsBuilder( certChain: String, privateKey: String, ): TlsServerCredentialsBuilder -internal expect fun TlsClientCredentialsBuilder.build(): ClientCredentials internal expect fun TlsServerCredentialsBuilder.build(): ServerCredentials diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt new file mode 100644 index 000000000..8c2c39b59 --- /dev/null +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +package kotlinx.rpc.grpc.descriptor + +import kotlinx.rpc.descriptor.RpcServiceDescriptor +import kotlinx.rpc.grpc.annotations.Grpc +import kotlinx.rpc.grpc.codec.MessageCodecResolver +import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.internal.ServiceDescriptor +import kotlinx.rpc.internal.utils.InternalRpcApi + +@InternalRpcApi +public interface GrpcServiceDescriptor<@Grpc T : Any> : RpcServiceDescriptor { + public fun delegate(resolver: MessageCodecResolver): GrpcServiceDelegate +} + +@InternalRpcApi +public class GrpcServiceDelegate( + private val methodDescriptorMap: Map>, + public val serviceDescriptor: ServiceDescriptor, +) { + public fun getMethodDescriptor(methodName: String): MethodDescriptor<*, *>? = methodDescriptorMap[methodName] +} diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt similarity index 100% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.kt similarity index 100% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.kt diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.kt similarity index 100% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.kt diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendServerCalls.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendServerCalls.kt similarity index 98% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendServerCalls.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendServerCalls.kt index b56076544..a278695af 100644 --- a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendServerCalls.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendServerCalls.kt @@ -34,7 +34,7 @@ public fun CoroutineScope.unaryServerMethodDefinition( interceptors: List, implementation: suspend (request: Request) -> Response, ): ServerMethodDefinition { - val type = descriptor.type + val type = descriptor.methodType require(type == MethodType.UNARY) { "Expected a unary method descriptor but got $descriptor" } @@ -53,7 +53,7 @@ public fun CoroutineScope.clientStreamingServerMethodDefinit interceptors: List, implementation: suspend (requests: Flow) -> Response, ): ServerMethodDefinition { - val type = descriptor.type + val type = descriptor.methodType require(type == MethodType.CLIENT_STREAMING) { "Expected a client streaming method descriptor but got $descriptor" } @@ -73,7 +73,7 @@ public fun CoroutineScope.serverStreamingServerMethodDefinit interceptors: List, implementation: (request: Request) -> Flow, ): ServerMethodDefinition { - val type = descriptor.type + val type = descriptor.methodType require(type == MethodType.SERVER_STREAMING) { "Expected a server streaming method descriptor but got $descriptor" } @@ -98,7 +98,7 @@ public fun CoroutineScope.bidiStreamingServerMethodDefinitio interceptors: List, implementation: (requests: Flow) -> Flow, ): ServerMethodDefinition { - val type = descriptor.type + val type = descriptor.methodType check(type == MethodType.BIDI_STREAMING) { "Expected a bidi streaming method descriptor but got $descriptor" } diff --git a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.jvm.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.jvm.kt similarity index 100% rename from grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.jvm.kt rename to grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.jvm.kt diff --git a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/Server.jvm.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/Server.jvm.kt similarity index 87% rename from grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/Server.jvm.kt rename to grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/Server.jvm.kt index ba84ffecd..0180dad63 100644 --- a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/Server.jvm.kt +++ b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/Server.jvm.kt @@ -6,6 +6,7 @@ package kotlinx.rpc.grpc import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import kotlinx.rpc.internal.utils.InternalRpcApi import java.util.concurrent.TimeUnit import kotlin.time.Duration @@ -14,12 +15,14 @@ import kotlin.time.Duration */ public actual typealias ServerBuilder = io.grpc.ServerBuilder -internal actual fun ServerBuilder(port: Int, credentials: ServerCredentials?): ServerBuilder<*> { +@InternalRpcApi +public actual fun ServerBuilder(port: Int, credentials: ServerCredentials?): ServerBuilder<*> { if (credentials != null) return io.grpc.Grpc.newServerBuilderForPort(port, credentials) return io.grpc.ServerBuilder.forPort(port) } -internal actual fun Server(builder: ServerBuilder<*>): Server { +@InternalRpcApi +public actual fun Server(builder: ServerBuilder<*>): Server { return builder.build().toKotlin() } diff --git a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.jvm.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.jvm.kt similarity index 100% rename from grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.jvm.kt rename to grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.jvm.kt diff --git a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt similarity index 61% rename from grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt rename to grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt index 12d6213cd..8856e229d 100644 --- a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt +++ b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt @@ -4,63 +4,29 @@ package kotlinx.rpc.grpc -public actual typealias ClientCredentials = io.grpc.ChannelCredentials public actual typealias ServerCredentials = io.grpc.ServerCredentials -public actual typealias InsecureClientCredentials = io.grpc.InsecureChannelCredentials public actual typealias InsecureServerCredentials = io.grpc.InsecureServerCredentials -public actual typealias TlsClientCredentials = io.grpc.TlsChannelCredentials public actual typealias TlsServerCredentials = io.grpc.TlsServerCredentials // we need a wrapper for InsecureChannelCredentials as our constructor would conflict with the private // java constructor. -internal actual fun createInsecureClientCredentials(): ClientCredentials { - return InsecureClientCredentials.create() -} - internal actual fun createInsecureServerCredentials(): ServerCredentials { return InsecureServerCredentials.create() } -internal actual fun TlsClientCredentialsBuilder(): TlsClientCredentialsBuilder = JvmTlsCLientCredentialBuilder() internal actual fun TlsServerCredentialsBuilder( certChain: String, privateKey: String, ): TlsServerCredentialsBuilder = JvmTlsServerCredentialBuilder(certChain, privateKey) -internal actual fun TlsClientCredentialsBuilder.build(): ClientCredentials { - return (this as JvmTlsCLientCredentialBuilder).build() -} - internal actual fun TlsServerCredentialsBuilder.build(): ServerCredentials { return (this as JvmTlsServerCredentialBuilder).build() } -private class JvmTlsCLientCredentialBuilder : TlsClientCredentialsBuilder { - private var cb = TlsClientCredentials.newBuilder() - - - override fun trustManager(rootCertsPem: String): TlsClientCredentialsBuilder { - cb.trustManager(rootCertsPem.byteInputStream()) - return this - } - - override fun keyManager( - certChainPem: String, - privateKeyPem: String, - ): TlsClientCredentialsBuilder { - cb.keyManager(certChainPem.byteInputStream(), privateKeyPem.byteInputStream()) - return this - } - - fun build(): ClientCredentials { - return cb.build() - } -} - private class JvmTlsServerCredentialBuilder(certChain: String, privateKey: String) : TlsServerCredentialsBuilder { private var sb = TlsServerCredentials.newBuilder() diff --git a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt similarity index 100% rename from grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt rename to grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt diff --git a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.jvm.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.jvm.kt similarity index 100% rename from grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.jvm.kt rename to grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.jvm.kt diff --git a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.jvm.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.jvm.kt similarity index 100% rename from grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.jvm.kt rename to grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.jvm.kt diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.native.kt similarity index 100% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.native.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.native.kt diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/Server.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/Server.native.kt similarity index 87% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/Server.native.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/Server.native.kt index 05af2c8cf..c3b1b5460 100644 --- a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/Server.native.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/Server.native.kt @@ -7,6 +7,7 @@ package kotlinx.rpc.grpc import kotlinx.rpc.grpc.internal.NativeServer import kotlinx.rpc.grpc.internal.ServerMethodDefinition +import kotlinx.rpc.internal.utils.InternalRpcApi /** * Platform-specific gRPC server builder. @@ -42,11 +43,13 @@ private class NativeServerBuilder( } -internal actual fun ServerBuilder(port: Int, credentials: ServerCredentials?): ServerBuilder<*> { +@InternalRpcApi +public actual fun ServerBuilder(port: Int, credentials: ServerCredentials?): ServerBuilder<*> { return NativeServerBuilder(port, credentials ?: createInsecureServerCredentials()) } -internal actual fun Server(builder: ServerBuilder<*>): Server { +@InternalRpcApi +public actual fun Server(builder: ServerBuilder<*>): Server { return builder.build() } diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.native.kt similarity index 100% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.native.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.native.kt diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt new file mode 100644 index 000000000..b4702f7b6 --- /dev/null +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt @@ -0,0 +1,84 @@ +/* + * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. + */ + +@file:OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class) + +package kotlinx.rpc.grpc + +import cnames.structs.grpc_server_credentials +import kotlinx.cinterop.CPointer +import kotlinx.cinterop.ExperimentalForeignApi +import libkgrpc.grpc_insecure_server_credentials_create +import libkgrpc.grpc_server_credentials_release +import libkgrpc.grpc_ssl_client_certificate_request_type +import libkgrpc.grpc_tls_credentials_options_destroy +import libkgrpc.grpc_tls_server_credentials_create +import kotlin.experimental.ExperimentalNativeApi +import kotlin.native.ref.createCleaner + +public actual abstract class ServerCredentials internal constructor( + internal val raw: CPointer, +) { + @Suppress("unused") + internal val rawCleaner = createCleaner(raw) { + grpc_server_credentials_release(it) + } +} + +public actual class InsecureServerCredentials internal constructor( + raw: CPointer, +) : ServerCredentials(raw) + +public actual class TlsServerCredentials internal constructor( + raw: CPointer, +) : ServerCredentials(raw) + +internal actual fun createInsecureServerCredentials(): ServerCredentials { + return InsecureServerCredentials( + grpc_insecure_server_credentials_create() ?: error("grpc_insecure_server_credentials_create() returned null") + ) +} + +internal actual fun TlsServerCredentialsBuilder( + certChain: String, + privateKey: String, +): TlsServerCredentialsBuilder = NativeTlsServerCredentialsBuilder(certChain, privateKey) + +internal actual fun TlsServerCredentialsBuilder.build(): ServerCredentials { + return (this as NativeTlsServerCredentialsBuilder).build() +} + +private class NativeTlsServerCredentialsBuilder(certChain: String, privateKey: String) : TlsServerCredentialsBuilder { + var optionsBuilder = TlsCredentialsOptionsBuilder() + + init { + optionsBuilder.keyManager(certChain, privateKey) + } + + override fun trustManager(rootCertsPem: String): TlsServerCredentialsBuilder { + optionsBuilder.trustManager(rootCertsPem) + return this + } + + override fun clientAuth(clientAuth: TlsClientAuth): TlsServerCredentialsBuilder { + optionsBuilder.clientAuth(clientAuth.toRaw()) + return this + } + + fun build(): TlsServerCredentials { + val opts = optionsBuilder.build() + val creds = grpc_tls_server_credentials_create(opts) + ?: run { + grpc_tls_credentials_options_destroy(opts); + error("TLS server credential creation failed") + } + return TlsServerCredentials(creds) + } +} + +private fun TlsClientAuth.toRaw(): grpc_ssl_client_certificate_request_type = when (this) { + TlsClientAuth.NONE -> grpc_ssl_client_certificate_request_type.GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE + TlsClientAuth.OPTIONAL -> grpc_ssl_client_certificate_request_type.GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_BUT_DONT_VERIFY + TlsClientAuth.REQUIRE -> grpc_ssl_client_certificate_request_type.GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY +} \ No newline at end of file diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.native.kt similarity index 100% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.native.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.native.kt diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServer.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServer.kt similarity index 100% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServer.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServer.kt diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServerCall.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServerCall.kt similarity index 99% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServerCall.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServerCall.kt index 00c58b72e..e64c18fa7 100644 --- a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServerCall.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServerCall.kt @@ -25,6 +25,7 @@ import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.Status import kotlinx.rpc.grpc.StatusCode import kotlinx.rpc.grpc.StatusException +import kotlinx.rpc.grpc.statusCode import kotlinx.rpc.protobuf.input.stream.asInputStream import kotlinx.rpc.protobuf.input.stream.asSource import libkgrpc.GRPC_OP_RECV_CLOSE_ON_SERVER @@ -222,7 +223,7 @@ internal class NativeServerCall( val buf = recvPtr.value if (buf == null) { // end-of-stream observed. for UNARY, absence of any request is a protocol violation. - if (methodDescriptor.type == MethodType.UNARY && !receivedFirstMessage) { + if (methodDescriptor.methodType == MethodType.UNARY && !receivedFirstMessage) { cancel( grpc_status_code.GRPC_STATUS_INTERNAL, "Unary call half-closed before receiving a request message" diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.native.kt similarity index 100% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.native.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.native.kt diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.native.kt similarity index 100% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.native.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.native.kt diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/serverCallTags.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/serverCallTags.kt similarity index 100% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/serverCallTags.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/serverCallTags.kt diff --git a/settings.gradle.kts b/settings.gradle.kts index cd883338f..b4ce22042 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -34,6 +34,8 @@ includePublic(":protobuf:protobuf-input-stream") include(":grpc") includePublic(":grpc:grpc-core") +includePublic(":grpc:grpc-client") +includePublic(":grpc:grpc-server") includePublic(":grpc:grpc-ktor-server") includePublic(":grpc:grpc-codec") includePublic(":grpc:grpc-codec-kotlinx-serialization") From 74c90ee0afdef00113df7e671a5677cada2db1d4 Mon Sep 17 00:00:00 2001 From: Johannes Zottele Date: Fri, 3 Oct 2025 19:14:26 +0200 Subject: [PATCH 2/7] grpc: Add sub packages --- .../grpc/{ => client}/ClientInterceptor.kt | 8 +++--- .../rpc/grpc/{ => client}/GrpcClient.kt | 13 +++++----- .../rpc/grpc/{ => client}/ManagedChannel.kt | 4 +-- .../rpc/grpc/{ => client}/credentials.kt | 2 +- .../grpc/{ => client}/internal/ClientCall.kt | 2 +- .../{ => client}/internal/GrpcCallOptions.kt | 2 +- .../grpc/{ => client}/internal/GrpcChannel.kt | 3 ++- .../internal/suspendClientCalls.kt | 12 ++++++--- .../grpc/{ => client}/ManagedChannel.jvm.kt | 10 ++++--- .../rpc/grpc/{ => client}/credentials.jvm.kt | 11 +++++--- .../{ => client}/internal/ClientCall.jvm.kt | 2 +- .../internal/GrpcCallOptions.jvm.kt | 6 +++-- .../{ => client}/internal/GrpcChannel.jvm.kt | 5 ++-- .../{ => client}/ManagedChannel.native.kt | 6 ++--- .../grpc/{ => client}/credentials.native.kt | 3 ++- .../internal/ClientCall.native.kt | 3 ++- .../internal/GrpcCallOptions.native.kt | 3 ++- .../internal/GrpcChannel.native.kt | 5 +++- .../{ => client}/internal/NativeClientCall.kt | 12 +++++++-- .../internal/NativeManagedChannel.kt | 13 +++++++--- .../grpc/descriptor/GrpcServiceDescriptor.kt | 0 .../rpc/grpc/test/BaseGrpcServiceTest.kt | 4 +-- .../kotlinx/rpc/grpc/test/CoreClientTest.kt | 16 ++++++------ .../rpc/grpc/test/RawClientServerTest.kt | 26 +++++++++---------- .../kotlinx/rpc/grpc/test/RawClientTest.kt | 12 ++++----- .../grpc/test/proto/ClientInterceptorTest.kt | 6 ++--- .../rpc/grpc/test/proto/GrpcProtoTest.kt | 12 ++++----- .../rpc/grpc/test/proto/GrpcTlsTest.kt | 8 +++--- .../grpc/test/proto/JavaPackageOptionTest.kt | 2 +- .../grpc/test/proto/ServerInterceptorTest.kt | 6 ++--- .../kotlinx/rpc/grpc/ktor/server/Server.kt | 6 ++--- .../grpc/descriptor/GrpcServiceDescriptor.kt | 25 ------------------ .../rpc/grpc/{ => server}/GrpcServer.kt | 12 ++++----- .../{ => server}/MutableHandlerRegistry.kt | 2 +- .../kotlinx/rpc/grpc/{ => server}/Server.kt | 2 +- .../grpc/{ => server}/ServerInterceptor.kt | 10 ++++--- .../{ => server}/ServerServiceDefinition.kt | 4 +-- .../rpc/grpc/{ => server}/credentials.kt | 2 +- .../grpc/{ => server}/internal/GrpcContext.kt | 2 +- .../grpc/{ => server}/internal/ServerCall.kt | 3 ++- .../internal/ServerMethodDefinition.kt | 3 ++- .../internal/suspendServerCalls.kt | 12 ++++++--- .../MutableHandlerRegistry.jvm.kt | 9 ++++--- .../rpc/grpc/{ => server}/Server.jvm.kt | 5 ++-- .../ServerServiceDefinition.jvm.kt | 4 +-- .../rpc/grpc/{ => server}/credentials.jvm.kt | 2 +- .../grpc/{ => server}/internal/GrpcContext.kt | 5 +++- .../{ => server}/internal/ServerCall.jvm.kt | 5 ++-- .../internal/ServerMethodDefinition.jvm.kt | 5 +++- .../MutableHandlerRegistry.native.kt | 4 +-- .../rpc/grpc/{ => server}/Server.native.kt | 6 ++--- .../ServerServiceDefinition.native.kt | 4 +-- .../grpc/{ => server}/credentials.native.kt | 3 ++- .../internal/GrpcContext.native.kt | 2 +- .../{ => server}/internal/NativeServer.kt | 16 +++++++----- .../{ => server}/internal/NativeServerCall.kt | 12 ++++++++- .../internal/ServerCall.native.kt | 4 ++- .../internal/ServerMethodDefinition.native.kt | 5 +++- .../{ => server}/internal/serverCallTags.kt | 10 ++++--- 59 files changed, 229 insertions(+), 172 deletions(-) rename grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => client}/ClientInterceptor.kt (95%) rename grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => client}/GrpcClient.kt (96%) rename grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => client}/ManagedChannel.kt (97%) rename grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => client}/credentials.kt (97%) rename grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => client}/internal/ClientCall.kt (98%) rename grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => client}/internal/GrpcCallOptions.kt (88%) rename grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => client}/internal/GrpcChannel.kt (84%) rename grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => client}/internal/suspendClientCalls.kt (96%) rename grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/{ => client}/ManagedChannel.jvm.kt (87%) rename grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/{ => client}/credentials.jvm.kt (78%) rename grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/{ => client}/internal/ClientCall.jvm.kt (96%) rename grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/{ => client}/internal/GrpcCallOptions.jvm.kt (63%) rename grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/{ => client}/internal/GrpcChannel.jvm.kt (63%) rename grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => client}/ManagedChannel.native.kt (93%) rename grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => client}/credentials.native.kt (96%) rename grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => client}/internal/ClientCall.native.kt (95%) rename grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => client}/internal/GrpcCallOptions.native.kt (78%) rename grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => client}/internal/GrpcChannel.native.kt (71%) rename grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => client}/internal/NativeClientCall.kt (97%) rename grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => client}/internal/NativeManagedChannel.kt (93%) rename grpc/{grpc-client => grpc-core}/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt (100%) delete mode 100644 grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt rename grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => server}/GrpcServer.kt (97%) rename grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => server}/MutableHandlerRegistry.kt (95%) rename grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => server}/Server.kt (99%) rename grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => server}/ServerInterceptor.kt (94%) rename grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => server}/ServerServiceDefinition.kt (89%) rename grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => server}/credentials.kt (98%) rename grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => server}/internal/GrpcContext.kt (93%) rename grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => server}/internal/ServerCall.kt (94%) rename grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => server}/internal/ServerMethodDefinition.kt (87%) rename grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/{ => server}/internal/suspendServerCalls.kt (96%) rename grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/{ => server}/MutableHandlerRegistry.jvm.kt (54%) rename grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/{ => server}/Server.jvm.kt (93%) rename grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/{ => server}/ServerServiceDefinition.jvm.kt (86%) rename grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/{ => server}/credentials.jvm.kt (98%) rename grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/{ => server}/internal/GrpcContext.kt (82%) rename grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/{ => server}/internal/ServerCall.jvm.kt (86%) rename grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/{ => server}/internal/ServerMethodDefinition.jvm.kt (74%) rename grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => server}/MutableHandlerRegistry.native.kt (96%) rename grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => server}/Server.native.kt (92%) rename grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => server}/ServerServiceDefinition.native.kt (92%) rename grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => server}/credentials.native.kt (97%) rename grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => server}/internal/GrpcContext.native.kt (94%) rename grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => server}/internal/NativeServer.kt (94%) rename grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => server}/internal/NativeServerCall.kt (96%) rename grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => server}/internal/ServerCall.native.kt (94%) rename grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => server}/internal/ServerMethodDefinition.native.kt (81%) rename grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => server}/internal/serverCallTags.kt (93%) diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/ClientInterceptor.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/ClientInterceptor.kt similarity index 95% rename from grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/ClientInterceptor.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/ClientInterceptor.kt index c81d17f90..cd7b15de9 100644 --- a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/ClientInterceptor.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/ClientInterceptor.kt @@ -2,10 +2,12 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.client import kotlinx.coroutines.flow.Flow -import kotlinx.rpc.grpc.internal.GrpcCallOptions +import kotlinx.rpc.grpc.GrpcMetadata +import kotlinx.rpc.grpc.Status +import kotlinx.rpc.grpc.client.internal.GrpcCallOptions import kotlinx.rpc.grpc.internal.MethodDescriptor /** @@ -78,7 +80,7 @@ public interface ClientCallScope { * Cancel the call locally, providing a human-readable [message] and an optional [cause]. * This method won't return and abort all further processing. * - * We made cancel throw a [StatusException] instead of returning, so control flow is explicit and + * We made cancel throw a [kotlinx.rpc.grpc.StatusException] instead of returning, so control flow is explicit and * race conditions between interceptors and the transport layer are avoided. */ public fun cancel(message: String, cause: Throwable? = null): Nothing diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcClient.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/GrpcClient.kt similarity index 96% rename from grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcClient.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/GrpcClient.kt index c5b09aedc..903e3e461 100644 --- a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcClient.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/GrpcClient.kt @@ -2,25 +2,26 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.client import kotlinx.coroutines.flow.Flow import kotlinx.rpc.RpcCall import kotlinx.rpc.RpcClient +import kotlinx.rpc.grpc.GrpcMetadata +import kotlinx.rpc.grpc.client.internal.GrpcDefaultCallOptions +import kotlinx.rpc.grpc.client.internal.bidirectionalStreamingRpc +import kotlinx.rpc.grpc.client.internal.clientStreamingRpc +import kotlinx.rpc.grpc.client.internal.serverStreamingRpc +import kotlinx.rpc.grpc.client.internal.unaryRpc import kotlinx.rpc.grpc.codec.EmptyMessageCodecResolver import kotlinx.rpc.grpc.codec.MessageCodecResolver import kotlinx.rpc.grpc.codec.ThrowingMessageCodecResolver import kotlinx.rpc.grpc.codec.plus import kotlinx.rpc.grpc.descriptor.GrpcServiceDelegate import kotlinx.rpc.grpc.descriptor.GrpcServiceDescriptor -import kotlinx.rpc.grpc.internal.GrpcDefaultCallOptions import kotlinx.rpc.grpc.internal.MethodDescriptor import kotlinx.rpc.grpc.internal.MethodType -import kotlinx.rpc.grpc.internal.bidirectionalStreamingRpc -import kotlinx.rpc.grpc.internal.clientStreamingRpc -import kotlinx.rpc.grpc.internal.serverStreamingRpc import kotlinx.rpc.grpc.internal.methodType -import kotlinx.rpc.grpc.internal.unaryRpc import kotlinx.rpc.internal.utils.map.RpcInternalConcurrentHashMap import kotlin.time.Duration diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.kt similarity index 97% rename from grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.kt index 85e5e5928..d065ca3af 100644 --- a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.kt @@ -4,9 +4,9 @@ @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.client -import kotlinx.rpc.grpc.internal.GrpcChannel +import kotlinx.rpc.grpc.client.internal.GrpcChannel import kotlinx.rpc.internal.utils.InternalRpcApi import kotlin.time.Duration diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/credentials.kt similarity index 97% rename from grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/credentials.kt index 52226e11b..7d069d677 100644 --- a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/credentials.kt @@ -2,7 +2,7 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.client import kotlinx.rpc.internal.utils.InternalRpcApi diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/ClientCall.kt similarity index 98% rename from grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/ClientCall.kt index 7eac10ff4..bd567be32 100644 --- a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/ClientCall.kt @@ -2,7 +2,7 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.client.internal import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.Status diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcCallOptions.kt similarity index 88% rename from grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcCallOptions.kt index 3e96b6230..757a910ba 100644 --- a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcCallOptions.kt @@ -2,7 +2,7 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.client.internal import kotlinx.rpc.internal.utils.InternalRpcApi diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.kt similarity index 84% rename from grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.kt index cbffa0b1b..d268a1957 100644 --- a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.kt @@ -2,8 +2,9 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.client.internal +import kotlinx.rpc.grpc.internal.MethodDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendClientCalls.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/suspendClientCalls.kt similarity index 96% rename from grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendClientCalls.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/suspendClientCalls.kt index 4d94df322..7f66dbb80 100644 --- a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendClientCalls.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/suspendClientCalls.kt @@ -2,7 +2,7 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.client.internal import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineName @@ -17,12 +17,18 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.single import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import kotlinx.rpc.grpc.ClientCallScope -import kotlinx.rpc.grpc.GrpcClient +import kotlinx.rpc.grpc.client.ClientCallScope +import kotlinx.rpc.grpc.client.GrpcClient import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.Status import kotlinx.rpc.grpc.StatusCode import kotlinx.rpc.grpc.StatusException +import kotlinx.rpc.grpc.internal.CallbackFuture +import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.internal.MethodType +import kotlinx.rpc.grpc.internal.Ready +import kotlinx.rpc.grpc.internal.methodType +import kotlinx.rpc.grpc.internal.singleOrStatus import kotlinx.rpc.grpc.statusCode import kotlinx.rpc.internal.utils.InternalRpcApi diff --git a/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.jvm.kt b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.jvm.kt similarity index 87% rename from grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.jvm.kt rename to grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.jvm.kt index 61e8b1cdc..4a1470948 100644 --- a/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.jvm.kt +++ b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.jvm.kt @@ -4,11 +4,13 @@ @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.client +import io.grpc.Grpc import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.rpc.internal.utils.InternalRpcApi +import java.util.concurrent.TimeUnit import kotlin.time.Duration /** @@ -32,7 +34,7 @@ public actual fun ManagedChannelBuilder( port: Int, credentials: ClientCredentials?, ): ManagedChannelBuilder<*> { - if (credentials != null) return io.grpc.Grpc.newChannelBuilderForAddress(hostname, port, credentials) + if (credentials != null) return Grpc.newChannelBuilderForAddress(hostname, port, credentials) return io.grpc.ManagedChannelBuilder.forAddress(hostname, port) } @@ -41,7 +43,7 @@ public actual fun ManagedChannelBuilder( target: String, credentials: ClientCredentials?, ): ManagedChannelBuilder<*> { - if (credentials != null) return io.grpc.Grpc.newChannelBuilder(target, credentials) + if (credentials != null) return Grpc.newChannelBuilder(target, credentials) return io.grpc.ManagedChannelBuilder.forTarget(target) } @@ -58,7 +60,7 @@ private class JvmManagedChannel(private val channel: io.grpc.ManagedChannel) : M override suspend fun awaitTermination(duration: Duration): Boolean { return withContext(Dispatchers.IO) { - channel.awaitTermination(duration.inWholeNanoseconds, java.util.concurrent.TimeUnit.NANOSECONDS) + channel.awaitTermination(duration.inWholeNanoseconds, TimeUnit.NANOSECONDS) } } diff --git a/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/credentials.jvm.kt similarity index 78% rename from grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt rename to grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/credentials.jvm.kt index 654a42e44..7849cbef6 100644 --- a/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt +++ b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/credentials.jvm.kt @@ -2,15 +2,18 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.client +import io.grpc.ChannelCredentials +import io.grpc.InsecureChannelCredentials +import io.grpc.TlsChannelCredentials import kotlinx.rpc.internal.utils.InternalRpcApi -public actual typealias ClientCredentials = io.grpc.ChannelCredentials +public actual typealias ClientCredentials = ChannelCredentials -public actual typealias InsecureClientCredentials = io.grpc.InsecureChannelCredentials +public actual typealias InsecureClientCredentials = InsecureChannelCredentials -public actual typealias TlsClientCredentials = io.grpc.TlsChannelCredentials +public actual typealias TlsClientCredentials = TlsChannelCredentials // we need a wrapper for InsecureChannelCredentials as our constructor would conflict with the private // java constructor. diff --git a/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.jvm.kt b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/internal/ClientCall.jvm.kt similarity index 96% rename from grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.jvm.kt rename to grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/internal/ClientCall.jvm.kt index 304fdd9d4..eeb4244c6 100644 --- a/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.jvm.kt +++ b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/internal/ClientCall.jvm.kt @@ -2,7 +2,7 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.client.internal import io.grpc.ClientCall import io.grpc.Metadata diff --git a/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.jvm.kt b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcCallOptions.jvm.kt similarity index 63% rename from grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.jvm.kt rename to grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcCallOptions.jvm.kt index 927daeaa9..e0f8cb985 100644 --- a/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.jvm.kt +++ b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcCallOptions.jvm.kt @@ -2,12 +2,14 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.client.internal +import io.grpc.CallOptions +import kotlinx.rpc.grpc.client.internal.GrpcCallOptions import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi -public actual typealias GrpcCallOptions = io.grpc.CallOptions +public actual typealias GrpcCallOptions = CallOptions @InternalRpcApi public actual val GrpcDefaultCallOptions: GrpcCallOptions diff --git a/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.jvm.kt b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.jvm.kt similarity index 63% rename from grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.jvm.kt rename to grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.jvm.kt index 15e2ed5fc..98909c3bc 100644 --- a/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.jvm.kt +++ b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.jvm.kt @@ -2,9 +2,10 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.client.internal +import io.grpc.Channel import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi -public actual typealias GrpcChannel = io.grpc.Channel +public actual typealias GrpcChannel = Channel diff --git a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.native.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.native.kt similarity index 93% rename from grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.native.kt rename to grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.native.kt index 72428bbb4..721cc12f9 100644 --- a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/ManagedChannel.native.kt +++ b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.native.kt @@ -4,10 +4,10 @@ @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.client -import kotlinx.rpc.grpc.internal.GrpcChannel -import kotlinx.rpc.grpc.internal.NativeManagedChannel +import kotlinx.rpc.grpc.client.internal.GrpcChannel +import kotlinx.rpc.grpc.client.internal.NativeManagedChannel import kotlinx.rpc.grpc.internal.internalError import kotlinx.rpc.internal.utils.InternalRpcApi diff --git a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/credentials.native.kt similarity index 96% rename from grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt rename to grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/credentials.native.kt index bc564ea89..8dce21492 100644 --- a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt +++ b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/credentials.native.kt @@ -4,11 +4,12 @@ @file:OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class) -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.client import cnames.structs.grpc_channel_credentials import kotlinx.cinterop.CPointer import kotlinx.cinterop.ExperimentalForeignApi +import kotlinx.rpc.grpc.TlsCredentialsOptionsBuilder import kotlinx.rpc.internal.utils.InternalRpcApi import libkgrpc.grpc_channel_credentials_release import libkgrpc.grpc_insecure_credentials_create diff --git a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.native.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/ClientCall.native.kt similarity index 95% rename from grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.native.kt rename to grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/ClientCall.native.kt index ea8c3ed46..3be922853 100644 --- a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ClientCall.native.kt +++ b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/ClientCall.native.kt @@ -4,11 +4,12 @@ @file:OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class) -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.client.internal import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.Status +import kotlinx.rpc.grpc.client.internal.ClientCall import kotlinx.rpc.internal.utils.InternalRpcApi import kotlin.experimental.ExperimentalNativeApi diff --git a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.native.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcCallOptions.native.kt similarity index 78% rename from grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.native.kt rename to grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcCallOptions.native.kt index f9eb10461..b3e4b0e15 100644 --- a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcCallOptions.native.kt +++ b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcCallOptions.native.kt @@ -2,8 +2,9 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.client.internal +import kotlinx.rpc.grpc.client.internal.GrpcCallOptions import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.native.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.native.kt similarity index 71% rename from grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.native.kt rename to grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.native.kt index 74a1d5ca8..1d7140cb9 100644 --- a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcChannel.native.kt +++ b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.native.kt @@ -2,8 +2,11 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.client.internal +import kotlinx.rpc.grpc.client.internal.ClientCall +import kotlinx.rpc.grpc.client.internal.GrpcCallOptions +import kotlinx.rpc.grpc.internal.MethodDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeClientCall.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/NativeClientCall.kt similarity index 97% rename from grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeClientCall.kt rename to grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/NativeClientCall.kt index 9a02dd6e3..924d7b4b4 100644 --- a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeClientCall.kt +++ b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/NativeClientCall.kt @@ -4,7 +4,7 @@ @file:OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class) -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.client.internal import cnames.structs.grpc_call import kotlinx.atomicfu.atomic @@ -26,6 +26,14 @@ import kotlinx.coroutines.CompletableJob import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.Status import kotlinx.rpc.grpc.StatusCode +import kotlinx.rpc.grpc.client.internal.ClientCall +import kotlinx.rpc.grpc.internal.BatchResult +import kotlinx.rpc.grpc.internal.CompletionQueue +import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.internal.internalError +import kotlinx.rpc.grpc.internal.toByteArray +import kotlinx.rpc.grpc.internal.toGrpcByteBuffer +import kotlinx.rpc.grpc.internal.toKotlin import kotlinx.rpc.protobuf.input.stream.asInputStream import kotlinx.rpc.protobuf.input.stream.asSource import libkgrpc.GRPC_OP_RECV_INITIAL_METADATA @@ -179,7 +187,7 @@ internal class NativeClientCall( } /** - * Submits a batch operation to the [CompletionQueue] and handle the returned [BatchResult]. + * Submits a batch operation to the [CompletionQueue] and handle the returned [kotlinx.rpc.grpc.internal.BatchResult]. * If the batch was successfully submitted, [onSuccess] is called. * In any case, [cleanup] is called. */ diff --git a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeManagedChannel.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/NativeManagedChannel.kt similarity index 93% rename from grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeManagedChannel.kt rename to grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/NativeManagedChannel.kt index ba0a7d9f0..53a581c54 100644 --- a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeManagedChannel.kt +++ b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/NativeManagedChannel.kt @@ -4,7 +4,7 @@ @file:OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class) -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.client.internal import cnames.structs.grpc_channel import kotlinx.atomicfu.atomic @@ -19,9 +19,14 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.withTimeoutOrNull -import kotlinx.rpc.grpc.ClientCredentials -import kotlinx.rpc.grpc.ManagedChannel -import kotlinx.rpc.grpc.ManagedChannelPlatform +import kotlinx.rpc.grpc.client.ClientCredentials +import kotlinx.rpc.grpc.client.ManagedChannel +import kotlinx.rpc.grpc.client.ManagedChannelPlatform +import kotlinx.rpc.grpc.internal.CompletionQueue +import kotlinx.rpc.grpc.internal.GrpcRuntime +import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.internal.internalError +import kotlinx.rpc.grpc.internal.toGrpcSlice import libkgrpc.GPR_CLOCK_REALTIME import libkgrpc.GRPC_PROPAGATE_DEFAULTS import libkgrpc.gpr_inf_future diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt similarity index 100% rename from grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt rename to grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt diff --git a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/BaseGrpcServiceTest.kt b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/BaseGrpcServiceTest.kt index 36ac0815b..ed00f6e8d 100644 --- a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/BaseGrpcServiceTest.kt +++ b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/BaseGrpcServiceTest.kt @@ -6,8 +6,8 @@ package kotlinx.rpc.grpc.test import kotlinx.coroutines.delay import kotlinx.coroutines.test.runTest -import kotlinx.rpc.grpc.GrpcClient -import kotlinx.rpc.grpc.GrpcServer +import kotlinx.rpc.grpc.client.GrpcClient +import kotlinx.rpc.grpc.server.GrpcServer import kotlinx.rpc.grpc.annotations.Grpc import kotlinx.rpc.grpc.codec.MessageCodecResolver import kotlinx.rpc.withService diff --git a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/CoreClientTest.kt b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/CoreClientTest.kt index 622ce833d..16c5a17e5 100644 --- a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/CoreClientTest.kt +++ b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/CoreClientTest.kt @@ -9,18 +9,18 @@ import kotlinx.coroutines.runBlocking import kotlinx.coroutines.test.runTest import kotlinx.coroutines.withTimeout import kotlinx.rpc.grpc.GrpcMetadata -import kotlinx.rpc.grpc.GrpcServer -import kotlinx.rpc.grpc.ManagedChannel -import kotlinx.rpc.grpc.ManagedChannelBuilder +import kotlinx.rpc.grpc.server.GrpcServer +import kotlinx.rpc.grpc.client.ManagedChannel +import kotlinx.rpc.grpc.client.ManagedChannelBuilder import kotlinx.rpc.grpc.Status import kotlinx.rpc.grpc.StatusCode -import kotlinx.rpc.grpc.buildChannel -import kotlinx.rpc.grpc.createInsecureClientCredentials -import kotlinx.rpc.grpc.internal.ClientCall -import kotlinx.rpc.grpc.internal.GrpcDefaultCallOptions +import kotlinx.rpc.grpc.client.buildChannel +import kotlinx.rpc.grpc.client.createInsecureClientCredentials +import kotlinx.rpc.grpc.client.internal.ClientCall +import kotlinx.rpc.grpc.client.internal.GrpcDefaultCallOptions import kotlinx.rpc.grpc.internal.MethodDescriptor import kotlinx.rpc.grpc.internal.MethodType -import kotlinx.rpc.grpc.internal.clientCallListener +import kotlinx.rpc.grpc.client.internal.clientCallListener import kotlinx.rpc.grpc.internal.methodDescriptor import kotlinx.rpc.grpc.statusCode import kotlinx.rpc.registerService diff --git a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientServerTest.kt b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientServerTest.kt index d86dfd4a2..233db3939 100644 --- a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientServerTest.kt +++ b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientServerTest.kt @@ -14,24 +14,24 @@ import kotlinx.io.Buffer import kotlinx.io.Source import kotlinx.io.readString import kotlinx.io.writeString -import kotlinx.rpc.grpc.GrpcClient -import kotlinx.rpc.grpc.Server -import kotlinx.rpc.grpc.ServerBuilder +import kotlinx.rpc.grpc.client.GrpcClient +import kotlinx.rpc.grpc.server.Server +import kotlinx.rpc.grpc.server.ServerBuilder import kotlinx.rpc.grpc.codec.SourcedMessageCodec import kotlinx.rpc.grpc.internal.MethodDescriptor import kotlinx.rpc.grpc.internal.MethodType -import kotlinx.rpc.grpc.internal.ServerMethodDefinition -import kotlinx.rpc.grpc.internal.bidiStreamingServerMethodDefinition -import kotlinx.rpc.grpc.internal.bidirectionalStreamingRpc -import kotlinx.rpc.grpc.internal.clientStreamingRpc -import kotlinx.rpc.grpc.internal.clientStreamingServerMethodDefinition +import kotlinx.rpc.grpc.server.internal.ServerMethodDefinition +import kotlinx.rpc.grpc.server.internal.bidiStreamingServerMethodDefinition +import kotlinx.rpc.grpc.client.internal.bidirectionalStreamingRpc +import kotlinx.rpc.grpc.client.internal.clientStreamingRpc +import kotlinx.rpc.grpc.server.internal.clientStreamingServerMethodDefinition import kotlinx.rpc.grpc.internal.methodDescriptor -import kotlinx.rpc.grpc.internal.serverStreamingRpc -import kotlinx.rpc.grpc.internal.serverStreamingServerMethodDefinition +import kotlinx.rpc.grpc.client.internal.serverStreamingRpc +import kotlinx.rpc.grpc.server.internal.serverStreamingServerMethodDefinition import kotlinx.rpc.grpc.internal.serviceDescriptor -import kotlinx.rpc.grpc.internal.unaryRpc -import kotlinx.rpc.grpc.internal.unaryServerMethodDefinition -import kotlinx.rpc.grpc.serverServiceDefinition +import kotlinx.rpc.grpc.client.internal.unaryRpc +import kotlinx.rpc.grpc.server.internal.unaryServerMethodDefinition +import kotlinx.rpc.grpc.server.serverServiceDefinition import kotlin.reflect.typeOf import kotlin.test.Test import kotlin.test.assertEquals diff --git a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientTest.kt b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientTest.kt index bde3d3741..b4ff16dd4 100644 --- a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientTest.kt +++ b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientTest.kt @@ -9,15 +9,15 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.toList import kotlinx.coroutines.test.runTest -import kotlinx.rpc.grpc.GrpcClient -import kotlinx.rpc.grpc.GrpcServer +import kotlinx.rpc.grpc.client.GrpcClient +import kotlinx.rpc.grpc.server.GrpcServer import kotlinx.rpc.grpc.internal.MethodDescriptor import kotlinx.rpc.grpc.internal.MethodType -import kotlinx.rpc.grpc.internal.bidirectionalStreamingRpc -import kotlinx.rpc.grpc.internal.clientStreamingRpc +import kotlinx.rpc.grpc.client.internal.bidirectionalStreamingRpc +import kotlinx.rpc.grpc.client.internal.clientStreamingRpc import kotlinx.rpc.grpc.internal.methodDescriptor -import kotlinx.rpc.grpc.internal.serverStreamingRpc -import kotlinx.rpc.grpc.internal.unaryRpc +import kotlinx.rpc.grpc.client.internal.serverStreamingRpc +import kotlinx.rpc.grpc.client.internal.unaryRpc import kotlinx.rpc.registerService import kotlin.test.Test import kotlin.test.assertEquals diff --git a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/ClientInterceptorTest.kt b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/ClientInterceptorTest.kt index 3ccf86132..e041fa715 100644 --- a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/ClientInterceptorTest.kt +++ b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/ClientInterceptorTest.kt @@ -10,9 +10,9 @@ import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.toList import kotlinx.rpc.RpcServer -import kotlinx.rpc.grpc.ClientCallScope -import kotlinx.rpc.grpc.ClientInterceptor -import kotlinx.rpc.grpc.GrpcClient +import kotlinx.rpc.grpc.client.ClientCallScope +import kotlinx.rpc.grpc.client.ClientInterceptor +import kotlinx.rpc.grpc.client.GrpcClient import kotlinx.rpc.grpc.StatusCode import kotlinx.rpc.grpc.StatusException import kotlinx.rpc.grpc.statusCode diff --git a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/GrpcProtoTest.kt b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/GrpcProtoTest.kt index 367a71b40..6cd3ea810 100644 --- a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/GrpcProtoTest.kt +++ b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/GrpcProtoTest.kt @@ -8,12 +8,12 @@ import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.test.runTest import kotlinx.rpc.RpcServer -import kotlinx.rpc.grpc.ClientCredentials -import kotlinx.rpc.grpc.ClientInterceptor -import kotlinx.rpc.grpc.GrpcClient -import kotlinx.rpc.grpc.GrpcServer -import kotlinx.rpc.grpc.ServerCredentials -import kotlinx.rpc.grpc.ServerInterceptor +import kotlinx.rpc.grpc.client.ClientCredentials +import kotlinx.rpc.grpc.client.ClientInterceptor +import kotlinx.rpc.grpc.client.GrpcClient +import kotlinx.rpc.grpc.server.GrpcServer +import kotlinx.rpc.grpc.server.ServerCredentials +import kotlinx.rpc.grpc.server.ServerInterceptor abstract class GrpcProtoTest { private val serverMutex = Mutex() diff --git a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/GrpcTlsTest.kt b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/GrpcTlsTest.kt index 196629f3f..8665bc948 100644 --- a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/GrpcTlsTest.kt +++ b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/GrpcTlsTest.kt @@ -9,11 +9,11 @@ import hello.HelloService import hello.invoke import kotlinx.coroutines.test.runTest import kotlinx.rpc.RpcServer -import kotlinx.rpc.grpc.GrpcClient +import kotlinx.rpc.grpc.client.GrpcClient import kotlinx.rpc.grpc.StatusCode -import kotlinx.rpc.grpc.TlsClientAuth -import kotlinx.rpc.grpc.TlsClientCredentials -import kotlinx.rpc.grpc.TlsServerCredentials +import kotlinx.rpc.grpc.server.TlsClientAuth +import kotlinx.rpc.grpc.client.TlsClientCredentials +import kotlinx.rpc.grpc.server.TlsServerCredentials import kotlinx.rpc.grpc.test.CA_PEM import kotlinx.rpc.grpc.test.CLIENT_CERT_PEM import kotlinx.rpc.grpc.test.CLIENT_KEY_PEM diff --git a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/JavaPackageOptionTest.kt b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/JavaPackageOptionTest.kt index c0775bbdf..3e06bda81 100644 --- a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/JavaPackageOptionTest.kt +++ b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/JavaPackageOptionTest.kt @@ -10,7 +10,7 @@ import com.google.protobuf.kotlin.invoke import kotlinx.rpc.RpcServer import kotlinx.rpc.grpc.internal.MethodType import kotlinx.rpc.grpc.internal.methodDescriptor -import kotlinx.rpc.grpc.internal.unaryRpc +import kotlinx.rpc.grpc.client.internal.unaryRpc import kotlinx.rpc.grpc.test.withJavaPkg.TheService import kotlinx.rpc.registerService import kotlinx.rpc.withService diff --git a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/ServerInterceptorTest.kt b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/ServerInterceptorTest.kt index 287d40e82..973321dd3 100644 --- a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/ServerInterceptorTest.kt +++ b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/ServerInterceptorTest.kt @@ -10,10 +10,10 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.toList import kotlinx.rpc.RpcServer -import kotlinx.rpc.grpc.GrpcClient +import kotlinx.rpc.grpc.client.GrpcClient import kotlinx.rpc.grpc.GrpcMetadata -import kotlinx.rpc.grpc.ServerCallScope -import kotlinx.rpc.grpc.ServerInterceptor +import kotlinx.rpc.grpc.server.ServerCallScope +import kotlinx.rpc.grpc.server.ServerInterceptor import kotlinx.rpc.grpc.Status import kotlinx.rpc.grpc.StatusCode import kotlinx.rpc.grpc.StatusException diff --git a/grpc/grpc-ktor-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ktor/server/Server.kt b/grpc/grpc-ktor-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ktor/server/Server.kt index 309641850..075dfd02f 100644 --- a/grpc/grpc-ktor-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ktor/server/Server.kt +++ b/grpc/grpc-ktor-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ktor/server/Server.kt @@ -7,9 +7,9 @@ package kotlinx.rpc.grpc.ktor.server import io.ktor.server.application.* import io.ktor.server.config.* import io.ktor.util.* -import kotlinx.rpc.grpc.GrpcServer -import kotlinx.rpc.grpc.GrpcServerConfiguration -import kotlinx.rpc.grpc.ServerBuilder +import kotlinx.rpc.grpc.server.GrpcServer +import kotlinx.rpc.grpc.server.GrpcServerConfiguration +import kotlinx.rpc.grpc.server.ServerBuilder @Suppress("ConstPropertyName") public object GrpcConfigKeys { diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt deleted file mode 100644 index 8c2c39b59..000000000 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. - */ - -package kotlinx.rpc.grpc.descriptor - -import kotlinx.rpc.descriptor.RpcServiceDescriptor -import kotlinx.rpc.grpc.annotations.Grpc -import kotlinx.rpc.grpc.codec.MessageCodecResolver -import kotlinx.rpc.grpc.internal.MethodDescriptor -import kotlinx.rpc.grpc.internal.ServiceDescriptor -import kotlinx.rpc.internal.utils.InternalRpcApi - -@InternalRpcApi -public interface GrpcServiceDescriptor<@Grpc T : Any> : RpcServiceDescriptor { - public fun delegate(resolver: MessageCodecResolver): GrpcServiceDelegate -} - -@InternalRpcApi -public class GrpcServiceDelegate( - private val methodDescriptorMap: Map>, - public val serviceDescriptor: ServiceDescriptor, -) { - public fun getMethodDescriptor(methodName: String): MethodDescriptor<*, *>? = methodDescriptorMap[methodName] -} diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcServer.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/GrpcServer.kt similarity index 97% rename from grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcServer.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/GrpcServer.kt index a8a74f648..692af0b01 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/GrpcServer.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/GrpcServer.kt @@ -2,7 +2,7 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.server import kotlinx.atomicfu.atomic import kotlinx.coroutines.CoroutineScope @@ -23,12 +23,12 @@ import kotlinx.rpc.grpc.codec.plus import kotlinx.rpc.grpc.descriptor.GrpcServiceDescriptor import kotlinx.rpc.grpc.internal.MethodDescriptor import kotlinx.rpc.grpc.internal.MethodType -import kotlinx.rpc.grpc.internal.ServerMethodDefinition -import kotlinx.rpc.grpc.internal.bidiStreamingServerMethodDefinition -import kotlinx.rpc.grpc.internal.clientStreamingServerMethodDefinition -import kotlinx.rpc.grpc.internal.serverStreamingServerMethodDefinition +import kotlinx.rpc.grpc.server.internal.ServerMethodDefinition +import kotlinx.rpc.grpc.server.internal.bidiStreamingServerMethodDefinition +import kotlinx.rpc.grpc.server.internal.clientStreamingServerMethodDefinition +import kotlinx.rpc.grpc.server.internal.serverStreamingServerMethodDefinition import kotlinx.rpc.grpc.internal.methodType -import kotlinx.rpc.grpc.internal.unaryServerMethodDefinition +import kotlinx.rpc.grpc.server.internal.unaryServerMethodDefinition import kotlinx.rpc.internal.utils.map.RpcInternalConcurrentHashMap import kotlin.coroutines.CoroutineContext import kotlin.coroutines.EmptyCoroutineContext diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/MutableHandlerRegistry.kt similarity index 95% rename from grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/MutableHandlerRegistry.kt index 3b629f40b..739d2ca70 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/MutableHandlerRegistry.kt @@ -4,7 +4,7 @@ @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.server /** * Registry of services and their methods used by servers to dispatching incoming calls. diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/Server.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/Server.kt similarity index 99% rename from grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/Server.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/Server.kt index e65f0a4d5..d92b64a3e 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/Server.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/Server.kt @@ -4,7 +4,7 @@ @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.server import kotlinx.rpc.internal.utils.InternalRpcApi import kotlin.time.Duration diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerInterceptor.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/ServerInterceptor.kt similarity index 94% rename from grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerInterceptor.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/ServerInterceptor.kt index 5f24f09f8..88787519f 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerInterceptor.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/ServerInterceptor.kt @@ -2,11 +2,13 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.server import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.FlowCollector -import kotlinx.rpc.grpc.internal.GrpcContext +import kotlinx.rpc.grpc.GrpcMetadata +import kotlinx.rpc.grpc.Status +import kotlinx.rpc.grpc.server.internal.GrpcContext import kotlinx.rpc.grpc.internal.MethodDescriptor /** @@ -55,7 +57,7 @@ public interface ServerCallScope { /** * Register a callback invoked when the call is closed (successfully or exceptionally). - * Provides the final [Status] and the sent [GrpcMetadata] trailers. + * Provides the final [kotlinx.rpc.grpc.Status] and the sent [GrpcMetadata] trailers. */ public fun onClose(block: (Status, GrpcMetadata) -> Unit) @@ -65,7 +67,7 @@ public interface ServerCallScope { * This method does not return (declared as [Nothing]). After calling it, no further messages will be processed * or sent. Prefer setting [responseHeaders]/[responseTrailers] before closing if you need to include metadata. * - * We made close throw a [StatusException] instead of returning, so control flow is explicit and race conditions + * We made close throw a [kotlinx.rpc.grpc.StatusException] instead of returning, so control flow is explicit and race conditions * between interceptors and the service implementation are avoided. */ public fun close(status: Status, trailers: GrpcMetadata = GrpcMetadata()): Nothing diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/ServerServiceDefinition.kt similarity index 89% rename from grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/ServerServiceDefinition.kt index bb49085cb..482b4e01b 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/ServerServiceDefinition.kt @@ -4,9 +4,9 @@ @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.server -import kotlinx.rpc.grpc.internal.ServerMethodDefinition +import kotlinx.rpc.grpc.server.internal.ServerMethodDefinition import kotlinx.rpc.grpc.internal.ServiceDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/credentials.kt similarity index 98% rename from grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/credentials.kt index 5a2f16fe8..65df38880 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/credentials.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/credentials.kt @@ -2,7 +2,7 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.server public expect abstract class ServerCredentials diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/GrpcContext.kt similarity index 93% rename from grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/GrpcContext.kt index 2e624556d..9f046e5a8 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/GrpcContext.kt @@ -2,7 +2,7 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.server.internal import kotlin.coroutines.CoroutineContext diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.kt similarity index 94% rename from grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.kt index cdd32aacd..aee8ac128 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.kt @@ -2,10 +2,11 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.server.internal import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.Status +import kotlinx.rpc.grpc.internal.MethodDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.kt similarity index 87% rename from grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.kt index f6a837375..13eeec67e 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.kt @@ -2,8 +2,9 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.server.internal +import kotlinx.rpc.grpc.internal.MethodDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendServerCalls.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/suspendServerCalls.kt similarity index 96% rename from grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendServerCalls.kt rename to grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/suspendServerCalls.kt index a278695af..f1519353e 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendServerCalls.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/suspendServerCalls.kt @@ -2,7 +2,7 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.server.internal import kotlinx.atomicfu.atomic import kotlinx.coroutines.CancellationException @@ -17,12 +17,18 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.rpc.grpc.GrpcMetadata -import kotlinx.rpc.grpc.ServerCallScope -import kotlinx.rpc.grpc.ServerInterceptor +import kotlinx.rpc.grpc.server.ServerCallScope +import kotlinx.rpc.grpc.server.ServerInterceptor import kotlinx.rpc.grpc.Status import kotlinx.rpc.grpc.StatusCode import kotlinx.rpc.grpc.StatusException import kotlinx.rpc.grpc.StatusRuntimeException +import kotlinx.rpc.grpc.internal.CallbackFuture +import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.internal.MethodType +import kotlinx.rpc.grpc.internal.Ready +import kotlinx.rpc.grpc.internal.methodType +import kotlinx.rpc.grpc.internal.singleOrStatusFlow import kotlinx.rpc.internal.utils.InternalRpcApi import kotlin.reflect.KType import kotlin.reflect.typeOf diff --git a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.jvm.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/MutableHandlerRegistry.jvm.kt similarity index 54% rename from grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.jvm.kt rename to grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/MutableHandlerRegistry.jvm.kt index 7f30530a5..9bc2ed3f5 100644 --- a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.jvm.kt +++ b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/MutableHandlerRegistry.jvm.kt @@ -4,11 +4,14 @@ @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.server + +import io.grpc.HandlerRegistry +import io.grpc.util.MutableHandlerRegistry /** * Registry of services and their methods used by servers to dispatching incoming calls. */ -public actual typealias HandlerRegistry = io.grpc.HandlerRegistry +public actual typealias HandlerRegistry = HandlerRegistry -internal actual typealias MutableHandlerRegistry = io.grpc.util.MutableHandlerRegistry +internal actual typealias MutableHandlerRegistry = MutableHandlerRegistry diff --git a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/Server.jvm.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/Server.jvm.kt similarity index 93% rename from grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/Server.jvm.kt rename to grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/Server.jvm.kt index 0180dad63..6a30fe571 100644 --- a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/Server.jvm.kt +++ b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/Server.jvm.kt @@ -2,8 +2,9 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.server +import io.grpc.Grpc import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.rpc.internal.utils.InternalRpcApi @@ -17,7 +18,7 @@ public actual typealias ServerBuilder = io.grpc.ServerBuilder @InternalRpcApi public actual fun ServerBuilder(port: Int, credentials: ServerCredentials?): ServerBuilder<*> { - if (credentials != null) return io.grpc.Grpc.newServerBuilderForPort(port, credentials) + if (credentials != null) return Grpc.newServerBuilderForPort(port, credentials) return io.grpc.ServerBuilder.forPort(port) } diff --git a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.jvm.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/ServerServiceDefinition.jvm.kt similarity index 86% rename from grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.jvm.kt rename to grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/ServerServiceDefinition.jvm.kt index 295608efb..d64ef3afa 100644 --- a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.jvm.kt +++ b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/ServerServiceDefinition.jvm.kt @@ -2,9 +2,9 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.server -import kotlinx.rpc.grpc.internal.ServerMethodDefinition +import kotlinx.rpc.grpc.server.internal.ServerMethodDefinition import kotlinx.rpc.grpc.internal.ServiceDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi diff --git a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/credentials.jvm.kt similarity index 98% rename from grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt rename to grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/credentials.jvm.kt index 8856e229d..36b76a105 100644 --- a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/credentials.jvm.kt +++ b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/credentials.jvm.kt @@ -2,7 +2,7 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.server public actual typealias ServerCredentials = io.grpc.ServerCredentials diff --git a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/internal/GrpcContext.kt similarity index 82% rename from grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt rename to grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/internal/GrpcContext.kt index 1a65baf6e..91f7d378d 100644 --- a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.kt +++ b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/internal/GrpcContext.kt @@ -2,10 +2,13 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.server.internal import io.grpc.Context import kotlinx.coroutines.ThreadContextElement +import kotlinx.rpc.grpc.server.internal.CurrentGrpcContext +import kotlinx.rpc.grpc.server.internal.GrpcContext +import kotlinx.rpc.grpc.server.internal.GrpcContextElement import kotlin.coroutines.CoroutineContext public actual typealias GrpcContext = Context diff --git a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.jvm.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.jvm.kt similarity index 86% rename from grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.jvm.kt rename to grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.jvm.kt index b441ba852..c419f0313 100644 --- a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.jvm.kt +++ b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.jvm.kt @@ -2,13 +2,14 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.server.internal import io.grpc.ServerCall +import io.grpc.ServerCallHandler import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi -public actual typealias ServerCallHandler = io.grpc.ServerCallHandler +public actual typealias ServerCallHandler = ServerCallHandler @InternalRpcApi public actual typealias ServerCall = ServerCall diff --git a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.jvm.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.jvm.kt similarity index 74% rename from grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.jvm.kt rename to grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.jvm.kt index ca9d37f27..272dcc2c3 100644 --- a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.jvm.kt +++ b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.jvm.kt @@ -2,8 +2,11 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.server.internal +import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.server.internal.ServerCallHandler +import kotlinx.rpc.grpc.server.internal.ServerMethodDefinition import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/MutableHandlerRegistry.native.kt similarity index 96% rename from grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.native.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/MutableHandlerRegistry.native.kt index 08e0c4bd2..843505cee 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/MutableHandlerRegistry.native.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/MutableHandlerRegistry.native.kt @@ -4,10 +4,10 @@ @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.server import kotlinx.rpc.grpc.internal.MethodDescriptor -import kotlinx.rpc.grpc.internal.ServerMethodDefinition +import kotlinx.rpc.grpc.server.internal.ServerMethodDefinition import kotlinx.rpc.internal.utils.map.RpcInternalConcurrentHashMap /** diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/Server.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/Server.native.kt similarity index 92% rename from grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/Server.native.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/Server.native.kt index c3b1b5460..83baacf8c 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/Server.native.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/Server.native.kt @@ -2,11 +2,11 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.server -import kotlinx.rpc.grpc.internal.NativeServer -import kotlinx.rpc.grpc.internal.ServerMethodDefinition +import kotlinx.rpc.grpc.server.internal.NativeServer +import kotlinx.rpc.grpc.server.internal.ServerMethodDefinition import kotlinx.rpc.internal.utils.InternalRpcApi /** diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/ServerServiceDefinition.native.kt similarity index 92% rename from grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.native.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/ServerServiceDefinition.native.kt index 31977c8b3..81600356f 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/ServerServiceDefinition.native.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/ServerServiceDefinition.native.kt @@ -2,9 +2,9 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.server -import kotlinx.rpc.grpc.internal.ServerMethodDefinition +import kotlinx.rpc.grpc.server.internal.ServerMethodDefinition import kotlinx.rpc.grpc.internal.ServiceDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/credentials.native.kt similarity index 97% rename from grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/credentials.native.kt index b4702f7b6..c60e87de9 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.native.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/credentials.native.kt @@ -4,11 +4,12 @@ @file:OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class) -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.server import cnames.structs.grpc_server_credentials import kotlinx.cinterop.CPointer import kotlinx.cinterop.ExperimentalForeignApi +import kotlinx.rpc.grpc.TlsCredentialsOptionsBuilder import libkgrpc.grpc_insecure_server_credentials_create import libkgrpc.grpc_server_credentials_release import libkgrpc.grpc_ssl_client_certificate_request_type diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/GrpcContext.native.kt similarity index 94% rename from grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.native.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/GrpcContext.native.kt index 9b275708c..19309a81b 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/GrpcContext.native.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/GrpcContext.native.kt @@ -2,7 +2,7 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.server.internal import kotlin.coroutines.CoroutineContext diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServer.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/NativeServer.kt similarity index 94% rename from grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServer.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/NativeServer.kt index a5b26084f..970565757 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServer.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/NativeServer.kt @@ -4,7 +4,7 @@ @file:OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class) -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.server.internal import cnames.structs.grpc_server import kotlinx.atomicfu.atomic @@ -17,10 +17,14 @@ import kotlinx.cinterop.asStableRef import kotlinx.cinterop.staticCFunction import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.withTimeoutOrNull -import kotlinx.rpc.grpc.HandlerRegistry -import kotlinx.rpc.grpc.Server -import kotlinx.rpc.grpc.ServerCredentials -import kotlinx.rpc.grpc.ServerServiceDefinition +import kotlinx.rpc.grpc.internal.CallbackTag +import kotlinx.rpc.grpc.internal.CompletionQueue +import kotlinx.rpc.grpc.internal.GrpcRuntime +import kotlinx.rpc.grpc.internal.internalError +import kotlinx.rpc.grpc.server.HandlerRegistry +import kotlinx.rpc.grpc.server.Server +import kotlinx.rpc.grpc.server.ServerCredentials +import kotlinx.rpc.grpc.server.ServerServiceDefinition import libkgrpc.grpc_server_add_http2_port import libkgrpc.grpc_server_cancel_all_calls import libkgrpc.grpc_server_create @@ -96,7 +100,7 @@ internal class NativeServer( return this } - grpc_server_shutdown_and_notify(raw, cq.raw, CallbackTag.anonymous { + grpc_server_shutdown_and_notify(raw, cq.raw, CallbackTag.Companion.anonymous { cq.shutdown().onComplete { dispose() isTerminatedInternal.complete(Unit) diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServerCall.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/NativeServerCall.kt similarity index 96% rename from grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServerCall.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/NativeServerCall.kt index e64c18fa7..c8401d465 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/NativeServerCall.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/NativeServerCall.kt @@ -4,7 +4,7 @@ @file:OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class) -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.server.internal import cnames.structs.grpc_call import kotlinx.atomicfu.atomic @@ -25,6 +25,16 @@ import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.Status import kotlinx.rpc.grpc.StatusCode import kotlinx.rpc.grpc.StatusException +import kotlinx.rpc.grpc.internal.BatchResult +import kotlinx.rpc.grpc.internal.CompletionQueue +import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.internal.MethodType +import kotlinx.rpc.grpc.internal.internalError +import kotlinx.rpc.grpc.internal.methodType +import kotlinx.rpc.grpc.internal.toGrpcByteBuffer +import kotlinx.rpc.grpc.internal.toGrpcSlice +import kotlinx.rpc.grpc.internal.toKotlin +import kotlinx.rpc.grpc.internal.toRaw import kotlinx.rpc.grpc.statusCode import kotlinx.rpc.protobuf.input.stream.asInputStream import kotlinx.rpc.protobuf.input.stream.asSource diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.native.kt similarity index 94% rename from grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.native.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.native.kt index e57f2eb96..67d74b4c2 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerCall.native.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.native.kt @@ -2,10 +2,12 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.server.internal import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.Status +import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.server.internal.ServerCall import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.native.kt similarity index 81% rename from grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.native.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.native.kt index b0e625840..774f6428d 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServerMethodDefinition.native.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.native.kt @@ -2,8 +2,11 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.server.internal +import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.server.internal.ServerCallHandler +import kotlinx.rpc.grpc.server.internal.ServerMethodDefinition import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/serverCallTags.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/serverCallTags.kt similarity index 93% rename from grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/serverCallTags.kt rename to grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/serverCallTags.kt index ef24ff71e..1762575e8 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/serverCallTags.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/serverCallTags.kt @@ -4,7 +4,7 @@ @file:OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class) -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.server.internal import cnames.structs.grpc_call import kotlinx.cinterop.Arena @@ -16,7 +16,11 @@ import kotlinx.cinterop.cValue import kotlinx.cinterop.ptr import kotlinx.cinterop.value import kotlinx.rpc.grpc.GrpcMetadata -import kotlinx.rpc.grpc.HandlerRegistry +import kotlinx.rpc.grpc.internal.CallbackTag +import kotlinx.rpc.grpc.internal.CompletionQueue +import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.internal.toByteArray +import kotlinx.rpc.grpc.server.HandlerRegistry import libkgrpc.gpr_timespec import libkgrpc.grpc_call_details import libkgrpc.grpc_call_details_destroy @@ -28,7 +32,7 @@ import libkgrpc.kgrpc_registered_call_allocation import kotlin.experimental.ExperimentalNativeApi /** - * A [CallbackTag] that is passed to a completion queue and invoked when an incoming gRPC call for the + * A [kotlinx.rpc.grpc.internal.CallbackTag] that is passed to a completion queue and invoked when an incoming gRPC call for the * registered [method] must be handled. * * The [toRawCallAllocation] method provides a [kgrpc_registered_call_allocation] used by the grpc runtime From f750aa20c35c895bd0170d5db6952e59928613a7 Mon Sep 17 00:00:00 2001 From: Johannes Zottele Date: Sat, 4 Oct 2025 18:20:29 +0200 Subject: [PATCH 3/7] grpc: Move internal classes --- .../kotlinx/rpc/codegen/extension/RpcIrContext.kt | 6 +++--- .../kotlinx/rpc/grpc/client/ClientInterceptor.kt | 2 +- .../kotlin/kotlinx/rpc/grpc/client/GrpcClient.kt | 11 +++++++---- .../kotlinx/rpc/grpc/client/internal/GrpcChannel.kt | 2 +- .../rpc/grpc/client/{ => internal}/ManagedChannel.kt | 7 +++++-- .../rpc/grpc/client/internal/suspendClientCalls.kt | 6 +++--- .../grpc/client/{ => internal}/ManagedChannel.jvm.kt | 5 ++++- .../kotlinx/rpc/grpc/client/credentials.native.kt | 2 +- .../rpc/grpc/client/internal/GrpcChannel.native.kt | 4 +--- .../client/{ => internal}/ManagedChannel.native.kt | 8 +++++--- .../rpc/grpc/client/internal/NativeClientCall.kt | 3 +-- .../rpc/grpc/client/internal/NativeManagedChannel.kt | 4 +--- .../rpc/grpc/descriptor/GrpcServiceDescriptor.kt | 1 - .../{internal => descriptor}/MethodDescriptor.kt | 5 +---- .../kotlinx/rpc/grpc/internal/ServiceDescriptor.kt | 1 + .../kotlin/kotlinx/rpc/grpc/test/CoreClientTest.kt | 12 ++++++------ .../kotlinx/rpc/grpc/test/RawClientServerTest.kt | 6 +++--- .../kotlin/kotlinx/rpc/grpc/test/RawClientTest.kt | 6 +++--- .../rpc/grpc/test/proto/JavaPackageOptionTest.kt | 4 ++-- .../{internal => descriptor}/MethodDescriptor.jvm.kt | 4 +--- .../rpc/grpc/internal/ServiceDescriptor.jvm.kt | 1 + .../MethodDescriptor.native.kt | 4 +--- .../rpc/grpc/internal/ServiceDescriptor.native.kt | 1 + .../kotlinx/rpc/grpc/{ => internal}/credentials.kt | 2 +- .../kotlin/kotlinx/rpc/grpc/server/GrpcServer.kt | 6 +++--- .../kotlinx/rpc/grpc/server/ServerInterceptor.kt | 2 +- .../kotlinx/rpc/grpc/server/internal/ServerCall.kt | 2 +- .../grpc/server/internal/ServerMethodDefinition.kt | 2 +- .../rpc/grpc/server/internal/suspendServerCalls.kt | 6 +++--- .../server/internal/ServerMethodDefinition.jvm.kt | 4 +--- .../rpc/grpc/server/MutableHandlerRegistry.native.kt | 2 +- .../kotlinx/rpc/grpc/server/credentials.native.kt | 2 +- .../rpc/grpc/server/internal/NativeServerCall.kt | 6 +++--- .../rpc/grpc/server/internal/ServerCall.native.kt | 3 +-- .../server/internal/ServerMethodDefinition.native.kt | 4 +--- .../rpc/grpc/server/internal/serverCallTags.kt | 2 +- 36 files changed, 72 insertions(+), 76 deletions(-) rename grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/{ => internal}/ManagedChannel.kt (95%) rename grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/{ => internal}/ManagedChannel.jvm.kt (94%) rename grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/{ => internal}/ManagedChannel.native.kt (92%) rename grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/{internal => descriptor}/MethodDescriptor.kt (95%) rename grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/{internal => descriptor}/MethodDescriptor.jvm.kt (97%) rename grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/{internal => descriptor}/MethodDescriptor.native.kt (98%) rename grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/{ => internal}/credentials.kt (98%) diff --git a/compiler-plugin/compiler-plugin-backend/src/main/kotlin/kotlinx/rpc/codegen/extension/RpcIrContext.kt b/compiler-plugin/compiler-plugin-backend/src/main/kotlin/kotlinx/rpc/codegen/extension/RpcIrContext.kt index 84fc4d4c1..f5eb807c3 100644 --- a/compiler-plugin/compiler-plugin-backend/src/main/kotlin/kotlinx/rpc/codegen/extension/RpcIrContext.kt +++ b/compiler-plugin/compiler-plugin-backend/src/main/kotlin/kotlinx/rpc/codegen/extension/RpcIrContext.kt @@ -84,12 +84,12 @@ internal class RpcIrContext( if (isJvmTarget()) { getIrClassSymbol("io.grpc", "MethodDescriptor") } else { - getIrClassSymbol("kotlinx.rpc.grpc.internal", "MethodDescriptor") + getIrClassSymbol("kotlinx.rpc.grpc.descriptor", "MethodDescriptor") } } val grpcPlatformMethodType by lazy { - getIrClassSymbol("kotlinx.rpc.grpc.internal", "MethodType") + getIrClassSymbol("kotlinx.rpc.grpc.descriptor", "MethodType") } val grpcPlatformMethodTypeUnary by lazy { @@ -248,7 +248,7 @@ internal class RpcIrContext( } val methodDescriptor by lazy { - namedFunction("kotlinx.rpc.grpc.internal", "methodDescriptor") + namedFunction("kotlinx.rpc.grpc.descriptor", "methodDescriptor") } val grpcServiceDescriptorDelegate by lazy { diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/ClientInterceptor.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/ClientInterceptor.kt index cd7b15de9..8b9dc9390 100644 --- a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/ClientInterceptor.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/ClientInterceptor.kt @@ -8,7 +8,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.Status import kotlinx.rpc.grpc.client.internal.GrpcCallOptions -import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodDescriptor /** * The scope of a single outgoing gRPC client call observed by a [ClientInterceptor]. diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/GrpcClient.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/GrpcClient.kt index 903e3e461..31ce8ad41 100644 --- a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/GrpcClient.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/GrpcClient.kt @@ -9,7 +9,10 @@ import kotlinx.rpc.RpcCall import kotlinx.rpc.RpcClient import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.client.internal.GrpcDefaultCallOptions +import kotlinx.rpc.grpc.client.internal.ManagedChannel +import kotlinx.rpc.grpc.client.internal.ManagedChannelBuilder import kotlinx.rpc.grpc.client.internal.bidirectionalStreamingRpc +import kotlinx.rpc.grpc.client.internal.buildChannel import kotlinx.rpc.grpc.client.internal.clientStreamingRpc import kotlinx.rpc.grpc.client.internal.serverStreamingRpc import kotlinx.rpc.grpc.client.internal.unaryRpc @@ -19,9 +22,9 @@ import kotlinx.rpc.grpc.codec.ThrowingMessageCodecResolver import kotlinx.rpc.grpc.codec.plus import kotlinx.rpc.grpc.descriptor.GrpcServiceDelegate import kotlinx.rpc.grpc.descriptor.GrpcServiceDescriptor -import kotlinx.rpc.grpc.internal.MethodDescriptor -import kotlinx.rpc.grpc.internal.MethodType -import kotlinx.rpc.grpc.internal.methodType +import kotlinx.rpc.grpc.descriptor.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodType +import kotlinx.rpc.grpc.descriptor.methodType import kotlinx.rpc.internal.utils.map.RpcInternalConcurrentHashMap import kotlin.time.Duration @@ -30,7 +33,7 @@ private typealias RequestClient = Any /** * GrpcClient manages gRPC communication by providing implementation for making asynchronous RPC calls. * - * @field channel The [ManagedChannel] used to communicate with remote gRPC services. + * @field channel The [kotlinx.rpc.grpc.client.internal.ManagedChannel] used to communicate with remote gRPC services. */ public class GrpcClient internal constructor( internal val channel: ManagedChannel, diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.kt index d268a1957..e064eb6e2 100644 --- a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.kt @@ -4,7 +4,7 @@ package kotlinx.rpc.grpc.client.internal -import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/ManagedChannel.kt similarity index 95% rename from grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.kt rename to grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/ManagedChannel.kt index d065ca3af..c6239c781 100644 --- a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/ManagedChannel.kt @@ -4,15 +4,16 @@ @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") -package kotlinx.rpc.grpc.client +package kotlinx.rpc.grpc.client.internal -import kotlinx.rpc.grpc.client.internal.GrpcChannel +import kotlinx.rpc.grpc.client.ClientCredentials import kotlinx.rpc.internal.utils.InternalRpcApi import kotlin.time.Duration /** * Same as [ManagedChannel], but is platform-exposed. */ +@InternalRpcApi public expect abstract class ManagedChannelPlatform : GrpcChannel /** @@ -23,6 +24,7 @@ public expect abstract class ManagedChannelPlatform : GrpcChannel * * Provides lifecycle management. */ +@InternalRpcApi public interface ManagedChannel { /** * Returns whether the channel is shutdown. @@ -68,6 +70,7 @@ public interface ManagedChannel { /** * Builder class for [ManagedChannel]. */ +@InternalRpcApi public expect abstract class ManagedChannelBuilder> { public abstract fun overrideAuthority(authority: String): T } diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/suspendClientCalls.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/suspendClientCalls.kt index 7f66dbb80..bfb6ef30e 100644 --- a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/suspendClientCalls.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/internal/suspendClientCalls.kt @@ -24,10 +24,10 @@ import kotlinx.rpc.grpc.Status import kotlinx.rpc.grpc.StatusCode import kotlinx.rpc.grpc.StatusException import kotlinx.rpc.grpc.internal.CallbackFuture -import kotlinx.rpc.grpc.internal.MethodDescriptor -import kotlinx.rpc.grpc.internal.MethodType +import kotlinx.rpc.grpc.descriptor.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodType import kotlinx.rpc.grpc.internal.Ready -import kotlinx.rpc.grpc.internal.methodType +import kotlinx.rpc.grpc.descriptor.methodType import kotlinx.rpc.grpc.internal.singleOrStatus import kotlinx.rpc.grpc.statusCode import kotlinx.rpc.internal.utils.InternalRpcApi diff --git a/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.jvm.kt b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/internal/ManagedChannel.jvm.kt similarity index 94% rename from grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.jvm.kt rename to grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/internal/ManagedChannel.jvm.kt index 4a1470948..71d2d4345 100644 --- a/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.jvm.kt +++ b/grpc/grpc-client/src/jvmMain/kotlin/kotlinx/rpc/grpc/client/internal/ManagedChannel.jvm.kt @@ -4,11 +4,12 @@ @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") -package kotlinx.rpc.grpc.client +package kotlinx.rpc.grpc.client.internal import io.grpc.Grpc import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import kotlinx.rpc.grpc.client.ClientCredentials import kotlinx.rpc.internal.utils.InternalRpcApi import java.util.concurrent.TimeUnit import kotlin.time.Duration @@ -16,11 +17,13 @@ import kotlin.time.Duration /** * Same as [ManagedChannel], but is platform-exposed. */ +@InternalRpcApi public actual typealias ManagedChannelPlatform = io.grpc.ManagedChannel /** * Builder class for [ManagedChannel]. */ +@InternalRpcApi public actual typealias ManagedChannelBuilder = io.grpc.ManagedChannelBuilder @InternalRpcApi diff --git a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/credentials.native.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/credentials.native.kt index 8dce21492..9b1898133 100644 --- a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/credentials.native.kt +++ b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/credentials.native.kt @@ -9,7 +9,7 @@ package kotlinx.rpc.grpc.client import cnames.structs.grpc_channel_credentials import kotlinx.cinterop.CPointer import kotlinx.cinterop.ExperimentalForeignApi -import kotlinx.rpc.grpc.TlsCredentialsOptionsBuilder +import kotlinx.rpc.grpc.internal.TlsCredentialsOptionsBuilder import kotlinx.rpc.internal.utils.InternalRpcApi import libkgrpc.grpc_channel_credentials_release import libkgrpc.grpc_insecure_credentials_create diff --git a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.native.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.native.kt index 1d7140cb9..42317122c 100644 --- a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.native.kt +++ b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/GrpcChannel.native.kt @@ -4,9 +4,7 @@ package kotlinx.rpc.grpc.client.internal -import kotlinx.rpc.grpc.client.internal.ClientCall -import kotlinx.rpc.grpc.client.internal.GrpcCallOptions -import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.native.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/ManagedChannel.native.kt similarity index 92% rename from grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.native.kt rename to grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/ManagedChannel.native.kt index 721cc12f9..a1eb2c987 100644 --- a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/ManagedChannel.native.kt +++ b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/ManagedChannel.native.kt @@ -4,21 +4,23 @@ @file:Suppress("EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING") -package kotlinx.rpc.grpc.client +package kotlinx.rpc.grpc.client.internal -import kotlinx.rpc.grpc.client.internal.GrpcChannel -import kotlinx.rpc.grpc.client.internal.NativeManagedChannel +import kotlinx.rpc.grpc.client.ClientCredentials +import kotlinx.rpc.grpc.client.TlsClientCredentials import kotlinx.rpc.grpc.internal.internalError import kotlinx.rpc.internal.utils.InternalRpcApi /** * Same as [ManagedChannel], but is platform-exposed. */ +@InternalRpcApi public actual abstract class ManagedChannelPlatform : GrpcChannel() /** * Builder class for [ManagedChannel]. */ +@InternalRpcApi public actual abstract class ManagedChannelBuilder> { public actual abstract fun overrideAuthority(authority: String): T } diff --git a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/NativeClientCall.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/NativeClientCall.kt index 924d7b4b4..6232084b1 100644 --- a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/NativeClientCall.kt +++ b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/NativeClientCall.kt @@ -26,10 +26,9 @@ import kotlinx.coroutines.CompletableJob import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.Status import kotlinx.rpc.grpc.StatusCode -import kotlinx.rpc.grpc.client.internal.ClientCall import kotlinx.rpc.grpc.internal.BatchResult import kotlinx.rpc.grpc.internal.CompletionQueue -import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodDescriptor import kotlinx.rpc.grpc.internal.internalError import kotlinx.rpc.grpc.internal.toByteArray import kotlinx.rpc.grpc.internal.toGrpcByteBuffer diff --git a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/NativeManagedChannel.kt b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/NativeManagedChannel.kt index 53a581c54..57ab85a79 100644 --- a/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/NativeManagedChannel.kt +++ b/grpc/grpc-client/src/nativeMain/kotlin/kotlinx/rpc/grpc/client/internal/NativeManagedChannel.kt @@ -20,11 +20,9 @@ import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.withTimeoutOrNull import kotlinx.rpc.grpc.client.ClientCredentials -import kotlinx.rpc.grpc.client.ManagedChannel -import kotlinx.rpc.grpc.client.ManagedChannelPlatform import kotlinx.rpc.grpc.internal.CompletionQueue import kotlinx.rpc.grpc.internal.GrpcRuntime -import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodDescriptor import kotlinx.rpc.grpc.internal.internalError import kotlinx.rpc.grpc.internal.toGrpcSlice import libkgrpc.GPR_CLOCK_REALTIME diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt index 8c2c39b59..f4d98d134 100644 --- a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt +++ b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/GrpcServiceDescriptor.kt @@ -7,7 +7,6 @@ package kotlinx.rpc.grpc.descriptor import kotlinx.rpc.descriptor.RpcServiceDescriptor import kotlinx.rpc.grpc.annotations.Grpc import kotlinx.rpc.grpc.codec.MessageCodecResolver -import kotlinx.rpc.grpc.internal.MethodDescriptor import kotlinx.rpc.grpc.internal.ServiceDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.kt b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/MethodDescriptor.kt similarity index 95% rename from grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.kt rename to grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/MethodDescriptor.kt index 92b9ee47e..001eee213 100644 --- a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.kt +++ b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/descriptor/MethodDescriptor.kt @@ -2,13 +2,12 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.descriptor import kotlinx.rpc.grpc.codec.MessageCodec import kotlinx.rpc.internal.utils.InternalRpcApi import kotlinx.rpc.protobuf.input.stream.InputStream -@InternalRpcApi public expect class MethodDescriptor { public fun getFullMethodName(): String public fun getServiceName(): String? @@ -25,10 +24,8 @@ public expect class MethodDescriptor { } } -@InternalRpcApi public expect val MethodDescriptor<*, *>.methodType: MethodType -@InternalRpcApi public enum class MethodType { UNARY, CLIENT_STREAMING, diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServiceDescriptor.kt b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServiceDescriptor.kt index 0d7b558a9..638952dbc 100644 --- a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServiceDescriptor.kt +++ b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/ServiceDescriptor.kt @@ -4,6 +4,7 @@ package kotlinx.rpc.grpc.internal +import kotlinx.rpc.grpc.descriptor.MethodDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/CoreClientTest.kt b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/CoreClientTest.kt index 16c5a17e5..bc22e2f53 100644 --- a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/CoreClientTest.kt +++ b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/CoreClientTest.kt @@ -10,18 +10,18 @@ import kotlinx.coroutines.test.runTest import kotlinx.coroutines.withTimeout import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.server.GrpcServer -import kotlinx.rpc.grpc.client.ManagedChannel -import kotlinx.rpc.grpc.client.ManagedChannelBuilder +import kotlinx.rpc.grpc.client.internal.ManagedChannel +import kotlinx.rpc.grpc.client.internal.ManagedChannelBuilder import kotlinx.rpc.grpc.Status import kotlinx.rpc.grpc.StatusCode -import kotlinx.rpc.grpc.client.buildChannel +import kotlinx.rpc.grpc.client.internal.buildChannel import kotlinx.rpc.grpc.client.createInsecureClientCredentials import kotlinx.rpc.grpc.client.internal.ClientCall import kotlinx.rpc.grpc.client.internal.GrpcDefaultCallOptions -import kotlinx.rpc.grpc.internal.MethodDescriptor -import kotlinx.rpc.grpc.internal.MethodType +import kotlinx.rpc.grpc.descriptor.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodType import kotlinx.rpc.grpc.client.internal.clientCallListener -import kotlinx.rpc.grpc.internal.methodDescriptor +import kotlinx.rpc.grpc.descriptor.methodDescriptor import kotlinx.rpc.grpc.statusCode import kotlinx.rpc.registerService import kotlin.test.Test diff --git a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientServerTest.kt b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientServerTest.kt index 233db3939..f2e1eef14 100644 --- a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientServerTest.kt +++ b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientServerTest.kt @@ -18,14 +18,14 @@ import kotlinx.rpc.grpc.client.GrpcClient import kotlinx.rpc.grpc.server.Server import kotlinx.rpc.grpc.server.ServerBuilder import kotlinx.rpc.grpc.codec.SourcedMessageCodec -import kotlinx.rpc.grpc.internal.MethodDescriptor -import kotlinx.rpc.grpc.internal.MethodType +import kotlinx.rpc.grpc.descriptor.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodType import kotlinx.rpc.grpc.server.internal.ServerMethodDefinition import kotlinx.rpc.grpc.server.internal.bidiStreamingServerMethodDefinition import kotlinx.rpc.grpc.client.internal.bidirectionalStreamingRpc import kotlinx.rpc.grpc.client.internal.clientStreamingRpc import kotlinx.rpc.grpc.server.internal.clientStreamingServerMethodDefinition -import kotlinx.rpc.grpc.internal.methodDescriptor +import kotlinx.rpc.grpc.descriptor.methodDescriptor import kotlinx.rpc.grpc.client.internal.serverStreamingRpc import kotlinx.rpc.grpc.server.internal.serverStreamingServerMethodDefinition import kotlinx.rpc.grpc.internal.serviceDescriptor diff --git a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientTest.kt b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientTest.kt index b4ff16dd4..6359b5ff0 100644 --- a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientTest.kt +++ b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/RawClientTest.kt @@ -11,11 +11,11 @@ import kotlinx.coroutines.flow.toList import kotlinx.coroutines.test.runTest import kotlinx.rpc.grpc.client.GrpcClient import kotlinx.rpc.grpc.server.GrpcServer -import kotlinx.rpc.grpc.internal.MethodDescriptor -import kotlinx.rpc.grpc.internal.MethodType +import kotlinx.rpc.grpc.descriptor.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodType import kotlinx.rpc.grpc.client.internal.bidirectionalStreamingRpc import kotlinx.rpc.grpc.client.internal.clientStreamingRpc -import kotlinx.rpc.grpc.internal.methodDescriptor +import kotlinx.rpc.grpc.descriptor.methodDescriptor import kotlinx.rpc.grpc.client.internal.serverStreamingRpc import kotlinx.rpc.grpc.client.internal.unaryRpc import kotlinx.rpc.registerService diff --git a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/JavaPackageOptionTest.kt b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/JavaPackageOptionTest.kt index 3e06bda81..8490461ec 100644 --- a/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/JavaPackageOptionTest.kt +++ b/grpc/grpc-core/src/commonTest/kotlin/kotlinx/rpc/grpc/test/proto/JavaPackageOptionTest.kt @@ -8,8 +8,8 @@ import com.google.protobuf.kotlin.Empty import com.google.protobuf.kotlin.EmptyInternal import com.google.protobuf.kotlin.invoke import kotlinx.rpc.RpcServer -import kotlinx.rpc.grpc.internal.MethodType -import kotlinx.rpc.grpc.internal.methodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodType +import kotlinx.rpc.grpc.descriptor.methodDescriptor import kotlinx.rpc.grpc.client.internal.unaryRpc import kotlinx.rpc.grpc.test.withJavaPkg.TheService import kotlinx.rpc.registerService diff --git a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.jvm.kt b/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/descriptor/MethodDescriptor.jvm.kt similarity index 97% rename from grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.jvm.kt rename to grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/descriptor/MethodDescriptor.jvm.kt index 265f4f3e7..625e9e5a0 100644 --- a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.jvm.kt +++ b/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/descriptor/MethodDescriptor.jvm.kt @@ -2,16 +2,14 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.descriptor import kotlinx.rpc.grpc.codec.MessageCodec import kotlinx.rpc.internal.utils.InternalRpcApi import java.io.InputStream -@InternalRpcApi public actual typealias MethodDescriptor = io.grpc.MethodDescriptor -@InternalRpcApi public actual val MethodDescriptor<*, *>.methodType: MethodType get() = when (this.type) { io.grpc.MethodDescriptor.MethodType.UNARY -> MethodType.UNARY diff --git a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServiceDescriptor.jvm.kt b/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServiceDescriptor.jvm.kt index b5dfefadc..7114501b9 100644 --- a/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServiceDescriptor.jvm.kt +++ b/grpc/grpc-core/src/jvmMain/kotlin/kotlinx/rpc/grpc/internal/ServiceDescriptor.jvm.kt @@ -4,6 +4,7 @@ package kotlinx.rpc.grpc.internal +import kotlinx.rpc.grpc.descriptor.MethodDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.native.kt b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/descriptor/MethodDescriptor.native.kt similarity index 98% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.native.kt rename to grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/descriptor/MethodDescriptor.native.kt index 2a7ea4f97..f982bd940 100644 --- a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/MethodDescriptor.native.kt +++ b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/descriptor/MethodDescriptor.native.kt @@ -2,13 +2,12 @@ * Copyright 2023-2025 JetBrains s.r.o and contributors. Use of this source code is governed by the Apache 2.0 license. */ -package kotlinx.rpc.grpc.internal +package kotlinx.rpc.grpc.descriptor import kotlinx.rpc.grpc.codec.MessageCodec import kotlinx.rpc.internal.utils.InternalRpcApi import kotlinx.rpc.protobuf.input.stream.InputStream -@InternalRpcApi public actual class MethodDescriptor internal constructor( private val fullMethodName: String, private val requestMarshaller: Marshaller, @@ -56,7 +55,6 @@ public actual class MethodDescriptor internal constructor( } } -@InternalRpcApi public actual val MethodDescriptor<*, *>.methodType: MethodType get() = this.methodType diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServiceDescriptor.native.kt b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServiceDescriptor.native.kt index ce890ae91..ec04d727a 100644 --- a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServiceDescriptor.native.kt +++ b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/ServiceDescriptor.native.kt @@ -4,6 +4,7 @@ package kotlinx.rpc.grpc.internal +import kotlinx.rpc.grpc.descriptor.MethodDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.kt b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/credentials.kt similarity index 98% rename from grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.kt rename to grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/credentials.kt index e9f4b18e3..ed7a3d5de 100644 --- a/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/credentials.kt +++ b/grpc/grpc-core/src/nativeMain/kotlin/kotlinx/rpc/grpc/internal/credentials.kt @@ -4,7 +4,7 @@ @file:OptIn(ExperimentalForeignApi::class, ExperimentalNativeApi::class) -package kotlinx.rpc.grpc +package kotlinx.rpc.grpc.internal import cnames.structs.grpc_tls_credentials_options import kotlinx.cinterop.CPointer diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/GrpcServer.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/GrpcServer.kt index 692af0b01..1515d0fe0 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/GrpcServer.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/GrpcServer.kt @@ -21,13 +21,13 @@ import kotlinx.rpc.grpc.codec.MessageCodecResolver import kotlinx.rpc.grpc.codec.ThrowingMessageCodecResolver import kotlinx.rpc.grpc.codec.plus import kotlinx.rpc.grpc.descriptor.GrpcServiceDescriptor -import kotlinx.rpc.grpc.internal.MethodDescriptor -import kotlinx.rpc.grpc.internal.MethodType +import kotlinx.rpc.grpc.descriptor.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodType import kotlinx.rpc.grpc.server.internal.ServerMethodDefinition import kotlinx.rpc.grpc.server.internal.bidiStreamingServerMethodDefinition import kotlinx.rpc.grpc.server.internal.clientStreamingServerMethodDefinition import kotlinx.rpc.grpc.server.internal.serverStreamingServerMethodDefinition -import kotlinx.rpc.grpc.internal.methodType +import kotlinx.rpc.grpc.descriptor.methodType import kotlinx.rpc.grpc.server.internal.unaryServerMethodDefinition import kotlinx.rpc.internal.utils.map.RpcInternalConcurrentHashMap import kotlin.coroutines.CoroutineContext diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/ServerInterceptor.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/ServerInterceptor.kt index 88787519f..a2e6eb4ac 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/ServerInterceptor.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/ServerInterceptor.kt @@ -9,7 +9,7 @@ import kotlinx.coroutines.flow.FlowCollector import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.Status import kotlinx.rpc.grpc.server.internal.GrpcContext -import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodDescriptor /** * Th scope of a single incoming gRPC server call observed by a [ServerInterceptor]. diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.kt index aee8ac128..d41ab3ad4 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.kt @@ -6,7 +6,7 @@ package kotlinx.rpc.grpc.server.internal import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.Status -import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.kt index 13eeec67e..32ee4f50e 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.kt @@ -4,7 +4,7 @@ package kotlinx.rpc.grpc.server.internal -import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/suspendServerCalls.kt b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/suspendServerCalls.kt index f1519353e..4ddda2a13 100644 --- a/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/suspendServerCalls.kt +++ b/grpc/grpc-server/src/commonMain/kotlin/kotlinx/rpc/grpc/server/internal/suspendServerCalls.kt @@ -24,10 +24,10 @@ import kotlinx.rpc.grpc.StatusCode import kotlinx.rpc.grpc.StatusException import kotlinx.rpc.grpc.StatusRuntimeException import kotlinx.rpc.grpc.internal.CallbackFuture -import kotlinx.rpc.grpc.internal.MethodDescriptor -import kotlinx.rpc.grpc.internal.MethodType +import kotlinx.rpc.grpc.descriptor.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodType import kotlinx.rpc.grpc.internal.Ready -import kotlinx.rpc.grpc.internal.methodType +import kotlinx.rpc.grpc.descriptor.methodType import kotlinx.rpc.grpc.internal.singleOrStatusFlow import kotlinx.rpc.internal.utils.InternalRpcApi import kotlin.reflect.KType diff --git a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.jvm.kt b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.jvm.kt index 272dcc2c3..ee5bde6d5 100644 --- a/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.jvm.kt +++ b/grpc/grpc-server/src/jvmMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.jvm.kt @@ -4,9 +4,7 @@ package kotlinx.rpc.grpc.server.internal -import kotlinx.rpc.grpc.internal.MethodDescriptor -import kotlinx.rpc.grpc.server.internal.ServerCallHandler -import kotlinx.rpc.grpc.server.internal.ServerMethodDefinition +import kotlinx.rpc.grpc.descriptor.MethodDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/MutableHandlerRegistry.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/MutableHandlerRegistry.native.kt index 843505cee..ff6f8a7c5 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/MutableHandlerRegistry.native.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/MutableHandlerRegistry.native.kt @@ -6,7 +6,7 @@ package kotlinx.rpc.grpc.server -import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodDescriptor import kotlinx.rpc.grpc.server.internal.ServerMethodDefinition import kotlinx.rpc.internal.utils.map.RpcInternalConcurrentHashMap diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/credentials.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/credentials.native.kt index c60e87de9..3bbc095e5 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/credentials.native.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/credentials.native.kt @@ -9,7 +9,7 @@ package kotlinx.rpc.grpc.server import cnames.structs.grpc_server_credentials import kotlinx.cinterop.CPointer import kotlinx.cinterop.ExperimentalForeignApi -import kotlinx.rpc.grpc.TlsCredentialsOptionsBuilder +import kotlinx.rpc.grpc.internal.TlsCredentialsOptionsBuilder import libkgrpc.grpc_insecure_server_credentials_create import libkgrpc.grpc_server_credentials_release import libkgrpc.grpc_ssl_client_certificate_request_type diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/NativeServerCall.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/NativeServerCall.kt index c8401d465..c48e38c4c 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/NativeServerCall.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/NativeServerCall.kt @@ -27,10 +27,10 @@ import kotlinx.rpc.grpc.StatusCode import kotlinx.rpc.grpc.StatusException import kotlinx.rpc.grpc.internal.BatchResult import kotlinx.rpc.grpc.internal.CompletionQueue -import kotlinx.rpc.grpc.internal.MethodDescriptor -import kotlinx.rpc.grpc.internal.MethodType +import kotlinx.rpc.grpc.descriptor.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodType import kotlinx.rpc.grpc.internal.internalError -import kotlinx.rpc.grpc.internal.methodType +import kotlinx.rpc.grpc.descriptor.methodType import kotlinx.rpc.grpc.internal.toGrpcByteBuffer import kotlinx.rpc.grpc.internal.toGrpcSlice import kotlinx.rpc.grpc.internal.toKotlin diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.native.kt index 67d74b4c2..8fac70b60 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.native.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerCall.native.kt @@ -6,8 +6,7 @@ package kotlinx.rpc.grpc.server.internal import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.Status -import kotlinx.rpc.grpc.internal.MethodDescriptor -import kotlinx.rpc.grpc.server.internal.ServerCall +import kotlinx.rpc.grpc.descriptor.MethodDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.native.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.native.kt index 774f6428d..64b7a523b 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.native.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/ServerMethodDefinition.native.kt @@ -4,9 +4,7 @@ package kotlinx.rpc.grpc.server.internal -import kotlinx.rpc.grpc.internal.MethodDescriptor -import kotlinx.rpc.grpc.server.internal.ServerCallHandler -import kotlinx.rpc.grpc.server.internal.ServerMethodDefinition +import kotlinx.rpc.grpc.descriptor.MethodDescriptor import kotlinx.rpc.internal.utils.InternalRpcApi @InternalRpcApi diff --git a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/serverCallTags.kt b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/serverCallTags.kt index 1762575e8..c6294c187 100644 --- a/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/serverCallTags.kt +++ b/grpc/grpc-server/src/nativeMain/kotlin/kotlinx/rpc/grpc/server/internal/serverCallTags.kt @@ -18,7 +18,7 @@ import kotlinx.cinterop.value import kotlinx.rpc.grpc.GrpcMetadata import kotlinx.rpc.grpc.internal.CallbackTag import kotlinx.rpc.grpc.internal.CompletionQueue -import kotlinx.rpc.grpc.internal.MethodDescriptor +import kotlinx.rpc.grpc.descriptor.MethodDescriptor import kotlinx.rpc.grpc.internal.toByteArray import kotlinx.rpc.grpc.server.HandlerRegistry import libkgrpc.gpr_timespec From 20019b11383f6371c77620871c22da94ab6ee733 Mon Sep 17 00:00:00 2001 From: Johannes Zottele Date: Mon, 6 Oct 2025 11:25:08 +0200 Subject: [PATCH 4/7] grpc: Update kmp example --- .../kotlinx/rpc/grpc/client/GrpcClient.kt | 7 ++ .../grpc-kmp-app/composeApp/build.gradle.kts | 2 +- .../kotlin/kotlinx/rpc/sample/App.kt | 83 +++++++++++++++---- .../grpc-kmp-app/gradle/libs.versions.toml | 2 + samples/grpc-kmp-app/server/build.gradle.kts | 2 +- .../kotlin/kotlinx/rpc/sample/Application.kt | 6 +- .../kotlin/kotlinx/rpc/sample/Constants.kt | 3 - .../kotlin/kotlinx/rpc/sample/Greeting.kt | 9 -- 8 files changed, 81 insertions(+), 33 deletions(-) delete mode 100644 samples/grpc-kmp-app/shared/src/commonMain/kotlin/kotlinx/rpc/sample/Constants.kt delete mode 100644 samples/grpc-kmp-app/shared/src/commonMain/kotlin/kotlinx/rpc/sample/Greeting.kt diff --git a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/GrpcClient.kt b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/GrpcClient.kt index 31ce8ad41..7e4b00cd5 100644 --- a/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/GrpcClient.kt +++ b/grpc/grpc-client/src/commonMain/kotlin/kotlinx/rpc/grpc/client/GrpcClient.kt @@ -191,6 +191,10 @@ private fun GrpcClient( * Configuration class for a gRPC client, providing customization options * for client behavior, including interceptors, credentials, codec resolution, * and authority overrides. + * + * @see credentials + * @see overrideAuthority + * @see intercept */ public class GrpcClientConfiguration internal constructor() { internal val interceptors: MutableList = mutableListOf() @@ -226,6 +230,9 @@ public class GrpcClientConfiguration internal constructor() { * credentials = plaintext() // for testing purposes only! * } * ``` + * + * @see tls + * @see plaintext */ public var credentials: ClientCredentials? = null diff --git a/samples/grpc-kmp-app/composeApp/build.gradle.kts b/samples/grpc-kmp-app/composeApp/build.gradle.kts index c94d08db8..0d53abce6 100644 --- a/samples/grpc-kmp-app/composeApp/build.gradle.kts +++ b/samples/grpc-kmp-app/composeApp/build.gradle.kts @@ -32,7 +32,7 @@ kotlin { implementation(libs.androidx.lifecycle.runtimeCompose) implementation(libs.kotlinx.datetime) implementation(libs.kotlinx.rpc.protobuf.core) - implementation(libs.kotlinx.rpc.grpc.core) + implementation(libs.kotlinx.rpc.grpc.client) implementation(libs.grpc.netty) implementation(projects.shared) } diff --git a/samples/grpc-kmp-app/composeApp/src/commonMain/kotlin/kotlinx/rpc/sample/App.kt b/samples/grpc-kmp-app/composeApp/src/commonMain/kotlin/kotlinx/rpc/sample/App.kt index f359da193..ddfff73a1 100644 --- a/samples/grpc-kmp-app/composeApp/src/commonMain/kotlin/kotlinx/rpc/sample/App.kt +++ b/samples/grpc-kmp-app/composeApp/src/commonMain/kotlin/kotlinx/rpc/sample/App.kt @@ -33,10 +33,16 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.retryWhen import kotlinx.coroutines.launch import kotlinx.datetime.TimeZone import kotlinx.datetime.toLocalDateTime -import kotlinx.rpc.grpc.GrpcClient +import kotlinx.rpc.grpc.StatusException +import kotlinx.rpc.grpc.client.GrpcClient +import kotlinx.rpc.grpc.statusCode import kotlinx.rpc.internal.utils.ExperimentalRpcApi import kotlinx.rpc.sample.messages.ChatEntry import kotlinx.rpc.sample.messages.MessageService @@ -45,7 +51,9 @@ import kotlinx.rpc.sample.messages.SendMessageRequest import kotlinx.rpc.sample.messages.invoke import kotlinx.rpc.withService import org.jetbrains.compose.ui.tooling.preview.Preview +import kotlin.random.Random import kotlin.time.Clock +import kotlin.time.Duration.Companion.seconds import kotlin.time.ExperimentalTime import kotlin.time.Instant @@ -56,7 +64,7 @@ fun App() { val grpcClient = remember { GrpcClient("localhost", 8080) { - usePlaintext() + credentials = plaintext() } } @@ -72,34 +80,63 @@ fun App() { private fun ChatScreen(service: MessageService) { val scope = rememberCoroutineScope() - var me by remember { mutableStateOf("me") } + var me by remember { mutableStateOf("user-${Random.nextInt(until = 999)}" ) } var input by remember { mutableStateOf("") } val messages = remember { mutableStateListOf() } + var error by remember { mutableStateOf(null) } fun sendMessage() { scope.launch { - val result = service.SendMessage( - SendMessageRequest{ - user = me - text = input - } - ) - if (result.success) { - messages += ChatEntry { - user = me - text = input - tsMillis = Clock.System.now().toEpochMilliseconds() + try { + val result = service.SendMessage( + SendMessageRequest { + user = me + text = input + } + ) + if (result.success) { + messages += ChatEntry { + user = me + text = input + tsMillis = Clock.System.now().toEpochMilliseconds() + } + input = "" + error = null + } else { + error = "Message not accepted by server." } - input = "" + } catch (e: CancellationException) { + throw e + } catch (e: StatusException) { + error = e.getStatus().getDescription()?.let { "${e.getStatus().statusCode}: $it" } ?: "gRPC error: ${e.getStatus().statusCode}" + } catch (e: Throwable) { + error = e.message ?: "Unknown error while sending." } } } LaunchedEffect(me) { messages.clear() + error = null val req = ReceiveMessagesRequest { user = me } - service.ReceiveMessages(req).collect { msg -> - messages += msg + try { + service.ReceiveMessages(req) + .retryWhen { cause, attempt -> + if (cause is CancellationException) false + else { + error = (cause as? StatusException)?.getStatus()?.getDescription()?.let { "${cause.getStatus().statusCode}: $it" } + ?: cause.message ?: "Error receiving messages." + delay(2.seconds) + true + } + } + .collect { msg -> messages += msg; error = null } + } catch (e: CancellationException) { + throw e + } catch (e: StatusException) { + error = e.getStatus().getDescription() ?: "gRPC error: ${e.getStatus().statusCode}" + } catch (e: Throwable) { + error = e.message ?: "Unknown error while receiving." } } @@ -108,6 +145,18 @@ private fun ChatScreen(service: MessageService) { .windowInsetsPadding(WindowInsets.safeDrawing) .padding(16.dp) ) { + + if (error != null) { + Text( + error!!, + color = MaterialTheme.colorScheme.error, + modifier = Modifier + .fillMaxWidth() + .background(MaterialTheme.colorScheme.errorContainer) + .padding(8.dp) + ) + } + OutlinedTextField( value = me, onValueChange = { me = it }, diff --git a/samples/grpc-kmp-app/gradle/libs.versions.toml b/samples/grpc-kmp-app/gradle/libs.versions.toml index 772fc90b5..a35a10ca6 100644 --- a/samples/grpc-kmp-app/gradle/libs.versions.toml +++ b/samples/grpc-kmp-app/gradle/libs.versions.toml @@ -24,6 +24,8 @@ ktor-serverCore = { module = "io.ktor:ktor-server-core-jvm", version.ref = "ktor ktor-serverNetty = { module = "io.ktor:ktor-server-netty-jvm", version.ref = "ktor" } ktor-serverTestHost = { module = "io.ktor:ktor-server-test-host-jvm", version.ref = "ktor" } kotlinx-rpc-grpc-core = { module = "org.jetbrains.kotlinx:kotlinx-rpc-grpc-core", version.ref = "kotlinx-rpc" } +kotlinx-rpc-grpc-client = { module = "org.jetbrains.kotlinx:kotlinx-rpc-grpc-client", version.ref = "kotlinx-rpc" } +kotlinx-rpc-grpc-server = { module = "org.jetbrains.kotlinx:kotlinx-rpc-grpc-server", version.ref = "kotlinx-rpc" } kotlinx-rpc-protobuf-core = { module = "org.jetbrains.kotlinx:kotlinx-rpc-protobuf-core", version.ref = "kotlinx-rpc" } grpc-netty = { module = "io.grpc:grpc-netty", version.ref = "grpc" } kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datatime" } diff --git a/samples/grpc-kmp-app/server/build.gradle.kts b/samples/grpc-kmp-app/server/build.gradle.kts index e188e3c64..cfc887925 100644 --- a/samples/grpc-kmp-app/server/build.gradle.kts +++ b/samples/grpc-kmp-app/server/build.gradle.kts @@ -16,6 +16,6 @@ dependencies { implementation(projects.shared) implementation(libs.logback) implementation(libs.kotlinx.rpc.protobuf.core) - implementation(libs.kotlinx.rpc.grpc.core) + implementation(libs.kotlinx.rpc.grpc.server) implementation(libs.grpc.netty) } \ No newline at end of file diff --git a/samples/grpc-kmp-app/server/src/main/kotlin/kotlinx/rpc/sample/Application.kt b/samples/grpc-kmp-app/server/src/main/kotlin/kotlinx/rpc/sample/Application.kt index d3ea1284e..cea1748a5 100644 --- a/samples/grpc-kmp-app/server/src/main/kotlin/kotlinx/rpc/sample/Application.kt +++ b/samples/grpc-kmp-app/server/src/main/kotlin/kotlinx/rpc/sample/Application.kt @@ -1,7 +1,7 @@ package kotlinx.rpc.sample import kotlinx.coroutines.runBlocking -import kotlinx.rpc.grpc.GrpcServer +import kotlinx.rpc.grpc.server.GrpcServer import kotlinx.rpc.internal.utils.ExperimentalRpcApi import kotlinx.rpc.registerService import kotlinx.rpc.sample.messages.MessageService @@ -9,7 +9,9 @@ import kotlinx.rpc.sample.messages.MessageService @OptIn(ExperimentalRpcApi::class) fun main(): Unit = runBlocking { val grpcServer = GrpcServer(8080) { - registerService { MessageServiceImpl() } + services { + registerService { MessageServiceImpl() } + } } grpcServer.start() diff --git a/samples/grpc-kmp-app/shared/src/commonMain/kotlin/kotlinx/rpc/sample/Constants.kt b/samples/grpc-kmp-app/shared/src/commonMain/kotlin/kotlinx/rpc/sample/Constants.kt deleted file mode 100644 index b60b5b862..000000000 --- a/samples/grpc-kmp-app/shared/src/commonMain/kotlin/kotlinx/rpc/sample/Constants.kt +++ /dev/null @@ -1,3 +0,0 @@ -package kotlinx.rpc.sample - -const val SERVER_PORT = 8080 \ No newline at end of file diff --git a/samples/grpc-kmp-app/shared/src/commonMain/kotlin/kotlinx/rpc/sample/Greeting.kt b/samples/grpc-kmp-app/shared/src/commonMain/kotlin/kotlinx/rpc/sample/Greeting.kt deleted file mode 100644 index d285499dc..000000000 --- a/samples/grpc-kmp-app/shared/src/commonMain/kotlin/kotlinx/rpc/sample/Greeting.kt +++ /dev/null @@ -1,9 +0,0 @@ -package kotlinx.rpc.sample - -class Greeting { - private val platform = getPlatform() - - fun greet(): String { - return "Hello, ${platform.name}!" - } -} \ No newline at end of file From 88a4956bebce4a5910b84e9a9296cd534bf297b1 Mon Sep 17 00:00:00 2001 From: Johannes Zottele Date: Thu, 9 Oct 2025 14:24:47 +0200 Subject: [PATCH 5/7] grpc: Reduce dependencies --- grpc/grpc-client/build.gradle.kts | 28 +------------------ grpc/grpc-ktor-server/build.gradle.kts | 2 +- .../rpc/grpc/ktor/server/test/TestServer.kt | 6 ++-- grpc/grpc-server/build.gradle.kts | 26 +---------------- 4 files changed, 7 insertions(+), 55 deletions(-) diff --git a/grpc/grpc-client/build.gradle.kts b/grpc/grpc-client/build.gradle.kts index d88bb57fa..efc326cfa 100644 --- a/grpc/grpc-client/build.gradle.kts +++ b/grpc/grpc-client/build.gradle.kts @@ -9,10 +9,6 @@ import kotlinx.rpc.internal.InternalRpcApi plugins { alias(libs.plugins.conventions.kmp) alias(libs.plugins.kotlinx.rpc) - - // TODO: Check if we can drop these plugins - alias(libs.plugins.atomicfu) - alias(libs.plugins.serialization) // for tests } kotlin { @@ -24,34 +20,12 @@ kotlin { commonMain { dependencies { api(projects.grpc.grpcCore) - - implementation(libs.atomicfu) - implementation(libs.kotlinx.io.core) - } - } - - jvmMain { - dependencies { - // TODO: Check if we can drop the API dependencies - api(libs.grpc.api) - api(libs.grpc.util) - api(libs.grpc.stub) - api(libs.grpc.protobuf) - api(libs.grpc.protobuf.lite) - implementation(libs.grpc.kotlin.stub) // causes problems to jpms if api - } - } - - jvmTest { - dependencies { - implementation(libs.grpc.netty) } } nativeMain { dependencies { - // required for status.proto - implementation(projects.protobuf.protobufCore) + implementation(libs.atomicfu) } } } diff --git a/grpc/grpc-ktor-server/build.gradle.kts b/grpc/grpc-ktor-server/build.gradle.kts index 15ebe227d..8a7d414e5 100644 --- a/grpc/grpc-ktor-server/build.gradle.kts +++ b/grpc/grpc-ktor-server/build.gradle.kts @@ -25,7 +25,7 @@ kotlin { dependencies { implementation(kotlin("test")) - implementation(projects.grpc.grpcCore) + implementation(projects.grpc.grpcClient) implementation(projects.grpc.grpcKtorServer) implementation(libs.grpc.kotlin.stub) diff --git a/grpc/grpc-ktor-server/src/jvmTest/kotlin/kotlinx/rpc/grpc/ktor/server/test/TestServer.kt b/grpc/grpc-ktor-server/src/jvmTest/kotlin/kotlinx/rpc/grpc/ktor/server/test/TestServer.kt index 6482d41de..f1e06c9d0 100644 --- a/grpc/grpc-ktor-server/src/jvmTest/kotlin/kotlinx/rpc/grpc/ktor/server/test/TestServer.kt +++ b/grpc/grpc-ktor-server/src/jvmTest/kotlin/kotlinx/rpc/grpc/ktor/server/test/TestServer.kt @@ -5,7 +5,7 @@ package kotlinx.rpc.grpc.ktor.server.test import io.ktor.server.testing.* -import kotlinx.rpc.grpc.GrpcClient +import kotlinx.rpc.grpc.client.GrpcClient import kotlinx.rpc.grpc.ktor.server.grpc import kotlinx.rpc.withService import kotlin.test.Test @@ -25,7 +25,9 @@ class TestServer { fun testPlainRequests() = testApplication { application { grpc(PORT) { - registerService { KtorTestServiceImpl() } + services { + registerService { KtorTestServiceImpl() } + } } } diff --git a/grpc/grpc-server/build.gradle.kts b/grpc/grpc-server/build.gradle.kts index d88bb57fa..95821e6e4 100644 --- a/grpc/grpc-server/build.gradle.kts +++ b/grpc/grpc-server/build.gradle.kts @@ -9,10 +9,6 @@ import kotlinx.rpc.internal.InternalRpcApi plugins { alias(libs.plugins.conventions.kmp) alias(libs.plugins.kotlinx.rpc) - - // TODO: Check if we can drop these plugins - alias(libs.plugins.atomicfu) - alias(libs.plugins.serialization) // for tests } kotlin { @@ -26,32 +22,12 @@ kotlin { api(projects.grpc.grpcCore) implementation(libs.atomicfu) - implementation(libs.kotlinx.io.core) - } - } - - jvmMain { - dependencies { - // TODO: Check if we can drop the API dependencies - api(libs.grpc.api) - api(libs.grpc.util) - api(libs.grpc.stub) - api(libs.grpc.protobuf) - api(libs.grpc.protobuf.lite) - implementation(libs.grpc.kotlin.stub) // causes problems to jpms if api - } - } - - jvmTest { - dependencies { - implementation(libs.grpc.netty) } } nativeMain { dependencies { - // required for status.proto - implementation(projects.protobuf.protobufCore) + implementation(libs.kotlinx.io.core) } } } From ef3da531d04e3e064bb577ac8e7b3995c332e283 Mon Sep 17 00:00:00 2001 From: Johannes Zottele Date: Thu, 9 Oct 2025 14:52:21 +0200 Subject: [PATCH 6/7] grpc: Fix Ktor server test --- grpc/grpc-ktor-server/build.gradle.kts | 6 ++++++ .../{jvmTest => commonTest}/proto/ktor-test-service.proto | 0 .../kotlin/kotlinx/rpc/grpc/ktor/server/test/TestServer.kt | 1 + 3 files changed, 7 insertions(+) rename grpc/grpc-ktor-server/src/{jvmTest => commonTest}/proto/ktor-test-service.proto (100%) diff --git a/grpc/grpc-ktor-server/build.gradle.kts b/grpc/grpc-ktor-server/build.gradle.kts index 8a7d414e5..dcf319bd3 100644 --- a/grpc/grpc-ktor-server/build.gradle.kts +++ b/grpc/grpc-ktor-server/build.gradle.kts @@ -21,6 +21,12 @@ kotlin { } } + commonTest { + dependencies { + implementation(projects.protobuf.protobufCore) + } + } + jvmTest { dependencies { implementation(kotlin("test")) diff --git a/grpc/grpc-ktor-server/src/jvmTest/proto/ktor-test-service.proto b/grpc/grpc-ktor-server/src/commonTest/proto/ktor-test-service.proto similarity index 100% rename from grpc/grpc-ktor-server/src/jvmTest/proto/ktor-test-service.proto rename to grpc/grpc-ktor-server/src/commonTest/proto/ktor-test-service.proto diff --git a/grpc/grpc-ktor-server/src/jvmTest/kotlin/kotlinx/rpc/grpc/ktor/server/test/TestServer.kt b/grpc/grpc-ktor-server/src/jvmTest/kotlin/kotlinx/rpc/grpc/ktor/server/test/TestServer.kt index f1e06c9d0..11c95de5e 100644 --- a/grpc/grpc-ktor-server/src/jvmTest/kotlin/kotlinx/rpc/grpc/ktor/server/test/TestServer.kt +++ b/grpc/grpc-ktor-server/src/jvmTest/kotlin/kotlinx/rpc/grpc/ktor/server/test/TestServer.kt @@ -7,6 +7,7 @@ package kotlinx.rpc.grpc.ktor.server.test import io.ktor.server.testing.* import kotlinx.rpc.grpc.client.GrpcClient import kotlinx.rpc.grpc.ktor.server.grpc +import kotlinx.rpc.registerService import kotlinx.rpc.withService import kotlin.test.Test import kotlin.test.assertEquals From d3f049ad0a206730665dc2d8b9c8dcbe65f959e3 Mon Sep 17 00:00:00 2001 From: Johannes Zottele Date: Mon, 13 Oct 2025 12:26:39 +0200 Subject: [PATCH 7/7] grpc: Remove todo --- .../commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendUtils.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendUtils.kt b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendUtils.kt index 4963a745b..b8d0be409 100644 --- a/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendUtils.kt +++ b/grpc/grpc-core/src/commonMain/kotlin/kotlinx/rpc/grpc/internal/suspendUtils.kt @@ -14,7 +14,6 @@ import kotlinx.rpc.grpc.StatusCode import kotlinx.rpc.grpc.StatusException import kotlinx.rpc.internal.utils.InternalRpcApi -// todo really needed? @InternalRpcApi public fun Flow.singleOrStatusFlow( expected: String,