
    iF	                     F    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y)z5Ping middleware for keeping client connections alive.    )AnyN   )CallNext
MiddlewareMiddlewareContextc                   F    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
y
)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))
        ```
    interval_msc                     |dk  rt        d      || _        t               | _        t	        j
                         | _        y)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     n/Users/bowang/.openclaw/workspace/ChatDev/.venv/lib/python3.12/site-packages/fastmcp/server/middleware/ping.py__init__zPingMiddleware.__init__   s7     !;<<&*-%ZZ\
    context	call_nextreturnc                   K   |j                   |j                   j                   ||       d{   S |j                   j                  }t        |      }| j                  4 d{    || j
                  vrF|j                  }|8| j
                  j                  |       |j                  | j                  ||       ddd      d{     ||       d{   S 7 7 z7 # 1 d{  7  sw Y   (xY w7 w)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6>"7+++))11[
:::!6!6655>))--j9MM$//7JG : w''' ,
 :::: (sd   .C<C5C<&C!'C<*AC%?C<
C#C<C:C<!C<#C<%C7+C.,C73C<r   r"   Nc                    K   	 	 t        j                  | j                  dz         d{    |j                          d{    C7 7 # | j                  j                  |       w xY ww)z'Send periodic pings until session ends.i  N)r   sleepr
   	send_pingr   discard)r   r   r"   s      r   r!   zPingMiddleware._ping_loop?   s^     	6kk$"2"2T"9:::''))) :)!!))*5s2   A,&A AA A
A 
A A))A,)i0u  )__name__
__module____qualname____doc__intr   r   r   r   r$   r!    r   r   r	   r	   
   sI     "C "((9 (h (SV (*6 6 6 6r   r	   )	r,   typingr   r   
middlewarer   r   r   r	   r.   r   r   <module>r1      s     ;   ? ?<6Z <6r   