@@ -119,10 +119,10 @@ public enum Lambda {
119
119
let runner = LambdaRunner ( eventLoop: self . eventLoop, configuration: self . configuration, lambdaHandler: self . handler)
120
120
return runner. initialize ( logger: logger) . flatMap { _ in
121
121
self . state = . active
122
- return self . run ( logger : logger , runner: runner, count : 0 )
122
+ return self . run ( runner: runner)
123
123
}
124
124
}
125
-
125
+
126
126
func stop( ) {
127
127
self . logger. info ( " lambda lifecycle stopping " )
128
128
self . state = . stopping
@@ -132,24 +132,39 @@ public enum Lambda {
132
132
self . logger. info ( " lambda lifecycle shutdown " )
133
133
self . state = . shutdown
134
134
}
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) " )
147
162
}
148
- case . stopping, . shutdown:
149
- return self . eventLoop. makeSucceededFuture ( count)
150
- default :
151
- preconditionFailure ( " invalid run state: \( self . state) " )
152
163
}
164
+
165
+ _run ( )
166
+
167
+ return promise. futureResult
153
168
}
154
169
}
155
170
0 commit comments