o
    @Biz,                     @   s   d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZ dZG dd	 d	eZe	e d
d ZG dd deZG dd deZG dd deZG dd deZG dd deZdS )    )absolute_importN)protocol)ConnectionDeny)
ITransport)ProtocolErrorSerializationErrorTransportLost)WampWebSocketServerProtocolWampWebSocketClientProtocolWampWebSocketServerFactoryWampWebSocketClientFactoryc                   @   sV   e Zd ZdZ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S )WampWebSocketProtocolz>
    Base class for WAMP-over-WebSocket transport mixins.
    Nc                 C   s"   | j jd||d | || d S )NzEFailing WAMP-over-WebSocket transport: code={code}, reason="{reason}")codereason)logdebug_fail_connection)selfr   r    r   W/var/www/html/Trade-python/venv/lib/python3.10/site-packages/autobahn/wamp/websocket.py_bailout2   s   zWampWebSocketProtocol._bailoutc              
   C   sv   z| j  | _| j|  W dS  ty: } z| jjdt d d	|}| j
tjj|d W Y d}~dS d}~ww )z^
        Callback from :func:`autobahn.websocket.interfaces.IWebSocketChannel.onOpen`
        {tb}tbWAMP Internal Error ({0})r   N)factory_factory_sessiononOpen	Exceptionr   critical	traceback
format_excformatr   r   WebSocketProtocol CLOSE_STATUS_CODE_INTERNAL_ERROR)r   er   r   r   r   r   6   s   
 zWampWebSocketProtocol.onOpenc                 C   sj   || _ | jdur3z| jjd|||d | j| W n ty-   | jjdt d Y nw d| _dS dS )z_
        Callback from :func:`autobahn.websocket.interfaces.IWebSocketChannel.onClose`
        NzWWAMP-over-WebSocket transport lost: wasClean={wasClean}, code={code}, reason="{reason}")wasCleanr   r   r   r   )	_onclose_reasonr   r   r   onCloser    r!   r"   r#   )r   r(   r   r   r   r   r   r*   D   s   

zWampWebSocketProtocol.onClosec              
   C   s   z!| j ||D ]}| jjd| jj| jj|d | j| qW dS  tyL } z| jj	dt
 d d|}| jtjj|d W Y d}~dS d}~w tyv } z| jj	dt
 d d|}| jtjj|d W Y d}~dS d}~ww )	za
        Callback from :func:`autobahn.websocket.interfaces.IWebSocketChannel.onMessage`
        z@WAMP RECV: message={message}, session={session}, authid={authid}authidsessionmessager   r   zWAMP Protocol Error ({0})r   Nr   )_serializerunserializer   tracer   _authid_session_id	onMessager   r!   r"   r#   r$   r   r   r%    CLOSE_STATUS_CODE_PROTOCOL_ERRORr    r&   )r   payloadisBinarymsgr'   r   r   r   r   r4   U   s*   	
 
 zWampWebSocketProtocol.onMessagec              
   C   s   |   rAz| jjd| jj| jj|d | j|\}}W n ty8 } z| j	d
| td
|d}~ww | || dS t )zM
        Implements :func:`autobahn.wamp.interfaces.ITransport.send`
        z@WAMP SEND: message={message}, session={session}, authid={authid}r+   z$WAMP message serialization error: {}z%WAMP message serialization error: {0}N)isOpenr   r1   r   r2   r3   r/   	serializer    errorr$   r   sendMessager   )r   r8   r6   r7   r'   r   r   r   sendm   s    zWampWebSocketProtocol.sendc                 C   s
   | j duS )zO
        Implements :func:`autobahn.wamp.interfaces.ITransport.isOpen`
        N)r   r   r   r   r   r9      s   
zWampWebSocketProtocol.isOpenc                 C       |   r| tjj dS t )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.close`
        N)r9   	sendCloser   r%   CLOSE_STATUS_CODE_NORMALr   r>   r   r   r   close      zWampWebSocketProtocol.closec                 C   r?   )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.abort`
        N)r9   r   r   r%   CLOSE_STATUS_CODE_GOING_AWAYr   r>   r   r   r   abort   rC   zWampWebSocketProtocol.abortN)__name__
