1+ from abc import ABC , abstractmethod
12from collections .abc import Callable
23from typing import TYPE_CHECKING , Any
34
2021)
2122from a2a .server .context import ServerCallContext
2223
23-
24- UserBuilder = Callable [[Request ], User ]
25-
26-
2724class StarletteUser (User ):
2825 """Adapts a Starlette BaseUser to the A2A User interface."""
2926
@@ -41,36 +38,52 @@ def user_name(self) -> str:
4138 return self ._user .display_name
4239
4340
44- def default_user_builder (request : Request ) -> User :
45- """Default strategy for creating an A2AUser from a Starlette Request."""
46- if 'user' in request .scope :
47- return StarletteUser (request .user )
48- return UnauthenticatedUser ()
41+ class ContextBuilder (ABC ):
42+ """A class for building ServerCallContexts using the Starlette Request."""
43+
44+ @abstractmethod
45+ def build (self , request : Request ) -> ServerCallContext :
46+ """Builds a ServerCallContext from a Starlette Request."""
47+
48+ @abstractmethod
49+ def build_user (self , request : Request ) -> User :
50+ """Builds a User from a Starlette Request."""
51+
52+
53+ class DefaultContextBuilder (ContextBuilder ):
54+ """A default implementation of ContextBuilder."""
4955
56+ def build (self , request : Request ) -> ServerCallContext :
57+ """Builds a ServerCallContext from a Starlette Request.
5058
51- def build_server_call_context (
52- request : Request , user_builder : UserBuilder
53- ) -> ServerCallContext :
54- """Builds a ServerCallContext from a Starlette Request.
59+ Args:
60+ request: The incoming Starlette Request object.
5561
56- Args:
57- request: The incoming Starlette Request object.
58- user_builder: A callable that creates a User from the request.
62+ Returns:
63+ A ServerCallContext instance populated with user and state
64+ information from the request.
65+ """
66+ state = {}
67+ if 'auth' in request .scope :
68+ state ['auth' ] = request .auth
69+ state ['headers' ] = dict (request .headers )
70+ return ServerCallContext (
71+ user = self .build_user (request ),
72+ state = state ,
73+ requested_extensions = get_requested_extensions (
74+ request .headers .getlist (HTTP_EXTENSION_HEADER )
75+ ),
76+ )
5977
60- Returns:
61- A ServerCallContext instance populated with user and state.
62- """
63- user = user_builder (request )
78+ def build_user (self , request : Request ) -> User :
79+ """Builds a User from a Starlette Request.
6480
65- state = {}
66- if 'auth' in request .scope :
67- state ['auth' ] = request .auth
68- state ['headers' ] = dict (request .headers )
81+ Args:
82+ request: The incoming Starlette Request object.
6983
70- return ServerCallContext (
71- user = user ,
72- state = state ,
73- requested_extensions = get_requested_extensions (
74- request .headers .getlist (HTTP_EXTENSION_HEADER )
75- ),
76- )
84+ Returns:
85+ A User instance populated with user information from the request.
86+ """
87+ if 'user' in request .scope :
88+ return StarletteUser (request .user )
89+ return UnauthenticatedUser ()
0 commit comments