o
    0=j”  ã                   @   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 ƒ  |¡ d S ©N)ÚsuperÚ__init__)ÚselfZ
credential©Ú	__class__© úcC:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\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   Z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                   @   s:   e Zd ZdZd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   r0   r1   r2   Úkwargsr.   r
   r
   r   r   J   s   	
zSSEClient.__init__c                 C   s   d| _ d| _| j ¡  dS )zCloses the SSEClient instance.Fr   N)r4   r2   Ú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.r.   zLast-Event-IDÚstreamT)Údecode_unicodeN)r4   r5   r3   r1   r7   r0   r:   Úiter_contentÚresp_iteratorÚraise_for_statusÚStopIterationr   r
   r
   r   r8   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_fieldr6   r   r)   Únextr?   r   rA   ÚrequestsÚRequestExceptionÚtimeÚsleepr2   r8   r&   r   Úsplitr*   ÚEventÚparseÚdataÚevent_idr5   )r   Ztemp_bufferÚnextcharrM   r"   Úeventr
   r
   r   Ú__next__w   s8   
úü


zSSEClient.__next__N)r-   )	r   r   r   r   r   r;   r8   rB   rT   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 )rN   z)Event represents the events fired by SSE.z#(?P<name>[^:]*):?( ?(?P<value>.*))?r   ÚmessageNc                 C   s   || _ || _|| _|| _d S r   )rP   Ú
event_typerQ   r2   )r   rP   rV   rQ   r2   r
   r
   r   r   ¢   s   
zEvent.__init__c                 C   sÂ   | ƒ }|  d¡D ]V}| j |¡}|du rt d|› d�t¡ q| ¡ d }| ¡ d }|dkr0q|dkrE|jrA|j› d|› �|_q||_q|d	krM||_q|d
krU||_	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: "ú"ÚnameÚvaluer   rP   rS   Úidr2   )rM   Ússe_line_patternÚmatchÚwarningsÚwarnÚSyntaxWarningÚ	groupdictrP   rV   rQ   Úintr2   )ÚclsÚrawrS   Úliner\   rX   rY   r
   r
   r   rO   ¨   s,   
€zEvent.parse)r   rU   NN)
r   r   r   r   rE   Úcompiler[   r   ÚclassmethodrO   r
   r
   r
   r   rN   �   s    

rN   )r   rE   rK   r]   Zgoogle.authr   rI   re   rG   ZAuthorizedSessionr   r   r,   rN   r
   r
   r
   r   Ú<module>   s   

V