
     <iQ'                     N   U d dl Z d dlZd dlmZmZ d dlmZmZmZmZm	Z	m
Z
mZmZmZ d dl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mZ d d	lmZmZ  ej        e           Z! e j"        d
d          Z#e j"        eej$                          e%d<    G d de&          Z' G d d          Z(	 d dl)m*Z* e*j+        e(_,        e(j+        e*_+        n # e-$ r e!.                    d           Y nw xY wee/e0e1eef         Z2e
e2         Z3ee2         Z4ee4e3f         Z5 G d de          Z6dS )    N)datetimetimezone)	AnyAsyncIterable	AwaitableCallable	CoroutineIteratorMappingOptionalUnion)BackgroundTask)iterate_in_threadpool)MutableHeaders)Response)ReceiveScopeSendMessage)ServerSentEventensure_bytes
exit_event)default_exit_event_contextc                       e Zd ZdS )SendTimeoutErrorN)__name__
__module____qualname__     /Users/kimhansen/Desktop/03 Workspace/ceo-agents/chl-effectiveness/mcp-servers/whoop/.venv/lib/python3.11/site-packages/sse_starlette/sse.pyr   r   "   s        Dr!   r   c                   n    e Zd ZU dZdZdZee         ed<   e	d             Z
e	dej        fd            ZdS )	AppStatusz\Helper to capture a shutdown signal from Uvicorn so we can gracefully terminate SSE streams.FNoriginal_handlerc                      dt           _        t                              d           }||                                 t           j        t          j        | i | d S d S )NT)r$   should_exitr   getsetr%   )argskwargscurrent_events      r"   handle_exitzAppStatus.handle_exit,   sf     !%	 ,//55$%1&777777 21r!   returnc                      t                               d          } | -t          j                    } t                               |            | S )z4Get or create an exit event for the current context.N)r   r(   anyioEventr)   )events    r"   get_or_create_exit_eventz"AppStatus.get_or_create_exit_event9   s@     $''--=KMME##E***r!   )r   r   r   __doc__r'   r%   r   r   __annotations__staticmethodr-   r0   r1   r3   r    r!   r"   r$   r$   &   sy         ffK+/hx(///
8 
8 \
8 ek    \  r!   r$   )ServerzHUvicorn not installed. Graceful shutdown on server termination disabled.c                      e Zd ZdZdZdZ	 	 	 	 	 	 	 	 	 	 d#deded	ee	e
e
f                  d
e
dee         dee         dee
         deeg ef                  deeg ed         f                  dee         deeeged         f                  ddfdZedeeef         fd            Zej        deeef         ddfd            Zd$deddfdZdeddfdZdeddfdZed%d            Zdeddfd Zd!e dededdfd"Z!dS )&EventSourceResponsezf
    Streaming response that sends data conforming to the SSE (Server-Sent Events) specification.
       
   Ntext/event-streamcontentstatus_codeheaders
media_type
backgroundpingsepping_message_factorydata_sender_callable)NNNsend_timeoutclient_close_handler_callabler.   c                 6   |dvrt          d|           |p| j        | _        t          |t                    r|| _        nt          |          | _        || _        || j        n|| _        || _	        |	| _
        |
| _        t                      }||                    |           |                    dd           d|d<   d|d<   |                     |           || j        n|| _        || _        || _        d	| _        t+          j                    | _        d S )
N)Nr;   
z'sep must be one of: \r\n, \r, \n, got: zCache-Controlzno-storez
keep-alive
ConnectionnozX-Accel-BufferingT)
ValueErrorDEFAULT_SEPARATORrD   
isinstancer   body_iteratorr   r?   rA   rB   rF   rG   r   update
setdefaultinit_headersDEFAULT_PING_INTERVALping_intervalrE   rH   activer0   Lock
_send_lock)selfr>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   _headerss                r"   __init__zEventSourceResponse.__init__[   s9   & 000P3PPQQQ0$0 g}-- 	@!(D!6w!?!?D&-7-?$//Z$$8!( "##OOG$$$ 	OZ888!-(,$%(###;?<T77T$8!-J**,,r!   c                     | j         S N)_ping_interval)rZ   s    r"   rV   z!EventSourceResponse.ping_interval   s    ""r!   valuec                     t          |t          t          f          st          d          |dk     rt	          d          || _        d S )Nzping interval must be intr   z$ping interval must be greater than 0)rP   intfloat	TypeErrorrN   r_   )rZ   r`   s     r"   rV   z!EventSourceResponse.ping_interval   sM    %#u.. 	97888199CDDD#r!   Fforcec                      t          d          )Nz-Compression is not supported for SSE streams.)NotImplementedError)rZ   re   s     r"   enable_compressionz&EventSourceResponse.enable_compression   s    !"QRRRr!   sendc                   K    |d| j         | j        d           d{V  | j        2 3 d{V }t          || j                  }t
                              d|           t          j        | j	                  5 } |d|dd           d{V  ddd           n# 1 swxY w Y   |rI|j
        rBt          | j        d          r| j                                         d{V  t                      6 | j        4 d{V  d	| _         |dd
d	d           d{V  ddd          d{V  dS # 1 d{V swxY w Y   dS )zHSend out SSE data to the client as it becomes available in the iterator.zhttp.response.start)typestatusr@   Nz	chunk: %shttp.response.bodyTrk   body	more_bodyacloseFr!   )r?   raw_headersrQ   r   rD   loggerdebugr0   move_on_afterrG   cancel_calledhasattrrq   r   rY   rW   )rZ   ri   datachunkcancel_scopes        r"   _stream_responsez$EventSourceResponse._stream_response   s     d-*+ 
 
 	
 	
 	
 	
 	
 	
 	
 , 	) 	) 	) 	) 	) 	) 	)$ tx00ELLe,,,$T%677 <d15tTT                      
  ) : )4-x88 6,33555555555&((( - ? 	X 	X 	X 	X 	X 	X 	X 	XDK$ 4cPUVVWWWWWWWWW	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	X 	Xs)   C29BB	"B	 D00
D:=D:receivec                    K   | j         rj |             d{V }|d         dk    rEd| _         t                              d           | j        r|                     |           d{V  dS | j         hdS dS )z/Watch for a disconnect message from the client.Nrk   zhttp.disconnectFz+Got event: http.disconnect. Stop streaming.)rW   rs   rt   rH   )rZ   r|   messages      r"   _listen_for_disconnectz*EventSourceResponse._listen_for_disconnect   s      k 	#GIIooooooGv"333#JKKK5 F<<WEEEEEEEEE k 	 	 	 	 	r!   c                     K   t           j        rdS t                                           } t           j        rdS |                                  d{V  dS )zQWatch for shutdown signals (e.g. SIGINT, SIGTERM) so we can break the event loop.N)r$   r'   r3   wait)r   s    r"   _listen_for_exit_signalz+EventSourceResponse._listen_for_exit_signal   se         	F 7799
   	Foor!   c                   K   | j         rt          j        | j                   d{V  | j        r|                                 n4t          dt          j        t          j	                   | j
                  }t          || j
                  }t                              d|           | j        4 d{V  | j         r |d|dd           d{V  ddd          d{V  n# 1 d{V swxY w Y   | j         dS dS )zPeriodically send ping messages to keep the connection alive on proxies.
        - frequenccy ca every 15 seconds.
        - Alternatively one can send periodically a comment line (one starting with a ':' character)
        Nzping - )commentrD   zping: %srm   Trn   )rW   r0   sleepr_   rE   r   r   nowr   utcrD   r   rs   rt   rY   )rZ   ri   sse_ping
