Skip to content

Commit f24a9ce

Browse files
committed
Don’t create an EventLoopFuture chain
1 parent ed5d4fb commit f24a9ce

File tree

1 file changed

+33
-18
lines changed

1 file changed

+33
-18
lines changed

Sources/SwiftAwsLambda/Lambda.swift

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -119,10 +119,10 @@ public enum Lambda {
119119
let runner = LambdaRunner(eventLoop: self.eventLoop, configuration: self.configuration, lambdaHandler: self.handler)
120120
return runner.initialize(logger: logger).flatMap { _ in
121121
self.state = .active
122-
return self.run(logger: logger, runner: runner, count: 0)
122+
return self.run(runner: runner)
123123
}
124124
}
125-
125+
126126
func stop() {
127127
self.logger.info("lambda lifecycle stopping")
128128
self.state = .stopping
@@ -132,24 +132,39 @@ public enum Lambda {
132132
self.logger.info("lambda lifecycle shutdown")
133133
self.state = .shutdown
134134
}
135-
136-
private func run(logger: Logger, runner: LambdaRunner, count: Int) -> EventLoopFuture<Int> {
137-
switch self.state {
138-
case .active:
139-
if self.configuration.lifecycle.maxTimes > 0, count >= self.configuration.lifecycle.maxTimes {
140-
return self.eventLoop.makeSucceededFuture(count)
141-
}
142-
var logger = logger
143-
logger[metadataKey: "lifecycleIteration"] = "\(count)"
144-
return runner.run(logger: logger).flatMap { _ in
145-
// recursive! per aws lambda runtime spec the polling requests are to be done one at a time
146-
self.run(logger: logger, runner: runner, count: count + 1)
135+
136+
private func run(runner: LambdaRunner) -> EventLoopFuture<Int> {
137+
let promise = self.eventLoop.makePromise(of: Int.self)
138+
var count = 0
139+
140+
func _run() {
141+
switch self.state {
142+
case .active:
143+
if self.configuration.lifecycle.maxTimes > 0, count >= self.configuration.lifecycle.maxTimes {
144+
return promise.succeed(count)
145+
}
146+
var logger = self.logger
147+
logger[metadataKey: "lifecycleIteration"] = "\(count)"
148+
runner.run(logger: logger).whenComplete { (result) in
149+
switch result {
150+
case .success:
151+
// recursive! per aws lambda runtime spec the polling requests are to be done one at a time
152+
count += 1
153+
_run()
154+
case .failure(let error):
155+
promise.fail(error)
156+
}
157+
}
158+
case .stopping, .shutdown:
159+
promise.succeed(count)
160+
default:
161+
preconditionFailure("invalid run state: \(self.state)")
147162
}
148-
case .stopping, .shutdown:
149-
return self.eventLoop.makeSucceededFuture(count)
150-
default:
151-
preconditionFailure("invalid run state: \(self.state)")
152163
}
164+
165+
_run()
166+
167+
return promise.futureResult
153168
}
154169
}
155170

0 commit comments

Comments
 (0)