
    $ji	                     N    d Z ddlmZ ddlZddlmZmZmZ  G d de          ZdS )z5Ping middleware for keeping client connections alive.    )AnyN   )CallNext
MiddlewareMiddlewareContextc                   H    e Zd ZdZddefdZdededefdZ	d	ed
eddfdZ
dS )PingMiddlewarea  Middleware that sends periodic pings to keep client connections alive.

    Starts a background ping task on first message from each session. The task
    sends server-to-client pings at the configured interval until the session
    ends.

    Example:
        ```python
        from fastmcp import FastMCP
        from fastmcp.server.middleware import PingMiddleware

        mcp = FastMCP("MyServer")
        mcp.add_middleware(PingMiddleware(interval_ms=5000))
        ```
    0u  interval_msc                     |dk    rt          d          || _        t                      | _        t	          j                    | _        dS )zInitialize ping middleware.

        Args:
            interval_ms: Interval between pings in milliseconds (default: 30000)

        Raises:
            ValueError: If interval_ms is not positive
        r   zinterval_ms must be positiveN)
ValueErrorr   set_active_sessionsanyioLock_lock)selfr   s     f/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/fastmcp/server/middleware/ping.py__init__zPingMiddleware.__init__   sC     !;<<<&*-%%Z\\


    context	call_nextreturnc                   K   |j         |j         j         ||           d{V S |j         j        }t          |          }| j        4 d{V  || j        vr?|j        }|6| j                            |           |                    | j	        ||           ddd          d{V  n# 1 d{V swxY w Y    ||           d{V S )z0Start ping task on first message from a session.N)
fastmcp_contextrequest_contextsessionidr   r   _subscription_task_groupadd
start_soon
_ping_loop)r   r   r   r   
session_idtgs         r   
on_messagezPingMiddleware.on_message*   s      #+&6>"7+++++++++)1[[
: 	H 	H 	H 	H 	H 	H 	H 	H!6665>)--j999MM$/7JGGG	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H Yw'''''''''s   A	B**
B47B4r   r#   Nc                    K   	 	 t          j        | j        dz             d{V  |                                 d{V  =# | j                            |           w xY w)z'Send periodic pings until session ends.Ti  N)r   sleepr   	send_pingr   discard)r   r   r#   s      r   r"   zPingMiddleware._ping_loop?   s      	6*k$"2T"9:::::::::'')))))))))* !))*5555s   >A A)r
   )__name__
__module____qualname____doc__intr   r   r   r   r%   r"    r   r   r	   r	   
   s          " "C " " " "((9 (h (SV ( ( ( (*6 6 6 6 6 6 6 6 6r   r	   )	r-   typingr   r   
middlewarer   r   r   r	   r/   r   r   <module>r2      sx    ; ;        ? ? ? ? ? ? ? ? ? ?<6 <6 <6 <6 <6Z <6 <6 <6 <6 <6r   