
    iB                         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dS )    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                 B     t                      j        |g|R i | d S N)super__init__)selftargetargskwargs	__class__s       N/usr/local/lib/python3.11/dist-packages/engineio/async_drivers/gevent_uwsgi.pyr   zThread.__init__   s0    1$111&11111    c                 *    |                                  S r
   )runr   s    r   _runzThread._run   s    xxzzr   )__name__
__module____qualname____doc__r   r   __classcell__)r   s   @r   r   r   	   s]          %'r 2 2 2 2 2 2      r   r   c                   <    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	S )
uWSGIWebSocketzx
    This wrapper class provides a uWSGI WebSocket interface that is
    compatible with eventlet's implementation.
    c                 0    || _         d | _        g | _        d S 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                    | _        nSt                      | _	        t          j                    | _        d }t          j        || j        | j	                  | _        |                     |            t          j                     dS )Nrequest_contextc                    t          j                    }|                    | t           j                   	 	 |                                 |                                 )# t          j        $ r |                    |            Y dS w xY w)z5Sets event when data becomes available to read on fd.TN)	r   DefaultSelectorregister
EVENT_READselectsetgeventGreenletExit
unregister)fdeventsels      r   select_greenlet_runnerz7uWSGIWebSocket.__call__.<locals>.select_greenlet_runner/   s    /11R!5666'$

		$ * ' ' 'NN2&&&&&&'s   *A $BB )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33DMM  ''DK${}}D	' 	' 	' %+L&
% %D!
 	rr   c                 |    | j         4| j                                         | j                                         dS dS )z"Disconnects uWSGI from the client.N)r8   r>   killr:   r,   r   s    r   closezuWSGIWebSocket.closeB   s?    = !&&(((KOO ! r   c                     t          |t                    rt          j        }nt          j        }| j         ||| j                   dS  ||           dS )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   s^     c5!! 	*0FF)F=$F3666666F3KKKKKr   c                     t          |t                    s|S t          |dd                   }|dk    r|                    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   sL    #u%% 	J3qs8}}2::::g&&&
r   c                     | j         |                     |           dS | j                            |           | j                                         dS )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   sN     =$JJsOOOOO  %%%KOOr   c                    	 | j         V	 t          j        | j                   }n%# t          $ r |                                  Y dS w xY w|                     |          S | j        r| j                            d          S | j        	                    d          }|r| j        
                                 g }	 	 |                    | j                            d                     n# t          j        j        $ r Y nw xY wK|D ]>}	 |                     |           # t          $ r |                                  Y  dS w xY w	 	 t          j                    }n%# t          $ r |                                  Y dS w xY w|r.| j                            |                     |                     nnl| j        r| j                            d          S )	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.TNrF   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:   ,	9}( .t}MMMCC      JJLLL44  ,,S111) 9155a888 !K,,Q,77	 (K%%'''D"" KK(8(<(<5(<(I(IJJJJ%|1 " " "!E""
  $ ( (( JJsOOOO& ( ( ( JJLLL#'444(

$#577" $ $ $

#tt$  .55 11#668 8 8 8 
 ) 9155a888Y,	9sE   % AA:.C) )D ?D 	DEEE E=<E=N)r   r   r   r   r   rA   rD   rM   rT   rW   r_    r   r   r   r      s         $ $ $
! ! !F  
 
 

 
 
  39 39 39 39 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      s                       wu&;<< 	 	 	 	 	V_ 	 	 	I9 I9 I9 I9 I9 I9 I9 I9Z  ;#7AT\
 
r   