o
    @Bif/                     @   s  d dl mZ d dlmZ d dlZe  d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZ d dlmZ zd dlZd d	lmZ d d
lmZ W n ey_   d dlZd d	lmZ d d
lmZ Y nw eedriejZneedZdZdd ZG dd dejZeG dd deejZeG dd deejZG dd deZ eG dd de ej!Z!eG dd de ej"Z"eG dd dej#eZ#eG dd dej$e!Z$eG d d! d!ej%eZ%eG d"d# d#ej&e"Z&dS )$    )absolute_import)dequeN)public)transport_channel_idpeer2str)	websocket)protocol)TransportDetails)iscoroutine)Futureensure_futureasync)WebSocketServerProtocolWebSocketClientProtocolWebSocketServerFactoryWebSocketClientFactoryWampWebSocketServerProtocolWampWebSocketClientProtocolWampWebSocketServerFactoryWampWebSocketClientFactoryc                 C   s   t | tpt| S )z
    Returns ``True`` iff the value yields.

    .. seealso:: http://stackoverflow.com/questions/20730248/maybedeferred-analog-with-asyncio
    )
isinstancer   r
   )value r   Z/var/www/html/Trade-python/venv/lib/python3.10/site-packages/autobahn/asyncio/websocket.pyyieldsD   s   r   c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd(ddZdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'S ))WebSocketAdapterProtocolzP
    Adapter class for asyncio-based WebSocket client and server protocols.
    c                 C   sF   || _ t | _|   z
t|d| _W n   d| _Y |   d S )Npeername?)	transportr   receive_queue_consumer   get_extra_infopeer_connectionMade)selfr   r   r   r   connection_madeR   s   z(WebSocketAdapterProtocol.connection_madec                 C   s&   |  | |d ur| j  d | _d S N)_connectionLostr   close)r$   excr   r   r   connection_lost_   s   


z(WebSocketAdapterProtocol.connection_lostc                    s4   t  jjptjjd _ fdd} j| d S )N)loopc                    s:   t  jr j } jr | t  js   d S r&   )lenr   popleftr   _dataReceivedr    )_datar$   r   r   processj   s   



z2WebSocketAdapterProtocol._consume.<locals>.process)r   factoryr+   txaioconfigwaiteradd_done_callback)r$   r2   r   r1   r   r    g   s   z!WebSocketAdapterProtocol._consumec                 C   s*   | j | | j s| jd  d S d S r&   )r   appendr6   done
set_result)r$   r0   r   r   r   data_receiveds   s   
z&WebSocketAdapterProtocol.data_receivedFc                 C   s,   |rt | jdr| j  d S | j  d S )Nabort)hasattrr   r<   r(   )r$   r<   r   r   r   _closeConnectionx   s   z)WebSocketAdapterProtocol._closeConnectionc                 C       |   }t|rt| d S d S r&   )onOpenr   r   r$   resr   r   r   _onOpen~      z WebSocketAdapterProtocol._onOpenc                 C   "   |  |}t|rt| d S d S r&   )onMessageBeginr   r   )r$   isBinaryrB   r   r   r   _onMessageBegin      
z(WebSocketAdapterProtocol._onMessageBeginc                 C   rE   r&   )onMessageFrameBeginr   r   )r$   lengthrB   r   r   r   _onMessageFrameBegin   rI   z-WebSocketAdapterProtocol._onMessageFrameBeginc                 C   rE   r&   )onMessageFrameDatar   r   r$   payloadrB   r   r   r   _onMessageFrameData   rI   z,WebSocketAdapterProtocol._onMessageFrameDatac                 C   r?   r&   )onMessageFrameEndr   r   rA   r   r   r   _onMessageFrameEnd   rD   z+WebSocketAdapterProtocol._onMessageFrameEndc                 C   rE   r&   )onMessageFramer   r   rN   r   r   r   _onMessageFrame   rI   z(WebSocketAdapterProtocol._onMessageFramec                 C   r?   r&   )onMessageEndr   r   rA   r   r   r   _onMessageEnd   rD   z&WebSocketAdapterProtocol._onMessageEndc                 C   s$   |  ||}t|rt| d S d S r&   )	onMessager   r   )r$   rO   rG   rB   r   r   r   
_onMessage   s   z#WebSocketAdapterProtocol._onMessagec                 C   rE   r&   )onPingr   r   rN   r   r   r   _onPing   rI   z WebSocketAdapterProtocol._onPingc                 C   rE   r&   )onPongr   r   rN   r   r   r   _onPong   rI   z WebSocketAdapterProtocol._onPongc                 C   s&   |  |||}t|rt| d S d S r&   )onCloser   r   )r$   wasCleancodereasonrB   r   r   r   _onClose   s   z!WebSocketAdapterProtocol._onClosec                 C      t d)Nznot implemented	Exception)r$   producer	streamingr   r   r   registerProducer      z)WebSocketAdapterProtocol.registerProducerc                 C   s   d S r&   r   r1   r   r   r   unregisterProducer   s   z+WebSocketAdapterProtocol.unregisterProducerN)F)__name__
__module____qualname____doc__r%   r*   r    r;   r>   rC   rH   rL   rP   rR   rT   rV   rX   rZ   r\   ra   rg   ri   r   r   r   r   r   M   s(    
r   c                   @   s"   e Zd ZdZe ZdddZdS )r   z
    Base class for asyncio-based WebSocket server protocols.

    Implements:

    * :class:`autobahn.websocket.interfaces.IWebSocketChannel`
    
tls-uniquec                 C      t | jd|S )W
        Implements :func:`autobahn.wamp.interfaces.ITransport.get_channel_id`
        Tr   r   r$   channel_id_typer   r   r   get_channel_id      z&WebSocketServerProtocol.get_channel_idNrn   )rj   rk   rl   rm   r4   make_loggerlogrt   r   r   r   r   r      s    r   c                   @   s:   e Zd ZdZe Zdd Zdd ZdddZ	d	d
 Z