ping_bytess       r"   _pingzEventSourceResponse._ping   s     
 k 	+d1222222222 ,))+++$Bhl8<&@&@BB    &h99JLLZ000        ; $$8$.)-                                    k 	 	 	 	 	s   6C%%
C/2C/scopec                 &   K   t          j                    4 d{V dt          g t          d         f         ffd}                    | fd                               | fd                               | j                    j        r                     j                                       | fd           ddd          d{V  n# 1 d{V swxY w Y    j                                          d{V  dS dS )a  Entrypoint for Starlette's ASGI contract. We spin up tasks:
        - _stream_response to push events
        - _ping to keep the connection alive
        - _listen_for_exit_signal to respond to server shutdown
        - _listen_for_disconnect to respond to client disconnect
        Ncoroc                 ^   K    |              d {V  j                                          d S r^   )rz   cancel)r   
task_groups    r"   cancel_on_finishz6EventSourceResponse.__call__.<locals>.cancel_on_finish  s9      dff'..00000r!   c                  .                                    S r^   )r{   rZ   ri   s   r"   <lambda>z.EventSourceResponse.__call__.<locals>.<lambda>  s    D<Q<QRV<W<W r!   c                  .                                    S r^   )r   r   s   r"   r   z.EventSourceResponse.__call__.<locals>.<lambda>  s    DJJt<L<L r!   c                  .                                    S r^   )r   )r|   rZ   s   r"   r   z.EventSourceResponse.__call__.<locals>.<lambda>  s    $*E*Eg*N*N r!   )r0   create_task_groupr   r   
start_soonr   rF   rB   )rZ   r   r|   ri   r   r   s   ` `` @r"   __call__zEventSourceResponse.__call__   s      *,, 	 	 	 	 	 	 	
1Xb)D/6I-J 1 1 1 1 1 1 !!"24W4W4W4W4WXXX!!"24L4L4L4L4LMMM!!"2D4PQQQ( A%%d&?@@@ !! "N"N"N"N"N  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	$ ?&//########### '&s   B+C
C'*C')
r<   Nr=   NNNNNNN)F)r.   N)"r   r   r   r4   rU   rO   ContentStreamrb   r   r   strr   r   r   r	   rc   r   r   r\   propertyr   rV   setterboolrh   r   r{   r   r   r6   r   r   r   r   r    r!   r"   r9   r9   S   s         
 /3-/3"!HL (, !;' ;';' ;' '#s(+,	;'
 ;' ^,;' sm;' c];' 'xO0C'DE;' 'R#3445
;' uo;' (0gY	$/0(
;'" 
#;' ;' ;' ;'z #uS%Z0 # # # X# $5e#4 $ $ $ $ $S S S S S S SX4 XD X X X X6	G 	 	 	 	 	       \      6$E $G $4 $D $ $ $ $ $ $r!   r9   )7contextvarsloggingr   r   typingr   r   r   r   r	   r
   r   r   r   r0   starlette.backgroundr   starlette.concurrencyr   starlette.datastructuresr   starlette.responsesr   starlette.typesr   r   r   r   sse_starlette.eventr   r   	getLoggerr   rs   
ContextVarr   r1   r5   TimeoutErrorr   r$   uvicorn.mainr7   r-   r%   ImportErrorrt   r   bytesdictContentSyncContentStreamAsyncContentStreamr   r9   r    r!   r"   <module>r      s         ' ' ' ' ' ' ' '
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  / / / / / / 7 7 7 7 7 7 3 3 3 3 3 3 ( ( ( ( ( ( 9 9 9 9 9 9 9 9 9 9 9 9 = = = = = = = = 
	8	$	$ K<666 [+HU[,AB   
	 	 	 	 	| 	 	 	       :######!'!3I".F   
LLR    
 UD/36
7W% "7+ (*;;<$ $ $ $ $( $ $ $ $ $s   1C C-,C-