
    ChQ'                     8   % S SK r S SKrS SKJrJr  S SKJrJrJrJrJ	r	J
r
JrJrJr  S SKrS SKJr  S SKJr  S SKJr  S SKJr  S SKJrJrJrJr  S S	KJrJr  \R>                  " \ 5      r!\ RD                  " S
SS9r#\ RD                  \\RH                        \%S'    " S S\&5      r' " S S5      r( S SK)J*r*  \*RV                  \(l,        \(RV                  \*l+        \\/\0\1\\4   r2\
\2   r3\\2   r4\\4\34   r5 " S S\5      r6g! \- a    \!R]                  S5         N@f = f)    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                       \ rS rSrSrg)SendTimeoutError"    N)__name__
__module____qualname____firstlineno____static_attributes__r       K/home/james-whalen/.local/lib/python3.13/site-packages/sse_starlette/sse.pyr   r   "   s    r$   r   c                   n    \ rS rSr% SrSrSr\\   \	S'   \
S 5       r\
S\R                  4S j5       rS	rg)
	AppStatus&   z\Helper to capture a shutdown signal from Uvicorn so we can gracefully terminate SSE streams.FNoriginal_handlerc                      S[         l        [        R                  S 5      nUb  UR	                  5         [         R
                  b  [         R
                  " U 0 UD6  g g )NT)r'   should_exitr   getsetr)   )argskwargscurrent_events      r%   handle_exitAppStatus.handle_exit,   sT     !%	 ,//5$%%1&&77 2r$   returnc                      [         R                  S5      n U c*  [        R                  " 5       n [         R	                  U 5        U $ )z4Get or create an exit event for the current context.N)r   r,   anyioEventr-   )events    r%   get_or_create_exit_event"AppStatus.get_or_create_exit_event9   s7     $''-=KKME##E*r$   r   )r   r    r!   r"   __doc__r+   r)   r   r   __annotations__staticmethodr1   r5   r6   r8   r#   r   r$   r%   r'   r'   &   sK    fK+/hx(/
8 
8 ekk  r$   r'   )ServerzHUvicorn not installed. Graceful shutdown on server termination disabled.c                      \ rS rSrSrSrSr          S"S\S\S\	\
\\4      S	\S
\	\   S\	\   S\	\   S\	\/ \4      S\	\/ \S   4      S\	\   S\	\\/\S   4      SS4S jjr\S\\\4   4S j5       r\R.                  S\\\4   SS4S j5       rS#S\SS4S jjrS\SS4S jrS\SS4S jr\S$S j5       rS\SS4S jr S\!S\S\SS4S  jr"S!r#g)%EventSourceResponseS   z^
Streaming response that sends data conforming to the SSE (Server-Sent Events) specification.
   
Ncontentstatus_codeheaders
media_type
backgroundpingsepping_message_factorydata_sender_callable)NNNsend_timeoutclient_close_handler_callabler3   c                 0   US;  a  [        SU 35      eU=(       d    U R                  U l        [        U[        5      (       a  Xl        O[        U5      U l        X l        Uc  U R                  OUU l        XPl	        Xl
        Xl        [        5       nUb  UR                  U5        UR                  SS5        SUS'   SUS'   U R                  U5        Uc  U R                   OUU l        Xl        Xl        S	U l        [*        R,                  " 5       U l        g )
N)NrB   
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_SEPARATORrI   
isinstancer   body_iteratorr   rD   rF   rG   rK   rL   r   update
setdefaultinit_headersDEFAULT_PING_INTERVALping_intervalrJ   rM   activer5   Lock
_send_lock)selfrC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   _headerss                r%   __init__EventSourceResponse.__init__[   s   & 00J3%PQQ0$00 g}--!(!6w!?D&-7-?$//Z$$8!( "#OOG$ 	OZ8!-(,$%(#;?<T77T$8!-J***,r$   c                     U R                   $ N)_ping_interval)r_   s    r%   r[   !EventSourceResponse.ping_interval   s    """r$   valuec                 ~    [        U[        [        45      (       d  [        S5      eUS:  a  [	        S5      eXl        g )Nzping interval must be intr   z$ping interval must be greater than 0)rU   intfloat	TypeErrorrS   re   )r_   rg   s     r%   r[   rf      s8    %#u..78819CDD#r$   forcec                     [        S5      e)Nz-Compression is not supported for SSE streams.)NotImplementedError)r_   rl   s     r%   enable_compression&EventSourceResponse.enable_compression   s    !"QRRr$   sendc                 
  #    U" SU R                   U R                  S.5      I Sh  vN   U R                    Sh  vN n[        X R                  5      n[
        R                  SU5        [        R                  " U R                  5       nU" SUSS.5      I Sh  vN   SSS5        W(       d  Mz  UR                  (       d  M  [        U R                  S5      (       a"  U R                  R                  5       I Sh  vN   [        5       e N N Ns! , (       d  f       Nw= f N%
 U R                   ISh  vN    S	U l        U" SS
S	S.5      I Sh  vN    SSS5      ISh  vN    g! , ISh  vN  (       d  f       g= f7f)zHSend out SSE data to the client as it becomes available in the iterator.zhttp.response.start)typestatusrE   Nz	chunk: %shttp.response.bodyTrs   body	more_bodyacloseFr$   )rD   raw_headersrV   r   rI   loggerdebugr5   move_on_afterrL   cancel_calledhasattrry   r   r^   r\   )r_   rq   datachunkcancel_scopes        r%   _stream_response$EventSourceResponse._stream_response   s6    -**++
 	
 	
 ,, 	)$ xx0ELLe,$$T%6%67<15tT   8
 | : : :4--x88,,33555&(('	
	) 87 6 - ???DK 4cPUVWWW #?????s   $FDFD$DD$AFDDD F1F8F<D"=FD$D
D	F$F5D86F:E)EE)F"E%#F)F /E20F <Freceivec                   #    U R                   (       as  U" 5       I Sh  vN nUS   S:X  aG  SU l         [        R                  S5        U R                  (       a  U R                  U5      I Sh  vN   gU R                   (       a  Mr  gg Ni N7f)z/Watch for a disconnect message from the client.Nrs   zhttp.disconnectFz+Got event: http.disconnect. Stop streaming.)r\   r{   r|   rM   )r_   r   messages      r%   _listen_for_disconnect*EventSourceResponse._listen_for_disconnect   sj     kk#IoGv"33#JK55<<WEEE kkk%
 Fs(   BBAB-B
.BB
Bc                     #    [         R                  (       a  g[         R                  5       n [         R                  (       a  gU R                  5       I Sh  vN   g N7f)zQWatch for shutdown signals (e.g. SIGINT, SIGTERM) so we can break the event loop.N)r'   r+   r8   wait)r   s    r%   _listen_for_exit_signal+EventSourceResponse._listen_for_exit_signal   sA         779
   oos   AAAAc                   #    U R                   (       Ga  [        R                  " U R                  5      I Sh  vN   U R                  (       a  U R	                  5       O8[        S[        R                  " [        R                  5       3U R                  S9n[        X R                  5      n[        R                  SU5        U R                   ISh  vN   U R                   (       a  U" SUSS.5      I Sh  vN   SSS5      ISh  vN   U R                   (       a  GM  gg N NQ N. N ! , ISh  vN  (       d  f       N5= f7f)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 - )commentrI   zping: %sru   Trv   )r\   r5   sleepre   rJ   r   r   nowr   utcrI   r   r{   r|   r^   )r_   rq   sse_ping
ping_bytess       r%   _pingEventSourceResponse._ping   s     
 kkk++d11222 ,, ))+$%hll8<<&@%AB  &h9JLLZ0;;$8$.)-   ' kkk2 ' 'sp   6ED"BED$E!D*7D&8D*<ED(E E$E&D*(E*E0D31E=Escopec                 J  ^ ^^^#    [         R                  " 5        ISh  vN mS[        / [        S   4   4U4S jjnTR	                  UU U4S j5        TR	                  UU U4S j5        TR	                  UT R
                  5        T R                  (       a  TR	                  T R                  5        TR	                  UUU 4S j5        SSS5      ISh  vN   T R                  b  T R                  5       I Sh  vN   gg N N-! , ISh  vN  (       d  f       NB= f N$7f)zEntrypoint 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                 d   >#    U " 5       I S h  vN   TR                   R                  5         g  N7frd   )r   cancel)r   
task_groups    r%   cancel_on_finish6EventSourceResponse.__call__.<locals>.cancel_on_finish  s&     f''..0 s   0. 0c                  &   > T R                  T5      $ rd   )r   r_   rq   s   r%   <lambda>.EventSourceResponse.__call__.<locals>.<lambda>  s    D<Q<QRV<Wr$   c                  &   > T R                  T5      $ rd   )r   r   s   r%   r   r     s    DJJt<Lr$   c                  &   > TR                  T 5      $ rd   )r   )r   r_   s   r%   r   r     s    $*E*Eg*Nr$   )r5   create_task_groupr   r   
start_soonr   rK   rG   )r_   r   r   rq   r   r   s   ` `` @r%   __call__EventSourceResponse.__call__   s      **,,
1Xb)D/6I-J 1 !!"24WX!!"24LM!!"2D4P4PQ((%%d&?&?@ !! "N -,$ ??&//### '% -,,,& $sQ   D#DD#B(DD#D$D#<D!=D#D#DDDD#)re   r^   r\   rG   rV   rM   rK   rF   r[   rJ   rL   rI   rD   )
   Nztext/event-streamNNNNNNN)F)r3   N)$r   r    r!   r"   r:   rZ   rT   ContentStreamri   r   r   strr   r   r   r	   rj   r   r   ra   propertyr   r[   setterboolro   r   r   r   r   r<   r   r   r   r   r#   r   r$   r%   r?   r?   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 # # $5e#4 $ $ $S S SX4 XD X6	G 	 	      6$E $G $4 $D $r$   r?   )7contextvarsloggingr   r   typingr   r   r   r   r	   r
   r   r   r   r5   starlette.backgroundr   starlette.concurrencyr   starlette.datastructuresr   starlette.responsesr   starlette.typesr   r   r   r   sse_starlette.eventr   r   	getLoggerr   r{   
ContextVarr   r6   r;   TimeoutErrorr   r'   uvicorn.mainr=   r1   r)   ImportErrorr|   r   bytesdictContentSyncContentStreamAsyncContentStreamr   r?   r   r$   r%   <module>r      s!     '
 
 
  / 7 3 ( 9 9 = 
		8	$ <6 [++HU[[,AB 
	| 	 :#!'!3!3I"..F UD/36
7W% "7+ (*;;<$( $  
LLRs   0(C? ?DD