
    {h                        d Z ddlZddlZddlZddlmZmZ ddlmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ ddlZddlmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZmZm Z  ddl!m"Z"m#Z# ddl$m%Z%m&Z& ddl'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4  ejj                  e6      Z7dZ8dZ9dZ:dZ;dZ<dZ= ej|                  d      Z?e@ZAe@ZBe G d d             ZCe
eCge	d   f   ZD G d de      ZE G d d      ZFy)z
StreamableHTTP Server Transport Module

This module implements an HTTP transport layer with Streamable HTTP.

The transport handles bidirectional communication using HTTP requests and
responses, with streaming support for long-running operations.
    N)ABCabstractmethod)AsyncGenerator	AwaitableCallable)asynccontextmanager)	dataclass)
HTTPStatus)MemoryObjectReceiveStreamMemoryObjectSendStream)ValidationError)EventSourceResponse)Request)Response)ReceiveScopeSend)TransportSecurityMiddlewareTransportSecuritySettings)ServerMessageMetadataSessionMessage)SUPPORTED_PROTOCOL_VERSIONS)DEFAULT_NEGOTIATED_VERSIONINTERNAL_ERRORINVALID_PARAMSINVALID_REQUESTPARSE_ERROR	ErrorDataJSONRPCErrorJSONRPCMessageJSONRPCRequestJSONRPCResponse	RequestIdzmcp-session-idzmcp-protocol-versionzlast-event-idzapplication/jsonztext/event-stream_GET_streamz^[\x21-\x7E]+$c                   0    e Zd ZU dZeed<   dZedz  ed<   y)EventMessagezM
    A JSONRPCMessage with an optional event ID for stream resumability.
    messageNevent_id)__name__
__module____qualname____doc__r    __annotations__r(   str     [/var/www/html/hubwallet-dev/venv/lib/python3.12/site-packages/mcp/server/streamable_http.pyr&   r&   G   s     HcDjr0   r&   c                   R    e Zd ZdZedededefd       Zedede	dedz  fd	       Z
y)

EventStorez?
    Interface for resumability support via event storage.
    	stream_idr'   returnc                    K   yw)z
        Stores an event for later retrieval.

        Args:
            stream_id: ID of the stream the event belongs to
            message: The JSON-RPC message to store

        Returns:
            The generated event ID for the stored event
        Nr/   )selfr4   r'   s      r1   store_eventzEventStore.store_eventY   s      	   last_event_idsend_callbackNc                    K   yw)a2  
        Replays events that occurred after the specified event ID.

        Args:
            last_event_id: The ID of the last event the client received
            send_callback: A callback function to send events to the client

        Returns:
            The stream ID of the replayed events
        Nr/   )r7   r:   r;   s      r1   replay_events_afterzEventStore.replay_events_afterg   s       	r9   )r)   r*   r+   r,   r   StreamIdr    EventIdr8   EventCallbackr=   r/   r0   r1   r3   r3   T   se     8 n QX    % 
D	 r0   r3   c                      e Zd ZU dZdZeeez     dz  ed<   dZ	e
eez     dz  ed<   dZee   dz  ed<   dZe
e   dz  ed<   eed<   	 	 	 d-dedz  d	ed
edz  dedz  ddf
dZedefd       Zedfdedededeeef   dz  def
dZej6                  dfdedz  dedeeef   dz  defdZdededz  fdZde deeef   fdZ!de"ddfdZ#de$de%de&ddfdZ'dede(eef   fd Z)dedefd!Z*de$dede%de&ddf
d"Z+dede&ddfd#Z,dede&ddfd$Z-d.d%Z.dede&ddfd&Z/dede&defd'Z0dede&defd(Z1dede&defd)Z2d*edede&ddfd+Z3e4de5e(e
eez     ee   f   df   fd,       Z6y)/StreamableHTTPServerTransportz
    HTTP server transport with event streaming support for MCP.

    Handles JSON-RPC messages in HTTP POST requests with SSE streaming.
    Supports optional JSON responses and session management.
    N_read_stream_writer_read_stream_write_stream_write_stream_reader	_securitymcp_session_idis_json_response_enabledevent_storesecurity_settingsr5   c                     | t         j                  |      st        d      || _        || _        || _        t        |      | _        i | _        d| _	        y)a  
        Initialize a new StreamableHTTP server transport.

        Args:
            mcp_session_id: Optional session identifier for this connection.
                            Must contain only visible ASCII characters (0x21-0x7E).
            is_json_response_enabled: If True, return JSON responses for requests
                                    instead of SSE streams. Default is False.
            event_store: Event store for resumability support. If provided,
                        resumability will be enabled, allowing clients to
                        reconnect and resume messages.
            security_settings: Optional security settings for DNS rebinding protection.

        Raises:
            ValueError: If the session ID contains invalid characters.
        NzASession ID must only contain visible ASCII characters (0x21-0x7E)F)
