
    iB                         S SK r S SK Jr  S SKJr  S SK Jr  S SKr\" \S5      r " S S\ R                  5      r	 " S S	5      r
\	\R                  \R                  \\(       a  \
OS\ R                  S
.rg)    N)queue)Event)	selectorswebsocket_handshakec                   :   ^  \ rS rSrSr/ 0 4U 4S jjrS rSrU =r$ )Thread	   zt
This wrapper class provides gevent Greenlet interface that is compatible
with the standard library's Thread class.
c                 .   > [         TU ]  " U/UQ70 UD6  g N)super__init__)selftargetargskwargs	__class__s       `/home/admin/cozy_coffee/venv/lib/python3.13/site-packages/engineio/async_drivers/gevent_uwsgi.pyr   Thread.__init__   s    1$1&1    c                 "    U R                  5       $ r   )runr   s    r   _runThread._run   s    xxzr    )	__name__
__module____qualname____firstlineno____doc__r   r   __static_attributes____classcell__)r   s   @r   r   r   	   s     %'r 2 r   r   c                   B    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
rg)uWSGIWebSocket   zl
This wrapper class provides a uWSGI WebSocket interface that is
compatible with eventlet's implementation.
c                 ,    Xl         S U l        / U l        g r   )app_sockreceived_messages)r   handlerservers      r   r   uWSGIWebSocket.__init__   s    
!#r   c                    [         R                  " 5       U l        Xl        [         R                  " 5         S U l        [        [         S5      (       a  [         R                  " 5       U l        O][        5       U l	        [        R                  " 5       U l        S n[        R                  " UU R                  U R                  5      U l        U R!                  U 5        [         R"                  " 5         g)Nrequest_contextc                 
   [         R                  " 5       nUR                  U [         R                  5          UR	                  5         UR                  5         M"  ! [        R                   a    UR                  U 5         gf = f)z5Sets event when data becomes available to read on fd.N)	r   DefaultSelectorregister
EVENT_READselectsetgeventGreenletExit
unregister)fdeventsels      r   select_greenlet_runner7uWSGIWebSocket.__call__.<locals>.select_greenlet_runner/   sf    //1R!5!56'

		  ** 'NN2&'s   #A %BB )uwsgiconnection_fdr(   environr   _req_ctxhasattrr.   r   _eventr   Queue_send_queuer5   spawn_select_greenletr'   
disconnect)r   r@   start_responser;   s       r   __call__uWSGIWebSocket.__call__   s    ((*
!!#5+,,!113DM  'DK${{}D	' %+LL&

%D!
 	r   c                     U R                   c5  U R                  R                  5         U R                  R	                  5         gg)z"Disconnects uWSGI from the client.N)rA   rG   killrC   r4   r   s    r   closeuWSGIWebSocket.closeB   s1    == !!&&(KKOO !r   c                     [        U[        5      (       a  [        R                  nO[        R                  nU R
                  b  U" XR
                  S9  gU" U5        g)zMTransmits message either in binary or UTF-8 text mode,
depending on its type.Nr.   )
isinstancebytesr>   websocket_send_binarywebsocket_sendrA   )r   msgmethods      r   _senduWSGIWebSocket._sendI   sD     c5!!00F))F==$363Kr   c                 ~    [        U[        5      (       d  U$ [        USS 5      nUS:  a  UR                  S5      $ U$ )z7Returns either bytes or str, depending on message type.r      0   zutf-8)rR   rS   orddecode)r   rV   types      r   _decode_receiveduWSGIWebSocket._decode_receivedU   s>    #u%%J3q8}2:::g&&
r   c                     U R                   b  U R                  U5        gU R                  R                  U5        U R                  R                  5         g)zvQueues a message for sending. Real transmission is done in
wait method.
Sends directly if uWSGI version is new enough.N)rA   rX   rE   putrC   r4   )r   rV   s     r   senduWSGIWebSocket.senda   s;     ==$JJsO  %KKOOr   c                     U R                   b0   [        R                  " U R                   S9nU R                  U5      $ U R                  (       a  U R                  R                  S5      $ U R                  R                  SS9nU(       aH  U R                  R                  5         / n  UR                  U R                  R                  SS95        M+    [        R$                  " 5       nU(       a+  U R                  R                  U R                  U5      5        OOMK  U R                  (       a  U R                  R                  S5      $ GML  ! [         a    U R	                  5          gf = f! [        R                  R                    a     Of = fU H6  n U R#                  U5        M  ! [         a    U R	                  5            gf = f   N! [         a    U R	                  5          gf = f)a,  Waits and returns received messages.
If running in compatibility mode for older uWSGI versions,
it also sends messages that have been queued by send().
A return value of None means that connection was closed.
This must be called repeatedly. For uWSGI < 2.1.x it must
be called from the main greenlet.NrQ   r      )timeoutF)block)rA   r>   websocket_recvOSErrorrN   r`   r)   poprC   waitclearappendrE   getr5   r   EmptyrX   websocket_recv_nb)r   rV   	event_setmsgss       r   rm   uWSGIWebSocket.waitk   s    }}( ..t}}MC ,,S11))1155a88 !KK,,Q,7	KK%%'D" KK(8(8(<(<5(<(IJ  $#557 ..55 11#68   ))1155a88Y    JJL $  &||11 "!"#( JJsO& ( JJL#'(  $ # $

#$sG   E )(E. G E+*E+.FFF++G	G	G,+G,)rC   rA   rG   rE   r(   r'   r@   r)   N)r   r   r   r   r    r   rJ   rN   rX   r`   rd   rm   r!   r   r   r   r$   r$      s+    $
!F

39r   r$   )threadr   queue_emptyr9   	websocketsleep)r5   r   gevent.eventr   r   r>   rB   _websocket_availableGreenletr   r$   JoinableQueuerq   ry   _asyncr   r   r   <module>r      sl        u&;< 	V__ 	I9 I9Z   ;;#7T\\
r   