Skip to content

Commit 7ae7ca8

Browse files
committed
Don't push ServerInterceptorTargets down into the RPC executor
1 parent 50fa273 commit 7ae7ca8

File tree

5 files changed

+40
-43
lines changed

5 files changed

+40
-43
lines changed

Sources/GRPCCore/Call/Server/Internal/ServerRPCExecutor.swift

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ struct ServerRPCExecutor {
3434
>,
3535
deserializer: some MessageDeserializer<Input>,
3636
serializer: some MessageSerializer<Output>,
37-
interceptors: [ServerInterceptorTarget],
37+
interceptors: [any ServerInterceptor],
3838
handler: @Sendable @escaping (
3939
_ request: StreamingServerRequest<Input>,
4040
_ context: ServerContext
@@ -72,7 +72,7 @@ struct ServerRPCExecutor {
7272
outbound: RPCWriter<RPCResponsePart>.Closable,
7373
deserializer: some MessageDeserializer<Input>,
7474
serializer: some MessageSerializer<Output>,
75-
interceptors: [ServerInterceptorTarget],
75+
interceptors: [any ServerInterceptor],
7676
handler: @escaping @Sendable (
7777
_ request: StreamingServerRequest<Input>,
7878
_ context: ServerContext
@@ -113,7 +113,7 @@ struct ServerRPCExecutor {
113113
outbound: RPCWriter<RPCResponsePart>.Closable,
114114
deserializer: some MessageDeserializer<Input>,
115115
serializer: some MessageSerializer<Output>,
116-
interceptors: [ServerInterceptorTarget],
116+
interceptors: [any ServerInterceptor],
117117
handler: @escaping @Sendable (
118118
_ request: StreamingServerRequest<Input>,
119119
_ context: ServerContext
@@ -153,7 +153,7 @@ struct ServerRPCExecutor {
153153
outbound: RPCWriter<RPCResponsePart>.Closable,
154154
deserializer: some MessageDeserializer<Input>,
155155
serializer: some MessageSerializer<Output>,
156-
interceptors: [ServerInterceptorTarget],
156+
interceptors: [any ServerInterceptor],
157157
handler: @escaping @Sendable (
158158
_ request: StreamingServerRequest<Input>,
159159
_ context: ServerContext
@@ -286,7 +286,7 @@ extension ServerRPCExecutor {
286286
static func _intercept<Input, Output>(
287287
request: StreamingServerRequest<Input>,
288288
context: ServerContext,
289-
interceptors: [ServerInterceptorTarget],
289+
interceptors: [any ServerInterceptor],
290290
finally: @escaping @Sendable (
291291
_ request: StreamingServerRequest<Input>,
292292
_ context: ServerContext
@@ -304,7 +304,7 @@ extension ServerRPCExecutor {
304304
static func _intercept<Input, Output>(
305305
request: StreamingServerRequest<Input>,
306306
context: ServerContext,
307-
iterator: Array<ServerInterceptorTarget>.Iterator,
307+
iterator: Array<any ServerInterceptor>.Iterator,
308308
finally: @escaping @Sendable (
309309
_ request: StreamingServerRequest<Input>,
310310
_ context: ServerContext
@@ -313,29 +313,20 @@ extension ServerRPCExecutor {
313313
var iterator = iterator
314314

315315
switch iterator.next() {
316-
case .some(let interceptorTarget):
317-
if interceptorTarget.applies(to: context.descriptor) {
318-
let iter = iterator
319-
do {
320-
return try await interceptorTarget.interceptor.intercept(
321-
request: request,
322-
context: context
323-
) {
324-
try await self._intercept(request: $0, context: $1, iterator: iter, finally: finally)
325-
}
326-
} catch let error as RPCError {
327-
return StreamingServerResponse(error: error)
328-
} catch let other {
329-
let error = RPCError(code: .unknown, message: "", cause: other)
330-
return StreamingServerResponse(error: error)
331-
}
332-
} else {
333-
return try await self._intercept(
316+
case .some(let interceptor):
317+
let iter = iterator
318+
do {
319+
return try await interceptor.intercept(
334320
request: request,
335-
context: context,
336-
iterator: iterator,
337-
finally: finally
338-
)
321+
context: context
322+
) {
323+
try await self._intercept(request: $0, context: $1, iterator: iter, finally: finally)
324+
}
325+
} catch let error as RPCError {
326+
return StreamingServerResponse(error: error)
327+
} catch let other {
328+
let error = RPCError(code: .unknown, message: "", cause: other)
329+
return StreamingServerResponse(error: error)
339330
}
340331

341332
case .none:

Sources/GRPCCore/Call/Server/RPCRouter.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public struct RPCRouter: Sendable {
4343
RPCWriter<RPCResponsePart>.Closable
4444
>,
4545
_ context: ServerContext,
46-
_ interceptors: [ServerInterceptorTarget]
46+
_ interceptors: [any ServerInterceptor]
4747
) async -> Void
4848

4949
@inlinable
@@ -75,7 +75,7 @@ public struct RPCRouter: Sendable {
7575
RPCWriter<RPCResponsePart>.Closable
7676
>,
7777
context: ServerContext,
78-
interceptors: [ServerInterceptorTarget]
78+
interceptors: [any ServerInterceptor]
7979
) async {
8080
await self._fn(stream, context, interceptors)
8181
}
@@ -151,7 +151,7 @@ extension RPCRouter {
151151
RPCWriter<RPCResponsePart>.Closable
152152
>,
153153
context: ServerContext,
154-
interceptors: [ServerInterceptorTarget]
154+
interceptors: [any ServerInterceptor]
155155
) async {
156156
if let handler = self.handlers[stream.descriptor] {
157157
await handler.handle(stream: stream, context: context, interceptors: interceptors)

Sources/GRPCCore/GRPCServer.swift

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ public final class GRPCServer: Sendable {
173173
public convenience init(
174174
transport: any ServerTransport,
175175
services: [any RegistrableRPCService],
176-
interceptors: [ServerInterceptorTarget] = []
176+
interceptors: [ServerInterceptorTarget]
177177
) {
178178
var router = RPCRouter()
179179
for service in services {
@@ -218,7 +218,7 @@ public final class GRPCServer: Sendable {
218218
public init(
219219
transport: any ServerTransport,
220220
router: RPCRouter,
221-
interceptors: [ServerInterceptorTarget] = []
221+
interceptors: [ServerInterceptorTarget]
222222
) {
223223
self.state = Mutex(.notStarted)
224224
self.transport = transport
@@ -249,7 +249,13 @@ public final class GRPCServer: Sendable {
249249

250250
do {
251251
try await transport.listen { stream, context in
252-
await self.router.handle(stream: stream, context: context, interceptors: self.interceptors)
252+
await self.router.handle(
253+
stream: stream,
254+
context: context,
255+
interceptors: self.interceptors
256+
.filter { $0.applies(to: context.descriptor) }
257+
.map { $0.interceptor }
258+
)
253259
}
254260
} catch {
255261
throw RuntimeError(

Tests/GRPCCoreTests/Call/Server/Internal/ServerRPCExecutorTestSupport/ServerRPCExecutorTestHarness.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ struct ServerRPCExecutorTestHarness {
4646
}
4747
}
4848

49-
let interceptors: [ServerInterceptorTarget]
49+
let interceptors: [any ServerInterceptor]
5050

51-
init(interceptors: [ServerInterceptorTarget] = []) {
51+
init(interceptors: [any ServerInterceptor] = []) {
5252
self.interceptors = interceptors
5353
}
5454

Tests/GRPCCoreTests/Call/Server/Internal/ServerRPCExecutorTests.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ final class ServerRPCExecutorTests: XCTestCase {
259259

260260
// The interceptor skips the handler altogether.
261261
let harness = ServerRPCExecutorTestHarness(interceptors: [
262-
.allServices(interceptor: .rejectAll(with: error))
262+
.rejectAll(with: error)
263263
])
264264
try await harness.execute(
265265
deserializer: IdentityDeserializer(),
@@ -290,8 +290,8 @@ final class ServerRPCExecutorTests: XCTestCase {
290290
// The interceptor skips the handler altogether.
291291
let harness = ServerRPCExecutorTestHarness(
292292
interceptors: [
293-
.allServices(interceptor: .requestCounter(counter1)),
294-
.allServices(interceptor: .requestCounter(counter2)),
293+
.requestCounter(counter1),
294+
.requestCounter(counter2),
295295
]
296296
)
297297

@@ -314,9 +314,9 @@ final class ServerRPCExecutorTests: XCTestCase {
314314
// The interceptor skips the handler altogether.
315315
let harness = ServerRPCExecutorTestHarness(
316316
interceptors: [
317-
.allServices(interceptor: .requestCounter(counter1)),
318-
.allServices(interceptor: .rejectAll(with: RPCError(code: .unavailable, message: ""))),
319-
.allServices(interceptor: .requestCounter(counter2)),
317+
.requestCounter(counter1),
318+
.rejectAll(with: RPCError(code: .unavailable, message: "")),
319+
.requestCounter(counter2),
320320
]
321321
)
322322

@@ -336,7 +336,7 @@ final class ServerRPCExecutorTests: XCTestCase {
336336
func testThrowingInterceptor() async throws {
337337
let harness = ServerRPCExecutorTestHarness(
338338
interceptors: [
339-
.allServices(interceptor: .throwError(RPCError(code: .unavailable, message: "Unavailable")))
339+
.throwError(RPCError(code: .unavailable, message: "Unavailable"))
340340
]
341341
)
342342

0 commit comments

Comments
 (0)