SESSION_ID_PATTERN	fullmatch
ValueErrorrH   rI   _event_storer   rG   _request_streams_terminated)r7   rH   rI   rJ   rK   s        r1   __init__z&StreamableHTTPServerTransport.__init__   s`    . %.@.J.J>.Z`aa,(@%'45FG  	 !r0   c                     | j                   S )z7Check if this transport has been explicitly terminated.)rR   )r7   s    r1   is_terminatedz+StreamableHTTPServerTransport.is_terminated   s     r0   error_messagestatus_code
error_codeheadersc                     dt         i}|r|j                  |       | j                  r| j                  |t        <   t	        ddt        ||            }t        |j                  dd      ||      S )	z6Create an error response with a simple string message.Content-Typez2.0zserver-error)coder'   )jsonrpciderrorTby_aliasexclude_nonerW   rY   )CONTENT_TYPE_JSONupdaterH   MCP_SESSION_ID_HEADERr   r   r   model_dump_json)r7   rV   rW   rX   rY   response_headerserror_responses          r1   _create_error_responsez4StreamableHTTPServerTransport._create_error_response   s     +,=>##G,6:6I6I23 &%
 **Dt*L#$
 	
r0   response_messagec                     dt         i}|r|j                  |       | j                  r| j                  |t        <   t	        |r|j                  dd      nd||      S )z,Create a JSON response from a JSONRPCMessager[   Tr`   Nrc   )rd   re   rH   rf   r   rg   )r7   rk   rW   rY   rh   s        r1   _create_json_responsez3StreamableHTTPServerTransport._create_json_response   sh     +,=>##G,6:6I6I23Rb,,d,Nhl#$
 	
r0   requestc                 @    |j                   j                  t              S )z,Extract the session ID from request headers.)rY   getrf   )r7   rn   s     r1   _get_session_idz-StreamableHTTPServerTransport._get_session_id   s    ""#899r0   event_messagec                 |    d|j                   j                  dd      d}|j                  r|j                  |d<   |S )z2Create event data dictionary from an EventMessage.r'   Tr`   )eventdatar^   )r'   rg   r(   )r7   rr   
event_datas      r1   _create_event_dataz0StreamableHTTPServerTransport._create_event_data   sI     !))994VZ9[

 !!,55Jtr0   
request_idc                   K   || j                   v rn	 | j                   |   d   j                          d{    | j                   |   d   j                          d{    | j                   j                  |d       yy7 J7 $# t        $ r t        j	                  d       Y Bw xY w# | j                   j                  |d       w xY ww)z/Clean up memory streams for a given request ID.r   N   z4Error closing memory streams - may already be closed)rQ   aclose	Exceptionloggerdebugpop)r7   rx   s     r1   _clean_up_memory_streamsz6StreamableHTTPServerTransport._clean_up_memory_streams   s     ...	<++J7:AACCC++J7:AACCC %%))*d; / DC USTU
 %%))*d;sV   C	#B B 'B BB "C	 B B B%"B( $B%%B( (CC	scopereceivesendc                   K   t        ||      }|j                  dk(  }| j                  j                  ||       d{   }|r ||||       d{    y| j                  r3| j                  dt        j                        } ||||       d{    y|j                  dk(  r| j                  ||||       d{    y|j                  dk(  r| j                  ||       d{    y|j                  dk(  r| j                  ||       d{    y| j                  ||       d{    y7 7 7 7 z7 R7 *7 w)z6Application entry point that handles all HTTP requestsPOST)is_postNz&Not Found: Session has been terminatedGETDELETE)r   methodrG   validate_requestrR   rj   r
   	NOT_FOUND_handle_post_request_handle_get_request_handle_delete_request_handle_unsupported_request)r7   r   r   r   rn   r   ri   responses           r1   handle_requestz,StreamableHTTPServerTransport.handle_request  s6    %) ..F*#~~>>wPW>XX 666228$$H 5'4000>>V#++E7GTJJJ^^u$**7D999^^x'--gt<<<227DAAA+ Y6 1 K9<As{   <E D2E D4>E D6+E =D8>)E 'D:()E D<E ,D>-E 4E 6E 8E :E <E >E c                     |j                   j                  dd      }|j                  d      D cg c]  }|j                          }}t	        d |D              }t	        d |D              }||fS c c}w )z6Check if the request accepts the required media types.accept ,c              3   F   K   | ]  }|j                  t                y wN)
