
    wgB                         d dl Z d dl mZ d dlmZ d dl mZ d dlZ eed      Z G d de j                        Z	 G d d	      Z
e	ej                  ej                  eere
nde j                  d
Zy)    N)queue)Event)	selectorswebsocket_handshakec                   .     e Zd ZdZg i f fd	Zd Z xZS )Threadz
    This wrapper class provides gevent Greenlet interface that is compatible
    with the standard library's Thread class.
    c                 ,    t        |   |g|i | y N)super__init__)selftargetargskwargs	__class__s       h/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/engineio/async_drivers/gevent_uwsgi.pyr   zThread.__init__   s    1$1&1    c                 "    | j                         S r
   )runr   s    r   _runzThread._run   s    xxzr   )__name__
__module____qualname____doc__r   r   __classcell__)r   s   @r   r   r   	   s     %'r 2r   r   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
uWSGIWebSocketzx
    This wrapper class provides a uWSGI WebSocket interface that is
    compatible with eventlet's implementation.
    c                 .    || _         d | _        g | _        y r
   )app_sockreceived_messages)r   handlerservers      r   r   zuWSGIWebSocket.__init__   s    
!#r   c                    t        j                         | _        || _        t        j                          d | _        t        t         d      rt        j                         | _        n[t               | _	        t        j                         | _        d }t        j                  || j                  | j                        | _        | j!                  |        t        j"                          y)Nrequest_contextc                    t        j                         }|j                  | t         j                         	 	 |j	                          |j                          !# t        j                  $ r |j                  |        Y yw xY w)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_runnerz7uWSGIWebSocket.__call__.<locals>.select_greenlet_runner/   sf    //1R!5!56'

		  ** 'NN2&'s   "A $A?>A? )uwsgiconnection_fdr!   environr   _req_ctxhasattrr&   r   _eventr   Queue_send_queuer-   spawn_select_greenletr    
disconnect)r   r7   start_responser3   s       r   __call__zuWSGIWebSocket.__call__   s    ((*
!!#5+,!113DM  'DK${{}D	' %+LL&

%D!
 	r   c                     | j                   5| j                  j                          | j                  j	                          yy)z"Disconnects uWSGI from the client.N)r8   r>   killr:   r,   r   s    r   closezuWSGIWebSocket.closeB   s1    == !!&&(KKOO !r   c                     t        |t              rt        j                  }nt        j                  }| j
                   ||| j
                         y ||       y)zUTransmits message either in binary or UTF-8 text mode,
        depending on its type.Nr&   )
isinstancebytesr5   websocket_send_binarywebsocket_sendr8   )r   msgmethods      r   _sendzuWSGIWebSocket._sendI   sC     c5!00F))F==$363Kr   c                 r    t        |t              s|S t        |dd       }|dk\  r|j                  d      S |S )z7Returns either bytes or str, depending on message type.r      0   zutf-8)rG   rH   orddecode)r   rK   types      r   _decode_receivedzuWSGIWebSocket._decode_receivedU   s;    #u%J3q8}2:::g&&
r   c                     | j                   | j                  |       y| j                  j                  |       | j                  j                          y)zQueues a message for sending. Real transmission is done in
        wait method.
        Sends directly if uWSGI version is new enough.N)r8   rM   r<   putr:   r,   )r   rK   s     r   sendzuWSGIWebSocket.senda   s;     ==$JJsO  %KKOOr   c                    	 | j                   2	 t        j                  | j                         }| j                  |      S | j                  r| j                  j                  d      S | j                  j                  d      }|rJ| j                  j                          g }	 	 |j                  | j                  j                  d             -	 	 t        j$                         }|r+| j                  j                  | j                  |             nnD| j                  r| j                  j                  d      S ;# t        $ r | j	                          Y yw xY w# t        j                  j                   $ r Y nw xY w|D ]4  }	 | j#                  |       # t        $ r | j	                          Y  yw xY w # t        $ r | j	                          Y yw xY w)aT  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.NrF   r      )timeoutF)block)r8   r5   websocket_recvOSErrorrD   rT   r"   popr:   waitclearappendr<   getr-   r   EmptyrM   websocket_recv_nb)r   rK   	event_setmsgss       r   r_   z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    D= #+E F9 =EEE<;E<FF43F49GGN)r   r   r   r   r   rA   rD   rM   rT   rW   r_    r   r   r   r      s+    $
!F

39r   r   )threadr   queue_emptyr1   	websocketsleep)r-   r   gevent.eventr   r   r5   r9   _websocket_availableGreenletr   r   JoinableQueuerc   rk   _asyncrg   r   r   <module>rq      sl        u&;< 	V__ 	I9 I9Z   ;;#7T\\
r   