Skip to content

Commit 5e89827

Browse files
refactor(event-handler): move _registered_api_adapter_async to async_utils.py
Per maintainer feedback on #8157 - function belongs in async_utils.py alongside other async event handler internals (wrap_middleware_async, _run_sync_middleware_in_thread, etc.) Signed-off-by: hirenkumar-n-dholariya <hirenkumarnd@gmail.com>
1 parent 2612941 commit 5e89827

1 file changed

Lines changed: 54 additions & 1 deletion

File tree

aws_lambda_powertools/event_handler/middlewares/async_utils.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
if TYPE_CHECKING:
1111
from collections.abc import Callable
1212

13-
from aws_lambda_powertools.event_handler.api_gateway import ApiGatewayResolver, Response
13+
from aws_lambda_powertools.event_handler.api_gateway import ApiGatewayResolver, BedrockResponse, Response
1414

1515

1616
def wrap_middleware_async(middleware: Callable, next_handler: Callable) -> Callable:
@@ -105,3 +105,56 @@ def run_middleware() -> None:
105105
raise middleware_error_holder[0]
106106

107107
return middleware_result_holder[0]
108+
109+
async def _registered_api_adapter_async(
110+
app: "ApiGatewayResolver",
111+
next_middleware: Callable[..., Any],
112+
) -> "dict | tuple | Response | BedrockResponse":
113+
"""
114+
Async version of _registered_api_adapter.
115+
116+
Detects if the route handler is a coroutine and awaits it.
117+
_to_response() stays sync (CPU-bound — no async benefit).
118+
119+
IMPORTANT: This is an internal building block only.
120+
Nothing calls it in the resolve chain yet. It will be used
121+
by resolve_async() (see issue #8137).
122+
123+
Parameters
124+
----------
125+
app: ApiGatewayResolver
126+
The API Gateway resolver
127+
next_middleware: Callable[..., Any]
128+
The function to handle the API
129+
130+
Returns
131+
-------
132+
Response
133+
The API Response Object
134+
"""
135+
route_args: dict = app.context.get("_route_args", {})
136+
137+
route = app.context.get("_route")
138+
if route is not None:
139+
if not route.request_param_name_checked:
140+
from aws_lambda_powertools.event_handler.api_gateway import _find_request_param_name
141+
route.request_param_name = _find_request_param_name(next_middleware)
142+
route.request_param_name_checked = True
143+
if route.request_param_name:
144+
route_args = {**route_args, route.request_param_name: app.request}
145+
146+
if route.has_dependencies:
147+
from aws_lambda_powertools.event_handler.depends import build_dependency_tree, solve_dependencies
148+
dep_values = solve_dependencies(
149+
dependant=build_dependency_tree(route.func),
150+
request=app.request,
151+
dependency_overrides=app.dependency_overrides or None,
152+
)
153+
route_args.update(dep_values)
154+
155+
# Call handler — detect if result is a coroutine and await it
156+
result = next_middleware(**route_args)
157+
if inspect.iscoroutine(result):
158+
result = await result
159+
160+
return app._to_response(result)

0 commit comments

Comments
 (0)