
    Ѯ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y)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                 $    t         |   |       y N)super__init__)self
credential	__class__s     k/home/www/academy-backend.kofcorporation.com/venv/lib/python3.12/site-packages/firebase_admin/_sseclient.pyr	   zKeepAuthSession.__init__$   s    $    c                      y 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   !   s    S%r   r   c                   B    e Zd ZdZd Zd Zd Zed        Zed        Z	y)_EventBufferz6A helper class for buffering and parsing raw SSE data.c                      g | _         d| _        y N )_buffer_tailr
   s    r   r	   z_EventBuffer.__init__.   s    
r   c                     | j                   j                  |       | xj                  |z  c_        | j                  dd  | _        y )N)r   appendr   )r
   chars     r   r#   z_EventBuffer.append2   s3    D!

d
ZZ_
r   c                     | j                   j                  d      \  }}}||z   }t        |      | _        |dd  | _        y )N
r"   )buffer_string
rpartitionlistr   r   )r
   headsep_rems        r   truncatez_EventBuffer.truncate7   s?    ))44T:c1SjCyX
r   c                 Z    | j                   dd  }|dk(  xs |dk(  xs | j                   dk(  S )N

zz

)r   )r
   last_two_charss     r   is_end_of_fieldz_EventBuffer.is_end_of_field=   s5    BC'_>V+C_tzzU_G__r   c                 8    dj                  | 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>    @%
 ` ` % %r   r   c                   0    e Zd ZdZddZd Zd Zd Zd Zy)		SSEClientzSSE client implementation.c                     || _         || _        || _        || _        d| _        d| _        d| _        | j                  j                  di       }d|d<   d|d<   || j                  d<   | j                          y)	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#- /*1Y'r   c                 T    d| _         d| _        | j                  j                          y)zCloses the SSEClient instance.Fr   N)r@   r>   respcloser    s    r   rH   zSSEClient.closec   s    #
		r   c                 f   | j                   r| j                  r| j                  | j                  d   d<    | j                  j                  | j
                  fddi| j                  | _        | j                  j                  d      | _        | j                  j                          yt               )z&Connects to the server using requests.r:   zLast-Event-IDstreamT)decode_unicodeN)r@   rA   r?   r=   rC   r<   rG   iter_contentresp_iteratorraise_for_statusStopIterationr    s    r   rD   zSSEClient._connecti   s    ||CG<<$$Y/@(((W$W$BVBVWDI!%!7!7t!7!LDII&&(/!r   c                     | S r   r   r    s    r   __iter__zSSEClient.__iter__t   s    r   c                 J   t        j                  t        | j                        s[t	               }|j
                  s4	 t        | j                        }|j                  |       |j
                  s4|j"                  | _        t        j$                  t        | j                        }|d   }dj'                  |dd        | _        t(        j+                  |      }|j,                  dk(  r| j                          y |j,                  dk(  ry |j                  r|j                  | _        |j.                  r|j.                  | _        |S # t        t        j                  f$ rF t        j                  | j                  dz         | j                          |j!                          Y rw xY w)Ng     @@r   r1      zcredential is no longer validnull)researchend_of_fieldrB   r   r3   nextrM   r#   rO   requestsRequestExceptiontimesleepr>   rD   r.   r'   splitr5   Eventparsedataevent_idrA   )r
   temp_buffernextcharr]   r*   events         r   __next__zSSEClient.__next__w   sB   yytxx0&.K!11	#D$6$67H&&x0 "11 #00DHtxx0Qx;;uQRy)D!::88MMO:: ;;DJ >> >>DL9 &x'@'@A JJtzzF23MMO  ((*s   &E AF"!F"N)i  )	r   r   r   r   r	   rH   rD   rQ   re   r   r   r   r8   r8   G   s    $2	"#r   r8   c                   L    e Zd ZdZ ej
                  d      ZddZed        Z	y)r^   z)Event represents the events fired by SSE.z#(?P<name>[^:]*):?( ?(?P<value>.*))?Nc                 <    || _         || _        || _        || _        y r   )r`   
event_typera   r>   )r
   r`   rh   ra   r>   s        r   r	   zEvent.__init__   s    	$ 
r   c                     |        }|j                  d      D ]  }| j                  j                  |      }|t        j                  d| dt
               ?|j                         d   }|j                         d   }|dk(  rk|dk(  r+|j                  r|j                   d| |_        ||_        |dk(  r||_        |d	k(  r||_	        |d
k(  s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&   zInvalid SSE line: ""namevaluer   r`   rd   idr>   )r]   sse_line_patternmatchwarningswarnSyntaxWarning	groupdictr`   rh   ra   intr>   )clsrawrd   linero   rk   rl   s          r   r_   zEvent.parse   s     IIdO 	)D((..t4E} 3D6;]K??$V,DOO%g.Erzv~ ::$)JJ<r%!9EJ!&EJ#( !&!%j1	)2 r   )r   messageNN)
r   r   r   r   rU   compilern   r	   classmethodr_   r   r   r   r^   r^      s0    3!rzz"GH $ $r   r^   )r   rU   r[   rp   google.authr   rY   ry   rW   AuthorizedSessionr   r   r8   r^   r   r   r   <module>r}      sg   
 
   ! 
 rzz/0i((:: % %8S Sl0 0r   