|
10 | 10 | if TYPE_CHECKING: |
11 | 11 | from collections.abc import Callable |
12 | 12 |
|
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 |
14 | 14 |
|
15 | 15 |
|
16 | 16 | def wrap_middleware_async(middleware: Callable, next_handler: Callable) -> Callable: |
@@ -105,3 +105,56 @@ def run_middleware() -> None: |
105 | 105 | raise middleware_error_holder[0] |
106 | 106 |
|
107 | 107 | 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