@@ -19,12 +19,14 @@ import NIOCore
1919/// `LambdaRuntime` manages the Lambda process lifecycle.
2020///
2121/// Use this API, if you build a higher level web framework which shall be able to run inside the Lambda environment.
22- public final class LambdaRuntime < Handler: ByteBufferLambdaHandler > {
22+ public final class LambdaRuntime < Handler: LambdaRuntimeHandler > {
2323 private let eventLoop : EventLoop
2424 private let shutdownPromise : EventLoopPromise < Int >
2525 private let logger : Logger
2626 private let configuration : LambdaConfiguration
2727
28+ private let handlerProvider : ( LambdaInitializationContext ) -> EventLoopFuture < Handler >
29+
2830 private var state = State . idle {
2931 willSet {
3032 self . eventLoop. assertInEventLoop ( )
@@ -35,18 +37,41 @@ public final class LambdaRuntime<Handler: ByteBufferLambdaHandler> {
3537 /// Create a new `LambdaRuntime`.
3638 ///
3739 /// - parameters:
38- /// - handlerType: The ``ByteBufferLambdaHandler `` type the `LambdaRuntime` shall create and manage.
40+ /// - handlerProvider: A provider of the ``Handler `` the `LambdaRuntime` will manage.
3941 /// - eventLoop: An `EventLoop` to run the Lambda on.
4042 /// - logger: A `Logger` to log the Lambda events.
41- public convenience init ( _ handlerType: Handler . Type , eventLoop: EventLoop , logger: Logger ) {
42- self . init ( handlerType: handlerType, eventLoop: eventLoop, logger: logger, configuration: . init( ) )
43+ @usableFromInline
44+ convenience init (
45+ handlerProvider: @escaping ( LambdaInitializationContext ) -> EventLoopFuture < Handler > ,
46+ eventLoop: EventLoop ,
47+ logger: Logger
48+ ) {
49+ self . init (
50+ handlerProvider: handlerProvider,
51+ eventLoop: eventLoop,
52+ logger: logger,
53+ configuration: . init( )
54+ )
4355 }
4456
45- init ( handlerType: Handler . Type , eventLoop: EventLoop , logger: Logger , configuration: LambdaConfiguration ) {
57+ /// Create a new `LambdaRuntime`.
58+ ///
59+ /// - parameters:
60+ /// - handlerProvider: A provider of the ``Handler`` the `LambdaRuntime` will manage.
61+ /// - eventLoop: An `EventLoop` to run the Lambda on.
62+ /// - logger: A `Logger` to log the Lambda events.
63+ init (
64+ handlerProvider: @escaping ( LambdaInitializationContext ) -> EventLoopFuture < Handler > ,
65+ eventLoop: EventLoop ,
66+ logger: Logger ,
67+ configuration: LambdaConfiguration
68+ ) {
4669 self . eventLoop = eventLoop
4770 self . shutdownPromise = eventLoop. makePromise ( of: Int . self)
4871 self . logger = logger
4972 self . configuration = configuration
73+
74+ self . handlerProvider = handlerProvider
5075 }
5176
5277 deinit {
@@ -85,7 +110,7 @@ public final class LambdaRuntime<Handler: ByteBufferLambdaHandler> {
85110 let terminator = LambdaTerminator ( )
86111 let runner = LambdaRunner ( eventLoop: self . eventLoop, configuration: self . configuration)
87112
88- let startupFuture = runner. initialize ( handlerType : Handler . self, logger: logger, terminator: terminator)
113+ let startupFuture = runner. initialize ( handlerProvider : self . handlerProvider , logger: logger, terminator: terminator)
89114 startupFuture. flatMap { handler -> EventLoopFuture < Result < Int , Error > > in
90115 // after the startup future has succeeded, we have a handler that we can use
91116 // to `run` the lambda.
@@ -175,7 +200,7 @@ public final class LambdaRuntime<Handler: ByteBufferLambdaHandler> {
175200 private enum State {
176201 case idle
177202 case initializing
178- case active( LambdaRunner , any ByteBufferLambdaHandler )
203+ case active( LambdaRunner , any LambdaRuntimeHandler )
179204 case shuttingdown
180205 case shutdown
181206
@@ -204,8 +229,16 @@ public enum LambdaRuntimeFactory {
204229 /// - eventLoop: An `EventLoop` to run the Lambda on.
205230 /// - logger: A `Logger` to log the Lambda events.
206231 @inlinable
207- public static func makeRuntime< H: SimpleLambdaHandler > ( _ handlerType: H . Type , eventLoop: any EventLoop , logger: Logger ) -> LambdaRuntime < some ByteBufferLambdaHandler > {
208- LambdaRuntime < CodableSimpleLambdaHandler < H > > ( CodableSimpleLambdaHandler< H> . self , eventLoop: eventLoop, logger: logger)
232+ public static func makeRuntime< Handler: SimpleLambdaHandler > (
233+ _ handlerType: Handler . Type ,
234+ eventLoop: any EventLoop ,
235+ logger: Logger
236+ ) -> LambdaRuntime < some ByteBufferLambdaHandler > {
237+ LambdaRuntime< CodableSimpleLambdaHandler< Handler>>(
238+ handlerProvider: CodableSimpleLambdaHandler< Handler> . makeHandler( context: ) ,
239+ eventLoop: eventLoop,
240+ logger: logger
241+ )
209242 }
210243
211244 /// Create a new `LambdaRuntime`.
@@ -215,8 +248,16 @@ public enum LambdaRuntimeFactory {
215248 /// - eventLoop: An `EventLoop` to run the Lambda on.
216249 /// - logger: A `Logger` to log the Lambda events.
217250 @inlinable
218- public static func makeRuntime< H: LambdaHandler > ( _ handlerType: H . Type , eventLoop: any EventLoop , logger: Logger ) -> LambdaRuntime < some ByteBufferLambdaHandler > {
219- LambdaRuntime < CodableLambdaHandler < H > > ( CodableLambdaHandler< H> . self , eventLoop: eventLoop, logger: logger)
251+ public static func makeRuntime< Handler: LambdaHandler > (
252+ _ handlerType: Handler . Type ,
253+ eventLoop: any EventLoop ,
254+ logger: Logger
255+ ) -> LambdaRuntime < some LambdaRuntimeHandler > {
256+ LambdaRuntime< CodableLambdaHandler< Handler>>(
257+ handlerProvider: CodableLambdaHandler< Handler> . makeHandler( context: ) ,
258+ eventLoop: eventLoop,
259+ logger: logger
260+ )
220261 }
221262
222263 /// Create a new `LambdaRuntime`.
@@ -226,8 +267,79 @@ public enum LambdaRuntimeFactory {
226267 /// - eventLoop: An `EventLoop` to run the Lambda on.
227268 /// - logger: A `Logger` to log the Lambda events.
228269 @inlinable
229- public static func makeRuntime< H: EventLoopLambdaHandler > ( _ handlerType: H . Type , eventLoop: any EventLoop , logger: Logger ) -> LambdaRuntime < some ByteBufferLambdaHandler > {
230- LambdaRuntime < CodableEventLoopLambdaHandler < H > > ( CodableEventLoopLambdaHandler< H> . self , eventLoop: eventLoop, logger: logger)
270+ public static func makeRuntime< Handler: EventLoopLambdaHandler > (
271+ _ handlerType: Handler . Type ,
272+ eventLoop: any EventLoop ,
273+ logger: Logger
274+ ) -> LambdaRuntime < some LambdaRuntimeHandler > {
275+ LambdaRuntime< CodableEventLoopLambdaHandler< Handler>>(
276+ handlerProvider: CodableEventLoopLambdaHandler< Handler> . makeHandler( context: ) ,
277+ eventLoop: eventLoop,
278+ logger: logger
279+ )
280+ }
281+
282+ /// Create a new `LambdaRuntime`.
283+ ///
284+ /// - parameters:
285+ /// - handlerType: The ``ByteBufferLambdaHandler`` type the `LambdaRuntime` shall create and manage.
286+ /// - eventLoop: An `EventLoop` to run the Lambda on.
287+ /// - logger: A `Logger` to log the Lambda events.
288+ @inlinable
289+ public static func makeRuntime< Handler: ByteBufferLambdaHandler > (
290+ _ handlerType: Handler . Type ,
291+ eventLoop: any EventLoop ,
292+ logger: Logger
293+ ) -> LambdaRuntime < some LambdaRuntimeHandler > {
294+ LambdaRuntime < Handler > (
295+ handlerProvider: Handler . makeHandler ( context: ) ,
296+ eventLoop: eventLoop,
297+ logger: logger
298+ )
299+ }
300+
301+ /// Create a new `LambdaRuntime`.
302+ ///
303+ /// - parameters:
304+ /// - handlerProvider: A provider of the ``Handler`` the `LambdaRuntime` will manage.
305+ /// - eventLoop: An `EventLoop` to run the Lambda on.
306+ /// - logger: A `Logger` to log the Lambda events.
307+ @inlinable
308+ public static func makeRuntime< Handler: LambdaRuntimeHandler > (
309+ handlerProvider: @escaping ( LambdaInitializationContext ) -> EventLoopFuture < Handler > ,
310+ eventLoop: any EventLoop ,
311+ logger: Logger
312+ ) -> LambdaRuntime < Handler > {
313+ LambdaRuntime (
314+ handlerProvider: handlerProvider,
315+ eventLoop: eventLoop,
316+ logger: logger
317+ )
318+ }
319+
320+ /// Create a new `LambdaRuntime`.
321+ ///
322+ /// - parameters:
323+ /// - handlerProvider: A provider of the ``Handler`` the `LambdaRuntime` will manage.
324+ /// - eventLoop: An `EventLoop` to run the Lambda on.
325+ /// - logger: A `Logger` to log the Lambda events.
326+ @inlinable
327+ public static func makeRuntime< Handler: LambdaRuntimeHandler > (
328+ handlerProvider: @escaping ( LambdaInitializationContext ) async throws -> Handler ,
329+ eventLoop: any EventLoop ,
330+ logger: Logger
331+ ) -> LambdaRuntime < Handler > {
332+ LambdaRuntime (
333+ handlerProvider: { context in
334+ let promise = eventLoop. makePromise ( of: Handler . self)
335+ promise. completeWithTask {
336+ try await handlerProvider ( context)
337+ }
338+ return promise. futureResult
339+ } ,
340+ eventLoop: eventLoop,
341+ logger: logger
342+ )
231343 }
232344}
233345
0 commit comments