@@ -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