
    \j                     d    d dl mZ d dlmZ d dlmZ  G d d      Z G d d      Z G d d	      Zy
)    )
HTTPConfig)HTTPFactory)throw_if_unsuccessful_responsec                       e Zd ZdZd Zy)_BufferedLineReaderz
    Helper class that encapsulates the logic for reading UTF-8 stream data as a series of text lines,
    each of which can be terminated by 
, , or 
.
    c              #   d  K   d}d}| D ]  }t        |      dk(  r|j                         }|r*d}|d   dk(  r |j                  d       t        |      dk(  rN|||d   z   |d<   d}|t        |      dz
     }|dk(  rd}n|dk7  r|j                         }|D ]  }|j                            yw)z
        Takes an iterable series of encoded chunks (each of "bytes" type) and parses it into an iterable
        series of strings, each of which is one line of text. The line does not include the terminator.
        FNr   
         T)len
splitlinespopdecode)chunkslast_char_was_crpartial_linechunklines	last_charlines          ;/root/env/lib/python3.12/site-packages/ldclient/impl/sse.py
lines_fromz_BufferedLineReader.lines_from   s     
 ! 	$E5zQ
 $$&E#( 8r> IIaL5zQ ' (%(2a# c%jl+IB#' b$yy{ $kkm#$;	$s   B.B0N)__name__
__module____qualname____doc__r        r   r   r      s    &$r   r   c                   N    e Zd ZdZddZed        Zed        Zed        Zd Z	y)	Eventz)
    An event received by SSEClient.
    Nc                 .    || _         || _        || _        y N)_event_data_id)selfeventdatalast_event_ids       r   __init__zEvent.__init__8   s    
 r   c                     | j                   S )z@
        The event type, or "message" if not specified.
        )r#   r&   s    r   r'   zEvent.event=   s    
 {{r   c                     | j                   S )z!
        The event data.
        )r$   r,   s    r   r(   z
Event.dataD   s    
 zzr   c                     | j                   S )zQ
        The last non-empty "id" value received from this stream so far.
        )r%   r,   s    r   r)   zEvent.last_event_idK   s    
 xxr   c                 >   g }| j                   r|j                  d| j                   z         | j                  dk7  r|j                  d| j                  z         |j                  d | j                  j                  d      D               dj                  |      dz   S )Nzid: %smessagez	event: %sc              3   &   K   | ]	  }d |z    yw)zdata: %sNr   ).0ds     r   	<genexpr>zEvent.dump.<locals>.<genexpr>[   s     CZ!^Cs   
z

)idappendr'   extendr(   splitjoin)r&   r   s     r   dumpz
Event.dumpR   sy    77LLDGG+, ::"LLtzz12CTYY__T-BCCyy&((r   )r0    N)
r   r   r   r   r*   propertyr'   r(   r)   r;   r   r   r   r    r    4   sM    !
      
)r   r    c                   :    e Zd ZdZddZd Zed        Zd Zd Z	y)		SSEClientz
    A simple Server-Sent Events client.

    This implementation does not include automatic retrying of a dropped connection; the caller will do that.
    If a connection ends, the events iterator will simply end.
    Nc                    || _         || _        d| _        |t        i t	                     }|j
                  | _        |j                  }|j                  d|      | _	        || _
        d| j                  vri | j                  d<   | j                  d   j                  |       d| j                  d   d<   d| j                  d   d<   | j                          y )Ni'  r
   headerszno-cachezCache-Controlztext/event-streamAccept)urllast_id_chunk_sizer   r   timeout_timeoutbase_headerscreate_pool_managerhttprequests_kwargsupdate_connect)r&   rC   rD   http_factorykwargsrH   s         r   r*   zSSEClient.__init__f   s     &r:<8L$,,#00 44Q<	  & D000.0D  +Y'..|<;EY'8 5HY'1r   c                 ^   | j                   r| j                   | j                  d   d<    | j                  j                  d| j                  f| j
                  ddd| j                  | _        | j                  j                  | j                        | _	        t        | j                         y )NrA   zLast-Event-IDGETFr   )rF   preload_contentretries)amt)rD   rK   rJ   requestrC   rG   respstreamrE   	resp_filer   r,   s    r   rM   zSSEClient._connect   s    <<?C||D  +O< &DII%%HH$ MM!$ ""$	 ))d.>.>)? 	'tyy1r   c              #     K   d}d}t         j                  | j                        D ]  }|dk(  r'| t        |dk(  rdn||| j                         d}d}/|j                  d      }|dk  rF|dk(  rL|d| }|t        |      dz
  k  r||dz      dk(  r|dz  }||dz   d }|dk(  r|}|d	k(  r||n|d
z   |z   }|dk(  r|| _        |dk(  s yw)zO
        An iterable series of Event objects received from the stream.
        r<   Nr0   :r   r
    r'   r(   r5   r6   retry)r   r   rX   r    rD   findr   )r&   
event_type
event_datar   	colon_posnamevalues          r   eventszSSEClient.events   s    
 

'224>>B 	Drz)Z2-=	:z[_[g[ghh
!
		#I1}A~)$DCIM*tIM/Bc/IQ	1&Ew"
&0&8UzD?PSX?X
$/	s   C
CCc                     | S r"   r   r,   s    r   	__enter__zSSEClient.__enter__   s    r   c                 $    | j                          y r"   )close)r&   typerb   	tracebacks       r   __exit__zSSEClient.__exit__   s    

r   )NN)
r   r   r   r   r*   rM   r=   rc   re   rj   r   r   r   r?   r?   _   s0    82,  @r   r?   N)	ldclient.configr   ldclient.impl.httpr   ldclient.impl.utilr   r   r    r?   r   r   r   <module>rn      s0    & * =+$ +$\() ()V^ ^r   