dS )r   z
    Base class for asyncio-based WebSocket client protocols.

    Implements:

    * :class:`autobahn.websocket.interfaces.IWebSocketChannel`
    c                 C   rE   r&   )	onConnectr   r   )r$   responserB   r   r   r   
_onConnect   rI   z"WebSocketClientProtocol._onConnectc                 C   rb   )Nz)WSS over explicit proxies not implementedrc   r1   r   r   r   startTLS   rh   z WebSocketClientProtocol.startTLSrn   c                 C   ro   )rp   Frq   rr   r   r   r   rt      ru   z&WebSocketClientProtocol.get_channel_idc                 C   s>   | j dddu}|rdt| j ddi}ni }t| j||dS )z]
        Internal helper.
        Base class calls this to create a TransportDetails
        peercertNrn   F)r"   	is_securesecure_channel_id)r   r!   r   r	   r"   )r$   r~   r   r   r   r   _create_transport_details   s   z1WebSocketClientProtocol._create_transport_detailsNrv   )rj   rk   rl   rm   r4   rw   rx   r{   r|   rt   r   r   r   r   r   r      s    
r   c                   @   s    e Zd ZdZe Zdd ZdS )WebSocketAdapterFactoryzP
    Adapter class for asyncio-based WebSocket client and server factories.
    c                 C   s   |   }| |_|S r&   )r   r3   )r$   protor   r   r   __call__  s   z WebSocketAdapterFactory.__call__N)rj   rk   rl   rm   r4   rw   rx   r   r   r   r   r   r      s    r   c                   @      e Zd ZdZeZdd ZdS )r   z
    Base class for asyncio-based WebSocket server factories.

    Implements:

    * :class:`autobahn.websocket.interfaces.IWebSocketServerChannelFactory`
    c                 O   8   | dd}|pt | _tjj| g|R i | dS )a  
        .. note::
            In addition to all arguments to the constructor of
            :meth:`autobahn.websocket.interfaces.IWebSocketServerChannelFactory`,
            you can supply a ``loop`` keyword argument to specify the
            asyncio event loop to be used.
        r+   N)popasyncioget_event_loopr+   r   r   __init__r$   argskwargsr+   r   r   r   r     s   zWebSocketServerFactory.__init__N)rj   rk   rl   rm   r   r   r   r   r   r   r   r   	  s    r   c                   @   s   e Zd ZdZdd ZdS )r   z
    Base class for asyncio-based WebSocket client factories.

    Implements:

    * :class:`autobahn.websocket.interfaces.IWebSocketClientChannelFactory`
    c                 O   r   )a  

        .. note::
            In addition to all arguments to the constructor of
            :meth:`autobahn.websocket.interfaces.IWebSocketClientChannelFactory`,
            you can supply a ``loop`` keyword argument to specify the
            asyncio event loop to be used.
        r+   N)r   r   r   r+   r   r   r   r   r   r   r   r   -  s   	zWebSocketClientFactory.__init__N)rj   rk   rl   rm   r   r   r   r   r   r   #  s    r   c                   @      e Zd ZdZdS )r   z
    asyncio-based WAMP-over-WebSocket server protocol.

    Implements:

    * :class:`autobahn.wamp.interfaces.ITransport`
    Nrj   rk   rl   rm   r   r   r   r   r   <      r   c                   @   r   )r   z;
    asyncio-based WAMP-over-WebSocket server factory.
    c                 O   B   | dd}tj| || | j|d< tj| g|R i | dS )a  

        :param factory: A callable that produces instances that implement
            :class:`autobahn.wamp.interfaces.ITransportHandler`
        :type factory: callable

        :param serializers: A list of WAMP serializers to use (or ``None``
            for all available serializers).
        :type serializers: list of objects implementing
            :class:`autobahn.wamp.interfaces.ISerializer`
        serializersN	protocols)r   r   r   r   
_protocolsr   r$   r3   r   r   r   r   r   r   r   O  s   
z#WampWebSocketServerFactory.__init__N)rj   rk   rl   rm   r   r   r   r   r   r   r   r   G      r   c                   @   r   )r   z
    asyncio-based WAMP-over-WebSocket client protocols.

    Implements:

    * :class:`autobahn.wamp.interfaces.ITransport`
    Nr   r   r   r   r   r   f  r   r   c                   @   r   )r   z;
    asyncio-based WAMP-over-WebSocket client factory.
    c                 O   r   )a  

        :param factory: A callable that produces instances that implement
            :class:`autobahn.wamp.interfaces.ITransportHandler`
        :type factory: callable

        :param serializer: The WAMP serializer to use (or ``None`` for
           "best" serializer, chosen as the first serializer available from
           this list: CBOR, MessagePack, UBJSON, JSON).
        :type serializer: object implementing :class:`autobahn.wamp.interfaces.ISerializer`
        r   Nr   )r   r   r   r   r   r   r   r   r   r   r   y  s   
z#WampWebSocketClientFactory.__init__N)rj   rk   rl   rm   r   r   r   r   r   r   r   r   q  r   r   )'
__future__r   collectionsr   r4   use_asyncioautobahn.utilr   autobahn.asyncio.utilr   r   autobahn.wampr   autobahn.websocketr   autobahn.websocket.typesr	   r   r
   r   ImportErrortrolliusr=   r   getattr__all__r   Protocolr   r   r   objectr   r   r   r   r   r   r   r   r   r   r   <module>   sR   

	t(

