
    h                         d Z ddlZddlZddlZddlmZ ddlZ ej        d          Z G d dej        j	                  Z
 G d d          Z G d	 d
          Z G 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                   (     e Zd ZdZ fdZd Z xZS )KeepAuthSessionzIA session that does not drop authentication on redirects between domains.c                 J    t                                          |           d S N)super__init__)self
credential	__class__s     ]/var/www/html/e360mart/e360mart_env/lib/python3.11/site-packages/firebase_admin/_sseclient.pyr	   zKeepAuthSession.__init__$   s!    $$$$$    c                     d S r    )r
   prepared_requestresponses      r   rebuild_authzKeepAuthSession.rebuild_auth'   s    r   )__name__
__module____qualname____doc__r	   r   __classcell__)r   s   @r   r   r   !   sM        SS% % % % %      r   r   c                   P    e Zd ZdZd Zd Zd Zed             Zed             Z	dS )_EventBufferz6A helper class for buffering and parsing raw SSE data.c                 "    g | _         d| _        d S N )_buffer_tailr
   s    r   r	   z_EventBuffer.__init__.   s    


r   c                     | j                             |           | xj        |z  c_        | j        dd          | _        d S )N)r   appendr   )r
   chars     r   r#   z_EventBuffer.append2   s=    D!!!

d

Z_


r   c                     | j                             d          \  }}}||z   }t          |          | _        |dd          | _        d S )N
r"   )buffer_string
rpartitionlistr   r   )r
   headsep_rems        r   truncatez_EventBuffer.truncate7   sG    )44T::c1SjCyyX


r   c                 N    | j         dd          }|dk    p|dk    p
| j         dk    S )N

zz

)r   )r
   last_two_charss     r   is_end_of_fieldz_EventBuffer.is_end_of_field=   s3    BCC'_>V+C_tzU_G__r   c                 6    d                     | j                  S r   )joinr   r    s    r   r'   z_EventBuffer.buffer_stringB   s    wwt|$$$r   N)
r   r   r   r   r	   r#   r.   propertyr3   r'   r   r   r   r   r   +   s        @@  % % %
   ` ` X` % % X% % %r   r   c                   2    e Zd ZdZd	dZd Zd Zd Zd ZdS )
	SSEClientzSSE client implementation.  c                     || _         || _        || _        || _        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
   r=   r>   r?   kwargsr;   s         r   r	   zSSEClient.__init__J   s     
%"&**9b99#- /*1Y'r   c                 T    d| _         d| _        | j                                         dS )zCloses the SSEClient instance.Fr   N)rA   r?   respcloser    s    r   rI   zSSEClient.closec   s)    #
	r   c                 "   | j         r{| j        r| j        | j        d         d<    | j        j        | j        fddi| j        | _        | j                            d          | _        | j        	                                 dS t                      )z&Connects to the server using requests.r;   zLast-Event-IDstreamT)decode_unicodeN)rA   rB   r@   r>   rD   r=   rH   iter_contentresp_iteratorraise_for_statusStopIterationr    s    r   rE   zSSEClient._connecti   s     	"| PCG<$Y/@((WW$W$BVWWDI!%!7!7t!7!L!LDI&&(((((//!r   c                     | S r   r   r    s    r   __iter__zSSEClient.__iter__t   s    r   c                    t          j        t          | j                  st	                      }|j        s	 t          | j                  }|                    |           n`# t          t          j        f$ rG t          j        | j        dz             |                                  |                                 Y w xY w|j        |j        | _        t          j        t          | j                  }|d         }d                    |dd                    | _        t(                              |          }|j        dk    r|                                  d S |j        dk    rd S |j        r|j        | _        |j        r|j        | _        |S )Ng     @@r   r1      zcredential is no longer validnull)researchend_of_fieldrC   r   r3   nextrN   r#   rP   requestsRequestExceptiontimesleepr?   rE   r.   r'   splitr5   Eventparsedataevent_idrB   )r
   temp_buffernextcharr^   r*   events         r   __next__zSSEClient.__next__w   sz   ytx00 	1&..K!1 
	#D$677H&&x0000%x'@A   JtzF2333MMOOO  ((***H	 "1 
 #0DHtx00Qx;;uQRRy))D!!:888MMOOO4:4 ; 	%DJ > 	* >DLs   )A   AB=<B=N)r9   )	r   r   r   r   r	   rI   rE   rR   rf   r   r   r   r8   r8   G   sj        $$   2  	" 	" 	"  # # # # #r   r8   c                   P    e Zd ZdZ ej        d          ZddZed             Z	dS )	r_   z)Event represents the events fired by SSE.z#(?P<name>[^:]*):?( ?(?P<value>.*))?r   messageNc                 >    || _         || _        || _        || _        d S r   )ra   
event_typerb   r?   )r
   ra   rj   rb   r?   s        r   r	   zEvent.__init__   s"    	$ 


r   c                     |             }|                     d          D ]}| j                            |          }|t          j        d| dt
                     =|                                d         }|                                d         }|dk    rx|dk    r!|j        r|j         d| |_        ||_        |d	k    r||_        |d
k    r||_	        |dk    rt          |          |_        |S )zGiven 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   ra   re   idr?   )r^   sse_line_patternmatchwarningswarnSyntaxWarning	groupdictra   rj   rb   intr?   )clsrawre   linerq   rm   rn   s          r   r`   zEvent.parse   s    IIdOO 	) 	)D(..t44E};D;;;]KKK??$$V,DOO%%g.Erzzv~~ : '$)J!9!9%!9!9EJJ!&EJJ#(  !&!%jjr   )r   rh   NN)
r   r   r   r   rV   compilerp   r	   classmethodr`   r   r   r   r_   r_      s\        33!rz"GHH    $ $ [$ $ $r   r_   )r   rV   r\   rr   google.authr   rZ   rz   rX   AuthorizedSessionr   r   r8   r_   r   r   r   <module>r~      s   
 
			   ! ! ! ! ! ! 
 rz/00    i(:   % % % % % % % %8S S S S S S S Sl0 0 0 0 0 0 0 0 0 0r   