startswithrd   .0
media_types     r1   	<genexpr>zFStreamableHTTPServerTransport._check_accept_headers.<locals>.<genexpr>)  s     _Jz,,->?_   !c              3   F   K   | ]  }|j                  t                y wr   )r   CONTENT_TYPE_SSEr   s     r1   r   zFStreamableHTTPServerTransport._check_accept_headers.<locals>.<genexpr>*  s     ]*j++,<=]r   rY   rp   splitstripany)r7   rn   accept_headerr   accept_typeshas_jsonhas_sses          r1   _check_accept_headersz3StreamableHTTPServerTransport._check_accept_headers$  ss    ++Hb9=J=P=PQT=UVz
((*VV_R^__]P\]]   Ws   A1c                     |j                   j                  dd      }|j                  d      d   j                  d      D cg c]  }|j                          }}t	        d |D              S c c}w )z2Check if the request has the correct Content-Type.zcontent-typer   ;r   r   c              3   .   K   | ]  }|t         k(    y wr   )rd   )r   parts     r1   r   zDStreamableHTTPServerTransport._check_content_type.<locals>.<genexpr>3  s     L4,,Ls   r   )r7   rn   content_typer   content_type_partss        r1   _check_content_typez1StreamableHTTPServerTransport._check_content_type.  sf    **>2>7C7I7I#7Nq7Q7W7WX[7\]tdjjl]]L9KLLL ^s   A-c                 F   K    j                   }|t        d      	  j                  |      \  }}|r|s3 j                  dt        j
                        } ||||       d{    y j                  |      s3 j                  dt        j                        } ||||       d{    y|j                          d{   }		 t        j                  |	      }
	 t        j                   |
      }t'        |j(                  t*              xr |j(                  j,                  dk(  }|ra j.                  rp j1                  |      }|r]| j.                  k7  rN j                  dt        j2                        } ||||       d{    y j5                  ||       d{   syt'        |j(                  t*              se j7                  dt        j8                        } ||||       d{    t;        |	      }t=        ||
      }|j?                  |       d{    yt        |j(                  j@                        tC        jD                  tF           d       jH                  <    jH                     d    jJ                  r7t;        |	      }t=        ||
      }|j?                  |       d{    	 d}2 3 d{   }t'        |jL                  j(                  tN        tP        z        r|jL                  } n7tR        jU                  d|jL                  j(                  j,                          y|r$ j7                  |      } ||||       d{    nGtR        jW                  d        j                  dt        jX                        } ||||       d{     ja                         d{    ytC        jD                  tb        t        t        f      d      \  } fd}ddtd        d j.                  rtf         j.                  ini }ti        |||      }	 tC        jj                         4 d{   }|jm                  ||||       t;        |	      }t=        ||
      }|j?                  |       d{    ddd      d{    yy7 @7 7 # t        j                  $ rN} j                  dt        |       t        j                  t              } ||||       d{  7   Y d}~yd}~ww xY w# t"        $ rN} j                  dt        |       t        j                  t$              } ||||       d{  7   Y d}~yd}~ww xY w7 7 7 7 V7 7 6 E7 %7 # tZ        $ rQ tR        j]                  d        j                  dt        jX                  t^              } ||||       d{  7   Y 7w xY w7 '#  ja                         d{  7   w xY w7 7 {7 n# 1 d{  7  sw Y   ~xY w# tZ        $ rd tR        j]                  d       jo                          d{  7   |jo                          d{  7    ja                         d{  7   Y yw xY w# tZ        $ r}tR        j]                  d        j                  d| t        jX                  t^              } ||||       d{  7   |r#|j?                  t[        |             d{  7   Y d}~yd}~ww xY ww)z2Handle POST requests containing JSON-RPC messages.NBNo read stream writer available. Ensure connect() is called first.zNNot Acceptable: Client must accept both application/json and text/event-streamz=Unsupported Media Type: Content-Type must be application/jsonzParse error: zValidation error: 
initialize(Not Found: Invalid or expired session ID)request_context)metadatar   rz   z
received: z1No response message received before stream closedz.Error processing request: No response receivedzError processing JSON responsezError processing requestc                    K   	 4 d {    4 d {    2 3 d {   } j                  |       }j                  |       d {    t        | j                  j                  t
        t        z        s_ d d d       d {    d d d       d {    t        j                  d       j                         d {    y 7 7 7 7 6 Y7 M# 1 d {  7  sw Y   ]xY w7 T# 1 d {  7  sw Y   dxY w# t        $ r t        j                  d       Y w xY w7 a# t        j                  d       j                         d {  7   w xY ww)NzError in SSE writerzClosing SSE writer)rw   r   
isinstancer'   rootr"   r   r|   r}   	exceptionr~   r   )rr   rv   rx   request_stream_readerr7   sse_stream_writers     r1   
sse_writerzFStreamableHTTPServerTransport._handle_post_request.<locals>.sse_writer  sN    H#4 * *6K * *7L 
* 
*m-1-D-D]-S
&7&<&<Z&H H H $.$1$9$9$>$>$3l$B$" %** * * *  %9:";;JGGG#* *
* !I 8M* * * * * * * * % @(()>?@ H %9:";;JGGGs  ED CD C/CC/CCC
C&CC
/C<C=C/C	C/D C-D )ED(ED C/CCCC/C*	C!C*	&C/-D /D5C86D=D D%"D* $D%%D* (E**EEEEno-cache, no-transform
keep-alivezCache-Control
Connectionr[   contentdata_sender_callablerY   zSSE response errorzError handling POST requestzError handling POST request: )8rC   rO   r   rj   r
   NOT_ACCEPTABLEr   UNSUPPORTED_MEDIA_TYPEbodyjsonloadsJSONDecodeErrorr.   BAD_REQUESTr   r    model_validater   r   r   r   r!   r   rH   rq   r   _validate_request_headersrm   ACCEPTEDr   r   r   r^   anyiocreate_memory_object_streamr&   rQ   rI   r'   r"   r   r}   r~   r_   INTERNAL_SERVER_ERRORr|   r   r   r   dictr   rf   r   create_task_group
start_soonr{   )r7   r   rn   r   r   writerr   r   r   r   raw_messageer'   is_initialization_requestrequest_session_idr   session_messagerk   rr   sse_stream_readerr   rY   tgerrrx   r   r   s   `                       @@@r1   r   z2StreamableHTTPServerTransport._handle_post_request5  s    ))>abb@	 $ : :7 CHg66e-- ugt444 ++G466S55 ugt444 !'D"jj.	(77D )37<<(P(xU\UaUaUhUhlxUx%(&&)-)=)=g)F& *.@DDWDW.W#'#>#>F&00$ 'ugt<<<99'4HHH gllN;55'' ugt444 1I"08"Lkk/222 W\\__-J050Q0QR^0_`a0bD!!*-$($9$9*$Ea$H!,,0I"08"Lkk/222%D (,$ 0E [ [m%m&;&;&@&@/T`B`a/</D/D,! #LL:m6K6K6P6P6W6W5X)YZ (#'#=#=>N#O&ugt<<< %XY#'#>#>L&<<$ 'ugt<<< 77
CCC 8=7X7XY]^acf^fYg7hij7k4!#4H4 &>".$4 HLGZGZ-t/B/BC`b	 /-)3#D$668 ; ;BhwE#8#Q*88*T$kk/:::; ; ;E 5 5 ( '' 66s1vh7OQ[QgQgituugt444 # 66(Q1**"
 ugt4440 =H 5
 3 3[/D = =  9$$%EF#::2"88& H
 #5'48889 D$77
CCCZ;
 ;; ; ; ; ! D$$%9:+22444+2244477
CCC	D  
	:;22/u500H
 5'4000kk)C.111
	s  \!AZ &R&'Z +\!,>Z *R)+Z /\!0Z R,Z 	R/ T 4BZ U-Z \!Z !U0"Z &\!'AZ .U3/1Z  U6!Z %\!&BZ :U9;Z  V U?U<	U?BV VAV %V&V *Z >W%?Z \!A,Z 1X& 	X
X& AXX
XX& X X& $\!&Z )Z ,Z /T>T TTZ 
\!TZ 	U*>U%UU% Z $\!%U**Z 0Z 3Z 6Z 9Z <U??V V V AW"WW"W( !W""W( %Z (X=X >XZ X& 
XX& X#XX#X& &1ZYZ0Y31Z
ZZZ \!ZZ 	\A
\)[,*$\\\\!\\!c                 ~   K    j                   }|t        d       j                  |      \  }}|sG j                  dt        j
                        } ||j                  |j                  |       d{    y j                  ||       d{   sy|j                  j                  t              x}r j                  |||       d{    yddt        d} j                  r j                  |t        <   t          j"                  v rG j                  dt        j$                        } ||j                  |j                  |       d{    yt'        j(                  t*        t,        t,        f      d      \  }	 fd	}
t/        |	|
|
      }	  ||j                  |j                  |       d{    y7 H7 07 7 u7 # t0        $ rh t2        j5                  d       j7                          d{  7   |	j7                          d{  7    j9                  t                d{  7   Y yw xY ww)a   
        Handle GET request to establish SSE.

        This allows the server to communicate to the client without the client
        first sending data via HTTP POST. The server can send JSON-RPC requests
        and notifications on this stream.
        Nr   z4Not Acceptable: Client must accept text/event-streamr   r   r   z4Conflict: Only one SSE stream is allowed per sessionr   c                    K   	 t        j                  t           d      j                  t        <   j                  t           d   } 4 d {    | 4 d {    | 2 3 d {   }j                  |      }j                  |       d {    47 E7 <7 37 6 d d d       d {  7   n# 1 d {  7  sw Y   nxY wd d d       d {  7   n# 1 d {  7  sw Y   nxY wn$# t        $ r t        j                  d       Y nw xY wt        j                  d       j                  t               d {  7   y # t        j                  d       j                  t               d {  7   w xY ww)Nr   rz   zError in standalone SSE writerzClosing standalone SSE writer)r   r   r&   rQ   GET_STREAM_KEYrw   r   r|   r}   r   r~   r   )standalone_stream_readerrr   rv   r7   r   s      r1   standalone_sse_writerzPStreamableHTTPServerTransport._handle_get_request.<locals>.standalone_sse_writer0  se    D 9>8Y8YZf8ghi8j%%n5+/+@+@+PQR+S(, 
A 
A.F 
A 
A/G A Am &*%<%<]%K
/44Z@@@
A 
AA A 0H
A 
A 
A 
A 
A 
A 
A 
A 
A 
A  C  !ABC <=33NCCC <=33NCCCs  E<A	C, BC, CBCB/ B$B
%B(&B/B
B/C, CBB/B/C(B+)C/C	5B86C	=CC, CC, C(CC($C, +E ,D
E DE -E<=E >E<.E92E53E99E<r   z Error in standalone SSE response)rC   rO   r   rj   r
   r   r   r   r   rY   rp   LAST_EVENT_ID_HEADER_replay_eventsr   rH   rf   r   rQ   CONFLICTr   r   r   r.   r   r|   r}   r   r{   r   )r7   rn   r   r   _r   r   r:   rY   r   r   r   s   `          @r1   r   z1StreamableHTTPServerTransport._handle_get_request  s%     ))>abb //8
722F))H 7=='//4@@@33GTBBB $OO//0DEE=E%%mWdCCC 6&,
 -1-@-@G)* T22222F##H 7=='//4@@@ 05/P/PQUVY[^V^Q_/`ab/c,,	D2 '%!6
	@7=='//4@@@C A C
 D$ AN A 	@?@#**,,,#**,,,//???		@s   A1H=5F=6H=G <H=GBH=GAH=!G	 7G8G	 <H= H=H=H=G	 	1H::G=;H:HH:1H42H:7H=9H::H=c                   K   | j                   sG| j                  dt        j                        } ||j                  |j
                  |       d{    y| j                  ||       d{   sy| j                          d{    | j                  dt        j                        } ||j                  |j
                  |       d{    y7 7 f7 O7 w)z8Handle DELETE requests for explicit session termination.z5Method Not Allowed: Session termination not supportedN)
rH   rj   r
   METHOD_NOT_ALLOWEDr   r   r   	terminaterm   OK)r7   rn   r   r   s       r1   r   z4StreamableHTTPServerTransport._handle_delete_requestX  s      ""22G--H 7=='//4@@@33GTBBBnn--MM
 w}}goot<<< A C 	 	=sI   ACCC+C,CCAC
CCCCCc                   K   d| _         t        j                  d| j                          t	        | j
                  j                               }|D ]  }| j                  |       d{     | j
                  j                          	 | j                  "| j                  j                          d{    | j                  "| j                  j                          d{    | j                  "| j                  j                          d{    | j                  #| j                  j                          d{    yy7 7 7 f7 :7 # t        $ r"}t        j                  d|        Y d}~yd}~ww xY ww)zTerminate the current session, closing all streams.

        Once terminated, all requests with this session ID will receive 404 Not Found.
        TzTerminating session: NError closing streams: )rR   r}   inforH   listrQ   keysr   clearrC   r{   rD   rF   rE   r|   r~   )r7   request_stream_keyskeyr   s       r1   r   z'StreamableHTTPServerTransport.terminateo  sW      +D,?,?+@AB #4#8#8#=#=#?@ ' 	5C//444	5 	##%	8''3..55777  ,''..000((4//66888!!-((//111 . 5 8081 	8LL21#677	8s   A&E<(E) E<
)E 3E4-E !E"-E E
-E =E>E E<E E 
E E 	E9E4/E<4E99E<c                    K   t         dd}| j                  r| j                  |t        <   | j                  dt        j
                  |      } ||j                  |j                  |       d{    y7 w)z Handle unsupported HTTP methods.zGET, POST, DELETE)r[   AllowzMethod Not Allowed)rY   N)rd   rH   rf   rj   r
   r   r   r   )r7   rn   r   rY   r   s        r1   r   z9StreamableHTTPServerTransport._handle_unsupported_request  sq      .(
 -1-@-@G)*.. )) / 

 w}}goot<<<s   A,A6.A4/A6c                    K   | j                  ||       d {   sy| j                  ||       d {   syy7 !7 w)NFT)_validate_session_validate_protocol_version)r7   rn   r   s      r1   r   z7StreamableHTTPServerTransport._validate_request_headers  sD     ++GT:::44WdCCC	 ;Cs   >:><>>c                   K   | j                   sy| j                  |      }|sG| j                  dt        j                        } ||j
                  |j                  |       d{    y|| j                   k7  rG| j                  dt        j                        } ||j
                  |j                  |       d{    yy7 \7 w)z'Validate the session ID in the request.TzBad Request: Missing session IDNFr   )rH   rq   rj   r
   r   r   r   r   )r7   rn   r   r   r   s        r1   r   z/StreamableHTTPServerTransport._validate_session  s     "" "11': "221&&H 7=='//4@@@ !4!4422:$$H 7=='//4@@@ A As%   A"C$C%AC:C;CCc                 :  K   |j                   j                  t              }|t        }|t        vrfdj                  t              }| j                  d| dd| z   t        j                        } ||j                  |j                  |       d{    yy7 w)z4Validate the protocol version header in the request.Nz, z+Bad Request: Unsupported protocol version: z. zSupported versions: FT)rY   rp   MCP_PROTOCOL_VERSION_HEADERr   r   joinrj   r
   r   r   r   )r7   rn   r   protocol_versionsupported_versionsr   s         r1   r   z8StreamableHTTPServerTransport._validate_protocol_version  s      #??../JK #9 #>>!%+F!G22=>N=OrR();(<=>&&H
 7=='//4@@@ As   BBBBr:   c                 Z   	K    j                   sy	 ddt        d} j                  r j                  |t        <   t	        j
                  t        t        t        f      d      \  	} 	fd}t        |||      }	  ||j                  |j                  |       d{    	j                          d{    |j                          d{    y7 5# t        $ r t        j                  d       Y Sw xY w7 C7 -# 	j                          d{  7   |j                          d{  7   w xY w# t        $ rd t        j                  d	        j                  d	t         j"                  t$              } ||j                  |j                  |       d{  7   Y yw xY ww)
z
        Replays events that would have been sent after the specified event ID.
        Only used when resumability is enabled.
        Nr   r   r   r   c                    K   	 4 d {    dt         dd ffd} j                  |        d {   }|r|j                  vr|t        j                  t            d      j                  |<   j                  |   d   }|4 d {    |2 3 d {   }j                  |      }j                  |       d {    4d d d       d {    y 7 7 7 O7 F7 6 d d d       d {  7   .# 1 d {  7  sw Y   @xY w7 7# 1 d {  7  sw Y   y xY w# t        $ r t        j                  d       Y y w xY ww)Nrr   r5   c                 f   K   j                  |       }j                  |       d {    y 7 wr   )rw   r   )rr   rv   r7   r   s     r1   
send_eventzWStreamableHTTPServerTransport._replay_events.<locals>.replay_sender.<locals>.send_event  s+     )-)@)@)OJ"3"8"8"DDDs   &1/1r   rz   zError in replay sender)
r&   r=   rQ   r   r   rw   r   r|   r}   r   )	r   r4   
msg_readerrr   rv   rJ   r:   r7   r   s	        r1   replay_senderzCStreamableHTTPServerTransport._replay_events.<locals>.replay_sender  sd    ?0 M MEL ET E
 +6*I*I-Yc*d$d	 %$:O:O)O?D?`?`am?nop?qD11)<)-)>)>y)I!)LJ (2 M M;E !M !M-151H1H1WJ*;*@*@*L$L$L'M M M %eM!M %M <FM M M M MM M M M( ! ?$$%=>?s  ED CD %D
CAD

CD
C3C C
C &C3?C
 C3D DD ED D
D
C C3 C3!D
,C/-D
3D	9C<:D	D
D 
DDDD ED E =E?E  Er   zError in replay responsezError replaying events)rP   r   rH   rf   r   r   r   r.   r   r   r   r|   r}   r   r{   rj   r
   r   r   )
