o
    ×èFhæ  ã                   @   s|   d Z ddlZddlZddlZddlmZ ddlZe d¡ZG dd„ dejj	ƒZ
G dd„ dƒZG d	d
„ d
ƒZG dd„ dƒZdS )zzSSEClient module to stream realtime updates from the Firebase Database.

Based on a similar implementation from Pyrebase.
é    N)Ú	transportz\r\n\r\n|\r\r|\n\nc                       s(   e Zd ZdZ‡ fdd„Zdd„ Z‡  ZS )ÚKeepAuthSessionzIA session that does not drop authentication on redirects between domains.c                    s   t t| ƒ |¡ d S ©N)Úsuperr   Ú__init__)ÚselfÚ
credential©Ú	__class__© úR/var/www/html/loop/nvenv/lib/python3.10/site-packages/firebase_admin/_sseclient.pyr   $   s   zKeepAuthSession.__init__c                 C   s   d S r   r   )r   Úprepared_requestÚresponser   r   r   Úrebuild_auth'   ó   zKeepAuthSession.rebuild_auth)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__classcell__r   r   r	   r   r   !   s    r   c                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zedd	„ ƒZed
d„ ƒZ	dS )Ú_EventBufferz6A helper class for buffering and parsing raw SSE data.c                 C   s   g | _ d| _d S ©NÚ )Ú_bufferÚ_tail©r   r   r   r   r   .   s   
z_EventBuffer.__init__c                 C   s.   | j  |¡ |  j|7  _| jdd … | _d S )Néüÿÿÿ)r   Úappendr   )r   Úcharr   r   r   r   2   s   z_EventBuffer.appendc                 C   s6   | j  d¡\}}}|| }t|ƒ| _|dd … | _d S )NÚ
r   )Úbuffer_stringÚ
rpartitionÚlistr   r   )r   ÚheadÚsepÚ_Úremr   r   r   Útruncate7   s   
z_EventBuffer.truncatec                 C   s(   | j dd … }|dkp|dkp| j dkS )Néþÿÿÿú

zz

)r   )r   Úlast_two_charsr   r   r   Úis_end_of_field=   s   z_EventBuffer.is_end_of_fieldc                 C   s   d  | j¡S r   )Újoinr   r   r   r   r   r    B   s   z_EventBuffer.buffer_stringN)
r   r   r   r   r   r   r'   Úpropertyr+   r    r   r   r   r   r   +   s    
r   c                   @   sB   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )Ú	SSEClientzSSE client implementation.é¸  c                 K   s^   || _ || _|| _|| _d| _d| _d| _| j di ¡}d|d< d|d< || jd< |  ¡  dS )	a  Initializes the SSEClient.

        Args:
          url: The remote url to connect to.
          session: The requests session.
          retry: The retry interval in milliseconds (optional).
          **kwargs: Extra kwargs that will be sent to ``requests.get()`` (optional).
        TNr   Úheaderszno-cachezCache-Controlztext/event-streamÚAccept)	ÚurlÚsessionÚretryÚrequests_kwargsÚshould_connectÚlast_idÚbufÚgetÚ_connect)r   r2   r3   r4   Úkwargsr0   r   r   r   r   J   s   	
zSSEClient.__init__c                 C   s   d| _ d| _| j ¡  dS )zCloses the SSEClient instance.Fr   N)r6   r4   ÚrespÚcloser   r   r   r   r=   c   s   zSSEClient.closec                 C   s^   | j r,| jr| j| jd d< | jj| jfddi| j¤Ž| _| jjdd�| _| j 	¡  dS t
ƒ ‚)z&Connects to the server using requests.r0   zLast-Event-IDÚstreamT)Údecode_unicodeN)r6   r7   r5   r3   r9   r2   r<   Úiter_contentÚresp_iteratorÚraise_for_statusÚStopIterationr   r   r   r   r:   i   s   zSSEClient._connectc                 C   s   | S r   r   r   r   r   r   Ú__iter__t   r   zSSEClient.__iter__c              	   C   sò   t  t| j¡s=tƒ }|js9zt| jƒ}| |¡ W n t	t
jfy5   t | jd ¡ |  ¡  | ¡  Y q
w |jr|j| _t  t| j¡}|d }d |dd … ¡| _t |¡}|jdkrb|  ¡  d S |jdkrid S |jrp|j| _|jrw|j| _|S )Ng     @�@r   r)   é   zcredential is no longer validÚnull)ÚreÚsearchÚend_of_fieldr8   r   r+   ÚnextrA   r   rC   ÚrequestsÚRequestExceptionÚtimeÚsleepr4   r:   r'   r    Úsplitr,   ÚEventÚparseÚdataÚevent_idr7   )r   Útemp_bufferÚnextcharrO   r#   Úeventr   r   r   Ú__next__w   s8   
úü


zSSEClient.__next__c                 C   s   |   ¡ S r   )rW   r   r   r   r   rJ   œ   s   zSSEClient.nextN)r/   )
r   r   r   r   r   r=   r:   rD   rW   rJ   r   r   r   r   r.   G   s    
%r.   c                   @   s0   e Zd ZdZe d¡Zd
dd„Zedd	„ ƒZ	dS )rP   z)Event represents the events fired by SSE.z#(?P<name>[^:]*):?( ?(?P<value>.*))?r   ÚmessageNc                 C   s   || _ || _|| _|| _d S r   )rR   Ú
event_typerS   r4   )r   rR   rY   rS   r4   r   r   r   r   ¥   s   
zEvent.__init__c                 C   s¼   | ƒ }|  d¡D ]S}| j |¡}|du rt d| t¡ q| ¡ d }| ¡ d }|dkr.q|dkrB|jr>d|j|f |_q||_q|d	krJ||_q|d
krR||_	q|dkr[t
|ƒ|_q|S )zÿGiven a possibly-multiline string representing an SSE message, parses it
        and returns an Event object.

        Args:
          raw: the raw data to parse.

        Returns:
          Event: A new ``Event`` with the parameters initialized.
        r   NzInvalid SSE line: "%s"ÚnameÚvaluer   rR   z%s
%srV   Úidr4   )rO   Ússe_line_patternÚmatchÚwarningsÚwarnÚSyntaxWarningÚ	groupdictrR   rY   rS   Úintr4   )ÚclsÚrawrV   Úliner^   rZ   r[   r   r   r   rQ   «   s,   
€zEvent.parse)r   rX   NN)
r   r   r   r   rG   Úcompiler]   r   ÚclassmethodrQ   r   r   r   r   rP       s    

rP   )r   rG   rM   r_   Úgoogle.authr   rK   rg   rI   ÚAuthorizedSessionr   r   r.   rP   r   r   r   r   Ú<module>   s   

Y