U
    •uÄck2  ã                   @   s  d dl Z d dlZd dlmZmZmZ d dlmZ d dlm	Z	 d dl
mZmZmZ d dlmZ d dlmZmZ d dlmZmZmZ d	ZG d
d„ deƒZe e¡ eeee ee f dœ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 )é    N)ÚOptionalÚDictÚTuple)Úhlval)Úprotocol)ÚConnectionDenyÚConnectionRequestÚConnectionResponse)ÚTransportDetails)Ú
ITransportÚISession)ÚProtocolErrorÚSerializationErrorÚTransportLost)ÚWampWebSocketServerProtocolÚWampWebSocketClientProtocolÚWampWebSocketServerFactoryÚWampWebSocketClientFactoryc                   @   s¬   e Zd ZU dZdZee ed< dZee	 ed< de
ee dœdd„Zdd	„ Zee
ee d
œdd„Zeedœdd„Zdd„ Zdd„ Zeee	 dœdd„ƒZdd„ Zdd„ ZdS )ÚWampWebSocketProtocolz>
    Base class for WAMP-over-WebSocket transport mixins.
    NÚ_sessionÚ_transport_details©ÚcodeÚreasonc                 C   s"   | j jd||d� |  ||¡ d S )NzEFailing WAMP-over-WebSocket transport: code={code}, reason="{reason}"r   )ÚlogÚdebugZ_fail_connection)Úselfr   r   © r   úV/var/www/html/VBACK/school/venv/lib/python3.8/site-packages/autobahn/wamp/websocket.pyÚ_bailout5   s    
ÿzWampWebSocketProtocol._bailoutc              
   C   s|   z$| j  ¡ | _| | j_| j | ¡ W nR tk
rv } z4| jjdt 	¡ d� d 
|¡}| jtjj|d� W 5 d}~X Y nX dS )z^
        Callback from :func:`autobahn.websocket.interfaces.IWebSocketChannel.onOpen`
        ú{tb}©ÚtbúWAMP Internal Error ({0})©r   N)ÚfactoryÚ_factoryr   Ú
_transportÚonOpenÚ	Exceptionr   ÚcriticalÚ	tracebackÚ
format_excÚformatr   r   ÚWebSocketProtocolÚ CLOSE_STATUS_CODE_INTERNAL_ERROR)r   Úer   r   r   r   r(   :   s    
zWampWebSocketProtocol.onOpen©ÚwasCleanr   r   c                 C   sh   || _ | jdk	rdz$| jjd|||d� | j |¡ W n( tk
r\   | jjdt ¡ d� Y nX d| _dS )z_
        Callback from :func:`autobahn.websocket.interfaces.IWebSocketChannel.onClose`
        NzWWAMP-over-WebSocket transport lost: wasClean={wasClean}, code={code}, reason="{reason}"r1   r    r!   )	Z_onclose_reasonr   r   r   ÚonCloser)   r*   r+   r,   )r   r2   r   r   r   r   r   r3   J   s    
  þzWampWebSocketProtocol.onClose)ÚpayloadÚisBinaryc                 C   s:  z�| j  ||¡D ]|}| jjdtdddd�| jjrBt| jjddd�nd| jjr^t| jjddd�ndtdddd�td	ddd�|d
� | j |¡ qW n¤ t	k
râ } z4| jj
dt ¡ d� d |¡}| jtjj|d� W 5 d}~X Y nT tk
�r4 } z4| jj
dt ¡ d� d |¡}| jtjj|d� W 5 d}~X Y nX dS )za
        Callback from :func:`autobahn.websocket.interfaces.IWebSocketChannel.onMessage`
        ú<
{action1}{session}, {authid}{action2}
  {message}
{action3}zWAMP-Receive(ZgreenT©ZcolorZboldFú-z) <<z<<©Zaction1ZauthidÚsessionZaction2Zaction3Úmessager    r!   zWAMP Protocol Error ({0})r$   Nr#   )Ú_serializerZunserializer   Útracer   r   Ú_authidÚ_session_idÚ	onMessager   r*   r+   r,   r-   r   r   r.   Z CLOSE_STATUS_CODE_PROTOCOL_ERRORr)   r/   )r   r4   r5   Úmsgr0   r   r   r   r   r@   ]   s&    ú
"
zWampWebSocketProtocol.onMessagec                 C   sä   |   ¡ rÚz€| jjdtdddd�| jjr8t| jjddd�nd| jjrTt| jjddd�ndtdddd�td	ddd�|d
� | j |¡\}}W nB t	k
rÊ } z$| j 
d |¡¡ td |¡ƒ‚W 5 d}~X Y qàX |  ||¡ ntƒ ‚dS )zM
        Implements :func:`autobahn.wamp.interfaces.ITransport.send`
        r6   zWAMP-Transmit(ZredTr7   Fr8   z) >>z>>r9   z$WAMP message serialization error: {}z%WAMP message serialization error: {0}N)ÚisOpenr   r=   r   r   r>   r?   r<   Ú	serializer)   Úerrorr-   r   ZsendMessager   )r   rA   r4   r5   r0   r   r   r   Úsendv   s     ú zWampWebSocketProtocol.sendc                 C   s
   | j dk	S )zO
        Implements :func:`autobahn.wamp.interfaces.ITransport.isOpen`
        N)r   ©r   r   r   r   rB   �   s    zWampWebSocketProtocol.isOpen)Úreturnc                 C   s   | j S )zZ
        Implements :func:`autobahn.wamp.interfaces.ITransport.transport_details`
        )r   rF   r   r   r   Útransport_details“   s    z'WampWebSocketProtocol.transport_detailsc                 C   s"   |   ¡ r|  tjj¡ ntƒ ‚dS )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.close`
        N)rB   Z	sendCloser   r.   ZCLOSE_STATUS_CODE_NORMALr   rF   r   r   r   Úcloseš   s    zWampWebSocketProtocol.closec                 C   s"   |   ¡ r|  tjj¡ ntƒ ‚dS )zN
        Implements :func:`autobahn.wamp.interfaces.ITransport.abort`
        N)rB   r   r   r.   ZCLOSE_STATUS_CODE_GOING_AWAYr   rF   r   r   r   Úabort£   s    zWampWebSocketProtocol.abort)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   Ú__annotations__r   r
   ÚintÚstrr   r(   Úboolr3   Úbytesr@   rE   rB   ÚpropertyrH   rI   rJ   r   r   r   r   r   -   s   
	r   )ÚsubprotocolrG   c                 C   sd   zP|   d¡}|d dkr*td |d ¡ƒ‚t|d ƒ}d |dd … ¡}||fW S    Y dS X d S )NÚ.r   ZwampzFWAMP WebSocket subprotocol identifier must start with "wamp", not "{}"é   é   )NN)Úsplitr)   r-   rP   Újoin)rU   ÚsÚversionÚserializer_idr   r   r   ÚparseSubprotocolIdentifier°   s    

