
    Ki                       d dl m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
mZ d dlmZ d dlmZmZmZmZ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 d dl m!Z! d dl"m#Z#m$Z$ erd dl%m&Z& g dZ' ejP                  e)      Z* ede      Z+ edde      Z,e G d dee+e,f                Z- edd       G d dee+                Z.	 	 	 	 	 	 ddZ/ G d d      Z0y)    )annotationsN)	AwaitableSequence)	dataclassfieldreplace)datetimetimezone)partial)TYPE_CHECKINGAnyGenericLiteralProtocolruntime_checkable)ReadResourceContents)TypeVar)Prompt)Resource)ResourceTemplate)Tool
ToolResult)Context)CallNext
MiddlewareMiddlewareContextT)defaultRT)	covariantr   c                      e Zd ZddZy)r   c                     y N )selfcontexts     p/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/fastmcp/server/middleware/middleware.py__call__zCallNext.__call__,   s        N)r&   MiddlewareContext[T]returnzAwaitable[R])__name__
__module____qualname__r(   r$   r)   r'   r   r   *   s    Jr)   r   )kw_onlyfrozenc                  z    e Zd ZU dZded<   dZded<   dZded	<   d
Zded<   dZded<    e	d       Z
ded<   ddZy)r   z8
    Unified context for all middleware operations.
    r   messageNzContext | Nonefastmcp_contextclientzLiteral['client', 'server']sourcerequestz"Literal['request', 'notification']typez
str | Nonemethodc                 H    t        j                  t        j                        S r#   )r	   nowr
   utcr$   r)   r'   <lambda>zMiddlewareContext.<lambda>=   s    X\\8R r)   )default_factoryr	   	timestampc                    t        | fi |S r#   )r   )r%   kwargss     r'   copyzMiddlewareContext.copy?   s    t&v&&r)   )r@   r   r+   r*   )r,   r-   r.   __doc____annotations__r3   r5   r7   r8   r   r>   rA   r$   r)   r'   r   r   /   sO     J&*O^* +3F'2/8D
,8FJ0RSIxS'r)   r   r   c                     d fd}|S )zCreate a wrapper that applies a single middleware to a context. The
    closure bakes in the middleware and call_next function, so it can be
    passed to other functions that expect a call_next function.c                2   K    |        d {   S 7 wr#   r$   )r&   	call_next
middlewares    r'   wrapperz(make_middleware_wrapper.<locals>.wrapperJ   s     3333s   )r&   r*   r+   r   r$   )rG   rF   rH   s   `` r'   make_middleware_wrapperrI   C   s    4 Nr)   c                     e Zd ZdZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ		 	 	 	 	 	 ddZ
	 	 	 	 	 	 dd	Z	 	 	 	 	 	 dd
Z	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZy)r   z9Base class for FastMCP middleware with dispatching hooks.c                h   K   | j                  ||       d{   } ||       d{   S 7 7 w)z0Main entry point that orchestrates the pipeline.rF   N)_dispatch_handler)r%   r&   rF   handler_chains       r'   r(   zMiddleware.__call__S   sC      #44 5 
 
 #7+++	
 ,s   2.2022c                  K   |}|j                   xdk(  r t        | j                  |      }nxdk(  r t        | j                  |      }nxdk(  r t        | j                  |      }nxdk(  r t        | j
                  |      }nuxdk(  r t        | j                  |      }nWxdk(  r t        | j                  |      }n9xdk(  r t        | j                  |      }nd	k(  rt        | j                  |      }|j                  xd
