
    (ph                         S r SSKrSSKrSSKrSSKJr  SSKr\R                  " S5      r " S S\R                  R                  5      r
 " S S5      r " S	 S
5      r " S S5      rg)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                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )KeepAuthSession!   zIA session that does not drop authentication on redirects between domains.c                 ,   > [         [        U ]  U5        g N)superr   __init__)self
credential	__class__s     L/var/www/html/venv/lib/python3.13/site-packages/firebase_admin/_sseclient.pyr
   KeepAuthSession.__init__$   s    ot-j9    c                     g r    )r   prepared_requestresponses      r   rebuild_authKeepAuthSession.rebuild_auth'   s    r   r   )	__name__
__module____qualname____firstlineno____doc__r
   r   __static_attributes____classcell__)r   s   @r   r   r   !   s    S: r   r   c                   J    \ rS rSrSrS rS rS r\S 5       r	\S 5       r
Srg	)
_EventBuffer+   z6A helper class for buffering and parsing raw SSE data.c                      / U l         SU l        g N _buffer_tailr   s    r   r
   _EventBuffer.__init__.   s    
r   c                     U R                   R                  U5        U =R                  U-  sl        U R                  SS  U l        g )N)r%   appendr&   )r   chars     r   r+   _EventBuffer.append2   s3    D!

d
ZZ_
r   c                 |    U R                   R                  S5      u  pnX-   n[        U5      U l        USS  U l        g )N
r*   )buffer_string
rpartitionlistr%   r&   )r   headsep_rems        r   truncate_EventBuffer.truncate7   s;    ))44T:1jCyX
r   c                 n    U R                   SS  nUS:H  =(       d    US:H  =(       d    U R                   S:H  $ )N

zz

)r&   )r   last_two_charss     r   is_end_of_field_EventBuffer.is_end_of_field=   s5    BC'_>V+C_tzzU_G__r   c                 8    SR                  U R                  5      $ r"   )joinr%   r'   s    r   r0   _EventBuffer.buffer_stringB   s    wwt||$$r   r$   N)r   r   r   r   r   r
   r+   r7   propertyr=   r0   r   r   r   r   r   r   +   s>    @%
 ` ` % %r   r   c                   @    \ rS rSrSrSS jrS rS rS rS r	S r
S	rg
)	SSEClientG   zSSE client implementation.c                     Xl         X l        X0l        X@l        SU l        SU l        SU l        U R                  R                  S0 5      nSUS'   SUS'   XPR                  S'   U R                  5         g)	zInitializes 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   rI   rJ   rK   kwargsrG   s         r   r
   SSEClient.__init__J   sr     
%"&&**9b9#- /*1Y'r   c                 T    SU l         SU l        U R                  R                  5         g)zCloses the SSEClient instance.Fr   N)rM   rK   respcloser'   s    r   rV   SSEClient.closec   s    #
		r   c                 t   U R                   (       a  U R                  (       a  U R                  U R                  S   S'   U R                  R                  " U R
                  4SS0U R                  D6U l        U R                  R                  SS9U l        U R                  R                  5         g[        5       e)z&Connects to the server using requests.rG   zLast-Event-IDstreamT)decode_unicodeN)rM   rN   rL   rJ   rP   rI   rU   iter_contentresp_iteratorraise_for_statusStopIterationr'   s    r   rQ   SSEClient._connecti   s    ||CG<<$$Y/@((W$W$BVBVWDI!%!7!7t!7!LDII&&(/!r   c                     U $ r   r   r'   s    r   __iter__SSEClient.__iter__t   s    r   c                    [         R                  " [        U R                  5      (       df  [	        5       nUR
                  (       d:   [        U R                  5      nUR                  U5        UR
                  (       d  M:  UR"                  U l        [         R$                  " [        U R                  5      nUS   nSR'                  USS  5      U l        [(        R+                  U5      nUR,                  S:X  a  U R                  5         g UR,                  S:X  a  g UR                  (       a  UR                  U l        UR.                  (       a  UR.                  U l        U$ ! [        [        R                  4 aH    [        R                  " U R                  S-  5        U R                  5         UR!                  5          GM  f = f)Ng     @@r   r;      zcredential is no longer validnull)researchend_of_fieldrO   r   r=   nextr\   r+   r^   requestsRequestExceptiontimesleeprK   rQ   r7   r0   splitr@   Eventparsedataevent_idrN   )r   temp_buffernextcharrn   r3   events         r   __next__SSEClient.__next__w   sH   yytxx00&.K!11	#D$6$67H&&x0 "111 #00DHtxx0Qx;;uQRy)D!::88MMO:: ;;DJ >> >>DL9 &x'@'@A JJtzzF23MMO  ((*s   &E! !AGGc                 "    U R                  5       $ r   )rv   r'   s    r   ri   SSEClient.next   s    }}r   )	rO   rN   rL   rU   r\   rK   rJ   rM   rI   N)i  )r   r   r   r   r   r
   rV   rQ   ra   rv   ri   r   r   r   r   rD   rD   G   s$    $2	"#Jr   rD   c                   V    \ rS rSrSr\R                  " S5      rSS jr\	S 5       r
Srg)	ro      z)Event represents the events fired by SSE.z#(?P<name>[^:]*):?( ?(?P<value>.*))?Nc                 4    Xl         X l        X0l        X@l        g r   )rq   
event_typerr   rK   )r   rq   r}   rr   rK   s        r   r
   Event.__init__   s    	$ 
r   c                    U " 5       nUR                  S5       H  nU R                  R                  U5      nUc   [        R                  " SU-  [
        5        MA  UR                  5       S   nUR                  5       S   nUS:X  a  Mo  US:X  a3  UR                  (       a  UR                  < SU< 3Ul        M  Xbl        M  US:X  a  Xbl        M  US:X  a  Xbl	        M  US	:X  d  M  [        U5      Ul        M     U$ )
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: "%s"namevaluer#   rq   ru   idrK   )rn   sse_line_patternmatchwarningswarnSyntaxWarning	groupdictrq   r}   rr   intrK   )clsrawru   liner   r   r   s          r   rp   Event.parse   s     IIdOD((..t4E}6=}M??$V,DOO%g.Erzv~ ::-2ZZ!?EJ!&J#( !&!%j1 $2 r   )rq   rr   r}   rK   )r#   messageNN)r   r   r   r   r   rf   compiler   r
   classmethodrp   r   r   r   r   ro   ro      s.    3zz"GH $ $r   ro   )r   rf   rl   r   google.authr   rj   r   rh   AuthorizedSessionr   r   rD   ro   r   r   r   <module>r      se   
 
   ! 
 zz/0i((:: % %8V Vr0 0r   