@@ -32,8 +32,9 @@ private typealias RequestClient = Any
32
32
* @field channel The [ManagedChannel] used to communicate with remote gRPC services.
33
33
*/
34
34
public class GrpcClient internal constructor(
35
- private val channel : ManagedChannel ,
35
+ internal val channel : ManagedChannel ,
36
36
messageCodecResolver : MessageCodecResolver = EmptyMessageCodecResolver ,
37
+ internal val interceptors : List <ClientInterceptor >,
37
38
) : RpcClient {
38
39
private val delegates = RpcInternalConcurrentHashMap <String , GrpcServiceDelegate >()
39
40
private val messageCodecResolver = messageCodecResolver + ThrowingMessageCodecResolver
@@ -58,15 +59,13 @@ public class GrpcClient internal constructor(
58
59
59
60
return when (methodDescriptor.type) {
60
61
MethodType .UNARY -> unaryRpc(
61
- channel = channel.platformApi,
62
62
descriptor = methodDescriptor,
63
63
request = request,
64
64
callOptions = callOptions,
65
65
trailers = trailers,
66
66
)
67
67
68
68
MethodType .CLIENT_STREAMING -> @Suppress(" UNCHECKED_CAST" ) clientStreamingRpc(
69
- channel = channel.platformApi,
70
69
descriptor = methodDescriptor,
71
70
requests = request as Flow <RequestClient >,
72
71
callOptions = callOptions,
@@ -83,15 +82,13 @@ public class GrpcClient internal constructor(
83
82
84
83
when (methodDescriptor.type) {
85
84
MethodType .SERVER_STREAMING -> serverStreamingRpc(
86
- channel = channel.platformApi,
87
85
descriptor = methodDescriptor,
88
86
request = request,
89
87
callOptions = callOptions,
90
88
trailers = trailers,
91
89
)
92
90
93
91
MethodType .BIDI_STREAMING -> @Suppress(" UNCHECKED_CAST" ) bidirectionalStreamingRpc(
94
- channel = channel.platformApi,
95
92
descriptor = methodDescriptor,
96
93
requests = request as Flow <RequestClient >,
97
94
callOptions = callOptions,
@@ -131,23 +128,57 @@ public class GrpcClient internal constructor(
131
128
public fun GrpcClient (
132
129
hostname : String ,
133
130
port : Int ,
134
- credentials : ClientCredentials ? = null,
135
- messageCodecResolver : MessageCodecResolver = EmptyMessageCodecResolver ,
136
- configure : ManagedChannelBuilder <* >.() -> Unit = {},
131
+ configure : GrpcClientConfiguration .() -> Unit = {},
137
132
): GrpcClient {
138
- val channel = ManagedChannelBuilder (hostname, port, credentials ).apply (configure).buildChannel( )
139
- return GrpcClient (channel, messageCodecResolver )
133
+ val config = GrpcClientConfiguration ( ).apply (configure)
134
+ return GrpcClient (ManagedChannelBuilder (hostname, port, config.credentials), config )
140
135
}
141
136
142
137
/* *
143
138
* Constructor function for the [GrpcClient] class.
144
139
*/
145
140
public fun GrpcClient (
146
141
target : String ,
147
- credentials : ClientCredentials ? = null,
148
- messageCodecResolver : MessageCodecResolver = EmptyMessageCodecResolver ,
149
- configure : ManagedChannelBuilder <* >.() -> Unit = {},
142
+ configure : GrpcClientConfiguration .() -> Unit = {},
143
+ ): GrpcClient {
144
+ val config = GrpcClientConfiguration ().apply (configure)
145
+ return GrpcClient (ManagedChannelBuilder (target, config.credentials), config)
146
+ }
147
+
148
+ private fun GrpcClient (
149
+ builder : ManagedChannelBuilder <* >,
150
+ config : GrpcClientConfiguration ,
150
151
): GrpcClient {
151
- val channel = ManagedChannelBuilder (target, credentials).apply (configure).buildChannel()
152
- return GrpcClient (channel, messageCodecResolver)
152
+ val channel = builder.apply {
153
+ config.overrideAuthority?.let { overrideAuthority(it) }
154
+ }.buildChannel()
155
+ return GrpcClient (channel, config.messageCodecResolver, config.interceptors)
153
156
}
157
+
158
+ public class GrpcClientConfiguration internal constructor() {
159
+ internal var messageCodecResolver: MessageCodecResolver = EmptyMessageCodecResolver
160
+ internal var credentials: ClientCredentials ? = null
161
+ internal var overrideAuthority: String? = null
162
+ internal val interceptors: MutableList <ClientInterceptor > = mutableListOf ()
163
+
164
+ public fun usePlaintext () {
165
+ credentials = createInsecureClientCredentials()
166
+ }
167
+
168
+ public fun useCredentials (credentials : ClientCredentials ) {
169
+ this @GrpcClientConfiguration.credentials = credentials
170
+ }
171
+
172
+ public fun overrideAuthority (authority : String ) {
173
+ overrideAuthority = authority
174
+ }
175
+
176
+ public fun useMessageCodecResolver (messageCodecResolver : MessageCodecResolver ) {
177
+ this .messageCodecResolver = messageCodecResolver
178
+ }
179
+
180
+ public fun intercept (vararg interceptors : ClientInterceptor ) {
181
+ this .interceptors.addAll(interceptors)
182
+ }
183
+
184
+ }
0 commit comments