@@ -28,7 +28,7 @@ func withMockServer<Result>(
28
28
) async throws -> Result {
29
29
let eventLoopGroup = NIOSingletons . posixEventLoopGroup
30
30
let server = MockLambdaServer ( behavior: behaviour, port: port, keepAlive: keepAlive, eventLoopGroup: eventLoopGroup)
31
- let port = try await server. start ( ) . get ( )
31
+ let port = try await server. start ( )
32
32
33
33
let result : Swift . Result < Result , any Error >
34
34
do {
@@ -41,19 +41,19 @@ func withMockServer<Result>(
41
41
return try result. get ( )
42
42
}
43
43
44
- final class MockLambdaServer {
44
+ final class MockLambdaServer < Behavior : LambdaServerBehavior > {
45
45
private let logger = Logger ( label: " MockLambdaServer " )
46
- private let behavior : LambdaServerBehavior
46
+ private let behavior : Behavior
47
47
private let host : String
48
48
private let port : Int
49
49
private let keepAlive : Bool
50
50
private let group : EventLoopGroup
51
51
52
52
private var channel : Channel ?
53
- private var shutdown = false
53
+ private var shutdown = false , n , m
54
54
55
55
init (
56
- behavior: LambdaServerBehavior ,
56
+ behavior: Behavior ,
57
57
host: String = " 127.0.0.1 " ,
58
58
port: Int = 7000 ,
59
59
keepAlive: Bool = true ,
@@ -70,28 +70,33 @@ final class MockLambdaServer {
70
70
assert ( shutdown)
71
71
}
72
72
73
- func start( ) -> EventLoopFuture < Int > {
74
- let bootstrap = ServerBootstrap ( group: group)
73
+ func start( ) async throws -> Int {
74
+ let logger = self . logger
75
+ let keepAlive = self . keepAlive
76
+ let behavior = self . behavior
77
+
78
+ let channel = try await ServerBootstrap ( group: group)
75
79
. serverChannelOption ( ChannelOptions . socket ( SocketOptionLevel ( SOL_SOCKET) , SO_REUSEADDR) , value: 1 )
76
80
. childChannelInitializer { channel in
77
81
do {
78
82
try channel. pipeline. syncOperations. configureHTTPServerPipeline ( withErrorHandling: true )
79
83
try channel. pipeline. syncOperations. addHandler (
80
- HTTPHandler ( logger: self . logger, keepAlive: self . keepAlive, behavior: self . behavior)
84
+ HTTPHandler ( logger: logger, keepAlive: keepAlive, behavior: behavior)
81
85
)
82
86
return channel. eventLoop. makeSucceededVoidFuture ( )
83
87
} catch {
84
88
return channel. eventLoop. makeFailedFuture ( error)
85
89
}
86
90
}
87
- return bootstrap. bind ( host: self . host, port: self . port) . flatMap { channel in
88
- self . channel = channel
89
- guard let localAddress = channel. localAddress else {
90
- return channel. eventLoop. makeFailedFuture ( ServerError . cantBind)
91
- }
92
- self . logger. info ( " \( self ) started and listening on \( localAddress) " )
93
- return channel. eventLoop. makeSucceededFuture ( localAddress. port!)
91
+ . bind ( host: self . host, port: self . port)
92
+ . get ( )
93
+
94
+ self . channel = channel
95
+ guard let localAddress = channel. localAddress else {
96
+ throw ServerError . cantBind
94
97
}
98
+ self . logger. info ( " \( self ) started and listening on \( localAddress) " )
99
+ return localAddress. port!
95
100
}
96
101
97
102
func stop( ) -> EventLoopFuture < Void > {
@@ -255,7 +260,7 @@ final class HTTPHandler: ChannelInboundHandler {
255
260
}
256
261
}
257
262
258
- protocol LambdaServerBehavior {
263
+ protocol LambdaServerBehavior: Sendable {
259
264
func getInvocation( ) -> GetInvocationResult
260
265
func processResponse( requestId: String , response: String ? ) -> Result < Void , ProcessResponseError >
261
266
func processError( requestId: String , error: ErrorResponse ) -> Result < Void , ProcessErrorError >
0 commit comments