r^   c                   @   s8   e Zd ZdZdZeeee e	eef f dœdd„Z
dS )r   z:
    Mixin for WAMP-over-WebSocket server transports.
    T)ÚrequestrG   c                 C   s˜   i }|j D ]H}t|ƒ\}}|dkr
|| jj ¡ kr
t | jj| ¡| _||f  S q
| jrxttj	d 
d | jj ¡¡ƒ‚nt | jjd ¡| _d|fS dS )úa
        Callback from :func:`autobahn.websocket.interfaces.IWebSocketChannel.onConnect`
        rX   z1This server only speaks WebSocket subprotocols {}ú, ÚjsonN)Ú	protocolsr^   r%   Ú_serializersÚkeysÚcopyr<   ÚSTRICT_PROTOCOL_NEGOTIATIONr   ZBAD_REQUESTr-   rZ   )r   r_   ÚheadersrU   r\   ZserializerIdr   r   r   Ú	onConnectÃ   s    

ÿz%WampWebSocketServerProtocol.onConnectN)rK   rL   rM   rN   rg   r   r   r   rQ   r   ri   r   r   r   r   r   ¼   s   r   c                   @   s"   e Zd ZdZdZedœdd„ZdS )r   z:
    Mixin for WAMP-over-WebSocket client transports.
    T)Úresponsec                 C   sZ   |j | jjkr4| jr.td d | jj¡¡ƒ‚qBd}nt|j ƒ\}}t | jj	| ¡| _
dS )r`   zLThe server does not speak any of the WebSocket subprotocols {} we requested.ra   rb   N)r   r%   rc   rg   r)   r-   rZ   r^   rf   rd   r<   )r   rj   r]   r\   r   r   r   ri   à   s    ÿz%WampWebSocketClientProtocol.onConnectN)rK   rL   rM   rN   rg   r	   ri   r   r   r   r   r   Ù   s   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                    sv  t ˆ ƒrˆ | _n‡ fdd„| _|dk�rDg }z,ddlm} | |dd�¡ | |ƒ ¡ W n tk
rl   Y nX z,ddlm} | |dd�¡ | |ƒ ¡ W n tk
r®   Y nX z,dd	lm} | |dd�¡ | |ƒ ¡ W n tk
rð   Y nX z,dd
lm} | |dd�¡ | |ƒ ¡ W n tk
�r4   Y nX |�sDt	dƒ‚i | _
|D ]}|| j
|j< �qNd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 )Nr   r   ©r%   r   r   Ú<lambda>  ó    z/WampWebSocketFactory.__init__.<locals>.<lambda>Nr   )ÚCBORSerializerT)Z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>2  s     z1WampWebSocketFactory.__init__.<locals>.<listcomp>)Úcallabler&   Zautobahn.wamp.serializerro   ÚappendÚImportErrorrp   rq   rr   r)   rd   rs   Z
_protocols)r   r%   Zserializersro   rp   rq   rr   ru   r   rl   r   Ú__init__÷   sF    
zWampWebSocketFactory.__init__)N)rK   rL   rM   rN   rz   r   r   r   r   rk   ò   s   rk   c                   @   s   e Zd ZdZdS )r   zC
    Mixin for WAMP-over-WebSocket server transport factories.
    N©rK   rL   rM   rN   r   r   r   r   r   5  s   r   c                   @   s   e Zd ZdZdS )r   zC
    Mixin for WAMP-over-WebSocket client transport factories.
    Nr{   r   r   r   r   r   ;  s   r   )#rf   r+   Útypingr   r   r   Zautobahn.utilr   Zautobahn.websocketr   Zautobahn.websocket.typesr   r   r	   Zautobahn.wamp.typesr
   Zautobahn.wamp.interfacesr   r   Zautobahn.wamp.exceptionr   r   r   Ú__all__Úobjectr   ÚregisterrQ   rP   r^   r   r   rk   r   r   r   r   r   r   Ú<module>   s$    
 C