k(  r t        | j                  |      }ndk(  rt        | j                  |      }t        | j                  |      }|S w)z/Builds a chain of handlers for a given message.
initializerL   z
tools/callzresources/readzprompts/getz
tools/listzresources/listzresources/templates/listzprompts/listr6   notification)r8   r   on_initializeon_call_toolon_read_resourceon_get_prompton_list_toolson_list_resourceson_list_resource_templateson_list_promptsr7   
on_requeston_notification
on_message)r%   r&   rF   handlers       r'   rM   zMiddleware._dispatch_handler_   s      nn!$"4"4H!$"3"3wG!!$"7"77K!$"4"4H!$"4"4H!!$"8"8GL+!$"A"AWU!$"6"6'Jll!$//WE!$"6"6'J$//W=s   EEc                .   K    ||       d {   S 7 wr#   r$   r%   r&   rF   s      r'   r\   zMiddleware.on_message        
 w''''   c                .   K    ||       d {   S 7 wr#   r$   r_   s      r'   rZ   zMiddleware.on_request   r`   ra   c                .   K    ||       d {   S 7 wr#   r$   r_   s      r'   r[   zMiddleware.on_notification   r`   ra   c                .   K    ||       d {   S 7 wr#   r$   r_   s      r'   rR   zMiddleware.on_initialize   r`   ra   c                .   K    ||       d {   S 7 wr#   r$   r_   s      r'   rS   zMiddleware.on_call_tool   r`   ra   c                .   K    ||       d {   S 7 wr#   r$   r_   s      r'   rT   zMiddleware.on_read_resource         w''''ra   c                .   K    ||       d {   S 7 wr#   r$   r_   s      r'   rU   zMiddleware.on_get_prompt   r`   ra   c                .   K    ||       d {   S 7 wr#   r$   r_   s      r'   rV   zMiddleware.on_list_tools   r`   ra   c                .   K    ||       d {   S 7 wr#   r$   r_   s      r'   rW   zMiddleware.on_list_resources   r`   ra   c                .   K    ||       d {   S 7 wr#   r$   r_   s      r'   rX   z%Middleware.on_list_resource_templates   rg   ra   c                .   K    ||       d {   S 7 wr#   r$   r_   s      r'   rY   zMiddleware.on_list_prompts   r`   ra   N)r&   r*   rF   zCallNext[T, Any]r+   r   )r&   MiddlewareContext[Any]rF   CallNext[Any, Any]r+   rn   )r&   rm   rF   rn   r+   r   )r&   z'MiddlewareContext[mt.Request[Any, Any]]rF   z#CallNext[mt.Request[Any, Any], Any]r+   r   )r&   z,MiddlewareContext[mt.Notification[Any, Any]]rF   z(CallNext[mt.Notification[Any, Any], Any]r+   r   )r&   z'MiddlewareContext[mt.InitializeRequest]rF   z:CallNext[mt.InitializeRequest, mt.InitializeResult | None]r+   zmt.InitializeResult | None)r&   z+MiddlewareContext[mt.CallToolRequestParams]rF   z.CallNext[mt.CallToolRequestParams, ToolResult]r+   r   )r&   z/MiddlewareContext[mt.ReadResourceRequestParams]rF   zFCallNext[mt.ReadResourceRequestParams, Sequence[ReadResourceContents]]r+   zSequence[ReadResourceContents])r&   z,MiddlewareContext[mt.GetPromptRequestParams]rF   z7CallNext[mt.GetPromptRequestParams, mt.GetPromptResult]r+   zmt.GetPromptResult)r&   z&MiddlewareContext[mt.ListToolsRequest]rF   z-CallNext[mt.ListToolsRequest, Sequence[Tool]]r+   zSequence[Tool])r&   z*MiddlewareContext[mt.ListResourcesRequest]rF   z5CallNext[mt.ListResourcesRequest, Sequence[Resource]]r+   zSequence[Resource])r&   z2MiddlewareContext[mt.ListResourceTemplatesRequest]rF   zECallNext[mt.ListResourceTemplatesRequest, Sequence[ResourceTemplate]]r+   zSequence[ResourceTemplate])r&   z(MiddlewareContext[mt.ListPromptsRequest]rF   z1CallNext[mt.ListPromptsRequest, Sequence[Prompt]]r+   zSequence[Prompt])r,   r-   r.   rB   r(   rM   r\   rZ   r[   rR   rS   rT   rU   rV   rW   rX   rY   r$   r)   r'   r   r   P   s   C
,%
, $
, 
	
, - :L 	 D('( &( 
	((8( 7( 
	((=( <( 
	((8( N( 
$	((<( B( 
	((@(
( 
(((=( K( 
	((7( A( 
	((;( I( 
	((C(
( 
$((9( E( 
	(r)   )rG   r   rF   CallNext[T, R]r+   ro   )1
__future__r   loggingcollections.abcr   r   dataclassesr   r   r   r	   r
   	functoolsr   typingr   r   r   r   r   r   	mcp.typestypesmt mcp.server.lowlevel.helper_typesr   typing_extensionsr   fastmcp.prompts.promptr   fastmcp.resources.resourcer   fastmcp.resources.templater   fastmcp.tools.toolr   r   fastmcp.server.contextr   __all__	getLoggerr,   loggerr   r   r   r   rI   r   r$   r)   r'   <module>r      s    "  / 1 1 '    A % ) / 7 /. 
		8	$ CC4- Kx1~ K K 4%'
 ' &'&

'5

@( @(r)   