__module____qualname____doc__r   r   r   r*   r4   r=   r9   rB   rE   r   r   r   r   r   +   s    
	r   c                 C   s^   z(|  d}|d dkrtd|d t|d }d|dd  }||fW S    Y dS )N.r   wampzFWAMP WebSocket subprotocol identifier must start with "wamp", not "{}"      )NN)splitr    r$   intjoin)subprotocolsversionserializerIdr   r   r   parseSubprotocolIdentifier   s   

rV   c                   @      e Zd ZdZdZdd ZdS )r	   z:
    Mixin for WAMP-over-WebSocket server transports.
    Tc                 C   s   i }|j D ]$}t|\}}|dkr)|| jj v r)t| jj| | _||f  S q| jr;ttj	d
d| jj t| jjd | _d|fS )a
        Callback from :func:`autobahn.websocket.interfaces.IWebSocketChannel.onConnect`
        rN   z1This server only speaks WebSocket subprotocols {}, jsonN)	protocolsrV   r   _serializerskeyscopyr/   STRICT_PROTOCOL_NEGOTIATIONr   BAD_REQUESTr$   rQ   )r   requestheadersrR   rT   rU   r   r   r   	onConnect   s   
z%WampWebSocketServerProtocol.onConnectNrG   rH   rI   rJ   r_   rc   r   r   r   r   r	          r	   c                   @   rW   )r
   z:
    Mixin for WAMP-over-WebSocket client transports.
    Tc                 C   sX   |j | jjvr| jrtdd| jjd}nt|j \}}t| jj	| | _
dS )rX   zLThe server does not speak any of the WebSocket subprotocols {} we requested.rY   rZ   N)r   r   r[   r_   r    r$   rQ   rV   r^   r\   r/   )r   responserU   rT   r   r   r   rc      s   z%WampWebSocketClientProtocol.onConnectNrd   r   r   r   r   r
      re   r
   c                   @   s   e Zd ZdZdddZdS )WampWebSocketFactoryzF
    Base class for WAMP-over-WebSocket transport factory mixins.
    Nc                    sf  t  r | _n fdd| _|du rg }zddlm} ||dd ||  W n	 ty4   Y nw zddlm} ||dd ||  W n	 tyT   Y nw zdd	lm} ||dd ||  W n	 tyt   Y nw zdd
lm} ||dd ||  W n	 ty   Y nw |st	di | _
|D ]}|| j
|j< qdd |D | _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 default
           serializers). Serializers must implement
           :class:`autobahn.wamp.interfaces.ISerializer`.
        :type serializers: list
        c                      s    S rF   r   r   r   r   r   <lambda>   s    z/WampWebSocketFactory.__init__.<locals>.<lambda>Nr   )CBORSerializerT)batched)MsgPackSerializer)UBJSONSerializer)JsonSerializerz$Could not import any WAMP serializerc                 S   s   g | ]}d  |jqS )z	wamp.2.{})r$   SERIALIZER_ID).0serr   r   r   
<listcomp>   s    z1WampWebSocketFactory.__init__.<locals>.<listcomp>)callabler   autobahn.wamp.serializerrj   appendImportErrorrl   rm   rn   r    r\   ro   
_protocols)r   r   serializersrj   rl   rm   rn   rq   r   rh   r   __init__   sN   zWampWebSocketFactory.__init__rF   )rG   rH   rI   rJ   ry   r   r   r   r   rg      s    rg   c                   @      e Zd ZdZdS )r   zC
    Mixin for WAMP-over-WebSocket server transport factories.
    NrG   rH   rI   rJ   r   r   r   r   r   #      r   c                   @   rz   )r   zC
    Mixin for WAMP-over-WebSocket client transport factories.
    Nr{   r   r   r   r   r   )  r|   r   )
__future__r   r^   r"   autobahn.websocketr   autobahn.websocket.typesr   autobahn.wamp.interfacesr   autobahn.wamp.exceptionr   r   r   __all__objectr   registerrV   r	   r
   rg   r   r   r   r   r   r   <module>   s    
qC