r7   r:   rn   r   rY   r   r  r   rJ   r   s
   ``      @@r1   r   z,StreamableHTTPServerTransport._replay_events  s    
 ''<	A!9* 0G ""151D1D-. 493T3TUYZ]_bZbUc3def3g00?4 +)%2H1w}}gootDDD (..000'..000 E =  !;<= 10 (..000'..000 	A5622(00H
 7=='//4@@@	As   F+A+D; !C $C%C )D; <D =D; DD; F+C C=:D <C==D  D; D; D8DD81D42D88D; ;A$F(F" F(%F+'F((F+c                n   K   t        j                  t        t        z     d      \  }}t        j                  t           d      \  }| _        | _         _        | _        t        j                         4 d{   } fd}|j                  |       	 ||f t         j                  j                               D ]  } j                  |       d{      j                  j                          	 |j                          d{    |j                          d{    j                          d{    |j                          d{    ddd      d{    y7 7 7 a7 K7 57 # t        $ r"}t         j#                  d|        Y d}~Cd}~ww xY w# t         j                  j                               D ]  } j                  |       d{  7     j                  j                          	 |j                          d{  7   |j                          d{  7   j                          d{  7   |j                          d{  7   w # t        $ r"}t         j#                  d|        Y d}~w d}~ww xY wxY w7 4# 1 d{  7  sw Y   yxY ww)zContext manager that provides read and write streams for a connection.

        Yields:
            Tuple of (read_stream, write_stream) for bidirectional communication
        r   Nc                    K   	 2 3 d {   } | j                   }d }t        |j                  t        t        z        r"t        |j                  j                        }|}n[| j                  Ot        | j                  t              r5| j                  j                  t        | j                  j                        }||nt        }d }j                  r?j                  j                  ||       d {   }t        j                  d| d|        |j                  v r6	 j                  |   d   j!                  t#        ||             d {    Pt-        j                  d| d       k7 g7 7 &# t$        j&                  t$        j(                  f$ r  j                  j+                  |d        Y w xY w6 y # t.        $ r t        j1                  d       Y y w xY ww)NzStored z from r   zRequest stream z not found 
                                for message. Still processing message as the client
                                might reconnect and replay.zError in message router)r'   r   r   r"   r   r.   r^   r   r   related_request_idr   rP   r8   r}   r~   rQ   r   r&   r   BrokenResourceErrorClosedResourceErrorr   loggingr|   r   )r   r'   target_request_idresponse_idrequest_stream_idr(   r7   write_stream_readers         r1   message_routerz=StreamableHTTPServerTransport.connect.<locals>.message_router=  s    2@1D / /o"1"9"9,0)%gllOl4RS*-glloo*>K 1<- !0 8 8 D$.$3$<$<$9%" %4$<$<$O$O$[478P8P8c8c4d 1ARA^,=dr)
 $(,,-1->->-J-JK\^e-f'fH"LL78*FCTBU)VW,0E0EES&*&;&;<M&Nq&Q&V&VWcdkmuWv&w w w $MM$34E3F G< !?W/: (g !x % 9 9 % 9 9$ S
 !% 5 5 9 9:KT RSI 2E` ! @$$%>?@s   G%G F?E2F?C$G 3E54-G ".E9E7E9G 2F?5G 7E99?F<8G ;F<<G  G%G"G%!G""G%r   )r   r   r   r|   rC   rD   rF   rE   r   r   r   rQ   r   r   r   r{   r}   r~   )	r7   read_stream_writerread_streamwrite_streamr   r  r4   r   r  s	   `       @r1   connectz%StreamableHTTPServerTransport.connect  s    $ +0*K*KN]fLf*ghi*j'K,1,M,Mn,]^_,`)) $6 '$7!) **, J	@ J	@3@l MM.)@!<//!%d&;&;&@&@&B!C CI77	BBBC%%++-@,33555%,,...-44666&--///OJ	@ J	@ J	@~ C
 6.6/  @LL#:1#!>??@ "&d&;&;&@&@&B!C CI77	BBBC%%++-@,33555%,,...-44666&--///  @LL#:1#!>??@QJ	@ J	@ J	@ J	@sD  A:J5>E/?J5J F)":J E1 J >E;E3E;)E5*E;E7E;E9E;J5)J*J51J 3E;5E;7E;9E;;	F&F!J !F&&J );J$G'%!JI,H
I,3H6
4I,I
I,%I(
&I,+J,	J	5J	JJ	JJ J5 J2&J)'J2.J5)FNN)r5   N)7r)   r*   r+   r,   rC   r   r   r|   r-   rD   r   rE   rF   r   r.   boolr3   r   rS   propertyrU   r   r
   intr   r   rj   r   r    rm   r   rq   r&   rw   r#   r   r   r   r   r   tupler   r   r   r   r   r   r   r   r   r   r   r   r   r  r/   r0   r1   rB   rB   z   sk    VZ/0JKdRYQUL+NY,FG$NUCGM).9D@GMQ3NCdJQ**
 */)->B%!d
%! #'%!  $&	%!
 5t;%! 
%!N  t     *)-

  
 	

 c3h$&
 

D #---)-	
(4/
  
 c3h$&	

 

(:w :3: : c3h < <t <B% B' B BRV B:!W !tTz9J !M7 Mt ME E ERY Eae Ejn ENZ@ Z@ Z@ Z@x=G =4 =D =.8>= = =QU = w d t w d t : t PT ,EA# EA EAt EAX\ EAN e@	%ny&@A">24	
 			
e@ e@r0   rB   )Gr,   r   r  reabcr   r   collections.abcr   r   r   
contextlibr   dataclassesr	   httpr
   r   anyio.streams.memoryr   r   pydanticr   sse_starletter   starlette.requestsr   starlette.responsesr   starlette.typesr   r   r   mcp.server.transport_securityr   r   mcp.shared.messager   r   mcp.shared.versionr   	mcp.typesr   r   r   r   r   r   r   r    r!   r"   r#   	getLoggerr)   r}   rf   r   r   rd   r   r   compilerM   r.   r>   r?   r&   r@   r3   rB   r/   r0   r1   <module>r(     s	     	 # ? ? * !   R $ - & ( 0 0 E :    
		8	$ ) 4 &  ' &    RZZ 12  
       ,489# #LK@ K@r0   