@@ -28,7 +28,7 @@ func withMockServer<Result>(
2828) async throws -> Result {
2929 let eventLoopGroup = NIOSingletons . posixEventLoopGroup
3030 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 ( )
3232
3333 let result : Swift . Result < Result , any Error >
3434 do {
@@ -41,19 +41,19 @@ func withMockServer<Result>(
4141 return try result. get ( )
4242}
4343
44- final class MockLambdaServer {
44+ final class MockLambdaServer < Behavior : LambdaServerBehavior > {
4545 private let logger = Logger ( label: " MockLambdaServer " )
46- private let behavior : LambdaServerBehavior
46+ private let behavior : Behavior
4747 private let host : String
4848 private let port : Int
4949 private let keepAlive : Bool
5050 private let group : EventLoopGroup
5151
5252 private var channel : Channel ?
53- private var shutdown = false
53+ private var shutdown = false , n , m
5454
5555 init (
56- behavior: LambdaServerBehavior ,
56+ behavior: Behavior ,
5757 host: String = " 127.0.0.1 " ,
5858 port: Int = 7000 ,
5959 keepAlive: Bool = true ,
@@ -70,28 +70,33 @@ final class MockLambdaServer {
7070 assert ( shutdown)
7171 }
7272
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)
7579 . serverChannelOption ( ChannelOptions . socket ( SocketOptionLevel ( SOL_SOCKET) , SO_REUSEADDR) , value: 1 )
7680 . childChannelInitializer { channel in
7781 do {
7882 try channel. pipeline. syncOperations. configureHTTPServerPipeline ( withErrorHandling: true )
7983 try channel. pipeline. syncOperations. addHandler (
80- HTTPHandler ( logger: self . logger, keepAlive: self . keepAlive, behavior: self . behavior)
84+ HTTPHandler ( logger: logger, keepAlive: keepAlive, behavior: behavior)
8185 )
8286 return channel. eventLoop. makeSucceededVoidFuture ( )
8387 } catch {
8488 return channel. eventLoop. makeFailedFuture ( error)
8589 }
8690 }
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
9497 }
98+ self . logger. info ( " \( self ) started and listening on \( localAddress) " )
99+ return localAddress. port!
95100 }
96101
97102 func stop( ) -> EventLoopFuture < Void > {
@@ -255,7 +260,7 @@ final class HTTPHandler: ChannelInboundHandler {
255260 }
256261}
257262
258- protocol LambdaServerBehavior {
263+ protocol LambdaServerBehavior: Sendable {
259264 func getInvocation( ) -> GetInvocationResult
260265 func processResponse( requestId: String , response: String ? ) -> Result < Void , ProcessResponseError >
261266 func processError( requestId: String , error: ErrorResponse ) -> Result < Void , ProcessErrorError >
0 commit comments