+
    Q(iF	                     H    R t ^ RIHt ^ RIt^RIHtHtHt  ! R R]4      tR# )z5Ping middleware for keeping client connections alive.)AnyN)CallNext
MiddlewareMiddlewareContextc                   ^   a  ] tR t^
t o RtR
V 3R lR lltV 3R lR ltV 3R lR ltRtV t	R	# )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))
    ```
c                    < V ^8  d   QhRS[ /# )   interval_ms)int)format__classdict__s   "d/Users/agent/.openclaw/workspace/venv/lib/python3.14/site-packages/fastmcp/server/middleware/ping.py__annotate__PingMiddleware.__annotate__   s     " "C "    c                    V^ 8:  d   \        R4      hWn        \        4       V n        \        P
                  ! 4       V n        R# )zInitialize ping middleware.

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

Raises:
    ValueError: If interval_ms is not positive
zinterval_ms must be positiveN)
ValueErrorr
   set_active_sessionsanyioLock_lock)selfr
   s   &&r   __init__PingMiddleware.__init__   s5     !;<<&*-%ZZ\
r   c                ,   < V ^8  d   QhRS[ RS[RS[/# )r	   context	call_nextreturn)r   r   r   )r   r   s   "r   r   r   *   s$     ( ((9 (h (SV (r   c                (  "   VP                   e   VP                   P                  f   V! V4      G Rj  xL
 # VP                   P                  p\        V4      pV P                  ;_uu_4       GRj  xL
  W@P
                  9  dH   VP                  pVe8   V P
                  P                  V4       VP                  V P                  W44       RRR4      GRj  xL
  V! V4      G Rj  xL
 #  L L} L  + GRj  xL 
 '       g   i     L/; i L&5i)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_messagePingMiddleware.on_message*   s      ##+&&66>"7+++))11[
::::!6!6655>))--j9MM$//7G : w''' ,
 ::: (sj   2DC.=D2C03D6AC4DC2D)D*D0D2D4D	:C=;
D	D		Dc                *   < V ^8  d   QhRS[ RS[RR/# )r	   r#   r)   r   N)r   r   )r   r   s   "r   r   r   ?   s"     6 6 6 6 6r   c                   "     \         P                  ! V P                  R,          4      G Rj  xL
  VP                  4       G Rj  xL
  KJ   L L  T P                  P                  T4       i ; i5i)z'Send periodic pings until session ends.i  N)r   sleepr
   	send_pingr   discard)r   r#   r)   s   &&&r   r(   PingMiddleware._ping_loop?   sY     	6kk$"2"2T"9:::''))) ;)!!))*5s2   A2+A AA AA A A//A2)r   r   r
   N)i0u  )
__name__
__module____qualname____firstlineno____doc__r   r+   r(   __static_attributes____classdictcell__)r   s   @r   r   r   
   s(      " "( (*6 6r   r   )	r7   typingr   r   
middlewarer   r   r   r    r   r   <module>r=      s     ;   ? ?<6Z <6r   