@@ -41,6 +41,23 @@ public static class TemporalLambdaWorker
4141 LoadClientConnectOptions = options => LoadClientConnectOptions ( options ) ,
4242 } ) ;
4343
44+ /// <summary>
45+ /// Create an AWS Lambda handler that runs a Temporal worker for each invocation.
46+ /// </summary>
47+ /// <param name="version">Worker deployment version for this Lambda worker.</param>
48+ /// <param name="configureAsync">Callback to configure client and worker options per invocation.</param>
49+ /// <returns>A Lambda handler delegate.</returns>
50+ public static Func < object ? , ILambdaContext , Task > CreateHandler (
51+ WorkerDeploymentVersion version ,
52+ Func < LambdaWorkerConfig , Task > configureAsync ) =>
53+ CreateHandler (
54+ version ,
55+ configureAsync ,
56+ new TemporalLambdaWorkerHandlerOptions
57+ {
58+ LoadClientConnectOptions = options => LoadClientConnectOptions ( options ) ,
59+ } ) ;
60+
4461 /// <summary>
4562 /// Load Temporal client connection options using AWS Lambda-aware config file resolution.
4663 /// </summary>
@@ -80,14 +97,44 @@ public static TemporalClientConnectOptions LoadClientConnectOptions(
8097 WorkerDeploymentVersion version ,
8198 Action < LambdaWorkerConfig > configure ,
8299 TemporalLambdaWorkerHandlerOptions handlerOptions )
100+ {
101+ ValidateCreateHandlerArgs ( version , configure , nameof ( configure ) , handlerOptions ) ;
102+ var config = CreateConfig ( version , handlerOptions ) ;
103+ configure ( config ) ;
104+ var state = PrepareHandlerState ( version , config , handlerOptions ) ;
105+ return state . HandleAsync ;
106+ }
107+
108+ /// <summary>
109+ /// Create an AWS Lambda handler with overridable internals for tests.
110+ /// </summary>
111+ /// <param name="version">Worker deployment version for this Lambda worker.</param>
112+ /// <param name="configureAsync">Callback to configure client and worker options per invocation.</param>
113+ /// <param name="handlerOptions">Internal handler options.</param>
114+ /// <returns>A Lambda handler delegate.</returns>
115+ internal static Func < object ? , ILambdaContext , Task > CreateHandler (
116+ WorkerDeploymentVersion version ,
117+ Func < LambdaWorkerConfig , Task > configureAsync ,
118+ TemporalLambdaWorkerHandlerOptions handlerOptions )
119+ {
120+ ValidateCreateHandlerArgs ( version , configureAsync , nameof ( configureAsync ) , handlerOptions ) ;
121+ var state = new AsyncLambdaWorkerHandlerState ( version , configureAsync , handlerOptions ) ;
122+ return state . HandleAsync ;
123+ }
124+
125+ private static void ValidateCreateHandlerArgs (
126+ WorkerDeploymentVersion version ,
127+ object configure ,
128+ string configureParamName ,
129+ TemporalLambdaWorkerHandlerOptions handlerOptions )
83130 {
84131 if ( version == null )
85132 {
86133 throw new ArgumentNullException ( nameof ( version ) ) ;
87134 }
88135 if ( configure == null )
89136 {
90- throw new ArgumentNullException ( nameof ( configure ) ) ;
137+ throw new ArgumentNullException ( configureParamName ) ;
91138 }
92139 if ( handlerOptions == null )
93140 {
@@ -101,7 +148,12 @@ public static TemporalClientConnectOptions LoadClientConnectOptions(
101148 {
102149 throw new ArgumentException ( "Build ID must be set" , nameof ( version ) ) ;
103150 }
151+ }
104152
153+ private static LambdaWorkerConfig CreateConfig (
154+ WorkerDeploymentVersion version ,
155+ TemporalLambdaWorkerHandlerOptions handlerOptions )
156+ {
105157 var loadClientConnectOptions = handlerOptions . LoadClientConnectOptions ;
106158 var config = new LambdaWorkerConfig (
107159 loadClientConnectOptions == null ?
@@ -114,9 +166,7 @@ public static TemporalClientConnectOptions LoadClientConnectOptions(
114166 }
115167 ApplyDeploymentVersion ( config . WorkerOptions , version ) ;
116168
117- configure ( config ) ;
118- var state = PrepareHandlerState ( version , config , handlerOptions ) ;
119- return state . HandleAsync ;
169+ return config ;
120170 }
121171
122172 private static LambdaWorkerHandlerState PrepareHandlerState (
@@ -345,5 +395,35 @@ private async Task RunShutdownHooksAsync(ILambdaContext context)
345395 }
346396 }
347397 }
398+
399+ private sealed class AsyncLambdaWorkerHandlerState
400+ {
401+ private readonly WorkerDeploymentVersion version ;
402+ private readonly Func < LambdaWorkerConfig , Task > configureAsync ;
403+ private readonly TemporalLambdaWorkerHandlerOptions handlerOptions ;
404+
405+ public AsyncLambdaWorkerHandlerState (
406+ WorkerDeploymentVersion version ,
407+ Func < LambdaWorkerConfig , Task > configureAsync ,
408+ TemporalLambdaWorkerHandlerOptions handlerOptions )
409+ {
410+ this . version = version ;
411+ this . configureAsync = configureAsync ;
412+ this . handlerOptions = handlerOptions ;
413+ }
414+
415+ public async Task HandleAsync ( object ? input , ILambdaContext context )
416+ {
417+ if ( context == null )
418+ {
419+ throw new ArgumentNullException ( nameof ( context ) ) ;
420+ }
421+
422+ var config = CreateConfig ( version , handlerOptions ) ;
423+ await configureAsync ( config ) . ConfigureAwait ( false ) ;
424+ var state = PrepareHandlerState ( version , config , handlerOptions ) ;
425+ await state . HandleAsync ( input , context ) . ConfigureAwait ( false ) ;
426+ }
427+ }
348428 }
349429}
0 commit comments